[cig-commits] r6187 - in vendor: . django django/current django/current/django django/current/django/bin django/current/django/bin/profiling django/current/django/conf django/current/django/conf/app_template django/current/django/conf/locale django/current/django/conf/locale/ar django/current/django/conf/locale/ar/LC_MESSAGES django/current/django/conf/locale/bn django/current/django/conf/locale/bn/LC_MESSAGES django/current/django/conf/locale/cs django/current/django/conf/locale/cs/LC_MESSAGES django/current/django/conf/locale/cy django/current/django/conf/locale/cy/LC_MESSAGES django/current/django/conf/locale/da django/current/django/conf/locale/da/LC_MESSAGES django/current/django/conf/locale/de django/current/django/conf/locale/de/LC_MESSAGES django/current/django/conf/locale/el django/current/django/conf/locale/el/LC_MESSAGES django/current/django/conf/locale/en django/current/django/conf/locale/en/LC_MESSAGES django/current/django/conf/locale/es django/current/django/conf/locale/es/LC_MESSAGES django/current/django/conf/locale/es_AR django/current/django/conf/locale/es_AR/LC_MESSAGES django/current/django/conf/locale/fr django/current/django/conf/locale/fr/LC_MESSAGES django/current/django/conf/locale/gl django/current/django/conf/locale/gl/LC_MESSAGES django/current/django/conf/locale/he django/current/django/conf/locale/he/LC_MESSAGES django/current/django/conf/locale/hu django/current/django/conf/locale/hu/LC_MESSAGES django/current/django/conf/locale/is django/current/django/conf/locale/is/LC_MESSAGES django/current/django/conf/locale/it django/current/django/conf/locale/it/LC_MESSAGES django/current/django/conf/locale/ja django/current/django/conf/locale/ja/LC_MESSAGES django/current/django/conf/locale/nl django/current/django/conf/locale/nl/LC_MESSAGES django/current/django/conf/locale/no django/current/django/conf/locale/no/LC_MESSAGES django/current/django/conf/locale/pl django/current/django/conf/locale/pl/LC_MESSAGES django/current/django/conf/locale/pt_BR django/current/django/conf/locale/pt_BR/LC_MESSAGES django/current/django/conf/locale/ro django/current/django/conf/locale/ro/LC_MESSAGES django/current/django/conf/locale/ru django/current/django/conf/locale/ru/LC_MESSAGES django/current/django/conf/locale/sk django/current/django/conf/locale/sk/LC_MESSAGES django/current/django/conf/locale/sl django/current/django/conf/locale/sl/LC_MESSAGES django/current/django/conf/locale/sr django/current/django/conf/locale/sr/LC_MESSAGES django/current/django/conf/locale/sv django/current/django/conf/locale/sv/LC_MESSAGES django/current/django/conf/locale/ta django/current/django/conf/locale/ta/LC_MESSAGES django/current/django/conf/locale/uk django/current/django/conf/locale/uk/LC_MESSAGES django/current/django/conf/locale/zh_CN django/current/django/conf/locale/zh_CN/LC_MESSAGES django/current/django/conf/locale/zh_TW django/current/django/conf/locale/zh_TW/LC_MESSAGES django/current/django/conf/project_template django/current/django/conf/urls django/current/django/contrib django/current/django/contrib/admin django/current/django/contrib/admin/media django/current/django/contrib/admin/media/css django/current/django/contrib/admin/media/img django/current/django/contrib/admin/media/img/admin django/current/django/contrib/admin/media/js django/current/django/contrib/admin/media/js/admin django/current/django/contrib/admin/templates django/current/django/contrib/admin/templates/admin django/current/django/contrib/admin/templates/admin_doc django/current/django/contrib/admin/templates/registration django/current/django/contrib/admin/templates/widget django/current/django/contrib/admin/templatetags django/current/django/contrib/admin/views django/current/django/contrib/auth django/current/django/contrib/auth/handlers django/current/django/contrib/comments django/current/django/contrib/comments/templates django/current/django/contrib/comments/templates/comments django/current/django/contrib/comments/templatetags django/current/django/contrib/comments/urls django/current/django/contrib/comments/views django/current/django/contrib/contenttypes django/current/django/contrib/csrf django/current/django/contrib/flatpages django/current/django/contrib/humanize django/current/django/contrib/humanize/templatetags django/current/django/contrib/markup django/current/django/contrib/markup/templatetags django/current/django/contrib/redirects django/current/django/contrib/sessions django/current/django/contrib/sites django/current/django/contrib/syndication django/current/django/core django/current/django/core/cache django/current/django/core/cache/backends django/current/django/core/handlers django/current/django/core/serializers django/current/django/core/servers django/current/django/db django/current/django/db/backends django/current/django/db/backends/ado_mssql django/current/django/db/backends/dummy django/current/django/db/backends/mysql django/current/django/db/backends/oracle django/current/django/db/backends/postgresql django/current/django/db/backends/postgresql_psycopg2 django/current/django/db/backends/sqlite3 django/current/django/db/models django/current/django/db/models/fields django/current/django/dispatch django/current/django/forms django/current/django/http django/current/django/middleware django/current/django/shortcuts django/current/django/template django/current/django/template/loaders django/current/django/templatetags django/current/django/utils django/current/django/utils/simplejson django/current/django/utils/translation django/current/django/views django/current/django/views/decorators django/current/django/views/generic django/current/docs django/current/examples django/current/examples/hello django/current/extras django/current/tests django/current/tests/modeltests django/current/tests/modeltests/basic django/current/tests/modeltests/choices django/current/tests/modeltests/custom_columns django/current/tests/modeltests/custom_managers django/current/tests/modeltests/custom_methods django/current/tests/modeltests/custom_pk django/current/tests/modeltests/empty django/current/tests/modeltests/field_defaults django/current/tests/modeltests/generic_relations django/current/tests/modeltests/get_latest django/current/tests/modeltests/get_or_create django/current/tests/modeltests/invalid_models django/current/tests/modeltests/lookup django/current/tests/modeltests/m2m_and_m2o django/current/tests/modeltests/m2m_intermediary django/current/tests/modeltests/m2m_multiple django/current/tests/modeltests/m2m_recursive django/current/tests/modeltests/m2o_recursive django/current/tests/modeltests/m2o_recursive2 django/current/tests/modeltests/manipulators django/current/tests/modeltests/many_to_many django/current/tests/modeltests/many_to_one django/current/tests/modeltests/many_to_one_null django/current/tests/modeltests/model_inheritance django/current/tests/modeltests/mutually_referential django/current/tests/modeltests/one_to_one django/current/tests/modeltests/or_lookups django/current/tests/modeltests/ordering django/current/tests/modeltests/pagination django/current/tests/modeltests/properties django/current/tests/modeltests/reserved_names django/current/tests/modeltests/reverse_lookup django/current/tests/modeltests/save_delete_hooks django/current/tests/modeltests/serializers django/current/tests/modeltests/str django/current/tests/modeltests/transactions django/current/tests/modeltests/validation django/current/tests/othertests django/current/tests/regressiontests django/current/tests/regressiontests/initial_sql_regress django/current/tests/regressiontests/initial_sql_regress/sql django/current/tests/regressiontests/many_to_one_regress django/current/tests/regressiontests/one_to_one_regress django/current/tests/regressiontests/string_lookup

leif at geodynamics.org leif at geodynamics.org
Wed Mar 7 18:35:40 PST 2007


Author: leif
Date: 2007-03-07 18:35:26 -0800 (Wed, 07 Mar 2007)
New Revision: 6187

Added:
   vendor/django/
   vendor/django/current/
   vendor/django/current/AUTHORS
   vendor/django/current/INSTALL
   vendor/django/current/LICENSE
   vendor/django/current/README
   vendor/django/current/django/
   vendor/django/current/django/__init__.py
   vendor/django/current/django/bin/
   vendor/django/current/django/bin/__init__.py
   vendor/django/current/django/bin/compile-messages.py
   vendor/django/current/django/bin/daily_cleanup.py
   vendor/django/current/django/bin/django-admin.py
   vendor/django/current/django/bin/make-messages.py
   vendor/django/current/django/bin/profiling/
   vendor/django/current/django/bin/profiling/__init__.py
   vendor/django/current/django/bin/profiling/gather_profile_stats.py
   vendor/django/current/django/bin/unique-messages.py
   vendor/django/current/django/conf/
   vendor/django/current/django/conf/__init__.py
   vendor/django/current/django/conf/app_template/
   vendor/django/current/django/conf/app_template/__init__.py
   vendor/django/current/django/conf/app_template/models.py
   vendor/django/current/django/conf/app_template/views.py
   vendor/django/current/django/conf/global_settings.py
   vendor/django/current/django/conf/locale/
   vendor/django/current/django/conf/locale/ar/
   vendor/django/current/django/conf/locale/ar/LC_MESSAGES/
   vendor/django/current/django/conf/locale/ar/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/ar/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/ar/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/ar/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/bn/
   vendor/django/current/django/conf/locale/bn/LC_MESSAGES/
   vendor/django/current/django/conf/locale/bn/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/bn/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/cs/
   vendor/django/current/django/conf/locale/cs/LC_MESSAGES/
   vendor/django/current/django/conf/locale/cs/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/cs/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/cs/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/cs/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/cy/
   vendor/django/current/django/conf/locale/cy/LC_MESSAGES/
   vendor/django/current/django/conf/locale/cy/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/cy/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/cy/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/cy/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/da/
   vendor/django/current/django/conf/locale/da/LC_MESSAGES/
   vendor/django/current/django/conf/locale/da/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/da/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/de/
   vendor/django/current/django/conf/locale/de/LC_MESSAGES/
   vendor/django/current/django/conf/locale/de/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/de/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/de/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/de/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/el/
   vendor/django/current/django/conf/locale/el/LC_MESSAGES/
   vendor/django/current/django/conf/locale/el/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/el/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/en/
   vendor/django/current/django/conf/locale/en/LC_MESSAGES/
   vendor/django/current/django/conf/locale/en/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/en/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/en/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/en/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/es/
   vendor/django/current/django/conf/locale/es/LC_MESSAGES/
   vendor/django/current/django/conf/locale/es/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/es/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/es/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/es/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/es_AR/
   vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/
   vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/fr/
   vendor/django/current/django/conf/locale/fr/LC_MESSAGES/
   vendor/django/current/django/conf/locale/fr/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/fr/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/fr/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/gl/
   vendor/django/current/django/conf/locale/gl/LC_MESSAGES/
   vendor/django/current/django/conf/locale/gl/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/gl/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/gl/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/gl/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/he/
   vendor/django/current/django/conf/locale/he/LC_MESSAGES/
   vendor/django/current/django/conf/locale/he/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/he/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/he/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/he/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/hu/
   vendor/django/current/django/conf/locale/hu/LC_MESSAGES/
   vendor/django/current/django/conf/locale/hu/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/hu/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/hu/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/hu/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/is/
   vendor/django/current/django/conf/locale/is/LC_MESSAGES/
   vendor/django/current/django/conf/locale/is/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/is/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/is/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/is/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/it/
   vendor/django/current/django/conf/locale/it/LC_MESSAGES/
   vendor/django/current/django/conf/locale/it/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/it/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/it/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/it/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/ja/
   vendor/django/current/django/conf/locale/ja/LC_MESSAGES/
   vendor/django/current/django/conf/locale/ja/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/ja/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/ja/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/nl/
   vendor/django/current/django/conf/locale/nl/LC_MESSAGES/
   vendor/django/current/django/conf/locale/nl/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/nl/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/nl/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/nl/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/no/
   vendor/django/current/django/conf/locale/no/LC_MESSAGES/
   vendor/django/current/django/conf/locale/no/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/no/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/no/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/no/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/pl/
   vendor/django/current/django/conf/locale/pl/LC_MESSAGES/
   vendor/django/current/django/conf/locale/pl/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/pl/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/pt_BR/
   vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/
   vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/ro/
   vendor/django/current/django/conf/locale/ro/LC_MESSAGES/
   vendor/django/current/django/conf/locale/ro/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/ro/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/ru/
   vendor/django/current/django/conf/locale/ru/LC_MESSAGES/
   vendor/django/current/django/conf/locale/ru/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/ru/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/ru/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/ru/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/sk/
   vendor/django/current/django/conf/locale/sk/LC_MESSAGES/
   vendor/django/current/django/conf/locale/sk/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/sk/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/sk/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/sl/
   vendor/django/current/django/conf/locale/sl/LC_MESSAGES/
   vendor/django/current/django/conf/locale/sl/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/sl/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/sr/
   vendor/django/current/django/conf/locale/sr/LC_MESSAGES/
   vendor/django/current/django/conf/locale/sr/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/sr/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/sr/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/sv/
   vendor/django/current/django/conf/locale/sv/LC_MESSAGES/
   vendor/django/current/django/conf/locale/sv/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/sv/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/sv/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/ta/
   vendor/django/current/django/conf/locale/ta/LC_MESSAGES/
   vendor/django/current/django/conf/locale/ta/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/ta/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/uk/
   vendor/django/current/django/conf/locale/uk/LC_MESSAGES/
   vendor/django/current/django/conf/locale/uk/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/uk/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/zh_CN/
   vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/
   vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/django.po
   vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
   vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
   vendor/django/current/django/conf/locale/zh_TW/
   vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/
   vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/django.mo
   vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/django.po
   vendor/django/current/django/conf/project_template/
   vendor/django/current/django/conf/project_template/__init__.py
   vendor/django/current/django/conf/project_template/manage.py
   vendor/django/current/django/conf/project_template/settings.py
   vendor/django/current/django/conf/project_template/urls.py
   vendor/django/current/django/conf/urls/
   vendor/django/current/django/conf/urls/__init__.py
   vendor/django/current/django/conf/urls/admin_password_reset.py
   vendor/django/current/django/conf/urls/defaults.py
   vendor/django/current/django/conf/urls/i18n.py
   vendor/django/current/django/conf/urls/registration.py
   vendor/django/current/django/conf/urls/shortcut.py
   vendor/django/current/django/contrib/
   vendor/django/current/django/contrib/__init__.py
   vendor/django/current/django/contrib/admin/
   vendor/django/current/django/contrib/admin/__init__.py
   vendor/django/current/django/contrib/admin/filterspecs.py
   vendor/django/current/django/contrib/admin/media/
   vendor/django/current/django/contrib/admin/media/css/
   vendor/django/current/django/contrib/admin/media/css/base.css
   vendor/django/current/django/contrib/admin/media/css/changelists.css
   vendor/django/current/django/contrib/admin/media/css/dashboard.css
   vendor/django/current/django/contrib/admin/media/css/forms.css
   vendor/django/current/django/contrib/admin/media/css/global.css
   vendor/django/current/django/contrib/admin/media/css/layout.css
   vendor/django/current/django/contrib/admin/media/css/login.css
   vendor/django/current/django/contrib/admin/media/css/patch-iewin.css
   vendor/django/current/django/contrib/admin/media/css/rtl.css
   vendor/django/current/django/contrib/admin/media/css/widgets.css
   vendor/django/current/django/contrib/admin/media/img/
   vendor/django/current/django/contrib/admin/media/img/admin/
   vendor/django/current/django/contrib/admin/media/img/admin/arrow-down.gif
   vendor/django/current/django/contrib/admin/media/img/admin/arrow-up.gif
   vendor/django/current/django/contrib/admin/media/img/admin/changelist-bg.gif
   vendor/django/current/django/contrib/admin/media/img/admin/chooser-bg.gif
   vendor/django/current/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif
   vendor/django/current/django/contrib/admin/media/img/admin/default-bg-reverse.gif
   vendor/django/current/django/contrib/admin/media/img/admin/default-bg.gif
   vendor/django/current/django/contrib/admin/media/img/admin/deleted-overlay.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon-no.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon-unknown.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon-yes.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_addlink.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_alert.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_calendar.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_changelink.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_clock.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_deletelink.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_error.gif
   vendor/django/current/django/contrib/admin/media/img/admin/icon_searchbox.png
   vendor/django/current/django/contrib/admin/media/img/admin/icon_success.gif
   vendor/django/current/django/contrib/admin/media/img/admin/inline-delete-8bit.png
   vendor/django/current/django/contrib/admin/media/img/admin/inline-delete.png
   vendor/django/current/django/contrib/admin/media/img/admin/inline-restore-8bit.png
   vendor/django/current/django/contrib/admin/media/img/admin/inline-restore.png
   vendor/django/current/django/contrib/admin/media/img/admin/inline-splitter-bg.gif
   vendor/django/current/django/contrib/admin/media/img/admin/nav-bg-grabber.gif
   vendor/django/current/django/contrib/admin/media/img/admin/nav-bg-reverse.gif
   vendor/django/current/django/contrib/admin/media/img/admin/nav-bg.gif
   vendor/django/current/django/contrib/admin/media/img/admin/selector-add.gif
   vendor/django/current/django/contrib/admin/media/img/admin/selector-addall.gif
   vendor/django/current/django/contrib/admin/media/img/admin/selector-remove.gif
   vendor/django/current/django/contrib/admin/media/img/admin/selector-removeall.gif
   vendor/django/current/django/contrib/admin/media/img/admin/selector-search.gif
   vendor/django/current/django/contrib/admin/media/img/admin/selector_stacked-add.gif
   vendor/django/current/django/contrib/admin/media/img/admin/selector_stacked-remove.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tool-left.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tool-left_over.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tool-right.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tool-right_over.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tooltag-add.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tooltag-add_over.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tooltag-arrowright.gif
   vendor/django/current/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif
   vendor/django/current/django/contrib/admin/media/js/
   vendor/django/current/django/contrib/admin/media/js/SelectBox.js
   vendor/django/current/django/contrib/admin/media/js/SelectFilter.js
   vendor/django/current/django/contrib/admin/media/js/SelectFilter2.js
   vendor/django/current/django/contrib/admin/media/js/admin/
   vendor/django/current/django/contrib/admin/media/js/admin/CollapsedFieldsets.js
   vendor/django/current/django/contrib/admin/media/js/admin/DateTimeShortcuts.js
   vendor/django/current/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
   vendor/django/current/django/contrib/admin/media/js/admin/ordering.js
   vendor/django/current/django/contrib/admin/media/js/calendar.js
   vendor/django/current/django/contrib/admin/media/js/core.js
   vendor/django/current/django/contrib/admin/media/js/dateparse.js
   vendor/django/current/django/contrib/admin/media/js/getElementsBySelector.js
   vendor/django/current/django/contrib/admin/media/js/timeparse.js
   vendor/django/current/django/contrib/admin/media/js/urlify.js
   vendor/django/current/django/contrib/admin/models.py
   vendor/django/current/django/contrib/admin/templates/
   vendor/django/current/django/contrib/admin/templates/admin/
   vendor/django/current/django/contrib/admin/templates/admin/404.html
   vendor/django/current/django/contrib/admin/templates/admin/500.html
   vendor/django/current/django/contrib/admin/templates/admin/base.html
   vendor/django/current/django/contrib/admin/templates/admin/base_site.html
   vendor/django/current/django/contrib/admin/templates/admin/change_form.html
   vendor/django/current/django/contrib/admin/templates/admin/change_list.html
   vendor/django/current/django/contrib/admin/templates/admin/change_list_results.html
   vendor/django/current/django/contrib/admin/templates/admin/date_hierarchy.html
   vendor/django/current/django/contrib/admin/templates/admin/delete_confirmation.html
   vendor/django/current/django/contrib/admin/templates/admin/edit_inline_stacked.html
   vendor/django/current/django/contrib/admin/templates/admin/edit_inline_tabular.html
   vendor/django/current/django/contrib/admin/templates/admin/field_line.html
   vendor/django/current/django/contrib/admin/templates/admin/filter.html
   vendor/django/current/django/contrib/admin/templates/admin/filters.html
   vendor/django/current/django/contrib/admin/templates/admin/index.html
   vendor/django/current/django/contrib/admin/templates/admin/invalid_setup.html
   vendor/django/current/django/contrib/admin/templates/admin/login.html
   vendor/django/current/django/contrib/admin/templates/admin/object_history.html
   vendor/django/current/django/contrib/admin/templates/admin/pagination.html
   vendor/django/current/django/contrib/admin/templates/admin/search_form.html
   vendor/django/current/django/contrib/admin/templates/admin/submit_line.html
   vendor/django/current/django/contrib/admin/templates/admin/template_validator.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/
   vendor/django/current/django/contrib/admin/templates/admin_doc/bookmarklets.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/index.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/missing_docutils.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/model_detail.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/model_index.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/template_detail.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/template_filter_index.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/template_tag_index.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/view_detail.html
   vendor/django/current/django/contrib/admin/templates/admin_doc/view_index.html
   vendor/django/current/django/contrib/admin/templates/registration/
   vendor/django/current/django/contrib/admin/templates/registration/logged_out.html
   vendor/django/current/django/contrib/admin/templates/registration/password_change_done.html
   vendor/django/current/django/contrib/admin/templates/registration/password_change_form.html
   vendor/django/current/django/contrib/admin/templates/registration/password_reset_done.html
   vendor/django/current/django/contrib/admin/templates/registration/password_reset_email.html
   vendor/django/current/django/contrib/admin/templates/registration/password_reset_form.html
   vendor/django/current/django/contrib/admin/templates/widget/
   vendor/django/current/django/contrib/admin/templates/widget/date_time.html
   vendor/django/current/django/contrib/admin/templates/widget/default.html
   vendor/django/current/django/contrib/admin/templates/widget/file.html
   vendor/django/current/django/contrib/admin/templates/widget/foreign.html
   vendor/django/current/django/contrib/admin/templates/widget/many_to_many.html
   vendor/django/current/django/contrib/admin/templates/widget/one_to_one.html
   vendor/django/current/django/contrib/admin/templatetags/
   vendor/django/current/django/contrib/admin/templatetags/__init__.py
   vendor/django/current/django/contrib/admin/templatetags/admin_list.py
   vendor/django/current/django/contrib/admin/templatetags/admin_modify.py
   vendor/django/current/django/contrib/admin/templatetags/adminapplist.py
   vendor/django/current/django/contrib/admin/templatetags/adminmedia.py
   vendor/django/current/django/contrib/admin/templatetags/log.py
   vendor/django/current/django/contrib/admin/urls.py
   vendor/django/current/django/contrib/admin/utils.py
   vendor/django/current/django/contrib/admin/views/
   vendor/django/current/django/contrib/admin/views/__init__.py
   vendor/django/current/django/contrib/admin/views/decorators.py
   vendor/django/current/django/contrib/admin/views/doc.py
   vendor/django/current/django/contrib/admin/views/main.py
   vendor/django/current/django/contrib/admin/views/template.py
   vendor/django/current/django/contrib/auth/
   vendor/django/current/django/contrib/auth/__init__.py
   vendor/django/current/django/contrib/auth/backends.py
   vendor/django/current/django/contrib/auth/create_superuser.py
   vendor/django/current/django/contrib/auth/decorators.py
   vendor/django/current/django/contrib/auth/forms.py
   vendor/django/current/django/contrib/auth/handlers/
   vendor/django/current/django/contrib/auth/handlers/__init__.py
   vendor/django/current/django/contrib/auth/handlers/modpython.py
   vendor/django/current/django/contrib/auth/management.py
   vendor/django/current/django/contrib/auth/middleware.py
   vendor/django/current/django/contrib/auth/models.py
   vendor/django/current/django/contrib/auth/views.py
   vendor/django/current/django/contrib/comments/
   vendor/django/current/django/contrib/comments/__init__.py
   vendor/django/current/django/contrib/comments/feeds.py
   vendor/django/current/django/contrib/comments/models.py
   vendor/django/current/django/contrib/comments/templates/
   vendor/django/current/django/contrib/comments/templates/comments/
   vendor/django/current/django/contrib/comments/templates/comments/form.html
   vendor/django/current/django/contrib/comments/templates/comments/freeform.html
   vendor/django/current/django/contrib/comments/templatetags/
   vendor/django/current/django/contrib/comments/templatetags/__init__.py
   vendor/django/current/django/contrib/comments/templatetags/comments.py
   vendor/django/current/django/contrib/comments/urls/
   vendor/django/current/django/contrib/comments/urls/__init__.py
   vendor/django/current/django/contrib/comments/urls/comments.py
   vendor/django/current/django/contrib/comments/views/
   vendor/django/current/django/contrib/comments/views/__init__.py
   vendor/django/current/django/contrib/comments/views/comments.py
   vendor/django/current/django/contrib/comments/views/karma.py
   vendor/django/current/django/contrib/comments/views/userflags.py
   vendor/django/current/django/contrib/contenttypes/
   vendor/django/current/django/contrib/contenttypes/__init__.py
   vendor/django/current/django/contrib/contenttypes/management.py
   vendor/django/current/django/contrib/contenttypes/models.py
   vendor/django/current/django/contrib/csrf/
   vendor/django/current/django/contrib/csrf/__init__.py
   vendor/django/current/django/contrib/csrf/middleware.py
   vendor/django/current/django/contrib/flatpages/
   vendor/django/current/django/contrib/flatpages/README.TXT
   vendor/django/current/django/contrib/flatpages/__init__.py
   vendor/django/current/django/contrib/flatpages/middleware.py
   vendor/django/current/django/contrib/flatpages/models.py
   vendor/django/current/django/contrib/flatpages/urls.py
   vendor/django/current/django/contrib/flatpages/views.py
   vendor/django/current/django/contrib/humanize/
   vendor/django/current/django/contrib/humanize/__init__.py
   vendor/django/current/django/contrib/humanize/templatetags/
   vendor/django/current/django/contrib/humanize/templatetags/__init__.py
   vendor/django/current/django/contrib/humanize/templatetags/humanize.py
   vendor/django/current/django/contrib/markup/
   vendor/django/current/django/contrib/markup/__init__.py
   vendor/django/current/django/contrib/markup/templatetags/
   vendor/django/current/django/contrib/markup/templatetags/__init__.py
   vendor/django/current/django/contrib/markup/templatetags/markup.py
   vendor/django/current/django/contrib/redirects/
   vendor/django/current/django/contrib/redirects/README.TXT
   vendor/django/current/django/contrib/redirects/__init__.py
   vendor/django/current/django/contrib/redirects/middleware.py
   vendor/django/current/django/contrib/redirects/models.py
   vendor/django/current/django/contrib/sessions/
   vendor/django/current/django/contrib/sessions/__init__.py
   vendor/django/current/django/contrib/sessions/middleware.py
   vendor/django/current/django/contrib/sessions/models.py
   vendor/django/current/django/contrib/sites/
   vendor/django/current/django/contrib/sites/__init__.py
   vendor/django/current/django/contrib/sites/management.py
   vendor/django/current/django/contrib/sites/managers.py
   vendor/django/current/django/contrib/sites/models.py
   vendor/django/current/django/contrib/syndication/
   vendor/django/current/django/contrib/syndication/__init__.py
   vendor/django/current/django/contrib/syndication/feeds.py
   vendor/django/current/django/contrib/syndication/views.py
   vendor/django/current/django/core/
   vendor/django/current/django/core/__init__.py
   vendor/django/current/django/core/cache/
   vendor/django/current/django/core/cache/__init__.py
   vendor/django/current/django/core/cache/backends/
   vendor/django/current/django/core/cache/backends/__init__.py
   vendor/django/current/django/core/cache/backends/base.py
   vendor/django/current/django/core/cache/backends/db.py
   vendor/django/current/django/core/cache/backends/dummy.py
   vendor/django/current/django/core/cache/backends/filebased.py
   vendor/django/current/django/core/cache/backends/locmem.py
   vendor/django/current/django/core/cache/backends/memcached.py
   vendor/django/current/django/core/cache/backends/simple.py
   vendor/django/current/django/core/context_processors.py
   vendor/django/current/django/core/exceptions.py
   vendor/django/current/django/core/handler.py
   vendor/django/current/django/core/handlers/
   vendor/django/current/django/core/handlers/__init__.py
   vendor/django/current/django/core/handlers/base.py
   vendor/django/current/django/core/handlers/modpython.py
   vendor/django/current/django/core/handlers/profiler-hotshot.py
   vendor/django/current/django/core/handlers/wsgi.py
   vendor/django/current/django/core/mail.py
   vendor/django/current/django/core/management.py
   vendor/django/current/django/core/paginator.py
   vendor/django/current/django/core/serializers/
   vendor/django/current/django/core/serializers/__init__.py
   vendor/django/current/django/core/serializers/base.py
   vendor/django/current/django/core/serializers/json.py
   vendor/django/current/django/core/serializers/python.py
   vendor/django/current/django/core/serializers/xml_serializer.py
   vendor/django/current/django/core/servers/
   vendor/django/current/django/core/servers/__init__.py
   vendor/django/current/django/core/servers/basehttp.py
   vendor/django/current/django/core/servers/fastcgi.py
   vendor/django/current/django/core/signals.py
   vendor/django/current/django/core/template_loader.py
   vendor/django/current/django/core/urlresolvers.py
   vendor/django/current/django/core/validators.py
   vendor/django/current/django/core/xheaders.py
   vendor/django/current/django/db/
   vendor/django/current/django/db/__init__.py
   vendor/django/current/django/db/backends/
   vendor/django/current/django/db/backends/__init__.py
   vendor/django/current/django/db/backends/ado_mssql/
   vendor/django/current/django/db/backends/ado_mssql/__init__.py
   vendor/django/current/django/db/backends/ado_mssql/base.py
   vendor/django/current/django/db/backends/ado_mssql/client.py
   vendor/django/current/django/db/backends/ado_mssql/creation.py
   vendor/django/current/django/db/backends/ado_mssql/introspection.py
   vendor/django/current/django/db/backends/dummy/
   vendor/django/current/django/db/backends/dummy/__init__.py
   vendor/django/current/django/db/backends/dummy/base.py
   vendor/django/current/django/db/backends/dummy/client.py
   vendor/django/current/django/db/backends/dummy/creation.py
   vendor/django/current/django/db/backends/dummy/introspection.py
   vendor/django/current/django/db/backends/mysql/
   vendor/django/current/django/db/backends/mysql/__init__.py
   vendor/django/current/django/db/backends/mysql/base.py
   vendor/django/current/django/db/backends/mysql/client.py
   vendor/django/current/django/db/backends/mysql/creation.py
   vendor/django/current/django/db/backends/mysql/introspection.py
   vendor/django/current/django/db/backends/oracle/
   vendor/django/current/django/db/backends/oracle/__init__.py
   vendor/django/current/django/db/backends/oracle/base.py
   vendor/django/current/django/db/backends/oracle/client.py
   vendor/django/current/django/db/backends/oracle/creation.py
   vendor/django/current/django/db/backends/oracle/introspection.py
   vendor/django/current/django/db/backends/postgresql/
   vendor/django/current/django/db/backends/postgresql/__init__.py
   vendor/django/current/django/db/backends/postgresql/base.py
   vendor/django/current/django/db/backends/postgresql/client.py
   vendor/django/current/django/db/backends/postgresql/creation.py
   vendor/django/current/django/db/backends/postgresql/introspection.py
   vendor/django/current/django/db/backends/postgresql_psycopg2/
   vendor/django/current/django/db/backends/postgresql_psycopg2/__init__.py
   vendor/django/current/django/db/backends/postgresql_psycopg2/base.py
   vendor/django/current/django/db/backends/postgresql_psycopg2/client.py
   vendor/django/current/django/db/backends/postgresql_psycopg2/creation.py
   vendor/django/current/django/db/backends/postgresql_psycopg2/introspection.py
   vendor/django/current/django/db/backends/sqlite3/
   vendor/django/current/django/db/backends/sqlite3/__init__.py
   vendor/django/current/django/db/backends/sqlite3/base.py
   vendor/django/current/django/db/backends/sqlite3/client.py
   vendor/django/current/django/db/backends/sqlite3/creation.py
   vendor/django/current/django/db/backends/sqlite3/introspection.py
   vendor/django/current/django/db/backends/util.py
   vendor/django/current/django/db/models/
   vendor/django/current/django/db/models/__init__.py
   vendor/django/current/django/db/models/base.py
   vendor/django/current/django/db/models/fields/
   vendor/django/current/django/db/models/fields/__init__.py
   vendor/django/current/django/db/models/fields/generic.py
   vendor/django/current/django/db/models/fields/related.py
   vendor/django/current/django/db/models/loading.py
   vendor/django/current/django/db/models/manager.py
   vendor/django/current/django/db/models/manipulators.py
   vendor/django/current/django/db/models/options.py
   vendor/django/current/django/db/models/query.py
   vendor/django/current/django/db/models/related.py
   vendor/django/current/django/db/models/signals.py
   vendor/django/current/django/db/transaction.py
   vendor/django/current/django/dispatch/
   vendor/django/current/django/dispatch/__init__.py
   vendor/django/current/django/dispatch/dispatcher.py
   vendor/django/current/django/dispatch/errors.py
   vendor/django/current/django/dispatch/license.txt
   vendor/django/current/django/dispatch/robust.py
   vendor/django/current/django/dispatch/robustapply.py
   vendor/django/current/django/dispatch/saferef.py
   vendor/django/current/django/forms/
   vendor/django/current/django/forms/__init__.py
   vendor/django/current/django/http/
   vendor/django/current/django/http/__init__.py
   vendor/django/current/django/middleware/
   vendor/django/current/django/middleware/__init__.py
   vendor/django/current/django/middleware/cache.py
   vendor/django/current/django/middleware/common.py
   vendor/django/current/django/middleware/doc.py
   vendor/django/current/django/middleware/gzip.py
   vendor/django/current/django/middleware/http.py
   vendor/django/current/django/middleware/locale.py
   vendor/django/current/django/middleware/transaction.py
   vendor/django/current/django/shortcuts/
   vendor/django/current/django/shortcuts/__init__.py
   vendor/django/current/django/template/
   vendor/django/current/django/template/__init__.py
   vendor/django/current/django/template/context.py
   vendor/django/current/django/template/defaultfilters.py
   vendor/django/current/django/template/defaulttags.py
   vendor/django/current/django/template/loader.py
   vendor/django/current/django/template/loader_tags.py
   vendor/django/current/django/template/loaders/
   vendor/django/current/django/template/loaders/__init__.py
   vendor/django/current/django/template/loaders/app_directories.py
   vendor/django/current/django/template/loaders/eggs.py
   vendor/django/current/django/template/loaders/filesystem.py
   vendor/django/current/django/templatetags/
   vendor/django/current/django/templatetags/__init__.py
   vendor/django/current/django/templatetags/i18n.py
   vendor/django/current/django/utils/
   vendor/django/current/django/utils/__init__.py
   vendor/django/current/django/utils/_threading_local.py
   vendor/django/current/django/utils/autoreload.py
   vendor/django/current/django/utils/cache.py
   vendor/django/current/django/utils/daemonize.py
   vendor/django/current/django/utils/datastructures.py
   vendor/django/current/django/utils/dateformat.py
   vendor/django/current/django/utils/dates.py
   vendor/django/current/django/utils/decorators.py
   vendor/django/current/django/utils/feedgenerator.py
   vendor/django/current/django/utils/functional.py
   vendor/django/current/django/utils/html.py
   vendor/django/current/django/utils/images.py
   vendor/django/current/django/utils/simplejson/
   vendor/django/current/django/utils/simplejson/LICENSE.txt
   vendor/django/current/django/utils/simplejson/__init__.py
   vendor/django/current/django/utils/simplejson/decoder.py
   vendor/django/current/django/utils/simplejson/encoder.py
   vendor/django/current/django/utils/simplejson/scanner.py
   vendor/django/current/django/utils/stopwords.py
   vendor/django/current/django/utils/synch.py
   vendor/django/current/django/utils/termcolors.py
   vendor/django/current/django/utils/text.py
   vendor/django/current/django/utils/timesince.py
   vendor/django/current/django/utils/translation/
   vendor/django/current/django/utils/translation/__init__.py
   vendor/django/current/django/utils/translation/trans_null.py
   vendor/django/current/django/utils/translation/trans_real.py
   vendor/django/current/django/utils/tzinfo.py
   vendor/django/current/django/utils/xmlutils.py
   vendor/django/current/django/views/
   vendor/django/current/django/views/__init__.py
   vendor/django/current/django/views/debug.py
   vendor/django/current/django/views/decorators/
   vendor/django/current/django/views/decorators/__init__.py
   vendor/django/current/django/views/decorators/cache.py
   vendor/django/current/django/views/decorators/gzip.py
   vendor/django/current/django/views/decorators/http.py
   vendor/django/current/django/views/decorators/vary.py
   vendor/django/current/django/views/defaults.py
   vendor/django/current/django/views/generic/
   vendor/django/current/django/views/generic/__init__.py
   vendor/django/current/django/views/generic/create_update.py
   vendor/django/current/django/views/generic/date_based.py
   vendor/django/current/django/views/generic/list_detail.py
   vendor/django/current/django/views/generic/simple.py
   vendor/django/current/django/views/i18n.py
   vendor/django/current/django/views/static.py
   vendor/django/current/docs/
   vendor/django/current/docs/add_ons.txt
   vendor/django/current/docs/admin_css.txt
   vendor/django/current/docs/apache_auth.txt
   vendor/django/current/docs/api_stability.txt
   vendor/django/current/docs/authentication.txt
   vendor/django/current/docs/cache.txt
   vendor/django/current/docs/contributing.txt
   vendor/django/current/docs/csrf.txt
   vendor/django/current/docs/db-api.txt
   vendor/django/current/docs/design_philosophies.txt
   vendor/django/current/docs/django-admin.txt
   vendor/django/current/docs/email.txt
   vendor/django/current/docs/faq.txt
   vendor/django/current/docs/fastcgi.txt
   vendor/django/current/docs/flatpages.txt
   vendor/django/current/docs/forms.txt
   vendor/django/current/docs/generic_views.txt
   vendor/django/current/docs/i18n.txt
   vendor/django/current/docs/install.txt
   vendor/django/current/docs/legacy_databases.txt
   vendor/django/current/docs/middleware.txt
   vendor/django/current/docs/model-api.txt
   vendor/django/current/docs/modpython.txt
   vendor/django/current/docs/outputting_csv.txt
   vendor/django/current/docs/outputting_pdf.txt
   vendor/django/current/docs/overview.txt
   vendor/django/current/docs/redirects.txt
   vendor/django/current/docs/release_notes_0.95.txt
   vendor/django/current/docs/request_response.txt
   vendor/django/current/docs/serialization.txt
   vendor/django/current/docs/sessions.txt
   vendor/django/current/docs/settings.txt
   vendor/django/current/docs/sites.txt
   vendor/django/current/docs/static_files.txt
   vendor/django/current/docs/syndication_feeds.txt
   vendor/django/current/docs/templates.txt
   vendor/django/current/docs/templates_python.txt
   vendor/django/current/docs/transactions.txt
   vendor/django/current/docs/tutorial01.txt
   vendor/django/current/docs/tutorial02.txt
   vendor/django/current/docs/tutorial03.txt
   vendor/django/current/docs/tutorial04.txt
   vendor/django/current/docs/url_dispatch.txt
   vendor/django/current/examples/
   vendor/django/current/examples/__init__.py
   vendor/django/current/examples/hello/
   vendor/django/current/examples/hello/__init__.py
   vendor/django/current/examples/hello/urls.py
   vendor/django/current/examples/hello/views.py
   vendor/django/current/examples/manage.py
   vendor/django/current/examples/settings.py
   vendor/django/current/examples/urls.py
   vendor/django/current/examples/views.py
   vendor/django/current/extras/
   vendor/django/current/extras/README.TXT
   vendor/django/current/extras/django_bash_completion
   vendor/django/current/ez_setup.py
   vendor/django/current/setup.py
   vendor/django/current/tests/
   vendor/django/current/tests/doctest.py
   vendor/django/current/tests/modeltests/
   vendor/django/current/tests/modeltests/__init__.py
   vendor/django/current/tests/modeltests/basic/
   vendor/django/current/tests/modeltests/basic/__init__.py
   vendor/django/current/tests/modeltests/basic/models.py
   vendor/django/current/tests/modeltests/choices/
   vendor/django/current/tests/modeltests/choices/__init__.py
   vendor/django/current/tests/modeltests/choices/models.py
   vendor/django/current/tests/modeltests/custom_columns/
   vendor/django/current/tests/modeltests/custom_columns/__init__.py
   vendor/django/current/tests/modeltests/custom_columns/models.py
   vendor/django/current/tests/modeltests/custom_managers/
   vendor/django/current/tests/modeltests/custom_managers/__init__.py
   vendor/django/current/tests/modeltests/custom_managers/models.py
   vendor/django/current/tests/modeltests/custom_methods/
   vendor/django/current/tests/modeltests/custom_methods/__init__.py
   vendor/django/current/tests/modeltests/custom_methods/models.py
   vendor/django/current/tests/modeltests/custom_pk/
   vendor/django/current/tests/modeltests/custom_pk/__init__.py
   vendor/django/current/tests/modeltests/custom_pk/models.py
   vendor/django/current/tests/modeltests/empty/
   vendor/django/current/tests/modeltests/empty/__init__.py
   vendor/django/current/tests/modeltests/empty/models.py
   vendor/django/current/tests/modeltests/field_defaults/
   vendor/django/current/tests/modeltests/field_defaults/__init__.py
   vendor/django/current/tests/modeltests/field_defaults/models.py
   vendor/django/current/tests/modeltests/generic_relations/
   vendor/django/current/tests/modeltests/generic_relations/__init__.py
   vendor/django/current/tests/modeltests/generic_relations/models.py
   vendor/django/current/tests/modeltests/get_latest/
   vendor/django/current/tests/modeltests/get_latest/__init__.py
   vendor/django/current/tests/modeltests/get_latest/models.py
   vendor/django/current/tests/modeltests/get_or_create/
   vendor/django/current/tests/modeltests/get_or_create/__init__.py
   vendor/django/current/tests/modeltests/get_or_create/models.py
   vendor/django/current/tests/modeltests/invalid_models/
   vendor/django/current/tests/modeltests/invalid_models/__init__.py
   vendor/django/current/tests/modeltests/invalid_models/models.py
   vendor/django/current/tests/modeltests/lookup/
   vendor/django/current/tests/modeltests/lookup/__init__.py
   vendor/django/current/tests/modeltests/lookup/models.py
   vendor/django/current/tests/modeltests/m2m_and_m2o/
   vendor/django/current/tests/modeltests/m2m_and_m2o/__init__.py
   vendor/django/current/tests/modeltests/m2m_and_m2o/models.py
   vendor/django/current/tests/modeltests/m2m_intermediary/
   vendor/django/current/tests/modeltests/m2m_intermediary/__init__.py
   vendor/django/current/tests/modeltests/m2m_intermediary/models.py
   vendor/django/current/tests/modeltests/m2m_multiple/
   vendor/django/current/tests/modeltests/m2m_multiple/__init__.py
   vendor/django/current/tests/modeltests/m2m_multiple/models.py
   vendor/django/current/tests/modeltests/m2m_recursive/
   vendor/django/current/tests/modeltests/m2m_recursive/__init__.py
   vendor/django/current/tests/modeltests/m2m_recursive/models.py
   vendor/django/current/tests/modeltests/m2o_recursive/
   vendor/django/current/tests/modeltests/m2o_recursive/__init__.py
   vendor/django/current/tests/modeltests/m2o_recursive/models.py
   vendor/django/current/tests/modeltests/m2o_recursive2/
   vendor/django/current/tests/modeltests/m2o_recursive2/__init__.py
   vendor/django/current/tests/modeltests/m2o_recursive2/models.py
   vendor/django/current/tests/modeltests/manipulators/
   vendor/django/current/tests/modeltests/manipulators/__init__.py
   vendor/django/current/tests/modeltests/manipulators/models.py
   vendor/django/current/tests/modeltests/many_to_many/
   vendor/django/current/tests/modeltests/many_to_many/__init__.py
   vendor/django/current/tests/modeltests/many_to_many/models.py
   vendor/django/current/tests/modeltests/many_to_one/
   vendor/django/current/tests/modeltests/many_to_one/__init__.py
   vendor/django/current/tests/modeltests/many_to_one/models.py
   vendor/django/current/tests/modeltests/many_to_one_null/
   vendor/django/current/tests/modeltests/many_to_one_null/__init__.py
   vendor/django/current/tests/modeltests/many_to_one_null/models.py
   vendor/django/current/tests/modeltests/model_inheritance/
   vendor/django/current/tests/modeltests/model_inheritance/__init__.py
   vendor/django/current/tests/modeltests/model_inheritance/models.py
   vendor/django/current/tests/modeltests/mutually_referential/
   vendor/django/current/tests/modeltests/mutually_referential/__init__.py
   vendor/django/current/tests/modeltests/mutually_referential/models.py
   vendor/django/current/tests/modeltests/one_to_one/
   vendor/django/current/tests/modeltests/one_to_one/__init__.py
   vendor/django/current/tests/modeltests/one_to_one/models.py
   vendor/django/current/tests/modeltests/or_lookups/
   vendor/django/current/tests/modeltests/or_lookups/__init__.py
   vendor/django/current/tests/modeltests/or_lookups/models.py
   vendor/django/current/tests/modeltests/ordering/
   vendor/django/current/tests/modeltests/ordering/__init__.py
   vendor/django/current/tests/modeltests/ordering/models.py
   vendor/django/current/tests/modeltests/pagination/
   vendor/django/current/tests/modeltests/pagination/__init__.py
   vendor/django/current/tests/modeltests/pagination/models.py
   vendor/django/current/tests/modeltests/properties/
   vendor/django/current/tests/modeltests/properties/__init__.py
   vendor/django/current/tests/modeltests/properties/models.py
   vendor/django/current/tests/modeltests/reserved_names/
   vendor/django/current/tests/modeltests/reserved_names/__init__.py
   vendor/django/current/tests/modeltests/reserved_names/models.py
   vendor/django/current/tests/modeltests/reverse_lookup/
   vendor/django/current/tests/modeltests/reverse_lookup/__init__.py
   vendor/django/current/tests/modeltests/reverse_lookup/models.py
   vendor/django/current/tests/modeltests/save_delete_hooks/
   vendor/django/current/tests/modeltests/save_delete_hooks/__init__.py
   vendor/django/current/tests/modeltests/save_delete_hooks/models.py
   vendor/django/current/tests/modeltests/serializers/
   vendor/django/current/tests/modeltests/serializers/__init__.py
   vendor/django/current/tests/modeltests/serializers/models.py
   vendor/django/current/tests/modeltests/str/
   vendor/django/current/tests/modeltests/str/__init__.py
   vendor/django/current/tests/modeltests/str/models.py
   vendor/django/current/tests/modeltests/transactions/
   vendor/django/current/tests/modeltests/transactions/__init__.py
   vendor/django/current/tests/modeltests/transactions/models.py
   vendor/django/current/tests/modeltests/validation/
   vendor/django/current/tests/modeltests/validation/__init__.py
   vendor/django/current/tests/modeltests/validation/models.py
   vendor/django/current/tests/othertests/
   vendor/django/current/tests/othertests/__init__.py
   vendor/django/current/tests/othertests/cache.py
   vendor/django/current/tests/othertests/dateformat.py
   vendor/django/current/tests/othertests/db_typecasts.py
   vendor/django/current/tests/othertests/defaultfilters.py
   vendor/django/current/tests/othertests/httpwrappers.py
   vendor/django/current/tests/othertests/markup.py
   vendor/django/current/tests/othertests/templates.py
   vendor/django/current/tests/othertests/urlpatterns_reverse.py
   vendor/django/current/tests/regressiontests/
   vendor/django/current/tests/regressiontests/__init__.py
   vendor/django/current/tests/regressiontests/initial_sql_regress/
   vendor/django/current/tests/regressiontests/initial_sql_regress/__init__.py
   vendor/django/current/tests/regressiontests/initial_sql_regress/models.py
   vendor/django/current/tests/regressiontests/initial_sql_regress/sql/
   vendor/django/current/tests/regressiontests/initial_sql_regress/sql/simple.sql
   vendor/django/current/tests/regressiontests/many_to_one_regress/
   vendor/django/current/tests/regressiontests/many_to_one_regress/__init__.py
   vendor/django/current/tests/regressiontests/many_to_one_regress/models.py
   vendor/django/current/tests/regressiontests/one_to_one_regress/
   vendor/django/current/tests/regressiontests/one_to_one_regress/__init__.py
   vendor/django/current/tests/regressiontests/one_to_one_regress/models.py
   vendor/django/current/tests/regressiontests/string_lookup/
   vendor/django/current/tests/regressiontests/string_lookup/__init__.py
   vendor/django/current/tests/regressiontests/string_lookup/models.py
   vendor/django/current/tests/runtests.py
Log:
Imported django.

Added: vendor/django/current/AUTHORS
===================================================================
--- vendor/django/current/AUTHORS	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/AUTHORS	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,151 @@
+Django was originally created in late 2003 at World Online, the Web division
+of the Lawrence Journal-World newspaper in Lawrence, Kansas.
+
+
+The PRIMARY AUTHORS are (and/or have been):
+
+Adrian Holovaty <http://www.holovaty.com/>, who originally created Django with
+Simon and currently oversees things with Jacob.
+
+Simon Willison <http://simon.incutio.com/>, who originally created Django with
+Adrian during his year-long internship/placement at World Online and currently
+helps from the sidelines.
+
+Jacob Kaplan-Moss <http://www.jacobian.org/>, who joined the team shortly
+before Simon departed and currently oversees things with Adrian.
+
+Wilson Miner <http://www.wilsonminer.com/>, who designed Django's admin
+interface, pretty error pages, official Web site (djangoproject.com) and has
+made many other contributions. He makes us look good.
+
+Malcolm Tredinnick <http://www.pointy-stick.com/blog/>, who has made
+significant contributions to all levels of the framework, from its database
+layer to template system and documentation.
+
+Georg "Hugo" Bauer <http://hugo.muensterland.org/>, who added
+internationalization support, manages i18n contributions and has made a ton
+of excellent tweaks, feature additions and bug fixes.
+
+Luke Plant <http://lukeplant.me.uk/>, who has contributed many excellent
+improvements, including database-level improvements, the CSRF middleware and
+unit tests.
+
+Russell Keith-Magee <freakboy at iinet.net.au>, who has contributed many excellent
+improvements, including refactoring of the Django ORM code and unit tests.
+
+Robert Wittams <http://robert.wittams.com/>, who majorly refactored the Django
+admin application to allow for easier reuse and has made a ton of excellent
+tweaks, feature additions and bug fixes.
+
+
+And here is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --
+people who have submitted patches, reported bugs, added translations, helped
+answer newbie questions, and generally made Django that much better:
+
+    akaihola
+    Andreas
+    David Ascher <http://ascher.ca/>
+    Arthur <avandorp at gmail.com>
+    Jiri Barton
+    Ned Batchelder <http://www.nedbatchelder.com/>
+    Shannon -jj Behrens <http://jjinux.blogspot.com/>
+    James Bennett
+    Paul Bissex <http://e-scribe.com/>
+    Simon Blanchard
+    Andrew Brehaut <http://brehaut.net/blog>
+    andy at jadedplanet.net
+    Antonio Cavedoni <http://cavedoni.com/>
+    C8E
+    Chris Chamberlin <dja at cdc.msbx.net>
+    Amit Chakradeo <http://amit.chakradeo.net/>
+    ChaosKCW
+    Ian Clelland <clelland at gmail.com>
+    Matt Croydon <http://www.postneo.com/>
+    Jonathan Daugherty (cygnus) <http://www.cprogrammer.org/>
+    Jason Davies (Esaj) <http://www.jasondavies.com/>
+    Alex Dedul
+    deric at monowerks.com
+    dne at mayonnaise.net
+    Jeremy Dunck <http://dunck.us/>
+    Clint Ecker
+    gandalf at owca.info
+    Baishampayan Ghose
+    Espen Grindhaug <http://grindhaug.org/>
+    Brant Harris
+    hipertracker at gmail.com
+    Ian Holsman <http://feh.holsman.net/>
+    Kieran Holland <http://www.kieranholland.com>
+    Robert Rock Howard <http://djangomojo.com/>
+    Jason Huggins <http://www.jrandolph.com/blog/>
+    jcrasta at gmail.com
+    Michael Josephson <http://www.sdjournal.com/>
+    jpellerin at gmail.com
+    junzhang.jn at gmail.com
+    Garth Kidd <http://www.deadlybloodyserious.com/>
+    kilian <kilian.cavalotti at lip6.fr>
+    Sune Kirkeby <http://ibofobi.dk/>
+    Cameron Knight (ckknight)
+    Bruce Kroeze <http://coderseye.com/>
+    Joseph Kocherhans
+    konrad at gwu.edu
+    lakin.wecker at gmail.com
+    Stuart Langridge <http://www.kryogenix.org/>
+    Eugene Lazutkin <http://lazutkin.com/blog/>
+    Christopher Lenz <http://www.cmlenz.net/>
+    limodou
+    Martin Maney <http://www.chipy.org/Martin_Maney>
+    Manuzhai
+    Petar Marić
+    mark at junklight.com
+    mattycakes at gmail.com
+    Jason McBrayer <http://www.carcosa.net/jason/>
+    michael.mcewan at gmail.com
+    mir at noris.de
+    mmarshall
+    Eric Moritz <http://eric.themoritzfamily.com/>
+    Robin Munn <http://www.geekforgod.com/>
+    Nebojša Dorđević
+    Sam Newman <http://www.magpiebrain.com/>
+    Neal Norwitz <nnorwitz at google.com>
+    oggie rob <oz.robharvey at gmail.com>
+    Jay Parlar <parlar at gmail.com>
+    pgross at thoughtworks.com
+    phaedo <http://phaedo.cx/>
+    phil at produxion.net
+    Gustavo Picon
+    Luke Plant <http://lukeplant.me.uk/>
+    plisk
+    Daniel Poelzleithner <http://poelzi.org/>
+    J. Rademaker
+    Brian Ray <http://brianray.chipy.org/>
+    rhettg at gmail.com
+    Oliver Rutherfurd <http://rutherfurd.net/>
+    Ivan Sagalaev (Maniac) <http://www.softwaremaniacs.org/>
+    David Schein
+    sopel
+    Radek Å varz <http://www.svarz.cz/translate/>
+    Swaroop C H <http://www.swaroopch.info>
+    Aaron Swartz <http://www.aaronsw.com/>
+    Tom Tobin
+    Tom Insam
+    Joe Topjian <http://joe.terrarum.net/geek/code/python/django/>
+    Amit Upadhyay
+    Geert Vanderkelen
+    Milton Waddams
+    Rachel Willmer <http://www.willmer.com/kb/>
+    wojtek
+    ye7cakf02 at sneakemail.com
+    Cheng Zhang
+
+A big THANK YOU goes to:
+
+    Rob Curley and Ralph Gage for letting us open-source Django.
+
+    Frank Wiles for making excellent arguments for open-sourcing, and for
+    his sage sysadmin advice.
+
+    Ian Bicking for convincing Adrian to ditch code generation.
+
+    Mark Pilgrim for diveintopython.org.
+
+    Guido van Rossum for creating Python.

Added: vendor/django/current/INSTALL
===================================================================
--- vendor/django/current/INSTALL	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/INSTALL	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,22 @@
+Thanks for downloading Django.
+
+To install it, make sure you have Python 2.3 or greater installed. Then run
+this command from the command prompt:
+
+    python setup.py install
+
+Note this requires a working Internet connection if you don't already have the
+Python utility "setuptools" installed.
+
+AS AN ALTERNATIVE, you can just copy the entire "django" directory to Python's
+site-packages directory, which is located wherever your Python installation
+lives. Some places you might check are:
+
+    /usr/lib/python2.4/site-packages (Unix, Python 2.4)
+    /usr/lib/python2.3/site-packages (Unix, Python 2.3)
+    C:\\PYTHON\site-packages         (Windows)
+
+This second solution does not require a working Internet connection; it
+bypasses "setuptools" entirely.
+
+For more detailed instructions, see docs/install.txt.

Added: vendor/django/current/LICENSE
===================================================================
--- vendor/django/current/LICENSE	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/LICENSE	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,27 @@
+Copyright (c) 2005, the Lawrence Journal-World
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    1. Redistributions of source code must retain the above copyright notice, 
+       this list of conditions and the following disclaimer.
+    
+    2. Redistributions in binary form must reproduce the above copyright 
+       notice, this list of conditions and the following disclaimer in the
+       documentation and/or other materials provided with the distribution.
+
+    3. Neither the name of Django nor the names of its contributors may be used
+       to endorse or promote products derived from this software without
+       specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file

Added: vendor/django/current/README
===================================================================
--- vendor/django/current/README	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/README	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,37 @@
+Django is a high-level Python Web framework that encourages rapid development
+and clean, pragmatic design.
+
+All documentation is in the "docs" directory and online at
+http://www.djangoproject.com/documentation/.  If you're just getting started,
+here's how we recommend you read the docs:
+
+    * First, read docs/install.txt for instructions on installing Django.
+
+    * Next, work through the tutorials in order (docs/tutorial01.txt,
+      docs/tutorial02.txt, etc.).
+
+    * If you want to set up an actual deployment server, read docs/modpython.txt
+      for instructions on running Django under mod_python.
+
+    * The rest of the documentation is of the reference-manual variety.
+      Read it -- and the FAQ -- as you run into problems.
+
+Docs are updated rigorously. If you find any problems in the docs, or think they
+should be clarified in any way, please take 30 seconds to fill out a ticket
+here:
+
+http://code.djangoproject.com/newticket
+
+To get more help:
+
+    * Join the #django channel on irc.freenode.net. Lots of helpful people
+      hang out there. Read the archives at http://loglibrary.com/179 .
+
+    * Join the django-users mailing list, or read the archives, at
+      http://groups-beta.google.com/group/django-users.
+
+To contribute to Django:
+
+    * Check out http://www.djangoproject.com/community/ for information
+      about getting involved.
+

Added: vendor/django/current/django/__init__.py
===================================================================
--- vendor/django/current/django/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+VERSION = (0, 95.1, None)

Added: vendor/django/current/django/bin/__init__.py
===================================================================

Added: vendor/django/current/django/bin/compile-messages.py
===================================================================
--- vendor/django/current/django/bin/compile-messages.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/bin/compile-messages.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+def compile_messages():
+    basedir = None
+
+    if os.path.isdir(os.path.join('conf', 'locale')):
+        basedir = os.path.abspath(os.path.join('conf', 'locale'))
+    elif os.path.isdir('locale'):
+        basedir = os.path.abspath('locale')
+    else:
+        print "this script should be run from the django svn tree or your project or app tree"
+        sys.exit(1)
+
+    for (dirpath, dirnames, filenames) in os.walk(basedir):
+        for f in filenames:
+            if f.endswith('.po'):
+                sys.stderr.write('processing file %s in %s\n' % (f, dirpath))
+                pf = os.path.splitext(os.path.join(dirpath, f))[0]
+                # Store the names of the .mo and .po files in an environment
+                # variable, rather than doing a string replacement into the
+                # command, so that we can take advantage of shell quoting, to
+                # quote any malicious characters/escaping.
+                # See http://cyberelk.net/tim/articles/cmdline/ar01s02.html
+                os.environ['djangocompilemo'] = pf + '.mo'
+                os.environ['djangocompilepo'] = pf + '.po'
+                if sys.platform == 'win32': # Different shell-variable syntax
+                    cmd = 'msgfmt -o "%djangocompilemo%" "%djangocompilepo%"'
+                else:
+                    cmd = 'msgfmt -o "$djangocompilemo" "$djangocompilepo"' 
+                os.system(cmd)
+
+if __name__ == "__main__":
+    compile_messages()


Property changes on: vendor/django/current/django/bin/compile-messages.py
___________________________________________________________________
Name: svn:executable
   + 

Added: vendor/django/current/django/bin/daily_cleanup.py
===================================================================
--- vendor/django/current/django/bin/daily_cleanup.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/bin/daily_cleanup.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,17 @@
+"Daily cleanup file"
+
+from django.db import backend, connection, transaction
+
+DOCUMENTATION_DIRECTORY = '/home/html/documentation/'
+
+def clean_up():
+    # Clean up old database records
+    cursor = connection.cursor()
+    cursor.execute("DELETE FROM %s WHERE %s < NOW()" % \
+        (backend.quote_name('core_sessions'), backend.quote_name('expire_date')))
+    cursor.execute("DELETE FROM %s WHERE %s < NOW() - INTERVAL '1 week'" % \
+        (backend.quote_name('registration_challenges'), backend.quote_name('request_date')))
+    transaction.commit_unless_managed()
+
+if __name__ == "__main__":
+    clean_up()

Added: vendor/django/current/django/bin/django-admin.py
===================================================================
--- vendor/django/current/django/bin/django-admin.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/bin/django-admin.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,5 @@
+#!/usr/bin/env python
+from django.core import management
+
+if __name__ == "__main__":
+    management.execute_from_command_line()


Property changes on: vendor/django/current/django/bin/django-admin.py
___________________________________________________________________
Name: svn:executable
   + 

Added: vendor/django/current/django/bin/make-messages.py
===================================================================
--- vendor/django/current/django/bin/make-messages.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/bin/make-messages.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,145 @@
+#!/usr/bin/env python
+
+# Need to ensure that the i18n framework is enabled
+from django.conf import settings
+settings.configure(USE_I18N = True)
+
+from django.utils.translation import templatize
+import re
+import os
+import sys
+import getopt
+
+pythonize_re = re.compile(r'\n\s*//')
+
+def make_messages():
+    localedir = None
+
+    if os.path.isdir(os.path.join('conf', 'locale')):
+        localedir = os.path.abspath(os.path.join('conf', 'locale'))
+    elif os.path.isdir('locale'):
+        localedir = os.path.abspath('locale')
+    else:
+        print "This script should be run from the django svn tree or your project or app tree."
+        print "If you did indeed run it from the svn checkout or your project or application,"
+        print "maybe you are just missing the conf/locale (in the django tree) or locale (for project"
+        print "and application) directory?"
+        print "make-messages.py doesn't create it automatically, you have to create it by hand if"
+        print "you want to enable i18n for your project or application."
+        sys.exit(1)
+
+    (opts, args) = getopt.getopt(sys.argv[1:], 'l:d:va')
+
+    lang = None
+    domain = 'django'
+    verbose = False
+    all = False
+
+    for o, v in opts:
+        if o == '-l':
+            lang = v
+        elif o == '-d':
+            domain = v
+        elif o == '-v':
+            verbose = True
+        elif o == '-a':
+            all = True
+
+    if domain not in ('django', 'djangojs'):
+        print "currently make-messages.py only supports domains 'django' and 'djangojs'"
+        sys.exit(1)
+    if (lang is None and not all) or domain is None:
+        print "usage: make-messages.py -l <language>"
+        print "   or: make-messages.py -a"
+        sys.exit(1)
+
+    languages = []
+
+    if lang is not None:
+        languages.append(lang)
+    elif all:
+        languages = [el for el in os.listdir(localedir) if not el.startswith('.')]
+
+    for lang in languages:
+
+        print "processing language", lang
+        basedir = os.path.join(localedir, lang, 'LC_MESSAGES')
+        if not os.path.isdir(basedir):
+            os.makedirs(basedir)
+
+        pofile = os.path.join(basedir, '%s.po' % domain)
+        potfile = os.path.join(basedir, '%s.pot' % domain)
+
+        if os.path.exists(potfile):
+            os.unlink(potfile)
+
+        for (dirpath, dirnames, filenames) in os.walk("."):
+            for file in filenames:
+                if domain == 'djangojs' and file.endswith('.js'):
+                    if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
+                    src = open(os.path.join(dirpath, file), "rb").read()
+                    src = pythonize_re.sub('\n#', src)
+                    open(os.path.join(dirpath, '%s.py' % file), "wb").write(src)
+                    thefile = '%s.py' % file
+                    cmd = 'xgettext %s -d %s -L Perl --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy -o - "%s"' % (
+                        os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
+                    (stdin, stdout, stderr) = os.popen3(cmd, 'b')
+                    msgs = stdout.read()
+                    errors = stderr.read()
+                    if errors:
+                        print "errors happened while running xgettext on %s" % file
+                        print errors
+                        sys.exit(8)
+                    old = '#: '+os.path.join(dirpath, thefile)[2:]
+                    new = '#: '+os.path.join(dirpath, file)[2:]
+                    msgs = msgs.replace(old, new)
+                    if msgs:
+                        open(potfile, 'ab').write(msgs)
+                    os.unlink(os.path.join(dirpath, thefile))
+                elif domain == 'django' and (file.endswith('.py') or file.endswith('.html')):
+                    thefile = file
+                    if file.endswith('.html'):
+                        src = open(os.path.join(dirpath, file), "rb").read()
+                        open(os.path.join(dirpath, '%s.py' % file), "wb").write(templatize(src))
+                        thefile = '%s.py' % file
+                    if verbose: sys.stdout.write('processing file %s in %s\n' % (file, dirpath))
+                    cmd = 'xgettext %s -d %s -L Python --keyword=gettext_noop --keyword=gettext_lazy --keyword=ngettext_lazy -o - "%s"' % (
+                        os.path.exists(potfile) and '--omit-header' or '', domain, os.path.join(dirpath, thefile))
+                    (stdin, stdout, stderr) = os.popen3(cmd, 'b')
+                    msgs = stdout.read()
+                    errors = stderr.read()
+                    if errors:
+                        print "errors happened while running xgettext on %s" % file
+                        print errors
+                        sys.exit(8)
+                    if thefile != file:
+                        old = '#: '+os.path.join(dirpath, thefile)[2:]
+                        new = '#: '+os.path.join(dirpath, file)[2:]
+                        msgs = msgs.replace(old, new)
+                    if msgs:
+                        open(potfile, 'ab').write(msgs)
+                    if thefile != file:
+                        os.unlink(os.path.join(dirpath, thefile))
+
+        if os.path.exists(potfile):
+            (stdin, stdout, stderr) = os.popen3('msguniq "%s"' % potfile, 'b')
+            msgs = stdout.read()
+            errors = stderr.read()
+            if errors:
+                print "errors happened while running msguniq"
+                print errors
+                sys.exit(8)
+            open(potfile, 'w').write(msgs)
+            if os.path.exists(pofile):
+                (stdin, stdout, stderr) = os.popen3('msgmerge -q "%s" "%s"' % (pofile, potfile), 'b')
+                msgs = stdout.read()
+                errors = stderr.read()
+                if errors:
+                    print "errors happened while running msgmerge"
+                    print errors
+                    sys.exit(8)
+            open(pofile, 'wb').write(msgs)
+            os.unlink(potfile)
+
+if __name__ == "__main__":
+    make_messages()


Property changes on: vendor/django/current/django/bin/make-messages.py
___________________________________________________________________
Name: svn:executable
   + 

Added: vendor/django/current/django/bin/profiling/__init__.py
===================================================================

Added: vendor/django/current/django/bin/profiling/gather_profile_stats.py
===================================================================
--- vendor/django/current/django/bin/profiling/gather_profile_stats.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/bin/profiling/gather_profile_stats.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,34 @@
+"""
+gather_profile_stats.py /path/to/dir/of/profiles
+
+Note that the aggregated profiles must be read with pstats.Stats, not
+hotshot.stats (the formats are incompatible)
+"""
+
+from hotshot import stats
+import pstats
+import sys, os
+
+def gather_stats(p):
+    profiles = {}
+    for f in os.listdir(p):
+        if f.endswith('.agg.prof'):
+            path = f[:-9]
+            prof = pstats.Stats(os.path.join(p, f))
+        elif f.endswith('.prof'):
+            bits = f.split('.')
+            path = ".".join(bits[:-3])
+            prof = stats.load(os.path.join(p, f))
+        else:
+            continue
+        print "Processing %s" % f
+        if profiles.has_key(path):
+            profiles[path].add(prof)
+        else:
+            profiles[path] = prof
+        os.unlink(os.path.join(p, f))
+    for (path, prof) in profiles.items():
+        prof.dump_stats(os.path.join(p, "%s.agg.prof" % path))
+    
+if __name__ == '__main__':
+    gather_stats(sys.argv[1])

Added: vendor/django/current/django/bin/unique-messages.py
===================================================================
--- vendor/django/current/django/bin/unique-messages.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/bin/unique-messages.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+import os
+import sys
+
+def unique_messages():
+    basedir = None
+
+    if os.path.isdir(os.path.join('conf', 'locale')):
+        basedir = os.path.abspath(os.path.join('conf', 'locale'))
+    elif os.path.isdir('locale'):
+        basedir = os.path.abspath('locale')
+    else:
+        print "this script should be run from the django svn tree or your project or app tree"
+        sys.exit(1)
+
+    for (dirpath, dirnames, filenames) in os.walk(basedir):
+        for f in filenames:
+            if f.endswith('.po'):
+                sys.stderr.write('processing file %s in %s\n' % (f, dirpath))
+                pf = os.path.splitext(os.path.join(dirpath, f))[0]
+                cmd = 'msguniq "%s.po"' % pf
+                stdout = os.popen(cmd)
+                msg = stdout.read()
+                open('%s.po' % pf, 'w').write(msg)
+
+if __name__ == "__main__":
+    unique_messages()


Property changes on: vendor/django/current/django/bin/unique-messages.py
___________________________________________________________________
Name: svn:executable
   + 

Added: vendor/django/current/django/conf/__init__.py
===================================================================
--- vendor/django/current/django/conf/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,146 @@
+"""
+Settings and configuration for Django.
+
+Values will be read from the module specified by the DJANGO_SETTINGS_MODULE environment
+variable, and then from django.conf.global_settings; see the global settings file for
+a list of all possible variables.
+"""
+
+import os
+from django.conf import global_settings
+
+ENVIRONMENT_VARIABLE = "DJANGO_SETTINGS_MODULE"
+
+class LazySettings(object):
+    """
+    A lazy proxy for either global Django settings or a custom settings object.
+    The user can manually configure settings prior to using them. Otherwise,
+    Django uses the settings module pointed to by DJANGO_SETTINGS_MODULE.
+    """
+    def __init__(self):
+        # _target must be either None or something that supports attribute
+        # access (getattr, hasattr, etc).
+        self._target = None
+
+    def __getattr__(self, name):
+        if self._target is None:
+            self._import_settings()
+        if name == '__members__':
+            # Used to implement dir(obj), for example.
+            return self._target.get_all_members()
+        return getattr(self._target, name)
+
+    def __setattr__(self, name, value):
+        if name == '_target':
+            # Assign directly to self.__dict__, because otherwise we'd call
+            # __setattr__(), which would be an infinite loop.
+            self.__dict__['_target'] = value
+        else:
+            setattr(self._target, name, value)
+
+    def _import_settings(self):
+        """
+        Load the settings module pointed to by the environment variable. This
+        is used the first time we need any settings at all, if the user has not
+        previously configured the settings manually.
+        """
+        try:
+            settings_module = os.environ[ENVIRONMENT_VARIABLE]
+            if not settings_module: # If it's set but is an empty string.
+                raise KeyError
+        except KeyError:
+            raise EnvironmentError, "Environment variable %s is undefined." % ENVIRONMENT_VARIABLE
+
+        self._target = Settings(settings_module)
+
+    def configure(self, default_settings=global_settings, **options):
+        """
+        Called to manually configure the settings. The 'default_settings'
+        parameter sets where to retrieve any unspecified values from (its
+        argument must support attribute access (__getattr__)).
+        """
+        if self._target != None:
+            raise EnvironmentError, 'Settings already configured.'
+        holder = UserSettingsHolder(default_settings)
+        for name, value in options.items():
+            setattr(holder, name, value)
+        self._target = holder
+
+class Settings(object):
+    def __init__(self, settings_module):
+        # update this dict from global settings (but only for ALL_CAPS settings)
+        for setting in dir(global_settings):
+            if setting == setting.upper():
+                setattr(self, setting, getattr(global_settings, setting))
+
+        # store the settings module in case someone later cares
+        self.SETTINGS_MODULE = settings_module
+
+        try:
+            mod = __import__(self.SETTINGS_MODULE, '', '', [''])
+        except ImportError, e:
+            raise EnvironmentError, "Could not import settings '%s' (Is it on sys.path? Does it have syntax errors?): %s" % (self.SETTINGS_MODULE, e)
+
+        # Settings that should be converted into tuples if they're mistakenly entered
+        # as strings.
+        tuple_settings = ("INSTALLED_APPS", "TEMPLATE_DIRS")
+
+        for setting in dir(mod):
+            if setting == setting.upper():
+                setting_value = getattr(mod, setting)
+                if setting in tuple_settings and type(setting_value) == str:
+                    setting_value = (setting_value,) # In case the user forgot the comma.
+                setattr(self, setting, setting_value)
+
+        # Expand entries in INSTALLED_APPS like "django.contrib.*" to a list
+        # of all those apps.
+        new_installed_apps = []
+        for app in self.INSTALLED_APPS:
+            if app.endswith('.*'):
+                appdir = os.path.dirname(__import__(app[:-2], '', '', ['']).__file__)
+                for d in os.listdir(appdir):
+                    if d.isalpha() and os.path.isdir(os.path.join(appdir, d)):
+                        new_installed_apps.append('%s.%s' % (app[:-2], d))
+            else:
+                new_installed_apps.append(app)
+        self.INSTALLED_APPS = new_installed_apps
+
+        # move the time zone info into os.environ
+        os.environ['TZ'] = self.TIME_ZONE
+
+    def get_all_members(self):
+        return dir(self)
+
+class UserSettingsHolder(object):
+    """
+    Holder for user configured settings.
+    """
+    # SETTINGS_MODULE doesn't make much sense in the manually configured
+    # (standalone) case.
+    SETTINGS_MODULE = None
+
+    def __init__(self, default_settings):
+        """
+        Requests for configuration variables not in this class are satisfied
+        from the module specified in default_settings (if possible).
+        """
+        self.default_settings = default_settings
+
+    def __getattr__(self, name):
+        return getattr(self.default_settings, name)
+
+    def get_all_members(self):
+        return dir(self) + dir(self.default_settings)
+
+settings = LazySettings()
+
+# This function replaces itself with django.utils.translation.gettext() the
+# first time it's run. This is necessary because the import of
+# django.utils.translation requires a working settings module, and loading it
+# from within this file would cause a circular import.
+def first_time_gettext(*args):
+    from django.utils.translation import gettext
+    __builtins__['_'] = gettext
+    return gettext(*args)
+
+__builtins__['_'] = first_time_gettext

Added: vendor/django/current/django/conf/app_template/__init__.py
===================================================================

Added: vendor/django/current/django/conf/app_template/models.py
===================================================================
--- vendor/django/current/django/conf/app_template/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/app_template/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.

Added: vendor/django/current/django/conf/app_template/views.py
===================================================================
--- vendor/django/current/django/conf/app_template/views.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/app_template/views.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+# Create your views here.

Added: vendor/django/current/django/conf/global_settings.py
===================================================================
--- vendor/django/current/django/conf/global_settings.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/global_settings.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,297 @@
+# Default Django settings. Override these with settings in the module
+# pointed-to by the DJANGO_SETTINGS_MODULE environment variable.
+
+# This is defined here as a do-nothing function because we can't import
+# django.utils.translation -- that module depends on the settings.
+gettext_noop = lambda s: s
+
+####################
+# CORE             #
+####################
+
+DEBUG = False
+TEMPLATE_DEBUG = False
+
+# Whether to use the "Etag" header. This saves bandwidth but slows down performance.
+USE_ETAGS = False
+
+# People who get code error notifications.
+# In the format (('Full Name', 'email at domain.com'), ('Full Name', 'anotheremail at domain.com'))
+ADMINS = ()
+
+# Tuple of IP addresses, as strings, that:
+#   * See debug comments, when DEBUG is true
+#   * Receive x-headers
+INTERNAL_IPS = ()
+
+# Local time zone for this installation. All choices can be found here:
+# http://www.postgresql.org/docs/current/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
+# http://blogs.law.harvard.edu/tech/stories/storyReader$15
+LANGUAGE_CODE = 'en-us'
+
+# Languages we provide translations for, out of the box. The language name
+# should be the utf-8 encoded local name for the language.
+LANGUAGES = (
+    ('ar', gettext_noop('Arabic')),
+    ('bn', gettext_noop('Bengali')),
+    ('cs', gettext_noop('Czech')),
+    ('cy', gettext_noop('Welsh')),
+    ('da', gettext_noop('Danish')),
+    ('de', gettext_noop('German')),
+    ('el', gettext_noop('Greek')),
+    ('en', gettext_noop('English')),
+    ('es', gettext_noop('Spanish')),
+    ('es_AR', gettext_noop('Argentinean Spanish')),
+    ('fr', gettext_noop('French')),
+    ('gl', gettext_noop('Galician')),
+    ('hu', gettext_noop('Hungarian')),
+    ('he', gettext_noop('Hebrew')),
+    ('is', gettext_noop('Icelandic')),
+    ('it', gettext_noop('Italian')),
+    ('ja', gettext_noop('Japanese')),
+    ('nl', gettext_noop('Dutch')),
+    ('no', gettext_noop('Norwegian')),
+    ('pt-br', gettext_noop('Brazilian')),
+    ('ro', gettext_noop('Romanian')),
+    ('ru', gettext_noop('Russian')),
+    ('sk', gettext_noop('Slovak')),
+    ('sl', gettext_noop('Slovenian')),
+    ('sr', gettext_noop('Serbian')),
+    ('sv', gettext_noop('Swedish')),
+    ('ta', gettext_noop('Tamil')),
+    ('uk', gettext_noop('Ukrainian')),
+    ('zh-cn', gettext_noop('Simplified Chinese')),
+    ('zh-tw', gettext_noop('Traditional Chinese')),
+)
+
+# Languages using BiDi (right-to-left) layout
+LANGUAGES_BIDI = ("he", "ar")
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# Not-necessarily-technical managers of the site. They get broken link
+# notifications and other various e-mails.
+MANAGERS = ADMINS
+
+# Default content type and charset to use for all HttpResponse objects, if a
+# MIME type isn't manually specified. These are used to construct the
+# Content-Type header.
+DEFAULT_CONTENT_TYPE = 'text/html'
+DEFAULT_CHARSET = 'utf-8'
+
+# E-mail address that error messages come from.
+SERVER_EMAIL = 'root at localhost'
+
+# Whether to send broken-link e-mails.
+SEND_BROKEN_LINK_EMAILS = False
+
+# Database connection info.
+DATABASE_ENGINE = ''           # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
+DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+# Host for sending e-mail.
+EMAIL_HOST = 'localhost'
+
+# Port for sending e-mail.
+EMAIL_PORT = 25
+
+# Optional SMTP authentication information for EMAIL_HOST.
+EMAIL_HOST_USER = ''
+EMAIL_HOST_PASSWORD = ''
+
+# List of strings representing installed apps.
+INSTALLED_APPS = ()
+
+# List of locations of the template source files, in search order.
+TEMPLATE_DIRS = ()
+
+# List of callables that know how to import templates from various sources.
+# See the comments in django/core/template/loader.py for interface
+# documentation.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+# List of processors used by RequestContext to populate the context.
+# Each one should be a callable that takes the request object as its
+# only parameter and returns a dictionary to add to the context.
+TEMPLATE_CONTEXT_PROCESSORS = (
+    'django.core.context_processors.auth',
+    'django.core.context_processors.debug',
+    'django.core.context_processors.i18n',
+#    'django.core.context_processors.request',
+)
+
+# Output to use in template system for invalid (e.g. misspelled) variables.
+TEMPLATE_STRING_IF_INVALID = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Default e-mail address to use for various automated correspondence from
+# the site managers.
+DEFAULT_FROM_EMAIL = 'webmaster at localhost'
+
+# Subject-line prefix for email messages send with django.core.mail.mail_admins
+# or ...mail_managers.  Make sure to include the trailing space.
+EMAIL_SUBJECT_PREFIX = '[Django] '
+
+# Whether to append trailing slashes to URLs.
+APPEND_SLASH = True
+
+# Whether to prepend the "www." subdomain to URLs that don't have it.
+PREPEND_WWW = False
+
+# List of compiled regular expression objects representing User-Agent strings
+# that are not allowed to visit any page, systemwide. Use this for bad
+# robots/crawlers. Here are a few examples:
+#     import re
+#     DISALLOWED_USER_AGENTS = (
+#         re.compile(r'^NaverBot.*'),
+#         re.compile(r'^EmailSiphon.*'),
+#         re.compile(r'^SiteSucker.*'),
+#         re.compile(r'^sohu-search')
+#     )
+DISALLOWED_USER_AGENTS = ()
+
+ABSOLUTE_URL_OVERRIDES = {}
+
+# Tuple of strings representing allowed prefixes for the {% ssi %} tag.
+# Example: ('/home/html', '/var/www')
+ALLOWED_INCLUDE_ROOTS = ()
+
+# If this is a admin settings module, this should be a list of
+# settings modules (in the format 'foo.bar.baz') for which this admin
+# is an admin.
+ADMIN_FOR = ()
+
+# 404s that may be ignored.
+IGNORABLE_404_STARTS = ('/cgi-bin/', '/_vti_bin', '/_vti_inf')
+IGNORABLE_404_ENDS = ('mail.pl', 'mailform.pl', 'mail.cgi', 'mailform.cgi', 'favicon.ico', '.php')
+
+# A secret key for this particular Django installation. Used in secret-key
+# hashing algorithms. Set this in your settings, or Django will complain
+# loudly.
+SECRET_KEY = ''
+
+# Path to the "jing" executable -- needed to validate XMLFields
+JING_PATH = "/usr/bin/jing"
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT.
+# Example: "http://media.lawrence.com"
+MEDIA_URL = ''
+
+# Default formatting for date objects. See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+DATE_FORMAT = 'N j, Y'
+
+# Default formatting for datetime objects. See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+DATETIME_FORMAT = 'N j, Y, P'
+
+# Default formatting for time objects. See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+TIME_FORMAT = 'P'
+
+# Default formatting for date objects when only the year and month are relevant.
+# See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+YEAR_MONTH_FORMAT = 'F Y'
+
+# Default formatting for date objects when only the month and day are relevant.
+# See all available format strings here:
+# http://www.djangoproject.com/documentation/templates/#now
+MONTH_DAY_FORMAT = 'F j'
+
+# Whether to enable Psyco, which optimizes Python code. Requires Psyco.
+# http://psyco.sourceforge.net/
+ENABLE_PSYCO = False
+
+# Do you want to manage transactions manually?
+# Hint: you really don't!
+TRANSACTIONS_MANAGED = False
+
+##############
+# MIDDLEWARE #
+##############
+
+# List of middleware classes to use.  Order is important; in the request phase,
+# this middleware classes will be applied in the order given, and in the
+# response phase the middleware will be applied in reverse order.
+MIDDLEWARE_CLASSES = (
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+#     'django.middleware.http.ConditionalGetMiddleware',
+#     'django.middleware.gzip.GZipMiddleware',
+    'django.middleware.common.CommonMiddleware',
+    'django.middleware.doc.XViewMiddleware',
+)
+
+############
+# SESSIONS #
+############
+
+SESSION_COOKIE_NAME = 'sessionid'         # Cookie name. This can be whatever you want.
+SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 # Age of cookie, in seconds (default: 2 weeks).
+SESSION_COOKIE_DOMAIN = None              # A string like ".lawrence.com", or None for standard domain cookie.
+SESSION_SAVE_EVERY_REQUEST = False        # Whether to save the session data on every request.
+SESSION_EXPIRE_AT_BROWSER_CLOSE = False   # Whether sessions expire when a user closes his browser.
+
+#########
+# CACHE #
+#########
+
+# The cache backend to use.  See the docstring in django.core.cache for the
+# possible values.
+CACHE_BACKEND = 'simple://'
+CACHE_MIDDLEWARE_KEY_PREFIX = ''
+
+####################
+# COMMENTS         #
+####################
+
+COMMENTS_ALLOW_PROFANITIES = False
+
+# The group ID that designates which users are banned.
+# Set to None if you're not using it.
+COMMENTS_BANNED_USERS_GROUP = None
+
+# The group ID that designates which users can moderate comments.
+# Set to None if you're not using it.
+COMMENTS_MODERATORS_GROUP = None
+
+# The group ID that designates the users whose comments should be e-mailed to MANAGERS.
+# Set to None if you're not using it.
+COMMENTS_SKETCHY_USERS_GROUP = None
+
+# The system will e-mail MANAGERS the first COMMENTS_FIRST_FEW comments by each
+# user. Set this to 0 if you want to disable it.
+COMMENTS_FIRST_FEW = 0
+
+# A tuple of IP addresses that have been banned from participating in various
+# Django-powered features.
+BANNED_IPS = ()
+
+##################
+# AUTHENTICATION #
+##################
+
+AUTHENTICATION_BACKENDS = ('django.contrib.auth.backends.ModelBackend',)

Added: vendor/django/current/django/conf/locale/ar/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ar/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ar/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/ar/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ar/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1989 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the django package.
+# Ahmad Alhashemi <trans at ahmadh.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django SVN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-07-03 19:22+0300\n"
+"PO-Revision-Date: 2006-07-06 23:46+0300\n"
+"Last-Translator: Ahmad Alhashemi <ahmad at ahmadh.com>\n"
+"Language-Team: Ahmad Alhashemi <trans at ahmadh.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=4; plural=(n == 1? 0 : (n == 2? 1 : (n <= 10? 2 : 3)));\n"
+"X-Poedit-Language: Arabic\n"
+"X-Poedit-Country: KUWAIT\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: .\conf\global_settings.py:37
+msgid "Bengali"
+msgstr "بنغالي"
+
+#: .\conf\global_settings.py:38
+msgid "Czech"
+msgstr "تشيكي"
+
+#: .\conf\global_settings.py:39
+msgid "Welsh"
+msgstr "ويلزي"
+
+#: .\conf\global_settings.py:40
+msgid "Danish"
+msgstr "دنماركي"
+
+#: .\conf\global_settings.py:41
+msgid "German"
+msgstr "ألماني"
+
+#: .\conf\global_settings.py:42
+msgid "Greek"
+msgstr "اغريقي"
+
+#: .\conf\global_settings.py:43
+msgid "English"
+msgstr "انجليزي"
+
+#: .\conf\global_settings.py:44
+msgid "Spanish"
+msgstr "اسباني"
+
+#: .\conf\global_settings.py:45
+msgid "Argentinean Spanish"
+msgstr "اسباني أرجنتيني"
+
+#: .\conf\global_settings.py:46
+msgid "French"
+msgstr "فرنسي"
+
+#: .\conf\global_settings.py:47
+msgid "Galician"
+msgstr "جاليسي"
+
+#: .\conf\global_settings.py:48
+msgid "Hungarian"
+msgstr "هنغاري"
+
+#: .\conf\global_settings.py:49
+msgid "Hebrew"
+msgstr "عبري"
+
+#: .\conf\global_settings.py:50
+msgid "Icelandic"
+msgstr "آيسلندي"
+
+#: .\conf\global_settings.py:51
+msgid "Italian"
+msgstr "ايطالي"
+
+#: .\conf\global_settings.py:52
+msgid "Japanese"
+msgstr "ياباني"
+
+#: .\conf\global_settings.py:53
+msgid "Dutch"
+msgstr "هولندي"
+
+#: .\conf\global_settings.py:54
+msgid "Norwegian"
+msgstr "نرويجي"
+
+#: .\conf\global_settings.py:55
+msgid "Brazilian"
+msgstr "برازيلي"
+
+#: .\conf\global_settings.py:56
+msgid "Romanian"
+msgstr "روماني"
+
+#: .\conf\global_settings.py:57
+msgid "Russian"
+msgstr "روسي"
+
+#: .\conf\global_settings.py:58
+msgid "Slovak"
+msgstr "سلوفاك"
+
+#: .\conf\global_settings.py:59
+msgid "Slovenian"
+msgstr "سلوفاتي"
+
+#: .\conf\global_settings.py:60
+msgid "Serbian"
+msgstr "صربي"
+
+#: .\conf\global_settings.py:61
+msgid "Swedish"
+msgstr "سويدي"
+
+#: .\conf\global_settings.py:62
+msgid "Ukrainian"
+msgstr "أكراني"
+
+#: .\conf\global_settings.py:63
+msgid "Simplified Chinese"
+msgstr "صيني مبسط"
+
+#: .\conf\global_settings.py:64
+msgid "Traditional Chinese"
+msgstr "صيني تقليدي"
+
+#: .\contrib\admin\filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>بواسطة %s:</h3>\n"
+"<ul>\n"
+
+#: .\contrib\admin\filterspecs.py:70
+#: .\contrib\admin\filterspecs.py:88
+#: .\contrib\admin\filterspecs.py:143
+#: .\contrib\admin\filterspecs.py:169
+msgid "All"
+msgstr "كافة"
+
+#: .\contrib\admin\filterspecs.py:109
+msgid "Any date"
+msgstr "أي تاريخ"
+
+#: .\contrib\admin\filterspecs.py:110
+msgid "Today"
+msgstr "اليوم"
+
+#: .\contrib\admin\filterspecs.py:113
+msgid "Past 7 days"
+msgstr "الأيام 7 الماضية"
+
+#: .\contrib\admin\filterspecs.py:115
+msgid "This month"
+msgstr "هذا الشهر"
+
+#: .\contrib\admin\filterspecs.py:117
+msgid "This year"
+msgstr "هذه السنة"
+
+#: .\contrib\admin\filterspecs.py:143
+msgid "Yes"
+msgstr "نعم"
+
+#: .\contrib\admin\filterspecs.py:143
+msgid "No"
+msgstr "لا"
+
+#: .\contrib\admin\filterspecs.py:150
+msgid "Unknown"
+msgstr "غير معروف"
+
+#: .\contrib\admin\models.py:16
+msgid "action time"
+msgstr "وقت العملية"
+
+#: .\contrib\admin\models.py:19
+msgid "object id"
+msgstr "معرف العنصر"
+
+#: .\contrib\admin\models.py:20
+msgid "object repr"
+msgstr "ممثل العنصر"
+
+#: .\contrib\admin\models.py:21
+msgid "action flag"
+msgstr "علامة العملية"
+
+#: .\contrib\admin\models.py:22
+msgid "change message"
+msgstr "تغيير الرسالة"
+
+#: .\contrib\admin\models.py:25
+msgid "log entry"
+msgstr "مدخل السجل"
+
+#: .\contrib\admin\models.py:26
+msgid "log entries"
+msgstr "مدخلات السجل"
+
+#: .\contrib\admin\templates\admin\404.html.py:4
+#: .\contrib\admin\templates\admin\404.html.py:8
+msgid "Page not found"
+msgstr "تعذر العثور على الصفحة"
+
+#: .\contrib\admin\templates\admin\404.html.py:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "نحن آسفون، لكننا لم نعثر على الصفحة المطلوبة."
+
+#: .\contrib\admin\templates\admin\500.html.py:4
+#: .\contrib\admin\templates\admin\base.html.py:29
+#: .\contrib\admin\templates\admin\change_form.html.py:13
+#: .\contrib\admin\templates\admin\change_list.html.py:6
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:6
+#: .\contrib\admin\templates\admin\invalid_setup.html.py:4
+#: .\contrib\admin\templates\admin\object_history.html.py:5
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+#: .\contrib\admin\templates\registration\logged_out.html.py:4
+#: .\contrib\admin\templates\registration\password_change_done.html.py:4
+#: .\contrib\admin\templates\registration\password_change_form.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
+msgid "Home"
+msgstr "الرئيسية"
+
+#: .\contrib\admin\templates\admin\500.html.py:4
+msgid "Server error"
+msgstr "خطأ في المزود"
+
+#: .\contrib\admin\templates\admin\500.html.py:6
+msgid "Server error (500)"
+msgstr "خطأ في المزود (500)"
+
+#: .\contrib\admin\templates\admin\500.html.py:9
+msgid "Server Error <em>(500)</em>"
+msgstr "خطأ في المزود <em>(500)</em>"
+
+#: .\contrib\admin\templates\admin\500.html.py:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "حدث خطأ، وقم تم الابلاغ عنه إلى مدراء الموقع عبر البريد الإلكترونيوسيتم حل المشكلة قريبا إن شاء الله، شكرا لك على صبرك."
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+msgid "Welcome,"
+msgstr "أهلا، "
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+#: .\contrib\admin\templates\admin\change_form.html.py:10
+#: .\contrib\admin\templates\admin\change_list.html.py:5
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
+#: .\contrib\admin\templates\admin\object_history.html.py:3
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+msgid "Documentation"
+msgstr "التعليمات"
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+#: .\contrib\admin\templates\admin\change_form.html.py:10
+#: .\contrib\admin\templates\admin\change_list.html.py:5
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
+#: .\contrib\admin\templates\admin\object_history.html.py:3
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:4
+#: .\contrib\admin\templates\admin_doc\index.html.py:4
+#: .\contrib\admin\templates\admin_doc\missing_docutils.html.py:4
+#: .\contrib\admin\templates\admin_doc\model_detail.html.py:3
+#: .\contrib\admin\templates\admin_doc\model_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\template_filter_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_tag_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\view_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\view_index.html.py:5
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+msgid "Change password"
+msgstr "تغيير كلمة المرور"
+
+#: .\contrib\admin\templates\admin\base.html.py:24
+#: .\contrib\admin\templates\admin\change_form.html.py:10
+#: .\contrib\admin\templates\admin\change_list.html.py:5
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:3
+#: .\contrib\admin\templates\admin\object_history.html.py:3
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:4
+#: .\contrib\admin\templates\admin_doc\index.html.py:4
+#: .\contrib\admin\templates\admin_doc\missing_docutils.html.py:4
+#: .\contrib\admin\templates\admin_doc\model_detail.html.py:3
+#: .\contrib\admin\templates\admin_doc\model_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\template_filter_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\template_tag_index.html.py:5
+#: .\contrib\admin\templates\admin_doc\view_detail.html.py:4
+#: .\contrib\admin\templates\admin_doc\view_index.html.py:5
+#: .\contrib\admin\templates\registration\password_change_done.html.py:3
+#: .\contrib\admin\templates\registration\password_change_form.html.py:3
+#: .\contrib\comments\templates\comments\form.html.py:8
+msgid "Log out"
+msgstr "خروج"
+
+#: .\contrib\admin\templates\admin\base_site.html.py:4
+msgid "Django site admin"
+msgstr "إدارة موقع جاننغو"
+
+#: .\contrib\admin\templates\admin\base_site.html.py:7
+msgid "Django administration"
+msgstr "إدارة جانغو"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:15
+#: .\contrib\admin\templates\admin\index.html.py:28
+msgid "Add"
+msgstr "إضافة"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:20
+#: .\contrib\admin\templates\admin\object_history.html.py:5
+msgid "History"
+msgstr "تاريخ"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:21
+msgid "View on site"
+msgstr "عرض على الموقع"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "الرجاء اصلاح الخطأ التالي."
+msgstr[1] "الرجاء اصلاح الخطئين التاليين."
+msgstr[2] "الرجاء اصلاح الأخطاء التالية."
+msgstr[3] "الرجاء اصلاح الأخطاء التالية."
+
+#: .\contrib\admin\templates\admin\change_form.html.py:48
+msgid "Ordering"
+msgstr "الترتيب"
+
+#: .\contrib\admin\templates\admin\change_form.html.py:51
+msgid "Order:"
+msgstr "الترتيب"
+
+#: .\contrib\admin\templates\admin\change_list.html.py:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "اضافة %(name)s"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:9
+#: .\contrib\admin\templates\admin\submit_line.html.py:3
+msgid "Delete"
+msgstr "حذف"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "حذف %(object_name)s '%(object)s' سيؤدي إلى حذف العناصر المتعلقة به، لكن هذا الحساب لا يملك الصلاحية لحذف أنواع العناصر التالية:"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:"
+msgstr "هل أنت متأكد من أنك تريد حذف %(object_name)s \"%(object)s\"? كافة العناصر التالية المتعلقة به سيتم حذفها:"
+
+#: .\contrib\admin\templates\admin\delete_confirmation.html.py:26
+msgid "Yes, I'm sure"
+msgstr "نعم، أنا متأكد"
+
+#: .\contrib\admin\templates\admin\filter.html.py:2
+#, python-format
+msgid " By %(title)s "
+msgstr " بواسطة %(title)s "
+
+#: .\contrib\admin\templates\admin\filters.html.py:4
+msgid "Filter"
+msgstr "مرشح"
+
+#: .\contrib\admin\templates\admin\index.html.py:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "النماذج المتوفرة في برنامج %(name)s."
+
+#: .\contrib\admin\templates\admin\index.html.py:34
+msgid "Change"
+msgstr "تغيير"
+
+#: .\contrib\admin\templates\admin\index.html.py:44
+msgid "You don't have permission to edit anything."
+msgstr "ليست لديك الصلاحية لتعديل أي شيء."
+
+#: .\contrib\admin\templates\admin\index.html.py:52
+msgid "Recent Actions"
+msgstr "العمليات الأخيرة"
+
+#: .\contrib\admin\templates\admin\index.html.py:53
+msgid "My Actions"
+msgstr "عملياتي"
+
+#: .\contrib\admin\templates\admin\index.html.py:57
+msgid "None available"
+msgstr "لا يوجد"
+
+#: .\contrib\admin\templates\admin\invalid_setup.html.py:8
+msgid "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user."
+msgstr "هنالك أمر خاطئ في تركيب قاعدة بياناتك، تأكد من أنه تم انشاء جداول قاعدة البيانات الملائمة، وتأكد من أن قاعدة البيانات قابلة للقراءة من قبل المستخدم الملائم."
+
+#: .\contrib\admin\templates\admin\login.html.py:17
+#: .\contrib\comments\templates\comments\form.html.py:6
+#: .\contrib\comments\templates\comments\form.html.py:8
+msgid "Username:"
+msgstr "اسم المستخدم:"
+
+#: .\contrib\admin\templates\admin\login.html.py:20
+#: .\contrib\comments\templates\comments\form.html.py:6
+msgid "Password:"
+msgstr "كلمة المرور:"
+
+#: .\contrib\admin\templates\admin\login.html.py:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+
+#: .\contrib\admin\templates\admin\login.html.py:25
+#: .\contrib\admin\views\decorators.py:24
+msgid "Log in"
+msgstr "دخول"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:18
+msgid "Date/time"
+msgstr "التاريخ/الوقت"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:19
+msgid "User"
+msgstr "المستخدم"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:20
+msgid "Action"
+msgstr "العملية"
+
+#: .\contrib\admin\templates\admin\object_history.html.py:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr ""
+
+#: .\contrib\admin\templates\admin\object_history.html.py:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "هذا العنصر لا يملك تاريخ تغييرات، على الأغلب أن هذا العنصر لم يتم انشاءه عبر نظام الإدارة هذا."
+
+#: .\contrib\admin\templates\admin\pagination.html.py:10
+msgid "Show all"
+msgstr "عرض الكل"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:8
+msgid "Go"
+msgstr "انطلق"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "نتيحة واحدة"
+msgstr[1] "نتيجتان"
+msgstr[2] "%(counter)s نتائج"
+msgstr[3] "%(counter)s نتيحة"
+
+#: .\contrib\admin\templates\admin\search_form.html.py:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "المجموع %(full_result_count)s"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:4
+msgid "Save as new"
+msgstr "حفظ كجديد"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:5
+msgid "Save and add another"
+msgstr "حفظ وإضافة آخر"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:6
+msgid "Save and continue editing"
+msgstr "حفظ واستمرار التعديل"
+
+#: .\contrib\admin\templates\admin\submit_line.html.py:7
+msgid "Save"
+msgstr "حفظ"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:3
+msgid "Bookmarklets"
+msgstr "أوامر المفضلة"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:5
+msgid "Documentation bookmarklets"
+msgstr "أوامر مفضلة التعليمات"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">لتركيب أوامر المفضلة، قم بسحب الوصلة إلى\n"
+"شريط أدات المفضلات في متصفحك، أو قم بالضغط عليها بالزر الأيمن وأضفها إلى مفضلاتك.\n"
+"سيمكنك الآن أن اختيار أوامر المفضلة من أي صفحة في الموقع، لاحظ بأن بعض\n"
+"أوامر المفضلة هذه معدة لتعمل على أجهزة كمبيوتر تعتبر على أنها \"داخلية\"\n"
+"(تحدث إلى مسؤول النظم إذا لم تكن متأكدا ما إذا كان كمبيوتر يعتبر \"داخليا\").</p>\n"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:19
+msgid "Documentation for this page"
+msgstr "التعليمات لهذه الصفحة"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "ينتقل بك من أي صفحة إلى تعليمات العرض الذي أنشأ هذه الصفحة."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:22
+msgid "Show object ID"
+msgstr "عرض معرف الكائن"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "عرض نوع البيانات والمعرف الفريد للصفحات التي تمثل كائنا واحدا."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:25
+msgid "Edit this object (current window)"
+msgstr "تعديل هذا الكائن (النافذة الحالية)"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "ينتقل بك إلى صفحة الإدارة للصفحات التي تمثل كائنا واحدا."
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:28
+msgid "Edit this object (new window)"
+msgstr "تعديل هذا العنصر (نافذة جديدة)"
+
+#: .\contrib\admin\templates\admin_doc\bookmarklets.html.py:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "كما سبق، لكن يفتح صفحة الإدارة في نافذة جديدة."
+
+#: .\contrib\admin\templates\registration\logged_out.html.py:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "شكرا لك على قضائك بعض الوقت مع الموقع اليوم."
+
+#: .\contrib\admin\templates\registration\logged_out.html.py:10
+msgid "Log in again"
+msgstr "دخول مرة أخرى"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:4
+#: .\contrib\admin\templates\registration\password_change_form.html.py:4
+#: .\contrib\admin\templates\registration\password_change_form.html.py:6
+#: .\contrib\admin\templates\registration\password_change_form.html.py:10
+msgid "Password change"
+msgstr "تغيير كلمة المرور"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:6
+#: .\contrib\admin\templates\registration\password_change_done.html.py:10
+msgid "Password change successful"
+msgstr "تم تغيير كلمة المرور بنجاح"
+
+#: .\contrib\admin\templates\registration\password_change_done.html.py:12
+msgid "Your password was changed."
+msgstr "لقد تغيرت كلمة مرورك."
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "الرجاء ادخال كلمة مرورك القديمة، زيادة في الأمان، ثم ادخل كلمة مرورك الجديدة مرتين لنكون متأكدين من أنك كتبتها بصورة صحيحة."
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:17
+msgid "Old password:"
+msgstr "كلمة المرور القديمة:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:19
+msgid "New password:"
+msgstr "كلمة المرور الجديدة:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:21
+msgid "Confirm password:"
+msgstr "تأكيد كلمة المرور:"
+
+#: .\contrib\admin\templates\registration\password_change_form.html.py:23
+msgid "Change my password"
+msgstr "تغيير كلمة المرور الخاصة بي"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:4
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:6
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:10
+msgid "Password reset"
+msgstr "اعادة ضبط كلمة المرور"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:6
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:10
+msgid "Password reset successful"
+msgstr "تمت عملية اعادة ضبط كلمة المرور بنجاح"
+
+#: .\contrib\admin\templates\registration\password_reset_done.html.py:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "لقد قمنا بارسال كلمة مرور جديدة إلى عنوان البريد الإلكتروني الذي أدخلتها، ستصلك قريبا إن شاء الله."
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "لقد وصلتك رسالة البريد الإلكتروني هذه لأنك طلبت إعادة ضبط كلمة المرور."
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "لحسابك المستخدم الخاص بك في %(site_name)s"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "كلمة مرورك الجديدة هي: %(new_password)s"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "يمكنك تغيير كلمة المرور هذه بالذهاب إلى هذه الصفحة:"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:11
+msgid "Your username, in case you've forgotten:"
+msgstr "اسم المستخدم الخاص بك، في حال كنت قد نسيته:"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:13
+msgid "Thanks for using our site!"
+msgstr "شكرا لاستخدامك لموقعنا!"
+
+#: .\contrib\admin\templates\registration\password_reset_email.html.py:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "فريق %(site_name)s"
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "نسيت كلمة المرور الخاصة بك؟ قم بادخال عنوان بريدك الإلكتروني بالأسفل وسنقوم باعادة ضبط كلمة المرور الخاصة بك وارسال كلمة المرور الجديدة إليك عبر البريد الإلكتروني."
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+msgid "E-mail address:"
+msgstr "عنوان البريد الإلكتروني:"
+
+#: .\contrib\admin\templates\registration\password_reset_form.html.py:16
+msgid "Reset my password"
+msgstr "اعادة ضبط كلمة المرور"
+
+#: .\contrib\admin\templates\widget\date_time.html.py:3
+msgid "Date:"
+msgstr "التاريخ:"
+
+#: .\contrib\admin\templates\widget\date_time.html.py:4
+msgid "Time:"
+msgstr "الوقت:"
+
+#: .\contrib\admin\templates\widget\file.html.py:2
+msgid "Currently:"
+msgstr "حاليا:"
+
+#: .\contrib\admin\templates\widget\file.html.py:3
+msgid "Change:"
+msgstr "تغيير:"
+
+#: .\contrib\admin\templatetags\admin_list.py:230
+msgid "All dates"
+msgstr "كافة التواريخ"
+
+#: .\contrib\admin\views\decorators.py:10
+#: .\contrib\auth\forms.py:37
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "الرجاء ادخال اسم مستخدم وكلمة مرور صحيحين، الرجاء الانتباه إلى أن كلا الحقلين حساس لحالة الأحرف من حيث كونها كبيرة أو صغيرة."
+
+#: .\contrib\admin\views\decorators.py:62
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "الرجاء الدخول مرة أخرى لأن جلستك انتهت، لا تقلق: البيانات التي قمت بارسالها حفظت."
+
+#: .\contrib\admin\views\decorators.py:69
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "يبدو بأن متصفحك غير معد لقبول الكوكيز، قم بتفعيل الكوكيز من فضلك ثم تحديث هذه الصفحة والمحاولة مرة أخرى."
+
+#: .\contrib\admin\views\decorators.py:83
+msgid "Usernames cannot contain the '@' character."
+msgstr "اسم المستخدم يجب أن لا يحتوي على علامة '@'."
+
+#: .\contrib\admin\views\decorators.py:85
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "بريدك الإلكتروني ليس اسم المستخدم الخاص بك، جرب استخدام '%s' بدلا من ذلك."
+
+#: .\contrib\admin\views\doc.py:291
+#: .\contrib\admin\views\doc.py:301
+#: .\contrib\admin\views\doc.py:303
+#: .\contrib\admin\views\doc.py:309
+#: .\contrib\admin\views\doc.py:310
+#: .\contrib\admin\views\doc.py:312
+msgid "Integer"
+msgstr "عدد صحيح"
+
+#: .\contrib\admin\views\doc.py:292
+msgid "Boolean (Either True or False)"
+msgstr "ثنائي (إما صح أو خطأ)"
+
+#: .\contrib\admin\views\doc.py:293
+#: .\contrib\admin\views\doc.py:311
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "سلسلة نصية (تصل إلى %(maxlength)s)"
+
+#: .\contrib\admin\views\doc.py:294
+msgid "Comma-separated integers"
+msgstr "أرقام صحيحة مفصولة بفواصل comma"
+
+#: .\contrib\admin\views\doc.py:295
+msgid "Date (without time)"
+msgstr "التاريخ (بدون الوقت)"
+
+#: .\contrib\admin\views\doc.py:296
+msgid "Date (with time)"
+msgstr "التاريخ (مع الوقت)"
+
+#: .\contrib\admin\views\doc.py:297
+msgid "E-mail address"
+msgstr "عنوان البريد الإلكتروني"
+
+#: .\contrib\admin\views\doc.py:298
+#: .\contrib\admin\views\doc.py:299
+#: .\contrib\admin\views\doc.py:302
+msgid "File path"
+msgstr "مسار الملف"
+
+#: .\contrib\admin\views\doc.py:300
+msgid "Decimal number"
+msgstr "رقم عشري"
+
+#: .\contrib\admin\views\doc.py:304
+#: .\contrib\comments\models.py:85
+msgid "IP address"
+msgstr "عنوان IP"
+
+#: .\contrib\admin\views\doc.py:306
+msgid "Boolean (Either True, False or None)"
+msgstr "ثنائي (إما صح أو خطأ أو لاشيء)"
+
+#: .\contrib\admin\views\doc.py:307
+msgid "Relation to parent model"
+msgstr "العلاقة بالنموذج الأب"
+
+#: .\contrib\admin\views\doc.py:308
+msgid "Phone number"
+msgstr "رقم هاتف"
+
+#: .\contrib\admin\views\doc.py:313
+msgid "Text"
+msgstr "نص"
+
+#: .\contrib\admin\views\doc.py:314
+msgid "Time"
+msgstr "وقت"
+
+#: .\contrib\admin\views\doc.py:315
+#: .\contrib\flatpages\models.py:7
+msgid "URL"
+msgstr "وصلة"
+
+#: .\contrib\admin\views\doc.py:316
+msgid "U.S. state (two uppercase letters)"
+msgstr "ولاية أمريكية (حرفان كبيران)"
+
+#: .\contrib\admin\views\doc.py:317
+msgid "XML text"
+msgstr "نص XML"
+
+#: .\contrib\admin\views\main.py:226
+msgid "Site administration"
+msgstr "إدارة الموقع"
+
+#: .\contrib\admin\views\main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "تم اضافة %(name)s \"%(obj)s\" بنجاح."
+
+#: .\contrib\admin\views\main.py:264
+#: .\contrib\admin\views\main.py:348
+msgid "You may edit it again below."
+msgstr "يمكنك تعديله مجددا في الأسفل."
+
+#: .\contrib\admin\views\main.py:272
+#: .\contrib\admin\views\main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "يمكنك إضافة %s آخر بالأسفل."
+
+#: .\contrib\admin\views\main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "اضافة %s"
+
+#: .\contrib\admin\views\main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "اضاف %s."
+
+#: .\contrib\admin\views\main.py:336
+#: .\contrib\admin\views\main.py:338
+#: .\contrib\admin\views\main.py:340
+msgid "and"
+msgstr "Ùˆ"
+
+#: .\contrib\admin\views\main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "غير %s."
+
+#: .\contrib\admin\views\main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "حذف %s."
+
+#: .\contrib\admin\views\main.py:343
+msgid "No fields changed."
+msgstr "لم يتم تغيير أية حقول."
+
+#: .\contrib\admin\views\main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "تم تغيير %(name)s \"%(obj)s\" بنجاح."
+
+#: .\contrib\admin\views\main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "تم اضافة %(name)s \"%(obj)s\" بنجاح، يمكنك تعديله مرة أخرى بالأسفل."
+
+#: .\contrib\admin\views\main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "تغيير %s"
+
+#: .\contrib\admin\views\main.py:474
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(fieldname)s واحد أو أكثر في %(name)s: %(obj)s"
+
+#: .\contrib\admin\views\main.py:479
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(fieldname)s واحد أو أكثر في %(name)s:"
+
+#: .\contrib\admin\views\main.py:512
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "تم حذف %(name)s \"%(obj)s\" بنجاح."
+
+#: .\contrib\admin\views\main.py:515
+msgid "Are you sure?"
+msgstr "هل أنت متأكد؟"
+
+#: .\contrib\admin\views\main.py:537
+#, python-format
+msgid "Change history: %s"
+msgstr "تاريخ التغيير: %s"
+
+#: .\contrib\admin\views\main.py:571
+#, python-format
+msgid "Select %s"
+msgstr "اختر %s"
+
+#: .\contrib\admin\views\main.py:571
+#, python-format
+msgid "Select %s to change"
+msgstr "اختر %s لتغييره"
+
+#: .\contrib\admin\views\main.py:747
+msgid "Database error"
+msgstr "خطـأ في قاعدة البيانات"
+
+#: .\contrib\auth\forms.py:30
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "يبدو بأن الكوكيز غير مفعله في متصفحك، الكوكيز مطلوبة للتمكن من الدخول."
+
+#: .\contrib\auth\forms.py:39
+msgid "This account is inactive."
+msgstr "هذا الحساب غير فعال."
+
+#: .\contrib\auth\models.py:37
+#: .\contrib\auth\models.py:56
+msgid "name"
+msgstr "الاسم"
+
+#: .\contrib\auth\models.py:39
+msgid "codename"
+msgstr "الاسم الرمزي"
+
+#: .\contrib\auth\models.py:41
+msgid "permission"
+msgstr "الصلاحية"
+
+#: .\contrib\auth\models.py:42
+#: .\contrib\auth\models.py:57
+msgid "permissions"
+msgstr "الصلاحيات"
+
+#: .\contrib\auth\models.py:59
+msgid "group"
+msgstr "المجموعة"
+
+#: .\contrib\auth\models.py:60
+#: .\contrib\auth\models.py:99
+msgid "groups"
+msgstr "المجموعات"
+
+#: .\contrib\auth\models.py:89
+msgid "username"
+msgstr "اسم المستخدم"
+
+#: .\contrib\auth\models.py:89
+msgid "Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."
+msgstr "مطلوب. 30 خانة أو أقل. خانات حرف رقمية فقط (أحرف، أرقام والشرطة السفلية)."
+
+#: .\contrib\auth\models.py:90
+msgid "first name"
+msgstr "الاسم الأول"
+
+#: .\contrib\auth\models.py:91
+msgid "last name"
+msgstr "الاسم الأخير"
+
+#: .\contrib\auth\models.py:92
+msgid "e-mail address"
+msgstr "عنوان البريد الإلكتروني"
+
+#: .\contrib\auth\models.py:93
+msgid "password"
+msgstr "كلمة المرور"
+
+#: .\contrib\auth\models.py:93
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "استخدم '[algo]$[salt]$[hexdigest]'"
+
+#: .\contrib\auth\models.py:94
+msgid "staff status"
+msgstr "حالة الطاقم"
+
+#: .\contrib\auth\models.py:94
+msgid "Designates whether the user can log into this admin site."
+msgstr "يحدد ما إذا كان المستخدم يستطيع الدخول إلى موقع الإدارة هذا."
+
+#: .\contrib\auth\models.py:95
+msgid "active"
+msgstr "فعال"
+
+#: .\contrib\auth\models.py:95
+msgid "Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."
+msgstr "يحدد ما إذا كان المستخدم يستطيع الدخول إلى لوحة تحكم جانغو، قم بتحديد هذا الخيار بدلا من حذف حسابات المستخدمين."
+
+#: .\contrib\auth\models.py:96
+msgid "superuser status"
+msgstr "حالة المستخدم بالقوى الخارقة"
+
+#: .\contrib\auth\models.py:96
+msgid "Designates that this user has all permissions without explicitly assigning them."
+msgstr "حدد بأن هذا المستخدم يمتلك كافة الصلاحيات دون الحاجة لتحديدها له تصريحا."
+
+#: .\contrib\auth\models.py:97
+msgid "last login"
+msgstr "آخر عملية دخول"
+
+#: .\contrib\auth\models.py:98
+msgid "date joined"
+msgstr "تاريخ الانضمام"
+
+#: .\contrib\auth\models.py:100
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "بالإضافة إلى الصلاحيات المحددة للمستخدم يدويا، فإن المستخدم يحصل أيضا على كافة صلاحيات المجموعة التي ينتمي إليها."
+
+#: .\contrib\auth\models.py:101
+msgid "user permissions"
+msgstr "صلاحيات المستخدم"
+
+#: .\contrib\auth\models.py:104
+msgid "user"
+msgstr "المستخدم"
+
+#: .\contrib\auth\models.py:105
+msgid "users"
+msgstr "المستخدمين"
+
+#: .\contrib\auth\models.py:110
+msgid "Personal info"
+msgstr "المعلومات الشخصية"
+
+#: .\contrib\auth\models.py:111
+msgid "Permissions"
+msgstr "الصلاحيات"
+
+#: .\contrib\auth\models.py:112
+msgid "Important dates"
+msgstr "تواريخ مهمة"
+
+#: .\contrib\auth\models.py:113
+msgid "Groups"
+msgstr "المجموعات"
+
+#: .\contrib\auth\models.py:250
+msgid "message"
+msgstr "رسالة"
+
+#: .\contrib\auth\views.py:40
+msgid "Logged out"
+msgstr "خروج"
+
+#: .\contrib\comments\models.py:67
+#: .\contrib\comments\models.py:166
+msgid "object ID"
+msgstr "معرف العنصر"
+
+#: .\contrib\comments\models.py:68
+msgid "headline"
+msgstr "عنوان"
+
+#: .\contrib\comments\models.py:69
+#: .\contrib\comments\models.py:90
+#: .\contrib\comments\models.py:167
+msgid "comment"
+msgstr "تعليق"
+
+#: .\contrib\comments\models.py:70
+msgid "rating #1"
+msgstr "تقييم #1"
+
+#: .\contrib\comments\models.py:71
+msgid "rating #2"
+msgstr "تقييم #2"
+
+#: .\contrib\comments\models.py:72
+msgid "rating #3"
+msgstr "تقييم #3"
+
+#: .\contrib\comments\models.py:73
+msgid "rating #4"
+msgstr "تقييم #4"
+
+#: .\contrib\comments\models.py:74
+msgid "rating #5"
+msgstr "تقييم #5"
+
+#: .\contrib\comments\models.py:75
+msgid "rating #6"
+msgstr "تقييم #8"
+
+#: .\contrib\comments\models.py:76
+msgid "rating #7"
+msgstr "تقييم #7"
+
+#: .\contrib\comments\models.py:77
+msgid "rating #8"
+msgstr "تقييم #8"
+
+#: .\contrib\comments\models.py:82
+msgid "is valid rating"
+msgstr "تقييم صالح"
+
+#: .\contrib\comments\models.py:83
+#: .\contrib\comments\models.py:169
+msgid "date/time submitted"
+msgstr "تم ارسال التاريخ/الوقت"
+
+#: .\contrib\comments\models.py:84
+#: .\contrib\comments\models.py:170
+msgid "is public"
+msgstr "عام"
+
+#: .\contrib\comments\models.py:86
+msgid "is removed"
+msgstr "محذوف"
+
+#: .\contrib\comments\models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "قم بتحديد هذا المربع إذا كان التعليق غير لائق، سيتم عرض الرسالة \"تم حذف هذا التعليق\" بدلا منه."
+
+#: .\contrib\comments\models.py:91
+msgid "comments"
+msgstr "تعليقات"
+
+#: .\contrib\comments\models.py:131
+#: .\contrib\comments\models.py:207
+msgid "Content object"
+msgstr "عنصر محتوى"
+
+#: .\contrib\comments\models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"أرسلت بواسطة %(user)s في %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: .\contrib\comments\models.py:168
+msgid "person's name"
+msgstr "اسم الشخص"
+
+#: .\contrib\comments\models.py:171
+msgid "ip address"
+msgstr "عنوان ip"
+
+#: .\contrib\comments\models.py:173
+msgid "approved by staff"
+msgstr "موافق عليه من قبل الطاقم"
+
+#: .\contrib\comments\models.py:176
+msgid "free comment"
+msgstr "تعليق حر"
+
+#: .\contrib\comments\models.py:177
+msgid "free comments"
+msgstr "تعليقات حرة"
+
+#: .\contrib\comments\models.py:233
+msgid "score"
+msgstr "الدرجة"
+
+#: .\contrib\comments\models.py:234
+msgid "score date"
+msgstr "تاريخ الدرجة"
+
+#: .\contrib\comments\models.py:237
+msgid "karma score"
+msgstr "درجة الكارما"
+
+#: .\contrib\comments\models.py:238
+msgid "karma scores"
+msgstr "درجات الكارما"
+
+#: .\contrib\comments\models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "تقييم %(score)d بواسطة %(user)s"
+
+#: .\contrib\comments\models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"هذا التعليق تم تعليمه بواسطة %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\models.py:265
+msgid "flag date"
+msgstr "تاريخ التعليم"
+
+#: .\contrib\comments\models.py:268
+msgid "user flag"
+msgstr "علامة مستخدم"
+
+#: .\contrib\comments\models.py:269
+msgid "user flags"
+msgstr "علامات المستخدم"
+
+#: .\contrib\comments\models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "علامة بواسطة %r"
+
+#: .\contrib\comments\models.py:278
+msgid "deletion date"
+msgstr "تاريخ الحذف"
+
+#: .\contrib\comments\models.py:280
+msgid "moderator deletion"
+msgstr "حذف المراقب"
+
+#: .\contrib\comments\models.py:281
+msgid "moderator deletions"
+msgstr "حذوفات المراقب"
+
+#: .\contrib\comments\models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "حذف المراقب بواسطة %r"
+
+#: .\contrib\comments\templates\comments\form.html.py:6
+msgid "Forgotten your password?"
+msgstr "نسيت كلمة المرور؟"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+msgid "Ratings"
+msgstr "التقييمات"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Required"
+msgstr "مطلوب"
+
+#: .\contrib\comments\templates\comments\form.html.py:12
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Optional"
+msgstr "اختياري"
+
+#: .\contrib\comments\templates\comments\form.html.py:23
+msgid "Post a photo"
+msgstr "ارسال صورة"
+
+#: .\contrib\comments\templates\comments\form.html.py:28
+#: .\contrib\comments\templates\comments\freeform.html.py:5
+msgid "Comment:"
+msgstr "تعليق:"
+
+#: .\contrib\comments\templates\comments\form.html.py:34
+#: .\contrib\comments\templates\comments\freeform.html.py:9
+msgid "Preview comment"
+msgstr "استعراض التعليق"
+
+#: .\contrib\comments\templates\comments\freeform.html.py:4
+msgid "Your name:"
+msgstr "اسمك:"
+
+#: .\contrib\comments\views\comments.py:27
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "هذا التقييم مطلوب لأنك قمت بادخال تقييم واحد على الأقل."
+
+#: .\contrib\comments\views\comments.py:111
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من تعليق واحد:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من تعليقان:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من %(count)s تعليقات:\n"
+"\n"
+"%(text)s"
+msgstr[3] ""
+"هذا التعليق كتب بواسطة شخص لديه أقل من %(count)s تعليق:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\views\comments.py:116
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"هذا التعليق كتب بواسطة عضو سطحي:\n"
+"\n"
+"%(text)s"
+
+#: .\contrib\comments\views\comments.py:188
+#: .\contrib\comments\views\comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "يسمح باستخدام POST فقط"
+
+#: .\contrib\comments\views\comments.py:192
+#: .\contrib\comments\views\comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "لم يتم ارسال واحد أو أكثر من الحقول المطلوبة."
+
+#: .\contrib\comments\views\comments.py:196
+#: .\contrib\comments\views\comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "شخص ما قام بالتلاعب بنموذج التعليق (انتهاك أمني)"
+
+#: .\contrib\comments\views\comments.py:206
+#: .\contrib\comments\views\comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "نموذج التعليق احتوى 'هدف' غير صحيح -- معرف الكائن كان غير صحيحا"
+
+#: .\contrib\comments\views\comments.py:257
+#: .\contrib\comments\views\comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "نموذج التعليق لم يحدد أيا من 'استعراض' أو 'ارسال'"
+
+#: .\contrib\comments\views\karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "لا يمكن للمستخدمين المجهولين التصويت"
+
+#: .\contrib\comments\views\karma.py:23
+msgid "Invalid comment ID"
+msgstr "معرف التعليق غير صحيح"
+
+#: .\contrib\comments\views\karma.py:25
+msgid "No voting for yourself"
+msgstr "لا يمكنك التصويت لنفسك"
+
+#: .\contrib\contenttypes\models.py:20
+msgid "python model class name"
+msgstr "اسم صنف النموذج في python"
+
+#: .\contrib\contenttypes\models.py:23
+msgid "content type"
+msgstr "نوع البيانات"
+
+#: .\contrib\contenttypes\models.py:24
+msgid "content types"
+msgstr "أنواع البيانات"
+
+#: .\contrib\flatpages\models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "مثال: '/about/contact/'. تأكد من وضع شرطات في البداية والنهاية."
+
+#: .\contrib\flatpages\models.py:9
+msgid "title"
+msgstr "العنوان"
+
+#: .\contrib\flatpages\models.py:10
+msgid "content"
+msgstr "المحتوى"
+
+#: .\contrib\flatpages\models.py:11
+msgid "enable comments"
+msgstr "السماح بالتعليقات"
+
+#: .\contrib\flatpages\models.py:12
+msgid "template name"
+msgstr "اسم القالب"
+
+#: .\contrib\flatpages\models.py:13
+msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'."
+msgstr "مثال: 'flatpages/contact_page'. إذا لم يتم تحديده فإن النظام سيقوم باستخدام 'flatpages/default'."
+
+#: .\contrib\flatpages\models.py:14
+msgid "registration required"
+msgstr "التسجيل مطلوب"
+
+#: .\contrib\flatpages\models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "إذا كان هذا الخيار محددا، فإن المستخدمين الداخلين فقط سيتمكنون من مشاهدة الصفحة."
+
+#: .\contrib\flatpages\models.py:18
+msgid "flat page"
+msgstr "صفحة مسطحة"
+
+#: .\contrib\flatpages\models.py:19
+msgid "flat pages"
+msgstr "صفحات مسطحة"
+
+#: .\contrib\redirects\models.py:7
+msgid "redirect from"
+msgstr "نموذج إعادة توجيه"
+
+#: .\contrib\redirects\models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "يجب أن يكون هذا مسارا مطلقا وبدون اسم النطاق. مثال: '/events/search/'."
+
+#: .\contrib\redirects\models.py:9
+msgid "redirect to"
+msgstr "إعادة توجيه إلى"
+
+#: .\contrib\redirects\models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "يجب أن يكون هذا مسارا مطلقا (كما في الذي فوقه) عنوانا كاملا يبدأ بالمقطع 'http://'."
+
+#: .\contrib\redirects\models.py:13
+msgid "redirect"
+msgstr "إعادة توجيه"
+
+#: .\contrib\redirects\models.py:14
+msgid "redirects"
+msgstr "إعادات توجيه"
+
+#: .\contrib\sessions\models.py:41
+msgid "session key"
+msgstr "مفتاح الجلسة"
+
+#: .\contrib\sessions\models.py:42
+msgid "session data"
+msgstr "بيانات الجلسة"
+
+#: .\contrib\sessions\models.py:43
+msgid "expire date"
+msgstr "تاريخ الانتهاء"
+
+#: .\contrib\sessions\models.py:47
+msgid "session"
+msgstr "جلسة"
+
+#: .\contrib\sessions\models.py:48
+msgid "sessions"
+msgstr "جلسات"
+
+#: .\contrib\sites\models.py:10
+msgid "domain name"
+msgstr "اسم النطاق"
+
+#: .\contrib\sites\models.py:11
+msgid "display name"
+msgstr "اسم العرض"
+
+#: .\contrib\sites\models.py:15
+msgid "site"
+msgstr "موقع"
+
+#: .\contrib\sites\models.py:16
+msgid "sites"
+msgstr "مواقع"
+
+#: .\core\validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "هذه القيمة يجب أن تحتوي فقط على الأحرف والأرقام والشرطة السفلية."
+
+#: .\core\validators.py:67
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "هذه القيمة يجب أن تحتوي فقط على الأحرف والأرقام والشرطات السفلية والشرطة العادية والشرطات المائلة."
+
+#: .\core\validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "الحروف الكبيرة غير مسموح بها هنا."
+
+#: .\core\validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "الحروف الصغيرة غير مسموح بها هنا."
+
+#: .\core\validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "أدخل أرقاما فقط مفصول بينها بفواصل comma."
+
+#: .\core\validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "أدخل عناوين بريد إلكتروني صالحة مفصول بينها بفواصل comma."
+
+#: .\core\validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "أدخل عنوان IP صالح من فضلك."
+
+#: .\core\validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "القيم الفارغة غير مسموح بها هنا."
+
+#: .\core\validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "الخانات غير الرقمية غير مسموح بها هنا."
+
+#: .\core\validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "لا يمكن أن تكون القيمة مكونة من الأرقام فقط."
+
+#: .\core\validators.py:119
+msgid "Enter a whole number."
+msgstr "أدخل رقما صحيحا."
+
+#: .\core\validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "فقط الخانات الحرفية مسموح بها هنا."
+
+#: .\core\validators.py:127
+#: .\db\models\fields\__init__.py:412
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "أدخل تاريخا صحيحا بتنسيق YYYY-MM-DD."
+
+#: .\core\validators.py:131
+msgid "Enter a valid time in HH:MM format."
+msgstr "أدخل وقتا صحيحا بتنسيق HH:MM."
+
+#: .\core\validators.py:135
+#: .\db\models\fields\__init__.py:474
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "أدخل تاريخ/وقت صحيحين بتنسيق YYYY-MM-DD HH:MM."
+
+#: .\core\validators.py:139
+msgid "Enter a valid e-mail address."
+msgstr "أدخل عنوان بريد إلكتروني صحيح."
+
+#: .\core\validators.py:151
+#: .\core\validators.py:379
+#: .\forms\__init__.py:659
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "لم يتم ارسال ملف، الرجاء التأكد من نوع ترميز (encoding type) النموذج."
+
+#: .\core\validators.py:155
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "قم برفع صورة صالحة، الملف الذي قمت برفعه إما أنه ليس ملفا لصورة أو أنه ملف معطوب."
+
+#: .\core\validators.py:162
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "العنوان %s لا يحتوي على صورة صالحة."
+
+#: .\core\validators.py:166
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "رقم الهاتف يجب أن يكون بتنسيق XXX-XXX-XXXX. \"%s\" غير صالح."
+
+#: .\core\validators.py:174
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "هذا العنوان %s لا يشير إلى مقطع فيديو QuickTime صالح."
+
+#: .\core\validators.py:178
+msgid "A valid URL is required."
+msgstr "يجب ادخال عنوان صالح."
+
+#: .\core\validators.py:192
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"مطلوب شفرة HTML صالحة، الأخطاء على وجه التحديد هي:\n"
+"%s"
+
+#: .\core\validators.py:199
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML مهيئة بصورة سيئة: %s"
+
+#: .\core\validators.py:209
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "وصلة غير صالحة: %s"
+
+#: .\core\validators.py:213
+#: .\core\validators.py:215
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "الوصلة %s غير صحيحة."
+
+#: .\core\validators.py:221
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "أدخل اختصار ولاية أمريكية صحيحا."
+
+#: .\core\validators.py:236
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "انته إلى ما تقول! الكلمة %s غير مسموح بها هنا."
+msgstr[1] "انتبه إلى ما تقول! الكلمتان %s غير مسموح بهما هنا."
+msgstr[2] "انتبه إلى ما تقول! الكلمات %s غير مسموح بها هنا."
+msgstr[3] "انتبه إلى ما تقول! الكلمات %s غير مسموح بها هنا."
+
+#: .\core\validators.py:243
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "هذا الحقل يجب أن يطابق الحقل '%s'."
+
+#: .\core\validators.py:262
+msgid "Please enter something for at least one field."
+msgstr "الرجاء ادخال شيء ما في حقل واحد على الأقل."
+
+#: .\core\validators.py:271
+#: .\core\validators.py:282
+msgid "Please enter both fields or leave them both empty."
+msgstr "الرجاء ادخال كلا الحقلين أن ترك كلاهما فارغا."
+
+#: .\core\validators.py:289
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "هذا الحقل يجب أن يعطي إذا كان %(field)s %(value)s"
+
+#: .\core\validators.py:301
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "هذا الحقل يجب أن يعطى إذا لم يكن %(field)s %(value)s"
+
+#: .\core\validators.py:320
+msgid "Duplicate values are not allowed."
+msgstr "القيم المكررة غير مسموح بها."
+
+#: .\core\validators.py:343
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "يجب أن تكون القيام من مضاعفات %s."
+
+#: .\core\validators.py:354
+msgid "Please enter a valid decimal number."
+msgstr "الرجاء ادخال رقم عشري صالح."
+
+#: .\core\validators.py:356
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "رجاء أدخل رقم عشري صالح مكون من خانة واحدة على الأكثر."
+msgstr[1] "رجاء أدخل رقم عشري صالح مكون من خانتين على الأكثر."
+msgstr[2] "رجاء أدخل رقم عشري صالح مكون من %s خانات على الأكثر."
+msgstr[3] "رجاء أدخل رقم عشري صالح مكون من %s خانة على الأكثر."
+
+#: .\core\validators.py:359
+#, python-format
+msgid "Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural "Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من خانة واحدة على الأكثر."
+msgstr[1] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من خانتين على الأكثر."
+msgstr[2] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من %s خانات على الأكثر."
+msgstr[3] "رجاء أدخل رقم عشري صالح يكون الجزء الصحيح منه مكونا من %s خانة على الأكثر."
+
+#: .\core\validators.py:362
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "الرجاء ادخال رقم عشري صالح تكون فيه خانة عشرية واحدة على الأكثر."
+msgstr[1] "الرجاء ادخال رقم عشري صالح تكون فيه خانتان عشريتان على الأكثر."
+msgstr[2] "الرجاء ادخال رقم عشري صالح تكون فيه %s خانات عشرية على الأكثر."
+msgstr[3] "الرجاء ادخال رقم عشري صالح تكون فيه %s خانة عشرية على الأكثر."
+
+#: .\core\validators.py:372
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "تأكد من أن حجم الملف الذي قمت برفعه لا يقل عن  %s بايت."
+
+#: .\core\validators.py:373
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "تأكد من أن الملف الذي قمت برفعه لا يزيد عن %s بايت."
+
+#: .\core\validators.py:390
+msgid "The format for this field is wrong."
+msgstr "تنسيق هذا الحقل خاطئ."
+
+#: .\core\validators.py:405
+msgid "This field is invalid."
+msgstr "هذا الحقل غير صحيح."
+
+#: .\core\validators.py:441
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "تعذر جلب أي شيء من %s."
+
+#: .\core\validators.py:444
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "الوصلة %(url)s أعادت ترويسة Content-Type الخاطئة '%(contenttype)s'."
+
+#: .\core\validators.py:477
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "الرجاء اغلاق الوسم %(tag)s في سطر %(line)s. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:481
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "بعض النص الذي يبدأ في سطر %(line)s غير مسموح به في هذا السياق. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:486
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" في السطر %(line)s هي سمة غير صالحة. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:491
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" في السطر %(line)s وسم غير صالح. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:495
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "هنالك وسم في السطر %(line)s تنقصه سمة واحدة أو أكثر. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\core\validators.py:500
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "السمة \"%(attr)s\" في السطر %(line)s تمتلك قيمة غير صالحة. (يبدأ السطر هكذا \"%(start)s\".)"
+
+#: .\db\models\manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s مع هذا %(type)s موجودة بالفعل لأجل %(field)s."
+
+#: .\db\models\fields\related.py:51
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "الرجاء ادخال %s صالح."
+
+#: .\db\models\fields\related.py:618
+msgid "Separate multiple IDs with commas."
+msgstr "افصل بين المعرفات بفواصل comma."
+
+#: .\db\models\fields\related.py:620
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "اضغط زر التحكم \"Control\", أو \"Command\" على أجهزة Mac لاختيار أكثر من واحد."
+
+#: .\db\models\fields\related.py:664
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "الرجاء ادخال معرفات %(self)s صالحة، القيمة %(value)r غير صالحة."
+msgstr[1] "الرجاء ادخال معرفات %(self)s صالحة، القيمتان %(value)r غير صالحة."
+msgstr[2] "الرجاء ادخال معرفات %(self)s صالحة، القيم %(value)r غير صالحة."
+msgstr[3] "الرجاء ادخال معرفات %(self)s صالحة، القيم %(value)r غير صالحة."
+
+#: .\db\models\fields\__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s بالحقل %(fieldname)s موجود بالفعل."
+
+#: .\db\models\fields\__init__.py:114
+#: .\db\models\fields\__init__.py:265
+#: .\db\models\fields\__init__.py:548
+#: .\db\models\fields\__init__.py:559
+#: .\forms\__init__.py:346
+msgid "This field is required."
+msgstr "هذا الحقل مطلوب."
+
+#: .\db\models\fields\__init__.py:337
+msgid "This value must be an integer."
+msgstr "هذه القيمة يجب أن تكون رقما صحيحا."
+
+#: .\db\models\fields\__init__.py:369
+msgid "This value must be either True or False."
+msgstr "هذه القيمة يجب أن تكون إما صح أو خطأ."
+
+#: .\db\models\fields\__init__.py:385
+msgid "This field cannot be null."
+msgstr "لا يمكن أن تكون قيمة هذا الحقل لا شيء."
+
+#: .\db\models\fields\__init__.py:568
+msgid "Enter a valid filename."
+msgstr "أدخل اسم ملف صالح."
+
+#: .\forms\__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "تأكد من أن النص الذي أدخلته أقل من خانة واحدة."
+msgstr[1] "تأكد من أن النص الذي أدخلته أقل من خانتين."
+msgstr[2] "تأكد من أن النص الذي أدخلته أقل من %s خانات."
+msgstr[3] "تأكد من أن النص الذي أدخلته أقل من %s خانة."
+
+#: .\forms\__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "الأسطر الجديدة غير مسموح هتا."
+
+#: .\forms\__init__.py:485
+#: .\forms\__init__.py:558
+#: .\forms\__init__.py:597
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "حدد خيارا صحيحا; '%(data)s' ليست ضمن %(choices)s."
+
+#: .\forms\__init__.py:661
+msgid "The submitted file is empty."
+msgstr "الملف الذي قمت بارساله فارغ."
+
+#: .\forms\__init__.py:717
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "أدخل رقما صحيحا بين -32,768 و 32,767."
+
+#: .\forms\__init__.py:727
+msgid "Enter a positive number."
+msgstr "أدخل رقما موجبا."
+
+#: .\forms\__init__.py:737
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "أدخل رقما صحيحا بين 0 و 32,767."
+
+#: .\template\defaultfilters.py:401
+msgid "yes,no,maybe"
+msgstr "نعم،لا،ربما"
+
+#: .\utils\dates.py:6
+msgid "Monday"
+msgstr "الاثنين"
+
+#: .\utils\dates.py:6
+msgid "Tuesday"
+msgstr "الثلاثاء"
+
+#: .\utils\dates.py:6
+msgid "Wednesday"
+msgstr "الأربعاء"
+
+#: .\utils\dates.py:6
+msgid "Thursday"
+msgstr "الخميس"
+
+#: .\utils\dates.py:6
+msgid "Friday"
+msgstr "الجمعة"
+
+#: .\utils\dates.py:7
+msgid "Saturday"
+msgstr "السبت"
+
+#: .\utils\dates.py:7
+msgid "Sunday"
+msgstr "الأحد"
+
+#: .\utils\dates.py:14
+msgid "January"
+msgstr "يناير"
+
+#: .\utils\dates.py:14
+msgid "February"
+msgstr "فبراير"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "March"
+msgstr "مارس"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "April"
+msgstr "ابريل"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "May"
+msgstr "مايو"
+
+#: .\utils\dates.py:14
+#: .\utils\dates.py:27
+msgid "June"
+msgstr "يونيو"
+
+#: .\utils\dates.py:15
+#: .\utils\dates.py:27
+msgid "July"
+msgstr "يوليو"
+
+#: .\utils\dates.py:15
+msgid "August"
+msgstr "أغسطس"
+
+#: .\utils\dates.py:15
+msgid "September"
+msgstr "سبتمبر"
+
+#: .\utils\dates.py:15
+msgid "October"
+msgstr "أكتوبر"
+
+#: .\utils\dates.py:15
+msgid "November"
+msgstr "نوفمبر"
+
+#: .\utils\dates.py:16
+msgid "December"
+msgstr "ديسمبر"
+
+#: .\utils\dates.py:19
+msgid "jan"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "feb"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "mar"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "apr"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "may"
+msgstr ""
+
+#: .\utils\dates.py:19
+msgid "jun"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "jul"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "aug"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "sep"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "oct"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "nov"
+msgstr ""
+
+#: .\utils\dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "يناير"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "فبراير"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "أغسطس"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "سبتمبر"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "أكتوبر"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "نوفمبر"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "ديسمبر"
+
+#: .\utils\timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "سنة"
+msgstr[1] "سنتان"
+msgstr[2] "سنوات"
+msgstr[3] "سنة"
+
+#: .\utils\timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "شهر"
+msgstr[1] "شهران"
+msgstr[2] "شهور"
+msgstr[3] "شهر"
+
+#: .\utils\timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "أسبوع"
+msgstr[1] "أسبوعان"
+msgstr[2] "أسابيع"
+msgstr[3] "أسبوع"
+
+#: .\utils\timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "يوم"
+msgstr[1] "يومان"
+msgstr[2] "أيام"
+msgstr[3] "يوم"
+
+#: .\utils\timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ساعة"
+msgstr[1] "ساعتان"
+msgstr[2] "ساعات"
+msgstr[3] "ساعة"
+
+#: .\utils\timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "دقيقة"
+msgstr[1] "دقيقتان"
+msgstr[2] "دقائق"
+msgstr[3] "دقيقة"
+
+#: .\utils\translation.py:363
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:364
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:365
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:381
+msgid "YEAR_MONTH_FORMAT"
+msgstr ""
+
+#: .\utils\translation.py:382
+msgid "MONTH_DAY_FORMAT"
+msgstr ""
+

Added: vendor/django/current/django/conf/locale/ar/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ar/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ar/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/ar/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ar/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django SVN\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-07-06 23:50+0300\n"
+"Last-Translator: Ahmad Alhashemi <ahmad at ahmadh.com>\n"
+"Language-Team: Ahmad Alhashemi <trans at ahmadh.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Arabic\n"
+"X-Poedit-Country: Kuwait\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s متوفرة"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "اختيار الكل"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "إضافة"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "حذف"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s اختيرت"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "حدد خيارك أو خياراتك واضغط"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "مسح الكل"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "يناير فبراير مارس إبريل مايو يونيو يوليو أغسطس سبتمبر أكتوبر نوفمبر ديسمبر"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "الأحد الأثنين الثلاثاء الأربعاء الخميس الجمعة السبت"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "أ أ ث أ خ ج س"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "الآن"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "الساعة"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "اختر وقتا ما"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "منتصف الليل"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 ص."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "الظهر"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "الغاء"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "اليوم"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "التقويم"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "يوم أمس"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "الغد"
+

Added: vendor/django/current/django/conf/locale/bn/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/bn/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/bn/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/bn/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/bn/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1993 @@
+# django.po -- Bengali (bn) translation of Django core
+# Copyright (C) 2005 Django Authors
+# This file is distributed under the same license as the Django package.
+# Baishampayan Ghose <b.ghose at gnu.org.in>, 2005.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django CVS\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: 2005-11-12 20:05+0530\n"
+"Last-Translator: Baishampayan Ghose <b.ghose at gnu.org.in>\n"
+"Language-Team: Ankur Bangla <core at bengalinux.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#, fuzzy
+msgid "object ID"
+msgstr "বস্তু আই.ডি."
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+#, fuzzy
+msgid "comment"
+msgstr "অভ্যন্তরস্থ বস্তু"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr ""
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr ""
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#, fuzzy
+msgid "IP address"
+msgstr "ই-মেল ঠিকানা"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "অভ্যন্তরস্থ বস্তু"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#, fuzzy
+msgid "Content object"
+msgstr "অভ্যন্তরস্থ বস্তু ধরন"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+#, fuzzy
+msgid "person's name"
+msgstr "প্রথম নাম"
+
+#: contrib/comments/models.py:171
+#, fuzzy
+msgid "ip address"
+msgstr "ই-মেল ঠিকানা"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr ""
+
+#: contrib/comments/models.py:234
+#, fuzzy
+msgid "score date"
+msgstr "শেষ তারিখ"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr ""
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+#, fuzzy
+msgid "flag date"
+msgstr "চ্যাপ্টা পাতা"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "ব্যবহারকারী"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "ব্যবহারকারী"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+#, fuzzy
+msgid "deletion date"
+msgstr "অধিবেশন তথ্য"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr ""
+
+#: contrib/comments/views/karma.py:23
+#, fuzzy
+msgid "Invalid comment ID"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "ব্যবহারকারীর নাম:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "পাসওয়ার্ড:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "বাইরে যান"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "ব্যবহারকারীর নাম"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:110
+#, fuzzy
+msgid "Today"
+msgstr "সোমবার"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+#, fuzzy
+msgid "No"
+msgstr "নভে."
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "কাজের সময়"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "বস্তু আই.ডি."
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "বস্তু repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "কাজের ফ্ল্যাগ"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "বার্তা পরিবর্তন"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "কার্যবিবরণী এন্ট্রি"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "কার্যবিবরণী এন্ট্রি সমুহ"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr ""
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "প্রবেশ করুন"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+#, fuzzy
+msgid "Site administration"
+msgstr "জ্যাঙ্গো পরিচালনা"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:290
+#, fuzzy, python-format
+msgid "Add %s"
+msgstr "যোগ করুন"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr ""
+
+#: contrib/admin/views/main.py:338
+#, fuzzy, python-format
+msgid "Changed %s."
+msgstr "পরিবর্তন"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, fuzzy, python-format
+msgid "Change %s"
+msgstr "পরিবর্তন"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/views/main.py:533
+#, fuzzy, python-format
+msgid "Change history: %s"
+msgstr "পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+#, fuzzy
+msgid "Date (without time)"
+msgstr "কাজের সময়"
+
+#: contrib/admin/views/doc.py:282
+#, fuzzy
+msgid "Date (with time)"
+msgstr "তারিখ/সময়"
+
+#: contrib/admin/views/doc.py:283
+#, fuzzy
+msgid "E-mail address"
+msgstr "ই-মেল ঠিকানা:"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+#, fuzzy
+msgid "Decimal number"
+msgstr "ডিসেম্বর"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+#, fuzzy
+msgid "Phone number"
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr ""
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr ""
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "ইউ.আর.এল"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "বাড়ি"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "ইতিহাস"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "তারিখ/সময়"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "ব্যবহারকারী"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "কাজ"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"এই বস্তুটি একটি পরিবর্তন ইতিহাস নেই। এইটি এই অ্যাডমিন স্থান দ্বারা সম্ভবত যোগ করা "
+"হয় নি।"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "জ্যাঙ্গো স্থান অ্যাডমিন"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "জ্যাঙ্গো পরিচালনা"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "সার্ভার ত্রুটি"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "সার্ভার ত্রুটি (৫০০)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "সার্ভার ত্রুটি<em>(৫০০)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"একটি ত্রুটি আছে। এইটি স্থান পরিচালককে ই-মেল দ্বারা প্রতিবেদন করা হয়েছে এবং খুব "
+"তাড়াতাড়ি মেরামত করা হবে। আপনার ধৈর্য্যের জন্য ধন্যবাদ।"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "পাতা খুঁজে পাওয়া গেল না"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "আমরা দুঃখিত, কিন্তু আবেদনকৃত পাতা খুঁজে পাওয়া গেল না।"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "যোগ করুন"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "পরিবর্তন"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "আপনার কোন কিছু সম্পাদনা করতে অনুমতি নেই।"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "সাম্প্রতিক কাজ"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "আমার কাজ"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "কিছুই পাওয়া যাচ্ছে না"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, fuzzy, python-format
+msgid "Add %(name)s"
+msgstr "যোগ করুন"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "আপনি কি <a href=\"/password_reset/\">আপনার পাসওয়ার্ড ভুলে গেছেন</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "স্বাগত,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"%(object_name)s '%(object)s' মুছে ফেললে তা সম্পর্কিত বস্তুও মুছে ফেলা হবে কিন্তু "
+"আপনার অ্যাকাউন্টে বস্তুর নিম্নলিখিত ধরন মুছে ফেলার অনুমতি নেই:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"%(object_name)s\" %(object)s\" মুছে ফেলতে আপনি কি নিশ্চিত? নিম্নলিখিত সম্পর্কিত "
+"বস্তুর সব মুছে ফেলা হবে:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "হ্যাঁ, আমি নিশ্চিত"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:7
+#, fuzzy
+msgid "Save"
+msgstr "সক্রিয়"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "পাসওয়ার্ড পরিবর্তন"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "পাসওয়ার্ড পরিবর্তন সফল"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "আপনার পাসওয়ার্ড পরিবর্তন করা হয়েছিল।"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "পাসওয়ার্ড রিসেট"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"আপনি কি আপনার পাসওয়ার্ড ভুলে গেছেন? আপনার ই-মেল ঠিকানা নিচে দিন এবং আমরা আপনার "
+"পাসওয়ার্ড রিসেট করে এবং আপনাকে নতুন এক পাসওয়ার্ড ই-মেল করে দেব।"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "ই-মেল ঠিকানা:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "আমার পাসওয়ার্ড রিসেট করুন"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "এই ওয়েব স্থানে আপনার কিছু সময় খরচ করার জন্য ধন্যবাদ।"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "আবার প্রবেশ করুন"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "পাসওয়ার্ড রিসেট সফল"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"আমরা আপনাকে একটি নতুন পাসওয়ার্ড আপনার দেওয়া ই-মেল ঠিকানায় পাঠিয়ে দিয়েছি। আপনার "
+"তা খুব তাড়াতাড়ি পাওয়া উচিত।"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"দয়া করে আপনার পুরনো পাসওয়ার্ড ঢোকান, নিরাপত্তার জন্য, এবংএর জন্য তারপর আপনার নতুন "
+"পাসওয়ার্ড দুবার ঢোকান যাতে আমরা সঠিকভাবেতে তার বৈধতা পরীক্ষণ করতে পারি।"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "পুরনো পাসওয়ার্ড:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "নতুন পাসওয়ার্ড:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "পাসওয়ার্ড দৃঢ়তরভাবে প্রতিপন্ন করুন:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "আমার পাসওয়ার্ড পরিবর্তন করুন"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "আপনি এই ই-মেলটি পাচ্ছেন কারণ আপনি একটি পাসওয়ার্ড রিসেট অনুরোধ করেছেন"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "%(site_name)s আপনার ব্যবহারকারী অ্যাকাউন্টের জন্য"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "আপনার নতুন পাসওয়ার্ড: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "এই পাতাটিতে গিয়ে এই পাসওয়ার্ডটি পরিবর্তন করতে মুক্ত অনুভব করুন:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "আপনার ব্যবহারকারীর নাম, যদি আপনি ভুলে গিয়ে থাকেন:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "আমাদের স্থান ব্যবহার করার জন্য ধন্যবাদ!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s দল"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+#, fuzzy
+msgid "Show object ID"
+msgstr "বস্তু আই.ডি."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "পরিবর্তন"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "রিডাইরেক্ট করা"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"এইটি একটি পরম পাথ হওয়া উচিত, ক্ষেত্র নাম বাদ দিয়ে। উদাহরণ: '/events/search / '।"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "রিডাইরেক্ট কর"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"এইটি হয় একটি পরম পাথ হতে পারে  (যেমন উপরে) অথবা 'http:// এর সঙ্গে শুরু হওয়া "
+"একটি পূর্ণ ইউ.আর.এল ।"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "রিডাইরেক্ট"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "রিডাইরেক্ট করে"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"উদাহরণ: '/about/contact / '। প্রধান এবং অনুসরণ করা স্ল্যাশ যেন নিশ্চিত ভাবে থাকে।"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "শিরোনাম"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "অভ্যন্তরস্থ বস্তু"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "মন্তব্য সক্রিয় করুন"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ছাঁদ নাম"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"উদাহরণ: 'flatfiles/contact_page '। যদি এইটি দেওয়া না থাকে তাহলে সিস্টেম "
+"'flatfiles/default ব্যবহার করবে।"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "নিবন্ধন প্রয়োজনীয়"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"যদি এইটি টিক্ করা থাকে তাহলে শুধুমাত্র প্রবেশ করা ব্যবহারকারী পাতা দেখতে সক্ষম হবে।"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "চ্যাপ্টা পাতা"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "চ্যাপ্টা পাতাগুলো"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "নাম"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "ছদ্বনাম"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "গ্রুপ"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "দল"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "ব্যবহারকারীর নাম"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "প্রথম নাম"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "শেষ নাম"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "ই-মেল ঠিকানা"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "পাসওয়ার্ড"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr " অবস্থা"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "নিশ্চয় করে যে ব্যবহারকারী এই অ্যাডমিন স্থানে প্রবেশ করতে পারে কিনা।"
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "সক্রিয়"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "সুপারইউজার অবস্থা"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "শেষ প্রবেশ"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "যোগাদান করার তারিখ "
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"নিজ হাতে বরাদ্দকৃতে অনুমতি ছাড়া এই ব্যবহারকারীটি যে সব গ্রুপে আছে তার অনুমতিও পাবে।"
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "ব্যবহারকারী"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "ব্যবহারকারী"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "ব্যক্তিগত তথ্য"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "অনুমতি"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "গুরুত্বপূর্ণ তারিখ"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "দল"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "বার্তা"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "পাইথন মডিউলের নাম"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "অভ্যন্তরস্থ বস্তু ধরন"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "অভ্যন্তরস্থ বস্তু ধরন"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "অধিবেশন চাবি"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "অধিবেশন তথ্য"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "শেষ তারিখ"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "অধিবেশন"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "সেশন"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "ক্ষেত্র নাম"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "প্রদর্শিত নাম"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "স্থান"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "স্থান"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "সোমবার"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "মঙ্গলবার"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "বুধবার"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "বৃহস্পতিবার"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "শুক্রবার"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "শনিবার"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "রবিবার"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "জানুয়ারী"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "ফেব্রুয়ারী"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "মার্চ"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "এপ্রিল"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "মে"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "জুন"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "জুলাই"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "অগাস্ট"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "সেপ্টেম্বর"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "অক্টোবর"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "নভেম্বর"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "ডিসেম্বর"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "মে"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "জানু."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "ফেব্রু"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "অগা."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "সেপ্টে."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "অক্টো."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "নভে."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "ডিসে."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+#, fuzzy
+msgid "day"
+msgid_plural "days"
+msgstr[0] "মে"
+msgstr[1] "মে"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+#, fuzzy
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "স্থান"
+msgstr[1] "স্থান"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "বাংলা"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "চেক"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "ওয়েল্শ"
+
+#: conf/global_settings.py:40
+#, fuzzy
+msgid "Danish"
+msgstr "স্প্যানিশ"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "জার্মান"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "ইংরেজী"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "স্প্যানিশ"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "ফরাসী"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "গ্যালিসিয়"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "ইতালিয়"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "নরওয়েজিয়"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "ব্রাজিলীয়"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "রোমানীয়"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "রুশ"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "স্লোভাক"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "স্লোভাক"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "সার্বিয়ান"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "ব্রাজিলীয়"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "সরলীকৃত চীনা"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "এই মানটি শুধু মাত্র অক্ষর, অংক, এবং আন্ডারস্কোর (_) হতে পারবে।"
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "এই মানটি শুধু মাত্র অক্ষর, অংক, আন্ডারস্কোর (_) এবং স্ল্যাশ হতে পারবে।"
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "বড় হাতের অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "ছোটহাতের অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "কমা দ্বারা আলাদা করে শুধু মাত্র অংক ঢোকান।"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "কমা দ্বারা আলাদা করে বৈধ ই-মেল ঠিকানা ঢোকান।"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "দয়া করে একটি বৈধ IP ঠিকানা ঢোকান।"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "ফাঁকা মান এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "অংক বিহীন অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "এই মানটি শুধু মাত্র অংকের দ্বারা গঠিত  হতে পারে না।"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "এখানে শুধু মাত্র অক্ষর ঢোকাতে পারবেন ।"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "YYYY-MM-DD ফরম্যাটে একটি বৈধ তারিখ ঢোকান।"
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "HH:MM ফরম্যাটে একটি বৈধ সময় ঢোকান।"
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "YYYY-MM-DD.HH:MM ফরম্যাটে একটি বৈধ তারিখ/সময় ঢোকান।"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "একটি বৈধ ই-মেল ঠিকানা ঢোকান।"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"একটি বৈধ চিত্র আপলোড করুন। যে ফাইল আপনি আপলোড করলেন তা হয় একটি চিত্র নয় অথবা "
+"একটি খারাপ চিত্র।"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "%s ইউ.আর.এল-এ একটি বৈধ চিত্র নেই।"
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "ফোন নম্বর XXX-XXX-XXXX ফরম্যাটে অবশ্যই হতে হবে। \"%s\" অবৈধ।"
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "%s ইউ.আর.এল-এ একটি বৈধ QuickTime ভিডিও পাওয়া গেল না।"
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "একটি বৈধ ইউ.আর.এল জরুরি।"
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"বৈধ এইচটিএমএল প্রয়োজনীয়। ত্রুটিগুল হল:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "খারাপভাবে গঠিত এক্সএমএল: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "অবৈধ ইউ.আর.এল: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "ইউ.আর.এল %s একটি ভাঙা সংযোগ।"
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "একটি বৈধ U S. রাজ্য abbreviation ঢোকান।"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "মুখ সামলে! %s এখানে ব্যাবহার করতে পারবেন না।"
+msgstr[1] "মুখ সামলে! %s এখানে ব্যাবহার করতে পারবেন না।"
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "এই ক্ষেত্রটি '%s' ক্ষেত্রের সঙ্গে অবশ্যই মিলতে হবে।"
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "দয়া করে অন্তত এক ক্ষেত্রেতে কিছু জিনিষ ঢোকান।"
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "দয়া করে উভয় ক্ষেত্রে ঢোকান অথবা তাদেরকে উভয় ফাঁকা ছেড়ে চলে যান।"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "এই ক্ষেত্রেটি অবশ্যই দেওয়া হবে যদি %(field)s %(value)s হয়"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "এই ক্ষেত্রেটি অবশ্যই দেওয়া হবে যদি %(field)s %(value)s না হয়"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "নকল মান অনুমতি দেওয়া হল না।"
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "এই মানটি %sএর একটি গুন অবশ্যই হতে হবে।"
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান।"
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার অক্ষরের সংখ্যা %s থেকে কম হবে।"
+msgstr[1] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার অক্ষরের সংখ্যা %s থেকে কম হবে।"
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার দশমিক স্থান %s থেকে কম হবে।"
+msgstr[1] "দয়া করে একটি বৈধ দশমিক সংখ্যা ঢোকান যার দশমিক স্থান %s থেকে কম হবে।"
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "আাপনার আপলোড করা ফাইল যেন অন্তত %s বাইট বড় হয় তা নিশ্চিত করুন।"
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "আাপনার আপলোড করা ফাইল যেন %s বাইটের থেকে বড় না হয় তা নিশ্চিত করুন।"
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "এই ক্ষেত্রের জন্য ফরম্যাটটি ভূল।"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "এই ক্ষেত্রেটি অবৈধ।"
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s থেকে কোন কিছু গ্রহন করতে পারলাম না।"
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"ইউ.আর.এল %(url)s অবৈধ Content-Type শিরোনাম নিয়ে '%(contenttype)s ফিরে আসল।"
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"দয়া করে লাইন %(line)s থেকে খোলা %(tag)s বন্ধ করুন। (\"%(start)s\"এর সঙ্গে লাইন "
+"আরম্ভ।)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"লাইন %(line)s এই প্রসঙ্গে কিছু শব্দ লেখার অনুমতি দেওয়া গেল না। (\"%(start)s\"এর "
+"সঙ্গে লাইন আরম্ভ।)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"লাইন %(line)s\"%(attr)s\"একটি অবৈধ বৈশিষ্ট্য। (\"%(start)s\"এর সঙ্গে লাইন আরম্ভ।)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+" %(line)s লাইনে \"<%(tag)s>\" একটি অবৈধ ট্যাগ। (\"%(start)s\"এর সঙ্গে লাইন "
+"আরম্ভ।)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"লাইন %(line)s একটি ট্যাগে এক অথবা আরও বেশি প্রয়োজনীয় বিশিষ্ট্যাবলী নেই। (\"%"
+"(start)s\"এর সঙ্গে লাইন আরম্ভ।)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\"বৈশিষ্ট্যয় লাইন %(line)s একটি অবৈধ মান আছে । (\"%(start)s\"এর সঙ্গে "
+"লাইন আরম্ভ।)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+#, fuzzy
+msgid "This field is required."
+msgstr "এই ক্ষেত্রেটি অবৈধ।"
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "এই মানটি %sএর একটি গুন অবশ্যই হতে হবে।"
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "এই মানটি %sএর একটি গুন অবশ্যই হতে হবে।"
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "এই ক্ষেত্রেটি অবৈধ।"
+
+#: db/models/fields/__init__.py:562
+#, fuzzy
+msgid "Enter a valid filename."
+msgstr "একটি বৈধ ই-মেল ঠিকানা ঢোকান।"
+
+#: db/models/fields/related.py:43
+#, fuzzy, python-format
+msgid "Please enter a valid %s."
+msgstr "দয়া করে একটি বৈধ IP ঠিকানা ঢোকান।"
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "একাধিক আই.ডি.কমার দ্বারা আলাদা করুন।"
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"একের চেয়ে বেশি নির্বাচন করতে \"Control\" অথবা ম্যাক-এ \"Command\" চেপে ধরে "
+"রাখুন।"
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+#, fuzzy
+msgid "Line breaks are not allowed here."
+msgstr "ছোটহাতের অক্ষর এখানে ঢোকাতে পারবেন না।"
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/__init__.py:699
+#, fuzzy
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: forms/__init__.py:708
+#, fuzzy
+msgid "Enter a positive number."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: forms/__init__.py:717
+#, fuzzy
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "একটি গোটা সংখ্যা ঢোকান।"
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Comments"
+#~ msgstr "মন্তব্য সক্রিয় করুন"
+
+#~ msgid "label"
+#~ msgstr "লেবেল"
+
+#~ msgid "package"
+#~ msgstr "প্যাকেজ"
+
+#~ msgid "packages"
+#~ msgstr "প্যাকেজ"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "অভ্যন্তরস্থ বস্তু"

Added: vendor/django/current/django/conf/locale/cs/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/cs/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/cs/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/cs/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/cs/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1918 @@
+# Translation of django.po to Czech
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the DJANGO package.
+# Radek Svarz <translate at svarz.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django Czech translation\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2006-05-20 22:44+0100\n"
+"Last-Translator: Radek Å varz <translate at svarz.cz>\n"
+"Language-Team: Czech\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"
+"X-Poedit-Country: CZECH REPUBLIC\n"
+"X-Poedit-Bookmarks: -1,-1,-1,-1,-1,-1,-1,-1,-1,139\n"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID objektu"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "titulek"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentář"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "hodnocení #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "hodnocení #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "hodnocení #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "hodnocení #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "hodnocení #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "hodnocení #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "hodnocení #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "hodnocení #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "je platné hodnocení"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "datum/čas byl zaslán"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "je veřejné"
+
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP adresa"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "je odstraněno"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "Zaškrtněte tento box, pokud komentář není vhodný. Místo něj bude zobrazena zpráva \"Tento komentář byl smazán\"."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentáře"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "objekt obsahu"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Zadané %(user)s dne %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "jméno osoby"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP adresa"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "scháleno správci"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "volný komentář"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "volné komentáře"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "body"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "expirace hodnocení"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "bod karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma body"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d hodnoceno od %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentář byl označkován uživatelem %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "datum označení"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "uživatelské označení"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "uživatelská označení"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Označeno %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "datum smazání"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "vymazáno moderátorem"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "vymazané moderátorem"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Vymazáno moderátorem od %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonymní uživatelé nemohou hlasovat"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Neplatné ID komentáře"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Nelze hlasovat pro sebe"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "Toto hodnocení je povinné, protože jste zadal(a) alespoň jedno jiné hodnocení."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Tento komentář byl odevzdán uživatelem, který(á) odevzdal(a) méně než %(count)s komentář:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Tento komentář byl odevzdán uživatelem, který(á) odevzdal(a) méně než %(count)s komentáře:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Tento komentář byl odevzdán uživatelem, který(á) odevzdal(a) méně než %(count)s komentářů:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentář byl odevzdán povrchním uživatelem:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Je povolená pouze metoda POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno nebo více povinných polí nebylo vyplněné"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Někdo falšoval formulář komentáře (bezpečnostní narušení)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "Formulář komentáře měl neplatný parametr 'target' -- ID objektu nebylo platné"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Formulář komentáře neobsahoval buď 'preview' nebo 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Uživatelské jméno:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Heslo:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Zapomenuté heslo?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Odhlásit se"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Hodnocení"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Povinné"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Volitelné"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Zařadit fotografii"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentář:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Náhled komentáře"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Vaše jméno:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "VÅ¡e"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Libovolné datum"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Posledních 7 dní"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Tento měsíc"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Tento rok"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ano"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Neznámé"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "čas akce"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "object id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "object repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "příznak akce"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "zpráva změny"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "log záznam"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "log záznamy"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "VÅ¡echna data"
+
+#: contrib/admin/views/decorators.py:9
+#: contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "Prosíme, vložte správné uživatelské jméno a heslo. Poznámka - u obou položek se rozlišuje velikost písmen."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Přihlášení"
+
+#: contrib/admin/views/decorators.py:61
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "Prosíme, znovu se přihlašte, Vaše sezení vypršelo. Nemusíte se obávat, Vaše podání je uloženo."
+
+#: contrib/admin/views/decorators.py:68
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "Vypadá to, že Váš prohlížeč není nastaven, aby akceptoval cookies. Prosíme, zapněte cookies, obnovte tuto stránku a zkuste znovu."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Uživatelská jména nemohou obsahovat znak '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Vaše e-mailová adresa není Vaše uživatelské jméno. Zkuste místo toho '%s'."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Django správa"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Záznam %(name)s \"%(obj)s\" byl úspěšně přidán."
+
+#: contrib/admin/views/main.py:264
+#: contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Můžete to opět upravit níže."
+
+#: contrib/admin/views/main.py:272
+#: contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Můžete přidat další %s níže."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "%s: přidat"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Záznam %s byl přidán."
+
+#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "a"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "%s: změněno"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Záznam %s byl smazán."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Nebyly změněny žádné pole."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" byl úspěšně změněn."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "The %(name)s \"%(obj)s\" byl úspěšně přidán. Můžete to opět upravit níže."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "%s: změnit"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jedno nebo více %(fieldname)s z %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jedno nebo více %(fieldname)s z %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Záznam %(name)s \"%(obj)s\" byl úspěšně smazán."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Jste si jist(á)?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Historie změn: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Vybrat %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Vyberte %s pro změnu"
+
+#: contrib/admin/views/doc.py:277
+#: contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288
+#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Celé číslo"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (buď Ano (True), nebo Ne (False))"
+
+#: contrib/admin/views/doc.py:279
+#: contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Text (maximálně %(maxlength)s znaků)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Celá čísla oddělená čárkou"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Datum (bez času)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Datum (s časem)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mailová adresa"
+
+#: contrib/admin/views/doc.py:284
+#: contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Cesta k souboru"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Desetiné číslo"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (buď Ano (True), Ne (False), nebo Nic (None))"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "V relaci k rodičovskému modelu"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefonní číslo"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "ÄŒas"
+
+#: contrib/admin/views/doc.py:300
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stát US (2 velké znaky)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "text XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentace"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Změnit heslo"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Domů"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Historie"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/čas"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Uživatel"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Akce"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "Tento objekt nemá historii změn. Pravděpodobně nebyl přidán přes administrátorské rozhraní."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django správa webu"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django správa"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Chyba serveru"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Chyba serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Chyba serveru <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "Nastala chyba. Ta byla oznámena administrátorovi serveru pomocí e-mailu a měla by být brzy odstraněna. Děkujeme za trpělivost."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Stránka nenalezena"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Je nám líto, ale vyžádaná stránka nebyla nalezena."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Dostupné modely v aplikaci %(name)s."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Přidat"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Změnit"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nemáte oprávnění nic měnit."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Poslední akce"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mé akce"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nic"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s: přidat"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Zapomněl(a) jste své heslo?</a>"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Vítejte,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Smazat"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "Mazání %(object_name)s  '%(object)s' by vyústilo ve vymazání souvisejících objektů, ale Váš účet nemá oprávnění pro mazání následujících typů objektů:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:"
+msgstr "Jste si jist(á), že chcete smazat %(object_name)s \"%(object)s\"? Všechny následující související položky budou smazány:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ano, jsem si jist"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "Od %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Provést"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Pohled na stránku"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Prosíme, odstraňte chybu uvedenou níže."
+msgstr[1] "Prosíme, odstraňte chyby uvedené níže."
+msgstr[2] "Prosíme, odstraňte chyby uvedené níže."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Objednávání"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Objednávka:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Uložit jako nové"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Uložit a přidat další"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Uložit a pokračovat v úpravách"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Uložit"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Změna hesla"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Změna hesla byla úspěšná"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaše heslo bylo změněno."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Obnovení hesla"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "Zapomněl(a) jste heslo? Vložte níže Vaši e-mailovou adresu a my Vaše heslo obnovíme a zašleme Vám e-mailem nové."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailová adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Obnovit mé heslo"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Děkujeme Vám za Váš strávený čas na našich webových stránkách."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Přihlašte se znova"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Obnovení hesla bylo úspěšné"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "Poslali jsme Vám e-mailem nové heslo na adresu, kterou jste zadal(a). Měl(a) byste ji dostat během okamžiku."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "Vložte svoje staré heslo a poté vložte dvakrát nové heslo. Tak můžeme ověřit, že jste ho napsal(a) správně."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Staré heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nové heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potvrdit heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Změnit mé heslo"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Dostal(a) jste tento e-mail, protože jste požádal(a) o obnovení hesla"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pro Váš uživatelský účet na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaše nové heslo je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Můžete změnit toto heslo na následující stránce: "
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše uživatelské jméno, pro případ, že jste zapomněl(a):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Děkujeme za používání našeho webu!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Tým %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklety"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentační bookmarklety"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Pro nainstalování bookmarkletů, přetáhněte odkaz na Vaše záložky (oblíbené),\n"
+"nebo klikněte pravým tlačítkem na odkaz a přidejte ho k Vašim záložkám (oblíbeným). Nyní můžete\n"
+"zvolit bookmarklet z libovolné stránky. Poznámka: Některé tyto\n"
+"bookmarklety vyžadují, abyste prohlížel(a) stránky z počítače, který je nastaven jako\n"
+"\"interní\" (promluvte si s Vaším administrátorem, jestli si nejste jisti,\n"
+"zda je Váš počítač \"interní\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentace pro tuto stránku"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "Z libovolné stránky otevře dokumentaci pro pohled, který vygeneroval tuto stránku."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Ukázat id objektu"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "Ukáže content-type a unikátní ID pro stránky, které reprezentují jeden objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Upravit tento objekt (ve stávajícím okně)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Přepne do admin stránky pro stránky, které reprezentují jeden objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Upravit tento objekt (ve novém okně)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Jako výše, ale otevře admin stránky v novém okně."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "ÄŒas:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Momentálně:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Změna:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "přesměrovat z"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "Toto by měla být absolutní cesta, bez domény. Např.  '/udalosti/hledat/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "přesměrovat na"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "Toto může být buď absolutní cesta (jako nahoře) nebo plné URL začínající na 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "přesměrovat"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "přesměrování"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Příklad: '/o/kontakt/'. Ujistěte se, že máte počáteční a konečná lomítka."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titulek"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "obsah"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "povolit komentáře"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "jméno šablony"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'."
+msgstr "Například: 'flatfiles/kontaktni_stranka'. Pokud toto není zadáno, systém použije 'flatfiles/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "nutná registrace"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Pokud je zaškrtnuto, pouze přihlášení uživatelé budou moci prohlížet tuto stránku."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "statická stránka"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "statické stránky"
+
+#: contrib/auth/models.py:13
+#: contrib/auth/models.py:26
+msgid "name"
+msgstr "jméno"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "codename"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "oprávnění"
+
+#: contrib/auth/models.py:18
+#: contrib/auth/models.py:27
+msgid "permissions"
+msgstr "oprávnění"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "skupina"
+
+#: contrib/auth/models.py:30
+#: contrib/auth/models.py:65
+msgid "groups"
+msgstr "skupiny"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "uživatelské jméno"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "křestní jméno"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "příjmení"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mailová adresa"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "heslo"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Použijte '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "administrativní přístup "
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Rozhodne, zda se může uživatel přihlásit do správy webu."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktivní"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "stav superuživatel"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "poslední přihlášení"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "datum zaregistrování"
+
+#: contrib/auth/models.py:66
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "Kromě manuálně přidělených oprávnění uživatel dostane všechna oprávnění pro každou skupinu, ve které je."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "uživatelskí oprávnění"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "uživatel"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "uživatelé"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Osobní informace"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Oprávnění"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Důležitá data"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Skupiny"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "zpráva"
+
+#: contrib/auth/forms.py:30
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "Váš prohlížeč pravděpodobně nemá zapnuté cookies. Cookies jsou potřeba pro zalogování."
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "jméno modelu Pythonu"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "typ obsahu"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "typy obsahu"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "klíč sezení"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "data sezení"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "datum expirace"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sezení"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sezení"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "jméno domény"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "zobrazené jméno"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "web"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "weby"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "j.n.Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "j.n.Y, H:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pondělí"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Úterý"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Středa"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "ÄŒtvrtek"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Pátek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Neděle"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Leden"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Únor"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "Březen"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "Duben"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "Květen"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "ÄŒerven"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "ÄŒervenec"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Srpen"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Září"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Říjen"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Listopad"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Prosinec"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "led"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "úno"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "bře"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "dub"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "kvÄ›"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "čen"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "čec"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "srp"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "zář"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "říj"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "lis"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "pro"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Led."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Ún."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Srp."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Zář."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Říj."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "List."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Pros."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "rok"
+msgstr[1] "roky"
+msgstr[2] "let"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "měsíc"
+msgstr[1] "měsíce"
+msgstr[2] "měsíců"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "týden"
+msgstr[1] "týdny"
+msgstr[2] "týdnů"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "den"
+msgstr[1] "dny"
+msgstr[2] "dnů"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hodina"
+msgstr[1] "hodiny"
+msgstr[2] "hodin"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minuty"
+msgstr[2] "minut"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengálsky"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "ÄŒesky"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Welšsky"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Dánsky"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Německy"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Řecky"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Anglicky"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Španělsky"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francouzsky"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galicijsky"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "Maďarsky"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "Hebrejsky"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandština"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italsky"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japonština"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Holandština"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norsky"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brazilsky"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumunsky"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Rusky"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovensky"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "Slovinsky"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Srbsky"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Švédsky"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "Ukrajinsky"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Jednoduchá čínština"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Tradiční čínština"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Tato hodnota musí obsahovat pouze znaky, čísla nebo podtržítka."
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "Tato hodnota musí obsahovat pouze znaky, čísla, podtržítka, pomlčky nebo lomítka."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Velká písmena zde nejsou povolená."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Malá písmena zde nejsou povolená."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Vložte pouze cifry oddělené čárkami."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Vložte platné e-mailové adresy oddělené čárkami."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Prosíme, zadejte platnou IP adresu."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Zde nejsou povolené prázdné hodnoty."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Znaky, které nejsou čísla, nejsou zde povoleny."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Tato hodnota nemůže být složená pouze z cifer."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Vložte celé číslo."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Zde jsou povoleny pouze alfanumerické znaky."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Vložte platné datum ve formátu RRRR-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Vložte platný čas ve formátu HH:MM."
+
+#: core/validators.py:132
+#: db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Vložte platné datum a čas ve formátu RRRR-MM-DD HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Vložte platnou e-mailovou adresu."
+
+#: core/validators.py:148
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "Nahrajte na server platný obrázek. Soubor, který jste nahrál(a) nebyl obrázek, nebo byl porušen."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s neukazuje na platný obrázek."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonní čísla musí být ve formátu XXX-XXX-XXXX. \"%s\" není platné."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s neodkazuje na platné video ve formátu QuickTime."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Je vyžadováno platné URL."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Je vyžadováno platné HTML. Konkrétní chyby jsou:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Špatně formované XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neplatné URL: %s"
+
+#: core/validators.py:206
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odkaz na URL %s je rozbitý."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Vložte platnou zkraku U.S. státu."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Mluvte slušně! Slovo %s zde není přípustné."
+msgstr[1] "Mluvte slušně! Slova %s zde nejsou přípustná."
+msgstr[2] "Mluvte slušně! Slova %s zde nejsou přípustná."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Toto pole se musí shodovat s polem '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Prosíme, vložte něco alespoň pro jedno pole."
+
+#: core/validators.py:264
+#: core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosíme, vložte obě pole, nebo je nechte obě prázdná."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Toto pole musí být vyplněno, když %(field)s má %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Toto pole musí být vyplněno, když %(field)s nemá %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Duplikátní hodnoty nejsou povolené."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Tato hodnota musí být mocninou %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Prosíme, vložte platné číslo."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou celkem."
+msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem."
+msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi celkem."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Prosíme, vložte platné číslo s nejvíce %s cifrou za desetinnou čárkou celkem."
+msgstr[1] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem."
+msgstr[2] "Prosíme, vložte platné číslo s nejvíce %s ciframi za desetinnou čárkou celkem."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Ujistěte se, že posílaný soubor je velký nejméně %s bytů."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Ujistěte se, že posílaný soubor je velký nejvíce %s bytů."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Formát pro toto pole je špatný."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Toto pole není platné."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nemohl jsem získat nic z %s."
+
+#: core/validators.py:429
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s vrátilo neplatnou hlavičku Content-Type '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "Prosíme, zavřete nezavřenou značku %(tag)s z řádky %(line)s. (Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "Nějaký text začínající na řádce %(line)s není povolen v tomto kontextu. (Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "\"%(attr)s\" na řádce %(line)s je neplatný atribut. (Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "\"<%(tag)s>\" na řádce %(line)s je neplatná značka. (Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "Značce na řádce %(line)s schází jeden nebo více požadovaných atributů. (Řádka začíná s \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "Atribut \"%(attr)s\" na řádce %(line)s má neplatnou hodnotu. (Řádka začína s \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s s tímto %(type)s již existují pro daná %(field)s."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s s tímto %(fieldname)s již existuje."
+
+#: db/models/fields/__init__.py:114
+#: db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542
+#: db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Toto pole je povinné."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "Tato hodnota musí být celé číslo."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "Tato hodnota musí být buď Ano (True), nebo Ne (False)."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Toto pole nemůže být prázdné (null)."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Vložte platný název souboru."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Prosíme, zadejte %s správně."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "Oddělte více identifikátorů čárkami."
+
+#: db/models/fields/related.py:581
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Podržte  \"Control\", nebo \"Command\" na Macu pro vybrání více jak jedné položky."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Prosíme, vložte platná %(self)s ID. Hodnota %(value)r není platná."
+msgstr[1] "Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné."
+msgstr[2] "Prosíme, vložte platná %(self)s ID. Hodnoty %(value)r nejsou platné."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Ujistěte se, že Váš text má méně než %s znak."
+msgstr[1] "Ujistěte se, že Váš text má méně než %s znaky."
+msgstr[2] "Ujistěte se, že Váš text má méně než %s znaků."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Zalomení řádky zde nenjsou povolená."
+
+#: forms/__init__.py:480
+#: forms/__init__.py:551
+#: forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Vyberte platnou volbu. '%(data)s' není mezi %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Odevzdaný soubor je prázdný."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Vložte celé číslo mezi -32,768 a 32,767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Vložte celé kladné číslo."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Vložte celé číslo mezi 0 a 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ano, ne, možná"
+
+#~ msgid "Comment"
+#~ msgstr "Komentář"
+#~ msgid "Comments"
+#~ msgstr "Komentáře"
+#~ msgid "String (up to 50)"
+#~ msgstr "Text (max. 50 znaků)"
+#~ msgid "label"
+#~ msgstr "nadpis"
+#~ msgid "package"
+#~ msgstr "balík"
+#~ msgid "packages"
+#~ msgstr "balíky"
+#~ msgid "Error in Template"
+#~ msgstr "Chyba v Å¡ablonÄ›"
+#~ msgid ""
+#~ "\n"
+#~ "In template %(name)s, error at line %(line)s:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "V šabloně %(name)s, chyba na řádce %(line)s:\n"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "počet"
+

Added: vendor/django/current/django/conf/locale/cs/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/cs/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/cs/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/cs/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/cs/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,112 @@
+# Translation of djangojs.po to Czech
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the DJANGO package.
+# Radek Svarz <translate at svarz.cz>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django JavaScript Czech translation\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-17 22:26+0100\n"
+"PO-Revision-Date: 2006-05-03 12:04+0100\n"
+"Last-Translator: \n"
+"Language-Team: Czech\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"
+"X-Poedit-Language: Czech\n"
+"X-Poedit-Country: CZECH REPUBLIC\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "K dispozici %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Vybrat vše"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Přidat"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Odebrat"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Vybraný %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Vyberte si a klikněte"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "VÅ¡e vymazat"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "Leden Únor Březen Duben Květen Červen Červenec Srpen Září Říjen Listopad Prosinec"
+
+#: contrib/admin/media/js/dateparse.js:27
+#, fuzzy
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Neděle Pondělí Úterý Středa Čtvrtek Pátek Sobota"
+
+#: contrib/admin/media/js/calendar.js:25
+#, fuzzy
+msgid "S M T W T F S"
+msgstr "N P U S C P S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Nyní"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Hodiny"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Vyberte čas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Půlnoc"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 ráno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Poledne"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Storno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalendář"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Včera"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Zítra"
+

Added: vendor/django/current/django/conf/locale/cy/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/cy/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/cy/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/cy/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/cy/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1990 @@
+# Translation of Django to Welsh.
+# Copyright (C) 2005 Django.
+# This file is distributed under the same license as the Django package.
+# Jason Davies <jason at jasondavies.com>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: 2005-11-05 HO:MI+ZONE\n"
+"Last-Translator: Jason Davies <jason at jasondavies.com>\n"
+"Language-Team: Cymraeg <cy at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID gwrthrych"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "pennawd"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "sylw"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "cyfraddiad #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "cyfraddiad #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "cyfraddiad #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "cyfraddiad #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "cyfraddiad #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "cyfraddiad #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "cyfraddiad #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "cyfraddiad #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "yn gyfraddiad dilys"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "dyddiad/amser wedi ymostwng"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "yn gyhoeddus"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "cyfeiriad IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "wedi diddymu"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "sylw"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Gwrthrych cynnwys"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Postiwyd gan %(user)s ar %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "enw'r person"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "cyfeiriad ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Sylw rhydd"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Sylwadau rhydd"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "sgôr"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "dyddiad sgôr"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Sgôr Carma"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Sgorau Carma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "fflagio dyddiad"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Fflag defnyddiwr"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Fflagiau defnyddwyr"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Fflagio hefo %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "dyddiad dilead"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Dilead cymedrolwr"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Dileadau cymedrolwr"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Dilead cymedrolwr gan %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Ni gellir defnyddwyr dienw pleidleisio"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID sylw annilys"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Dim pleidleisio ar gyfer eich hun"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Caniateir POSTiau yn unig"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Enw defnyddiwr:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Cyfrinair:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Newidio fy nghyfrinair"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Allgofnodi"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "cyfraddiad #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Sylw"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Sylw rhydd"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "enw defnyddiwr"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Unrhyw dyddiad"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Heddiw"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "7 diwrnod gorffennol"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Mis yma"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Blwyddyn yma"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ie"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Na"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "amser gweithred"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id gwrthrych"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr gwrthrych"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "fflag gweithred"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "neges newid"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "cofnod"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "cofnodion"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Dyddiadau i gyd"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Mewngofnodi"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Gweinyddiad safle"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Ychwanegu %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Ychwanegwyd %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "ac"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Newidiwyd %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Dileuwyd %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Newidio %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Ydych yn sicr?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Hanes newid: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Dewis %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Dewis %s i newid"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Dyddiad (heb amser)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Dyddiad (gyda amser)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Cyfeiriad e-bost"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Llwybr ffeil"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Rhif degol"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Boole (Naill ai True, False neu None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Perthynas i model rhiant"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Rhif ffôn"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Testun"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Amser"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Talaith U.D. (dwy briflythyren)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Testun XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dogfennaeth"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Newid cyfrinair"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Adref"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Hanes"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dyddiad/amser"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Defnyddiwr"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Gweithred"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Does dim hanes newid gan y gwrthrych yma. Mae'n debyg ni ychwanegwyd drwy'r "
+"safle gweinydd yma."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Gweinyddiad safle Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Gweinyddiad Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Gwall gweinyddwr"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Gwall gweinyddwr (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Gwall Gweinyddwr <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Mae gwall wedi digwydd. Adroddwyd i weinyddwyr y safle drwy e-bost ac ddylai "
+"cael ei drwsio cyn bo hir."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Tudalen heb ei ddarganfod"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Mae'n ddrwg gennym, ond nid darganfwyd y dudalen a dymunwyd"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Ychwanegu"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Newidio"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Does genych ddim hawl i olygu unrhywbeth."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Gweithredau Diweddar"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Fy Ngweithredau"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Dim ar gael"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ychwanegu %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Ydych wedi <a href=\"/password_reset/\">anghofio eich cyfrinair</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Croeso,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Dileu"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Bydda dileu'r %(object_name)s '%(object)s' yn ddilyn i dileu'r wrthrychau "
+"perthynol, ond ni chaniateir eich cyfrif ddileu'r mathau o wrthrych canlynol:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Ydych yn sicr chi eiso ddileu'r %(object_name)s \"%(object)s\"? Bydd y cwbl "
+"o'r eitemau perthynol canlynol yn cae eu ddileu:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Yndw, rwy'n sicr"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Gan %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ewch"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Gweld ar safle"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Trefnu"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Trefn:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Cadw fel newydd"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Cadw ac ychwanegu un arall"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Cadw ac parhau i olygu"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Cadw"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Newid cyfrinair"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Newid cyfrinair yn lwyddianus"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Newidwyd eich cyfrinair."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Ailosod cyfrinair"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Wedi anghofio eich cyfrinair? Rhowch eich cyfeiriad e-bost isod, ac "
+"ailosodan eich cyfrinair ac e-bostio'r un newydd i chi."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Cyfeiriad e-bost:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Ailosodi fy nghyfrinair"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Diolch am dreulio amser ansawdd gyda'r safle we heddiw 'ma."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Ailmewngofnodi"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Ailosod cyfrinair yn lwyddianus"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "Wedi e-bostio cyfrinair newydd i'r gyfeiriad e-bost "
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Rhowch eich cyfrinair hen, er mwyn gwarchodaeth, yna rhowch eich cyfrinair "
+"newydd dwywaith er mwyn i ni wirio y teipiwyd yn gywir."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Cyfrinair hen:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Cyfrinair newydd:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Cadarnhewch cyfrinair:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Newidio fy nghyfrinair"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Chi'n derbyn yr e-bost yma achos ddymunwyd ailosod cyfrinair"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "er mwyn eich cyfrif defnyddiwr ar %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Eich cyfrinair newydd yw: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Mae croeso i chi newid y gyfrinair hon wrth fynd i'r dudalen yma:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Eich enw defnyddiwr, rhag ofn chi wedi anghofio:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Diolch am ddefnyddio ein safle!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Y tîm %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Dalennau gofnod"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dogfennaeth dalennau gofnod"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dogfennaeth er mwyn y dudalen yma"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Dangos ID gwrthrych"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Yn dangos y fath-cynnwys a'r ID unigryw ar gyfer tudalennau sy'n "
+"cynrychioligwrthrych sengl."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Golygu'r gwrthrych yma (ffenestr cyfoes)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Yn neidio i'r dudalen weinyddiad ar gyfer tudalennau sy'n cynrychioli "
+"gwrthrych sengl."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Golygu'r gwrthrych yma (ffenestr newydd)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Fel uwchben, ond yn agor y dudalen weinyddiad mewn ffenestr newydd."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dyddiad:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Amser:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "Newidio"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "ailgyfeirio o"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ddylai hon bod yn lwybr hollol, heb y parth-enw. Er enghraifft: '/"
+"digwyddiadau/chwilio/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "ailgyfeirio i"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Gellir fod naill ai llwybr hollol (fel uwch) neu URL hollol yn ddechrau â "
+"'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "ailgyfeiriad"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "ailgyfeiriadau"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Er enghraifft: '/amdan/cyswllt/'. Sicrhewch gennych slaesau arweiniol ac "
+"trywyddiol."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "teitl"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "cynnwys"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "galluogi sylwadau"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "enw'r templed"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Er enghraifft: 'flatpages/tudalen_cyswllt'. Os nid darparwyd, ddefnyddia'r "
+"system 'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "cofrestriad gofynnol"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Os wedi dewis, dim ond defnyddwyr a mewngofnodwyd bydd yn gallu gweld y "
+"tudalen."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "tudalen fflat"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "tudalennau fflat"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "enw"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "enw arwyddol"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Hawl"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Hawliau"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Grŵp"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grwpiau"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "enw defnyddiwr"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "enw cyntaf"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "enw olaf"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "cyfeiriad e-bost"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "cyfrinair"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Defnyddiwch '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "statws staff"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Dylunio ai'r defnyddiwr yn gally mewngofnodi i'r safle weinyddiad yma."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "gweithredol"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "statws defnyddiwr swper"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "mewngofnod olaf"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "Dyddiad"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Yn ogystal â'r hawliau trosglwyddwyd dros law, byddai'r defnyddiwr yma hefyd "
+"yn cael y cwbl hawliau a addefwyd i pob grŵp mae o/hi mewn."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Hawliau"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Defnyddiwr"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Defnyddwyr"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Gwybodaeth personol"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Hawliau"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Dyddiadau pwysig"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grwpiau"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Neges"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "enw modwl python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "math cynnwys"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "mathau cynnwys"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "goriad sesiwn"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "data sesiwn"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "dyddiad darfod"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesiwn"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesiynau"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "parth-enw"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "enw arddangos"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "safle"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "safleoedd"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Dydd Llun"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dydd Mawrth"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Dydd Mercher"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Dydd Iau"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Dydd Gwener"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Dydd Sadwrn"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Dydd Sul"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Ionawr"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Chwefror"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mawrth"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Ebrill"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Mehefin"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Gorffenaf"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Awst"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Medi"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Hydref"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Tachwedd"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Rhagfyr"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "ac"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "diwrnod"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Ion."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Chwe."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Awst"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Medi"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Hyd."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Tach."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Rhag."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "blwyddyn"
+msgstr[1] "blynyddoedd"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mis"
+msgstr[1] "misoedd"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "diwrnod"
+msgstr[1] "diwrnodau"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "awr"
+msgstr[1] "oriau"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "munud"
+msgstr[1] "munudau"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengaleg"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tsieceg"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Cymraeg"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Daneg"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Almaeneg"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Saesneg"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spaeneg"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Ffrangeg"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galisieg"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandeg"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Eidaleg"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norwyeg"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasileg"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Romaneg"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Rwsieg"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slofaceg"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Slofaceg"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbeg"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Swedeg"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brasileg"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Tsieinëeg Symledig"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Rhaid i'r werth yma cynnwys lythrennau, rhifau ac tanlinellau yn unig."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Rhaid i'r werth yma cynnwys lythrennau, rhifau, tanlinellau ac slaesau yn "
+"unig."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Ni chaniateir priflythrennau yma."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Ni chaniateir lythrennau bach yma."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Rhowch digidau gwahanu gyda atalnodau yn unig."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Rhowch cyfeiriad e-bost dilys gwahanu gyda atalnodau."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Rhowch cyfeiriad IP dilys, os gwelwch yn dda."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Ni chaniateir gwerthau gwag yma."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ni chaniateir nodau anrhifol yma."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Ni gellir y werth yma"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Rhowch rhif cyfan."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Caniateir nodau gwyddorol un unig yma."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Rhowch dyddiad dilys mewn fformat YYYY-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Rhowch amser ddilys mewn fformat HH:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Rhowch dyddiad/amser ddilys mewn fformat YYYY-MM-DD HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Rhowch cyfeiriad e-bost ddilys."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Llwythwch delwedd dilys. Doedd y delwedd a llwythwyd dim yn ddelwedd dilys, "
+"neu roedd o'n ddelwedd llwgr."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Dydy'r URL %s dim yn pwyntio at delwedd dilys."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Rhaid rifau ffon bod mewn fformat XXX-XXX-XXXX. Mae \"%s\" yn annilys."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Dydy'r URL %s dim yn pwyntio at fideo Quicktime dilys."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Mae URL dilys yn ofynnol."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Mae HTML dilys yn ofynnol. Gwallau penodol yw:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML wedi ffurfio'n wael: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL annilys: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Mae'r URL %s yn gyswllt toredig."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Rhowch talfyriad dalaith U.S. dilys."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Gwyliwch eich ceg! Ni chaniateir y gair %s yma."
+msgstr[1] "Gwyliwch eich ceg! Ni chaniateir y geiriau %s yma."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Rhaid i'r faes yma cydweddu'r faes '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Rhowch rhywbeth am un maes o leiaf, os gwelwch yn dda."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Llenwch y ddwy faes, neu gadewch nhw'n wag, os gwelwch yn dda."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Rhaid roi'r faes yma os mae %(field)s yn %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Rhaid roi'r faes yma os mae %(field)s dim yn %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Ni chaniateir gwerthau ddyblyg."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Rhaid i'r gwerth yma fod yn bŵer o %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Rhowch rhif degol dilys, os gwelwch yn dda."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Rhowch rhif degol dilys gyda cyfanswm %s digidau o fwyaf."
+msgstr[1] "Rhowch rhif degol dilys gyda cyfanswm %s digid o fwyaf."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Rhowch rif degol dilydd gyda o fwyaf %s lle degol, os gwelwch yn dda."
+msgstr[1] ""
+"Rhowch rif degol dilydd gyda o fwyaf %s lleoedd degol, os gwelwch yn dda."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Sicrhewch bod yr ffeil a llwythwyd yn o leiaf %s beit."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Sicrhewch bod yr ffeil a llwythwyd yn %s beit o fwyaf."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Mae'r fformat i'r faes yma yn anghywir."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Mae'r faes yma yn annilydd."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ni gellir adalw unrhywbeth o %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Dychwelodd yr URL %(url)s y pennawd Content-Type annilys '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Caewch y tag anghaedig %(tag)s o linell %(line)s. (Linell yn ddechrau â \"%"
+"(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Ni chaniateir rhai o'r destun ar linell %(line)s yn y gyd-destun yna. "
+"(Linell yn ddechrau â \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Mae \"%(attr)s\" ar lein %(line)s yn priodoledd annilydd. (Linell yn "
+"ddechrau â \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Mae \"<%(tag)s>\" ar lein %(line)s yn tag annilydd. (Linell yn ddechrau â \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Mae tag ar lein %(line)s yn eisiau un new fwy priodoleddau gofynnol. (Linell "
+"yn ddechrau â \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Mae gan y priodoledd \"%(attr)s\" ar lein %(line)s gwerth annilydd. (Linell "
+"yn ddechrau â \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Mae angen y faes yma."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Rhaid i'r gwerth yma fod yn bŵer o %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Rhaid i'r gwerth yma fod yn bŵer o %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Mae'r faes yma yn annilydd."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Rhowch enw ffeil dilys."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Rhowch %s dilys, os gwelwch yn dda."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr " Gwahanwch mwy nag un ID gyda atalnodau."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Gafaelwch lawr \"Control\", neu \"Command\" ar Fac, i ddewis mwy nag un."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Ni chaniateir toriadau llinell yma."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Dewisiwch dewis dilys; dydy '%(data)s' dim mewn %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Mae'r ffeil yn wag."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Rhowch rhif cyfan rhwng -32,768 a 32,767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Rhowch rhif positif."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Rhowch rhif cyfan rhwng 0 a 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ie,na,efallai"
+
+#~ msgid "Comment"
+#~ msgstr "Sylw"
+
+#~ msgid "Comments"
+#~ msgstr "Sylwadau"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Llinyn (i fyny at 50)"
+
+#~ msgid "label"
+#~ msgstr "label"
+
+#~ msgid "package"
+#~ msgstr "pecyn"
+
+#~ msgid "packages"
+#~ msgstr "pecynau"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "cynnwys"

Added: vendor/django/current/django/conf/locale/cy/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/cy/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/cy/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/cy/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/cy/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,112 @@
+# Translation of Django admin JS to Welsh.
+# Copyright (C) 2005 Django project
+# This file is distributed under the same license as the Django package.
+# Jason Davies <jason at jasondavies.com>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-12-04 16:53+0000\n"
+"Last-Translator: Jason Davies <jason at jasondavies.com>\n"
+"Language-Team: Cymraeg <cy at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+#, fuzzy
+msgid "Choose all"
+msgstr "Dewis amser"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Ionawr Chwefror Mawrth Ebrill Mai Mehefin Gorffennaf Medi Hydref Tachwedd "
+"Rhagfyr"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S Ll M M I G S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Nawr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Cloc"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Dewis amser"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Hanner nos"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 y.b."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Hanner dydd"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Diddymu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Heddiw"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ddoe"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Yfory"

Added: vendor/django/current/django/conf/locale/da/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/da/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/da/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/da/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/da/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1997 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2005 and beyond
+# This file is distributed under the same license as the PACKAGE package.
+# Morten Bagai <m at bagai.com>, Nov 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Morten Bagai <m at bagai.com>\n"
+"Language-Team: Danish\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#, fuzzy
+msgid "object ID"
+msgstr "objekt id"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+#, fuzzy
+msgid "comment"
+msgstr "indhold"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr ""
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr ""
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#, fuzzy
+msgid "IP address"
+msgstr "e-mail adresse"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "indhold"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#, fuzzy
+msgid "Content object"
+msgstr "indholdstype"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+#, fuzzy
+msgid "person's name"
+msgstr "fornavn"
+
+#: contrib/comments/models.py:171
+#, fuzzy
+msgid "ip address"
+msgstr "e-mail adresse"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "tillad kommentarer"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "tillad kommentarer"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr ""
+
+#: contrib/comments/models.py:234
+#, fuzzy
+msgid "score date"
+msgstr "udløbsdato"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr ""
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+#, fuzzy
+msgid "flag date"
+msgstr "flad side"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Bruger"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Brugere"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+#, fuzzy
+msgid "deletion date"
+msgstr "sessionsdata"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr ""
+
+#: contrib/comments/views/karma.py:23
+#, fuzzy
+msgid "Invalid comment ID"
+msgstr "tillad kommentarer"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Brugernavn:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Adgangskode:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Ændre adgangskode"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Log ud"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "tillad kommentarer"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "tillad kommentarer"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "brugernavn"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:110
+#, fuzzy
+msgid "Today"
+msgstr "Mandag"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+#, fuzzy
+msgid "No"
+msgstr "Nov."
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "handlingstid"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objekt id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objekt repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "handlingsflag"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "ændringsmeddelelse"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "logmeddelelse"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "logmeddelelser"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr ""
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Log ind"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+#, fuzzy
+msgid "Site administration"
+msgstr "Django administration"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:290
+#, fuzzy, python-format
+msgid "Add %s"
+msgstr "Tilføj"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr ""
+
+#: contrib/admin/views/main.py:338
+#, fuzzy, python-format
+msgid "Changed %s."
+msgstr "Ændre"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, fuzzy, python-format
+msgid "Change %s"
+msgstr "Ændre"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/views/main.py:533
+#, fuzzy, python-format
+msgid "Change history: %s"
+msgstr "Ændre adgangskode"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+#, fuzzy
+msgid "Date (without time)"
+msgstr "handlingstid"
+
+#: contrib/admin/views/doc.py:282
+#, fuzzy
+msgid "Date (with time)"
+msgstr "Dato/tid"
+
+#: contrib/admin/views/doc.py:283
+#, fuzzy
+msgid "E-mail address"
+msgstr "E-mail adresse:"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+#, fuzzy
+msgid "Decimal number"
+msgstr "December"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+#, fuzzy
+msgid "Phone number"
+msgstr "Indtast et heltal."
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr ""
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr ""
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "Internetadresse"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Ændre adgangskode"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Hjem"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Historik"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dato/tid"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Bruger"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Funktion"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dette objekt har ingen ændringshistorik. Det blev formentlig ikke tilføjet "
+"via dette administrations-site"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django site administration"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administration"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfejl"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfejl (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfejl <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Der opstod en fejl. Fejlen er rapporteret til site-administratoren via e-"
+"mail, og vil blive rettet hurtigst muligt. Tak for din tålmodighed."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Siden blev ikke fundet"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi Beklager, men den ønskede side kunne ikke findes"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Tilføj"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Ændre"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Du har ikke rettigehed til at foretage ændringer"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Seneste handlinger"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mine handlinger"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ingen tilgængelige"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Har du <a href=\"/password_reset/\">glemt din adgangskode</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Velkommen"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Hvis du sletter %(object_name)s '%(object)s' vil du også slette relaterede "
+"objekter, men du har ikke rettigheder til at slette flg. typer objekter:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Er du sikker på at du vil slette %(object_name) \"%(object)s\"? Alle de "
+"følgende relaterede objekter vil blive slettet:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, jeg er sikker"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:7
+#, fuzzy
+msgid "Save"
+msgstr "aktiv"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Ændre passord"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Adgangskoden er ændret"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Din adgangskode er ændret"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Nulstil adgangskode"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Har din adgangskode? Indtast din email-adresse nedenfor, så sender vi dig en "
+"ny kode via e-mail"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail adresse:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Nulstil min adgangskode"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tak for den tid du brugte på sitet idag"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Log ind igen"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Adgangskoden blev nulstillet"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Vi har e-mailet en ny adgangskode til dig. Du skulle modtage den om ganske "
+"kort tid."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Indtast venligst din gamle adgangskode af sikkerhedsgrunde, og indtast så "
+"dit nye password to gange, så vi kan være sikre på, at det er indtastet "
+"korrekt"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Gammel adgangskode:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Ny adgangskode:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Bekræft ny adgangskode:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Ændre adgangskode"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Du modtager denne e-mail, fordi du har bedt om at få nulstillet dit password"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "for din konto hos %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Din nye adgangskode er: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Du kan ændre din adgangskode ved at gå til denne side"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "I det tilfælde, at du har glemt dit brugernavn er det:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Tak, fordi du brugte vores site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Med venlig hilsen %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+#, fuzzy
+msgid "Show object ID"
+msgstr "objekt id"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "Ændre"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "omadresser fra"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Dette skal være en absolut sti uden domænenavnet. For eksempel: '/nyheder/"
+"find/"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omadresser til"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Dette kan enten være en absolut sti (som over), eller en komplet URL "
+"startende med 'http://'"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "omadressering"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "omaddresseringer"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Eksempel: '/om/kontakt/'. Vær sikker på at du har en skråstreg foran og og "
+"bagefter."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "indhold"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "tillad kommentarer"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "skabelonnavn"
+
+#: contrib/flatpages/models.py:13
+#, fuzzy
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Eksempel: 'fladesider/kontakt_side'. Vist denne ikke denne er gitt, vill "
+"'flatfiles/default' bli brukt."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrering kreves"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Hvis denne box er krydset af, vil kun brugere, der er logget ind, kunne se "
+"siden."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "flad side"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "flade sider"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "navn"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "kodenavn"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Rettighed"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Rettigheder"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Gruppe"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grupper"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "brugernavn"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "fornavn"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "efternavn"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mail adresse"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "adgangskode"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "administrationsstatus"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Bestemmer om brugeren kan logge ind på dette administrationssite"
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktiv"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "superbruger"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "sidst logget ind"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "registreringsdato"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"I tillæg til de rettighder, som manuelt er tildelt brugeren, vil denne også "
+"få alle rettigheder tildelt hver gruppe han/hun er medlem af"
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Rettigheder"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Bruger"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Brugere"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Personlig information"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Rettigheder"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Vigtige datoer"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupper"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Meddelelse"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "python modulnavn"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "indholdstype"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "indholdstyper"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "sessionsnøgle"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "sessionsdata"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "udløbsdato"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sessioner"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domænenavn"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "vist navn"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "side"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sider"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Mandag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Tirsdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Fredag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Lørdag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Søndag"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marts"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "December"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "Maj"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+#, fuzzy
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Maj"
+msgstr[1] "Maj"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+#, fuzzy
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "side"
+msgstr[1] "side"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tjekkisk"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Walisisk"
+
+#: conf/global_settings.py:40
+#, fuzzy
+msgid "Danish"
+msgstr "Spansk"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Tysk"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Engelsk"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spansk"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Fransk"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galicisk"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandsk"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italiensk"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norsk"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasiliansk"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumænsk"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Russisk"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovakisk"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Slovakisk"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbisk"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Svensk"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brasiliansk"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Simpel Kinesisk"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Traditionel Kinesisk"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Dette felt må kun indeholde bogstaver, tal og understreger."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Dette felt må kun indeholde bogstaver, tal, understreger og skråstreger."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Store bogstaver er ikke tilladt her"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Små bogstaver er ikke tilladt her"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Indtast kun tal adskilt af kommaer."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Indtast gyldige email-adresser adskilt af kommaer"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Venlist indtast en gyldig email-adresse."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Dette felt kan ikke være tomt."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Der må kun være tal her"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Denne værdi kan ikke kun bestå af tal."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Indtast et heltal."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Her er kun bogstaver tilladt."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Indtast en dato i Ã…Ã…Ã…Ã…-MM-DD format."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Indtast tid i TT:MM format."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Indtast dato og tid i Ã…Ã…Ã…Ã…-MM-DD TT:MM format."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Indtast en gyldig email-adresse."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Upload en billed-fil. Filen du uploadede var enten ikke et billede eller en "
+"ødelagt billed-fil"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URLen %s viser ikke til en gyldig billed-fil"
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonnumre skal være i XXX-XXX-XXXX formatet. \"%s\" er ikke godkjent."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URLen %s viser ikke til en gyldig QuickTime-film."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "En gyldig URL er påkrævet"
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Gyldig HTML er påkrævet. Fejlene er:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Ugyldig XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ugyldig URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Denne URL %s linker ikke til en gyldig side eller fil"
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Indtast en gyldig amerikansk statsforkortelse"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Var din mund! Ordet %s er ikke tilladt her."
+msgstr[1] "Var din mund! Ordene %s er ikke tilladt her."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dette felt skal matche '%s' feltet."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Indtast venligst noget i mindst et felt"
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Udfyld begge felter, eller lad dem begge være blanke"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Dette felt skal udfyldes, hvis %(field)s er lig %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Dette felt skal udfyldes, hvis %(field)s ikke er lig %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Duplikate værdier er ikke tilladt her"
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Denne værdi skal være en potens af %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Indtast venligst et gyldigt decimaltal."
+
+#: core/validators.py:349
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Indtast en gyldig decimal med max %s tal ialt"
+msgstr[1] "Indtast en gyldig decimal med max %s tal ialt"
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Indtast en gyldig decimal med max %s tal efter kommaet"
+msgstr[1] "Indtast en gyldig decimal med max %s tal efter kommaet"
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Tjek at den uploadede fil er mindst % bytes."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Tjek at den uploadede file er max %s bytes."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Formatet i dette feltet er feil."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Dette felt er ugyldigt."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Kunne ikke finde noget i %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URLen %(url)s returnerede ikke en godkendt Content-Type '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Luk venligst %(tag)s på linje %(line)s. (Linjen starer med \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En del af teksten som starter på linje %(line)s er ikke tilladt. (Linjen "
+"starter med \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" på linje %(line)s er ikke en gyldig attribut. (Linjen starter "
+"med \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" på linje %(line)s er ikke et gyldigt tag. (Linjen starter med "
+"\"%(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Et tag på linje %(line)s mangler en obligatorisk attribut. (Linjen starter "
+"med \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\" attributten på linje $(line)s har en ugyldig værdi. (Linjen "
+"starter med \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+#, fuzzy
+msgid "This field is required."
+msgstr "Dette felt er ugyldigt."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Denne værdi skal være en potens af %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Denne værdi skal være en potens af %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Dette felt er ugyldigt."
+
+#: db/models/fields/__init__.py:562
+#, fuzzy
+msgid "Enter a valid filename."
+msgstr "Indtast en gyldig email-adresse."
+
+#: db/models/fields/related.py:43
+#, fuzzy, python-format
+msgid "Please enter a valid %s."
+msgstr "Venlist indtast en gyldig email-adresse."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Adskil id'er med kommaer."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Hold \"Kontrol\", eller \"Æbletasten\" på Mac, nede for at vælge mere end en."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+#, fuzzy
+msgid "Line breaks are not allowed here."
+msgstr "Små bogstaver er ikke tilladt her"
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/__init__.py:699
+#, fuzzy
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Indtast et heltal."
+
+#: forms/__init__.py:708
+#, fuzzy
+msgid "Enter a positive number."
+msgstr "Indtast et heltal."
+
+#: forms/__init__.py:717
+#, fuzzy
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Indtast et heltal."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Comments"
+#~ msgstr "tillad kommentarer"
+
+#~ msgid "label"
+#~ msgstr "mærkat"
+
+#~ msgid "package"
+#~ msgstr "pakke"
+
+#~ msgid "packages"
+#~ msgstr "pakker"

Added: vendor/django/current/django/conf/locale/de/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/de/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/de/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/de/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/de/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1998 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2005-10-08 00:03+0200\n"
+"Last-Translator: Georg Bauer <gb at bofh.ms>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "Objekt ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "Überschrift"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "Kommentar"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "Bewertung #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "Bewertung #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "Bewertung #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "Bewertung #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "Bewertung #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "Bewertung #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "Bewertung #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "Bewertung #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "ist eine Bewertung"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "Datum/Zeit Erstellung"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "ist öffentlich"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP-Adresse"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "ist gelöscht"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Hier einen Haken setzen, wenn der Kommentar unpassend ist. Es wird dann eine "
+"\"Dieser Kommentar wurde entfernt\" Meldung statt dessen angezeigt."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "Kommentare"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Inhaltsobjekt"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Geschrieben von %(user)s am %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "Autorname"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP-Adresse"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "Bestätigt vom Betreiber"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "Freier Kommentar"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "Freie Kommentare"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "Bewertung"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "Bewertungsdatum"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "Karma Bewertung"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "Karma Bewertungen"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d Bewertung von %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Dieser Kommentar ist von %(user)s markiert:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "Kennzeichnungsdatum"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "Benutzerkennzeichnung"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "Benutzerkennzeichnungen"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Gekennzeichnet von %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "Löschdatum"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Löschung vom Moderator"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "Löschungen vom Moderator"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Vom Moderator %r gelöscht"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonyme Benutzer können nicht abstimmen"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Ungültige Kommentar-ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Keine Abstimmung bei Dir selber"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Die Abstimmung ist zwangsweise, weil Du an mindestens einer anderen "
+"Abstimmung teilnimmst."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentar:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Dieser Kommentar ist von einem Benutzer mit weniger als %(count)s "
+"Kommentaren:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Dieser Kommentar ist von einem nicht einschätzbaren Benutzer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Nur POST ist erlaubt"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Eines oder mehrere der erforderlichen Felder fehlt"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Jemand hat mit dem Kommentarformular herumgespielt (Sicherheitsverletzung)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Das Kommentarformular hatte einen falschen 'target' Parameter -- die Objekt-"
+"ID ist ungültig."
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Das Kommentarformular wurde nicht mit 'preview' oder 'post' abgeschickt"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Benutzername:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Passwort:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Kennwort vergessen?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Abmelden"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Bewertungen"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Erforderlich"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Optional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Ein Bild veröffentlichen"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Kommentar:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Kommentarvorschau"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Ihr Name:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Nach %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Alle"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Alle Daten"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Heute"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Letzte 7 Tage"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Diesen Monat"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Dieses Jahr"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nein"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Unbekannt"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "Zeit der Aktion"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "Objekt ID"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "Objekt Darst."
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "Aktionskennzeichen"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "Änderungsmeldung"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "Logeintrag"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "Logeinträge"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Alle Tage"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Bitte einen Benutzernamen und ein Kennwort eingeben. Beide Felder "
+"berücksichtigen die Groß-/Kleinschreibung."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Anmelden"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Bitte neu anmelden, da die Session ausgelaufen ist. Keine Angst: die "
+"Beiträge wurden gesichert."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Es sieht danach aus, das der Browser keine Cookies akzeptiert. Bitte im "
+"Browser Cookies aktivieren und diese Seite neu laden."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Benutzernamen können das Zeichen '@' nicht enthalten."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Die eMail-Adresse ist nicht der Benutzername. Bitte '%s' stattdessen "
+"versuchen."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Website Verwaltung"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich hinzugefügt."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Das Element kann jetzt weiter geändert werden."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Jetzt kann ein weiteres Element vom Typ %s angelegt werden."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "%s zufügen"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s hinzugefügt."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "und"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "%s geändert"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s gelöscht."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Keine Felder geändert."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich geändert."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" wurde erfolgreich zugefügt. Das Element kann jetzt "
+"geändert werden."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "%s ändern"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Ein oder mehrere %(fieldname)s in %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Ein oder mehrere %(fieldname)s in %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" wurde erfolgreich gelöscht."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Sicher? Ganz sicher?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Änderungsgeschichte: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "%s auswählen"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "%s zur Änderung auswählen"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Ganzzahl"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Wahrheitswert (Wahr oder Falsch)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Zeichenkette (bis zu %(maxlength)s Zeichen)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Kommaseparierte Liste von Zahlen"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Datum (ohne Zeit)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Datum (mit Zeit)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mail-Adresse"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Dateipfad"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Dezimalzahl"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Wahrheitswert (Wahr, Falsch oder Nichts)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Beziehung zum Übermodell"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Zeit"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. Bundesstaat (zwei Grossbuchstaben)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML Text"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentation"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Passwort ändern"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Start"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Geschichte"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/Zeit"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Benutzer"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Aktion"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dieses Objekt hat keine Änderungsgeschichte. Es wurde möglicherweise nicht "
+"über diese Verwaltungsseiten angelegt."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django Systemverwaltung"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django Verwaltung"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfehler"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfehler (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfehler <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Es hat einen Fehler gegeben. Dieser Fehler wurde an die Serververwalter per "
+"eMail weitergegeben und sollte bald behoben sein. Vielen Dank für Ihr "
+"Verständnis."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Seite nicht gefunden"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+"Es tut uns leid, aber die angeforderte Seite kann nicht gefunden werden."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Zufügen"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Ändern"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Sie haben keine Berechtigung irgendwas zu ändern."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Kürzliche Aktionen"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Meine Aktionen"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Keine vorhanden"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s zufügen"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Haben Sie <a href=\"/password_reset/\">ihr Passwort vergessen</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Willkommen,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Löschen"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Die Löschung des %(object_name)s '%(object)s' hätte die Löschung von "
+"abhängigen Daten zur Folge, aber Sie haben nicht die nötigen Rechte um die "
+"folgenden abhängigen Daten zu löschen:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Sind Sie sicher, das Sie %(object_name)s \"%(object)s\" löschen wollen? Es "
+"werden zusätzlich die folgenden abhängigen Daten mit gelöscht:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, ich bin sicher"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Nach %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Los"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Im Web Anzeigen"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Bitte den Fehler korrigieren."
+msgstr[1] "Bitte die Fehler korrigieren."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Sortierung"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Reihenfolge:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Als Neu sichern"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Sichern und neu hinzufügen"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Sichern und weiter bearbeiten"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Sichern"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Kennwort ändern"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Kennwortänderung erfolgreich"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ihr Kennwort wurde geändert."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Kennwort zurücksetzen"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Passwort vergessen? Einfach die E-Mail-Adresse eingeben und wir setzen das "
+"Passwort auf ein neues und senden das per E-Mail zu."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-Mail-Adresse:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Mein Kennwort zurücksetzen"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Vielen Dank, daß Sie hier ein paar nette Minuten verbracht haben."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Erneut Anmelden"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Erfolgreich Kennwort zurückgesetzt"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Wir haben Ihnen ein neues Kennwort per eMail zugeschickt an die Adresse, die "
+"Sie uns gegeben haben. Es sollte in Kürze ankommen."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Bitte geben Sie aus Sicherheitsgründen erst Ihr altes Kennwort und darunter "
+"dann zweimal (um sicherzustellen, das Sie es korrekt eingegeben haben) das "
+"neue Kennwort ein."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "altes Kennwort:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "neues Kennwort:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Kennwortwiederholung:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Mein Kennwort ändern"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Sie erhalten diese Mail, weil Sie ein neues Kennwort"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "für ihren Benutzer bei %(site_name)s angefordert haben."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ihr neues Kennwort ist: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Sie können das Kennwort auf folgender Seite ändern:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Ihr Benutzername, falls Sie ihn vergessen haben:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Vielen Dank, das Sie unsere Seiten benutzen!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Das Team von %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentations-Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Um Bookmarklets zu installieren müssen diese Links in die\n"
+"Browser-Werkzeugleiste gehzogen werden, oder mittels rechter Maustaste in "
+"die\n"
+"Bookmarks gespeichert werden. Danach können die Bookmarklets von jeder "
+"Seite\n"
+"aufgerufen werden. Einige Bookmarklets sind für den Zugriff von 'internen'\n"
+"Rechnern eingeschränkt. Falls nicht klar ist, ob ein Rechner als 'intern'\n"
+"bewertet wird, bitte den Administrator fragen.</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentation für diese Seite"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Springt von jeder Seite zu der Dokumentation für den View der diese Seite "
+"erzeugt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Objekt ID anzeigen"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Zeigt den Content-Type und die eindeutige ID für Seiten die ein einzelnes "
+"Objekt repräsentieren."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Dieses Objekt im aktuellen Fenster ändern."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Springt zu der Administrationsseite für dieses Objekt, wenn diese Seite ein "
+"Objekt repräsentiert."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Dieses Objekt in einem neuen Fenster ändern."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Wie zuvor, aber öffnent die Administrationsseite in einem neuen Fenster."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Zeit:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Derzeit:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Ändern:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "Umleitung von"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Hier sollte ein absoluter Pfad stehen, ohne den Domainnamen. Beispiel: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "Umleitung zu"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Hier muss entweder ein absoluter Pfad oder eine komplette URL mit http:// am "
+"Anfang stehen."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "Umleitung"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "Umleitungen"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Beispiel: '/about/contact/'. Wichtig: vorne und hinten muss ein / stehen."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "Titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "Inhalt"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "Kommentare aktivieren"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "Name der Vorlage"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Beispiel: 'flatpages/contact_page'. Wenn dieses Feld nicht gefüllt ist, wird "
+"'flatpages/default' als Standard gewählt."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "Registrierung erforderlich"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Wenn hier ein Haken ist, können nur angemeldete Benutzer diese Seite sehen."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "Webseite"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "Webseiten"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "Name"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "Codename"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "Berechtigung"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "Berechtigungen"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "Gruppe"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "Gruppen"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "Benutzername"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "Vorname"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "Nachname"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "eMail-Adresse"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "Kennwort"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Im Format '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "Administrator"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"Gibt an, ob der Benutzer sich an der Administrationsseite anmelden kann."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "Aktiv"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "Hauptadmin."
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "letzte Anmeldung"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "Mitglied seit"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Zusätzlich zu den manuell angelegten Rechten erhält dieser Benutzer auch "
+"alle Rechte, die seine zugewiesenen Gruppen haben."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "Berechtigungen"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "Benutzer"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "Benutzer"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Persönliche Infos"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Berechtigungen"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Wichtige Daten"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Gruppen"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "Mitteilung"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Der Webbrowser scheint keine Cookies aktiviert zu haben. Cookies sind für "
+"die Anmeldung zwingend notwendig."
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "Python Model-Klassenname"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "Inhaltstyp"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "Inhaltstypen"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "Sitzungs-ID"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "Sitzungsdaten"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "Verfallsdatum"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "Sitzung"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "Sitzungen"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "Domainname"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "Anzeigename"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "Website"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "Websites"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "j. N Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "j. N Y, H:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Montag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Dienstag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mittwoch"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Donnerstag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Freitag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Samstag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Sonntag"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "März"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezember"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "Jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "Feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "Mär"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "Apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "Mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "Jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "Jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "Aug"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "Sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "Okt"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "Nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "Dez"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "Jahr"
+msgstr[1] "Jahre"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "Monat"
+msgstr[1] "Monate"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "Woche"
+msgstr[1] "Wochen"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Tag"
+msgstr[1] "Tage"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "Stunde"
+msgstr[1] "Stunden"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "Minute"
+msgstr[1] "Minuten"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengali"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tschechisch"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Walisisch"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Dänisch"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Deutsch"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Griechisch"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Englisch"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spanisch"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Französisch"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galicisch"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "Hebräisch"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Isländisch"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italienisch"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japanisch"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Holländisch"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norwegisch"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasilianisch"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumänisch"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Russisch"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slowakisch"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "Slowenisch"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbisch"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Schwedisch"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "Ukrainisch"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Vereinfachtes Chinesisch"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Traditionelles Chinesisch"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten."
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Dieser Wert darf nur Buchstaben, Ziffern, Unterstriche und Schrägstriche "
+"enthalten."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Großbuchstaben sind hier nicht erlaubt."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Kleinbuchstaben sind hier nicht erlaubt."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Hier sind nur durch Komma getrennte Ziffern erlaubt."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Bitte mit Komma getrennte, gültige eMail-Adressen eingeben."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Bitte eine gültige IP-Adresse eingeben."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Dieses Feld darf nicht leer sein."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Nichtnumerische Zeichen sind hier nicht erlaubt."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Dieser Wert darf nicht nur aus Ziffern bestehen."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Bitte eine ganze Zahl eingeben."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Nur alphabetische Zeichen sind hier erlaubt."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Bitte ein gültiges Datum im Format JJJJ-MM-TT eingeben."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Bitte eine gültige Zeit im Format SS:MM eingeben."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+"Bitte eine gültige Datums- und Zeitangabe im Format JJJJ-MM-TT SS:MM "
+"eingeben."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Bitte eine gültige eMail-Adresse eingeben"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Bitte ein Bild hochladen. Die Datei, die hochgeladen wurde, ist kein Bild "
+"oder ist defekt."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Die URL %s zeigt nicht auf ein gültiges Bild."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonnummern müssen im Format XXX-XXX-XXXX sein. \"%s\" ist ungültig."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Die URL %s zeigt nicht auf ein gültiges QuickTime video."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Eine gültige URL ist hier verlangt."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Bitte gültiges HTML eingeben. Fehler sind:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Ungültiges XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ungültige URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Die URL %s funktioniert nicht."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Bitte eine gültige Abkürzung für einen US-Staat eingeben."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Keine Schimpfworte! Das Wort %s ist hier nicht gern gesehen!"
+msgstr[1] "Keine Schimpfworte! Die Wörter %s sind hier nicht gern gesehen!"
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dieses Feld muss zum Feld '%s' passen."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Bitte mindestens eines der Felder ausfüllen."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Bitte entweder beide Felder ausfüllen, oder beide leer lassen."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s den Wert %(value)s hat."
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"Dieses Feld muss gefüllt sein, wenn Feld %(field)s nicht %(value)s ist."
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Doppelte Werte sind hier nicht erlaubt."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Dieser Wert muss eine Potenz von %s sein."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Bitte eine gültige Dezimalzahl eingeben."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffer eingeben."
+msgstr[1] "Bitte eine gültige Dezimalzahl mit maximal %s Ziffern eingeben."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstelle  eingeben."
+msgstr[1] ""
+"Bitte eine gültige Dezimalzahl mit maximal %s Dezimalstellen eingeben."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Bitte sicherstellen, daß die hochgeladene Datei mindestens %s Bytes gross "
+"ist."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Bitte sicherstellen, daß die hochgeladene Datei maximal %s Bytes gross ist."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Das Format für dieses Feld ist falsch."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Dieses Feld ist ungültig."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Konnte nichts von %s empfangen."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Die URL %(url)s lieferte den falschen Content-Type '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Bitte das ungeschlossene %(tag)s Tag in Zeile %(line)s schließen. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"In Zeile %(line)s ist Text, der nicht in dem Kontext erlaubt ist. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Das Attribute %(attr)s in Zeile %(line)s ist ungültig. Die Zeile beginnt mit "
+"\"%(start)s\"."
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"<%(tag)s> in Zeile %(line)s ist ungültig. Die Zeile beginnt mit \"%(start)s"
+"\"."
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Ein Tag in Zeile %(line)s hat eines oder mehrere Pflichtattribute nicht. Die "
+"Zeile beginnt mit \"%(start)s\"."
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Das Attribut %(attr)s in Zeile %(line)s hat einen ungültigen Wert. Die Zeile "
+"beginnt mit \"%(start)s\"."
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"Ein '%(object)s' in dieser '%(type)s' existiert bereits für dieses '%(field)"
+"s'."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ein '%(optname)s' mit diesem '%(fieldname)s' existiert bereits."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Dieses Feld ist zwingend."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "Dieser Wert muss eine Ganzzahl sein."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "Dieser Wert muss wahr oder falsch sein."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Dieses Feld darf nicht leer sein."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Bitte einen gültigen Dateinamen eingeben"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Bitte ein gültiges '%s' eingeben."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "Mehrere IDs können mit Komma getrennt werden."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Um mehr als eine Selektion zu treffen, \"Strg\", oder auf dem Mac \"Command"
+"\", beim Klicken gedrückt halten."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Bitte gültige IDs für %(self)s eingeben. Der Wert %(value)r ist ungültig."
+msgstr[1] ""
+"Bitte gültige IDs für %(self)s eingeben. Die Werte %(value)r sind ungültig."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Bitte sicherstellen, das der Text weniger als %s Zeichen hat."
+msgstr[1] "Bitte sicherstellen, das der Text weniger als %s Zeichen hat."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Zeilenumbrüche sind hier nicht erlaubt."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+"Bitte eine gültige Auswahl treffen; '%(data)s' ist nicht in %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Die ausgewählte Datei ist leer."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Bitte eine ganze Zahl zwischen -32.768 und 32.767 eingeben."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Bitte eine ganze, positive Zahl eingeben."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Bitte eine ganze Zahl zwischen 0 und 32.767 eingeben."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "Ja,Nein,Vielleicht"

Added: vendor/django/current/django/conf/locale/de/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/de/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/de/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/de/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/de/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,109 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django JavaScript 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-12-04 13:21+0100\n"
+"Last-Translator: Georg Bauer <gb at bofh.ms>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=iso-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Verfügbare %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "alles auswählen"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Zufügen"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Entfernen"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Ausgewählte %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Gewünschte Auswahl treffen und "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "alles abwählen"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Januar Februar März April Mai Juni Juli August September Oktober November "
+"Dezember"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Sonntag Montag Dienstag Mittwoch Donnerstag Freitag Samstag"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M D M D F S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Jetzt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Uhr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Uhrzeit"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Mitternacht"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 Uhr"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Mittag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Abbruch"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Heute"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Gestern"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Morgen"

Added: vendor/django/current/django/conf/locale/el/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/el/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/el/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/el/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/el/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1913 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2006 and beyond 
+# This file is distributed under the same license as the PACKAGE package.
+# Panos Laganakos <panos.laganakos at gmail.com>, Mar 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: panos laganakos <panos.laganakos at gmail.com>\n"
+"Language-Team: Greek\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID αντικειμένου"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "Επικεφαλίδα"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "σχόλιο"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "κατάταξη #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "βαθμολογία #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "βαθμολογία #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "βαθμολογία #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "βαθμολογία #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "βαθμολογία #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "βαθμολογία #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "βαθμολογία #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "είναι έγκυρη βαθμολογία"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "ημερομηνία/ώρα υποβολής"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "είναι δημόσιο"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP διεύθυνση"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "είναι διεγραμμένο"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Σημειώστε αυτό το κουτί εάν το σχόλιο είναι ανάρμοστο. Ένα Αυτό το σχόλιο "
+"εσβήσθει\" μήνυμα θα εμφανιστεί αντί αυτού."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "σχόλιο"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr ""
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "όνομα ατόμου"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip διεύθυνση"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "εγκεκριμένο από το προσωπικό"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Ελεύθερο σχόλιο"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Ελεύθερα σχόλια"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "βαθμολογία"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "ημερομηνία βαθμολογίας"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "βαθμολογία"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Αυτο το σχόλιο σημειώθει απο %(χρήστη)ες\n"
+"\n"
+"%(κείμενο)α"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr ""
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr ""
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr ""
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "ημερομηνία διαγραφής"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Ανώνυμοι χρήστες δέν μπορούν να ψηφήσουν"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr ""
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Αυτή η βαθμολογία απαιτείται επειδή τουλάχιστον ακόμα μια βαθμολογία"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Ένα ή περισσότερα από τα απαιτούμενα πεδία δεν υποβλίθει"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Κωδικός"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Ξεχάσατε τον κωδικό σας;"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Σχόλιο:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr ""
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Σήμερα"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Αυτό το μήνα"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Αυτό το χρόνο"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ναί"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Όχι"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "’γνωστο"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr ""
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "αλλάξτε το μήνυμα"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr ""
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Όλες οι ημερομηνίες"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Παρακαλώ εισάγετε ένα σωστό όνομα χρήστη και κωδικό. Να σημειωθεί ότι και τα "
+"δύο πεδία είναι case-sensitive."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Συνδεθείτε"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Παρακαλώ ξανασυνδεθείτε, γιατί η session σας έληξε. Μην ανησυχείτε: Η "
+"submission σας έχει αποθηκευτεί."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Απ'οτι φαίνεται, ο φυλλομετρητής σας δεν έχει ρυθμιστεί να δέχεται cookies. "
+"Παρακαλώ ενεργοποιείστε τα cookies, ξαναφορτώστε αυτή την σελίδα, και "
+"δοκιμάστε ξανά."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Τα ονόματα των Χρηστών δεν μπορόυν να περιέχουν τον χαρακτήρα '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Η ηλεκτρονική σας διεύθυνση δεν είναι το ονόμα χρήστη σας. Δοκιμάστε '%s' "
+"έναντι αυτού."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Διαχείριση του Διαδυκτιακού χώρου"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Μπορείτε να προσθέσετε ακόμα ένα %s απο κάτω."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "και"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Είστε σίγουρος;"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Ακέραιος"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Είτε Αλήθεια ή Ψέμα)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Ημερομηνία (χωρίς την ώρα)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Ημερομηνία (με την ώρα)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Ηλεκτρονική διεύθυνση"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Δεκαδικός αριθμός"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Αριθμός τηλεφώνου"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Κείμενο"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Ώρα"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr ""
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Αλλαγή κωδικού"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Home"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Χρήστης"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Διαχειριστής ιστοσελίδας Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Οι πράξεις μου"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Καλωσήρθατε,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ναι, είμαι σίγουρος"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Αποθήκευση"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ο κωδίκός σας άλλαξε."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+"Ευχαριστούμε που διαθέσατε χρόνο στο να βελτίωσετε την ιστοσελίδα σήμερα."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Παλιός κωδικός:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Νέος κωδικός:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr ""
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr ""
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr ""
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr ""
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr ""
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr ""
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr ""
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr ""
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr ""
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr ""
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr ""
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr ""
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr ""
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr ""
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr ""
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr ""
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr ""
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr ""
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr ""
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr ""
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr ""
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Χρήστης"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Χρήστης"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr ""
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr ""
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr ""
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr ""
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "αλλάξτε το μήνυμα"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Ο φυλλομετρητής σας δεν φαίνεται να έχει ενεργοποιημένα τα cookies. Τα "
+"cookies απαιτούνται για να συνδεθείτε"
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr ""
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr ""
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr ""
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr ""
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr ""
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr ""
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr ""
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr ""
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr ""
+
+#: utils/dates.py:14
+msgid "January"
+msgstr ""
+
+#: utils/dates.py:14
+msgid "February"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr ""
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "August"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "September"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "October"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "November"
+msgstr ""
+
+#: utils/dates.py:16
+msgid "December"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "και"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "may"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr ""
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr ""
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr ""
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr ""
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr ""
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr ""
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Η διεύθυνση (URL) %s είναι χαλασμένη σύνδεση."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Παρακαλώ συμπληρώστε και τα δύο πεδία ή αφήστε τα και τα δύο άδεια."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Παρακαλώ είσάγετε έναν έγκυρο δεκαδίκο αριθμό."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Σιγουρευτείτε ότι το αρχείου που ανεβάζετε είναι %s bytes τουλάχιστον."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Η διάταξη αυτού του πεδίου έιναι λάθος"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Αυτό το πεδίο είναι άκυρο"
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr ""
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Boolean (Είτε Αλήθεια ή Ψέμα)"
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Αυτό το πεδίο είναι άκυρο"
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Εισάγετε ένα έγκυρο όνομα αρχείου"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Ξεχωρίστε πολλαπλές ΙDs με κόμματα"
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr ""
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr ""
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ναί,όχι,ίσως"
+
+#~ msgid "Comment"
+#~ msgstr "Σχόλιο"
+
+#~ msgid "Comments"
+#~ msgstr "Σχόλια"

Added: vendor/django/current/django/conf/locale/en/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/en/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/en/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/en/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/en/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1879 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:10+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr ""
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr ""
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr ""
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr ""
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr ""
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr ""
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr ""
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr ""
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr ""
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr ""
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr ""
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr ""
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr ""
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr ""
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr ""
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr ""
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr ""
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr ""
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr ""
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr ""
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr ""
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr ""
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr ""
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr ""
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr ""
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr ""
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr ""
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr ""
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr ""
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr ""
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr ""
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr ""
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr ""
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr ""
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr ""
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr ""
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr ""
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr ""
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr ""
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr ""
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr ""
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr ""
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr ""
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr ""
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr ""
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr ""
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr ""
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr ""
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr ""
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr ""
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr ""
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr ""
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr ""
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr ""
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr ""
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr ""
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr ""
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr ""
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr ""
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr ""
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr ""
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr ""
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr ""
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr ""
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr ""
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr ""
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr ""
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr ""
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr ""
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr ""
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr ""
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr ""
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr ""
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr ""
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr ""
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr ""
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr ""
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr ""
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr ""
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr ""
+
+#: utils/dates.py:14
+msgid "January"
+msgstr ""
+
+#: utils/dates.py:14
+msgid "February"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr ""
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr ""
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "August"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "September"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "October"
+msgstr ""
+
+#: utils/dates.py:15
+msgid "November"
+msgstr ""
+
+#: utils/dates.py:16
+msgid "December"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "may"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr ""
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr ""
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr ""
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr ""
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr ""
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr ""
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr ""
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr ""
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr ""
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr ""
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr ""
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr ""
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr ""
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr ""
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr ""
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr ""
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr ""
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr ""
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr ""
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr ""
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr ""
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr ""
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr ""
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr ""
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr ""
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr ""
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr ""
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr ""
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr ""

Added: vendor/django/current/django/conf/locale/en/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/en/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/en/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/en/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/en/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,108 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr ""

Added: vendor/django/current/django/conf/locale/es/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/es/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/es/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/es/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/es/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2055 @@
+# translation of django.po to Spanish
+# translation of django.po to Español
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Ricardo Javier Cárdenes Medina <ricardo.cardenes at gmail.com>, 2005.
+# Ricardo Javier Cardenes Medina <ricardo.cardenes at gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2005-11-28 15:28+0000\n"
+"Last-Translator: Ricardo Javier Cardenes Medina <ricardo.cardenes at gmail."
+"com>\n"
+"Language-Team: Spanish <en at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.10.2\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID de objeto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "encabezado"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "calificación 1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "calificación 2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "calificación 3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "calificación 4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "calificación 5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "calificación 6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "calificación 7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "calificación 8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "es calificación válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "fecha/hora de envío"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "es público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "Dirección IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "está eliminado"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Marque esta caja si el comentario es inapropiado. En su lugar se mostrará "
+"\"Este comentario ha sido eliminado\"."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "comentario"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objeto contenido"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Enviado por %(user)s en %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nombre de la persona"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "dirección ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprobado por el staff"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Comentario libre"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Comentarios libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "fecha de la puntuación"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Punto karma"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Puntos karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Puntuado %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario fue marcado por %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "fecha de la marca"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Marca de usuario"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Marcas de usuario"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "fecha de eliminación"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Eliminación de moderador"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Eliminaciones de moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eliminación del moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "No puedes votarte tú mismo"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentarios:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Sólo se admite POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Alguien está jugando con el formulario de comentarios (violación de "
+"seguridad)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"El formulario de comentarios tiene un parámetro 'target' no válido (el ID de "
+"objeto era inválido)"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Clave:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Cambiar mi clave"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Terminar sesión"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "calificación 1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Comentario"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Comentario libre"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "nombre de usuario"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Todo"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este año"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sí"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "No"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora de acción"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id de objeto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr de objeto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "marca de acción"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "mensaje de cambio"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de registro"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de registro"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Identificarse"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Por favor, identifíquese de nuevo, porque su sesión ha caducado. No se "
+"preocupe: se ha guardado su envío."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Parece que su navegador no está configurado para aceptar cookies. Actívelas "
+"por favor, recargue esta página, e inténtelo de nuevo."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Los nombres de usuario no pueden contener el carácter '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su "
+"lugar."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Sitio administrativo"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Puede editarlo de nuevo abajo."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Puede agregar otro %s abajo."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Agregado %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "y"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Borrado %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "No ha cambiado ningún campo."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito el %(name)s \"%(obj)s."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Se agregó con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Modificar histórico: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Escoja %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Escoja %s para modificar"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Entero"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Cadena (máximo %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Dirección de correo electrónico"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Ruta de fichero"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relación con el modelo padre"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Número de teléfono"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado de los EEUU (dos letras mayúsculas)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentación"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Cambiar clave"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto no tiene histórico de cambios. Probablemente no fue añadido "
+"usando este sitio de administración."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocurrido un error. Se ha informado a los administradores del sitio "
+"mediante correo electrónico y debería arreglarse en breve. Gracias por su "
+"paciencia"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mis acciones"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ninguno disponible"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "¿Ha <a href=\"/password_reset/\">olvidado su clave</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Bienvenido,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Eliminar el %(object_name)s '%(object)s' provocaría la eliminación de "
+"objetos relacionados, pero su cuenta no tiene permiso para borrar los "
+"siguientes tipos de objetos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"¿Está seguro de que quiere borrar los %(object_name)s \"%(object)s\"? Se "
+"borrarán los siguientes objetos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Por %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Buscar"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija el siguiente error."
+msgstr[1] "Por favor, corrija los siguientes errores."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Ordenación"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Orden:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Grabar"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambio de clave"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio de clave exitoso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su clave ha sido cambiada."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Recuperar clave"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"¿Ha olvidado su clave? Introduzca su dirección de correo electrónico, y "
+"crearemos una nueva que le enviaremos por correo."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Dirección de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar mi clave"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Identificarse de nuevo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Recuperación de clave exitosa"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Le hemos enviado una clave nueva a la dirección que ha suministrado. Debería "
+"recibirla en breve."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, introduzca su clave antigua, por seguridad, y después introduzca "
+"la nueva clave dos veces para verificar que la ha escrito correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Clave antigua:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Clave nueva:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirme clave:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambiar mi clave"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Está recibiendo este mensaje debido a que solicitó recuperar la clave"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "de su cuenta de usuario en %(site_name)s."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Su nueva clave es: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Puede cambiarla accediendo a esta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
+"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
+"favoritos.\n"
+"Ahora puede escoger el bookmarklet desde cualquier página en el sitio.\n"
+"Observer que algunos de estos bookmarklets precisan que esté viendo\n"
+"el sitio desde un computador señalado como \"interno\" (hable\n"
+"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
+"p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentación de esta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Le lleva desde cualquier página a la documentación de la vista que la genera."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostrar ID de objeto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Muestra el tipo de contenido e ID unívoco de las páginas que representan un "
+"único objeto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este objeto (ventana actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Le lleva a la página de administración de páginas que representan un único "
+"objeto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este objeto (nueva ventana)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Como antes, pero abre la página de administración en una nueva ventana."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Fecha:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+#, fuzzy
+msgid "Time:"
+msgstr "Hora"
+
+#: contrib/admin/templates/widget/file.html:2
+#, fuzzy
+msgid "Currently:"
+msgstr "Actualmente"
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "Modificar"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejeplo: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
+"empiece con 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "redirección"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "redirecciones"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al "
+"final."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenido"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "admitir comentarios"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nombre de plantilla"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Ejemplo: 'flatpages/contact_page'. Si no lo proporciona, el sistema usará "
+"'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "debe estar registrado"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página estática"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas estáticas"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "nombre en código"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Permiso"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Permisos"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Grupo"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "nombre de usuario"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "apellidos"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "dirección de correo"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "clave"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "es staff"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si el usuario puede entrar en este sitio de administración."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "es superusuario"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "último registro"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "fecha de creación"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Además de los permisos asignados manualmente, este usuario también tendrá "
+"todos los permisos de los grupos en los que esté."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Permisos"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Usuario"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Usuarios"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Información personal"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Permisos"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Fechas importantes"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Mensaje"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "nombre de módulo python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tipo de contenido"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tipos de contenido"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "clave de sesión"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "datos de sesión"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "fecha de caducidad"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesión"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesiones"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nombre de dominio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nombre para mostrar"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sitios"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lunes"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Jueves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Viernes"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Enero"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febrero"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mayo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junio"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julio"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septiembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octubre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Noviembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Diciembre"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "y"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "día"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Ene."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Oct."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dic."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengalí"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Checo"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Galés"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Danés"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Alemán"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Inglés"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Español"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francés"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Gallego"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandés"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Noruego"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasileño"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumano"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Ruso"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbio"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brasileño"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Chino simplificado"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor debe contener sólo letras, números y guiones bajos."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Este valor debe contener sólo letras, números, guiones bajos y barras (/)."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "No se admiten letras mayúsculas."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "No se admiten letras minúsculas."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo dígitos separados por comas."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduzca direcciones de correo válidas separadas por comas."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduzca una dirección IP válida."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "No se admiten valores vacíos."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "No se admiten caracteres no numéricos."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor no puede comprender sólo dígitos."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sólo se admiten caracteres alfabéticos."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduzca una hora válida en formato HH:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduzca una fecha/hora válida en formato YYYY-MM-DD HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Introduzca una dirección de correo electrónico válida"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envíe una imagen válida. El fichero que ha enviado no era una imagen o se "
+"trataba de una imagen corrupta."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s no apunta a una imagen válida."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Los números de teléfono deben guardar el formato XXX-XXX-XXXX format. \"%s\" "
+"no es válido."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s no apunta a un vídeo QuickTime válido."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Se precisa una URL válida."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Se precisa HTML válido. Los errores específicos son:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL no válida: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %s es un enlace roto."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduzca una abreviatura válida de estado de los EEUU."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "¡Vigila tu boca! Aquí no admitimos la palabra %s."
+msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo debe concordar con el campo '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Por favor, introduzca algo en al menos un campo."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "No se admiten valores duplicados."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor debe ser una potencia de %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Por favor, introduzca un número decimal válido."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígito en "
+"total."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
+"total."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígito "
+"decimal."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con a lo más %s dígitos "
+"decimales."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Asegúrese de que el fichero que envía tiene al menos %s bytes."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Asegúrese de que el fichero que envía tiene como máximo %s bytes."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "El formato de este campo es incorrecto."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Este campo no es válido."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "No pude obtener nada de %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
+"es válida."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
+"contexto. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
+"requeridos. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
+"válido. (La línea empieza por \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, fuzzy, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Este valor debe ser una potencia de %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Este valor debe ser una potencia de %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Este campo no es válido."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Introduzca un nombre de fichero válido"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr " Separe múltiples IDs con comas."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Pulse \"Control\" o \"Command\" en un Mac para escoger más de uno."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
+"válido."
+msgstr[1] ""
+"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
+"válidos."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Escoja una opción válida; '%(data)s' no está en %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "El fichero enviado está vacío."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32,768 y 32,767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "si,no,tal vez"
+
+#~ msgid "Comment"
+#~ msgstr "Comentario"
+
+#~ msgid "Comments"
+#~ msgstr "Comentarios"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Cadena (máximo 50)"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid "package"
+#~ msgstr "paquete"
+
+#~ msgid "packages"
+#~ msgstr "paquetes"
+
+#, fuzzy
+#~ msgid ""
+#~ "Please enter a valid decimal number with a whole part of at most %s digit."
+#~ msgid_plural ""
+#~ "Please enter a valid decimal number with a whole part of at most %s "
+#~ "digits."
+#~ msgstr[0] ""
+#~ "Por favor, introduzca un número decimal válido con a lo más %s dígito en "
+#~ "total."
+#~ msgstr[1] ""
+#~ "Por favor, introduzca un número decimal válido con a lo más %s dígitos en "
+#~ "total."

Added: vendor/django/current/django/conf/locale/es/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/es/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/es/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/es/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/es/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# Spanish translation for the django-admin JS files.
+# Copyright (C)
+# This file is distributed under the same license as the PACKAGE package.
+# Jorge Gajon <gajon at gajon.org>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django JavaScript 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-12-06 21:32+0100\n"
+"Last-Translator: Jorge Gajon <gajon at gajon.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s Disponibles"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+#, fuzzy
+msgid "Choose all"
+msgstr "Selecciona todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Remover"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s Elegidos"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Haz tus elecciones y da click en "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Elimina todos"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
+"Noviembre Diciembre"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Ahora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Reloj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Elige una hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Medianoche"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Mediodía"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ayer"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Mañana"

Added: vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2102 @@
+# Translation of django.po to Argentinean spanish, based on Spanish
+# translation work by Ricardo Javier Cárdenes Medina.
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Ramiro Morales <rm0 at gmx.net>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-06-19 11:19-0300\n"
+"PO-Revision-Date: 2006-05-16 10:05-0300\n"
+"Last-Translator: Ramiro Morales <rm0 at gmx.net>\n"
+"Language-Team: Spanish <es at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms:  nplurals=2; plural=(n != 1);\n"
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "nombre de la clase python del modelo"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tipo de contenido"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tipos de contenido"
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "Sesión cerrada"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "nombre en código"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "permiso"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "nombre de usuario"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "nombre"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "apellido"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "dirección de correo"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "contraseña"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Use '[algoritmo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "es staff"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica si el usuario puede ingresar a este sitio de administración."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "es superusuario"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "último registro"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "fecha de creación"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Además de los permisos asignados manualmente, este usuario también poseerá "
+"todos los permisos de los grupos a los que pertenezca."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "permisos de usuario"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "usuario"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "usuarios"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Información personal"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Permisos"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Fechas importantes"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "mensaje"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Su navegador Web aparenta no tener cookies activas. Las cookies son un "
+"requerimiento para poder ingresar."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:43
+#: contrib/admin/views/decorators.py:9
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Por favor ingrese un nombre de usuario y una contraseña correctos. Note que "
+"ambos campos son sensibles a mayúsculas/minúsculas."
+
+#: contrib/auth/forms.py:45
+msgid "This account is inactive."
+msgstr "Esta cuenta está inactiva"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigir desde"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Esta ruta debería ser absoluta, excluyendo el nombre de dominio. Ejemplo: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigir a"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Esto puede ser bien una ruta absoluta (como antes) o una URL completa que "
+"empiece con 'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "redirección"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "redirecciones"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID de objeto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "encabezado"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "calificación 1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "calificación 2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "calificación 3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "calificación 4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "calificación 5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "calificación 6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "calificación 7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "calificación 8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "es calificación válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "fecha/hora de envío"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "es público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292
+msgid "IP address"
+msgstr "Dirección IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "está eliminado"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Marque esta caja si el comentario es inapropiado. En su lugar se mostrará "
+"\"Este comentario ha sido eliminado\"."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentarios"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objeto contenido"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Enviado por %(user)s el %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nombre de la persona"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "dirección ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprobado por el staff"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentario libre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "fecha de la puntuación"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "punto karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "puntos karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "puntuado %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario fue marcado por %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "fecha de la marca"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "marca de usuario"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "marcas de usuario"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca de %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "fecha de eliminación"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Eliminación por moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "eliminaciones por moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eliminación del moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Los usuarios anónimos no pueden votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentario no válido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "No puedes votarte tú mismo"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Se precisa esta puntuación porque ha introducido al menos otra más."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario lo envió un usuario que ha enviado menos de %(count)s "
+"comentarios:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, fuzzy, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario ha sido enviado por un usuario 'sketcky':\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Sólo se admiten POSTs"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "No se proporcionó uno o más de los siguientes campos requeridos"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Alguien está jugando con el formulario de comentarios (violación de "
+"seguridad)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"El formulario de comentarios tiene un parámetro 'target' no válido (el ID de "
+"objeto era inválido)"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "El formulario de comentario no proporcionó 'previsualizar' ni 'enviar'"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Su nombre:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:27
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: contrib/comments/templates/comments/freeform.html:9
+#: contrib/comments/templates/comments/form.html:32
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Contraseña:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Olvidó su contraseña?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Cerrar sesión"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Calificaciones"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requerido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Enviar una foto"
+
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:303
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Ejemplo: '/about/contact/'. Asegúrese de que pone barras al principio y al "
+"final."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenido"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "activar comentarios"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nombre de plantilla"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Ejemplo: 'flatpages/contact_page'. Si no lo proporciona, el sistema usará "
+"'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "debe estar registrado"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Si está marcado, sólo los usuarios registrados podrán ver la página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página estática"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas estáticas"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "clave de sesión"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "datos de sesión"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "fecha de caducidad"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesión"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesiones"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nombre de dominio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nombre para visualizar"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sitios"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143 contrib/admin/filterspecs.py:169
+msgid "All"
+msgstr "Todos/as"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Cualquier fecha"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este año"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sí"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "No"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconocido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora de acción"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id de objeto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr de objeto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "marca de acción"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "mensaje de cambio"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de registro"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de registro"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "Todas las fechas"
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Identificarse"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Por favor, identifíquese de nuevo porque su sesión ha caducado. No se "
+"preocupe: se ha guardado su envío."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Parece que su navegador no está configurado para aceptar cookies. Actívelas "
+"por favor, recargue esta página, e inténtelo de nuevo."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Los nombres de usuario no pueden contener el carácter '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Su dirección de correo no es su nombre de usuario. Pruebe con '%s' en su "
+"lugar."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Sitio administrativo"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Se añadió con éxito el %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Puede editarlo de nuevo abajo."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Puede agregar otro %s abajo."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Agregar %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Agregado %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "y"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Modifica %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Elimina %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "No ha cambiado ningún campo."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Se modificó con éxito el %(name)s \"%(obj)s."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Se agregó con éxito el %(name)s \"%(obj)s. Puede editarlo de nuevo abajo."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o más %(fieldname)s en %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o más %(fieldname)s en %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Se eliminó con éxito el %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "¿Está seguro?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia de modificaciones: %s"
+
+#: contrib/admin/views/main.py:567
+#, python-format
+msgid "Select %s"
+msgstr "Seleccione %s"
+
+#: contrib/admin/views/main.py:567
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s a modificar"
+
+#: contrib/admin/views/main.py:743
+msgid "Database error"
+msgstr "Error de base de datos"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300
+msgid "Integer"
+msgstr "Entero"
+
+#: contrib/admin/views/doc.py:280
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (Verdadero o Falso)"
+
+#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Cadena (máximo %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Comma-separated integers"
+msgstr "Enteros separados por comas"
+
+#: contrib/admin/views/doc.py:283
+msgid "Date (without time)"
+msgstr "Fecha (sin hora)"
+
+#: contrib/admin/views/doc.py:284
+msgid "Date (with time)"
+msgstr "Fecha (con hora)"
+
+#: contrib/admin/views/doc.py:285
+msgid "E-mail address"
+msgstr "Dirección de correo electrónico"
+
+#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:290
+msgid "File path"
+msgstr "Ruta de archivo"
+
+#: contrib/admin/views/doc.py:288
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (Verdadero, Falso o Nulo)"
+
+#: contrib/admin/views/doc.py:295
+msgid "Relation to parent model"
+msgstr "Relación con el modelo padre"
+
+#: contrib/admin/views/doc.py:296
+msgid "Phone number"
+msgstr "Número de teléfono"
+
+#: contrib/admin/views/doc.py:301
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:302
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:304
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado de los EEUU (dos letras mayúsculas)"
+
+#: contrib/admin/views/doc.py:305
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actualmente"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Fecha:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentación"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Cambiar contraseña"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Historia"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Fecha/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j M Y P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto no tiene historia de modificaciones. Probablemente no fue "
+"añadido usando este sitio de administración."
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Agregar %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Por %(title)s "
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Error del servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Error del servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Error de servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ha ocurrido un error. Se ha informado a los administradores del sitio "
+"mediante correo electrónico y debería arreglarse en breve. Gracias por su "
+"paciencia"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Buscar"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "un resultado"
+msgstr[1] "%(counter)s resultados"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "total: %(full_result_count)s"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "Mostrar todos/as"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Sitio de administración de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos disponibles en la aplicación %(name)s."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "No tiene permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acciones recientes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mis acciones"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ninguna disponible"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página no encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Lo sentimos, pero no se encuentra la página solicitada."
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "¿Ha <a href=\"/password_reset/\">olvidado su contraseña</a>?"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "Filtrar"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver en el sitio"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija el siguiente error."
+msgstr[1] "Por favor, corrija los siguientes errores."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Ordenación"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Orden:"
+
+#: contrib/admin/templates/admin/base.html:24
+msgid "Welcome,"
+msgstr "Bienvenido,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Eliminar el %(object_name)s '%(object)s' provocaría la eliminación de "
+"objetos relacionados, pero su cuenta no tiene permiso para eliminar los "
+"siguientes tipos de objetos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"¿Está seguro de que quiere eliminar los %(object_name)s \"%(object)s\"? Se "
+"eliminarán los siguientes objetos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sí, estoy seguro"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Grabar como nuevo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Grabar y añadir otro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Grabar y continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Grabar"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"hay algún problema con su instalación de base de datos. Asegúrese de que las "
+"tablas de la misma hayan sido creadas, y asegúrese de que el usuario "
+"apropiado tenga permisos de escritura en la base de datos."
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambio de contraseña"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Cambio de contraseña exitoso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Su contraseña ha sido cambiada."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Recuperar contraseña"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"¿Ha olvidado su contraseña? Introduzca su dirección de correo electrónico, y "
+"crearemos una nueva que le enviaremos por correo."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Dirección de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar mi cöntraseña"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Gracias por el tiempo que ha dedicado al sitio web hoy."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Identificarse de nuevo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Recuperación de contraseña exitosa"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Le hemos enviado una nueva contraseña a la dirección que ha suministrado. "
+"Debería recibirla en breve."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, introduzca su contraseña antigua, por seguridad, y después "
+"introduzca la nueva contraseña dos veces para verificar que la ha escrito "
+"correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Contraseña antigua:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Contraseña nueva:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirme contraseña:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambiar mi contraseña"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Está recibiendo este mensaje debido a que solicitó recuperar la contraseña"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "de su cuenta de usuario en %(site_name)s."
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Su nueva contraseña es: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Puede cambiarla accediendo a esta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Su nombre de usuario, en caso de haberlo olvidado:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "¡Gracias por usar nuestro sitio!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "El equipo de %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar bookmarklets, arrastre el enlace a su barra\n"
+"de favoritos, o pulse con el botón derecho el enlace y añádalo a sus "
+"favoritos.\n"
+"Ahora puede sleccionar el bookmarklet desde cualquier página en el sitio.\n"
+"Observer que algunos de estos bookmarklets precisan que esté viendo\n"
+"el sitio desde un equipo señalado como \"interno\" (hable\n"
+"con su administrador de sistemas si no está seguro de si el suyo lo es).</"
+"p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentación de esta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Le lleva desde cualquier página a la documentación de la vista que la genera."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostrar ID de objeto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Muestra el tipo de contenido e ID unívoco de las páginas que representan un "
+"único objeto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este objeto (ventana actual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Le lleva a la página de administración de páginas que representan un único "
+"objeto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este objeto (nueva ventana)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Como antes, pero abre la página de administración en una nueva ventana."
+
+#: utils/translation.py:363
+msgid "DATE_FORMAT"
+msgstr "j N Y"
+
+#: utils/translation.py:364
+msgid "DATETIME_FORMAT"
+msgstr "j N Y P"
+
+#: utils/translation.py:365
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/translation.py:381
+msgid "YEAR_MONTH_FORMAT"
+msgstr "F Y"
+
+#: utils/translation.py:382
+msgid "MONTH_DAY_FORMAT"
+msgstr "j \\de F"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lunes"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Miércoles"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Jueves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Viernes"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Enero"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febrero"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mayo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junio"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julio"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setiembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octubre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Noviembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Diciembre"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "ene"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Enero"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr ""
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dic."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "año"
+msgstr[1] "años"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengalí"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Checo"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Galés"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Danés"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Alemán"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Griego"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Inglés"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Español"
+
+#: conf/global_settings.py:45
+msgid "Argentinean Spanish"
+msgstr "Español Argentino"
+
+#: conf/global_settings.py:46
+msgid "French"
+msgstr "Francés"
+
+#: conf/global_settings.py:47
+msgid "Galician"
+msgstr "Gallego"
+
+#: conf/global_settings.py:48
+msgid "Hungarian"
+msgstr "Húngaro"
+
+#: conf/global_settings.py:49
+msgid "Hebrew"
+msgstr "Hebreo"
+
+#: conf/global_settings.py:50
+msgid "Icelandic"
+msgstr "Islandés"
+
+#: conf/global_settings.py:51
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:52
+msgid "Japanese"
+msgstr "Japonés"
+
+#: conf/global_settings.py:53
+msgid "Dutch"
+msgstr "Holandés"
+
+#: conf/global_settings.py:54
+msgid "Norwegian"
+msgstr "Noruego"
+
+#: conf/global_settings.py:55
+msgid "Brazilian"
+msgstr "Brasileño"
+
+#: conf/global_settings.py:56
+msgid "Romanian"
+msgstr "Rumano"
+
+#: conf/global_settings.py:57
+msgid "Russian"
+msgstr "Ruso"
+
+#: conf/global_settings.py:58
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:59
+msgid "Slovenian"
+msgstr "Esloveno"
+
+#: conf/global_settings.py:60
+msgid "Serbian"
+msgstr "Serbio"
+
+#: conf/global_settings.py:61
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:62
+msgid "Ukrainian"
+msgstr "Ucraniano"
+
+#: conf/global_settings.py:63
+msgid "Simplified Chinese"
+msgstr "Chino simplificado"
+
+#: conf/global_settings.py:64
+msgid "Traditional Chinese"
+msgstr "Chino tradicional"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"Ya existen %(object)s con este %(type)s para el %(field)s especificado."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Ya existe %(optname)s con este %(fieldname)s."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:545 db/models/fields/__init__.py:556
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Este campo es obligatorio."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "Este valor debe ser un número entero."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "Este valor debe ser True o False."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Este campo no puede ser nulo."
+
+#: db/models/fields/__init__.py:471 core/validators.py:135
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduzca una fecha/hora válida en formato YYYY-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:565
+msgid "Enter a valid filename."
+msgstr "Introduzca un nombre de achivo válido"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor, introduzca un %s válido."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr " Separe múltiples IDs con comas."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Pulse \"Control\", o \"Command\" en un Mac, para seleccionar más de uno."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Por favor, introduzca IDs de %(self)s válidos. El valor %(value)r no es "
+"válido."
+msgstr[1] ""
+"Por favor, introduzca IDs de %(self)s válidos. Los valores %(value)r no son "
+"válidos."
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que su texto tiene menos de %s carácter."
+msgstr[1] "Asegúrese de que su texto tiene menos de %s caracteres."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "No se permiten saltos de línea."
+
+#: forms/__init__.py:485 forms/__init__.py:558 forms/__init__.py:597
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Seleccione una opción válida; '%(data)s' no está en %(choices)s."
+
+#: forms/__init__.py:659 core/validators.py:151 core/validators.py:379
+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/__init__.py:661
+msgid "The submitted file is empty."
+msgstr "El archivo enviado está vacío."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduzca un número entero entre -32,768 y 32,767."
+
+#: forms/__init__.py:727
+msgid "Enter a positive number."
+msgstr "Introduzca un número positivo."
+
+#: forms/__init__.py:737
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduzca un número entero entre 0 y 32,767."
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor debe contener sólo letras, números y guiones bajos."
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Este valor debe contener sólo letras, números, guiones bajos, barras (/) o "
+"slashes."
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "No se admiten letras mayúsculas."
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "No se admiten letras minúsculas."
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "Introduzca sólo dígitos separados por comas."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduzca direcciones de correo válidas separadas por comas."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "Por favor introduzca una dirección IP válida."
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "No se admiten valores vacíos."
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "No se admiten caracteres no numéricos."
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor no puede estar formado sólo por dígitos."
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "Introduzca un número entero."
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sólo se admiten caracteres alfabéticos."
+
+#: core/validators.py:127
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduzca una fecha válida en formato AAAA-MM-DD."
+
+#: core/validators.py:131
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduzca una hora válida en formato HH:MM."
+
+#: core/validators.py:139
+msgid "Enter a valid e-mail address."
+msgstr "Introduzca una dirección de correo electrónico válida"
+
+#: core/validators.py:155
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envíe una imagen válida. El archivo que ha enviado no era una imagen o se "
+"trataba de una imagen corrupta."
+
+#: core/validators.py:162
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "La URL %s no apunta a una imagen válida."
+
+#: core/validators.py:166
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Los números de teléfono deben guardar el formato XXX-XXX-XXXX format. \"%s\" "
+"no es válido."
+
+#: core/validators.py:174
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "La URL %s no apunta a un vídeo QuickTime válido."
+
+#: core/validators.py:178
+msgid "A valid URL is required."
+msgstr "Se precisa una URL válida."
+
+#: core/validators.py:192
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Se precisa HTML válido. Los errores específicos son:\n"
+"%s"
+
+#: core/validators.py:199
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:209
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL no válida: %s"
+
+#: core/validators.py:213 core/validators.py:215
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "La URL %s es un enlace roto."
+
+#: core/validators.py:221
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduzca una abreviatura válida de estado de los EEUU."
+
+#: core/validators.py:236
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "¡Vigila tu boca! Aquí no admitimos la palabra %s."
+msgstr[1] "¡Vigila tu boca! Aquí no admitimos las palabras %s."
+
+#: core/validators.py:243
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo debe concordar con el campo '%s'."
+
+#: core/validators.py:262
+msgid "Please enter something for at least one field."
+msgstr "Por favor, introduzca algo en al menos un campo."
+
+#: core/validators.py:271 core/validators.py:282
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor, rellene ambos campos o deje ambos vacíos."
+
+#: core/validators.py:289
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s es %(value)s"
+
+#: core/validators.py:301
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Se debe proporcionar este campo si %(field)s no es %(value)s"
+
+#: core/validators.py:320
+msgid "Duplicate values are not allowed."
+msgstr "No se admiten valores duplicados."
+
+#: core/validators.py:343
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor debe ser una potencia de %s."
+
+#: core/validators.py:354
+msgid "Please enter a valid decimal number."
+msgstr "Por favor, introduzca un número decimal válido."
+
+#: core/validators.py:356
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con con un máximo de un "
+"dígito en total."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con un maximo de %s dígitos "
+"en total."
+
+#: core/validators.py:359
+#, python-format
+msgid ""
+"Please enter a valid decimal number with a whole part of at most %s digit."
+msgid_plural ""
+"Please enter a valid decimal number with a whole part of at most %s digits."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con un dígito entero como "
+"máximo."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con un máximo de %s dígitos "
+"enteros."
+
+#: core/validators.py:362
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Por favor, introduzca un número decimal válido con un máximo de una posición "
+"decimal."
+msgstr[1] ""
+"Por favor, introduzca un número decimal válido con un máximo de %s "
+"posiciones decimales."
+
+#: core/validators.py:372
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Asegúrese de que el archivo que envía tiene al menos %s bytes."
+
+#: core/validators.py:373
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Asegúrese de que el archivo que envía tiene como máximo %s bytes."
+
+#: core/validators.py:390
+msgid "The format for this field is wrong."
+msgstr "El formato de este campo es incorrecto."
+
+#: core/validators.py:405
+msgid "This field is invalid."
+msgstr "Este campo no es válido."
+
+#: core/validators.py:441
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "No pude obtener nada de %s."
+
+#: core/validators.py:444
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"La URL %(url)s devolvió la cabecera Content-Type '%(contenttype)s', que no "
+"es válida."
+
+#: core/validators.py:477
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, cierre la etiqueta %(tag)s de la línea %(line)s. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:481
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Parte del texto que comienza en la línea %(line)s no está permitido en ese "
+"contexto. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:486
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"El \"%(attr)s\" de la línea %(line)s no es un atributo válido. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:491
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"La \"<%(tag)s>\" de la línea %(line)s no es una etiqueta válida. (La línea "
+"empieza por \"%(start)s\".)"
+
+#: core/validators.py:495
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A una etiqueta de la línea %(line)s le faltan uno o más atributos "
+"requeridos. (La línea empieza por \"%(start)s\".)"
+
+#: core/validators.py:500
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"El atributo \"%(attr)s\" de la línea %(line)s tiene un valor que no es "
+"válido. (La línea empieza por \"%(start)s\".)"
+
+#: template/defaultfilters.py:389
+msgid "yes,no,maybe"
+msgstr "si,no,tal vez"
+
+#, fuzzy
+#~ msgid "%(content_type_name)s"
+#~ msgstr "tipos de contenido"
+
+#, fuzzy
+#~ msgid "%(myname)s"
+#~ msgstr "Agregar %(name)s"
+
+#~ msgid "%(result_count)s result"
+#~ msgid_plural "%(counter)s results"
+#~ msgstr[0] "un resultado"
+#~ msgstr[1] "%(counter)s resultados"
+
+#~ msgid "Comment"
+#~ msgstr "Comentario"
+
+#~ msgid "Comments"
+#~ msgstr "Comentarios"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Cadena (máximo 50)"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid "package"
+#~ msgstr "paquete"
+
+#~ msgid "packages"
+#~ msgstr "paquetes"

Added: vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/es_AR/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,119 @@
+# Argentinean spanish translation for the django-admin JS files, based on
+# Spanish translation work by Jorge Gajon.
+# Copyright (C)
+# This file is distributed under the same license as the PACKAGE package.
+# Ramiro Morales <rm0 at gmx.net>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django JavaScript 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-06-19 12:15-0300\n"
+"PO-Revision-Date: 2006-05-16 10:20-0300\n"
+"Last-Translator: Ramiro Morales <rm0 at gmx.net>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ISO-8859-1\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s disponibles"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Seleccionar todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Agregar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Eliminar"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s elegidos"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Haga sus elecciones y haga click en "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Eliminar todos"
+
+#: 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 ""
+"Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre "
+"Noviembre Diciembre"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Lunes Martes Miércoles Jueves Viernes Sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M J V S"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:34
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:72
+msgid "Show"
+msgstr "Mostrar"
+
+#: contrib/admin/media/js/admin/CollapsedFieldsets.js:63
+msgid "Hide"
+msgstr "Ocultar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:89
+msgid "Now"
+msgstr "Ahora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Reloj"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:86
+msgid "Choose a time"
+msgstr "Elija una hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:90
+msgid "Midnight"
+msgstr "Medianoche"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:91
+msgid "6 a.m."
+msgstr "6 a.m."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:92
+msgid "Noon"
+msgstr "Mediodía"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:96
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:187
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:120
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:181
+msgid "Today"
+msgstr "Hoy"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:123
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:179
+msgid "Yesterday"
+msgstr "Ayer"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:183
+msgid "Tomorrow"
+msgstr "Mañana"

Added: vendor/django/current/django/conf/locale/fr/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/fr/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/fr/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/fr/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/fr/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2013 @@
+# translation of django.po to french
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Laurent Rahuel <laurent.rahuel at gmail.com>, 2005.
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2006-05-08 15:12+0200\n"
+"Last-Translator: Gaël Chardon <gael.dev_at_nospam_4now.net>\n"
+"Language-Team: français <fr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID de l'objet"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "titre"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "commentaire"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "vote n°1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "vote n°2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "vote n°3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "vote n°4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "vote n°5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "vote n°6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "vote n°7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "vote n°8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "est un vote valide"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "date et heure soumises"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "est public"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "adresse IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "est supprimé"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Cochez cette case si le commentaire est inadéquat. Un message type \"Ce "
+"commentaire a été supprimé\" sera affiché en lieu et place de celui-ci."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "commentaires"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Type de contenu"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Posté par %(user)s à %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nom"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "adresse IP"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "approuvé par l'équipe"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "commentaire libre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "commentaires libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "evaluation"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "date d'évaluation"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "point de Karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "points de Karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d évalué par %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ce commentaire a été marqué par %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "date d'indicateur"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "indicateur utilisateur"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "indicateurs utilisateur"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Indicateur par %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "date de suppression"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "suppression de modérateur"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "suppressions de modérateur"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Suppression de modérateur par %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Les utilisateurs anonymes ne peuvent pas voter"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de commentaire invalide"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Impossible de voter pour soi-même"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Ce votre est nécéssaire parceque vous avez saisi au moins un autre vote."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
+"commentaire :\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ce commentaire a été posté par un utilisateur qui a posté moins de %(count)s "
+"commentaires :\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ce commentaire a été posté par un utilisateur imprécis :\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Seuls les POSTs sont autorisés"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Un ou plusieurs champs requis n'ont pas été remplis"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+"Quelqu'un a trafiqué le formulaire de commentaire (violation des règles de "
+"sécurité)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Ce formulaire de commentaire avait un paramètre cible invalide ; l'ID de "
+"l'objet était invalide"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Le formulaire de commentaire ne proposait ni les options de prévisualisation "
+"ni d'envoi"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Nom d'utilisateur"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Mot de passe"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Mot de passe oublié?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Déconnexion"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Votes"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requis"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Optionel"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Poster une photo"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Commentaire :"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Prévisualisation du commentaire"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Votre nom :"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Par %s :</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Tout"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Toutes les dates"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Aujourd'hui"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Les 7 derniers jours"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Ce mois-ci"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Cette année"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Oui"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Non"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Inconnu"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "heure de l'action"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id de l'objet"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "représentation de l'objet"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "indicateur de l'action"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "message de modification"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrée d'historique"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entrées d'historique"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Toutes les dates"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Saisissez s'il vous plaît un nom d'utilisateur et un mot de passe valide. "
+"Remarquez que chacun de ces champs est sensible à la casse (différenciation "
+"des majuscules/minuscules)."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Connectez-vous"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Votre session a expiré, connectez-vous de nouveau s'il vous plaît. Ne vous "
+"inquiétez pas, votre travail précédement éffectué a été sauvé."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Il semblerait que votre navigateur n'accepte pas les cookies. Activez-les, "
+"rechargez cette page et rééssayez s'il vous plaît."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Les noms d'utilisateur ne peuvent contenir le caractère '@'"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Votre courriel n'est pas votre nom d'utilisateur. Essayez '%s' à la place."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Gestion du site"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été ajouté avec succès."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Vous pouvez continuez de l'éditez ci-dessous."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Vous pouvez ajouter un autre %s ci-dessous."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Ajouter %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Ajouté %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "et"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Modifié %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Supprimé %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Aucun champ modifié."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été modifié avec succès."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"L'objet %(name)s \"%(obj)s\" a été ajouté avec succès.Vous pouvez continuez "
+"de l'éditez ci-dessous."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Changement %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Un ou plusieurs %(fieldname)s dans %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "L'objet %(name)s \"%(obj)s\" a été supprimé avec succès."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Êtes-vous sûr ?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Historique des changements : %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Sélectionnez %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Sélectionnez %s pour changer"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Entier"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Booléen (Vrai ou Faux)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Chaîne de caractère (jusqu'à %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Des entiers séparés par une virgule"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Date (sans l'heure)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Date (avec l'heure)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Courriel :"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Chemin vers le fichier"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Nombre décimal"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Booléen (Vrai, Faux ou None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relation au modèle parent"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Numéro de téléphone"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Texte"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Heure"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "État U.S. (deux lettres majuscules)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Texte XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentation"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Modifier votre mot de passe"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Accueil"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Historique"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Date/Heure"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Utilisateur"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Action"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Cet objet n'a pas d'historique de modification. Il n'a probablement pas été "
+"ajouté au moyen de ce site d'administration."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site d'administration de Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administration de Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erreur du serveur"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erreur du serveur (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erreur du serveur <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Une erreur est survenue. Elle a été transmise par courriel aux "
+"administrateurs du site et sera corrigée dans les meilleurs délais. Merci "
+"pour votre patience."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Cette page n'a pas été trouvée"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Nous sommes désolés, mais la page demandée est introuvable."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modèles disponibles dans l'application %(name)s."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Ajouter"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modifier"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Vous n'avez pas la permission d'éditer quoi que ce soit."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Actions récentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mes actions"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Aucun(e) disponible"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Ajouter %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Avez vous <a href=\"/password_reset/\">perdu votre mot de passe</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Bienvenue,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Supprimer"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Supprimer l'objet %(object_name)s '%(object)s' provoquerait la suppression "
+"des objets qui lui sont liés mais votre compte ne possède pas la permission "
+"de supprimer les types d'objets suivants :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Êtes vous certain de vouloir supprimer l'objet %(object_name)s \"%(object)s"
+"\" ? Les éléments suivant sont liés à celui-ci et seront aussi supprimés :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Oui, j'en suis certain"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Par %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Envoyer"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Voir sur le site"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Veuillez corriger l'erreur ci-dessous."
+msgstr[1] "Veuillez corriger les erreurs ci-dessous."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Tri"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Ordre :"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Sauver en tant que nouveau"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Sauver et ajouter un nouveau"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Sauver et continuer les modifications"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Sauver"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Modification de votre mot de passe"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Mot de passe modifié avec succés"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Votre mot de passe a été modifié."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Réinitialisation de votre mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Mot de passe perdu ? Saisissez votre adresse de courriel ci-dessous et nous "
+"annulerons votre mot de passe actuel avant de vous en faire parvenir un "
+"nouveau par courriel."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Courriel :"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Réinitialiser mon mot de passe"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Merci pour le temps que vous avez accordé à ce site aujourd'hui."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Connectez vous à nouveau"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Mot de passe réinitialisé avec succès"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Nous vous avons envoyé par courriel un nouveau mot de passe. Vous devriez le "
+"recevoir rapidement."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Pour des raisons de sécurité, veuillez entrer votre ancien mot de passe puis "
+"saisissez deux fois votre nouveau mot de passe afin que nous puissions "
+"vérifier que vous l'avez tapé correctement."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Ancien mot de passe :"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nouveau mot de passe :"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmation du nouveau mot de passe"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Modifier mon mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Vous recevez ce courriel car vous avez demandé un changement de mot de passe"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pour votre compte au site %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Votre nouveau mot de passe est : %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Vous pouvez modifier ce mot de passe à l'adresse suivante :"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Votre nom d'utilisateur, en cas d'oubli :"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Merci d'utiliser notre site !"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "L'équipe %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Signets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Documentation des signets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentation pour cette page"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Vous envoie de n'importe quelle page vers la documentation de la vue qui a "
+"généré cette page."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Afficher l'ID de l'objet"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Montre le content-type et l'ID unique pour les pages qui représente un objet "
+"unique."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editer cet objet (fenêtre courante)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Renvoie à la page d'administration qui représente un objet seul."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editer cet objet (nouvelle fenêtre)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+"Comme ci-dessus, mais ouvre la page d'administration dans une nouvelle "
+"fenêtre."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Date :"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Heure :"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Actuellement :"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modification :"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigé depuis"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ceci doit être un chemin absolu, sans nom de domaine. Par exemple: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigé vers"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ceci peut être soit un chemin absolu (voir ci-dessus) soit une URL complète "
+"débutant par 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "redirige"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "redirige"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Par exemple : '/about/contact/'. Vérifiez la présence du caractère '/' en "
+"début et en fin de chaine."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titre"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenu"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "autoriser les commentaires"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nom du template"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Par exemple: 'flatfiles/contact_page'. Sans définition, le système utilisera "
+"'flatfiles/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "enregistrement requis"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Si coché, seuls les utilisateurs connectés auront la possibilité de voir "
+"cette page."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "page à plat"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "pages à plat"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nom"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "nom de code"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "permission"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "permissions"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "groupe"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "groupes"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "nom d'utilisateur"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "prénom"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "nom"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "courriel"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "mot de passe"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Utilisez '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "statut équipe"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Précise si l'utilisateur peut se connecter à ce site d'administration."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "actif"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "statut super-utilisateur"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "dernière connexion"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "date d'inscription"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"En plus des permissions qui lui sont manuellement assignées, cet utilisateur "
+"recevra aussi toutes les permissions de tous les groupes auquels il "
+"appartient. "
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "permissions de l'utilisateur"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "utilisateur"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "utilisateurs"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Information personnelle"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Permissions"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Dates importantes"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Groupes"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "message"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Votre navigateur ne semble pas avoir activé les cookies. Les cookies sont "
+"nécessaire pour se connecter"
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "nom du module python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "type de contenu"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "types de contenu"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "clé de session"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "donnée de session"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "date d'expiration"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nom de domaine"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nom à afficher"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "j F Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "j F Y, G:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "G:i:s"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lundi"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Mardi"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mercredi"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Jeudi"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Vendredi"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Samedi"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Dimanche"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janvier"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Février"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mars"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Avril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juin"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juillet"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Août"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octobre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Décembre"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "fév"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "avr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jui"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "aout"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "oct"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "déc"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fév."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aôut"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Oct."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Déc."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "année"
+msgstr[1] "années"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mois"
+msgstr[1] "mois"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "journée"
+msgstr[1] "jours"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "heure"
+msgstr[1] "heures"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minute"
+msgstr[1] "minutes"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Indien"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tchèque"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Gallois"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Dannois"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Allemand"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Grec"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Anglais"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Espagnol"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Français"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galicien"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "Hongrois"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "Israélien"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandais"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italien"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japonais"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Néerlandais"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norvégien"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brésilien"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Roumain"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Russe"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "Slovaque"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbe"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Suédois"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "Ukrainien"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Chinois simplifié"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Chinois traditionnel"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres et des tirets bas "
+"('_')."
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Ce champ ne doit contenir que des lettres, des nombres, des tirets bas ('_') "
+"et des '/'."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Les lettres majuscules ne sont pas autorisées ici."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Les lettres minuscules ne sont pas autorisées ici."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Saisissez uniquement des chiffres séparés par des virgules."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Entrez des adresses de courriel valides séparées par des virgules."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Entrez une adresse IP valide."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Vous ne pouvez pas laisser ce champ vide."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Les caractères non numériques ne sont pas autorisés ici."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Cette valeur ne peut pas être composé uniquement de chiffres."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Entrez un nombre entier."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Seules les lettres de l'alphabet sont autorisées ici."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Entrez une date valide au format AAAA-MM-JJ."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Entrez une heure valide au format HH:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Entrez une date et une heure valide au format AAAA-MM-JJ HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Entrez une adresse de courriel valide."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envoyez une image valide. Le fichier que vous avez transferé n'est pas une "
+"image ou bien est une image corrompue."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "L'URL %s ne pointe pas vers une image valide."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Les numéros de téléphone doivent être au format XXX-XXX-XXXX. \"%s\" est "
+"incorrect."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "L'URL %s ne pointe pas vers une vidéo QuickTime valide."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Une URL valide est requise."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Du HTML valide est requis. Les erreurs sont les suivantes :\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formé : %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalide : %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "L'URL %s est un lien cassé."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Entrez une abréviation d'état américain valide."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Attention à votre langage ! Le mot %s n'est pas autorisé ici."
+msgstr[1] "Attention à votre langage ! Les mots %s ne sont pas autorisés ici."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ce champ doit correspondre au champ '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Saisissez au moins une valeur dans un des champs s'il vous plaît."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+"Renseignez chacun des champs ou laissez les deux vides s'il vous plaît."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s vaut %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ce champ doit être renseigné si %(field)s ne vaut pas %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Des valeurs identiques ne sont pas autorisées."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Cette valeur doit être une puissance de %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Saisissez un nombre décimal valide s'il vous plaît."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Saisissez un nombre décimal valide avec au plus %s chiffre s'il vous plaît."
+msgstr[1] ""
+"Saisissez un nombre décimal valide avec au plus %s chiffres s'il vous plaît."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Saisissez un nombre décimal valide avec au plus %s décimale s'il vous plaît"
+msgstr[1] ""
+"Saisissez un nombre décimal valide avec au plus %s décimales s'il vous plaît"
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Vérifiez que le fichier transféré fait au moins une taille de %s octets."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Vérifiez que le fichier transféré fait au plus une taille de %s octets."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Le format de ce champ est mauvais."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Ce champ est invalide."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossible de récupérer quoi que ce soit depuis %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"L'entête Content-Type '%(contenttype)s', renvoyée par l'url %(url)s n'est "
+"pas valide."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Veuillez fermer le tag %(tag)s de la ligne %(line)s. (La ligne débutant par "
+"\"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Du texte commençant à la ligne %(line)s n'est pas autorisé dans ce contexte. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" ligne %(line)s n'est pas un attribut valide. (Ligne débutant "
+"par \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" ligne %(line)s n'est pas un tag valide. (Ligne débutant par \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Un tag, ou un ou plusieurs attributs, de la ligne %(line)s est manquant. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"La valeur de l'attribut \"%(attr)s\" de la ligne %(line)s n'est pas valide. "
+"(Ligne débutant par \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s avec le champ %(fieldname)s existe déjà."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Ce champ est obligatoire."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "Cette valeur doit être un entier."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "Cette valeur doit être soit Vraie soit Fausse."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Ce champ ne peut pas être vide."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Entrez un nom de fichier valide."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Entrez un %s valide."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "Séparez les ID par des virgules."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Maintenez \"Contrôle (ctrl)\", ou \"Commande (touche pomme)\" sur un Mac, "
+"pour en sélectionner plusieurs."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Entrez un ID %(self)s valide. La valeur %(value)r est invalide."
+msgstr[1] ""
+"Entrez des ID %(self)s valides. Les valeurs %(value)r sont invalides."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Assurez-vous que votre texte fais moins de %s caractère."
+msgstr[1] "Assurez-vous que votre texte fais moins de %s caractères."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Les retours à la ligne ne sont pas autorisés ici."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Sélectionnez un choix valide ; '%(data)s' n'est pas dans %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Le fichier soumis est vide."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Entrez un nombre entier entre -32 768 et 32 767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Entrez un nombre entier positif."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Entrez un nombre entier entre 0 et 32 767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "oui,non,peut-être"
+
+#~ msgid "Comment"
+#~ msgstr "Commentaire"
+
+#~ msgid "Comments"
+#~ msgstr "Commentaires"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Chaîne de caractères (jusqu'à 50)"
+
+#~ msgid "label"
+#~ msgstr "intitulé"
+
+#~ msgid "package"
+#~ msgstr "paquetage"
+
+#~ msgid "packages"
+#~ msgstr "paquetages"
+
+#~ msgid "Messages"
+#~ msgstr "Messages"

Added: vendor/django/current/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/fr/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/fr/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/fr/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/fr/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# French translation for js. 
+# Copyright (C) 2005 Mikaël Barbero 
+# This file is distributed under the same license as the PACKAGE package. 
+# Mikaël Barbero <mikael.barbero nospam at nospam free.fr>, 2005. 
+# 
+msgid "" 
+msgstr "" 
+"Project-Id-Version: PACKAGE VERSION\n" 
+"Report-Msgid-Bugs-To: \n" 
+"POT-Creation-Date: 2005-12-24 16:39+0100\n" 
+"PO-Revision-Date: 2005-12-24 16:39+0100\n" 
+"Last-Translator: Mikaël Barbero <mikael.barbero nospam at nospam free.fr>\n" 
+"Language-Team: French <fr at li.org>\n" 
+"MIME-Version: 1.0\n" 
+"Content-Type: text/plain; charset=ISO-8859-1\n" 
+"Content-Transfer-Encoding: 8bit\n" 
+
+#: contrib/admin/media/js/calendar.js:24 
+#: contrib/admin/media/js/dateparse.js:26 
+msgid "" 
+"January February March April May June July August September October November " 
+"December" 
+msgstr "" 
+"Janvier Février Mars Avril Mai Juin Juillet Août Septembre Octobre Novembre " 
+"Décembre" 
+
+#: contrib/admin/media/js/calendar.js:25 
+msgid "S M T W T F S" 
+msgstr "D L M M J V S" 
+
+#: contrib/admin/media/js/dateparse.js:27 
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday" 
+msgstr "Dimanche Lundi Mardi Mercredi Jeudi Vendredi Samedi" 
+
+#: contrib/admin/media/js/SelectFilter2.js:33 
+#, perl-format 
+msgid "Available %s" 
+msgstr "Disponible %s" 
+
+#: contrib/admin/media/js/SelectFilter2.js:41 
+msgid "Choose all" 
+msgstr "Tout choisir" 
+
+#: contrib/admin/media/js/SelectFilter2.js:46 
+msgid "Add" 
+msgstr "Ajouter" 
+
+#: contrib/admin/media/js/SelectFilter2.js:48 
+msgid "Remove" 
+msgstr "Enlever" 
+
+#: contrib/admin/media/js/SelectFilter2.js:53 
+#, perl-format 
+msgid "Chosen %s" 
+msgstr "Choisi %s" 
+
+#: contrib/admin/media/js/SelectFilter2.js:54 
+msgid "Select your choice(s) and click " 
+msgstr "Sélectionnez un ou plusieurs choix et cliquez " 
+
+#: contrib/admin/media/js/SelectFilter2.js:59 
+msgid "Clear all" 
+msgstr "Tout enlever" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45 
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80 
+msgid "Now" 
+msgstr "Maintenant" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48 
+msgid "Clock" 
+msgstr "Horloge" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77 
+msgid "Choose a time" 
+msgstr "Choisir une heure" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81 
+msgid "Midnight" 
+msgstr "Minuit" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82 
+msgid "6 a.m." 
+msgstr "6:00" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83 
+msgid "Noon" 
+msgstr "Midi" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87 
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168 
+msgid "Cancel" 
+msgstr "Annuler" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111 
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162 
+msgid "Today" 
+msgstr "Aujourd'hui" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114 
+msgid "Calendar" 
+msgstr "Calendrier" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160 
+msgid "Yesterday" 
+msgstr "Hier" 
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164 
+msgid "Tomorrow" 
+msgstr "Demain"

Added: vendor/django/current/django/conf/locale/gl/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/gl/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/gl/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/gl/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/gl/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1988 @@
+# Translation of django.po to Galego
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Afonso Fernández Nogueira <fonzzo.django at gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2006-07-03 14:06+0200\n"
+"Last-Translator: Afonso Fernández Nogueira <fonzzo.django at gmail.com>\n"
+"Language-Team: Galego\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Galician\n"
+"X-Poedit-SourceCharset: utf-8\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID do obxecto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "título"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentario"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "é unha puntuación válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/hora do envío"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "é público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "Enderezo IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "está borrado"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Marque esta caixa se o comentario non é apropiado. Verase a mensaxe \"Este "
+"comentario foi borrado\" no canto do seu contido."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "comentarios"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Obxecto de contido"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Publicado por %(user)s o %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome da persoa"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "enderezo IP"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprobado polos moderadores"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "comentario libre"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "comentarios libres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "puntuación"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data da puntuación"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "puntos de karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "puntos de karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentario foi marcado por %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data da marca"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "marca de usuario"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "marcas de usuario"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Marca por %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data de borrado"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "borrado de moderador"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "borrados de moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Borrado polo moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Os usuarios anónimos non poden votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentario non válida"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Vostede non se pode votar a si mesmo"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentario foi publicado por un usuario que ten publicados menos de %"
+"(count)s comentario:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentario foi publicado por un usuario que ten publicados menos de %"
+"(count)s comentarios:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Soamente se permiten envíos polo método POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Non se enviaron un ou máis dos campos requiridos"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguén manipulou o formulario do comentario (violación de seguridade)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"O formulario do comentario tiña un parámetro 'target' non válido: a ID do "
+"obxecto non é válida"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "O formulario de comentario non proporciona 'preview' ou 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Usuario:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Contrasinal:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Esqueceu o contrasinal?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Rematar sesión"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Requirido"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcional"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Publicar unha foto"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Comentario:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Previsualizar comentario"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Nome:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Todo"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Calquera data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoxe"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 días"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mes"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este ano"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Si"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Non"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Descoñecido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora da acción"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id do obxecto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr do obxecto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "código do tipo de acción"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "cambiar mensaxe"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de rexistro"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de rexistro"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Todas as datas"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "Insira un nome de usuario e un contrasinal correctos. Teña en conta que "
+"nos dous campos se distingue entre maiúsculas e minúsculas."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Iniciar sesión"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Ten que identicarse outra vez porque a súa sesión expirou. Non se preocupe, "
+"o que enviou quedou gardado."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Semella que o seu navegador non está configurado para aceptar  'cookies'. "
+"Por favor, habilite as 'cookies', recargue a páxina e ténteo de novo."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Os nomes de usuario non poden conter o carácter '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"O seu enderezo de correo electrónico non é o seu nome de usuario. Probe con "
+"'%s'."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Administración do sitio web"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Engadiuse correctamente o/a %(name)s  \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Pode editalo embaixo."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Pode engadir outro/a %s embaixo."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Engadir %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Engadido/a %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado(s) %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Eliminado(s) %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Non se modificou ningún campo."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Modificouse correctamente o/a %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "Engadiuse correctamente o/a %(name)s \"%(obj)s\" Pode editalo embaixo."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Un ou máis %(fieldname)s no/a %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Un ou máis %(fieldname)s no/a %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Eliminouse correctamente o/a %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Está seguro?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de cambios: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Seleccione un/ha %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Seleccione %s que modificar"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Número enteiro"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Valor booleano (verdadeiro ou falso)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Cadea (ata %(maxlength)s caracteres)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Números enteiros separados por comas"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Data (sen a hora)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Data (coa hora)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Enderezo de correo electrónico"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Ruta do ficheiro"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (verdadeiro, falso ou ningún)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relación cun modelo pai"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Número de teléfono"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado dos Estados Unidos (dúas letras maíusculas)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentación"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Cambiar contrasinal"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Inicio"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuario"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acción"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j de N de Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este obxecto non ten histórico de cambios. Posibelmente non se creou usando "
+"este sitio de administración."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Administración de sitio Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administración de Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erro do servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro do servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro do servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Houbo un erro. Xa se informou aos administradores do sitio por correo "
+"electrónico e debería quedar arranxado pronto. Grazas pola súa paciencia."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Páxina non atopada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sentímolo, pero non se atopou a páxina solicitada."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelos dispoñíbeis na aplicación %(name)s."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Engadir"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Non ten permiso para editar nada."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Accións recentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "As miñas accións"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ningunha dispoñíbel"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Engadir %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Esqueceu o contrasinal</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Benvido,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eliminar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Borrar o %(object_name)s '%(object)s' resultaría na eliminación de elementos "
+"relacionados, pero a súa conta non ten permiso para borrar os seguintes "
+"tipos de elementos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Seguro que quere borrar o %(object_name)s \"%(object)s\"? Eliminaranse os "
+"seguintes obxectos relacionados:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Si, estou seguro"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Por %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Ir"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver na web"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrixa o erro de embaixo."
+msgstr[1] "Por favor, corrixa os erros de embaixo."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Orde"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Orde:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Gardar coma novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Gardar e engadir outro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Gardar e seguir editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Gardar"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Cambiar o contrasinal"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "O seu contrasinal cambiouse correctamente."
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Cambiouse o seu contrasinal."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Recuperar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Esqueceu o contrasinal? Introduza o seu enderezo de correo electrónico "
+"embaixo e enviarémoslle un novo contrasinal."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Enderezo de correo electrónico:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Recuperar o meu contrasinal"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazas polo tempo que dedicou ao sitio web."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Entrar de novo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "O contrasinal foi recuperado correctamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Acabamos de enviarlle un novo contrasinal ao enderezo de correo indicado. "
+"Debería recibilo en breve."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por razóns de seguridade, introduza o contrasinal actual. Despois introduza "
+"dúas veces o contrasinal para verificarmos que o escribiu correctamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Contrasinal actual:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Contrasinal novo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmar contrasinal:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Cambiar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Recibe esta mensaxe porque solicitou recuperar o contrasinal"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para a súa conta de usuario en %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "O seu novo contrasinal é: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Pode cambiar este contrasinal visitando esta páxina:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "No caso de que o esquecese, o seu nome de usuario é:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Grazas por usar o noso sitio web!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "O equipo de %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklets de documentación"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar bookmarklets, arrastre a ligazón á súa\n"
+"barra de favoritos ou marcadores, ou faga clic co botón dereito\n"
+"e engádao aos marcadores. Agora pode usar o bookmarklet dende\n"
+" calquera páxina do sitio web. Teña en conta que algúns destes\n"
+"bookmarklets precisan que estea a visitar o sitio dende un ordenador\n"
+"designado coma \"interno\" (fale co administrador do sistema se\n"
+"non está seguro de que o seu ordenador é \"interno\" .</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentación para esta páxina"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "Salta á documentación para a vista que xera a páxina."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Amosar ID do obxecto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Amosa o tipo de contido e a ID única para páxinas que representan un obxecto "
+"determinado."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Editar este obxecto (nesta fiestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Salta á páxina de administración para páxina que representan un obxecto "
+"determinado."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Editar este obxecto (nunha nova fiestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Como enriba, pero abre a páxina de administración nunha nova fiestra."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Agora:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "orixe da redirección"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Debe ser unha ruta absoluta, sen o nome de dominio. Exemplo: '/events/"
+"search/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "destino da redirección"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Pode ser unha ruta absoluta (coma a de enriba) ou un URL completo que empece "
+"por 'http://'"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "redirección"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "redireccións"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exemplo: '/about/contact/'. Lembre incluír as barras ao principio e ao final."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contido"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "activar comentarios"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome da plantilla"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Exemplo: 'flatpages/contact_page'. Se non se especifica, o sistema usará "
+"'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "require rexistro"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se se marca, só poderán ver a páxina os usuarios identificados."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "páxina simple"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páxinas simples"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "código"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "permiso"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "permisos"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "grupo"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "grupos"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "nome de usuario"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "nome"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "apelidos"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "enderezo de correo electrónico"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "contrasinal"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "membro do persoal"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Indica se o usuario pode entrar neste sitio de administración."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "activo"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "estado de superusuario"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "última sesión"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "data de rexistro"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Ademais dos permisos asignados manualmente, este usuario gozará de todos os "
+"permisos concedidos a cada un dos grupos aos que pertence."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "permisos de usuario"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "usuario"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "usuarios"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Información persoal"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Permisos"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "mensaxe"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "Semella que o seu navegador non acepta 'cookies'. Requírense "
+"'cookies' para iniciar sesión."
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "nome do módulo Python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tipo de contido"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tipos de contido"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "clave da sesión"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "datos da sesión"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "data de caducidade"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesión"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesións"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "dominio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nome"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sitio"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sitios"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "d-m-Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "d-m-Y H:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "luns"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "martes"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "mércores"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "xoves"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "venres"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "xaneiro"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "febreiro"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "maio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "xuño"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "xullo"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "setembro"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "outubro"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "novembro"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "decembro"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "xan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "abr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "xuñ"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "xul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "out"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "xan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "out."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "anos"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mes"
+msgstr[1] "meses"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "semana"
+msgstr[1] "semanas"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "día"
+msgstr[1] "días"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "horas"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minutos"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "bengalí"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "checo"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "galés"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "dinamarqués"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "alemán"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "grego"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "inglés"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "español"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "francés"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "galego"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "húngaro"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "hebreo"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "islandés"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "italiano"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "xaponés"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "holandés"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "noruegués"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "brasileiro"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "romanés"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "ruso"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "eslovaco"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "esloveno"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "serbio"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "sueco"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "ucraíno"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "chinés simplificado"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "chinés tradicional"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Este valor soamente pode conter letras, números e guións baixos (_)."
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Este valor soamente pode conter letras, números, guións baixos (_), guións (-) e barras "
+"inclinadas (/)."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Non se permiten letras maiúsculas."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Non se permiten letras minúsculas."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Insira só díxitos separados por comas."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Insira enderezos de correo elecrónico válidos separados por comas."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Insira un enderezo IP válido."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Non se permiten valores en branco."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Non se permiten caracteres non númericos."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor non pode estar composto por díxitos soamente."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Insira un número enteiro."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Soamente se permiten caracteres do alfabeto."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Insira unha data válida en formato AAAA-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Insira unha hora válida en formato HH:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Insira unha data/hora válida en formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Insira un enderezo de correo electrónico válido."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Suba unha imaxe válida. O ficheiro subido non era unha imaxe ou esta estaba "
+"corrupta."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "O URL %s non apunta a unha imaxe válida."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Os números de teléfono deben estar no formato XXX-XXX-XXXX. \"%s\" non é "
+"válido."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "O URL %s non apunta a unha vídeo QuickTime válido."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Precísase un URL válido."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Precísase HTML válido. Os erros específicos son estes:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL non válido: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "O URL %s é unha ligazón rota."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Insira unha abreviatura estatal válida para un dos Estados Unidos."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Sen palabrotas, por favor! Non se pode usar a palabra %s aquí."
+msgstr[1] "Sen palabrotas, por favor! Non se poden usar as palabras %s aquí."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo ten que coincidir co campo '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Por favor, encha polo menos un campo."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Por favor, encha os dous campos ou deixe ambos en branco."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Débese encher este campo se %(field)s é %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo débese encher se %(field)s non é %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Non se permiten valores duplicados."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor ten que ser unha potencia de %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Insira un número decimal válido."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Insira un número decimal válido cun máximo de %s díxito en total."
+msgstr[1] "Insira un número decimal válido cun máximo de %s díxitos en total."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Insira un número decimal válido cun máximo de %s lugar decimal."
+msgstr[1] "Insira un número decimal válido cun máximo de %s lugares decimais."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique que o ficheiro subido ten un tamaño mínimo de %s bytes."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique que o ficheiro subido ten un tamaño máximo de %s bytes."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo é incorrecto."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Este campo non é válido."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Non se puido recibir ningún dato de %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"O URL %(url)s devolveu a cabeceira Content-Type non válida '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, peche a etiqueta %(tag)s da liña %(line)s. (A liña comeza con \"%"
+"(start)s\")."
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Algún texto a partir da liña %(line)s non é válido nese contexto. (A liña "
+"comeza con \"%(start)s\")."
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na liña %(line)s non é un atributo válido. (A liña comeza con "
+"\"%(start)s\")."
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na liña %(line)s non é unha etiqueta válida. (A liña comeza "
+"con \"%(start)s\")."
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Falta un o máis dos atributos requiridos para unha etiqueta da liña %(line)"
+"s. (A liña comeza con \"%(start)s\")."
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"O atributo \"%(attr)s\" na liña %(line)s contén un valor non válido. (A liña "
+"comeza con \"%(start)s\")."
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "Xa existe un obxecto %(object)s con este %(type)s para o campo %(field)s."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "Xa existe un/ha %(optname)s con este/a %(fieldname)s."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Requírese este campo."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "Este valor ten que ser un número enteiro."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "Este valor ten que verdadeiro ou falso."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Este campo non pode ser nulo."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Introduza un nome de ficheiro válido."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Insira un %s válido/a."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "Separe IDs múltiplas con comas."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Para seleccionar máis dunha entrada, manteña premida a tecla \"Control\", "
+"ou \"Comando\" nun Mac."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Insira IDs de %(self)s válidas. O valor %(value)r non é válido."
+msgstr[1] ""
+"Insira IDs de %(self)s válidas. Os valores %(value)r non son válidos."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Asegúrese de que o seu texto contén menos de %s carácter."
+msgstr[1] "Asegúrese de que o seu texto contén menos de %s caracteres."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Aquí non se permiten saltos de liña."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Elixa unha opción válida; '%(data)s' non está en %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "O ficheiro enviado está baleiro."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Insira un número enteiro entre -32.768 e 32.767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Insira un número positivo."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Insira un número enteiro entre 0 e 32.767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "si,non,quizais"
+
+#~ msgid "Comment"
+#~ msgstr "Comentario"
+
+#~ msgid "Comments"
+#~ msgstr "Comentarios"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Cadea (ata 50 caracteres)"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid "package"
+#~ msgstr "paquete"
+
+#~ msgid "packages"
+#~ msgstr "paquetes"

Added: vendor/django/current/django/conf/locale/gl/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/gl/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/gl/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/gl/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/gl/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# Translation of djangojs.po to Galego.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Afonso Fernández Nogueira <fonzzo.django at gmail.com>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-07-02 13:25+0200\n"
+"Last-Translator: Afonso Fernández Nogueira <fonzzo.django at gmail.com>\n"
+"Language-Team: Galego\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s dispoñíbeis"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Escoller todo"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Engadir"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Quitar"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s escollido/a(s)"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seleccione unha ou varias entrada e faga clic "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Quitar todo"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"xaneiro febreiro marzo abril maio xuño xullo agosto setembro outubro novembro "
+"decembro"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "domingo luns martes mércores xoves venres sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M X V S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Agora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Reloxo"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Escolla unha hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Medianoite"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 da mañá"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Mediodía"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoxe"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Onte"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Mañá"

Added: vendor/django/current/django/conf/locale/he/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/he/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/he/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/he/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/he/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1999 @@
+# translation of Django.
+# Copyright (C) 2006 THE Django'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the Django package.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 0.95\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-06-15 12:42+0300\n"
+"PO-Revision-Date: 2006-06-15 12:40+0300\n"
+"Last-Translator: Meir Kriheli <meir at mksoft.co.il>\n"
+"Language-Team: Hebrew\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: template/defaultfilters.py:389
+msgid "yes,no,maybe"
+msgstr "כן,לא,אולי"
+
+#: forms/__init__.py:346 db/models/fields/__init__.py:114
+#: db/models/fields/__init__.py:265 db/models/fields/__init__.py:545
+#: db/models/fields/__init__.py:556
+msgid "This field is required."
+msgstr "יש להזין תוכן בשדה זה."
+
+#: forms/__init__.py:381
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "נא לוודא שהטקסט שלך מכיל פחות מ %s תו."
+msgstr[1] "נא לוודא שהטקסט שלך מכיל פחות מ %s תווים."
+
+#: forms/__init__.py:386
+msgid "Line breaks are not allowed here."
+msgstr "מעברי שורה אסורים כאן."
+
+#: forms/__init__.py:485 forms/__init__.py:558 forms/__init__.py:597
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "יש לבחור אפשרות חוקית; '%(data)s' אינו בין %(choices)s."
+
+#: forms/__init__.py:659 core/validators.py:151 core/validators.py:376
+msgid "No file was submitted. Check the encoding type on the form."
+msgstr "לא נשלח שום קובץ. נא לבדוק את סוג הקידוד של הטופס."
+
+#: forms/__init__.py:661
+msgid "The submitted file is empty."
+msgstr "הקובץ שנשלח ריק."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "חש להזין מספר שלם בין ‎-32,768 ל- 32,767."
+
+#: forms/__init__.py:727
+msgid "Enter a positive number."
+msgstr "יש להזין מספר חיובי."
+
+#: forms/__init__.py:737
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "יש להזין מספר שלם בין 0 ל- 32,767."
+
+#: utils/translation.py:363
+msgid "DATE_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation.py:364
+msgid "DATETIME_FORMAT"
+msgstr "d.m.y H:i:s"
+
+#: utils/translation.py:365
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/translation.py:381
+msgid "YEAR_MONTH_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/translation.py:382
+msgid "MONTH_DAY_FORMAT"
+msgstr "d.m.Y"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "שנה"
+msgstr[1] "שנים"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "חודש"
+msgstr[1] "חודשים"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "שבוע"
+msgstr[1] "שבועות"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "יום"
+msgstr[1] "ימים"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "שעה"
+msgstr[1] "שעות"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "דקה"
+msgstr[1] "דקות"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "שני"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "שלישי"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "רביעי"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "חמישי"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "שישי"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "שבת"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "ראשון"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "ינואר"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "פברואר"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "מרץ"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "אפריל"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "מאי"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "יוני"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "יולי"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "אוגוסט"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "ספטמבר"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "אוקטובר"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "נובמבר"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "תצבר"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "יאנ"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "פבר"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "מרץ"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "אפר"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "מאי"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "יונ"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "יול"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "אוג"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "ספט"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "אוק"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "נוב"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "דצמ"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "יאנ'"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "פבר'"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "אוג'"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "ספט'"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "אוק'"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "נוב'"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "דצמ'"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s עם %(type)s קיים כבר עבור %(field)s נתון."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s·עם·%(fieldname)s·זה קיימת כבר."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "ערך זה חייב להיות מספר שלם."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "ערך זה חייב להיות אמת או שקר."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "שדה זה אינו יכול להכיל null."
+
+#: db/models/fields/__init__.py:471 core/validators.py:135
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "יש להזין תאריך ושעה במבנה YYYY-MM-DD HH:MM."
+
+#: db/models/fields/__init__.py:565
+msgid "Enter a valid filename."
+msgstr "יש להזין שם קובץ חוקי."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "יש להזין %s חוקי."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "יש להפריד מזהים מרובים בפסיקים."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "החזק את \"Control\", או \"Command\" על מק, לחוץ כדי לבחור יותר מאחד."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "נא להזין זיהוי %(self)s חוקי. הערך %(value)r אינו חוקי."
+msgstr[1] ""
+"נא להזין זיהויי %(self)s חוקיים. הערכים %(value)r אינם חוקיים."
+
+#: core/validators.py:63
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "ערך זה חייב להכיל אותיות, ספרות וקווים תחתונים בלבד."
+
+#: core/validators.py:67
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "ערך זה חייב להכיל אותיות, ספרות, מקפים, קווים תחתונים ונטויים בלבד."
+
+#: core/validators.py:75
+msgid "Uppercase letters are not allowed here."
+msgstr "אסור להשתמש באותיות גדולות."
+
+#: core/validators.py:79
+msgid "Lowercase letters are not allowed here."
+msgstr "אסור להשתמש באותיות קטנות."
+
+#: core/validators.py:86
+msgid "Enter only digits separated by commas."
+msgstr "יש להזין רק ספרות מופרדות בפסיקים."
+
+#: core/validators.py:98
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "יש להזין רק כתובות דוא\"ל מופרדות בפסיקים."
+
+#: core/validators.py:102
+msgid "Please enter a valid IP address."
+msgstr "נא להזין כתובת IP חוקית."
+
+#: core/validators.py:106
+msgid "Empty values are not allowed here."
+msgstr "חובה להזין ערך בשדה זה."
+
+#: core/validators.py:110
+msgid "Non-numeric characters aren't allowed here."
+msgstr "מותר להזין ספרות בלבד."
+
+#: core/validators.py:114
+msgid "This value can't be comprised solely of digits."
+msgstr "ערך זה אינו יכול להכיל ספרות בלבד."
+
+#: core/validators.py:119
+msgid "Enter a whole number."
+msgstr "נא להזין מספר שלם."
+
+#: core/validators.py:123
+msgid "Only alphabetical characters are allowed here."
+msgstr "יש להזין כאן אותיות בלבד."
+
+#: core/validators.py:127
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "יש להזין תאריך במבנה YYYY-MM-DD."
+
+#: core/validators.py:131
+msgid "Enter a valid time in HH:MM format."
+msgstr "יש להזין שעה במבנה HH:MM."
+
+#: core/validators.py:139
+msgid "Enter a valid e-mail address."
+msgstr "יש להזין כתובת דוא\"ל חוקית."
+
+#: core/validators.py:155
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "נא להעלות תמונה חוקית. הקובץ שהעלת אינו תמונה אומכיל תמונה מקולקלת."
+
+#: core/validators.py:162
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "ה-URL %s אנו מצביע לתמונה חוקית."
+
+#: core/validators.py:166
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "מספרי טלפון חייבים להיות במבנה XXX-XXX-XXXX.‏ \"%s\" אינו חוקי."
+
+#: core/validators.py:174
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "ה-URL‏ %s אינו מצביע לסרטון QuickTime חוקי."
+
+#: core/validators.py:178
+msgid "A valid URL is required."
+msgstr "יש להזין URL חוקי."
+
+#: core/validators.py:192
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"יש להזין HTML חוקי. שגיאות ספציפיות:\n"
+"%s"
+
+#: core/validators.py:199
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "מבנה XML שגוי: %s"
+
+#: core/validators.py:209
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL שגוי: %s"
+
+#: core/validators.py:213 core/validators.py:215
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "ה-URL‏ %s הוא קישור שבור."
+
+#: core/validators.py:221
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "יש להזין קיצור חוקי למדינה בארה\"ב."
+
+#: core/validators.py:236
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "שמור על לשונך! המילה %s אסורה לשימוש כאן."
+msgstr[1] "שמור על לשונך! המילים %s אסורות לשימוש כאן."
+
+#: core/validators.py:243
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "תוכן השדה חייב להיות זהה לשדה '%s'."
+
+#: core/validators.py:262
+msgid "Please enter something for at least one field."
+msgstr "יש להזין תוכן בלפחות אחד מהשדות."
+
+#: core/validators.py:271 core/validators.py:282
+msgid "Please enter both fields or leave them both empty."
+msgstr "יש להזין תוכן בשני השדות או להשאיר את שניהם ריקים."
+
+#: core/validators.py:289
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "יש להזין מידע בשדה זה אם שדה %(field)s מכיל %(value)s"
+
+#: core/validators.py:301
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "יש להזין תוכן בשדה זה אם תוכן שדה %(field)s אינו %(value)s"
+
+#: core/validators.py:320
+msgid "Duplicate values are not allowed."
+msgstr "לא ניתן להזין ערכים כפולים."
+
+#: core/validators.py:343
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "ערך זה חייב להיות חזקה של %s."
+
+#: core/validators.py:354
+msgid "Please enter a valid decimal number."
+msgstr "יש להזין מספר עשרוני חוקי."
+
+#: core/validators.py:356
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "נא להזין מספר עשרוני חוקי עם %s ספרה לכל היותר."
+msgstr[1] ""
+"נא להזין מספר עשרוני חוקי עם %s ספרות לכל היותר."
+
+#: core/validators.py:359
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "נא להזין מספר עשרוני חוקי עם %s ספרה אחרי הנקודה לכל היותר."
+msgstr[1] ""
+"נא להזין מספר עשרוני חוקי עם %s ספרות אחרי הנקודה לכל היותר."
+
+#: core/validators.py:369
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "יש להעלות קובץ בגודל %s בתים לפחות."
+
+#: core/validators.py:370
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "יש לוודא שהקובץ שהעלת הוא בגודל %s בתים לכל היותר."
+
+#: core/validators.py:387
+msgid "The format for this field is wrong."
+msgstr "מבנה תוכן שדה זה שגוי."
+
+#: core/validators.py:402
+msgid "This field is invalid."
+msgstr "שדה זה אינו חוקי."
+
+#: core/validators.py:438
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "לא ניתן לאחזר כלום מ %s."
+
+#: core/validators.py:441
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "ה-URL·%(url)s·החזיר כותרת·Content-Type·לא חוקית·'%(contenttype)s'."
+
+#: core/validators.py:474
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr "נא לסגור את תג·%(tag)s·בשורה·%(line)s.·(השורה מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:478
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"חלק מהטקסט בשורה·%(line)s·אסור בהקשר זה.·(השורה·מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:483
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\"·בשורה·%(line)s·אינה תכונה חוקית.·(השורה מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:488
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\"·בשורה·%(line)s·אינו תג חוקי.·(השורה מתחילה ב·\"%(start)s\".)"
+
+#: core/validators.py:492
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"לתג בשורה %(line)s חסרה תכונה אחת או יותר נדרשות. (השורה מתחילה ב-\"%"
+"(start)s\".)"
+
+#: core/validators.py:497
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"לתכונה·\"%(attr)s\"·בשורה·%(line)s·יש ערך לא חוקי.·(השורה·מתחילה ב·\"%(start)"
+"s\".)"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "בנגאלית - Bengali"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "צ'כית - Czech"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "וולשית - Welsh"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "דנית - Danish"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "גרמנית - German"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "יוונית - Greek"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "אנגלית - English"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "ספרדית - Spanish"
+
+#: conf/global_settings.py:45
+msgid "Argentinean Spanish"
+msgstr "ספרדית ארגנטינאית - Argentinean Spanish"
+
+#: conf/global_settings.py:46
+msgid "French"
+msgstr "צרפתית - French"
+
+#: conf/global_settings.py:47
+msgid "Galician"
+msgstr "גאליצית - Galician"
+
+#: conf/global_settings.py:48
+msgid "Hungarian"
+msgstr "הונגרית (Hungarian)"
+
+#: conf/global_settings.py:49
+msgid "Hebrew"
+msgstr "עברית - Hebrew"
+
+#: conf/global_settings.py:50
+msgid "Icelandic"
+msgstr "איסלנדית - Icelandic"
+
+#: conf/global_settings.py:51
+msgid "Italian"
+msgstr "איטלקית - Italian"
+
+#: conf/global_settings.py:52
+msgid "Japanese"
+msgstr "יפנית - Japanese"
+
+#: conf/global_settings.py:53
+msgid "Dutch"
+msgstr "הולנדית - Dutch"
+
+#: conf/global_settings.py:54
+msgid "Norwegian"
+msgstr "נורווגית - Norwegian"
+
+#: conf/global_settings.py:55
+msgid "Brazilian"
+msgstr "ברזילאית - Brazilian"
+
+#: conf/global_settings.py:56
+msgid "Romanian"
+msgstr "רומנית - Romanian"
+
+#: conf/global_settings.py:57
+msgid "Russian"
+msgstr "רוסית - Russian"
+
+#: conf/global_settings.py:58
+msgid "Slovak"
+msgstr "סלובקית - Slovak"
+
+#: conf/global_settings.py:59
+msgid "Slovenian"
+msgstr "סלובנית - Slovenian"
+
+#: conf/global_settings.py:60
+msgid "Serbian"
+msgstr "סרבית - Serbian"
+
+#: conf/global_settings.py:61
+msgid "Swedish"
+msgstr "שוודית - Swedish"
+
+#: conf/global_settings.py:62
+msgid "Ukrainian"
+msgstr "אוקראינית - Ukrainian"
+
+#: conf/global_settings.py:63
+msgid "Simplified Chinese"
+msgstr "סינית פשוטה - Simplified·Chinese"
+
+#: conf/global_settings.py:64
+msgid "Traditional Chinese"
+msgstr "סינית מסורתית - Traditional·Chinese"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "מפתח התחברות (session key)"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "מידע התחברות (session data)"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "תאריך פג תוקף"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "התחברות"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "התחברויות"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "שם מתחם"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "שם לתצוגה"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "אתר"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "אתרים"
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "שם ה-class של מודל פייתון"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "סוג תוכן"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "סוגי תוכן"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "מזהה אובייקט"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "כותרת"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "תגובה"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "דירוג #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "דירוג #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "דירוג #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "דירוג #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "דירוג #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "דירוג #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "דירוג #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "דירוג #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "האם דירוג חוקי"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "תאריך/שעת הגשה"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "ציבורי"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292
+msgid "IP address"
+msgstr "כתובת IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "האם הוסר"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"יש לסמן תיבה זו עבור תגובה לא נאותה. הודעת \"תגובה זו נמחקה\" תוצג במקום."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "תגובות"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "אובייקט תוכן"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"הוגש ע\"י %(user)s ב %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "שם"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "כתובת IP"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "אושר ע\"י הצוות"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "הערה אנונימית"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "הערות אנונימיות"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "ציון"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "תאריך ציון"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "ניקוד קארמה"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "ניקודי קארמה"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d·דירוג ע\"י·%(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"התגובה סומנה ע\"י %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "תאריך סימון"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "סימון ע\"י משתמש"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "סימונים ע\"י משתמש"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "סימון ע\"י %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "תאריך מחיקה"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "מחיקת מודרטור"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "מחיקות מודרטור"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "מחיקת מודרציה ע\"י %r"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "שמך:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:27
+msgid "Comment:"
+msgstr "תגובה:"
+
+#: contrib/comments/templates/comments/freeform.html:9
+#: contrib/comments/templates/comments/form.html:32
+msgid "Preview comment"
+msgstr "תצוגה מקדימה של התגובה"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "שם משתמש:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "סיסמה:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "שכחת את סיסמתך ?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Log out"
+msgstr "יציאה"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "דירוג"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "נדרש"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "אופציונלי"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "שליחת תמונה"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "הדירוג נדרש מאחר והזנת לפחות דרוג אחד אחר."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"התגובה נשלחה ע\"י משתמש אשר שלח פחות מ-%(count)s "
+"תגובה:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"התגובה נשלחה ע\"י משתמש אשר שלח פחות מ-%(count)s "
+"תגובות:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"ההודעה נשלחה ע\"י משתמש מפוקפק:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "רק פעולות POST מותרות"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "אחד או יותר מהשדות הנדרשים אינו נשלח."
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "מישהו התעסק עם טופס התגובה (הפרת אבטחה)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "טופס התגובה הכיל פרמטר target לא חוקי -- מזהה האובייקט אינו חוקי"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "טופס התגובה לא הכיל 'preview' או 'post'"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "משתמשים אנונימיים אינם יכולים להצביע"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "מזהה תגובה שגוי"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "לא ניתן להצביע לעצמך"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>×¢\"×™ %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "הכל"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "כל תאריך"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "היום"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "בשבוע האחרון"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "החודש"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "השנה"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "כן"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "לא"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "לא ידוע"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "זמן פעולה"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "מזהה אובייקט"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "ייצוג אובייקט"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "דגל פעולה"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "הערה לשינוי"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "רישום יומן"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "רישומי יומן"
+
+#: contrib/admin/templatetags/admin_list.py:230
+msgid "All dates"
+msgstr "כל התאריכים"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "הנוכחי."
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "שינוי:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "תאריך:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "שעה:"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/base.html:29
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/invalid_setup.html:4
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "דף הבית"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "תיעוד"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "ייסומניות"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin/base.html:24
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "שינוי סיסמה"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "ייסומוניות תיעוד"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">כדי להתקין ייסומניות, יש לגרור את הקישור לסרגל הסימניות\n"
+"שלך, או קליק ימני והוספה לסימניות. כעת ניתן\n"
+"לבחור את הייסומניה מכל עמוד באתר.  יש לשים לב כי חלק מהייסומניות\n"
+"ניתנות לצפיה רק ממחשב שמסווג\n"
+"כ\"פנימי\" (יש לדבר עם מנהל המערכת שלך אם אינך בטוח/ה\n"
+"שהמחשב מסווג ככזה).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "תיעוד לדף זה"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "מקפיץ אותך מכל עמוד לתיעוד התצוגה שייצרה אותו."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "הצג מזהה אובייקט"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "מציג את סוג התוכן והמזהה הייחודי לעמודים המייצגים אובייקט בודד."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "עריכת אובייקט זה (בחלון הנוכחי)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "קופץ לעמוד הניהול לעמודים אשר מייצגים אובייקטים בודד."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "עריכת אובייקט זה (בחלון חדש)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "כנ\"ל, אך דף הניהול ייפתח בחלון חדש."
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "האם <a href=\"/password_reset/\">שכחת את הסיסמה שלך</a>?"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:23
+msgid "Log in"
+msgstr "כניסה"
+
+#: contrib/admin/templates/admin/submit_line.html:3
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+msgid "Delete"
+msgstr "מחיקה"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "שמירה כחדש"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "שמירה והוספת אחר"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "שמירה והמשך עריכה"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "שמירה"
+
+#: contrib/admin/templates/admin/base.html:24
+msgid "Welcome,"
+msgstr "שלום"
+
+#: contrib/admin/templates/admin/filters.html:4
+msgid "Filter"
+msgstr "סינון"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "בצע"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "1 result"
+msgid_plural "%(counter)s results"
+msgstr[0] "תוצאה אחת"
+msgstr[1] "%(counter)s תוצאות"
+
+#: contrib/admin/templates/admin/search_form.html:10
+#, python-format
+msgid "%(full_result_count)s total"
+msgstr "%(full_result_count)s סה\"כ"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "היסטוריה"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "תאריך/שעה"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "משתמש"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "פעולה"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "l d.m.y H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"לאובייקט זה אין היסטוריית שינוי. כנראה לא השתמשו בממשק הניהול הזה להוספתו."
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "הוספה"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "צפיה באתר"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "נא לתקן את השגיאה המופיעה מתחת."
+msgstr[1] "נא לתקן את השגיאות המופיעות מתחת."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "מיון"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "מיון:"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "ניהול אתר Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "ניהול Django"
+
+#: contrib/admin/templates/admin/pagination.html:10
+msgid "Show all"
+msgstr "הצג הכל"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "דף לא קיים"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "אנו מצטערים, לא ניתן למצוא את הדף המבוקש."
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " לפי %(title)s "
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"מחיקת %(object_name)s '%(object)s' תמחק אובייקטים קשורים, אך לחשבון שלך אין "
+"הרשאות למחיקת אובייקטים מהסוג הבא:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"האם ברצונך למחוק את %(object_name)s·\"%(object)s\"? כלהפריטים הקשורים הבאים "
+"יימחקו:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "כן, אני בטוח/ה"
+
+#: contrib/admin/templates/admin/invalid_setup.html:8
+msgid ""
+"Something's wrong with your database installation. Make sure the appropriate "
+"database tables have been created, and make sure the database is readable by "
+"the appropriate user."
+msgstr ""
+"משהו שגוי בהתקנת בסיס הנתונים שלך. נא לוודא שנוצרו טבלאות בסיס הנתונים "
+"המתאימות, ובסיס הנתונים ניתן לקריאה על ידי המשתמש המתאים."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "מודלים זמינים ביישום %(name)s."
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "שינוי"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "אין לך הרשאות לעריכה"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "פעולות אחרונות"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "הפעולות שלי"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "לא נמצאו"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "שגיאת שרת"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "שגיאת שרת (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "שגיאת שרת <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"התרחשה שגיאה. היא דווחה למנהלי האתר בדוא\"ל ותתוקן בקרוב. תודה על סבלנותך."
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "הוספת %(name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "הודעה זו התקבלה כי ביקשת איפוס סיסמה"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "עבור חשבון המשתמש שלך ב %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "סיסמתך החדשה: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "ניתן לשנות את הסיסמה בכל עת ע\"י פניה לדף זה:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "שם המשתמש שלך, במקרה ששכחת:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "תודה על השימוש באתר שלנו!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "צוות %(site_name)s"
+
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "שינוי סיסמה"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"נא להזין את סיסמתך הישנה, למען האבטחה, ולאחר מכן את סיסמתךהחדשה פעמיים כדי "
+"שנוכל לוודא שהקלדת אותה כראוי."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "סיסמה ישנה:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "סיסמה חדשה:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "אימות סיסמה:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "שנה את סיסמתי"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "הסיסמה שונתה בהצלחה"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "סיסמתך שונתה."
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "תודה על בילוי זמן איכות עם האתר."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "התחבר/י שוב"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "איפוס סיסמה"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "הסיסמה אופסה בהצלחה"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"שלחנו את הסיסמה החדשה לכתובת הדוא\"ל שהזנת. היא אמורה להתקבל תוך זמן קצר."
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"שכחת את סיסמתך ? נא להזין את כתובת הדוא\"ל מתחת, אנו נאפסאת הסיסמה ונשלח את "
+"החדשה אליך."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "כתובת דוא\"ל:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "אפס את סיסמתי"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300
+msgid "Integer"
+msgstr "מספר שלם"
+
+#: contrib/admin/views/doc.py:280
+msgid "Boolean (Either True or False)"
+msgstr "בוליאני (אמת או שקר)"
+
+#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "מחרוזת (עד %(maxlength)s תווים)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Comma-separated integers"
+msgstr "מספרים שלמים מופרדים בפסיקים"
+
+#: contrib/admin/views/doc.py:283
+msgid "Date (without time)"
+msgstr "תאריך (ללא שעה)"
+
+#: contrib/admin/views/doc.py:284
+msgid "Date (with time)"
+msgstr "תאריך (כולל שעה)"
+
+#: contrib/admin/views/doc.py:285
+msgid "E-mail address"
+msgstr "כתובת דוא\"ל"
+
+#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:290
+msgid "File path"
+msgstr "נתיב קובץ"
+
+#: contrib/admin/views/doc.py:288
+msgid "Decimal number"
+msgstr "מספר עשרוני"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True, False or None)"
+msgstr "בוליאני (אמת, שקר או כלום)"
+
+#: contrib/admin/views/doc.py:295
+msgid "Relation to parent model"
+msgstr "יחס למודל אב"
+
+#: contrib/admin/views/doc.py:296
+msgid "Phone number"
+msgstr "מספר טלפון"
+
+#: contrib/admin/views/doc.py:301
+msgid "Text"
+msgstr "טקסט"
+
+#: contrib/admin/views/doc.py:302
+msgid "Time"
+msgstr "זמן"
+
+#: contrib/admin/views/doc.py:303 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:304
+msgid "U.S. state (two uppercase letters)"
+msgstr "מדינה בארה\"ב (שתי אותיות גדולות)"
+
+#: contrib/admin/views/doc.py:305
+msgid "XML text"
+msgstr "טקסט XML"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "ניהול אתר"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "ניתן לערוך שוב מתחת"
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "ניתן להוסיף %s נוסף מתחת."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "הוספת %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s התווסף."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "ו"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "%s שונה."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s נמחק."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "אף שדה לא השתנה."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "שינוי %(name)s \"%(obj)s\" בוצע בהצלחה."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "הוספת %(name)s \"%(obj)s\" בוצעה בהצלחה. ניתן לערוך אותו שוב מתחת."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "שינוי %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "אחד או יותר %(fieldname)s ב%(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "אחד או יותר %(fieldname)s ב%(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "מחיקת %(name)s \"%(obj)s\" בוצעה בהצלחה."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "האם את/ה בטוח/ה ?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "היסטוריית שינוי: %s"
+
+#: contrib/admin/views/main.py:567
+#, python-format
+msgid "Select %s"
+msgstr "בחירת %s"
+
+#: contrib/admin/views/main.py:567
+#, python-format
+msgid "Select %s to change"
+msgstr "בחירת %s לשינוי"
+
+#: contrib/admin/views/main.py:743
+msgid "Database error"
+msgstr "שגיאת בסיס נתונים"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:43
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"נא להזין שם משתמש וסיסמה נכונים. בשני השדות גודל האותיות האנגליות משנה."
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"נא להתחבר שוב, מאחר ופג תוקף ההתחברות הנוכחית. אל דאגה: המידע ששלחת נשמר."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"נראה שהדפדפן שלך אינו מוגדר לקבל עוגיות. נא לאפשר עוגיות, לטעון מחדש את הדף "
+"ולנסות שוב."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "שם משתמש אינו יכול להכיל את התו '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "כתובת הדוא\"ל שלך אינה שם המשתמש שלך. נסה/י '%s' במקום."
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "הפניה מ"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "זה אמור להיות נתיב מלא, ללא שם המתחם. לדוגמא: '‎/events/search'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "הפניה אל"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "יכול להיות נתיב מלא (כנ\"ל) או URL מלא המתחיל ב'http://'."
+
+#: contrib/redirects/models.py:13
+msgid "redirect"
+msgstr "הפניה"
+
+#: contrib/redirects/models.py:14
+msgid "redirects"
+msgstr "הפניות"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "נראה שעוגיות לא מאופשרות בדפדפן שלך.הן נדרשות כדי להתחבר."
+
+#: contrib/auth/forms.py:45
+msgid "This account is inactive."
+msgstr "חשבון זה אינו פעיל."
+
+#: contrib/auth/views.py:39
+msgid "Logged out"
+msgstr "יצאת מהמערכת"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "שם"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "שם קוד"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "הרשאה"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "הרשאות"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "קבוצה"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "קבוצות"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "שם משתמש"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "שם פרטי"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "שם משפחה"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "כתובת דוא\"ל"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "סיסמה"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "השתמש ב '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "סטטוס איש צוות"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "מציין האם המשתמש יכול להתחבר לאתר הניהול."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "פעיל"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "סטטוס משתמש על"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "כניסה אחרונה"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "תאריך הצטרפות"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"בנוסף לכל ההרשאות שהוקצו ידנית, יוענקו למשתמש גם כל ההרשאות של כל קבוצה "
+"המשוייכת אליו."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "הרשאות משתמש"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "משתמש"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "משתמשים"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "מידע אישי"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "הרשאות"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "תאריכים חשובים"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "קבוצות"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "הודעה"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"לדוגמא: '/about/contact/'. יש לוודא הימצאות הקווים הנטויים בהתחלה ובסוף."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "כותרת"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "תוכן"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "אפשר תגובות"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "שם תבנית"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"דוגמא: 'flatpages/contact_page'. האם אינו קיים, המערכתתשתמש ב 'flatpages/"
+"default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "הרשמה נדרשת"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "אם זה מסומך, רק משתמשים מחוברים יוכלו לצפות בדף."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "דף פשוט"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "דפים פשוטים"
+

Added: vendor/django/current/django/conf/locale/he/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/he/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/he/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/he/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/he/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,111 @@
+# Hebrew translation of djangojs.
+# Copyright (C) 2006 THE djangojs'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the djangojs package.
+# Meir Kriheli <meir at mksoft.co.il>, 2006.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: djangojs 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-03-30 13:28+0200\n"
+"PO-Revision-Date: 2006-03-30 13:35+0200\n"
+"Last-Translator: Meir Kriheli <meir at mksoft.co.il>\n"
+"Language-Team: Hebrew\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: 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 ""
+"ינואר פברואר מרץ אפריל מאי יוני יולי אוגוסט ספטמבר אוקטובר נובמבר דצמבר"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "ראשון שני שלישי רביעי חמישי שישי שבת"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s זמינות"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "בחירת הכל"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "הוספה"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "הסרה"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s נבחרות"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "יש לסמן את ההרשאות המבוקשות וללחוץ על "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "איפוס הכל"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "ר ש ש ר ח ש ש"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "כעת"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "שעון"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "בחירת שעה"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "חצות"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 בבוקר"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "צהריים"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "ביטול"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "היום"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "לוח שנה"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "אתמול"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "מחר"
+

Added: vendor/django/current/django/conf/locale/hu/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/hu/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/hu/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/hu/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/hu/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2022 @@
+# translation of django.po to 
+# translation of django.po to
+# translation of django.po to
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Nagy Károly <charlie at rendszergazda.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:14+0200\n"
+"PO-Revision-Date: 2006-05-10 12:13+0200\n"
+"Last-Translator: Nagy Károly <charlie at rendszergazda.com>\n"
+"Language-Team:  <hu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "objektum ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "címsor"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "megjegyzés"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "besorolás #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "besorolás #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "besorolás #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "besorolás #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "besorolás #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "besorolás #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "besorolás #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "besorolás #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "érvényes besorolás"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "dátum/idő beállítva"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "publikus"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP szám"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "eltávolítva"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Jelöld be a négyzetet, ha a megjegyzés nem megfelelő. Az \"Ezt a megjegyzést "
+"törölték\" üzenet fog megjelenni helyette."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "megjegyzés"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Tartalom objektum"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Beküldte %(user)s %(date)s -kor\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "személy neve"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP cím"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "személyzet által elfogadva"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Szabad megjegyzés"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Szabad megjegyzések"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "értékelés"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "értékelés dátuma"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Karma értékelés"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Karma értékelése"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d értékelés %(user)s -tól"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ezt a megjegyzést %(user)s jelölte meg:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "jelölés dátuma"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Felhasználó jelölése"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Felhasználó jelölései"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Megjelölte %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "törlés dátuma"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Moderátor törlése"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Moderátor törlései"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Moderátor törlés %r által"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Ismeretlen felhasználó nem szavazhat"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Érvénytelen megjegyzés ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Nem szavazhatsz magadra"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Ez az értékelés szükséges, mert legalább még egy értékelés kell."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ezt a megjegyzést olyan felhasználó küldte akinek kevesebb mint %(count)s "
+"megjegyzése van:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ezeket a megjegyzéseket olyan felhasználó küldte akinek kevesebb mint %"
+"(count)s megjegyzése van:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ezt a megjegyzést egy nem értékelt felhasználó küldte:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Csak POST engedélyezett"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Egy vagy több kötelező mező nincs kitöltve"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Valaki megváltoztatta a megjegyzés űrlapot (biztonság megsértése)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"A megjegyzés űrlap érvénytelen 'target' paramétert tartalmaz -- az objektum "
+"ID-je érvénytelen volt"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "A megjegyzés űrlap nem biztosít sem 'preview' -t sem 'post' -ot."
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Felhasználó:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Jelszó:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Elfelejtetted a jelszavad?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Kijelentkezés"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Értékelések"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Kötelező"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcionális"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Fénykép beküldése"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Megjegyzés:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Megjegyzés előnézete"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Neved:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Szerző %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Mind"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Bármely dátum"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Ma"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Utolsó 7 nap"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Ez a hónap"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Ez az év"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Igen"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nem"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "művelet időpontja"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objektum id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objektum repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "művelet jelölés"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "üzenet megváltoztatása"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "naplóbejegyzés"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "naplóbejegyzések"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Minden dátum"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Kérlek írd be a helyes felhasználónevet és jelszót. Mindkét mező kisbetű-"
+"nagybetű érzékeny."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Bejelentkezés"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Kérlek jelentkezz be újra, mert a munkameneted végetért. Ne aggódj, minden "
+"beküldött adatod el van mentve."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Úgy tűnik a böngésződön nincs engedélyezve a cookie-k fogadása. Kérlek "
+"engedélyezd és töltsd újra az oldalt!"
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "A felhasználónév nem tartalmazhat '@' karaktert."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Az email címed nem a felhasználóneved. Próbáld a(z) '%s' inkább."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Honlap karbantartás"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "A(z) %(name)s \"%(obj)s\" sikeresen hozzáadva."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Alább ismét szerkesztheted."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Alább hozzáadhatsz egy másik %s -t."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "%s hozzáadása"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s hozzáadva."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "és"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "%s megváltoztatva."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s törölve."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Egy mező sem változott."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "A(z) %(name)s \"%(obj)s\" sikeresen megváltoztatva."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"A(z) %(name)s \"%(obj)s\" sikeresen hozzáadva. Alább ismét szerkesztheted."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "%s megváltoztatása"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Egy vagy több %(fieldname)s a(z) %(name)s -ban: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Egy vagy több %(fieldname)s a(z) %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "A(z) %(name)s \"%(obj)s\" sikeresen törölve."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Biztos vagy benne?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Változások története: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Kiválasztás %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Válaszd a(z) %s a változtatáshoz"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Egész"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Logikai (True vagy False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Karakterlánc (%(maxlength)s hosszig)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Vesszővel elválasztott egészek"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Dátum (idő nélkül)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Dátum (idővel)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mail cím"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Elérési út"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Tizes számrendszerű szám"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Logikai (True, False vagy None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Szülőkapcsolat"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefonszám"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Szöveg"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Idő"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "USA állam (két nagybetű)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML szöveg"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentáció"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Jelszó megváltoztatása"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Kezdőlap"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Történet"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dátum/idő"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Felhasználó"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Művelet"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Az objektumnak nincs változási története. Valószínűleg nem ezen a "
+"karbantartó oldalon lett rögzítve."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django honlap adminisztráció"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django adminisztráció"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Szerver hiba"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Szerver hiba (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Szerver hiba <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Hiba történt, melyet e-mailben jelentettünk az oldal karbantartójának. A "
+"rendszer remélhetően hamar megjavul, köszönjük a türelmedet."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Nincs ilyen oldal"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Sajnáljuk, a kért oldalt nem találjuk."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Hozzáadás"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Változtatás"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nincs jogod szerkeszteni."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Utóbbi műveletek"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Az én műveleteim"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nincs elérhető"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s hozzáadása"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Csak nem <a href=\"/password_reset/\">elfelejtetted a jelszavadat</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Üdvözöllek,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Törlés"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"A(z) %(object_name)s '%(object)s' törlése a kapcsolódó objektumok törlését "
+"is eredményezi, de a hozzáférésed nem engedi a következő típusú objektumok "
+"törlését:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Biztos hogy törlöd a(z) %(object_name)s \"%(object)s\"? A összes következő "
+"kapcsolódó elem is törlődik:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Igen, biztos vagyok benne"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Szerző %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Mehet"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Megtekintés a honlapon"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Kérlek javítsd az alábbi hibát."
+msgstr[1] "Kérlek javítsd az alábbi hibákat."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Rendezés"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Rendezettség:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Mentés újként"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Mentés és másik hozzáadása"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Mentés és a szerkesztés folytatása"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Mentés"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Jelszó változtatása"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Sikeres jelszóváltoztatás"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Jelszavad megváltozott."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Jelszó törlés"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Elfelejtetted a jelszavad? Írd be az e-mail címed, mi töröljük a jelszavad "
+"és az újat e-mailben elküldjük neked."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail cím:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Jelszavam törlése"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Köszönjük hogy egy kis időt töltöttél a honlapunkon."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Jelentkezz be újra"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Sikeres jelszótörlés"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "Új jelszavadat elküldtük e-mailben. Hamarosan meg kell kapnod."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Írd be a régi jelszavad biztonsági okokból, majd az újat kétszer, hogy "
+"biztosan ne gépeld el."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Régi jelszó:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Új jelszó:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Jelszó megerősítése:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Jelszavam megváltoztatása"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ezt az e-mail-t azért kaptad, mert jelszótörlést kértél"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "hozzáférésedhez a következő honlapon: %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Új jelszavad: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Bármikor megváltoztathatod a jelszavad a következő oldalon:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Felhasználóneved, ha elfelejtetted volna:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Köszönjük, hogy használtad honlapunkat!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "A %(site_name)s csapata"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Könyvjelzők"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentum könyvjelzők"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">A könyvjelzők felvételéhez húzd a könyvjelzők linkjét az "
+"eszköztárra, vagy kattints rájuk jobb egérgombot és úgy add hozzá. Ezután \n"
+"már ki tudod választani a könyvjelzőt a honlap bármely oldaláról. A "
+"könyvjelzők között néhány oldal csak 'belső' gépekről nézhető meg.\n"
+"(Beszélj a rendszergazdával hogy a te géped 'belső' gép-e.).</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Az oldal dokumentációja"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Bármely oldalról annak a nézetnek a dokumentációjára ugrik, mely a kérdéses "
+"oldalt generálta."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Az objektum ID kijelzése"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Az objektum által reprezentált oldalak 'content-type' és 'unique ID' "
+"értékeit mutatja."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Objektum szerkesztése (aktuális ablakban)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Az objektumhoz tartozó oldalak adminisztrációjához ugrik."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Objektum szerkesztése (új ablakban)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Mint fentebb, de az adminisztrációs oldalt új ablakban nyitja."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dátum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Idő:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Éppen:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Változás:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "átirányítva innen"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ennek abszolút elérési útnak kell lennie, a domén név nélkül. Példa: '/"
+"events/search/'"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "átirányítva ide"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ennek vagy abszolút elérési útnak kell lennie (mint fentebb) vagy teljes URL-"
+"nek 'http://' -vel kezdve."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "átirányítás"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "átirányít"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Például: '/about/contact/'. Figyelj a nyitó és záró perjelre!"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "cím"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "tartalom"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "megjegyzések engedélyezése"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "sablon neve"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Példa: 'flatpages/contact_page'. Ha ez nem létezik, a rendszer a 'flatpages/"
+"default' -ot használja."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "regisztráció szükséges"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Ha ez be van jelölve, csak bejelentkezett felhasználó tudja az oldalt "
+"megnézni."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "egyszerű oldal"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "egyszerű oldalak"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "név"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "kódnév"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Engedély"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Engedélyek"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Csoport"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Csoportok"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "felhasználónév"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "keresztnév"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "vezetéknév"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mail cím"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "jelszó"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Használat '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "Személyzet státusa"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"Megadja hogy a felhasználó bejelentkezhet-e erre az adminisztrációs oldalra."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktív"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "rendszergazda státusz"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "utolsó bejelentkezés"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "csatlakozás dátuma"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"A kézzel beállított jogosultságok mellett a felhasználó a csoportjának a "
+"jogait is megkapja."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Engedélyek"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Felhasználó"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Felhasználók"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Személyes információ"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Engedélyek"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Fontos dátumok"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Csoportok"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Ãœzenet"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"A böngésződ úgy tűnik nem támogatja a cookie-kat. A cookie-k engedélyezése "
+"szükséges a bejelentkezéshez."
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "python modul név"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tartalom típusa"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tartalom típusok"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "munkamenet kulcs"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "munkamenet adat"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "lejárat dátuma"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "munkamenet"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "munkamenetek"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domén neve"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "megjelenő név"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "honlap"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "honlapok"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Hétfő"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Kedd"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Szerda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Csütörtök"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Péntek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Szombat"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Vasárnap"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Január"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Február"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Március"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Április"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Május"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Június"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Július"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Augusztus"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Szeptember"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Október"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "December"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "és"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "nap"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Szept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "év"
+msgstr[1] "évek"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "hónap"
+msgstr[1] "hónapok"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "nap"
+msgstr[1] "napok"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "óra"
+msgstr[1] "órák"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "perc"
+msgstr[1] "percek"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengáli"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Cseh"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Walesi"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Dán"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Német"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Angol"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spanyol"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francia"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Gall"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Izlandi"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Olasz"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japán"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Holland"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norvég"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brazil"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Román"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Orosz"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Szlovák"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Szlovák"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Szerb"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Svéd"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brazil"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Egyszerű kínai"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Hagyományos kínai"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Az érték csak betűket, számokat és alulvonást tartalmazhat."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Az érték csak betűket, számokat, alulvonást és perjelet tartalmazhat."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Nagybetűk itt nem megengedettek."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Kisbetűk itt nem megengedettek."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Csak számokat adj meg, vesszőkkel elválasztva."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Érvényes e-mail címeket adja meg, vesszőkkel elválasztva."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Írj be egy érvényes IP címet."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Üres érték itt nem megengedett."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Nem szám karakterek itt nem megengedettek."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Ez az érték nem tartalmazhat kizárólag számokat."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Adj meg egy egész számot."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Itt csak betűk megengedettek."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Írj be egy érvényes dátumot 'ÉÉÉÉ-HH-NN' alakban."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Írj be egy érvényes időt 'ÓÓ:PP' alakban."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Írj be egy érvényes dátumot/időt 'ÉÉÉÉ-HH-NN ÓÓ-PP' alakban."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Írj be egy érvényes e-mail címet."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Tölts fel egy érvényes képfájlt. A feltöltött fájl vagy nem kép volt vagy "
+"megsérült."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "A(z) %s URL nem érvényes képfájlra mutat."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"A telefonszámoknak 'XXX-XXX-XXXX' formátumúnak kell lennie. \"%s\" "
+"érvénytelen."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "A(z) %s URL nem érvényes QuickTime videóra mutat."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Érvényes URL szükséges."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Érvényes HTML kell. A hiba:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Rosszul formázott XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Érvénytelen URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "A(z) %s URL egy rossz link."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Írj be egy érvényes USA állam rövidítést."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Vigyázz a szádra! Az ilyen szavak (%s) itt nem megengedettek."
+msgstr[1] "Vigyázz a szádra! Az ilyen szavak (%s) itt nem megengedettek."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "A mezőnek egyeznie kell a(z) %s mezővel."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Írj be valamit legalább egy mezőbe."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Töltsd ki mindkét mezőt vagy hagyd üresen mindkettőt."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ezt a mezőt meg kell adni, ha %(field)s értéke %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ezt a mezőt meg kell adni, ha %(field)s értéke nem %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Ugyanazok az értékek nem megengedettek."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Az értéknek %s hatványának kell lennie."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Írj be egy érvényes tizes számrendszerű számot."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Írj be egy legalább %s jegyű érvényes tizes számrendszerű számot."
+msgstr[1] "Írj be egy legalább %s jegyű érvényes tizes számrendszerű számot."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Írj be egy érvényes tizes számrendszerű számot, legfeljebb %s tizedessel."
+msgstr[1] ""
+"Írj be egy érvényes tizes számrendszerű számot, legfeljebb %s tizedessel."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "A feltöltött fájlod legalább %s bájt méretű legyen."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "A feltöltött fájlod legfeljebb %s bájt méretű legyen."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Ennek a mezőnek a formátuma rossz."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "A mező érvénytelen."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nem lehet semmit kinyerni %s -ból."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"A(z) %(url)s URL érvénytelen Content-Type fejlécet adott vissza '%"
+"(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Zárd le a nyitott %(tag)s címkét a %(line)s sorban. (A sor kezdete: \"%"
+"(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Valamely szöveg a(z) %(line)s sorban nem megengedett ebben a környezetben. "
+"(A sor kezdete: \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" a(z) %(line)s sorban érvénytelen tulajdonság. (A sor kezdete: "
+"\"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" a(z) %(line)s sorban érvénytelen címke. (A sor kezdete: \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A %(line)s sorban lévő címkéről hiányzik egy vagy több kötelező tulajdonság. "
+"(A sor kezdete: \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"A(z) \"%(attr)s\" jellemző a %(line)s sorban érvénytelen. (A sor kezdete: \"%"
+"(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s ezzel a(z) %(type)s már létezik az adott %(field)s -nél."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s ezzel a(z) %(fieldname)s már létezik."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Kötelező mező."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Az értéknek %s hatványának kell lennie."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Az értéknek %s hatványának kell lennie."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "A mező érvénytelen."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Adj meg egy érvényes fájlnevet."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Írj be érvényes %s -t."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Az ID-ket vesszőkkel válaszd el."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Tartsd lenyomva a \"Control\"-t (vagy Mac-en a \"Command\"-ot) több elem "
+"kiválasztásához."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Kérlek írj be érvényes %(self)s ID-t. A mostani érték %(value)r érvénytelen."
+msgstr[1] ""
+"Kérlek írj be érvényes %(self)s ID-ket. A mostani értékek %(value)r "
+"érvénytelenek."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "A szövegnek kevesebbnek kell lennie %s karakternél."
+msgstr[1] "A szövegnek kevesebbnek kell lennie %s karakternél."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Sortörések itt nem megengedettek."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Válassz érvényes elemet, '%(data)s' nincs a(z) %(choices)s között."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "A küldött fájl üres."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Írj be egy számot -32,768 és 32,767 között."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Írj be egy pozitív számot."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Írj be egy egész számot 0 and 32,767 között."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "igen, nem, talán"
+
+#~ msgid "Comment"
+#~ msgstr "Megjegyzés"
+
+#~ msgid "Comments"
+#~ msgstr "Megjegyzések"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Karakterlánc (50 karakterig)"
+
+#~ msgid "label"
+#~ msgstr "címke"
+
+#~ msgid "package"
+#~ msgstr "csomag"
+
+#~ msgid "packages"
+#~ msgstr "csomagok"

Added: vendor/django/current/django/conf/locale/hu/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/hu/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/hu/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/hu/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/hu/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# translation of djangojs.po to 
+# This file is distributed under the same license as the PACKAGE package.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER.
+# Nagy Károly <charlie at rendszergazda.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: djangojs\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-05-10 11:59+0200\n"
+"Last-Translator: Nagy Károly <charlie at rendszergazda.com>\n"
+"Language-Team:  <hu at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9.1\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Elérhető %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Mindent kijelöl"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Hozzáad"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Eltávolít"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s kiválasztva"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Válaszd ki a kért elemeket és kattints"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Összes törlése"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Január Február Március Április Május Június Július Szeptember Október November December"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Vasárnap Hétfő Kedd Szerda Csütörtök Péntek Szombat"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "V H K Sz Cs P Szo"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Most"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Óra"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Válaszd ki az időt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Éjfél"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "Reggel 6 óra"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Dél"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Mégsem"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Ma"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Naptár"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Tegnap"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Holnap"
+

Added: vendor/django/current/django/conf/locale/is/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/is/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/is/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/is/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/is/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2042 @@
+#  translation of Django.
+# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Dagur Páll Ammendrup <dagurp at gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2006-05-11 00:02+0000\n"
+"Last-Translator: Dagur Páll Ammendrup <dagurp at gmail.com>\n"
+"Language-Team:  <dagurp at gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "kenni hlutar"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "fyrirsögn"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "athugasemd"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "einkunn #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "einkunn #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "einkunn #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "einkunn #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "einkunn #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "einkunn #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "einkunn #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "einkunn #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "er gild einkunn"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "innsent dags/tími"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "er öllum sýnilegt"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP tala"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "hefur verið fjarlægt"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Hakaðu við þennan reit ef athugasemdin er óviðeigandi. Skilaboðin „Þessi "
+"athugasemd hefur verið fjarlægð“ birtist í staðinn."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "athugasemd"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#, fuzzy
+msgid "Content object"
+msgstr "Efnishlutur"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s sendi inn %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nafn einstaklings"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP tala"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "samþykkt af umsjónarmönnum"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Frjáls athugasemd"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Frjálsar athugasemdir"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "stig"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "dagsetning stigagjafar"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Karma stig"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Karma stig"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d stig frá %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Þessi athugasemd var veifuð af %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "Dagsetning veifu"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Notandaveifa"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Notendaveifur"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Veifað af %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "eytt dags."
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Eytt af umsjónarmanni"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Eytt af umsjónarmönnum"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Eytt af umsjónarmanni %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Ónafngreindir notendur geta ekki kosið"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Ógilt kenni á athugasemd"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Þú getur ekki kosið sjálfa(n) þig"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Þessi stigagjöf er nauðsynleg vegna þess að þú gafst að minnsta kosti eina "
+"aðra einkunn."
+
+#: contrib/comments/views/comments.py:112
+#, fuzzy, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Þessi athugasemd var send inn af vafasömum notanda:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Þessi athugasemd var send inn af vafasömum notanda:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Þessi athugasemd var send inn af vafasömum notanda:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Eingöngu POST eru leyfð"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Einn eða fleiri nauðsynlegir reitir voru ekki fylltir"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Einhver átti við athugasemdaformið (öryggisbrot)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Athugasemdaformið hafði ógildan 'target' stika -- kenni hlutarins var ógilt"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Athugasemdaformið útvegaði ekki annað hvort 'forskoða' eða 'senda'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Notandanafn:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Lykilorð:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Gleymdir þú lykilorðinu þínu?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Skrá út"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Einkunnir"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Nauðsynlegt"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Valfrjálst"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Sendu inn ljósmynd"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Athugasemd:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Forskoða athugasemd"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Nafnið þitt:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Frá %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Allt"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Allar dagsetningar"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Dagurinn í dag"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Síðustu 7 dagar"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Þessi mánuður"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Þetta ár"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Já"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nei"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Óþekkt"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "tími aðgerðar"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "kenni hlutar"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "framsetning hlutar"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "aðgerðarveifa"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "breyta skilaboði"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "kladdafærsla"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "kladdafærslur"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Allar dagsetningar"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Vinsamlegast sláðu inn rétt notandanafn og lykilorð. Athugaðu að báðir "
+"reitirnir þurfa að vera stafréttir."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Skrá inn"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Vinsamlegast skráðu þig inn aftur vegna þess að setan þín rann út. Engar "
+"áhyggjur, breytingin þín var vistuð."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Vafri þinn virðist ekki vera stilltur til að leyfa dúsur (cookies). "
+"Vinsamlegast gerðu dúsur virkar, endurhladdu þessa síðu og reyndu aftur."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Notendanöfn geta ekki innihaldið '@' merkið."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Tölvupóstfangið þitt er ekki notandanafnið þitt. Prófaðu '%s' í staðinn."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Vefstjórn"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s „%(obj)s“ var bætt við."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Þú getur breytt því aftur að neðan."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Þú getur bætt öðru %s við að neðan."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Bæta við %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Bætti við %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "og"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Breytti %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Eyddi %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Engum reitum breytt."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s „%(obj)s“ hefur verið breytt."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s „%(obj)s“ hefur verið bætt við. Þú getur breytt því aftur að neðan."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Breyta %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Eitt eða fleiri %(fieldname)s í %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Eitt eða fleiri %(fieldname)s í %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s „%(obj)s“ var eytt."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Ertu viss?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Breytingarsaga: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Veldu %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Veldu %s til að breyta"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Heiltala"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Boole-gildi (True eða False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Strengur (mest %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Kommuaðgreindar heiltölur"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Dagsetning (án tíma)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Dagsetning (með tíma)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Tölvupóstfang"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Slóð"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Tugatala"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Boole-gildi (True, False eða None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Tengsl við yfirlíkan"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Símanúmer"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Texti"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Tími"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "Veffang"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Bandarískt fylki (tveir hástafir)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML texti"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Skjölun"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Breyta lykilorði"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Heim"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Saga"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dagsetning/tími"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Notandi"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Aðgerð"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Þessi hlutur hefur enga breytingasögu. Hann var líklega ekki búinn til á "
+"þessu stjórnunarsvæði."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django vefstjóri"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django vefstjórn"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Kerfisvilla"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Kerfisvilla (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Kerfisvilla <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Villa hefur komið upp. Hún hefur verið tilkynnt vefstjórunum með tölvupósti "
+"og verður örugglega löguð fljótlega. Við þökkum þolinmæðina."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Síða fannst ekki"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Því miður fannst umbeðin síða ekki."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Bæta við"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Breyta"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Þú hefur ekki réttindi til að breyta neinu"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Nýlega framkvæmdar aðgerðir"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Aðgerðir mínar"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Engin fáanleg"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Bæta við %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Gleymdir þú lykilorðinu</a> þínu?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Velkomin(n),"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Eyða"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Eyðing á %(object_name)s „%(object)s“ hefði í för með sér eyðingu á tengdum "
+"hlutum en þú hefur ekki réttindi til að eyða eftirfarandi hlutum:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Ertu viss um að þú viljir eyða %(object_name)s „%(object)s“? Öllu "
+"eftirfarandi verður eytt:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Já ég er viss."
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "Eftir %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Áfram"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Skoða á vef"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Vinsamlegast leiðréttu villuna hér að neðan:"
+msgstr[1] "Vinsamlegast leiðréttu villurnar hér að neðan:"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Röðun"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Röð:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Vista sem nýtt"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Vista og búa til aðra"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Vista og halda áfram að breyta"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Vista"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Breyta lykilorði"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Breyting á lykilorði tókst"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Lykilorði þínu var breytt"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Endurstilla lykilorð"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Gleymdir þú lykilorðinu þínu? Sláðu tölvupóstfangið þitt inn að neðan og við "
+"munum endurstilla lykilorðið þitt og senda til þín."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Tölvupóstfang:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Endursstilla lykilorðið mitt"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Takk fyrir að verja tíma í vefsíðuna í dag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Skráðu þig inn aftur"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Endurstilling á lykilorði tókst"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Við sendum nýtt lykilorð á tölvupóstfangið sem þú gafst upp. Það ætti að "
+"berast fljótlega til þín."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Vinsamlegast skrifaðu gamla lykilorðið þitt til öryggis. Sláðu svo nýja "
+"lykilorðið tvisvar inn svo að hægt sé að ganga úr skugga um að þú hafir ekki "
+"gert innsláttarvillu."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Gamla lykilorðið:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nýja lykilorðið:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Staðfesta lykilorð:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Breyta lykilorðinu mínu"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Þú fékkst þennan tölvupóst vegna þess að þú baðst um endurstillingu á "
+"lykilorðinu þínu"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "fyrir notandareikning þinn á %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Nýja lykilorðið þitt er: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Þér er frjálst að breyta lykilorðinu með því að fara á þessa síðu:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Notandanafnið þitt ef þú skyldir hafa gleymt því:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Takk fyrir að nota vefinn okkar!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s hópurinn"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bókamerklar"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Skjölunarbókamerklar"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+#, fuzzy
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Til að setja upp bókamerkil (Bookmarklet) þarftu að draga "
+"tengilinn\n"
+"í bókamerkjareinina þína eða hægrismella á tengilinn og bæta honum við "
+"bókamerkin þín\n"
+"Nú getur þú notað bókamerkilinn frá hvaða síðu sem er innan vefjarins. "
+"Athugaðu að sumir\n"
+"þessara bókamerkla krefjast þess að þú sért að skoða vefinn frá tölvu sem "
+"er\n"
+"skráð sem \"internal\" (hafðu samband við kerfisstjórann ef þú ert óviss "
+"hvort tölvan þín er \"internal\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Skjölun þessarar síðu"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Sendir þig af hvaða síðu sem er á skjölun þess framsetningarlags sem myndar "
+"hana."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Sýna kenni hlutar"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "Sýnir efnistag og sérkenni síða sem gefa tiltekna mynd af stökum hlut."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Breyta þessum hlut (í þessum glugga)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Stekkur á stjórnunarsíðuna fyrir þær síður sem gefa tiltekna mynd af stökum "
+"hlut."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Breyta þessum hlut (nýr gluggi)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Eins og að ofan en opnar stjórnunarsíðuna í nýjum glugga."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dagsetning:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Tími:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Eins og er:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Breyta:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "vísun frá"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "Þetta þarf að vera full slóð án lénsins. Dæmi: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "vísa á"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Þetta getur verið full slóð (eins og hér að ofan) eða veffang með 'http://' "
+"fremst."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "vísun"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "vísanir"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Dæmi: '/about/contact/'. Passaðu að hafa skástrik fremst og aftast."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titill"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "innihald"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "virkja athugasemdir"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nafn sniðmáts"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Dæmi: 'flatpages/contact_page'. Ef ekkert er gefið upp mun kerfið nota "
+"'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "skráning nauðsynleg"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Ef þetta er valið geta eingöngu innskráðir notendur séð síðuna."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "flatskrá"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "flatskrár"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nafn"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "vinnuheiti"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Réttindi"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Réttindi"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Hópur"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Hópar"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "notandanafn"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "skírnarnafn"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "eftirnafn"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "tölvupóstfang"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "lykilorð"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Notaðu '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "staða starfsmanns"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr ""
+"Segir til um hvort notandinn getur skráð sig inn á þetta stjórnunarsvæði."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "virkur"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "staða ofurnotanda"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "síðasta innskráning"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "skráning dags."
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Auk réttindanna sem notandanum var gefið sérstaklega fær hann öll þau "
+"réttindi sem hópurinn hans hefur."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Réttindi"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Notandi"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Notendur"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Persónuupplýsingar"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Réttindi"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Mikilvægar dagsetningar"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Hópar"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Skeyti"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Vafri þinn virðist ekki vera stilltur til að leyfa dúsur (cookies). Dúsur "
+"eru nauðsynlegar fyrir innskráningu."
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "nafn python-einingar"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "efnistag"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "efnistög"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "setulykill"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "setugögn"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "fyrningardagsetning"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "seta"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "setur"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "lén"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "birtingarnafn"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "vefur"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "vefir"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "j. N Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "j. N Y, H:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "mánudagur"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "þriðjudagur"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "miðvikudagur"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "fimmtudagur"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "föstudagur"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "laugardagur"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "sunnudagur"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "janúar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "febrúar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "mars"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "apríl"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "maí"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "júní"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "júlí"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "ágúst"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "október"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "nóvember"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "desember"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "og"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "dagur"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "ág."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "nóv."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "des."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ár"
+msgstr[1] "ár"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mánuður"
+msgstr[1] "mánuðir"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dagur"
+msgstr[1] "dagar"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "klukkutími"
+msgstr[1] "klukkutímar"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "mínúta"
+msgstr[1] "mínútur"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengalska"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tékkneska"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Velska"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Danska"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Þýska"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Enska"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spænska"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Franska"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galíska"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Íslenska"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Ítalska"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japanska"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Hollenska"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norska"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasilíska"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rúmenska"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Rússneska"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slóvaska"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Slóvaska"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbneska"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Sænska"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brasilíska"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Einfölduð Kínverska "
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Hefðbundin Kínverska"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Þetta gildi má einungis innihalda stafi, tölur og undirstrik."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Þetta gildi má einungis innihalda stafi, tölur, undirstrik og skástrik."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Hástafir eru ekki leyfðir hér."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Lágstafir eru ekki leyfðir hér."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Skrifaðu einungis tölur aðskildar með kommum."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Sláðu inn gild tölvupóstföng aðskilin með kommum."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Vinsamlegast sláðu inn gilda IP tölu."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Tóm gildi eru ekki leyfð hér."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Aðeins tölustafir eru leyfðir hér."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Þetta gildi verður að vera samsett úr fleiru en tölustöfum."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Sláðu inn heila tölu."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Einungis bókstafir eru leyfðir hér."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Sláðu inn gilda dagsetningu á YYYY-MM-DD sniði."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Sláðu inn gildan tíma á HH:MM sniði."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Sláðu inn gilda dagsetningu/tíma á YYYY-MM-DD HH:MM sniði."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Sláðu inn gilt tölvupóstfang."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Halaðu upp gildri myndskrá. Skráin sem þú halaðir upp var annað hvort gölluð "
+"eða ekki mynd."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Veffangið %s bendir ekki á fullgilda mynd."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Símanúmer verða að vera á XXX-XXX-XXXX forminu. „%s“ er ógilt."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Veffangið %s vísar ekki á gilt QuickTime myndskeið."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Gilds veffangs er krafist."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Gilt HTML er nauðsynlegt. Tilteknar villur:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Illa formað XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ógilt veffang: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Veffangið %s er brotinn hlekkur."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Skrifaðu gilda styttingu á bandarísku fylkisnafni."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Passaðu orðbragðið! Orðið %s er ekki leyft hér."
+msgstr[1] "Passaðu orðbragðið! Orðin %s eru ekki leyfð hér."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Þessi reitur verður að passa við „%s“ reitinn."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Vinsamlegast fylltu út einn reit að minnsta kosti."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Vinsamlegast fylltu út í báða reitina eða skildu þá eftir tóma."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Þessi reitur þarf að vera útfylltur ef %(field)s er %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Þessi reitur verður að vera útfylltur ef %(field)s er ekki %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Endurtekin gildi eru ekki leyfð."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Þessi reitur verður að vera veldi af %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Vinsamlegast settu inn gilda tugatölu."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tölustaf."
+msgstr[1] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tölustafi."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tugbrotastaf."
+msgstr[1] "Vinsamlegast skrifaðu gilda tugatölu með hámark %s tugbrotastafi."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Gakktu úr skugga um að upphöluð skrá sé að minnsta kosti %s bæti að stærð."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Gakktu úr skugga um að upphlaðin skrá sé í mesta lagi %s bæti að stærð."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Sniðið á þessum reit í rangt."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Þessi reitur er ótækur."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Gat engu náð úr %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "Veffangið %(url)s skilaði ótæka efnistagshausnum '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Vinsamlegast lokaðu opna %(tag)s taginu sem byrjar á línu %(line)s. (Línan "
+"hefst á \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Texti sem hefst á línu %(line)s er ekki leyfður í því samhengi. (Line starts "
+"with \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" á línu %(line)s er ótækt eigindi (línan hefst á \"%(start)s\")."
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" á línu %(line)s er ótækt tag. (Línan hefst á \"%(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tag á línu %(line)s vantar eitt eða fleiri nauðsynleg eigindi. (Línan hefst "
+"á \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\" eigindið á línu %(line)s hefur ótækt gildi (línan hefst á \"%"
+"(start)s\")."
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(object)s með þetta %(type)s er nú þegar til fyrir uppgefið %(field)s."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s með þetta %(fieldname)s er nú þegar til."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Þennan reit þarf að útfylla."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Þessi reitur verður að vera veldi af %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Þessi reitur verður að vera veldi af %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Þessi reitur er ótækur."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Sláðu inn gilt tölvupóstfang."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Vinsamlegast sláðu inn fullgilt %s."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Notaðu kommur til að aðskilja kenni."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Haltu inni „Control“, eða „Command“ á Mac til þess að velja fleira en eitt."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Vinsamlegast sláðu inn gild %(self)s kenni. Gildið %(value)r er ógilt."
+msgstr[1] ""
+"Vinsamlegast sláðu inn gild %(self)s kenni. Gildin %(value)r eru ógild."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Gangtu úr skugga um að textinn þin sé styttri en %s tákn."
+msgstr[1] "Gangtu úr skugga um að textinn þin sé styttri en %s tákn."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Línuskil eru ekki leyfð hér."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Veldu gildan valmöguleika; „%(data)s“ er ekki í %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Innsend skrá er tóm."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Sláðu inn heila tölu á bilinu -32.768 til 32.767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Sláðu inn jákvæða tölu."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Sláðu inn heila tölu á bilinu 0 til 32.767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "já,nei,kannski"
+
+#~ msgid "Comment"
+#~ msgstr "Athugasemd"
+
+#~ msgid "Comments"
+#~ msgstr "Athugasemdir"
+
+#~ msgid ""
+#~ "This comment was posted by a user who has posted fewer than %(count)s "
+#~ "comment:\n"
+#~ "\n"
+#~ "%(text)sThis comment was posted by a user who has posted fewer than %"
+#~ "(count)s comments:\n"
+#~ "\n"
+#~ "%(text)s"
+#~ msgstr ""
+#~ "Þessi athugasemd var send inn af notanda sem hefur skrifað færri en %"
+#~ "(count)s athugasemd:\n"
+#~ "\n"
+#~ "%(text)sÞessi athugasemd var send inn af notanda sem hefur skrifað færri "
+#~ "en %(count)s athugasemdir:\n"
+#~ "\n"
+#~ "%(text)s"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Strengur (allt að 50)"
+
+#~ msgid "label"
+#~ msgstr "merki"
+
+#~ msgid "package"
+#~ msgstr "pakki"
+
+#~ msgid "packages"
+#~ msgstr "pakkar"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "innihald"

Added: vendor/django/current/django/conf/locale/is/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/is/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/is/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/is/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/is/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,109 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Djangojs CVS\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-05-13 11:48-0000\n"
+"Last-Translator: Dagur Páll Ammendrup <dagurp at gmail.com>\n"
+"Language-Team: Icelandic <dagurp at gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Icelandic\n"
+"X-Poedit-Country: ICELAND\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Fáanleg %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Velja öll"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Bæta við"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Fjarlægja"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Valin %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Veldu úr valmöguleikunum og smelltu"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Hreinsa öll"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "janúar febrúar mars apríl maí júní júlí ágúst september október nóvember desember"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "sunnudagur mánudagur þriðjudagur miðvikudagur fimmtudagur föstudagur laugardagur"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M Þ M F F L"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Núna"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Klukka"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Veldu tíma"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Miðnætti"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 f.h."
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Hádegi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Hætta við"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Í dag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Dagatal"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Í gær"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Á morgun"
+

Added: vendor/django/current/django/conf/locale/it/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/it/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/it/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/it/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/it/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1970 @@
+# Italian translation of Django.
+# Copyright (C) 2006 the Lawrence Journal-World
+# This file is distributed under the same license as the Django package.
+# Carlo C8E Miron <carlo.miron AT gmail.com>, 2006.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: Django pre-1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: 2006-05-21 23:45+0200\n"
+"Last-Translator: Carlo C8E Miron <carlo.miron AT gmail.com>\n"
+"Language-Team: Italian <Django-I18N at googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID dell'oggetto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "intestazione"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "commento"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "valutazione #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "valutazione #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "valutazione #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "valutazione #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "valutazione #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "valutazione #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "valutazione #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "valutazione #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "valutazione valida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/ora di sottomissione"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "pubblico"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "indirizzo IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "eliminato"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Spunta la casella se il commento è inappropriato. Verrà sostituito con un "
+"messaggio \"Questo commento è stato rimosso\"."
+
+#: contrib/comments/models/comments.py:31
+msgid "Comment"
+msgstr "Commento"
+
+#: contrib/comments/models/comments.py:32
+#: contrib/comments/models.py:91
+msgid "Comments"
+msgstr "Commenti"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Contenitore"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Commento di %(user)s del %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome della persona"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "indirizzo IP"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "approvato dallo staff"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "commento libero"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "commenti liberi"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "punteggio"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data punteggio"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "livello karma"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "livelli karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "valutazione: %(score)d da %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Questo commento ha un flag di %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data flag"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "flag utente"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "flag utente"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag da %r"
+
+#: contrib/comments/models/comments.py:278
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data eliminazione"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "rimozione da moderatore"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "rimozioni da moderatore"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Rimozione da moderatore di %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Gli utenti anonimi non possono votare"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID commento non valido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Non votare per te stesso"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Questa valutazione è obbligatoria perché hai inserito almeno un'altra valutazione"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Commento di un utente autore di meno di %(count)s commento:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Commento di un utente autore di meno di %(count)s commenti:\n"
+"\n"
+"%(text)s"
+""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Commento di un utente \"sketchy\":\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Sono ammessi solo POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Uno o più dei campi richiesti non sono stati sottomessi"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Qualcuno ha alterato il modulo di commento (violazione di sicurezza)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Il modulo di commento ha un parametro 'target' non valido -- l'ID dell'oggetto non e` valido"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Il modulo di commento non fornisce 'anteprima' o 'invia'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Nome utente:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Password:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Hai dimenticato la password?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Esci"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Valutazioni"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obbligatorio"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opzionale"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Invia una foto"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Commento:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Anteprima commento"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Il tuo nome:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Da %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Tutti"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Qualsiasi data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Oggi"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Ultimi 7 giorni"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Questo mese"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Quest'anno"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sì"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "No"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Sconosciuto"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "data azione"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "ID dell'oggetto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "rappresentazione dell'oggetto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "flag azione"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "modifica messaggio"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "voce di log"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "voci di log"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Tutte le date"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Inserire nome utente e password corretti. Entrambi i campi sono case sensitive."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Accedi"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"La sessione è scaduta, si prega di accedere nuovamente. I dati sono stati salvati."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Il browser non è configurato per accettare cookie. Abilitarli, ricaricare la pagina e provare di nuovo."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Il nome utente non può contenere il carattere '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Il nome utente non è l'indirizzo e-mail. Provare con '%s'."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Amministrazione sito"
+
+#: contrib/admin/views/main.py:410
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "L'oggetto %(name)s di tipo \"%(obj)s\" è stato aggiunto."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Puoi modificarlo nuovamente qui sotto."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Puoi aggiungere un altro %s qui sotto."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Aggiungi %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Aggiunto %s"
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Modificato %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Rimosso %s"
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Nessun campo modificato."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "L'oggetto %(name)s di tipo \"%(obj)s\" è stato modificato."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"L'oggetto %(name)s di tipo \"%(obj)s\" è stato aggiunto. Puoi modificarlo nuovamente qui sotto."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Modifica %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Uno o più %(fieldname)s in %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Uno o più %(fieldname)s in %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "L'oggetto %(name)s di tipo \"%(obj)s\" è stato rimosso."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Sei sicuro?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Storia delle modifiche: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Selezionare %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Selezionare %s per modificare"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Intero"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Booleano (True o False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Stringa (massimo %(maxlength)s caratteri)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Interi separati da virgola"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Data (senza orario)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Data (con orario)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Indirizzo e-mail"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Percorso di file"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Numero decimale"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Booleano (True, False o None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relazione a modello padre"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Numero di telefono"
+
+#: contrib/admin/views/doc.py:263
+msgid "String (up to 50)"
+msgstr "Stringa (massimo 50 caratteri)"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Testo"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Ora"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stato americano (due lettere maiuscole)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Testo XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentazione"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Modifica la password"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Pagina iniziale"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Storia"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/ora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Utente"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Azione"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j F Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Questo oggetto non ha cambiamenti storicizzati. Probabilmente non è stato "
+"creato con questo sito di amministrazione."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Amministrazione sito Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Amministrazione Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Errore del server"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Errore del server (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Errore del Server <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"C'è stato un errore. E' stato riportato agli amministratori del sito via e-"
+"mail e verrà risolto a breve. Grazie per la pazienza."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Pagina non trovata"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Spiacente, ma la pagina richiesta non esiste."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modelli disponibili nell'applicazione %(name)s."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Aggiungi"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modifica"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Non hai i permessi di modificare nulla."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Azioni Recenti"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Azioni Proprie"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nessuna disponibile"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Aggiungi %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Hai <a href=\"/password_reset/\">dimenticato la tua password</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Benvenuto,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Elimina"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"La rimozione di %(object_name)s '%(object)s' causerebbe la cancellazione "
+"degli oggetti relazionati, ma il tuo account non ha i permessi per rimuovere "
+"i seguenti tipi di oggetti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Sei sicuro di voler rimuovere %(object_name)s \"%(object)s\"? I seguenti "
+"oggetti relazionati saranno rimossi:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sì, sono sicuro"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Per %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Vai"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Vedi sul sito"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Correggere l'errore qui sotto."
+msgstr[1] "Correggere gli errori qui sotto."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Ordinamento"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Ordinamento:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Salva come nuovo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Salva e crea nuovo"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Salva e continua"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Salva"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Modifica la password"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "La password è stata cambiata"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "La tua password è stata modificata."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Resetta la password"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Hai dimenticato la tua password? Inserisci il tuo indirizzo e-mail qui "
+"sotto, la tua password sarà resettata e te ne verrà spedita una nuova."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Indirizzo e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Resetta la mia password"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Grazie per aver speso il tuo tempo prezioso con questo sito."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Accedi di nuovo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Password resettata"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Ti abbiamo inviato la nuova password all'indirizzo e-mail da te selezionato. "
+"Dovresti riceverla a breve."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Inserisci la tua vecchia password, per ragioni di sicurezza, e poi la tua "
+"nuova password due volte per verificare che tu l'abbia scritta correttamente."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Vecchia password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nuova password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Conferma password:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Modifica la mia password"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Hai ricevuto questa e-mail perché hai chiesto di resettare la password"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "per il tuo account utente su %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "La tua nuova password è: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Puoi modificare la tua password su questa pagina:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Il tuo nome utente, in caso tu l'abbia dimenticato:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Ti ringraziamo per l'utilizzo del nostro sito!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Il team di %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklet"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Bookmarklet alla documentazione"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Per installare i bookmarklet, trascinare il link nella barra \n"
+"dei bookmark, o cliccare il link con il tasto destro e selezionare aggiungi ai \n"
+"bookmark. È possibile selezionare il bookmarklet da qualsiasi pagina del sito. \n"
+"Alcuni di questi bookmarklet richiedono l'utilizzo di un computer \"interno\" \n"
+"(chiedi al tuo amministratore di sistema se non sei sicuro che il tuo computer \n"
+"sia \"interno\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentazione per questa pagina"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Ti porta da qualsiasi pagina alla documentazione della view che genera quella pagina."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostra l'ID dell'oggetto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Mostra il tipo di contenuto e l'ID univoco per pagine che rappresentano un singolo oggetto."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Modifica quest'oggetto (nella finestra corrente)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Ti porta alla pagina amministrativa per pagine che rappresentano un oggetto singolo."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Modifica quest'oggetto (in una nuova finestra)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Come sopra, ma apre la pagina di amministrazione in una nuova finestra."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Ora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Attualmente:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modifica:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirigi da"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Un percorso assoluto, senza nome a dominio. Esempio: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirigi verso"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Un percorso assoluto (come sopra) o un URL completo iniziante con 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "redirigi"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "redirezioni"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Esempio: '/about/contact/'. Attenzione alla barra ('/') iniziale e finale."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titolo"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "contenuto"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "abilita commenti"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome modello"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Esempio: 'flatpages/contact_page'. Se non specificato, il sistema userà "
+"'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrazione obbligatoria"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se selezionata, solo gli utenti registrati potranno vedere la pagina."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "pagina statica"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "pagine statiche"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "nome in codice"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "permesso"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "permessi"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "gruppo"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "gruppi"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "nome utente"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "nome"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "cognome"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "indirizzo e-mail"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "password"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Usare '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "staff"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Autorizza l'utente ad accedere a questo sito di amministrazione."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "attivo"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "superuser"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "ultimo accesso"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "iscritto da"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"In aggiunta ai permessi assegnati manualmente, l'utente riceverà anche tutti "
+"i permessi assegnati ad ogni gruppo cui appartiene."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "permessi utente"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "utente"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "utenti"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Informazioni personali"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Permessi"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Date importanti"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Gruppi"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "messaggio"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Il browser non ha i cookie abilitati. Per accedere, è necessario abilitarli."
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "nome della classe modello in python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tipo di contenuto"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tipo di contenuti"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "chiave di sessione"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "dati di sessione"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "data di scadenza"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sessione"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sessioni"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nome a dominio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nome visualizzato"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sito"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "siti"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "j F Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "j F Y, H:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Lunedì"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Martedì"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Mercoledì"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Giovedì"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Venerdì"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sabato"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domenica"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Gennaio"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Febbraio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzo"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Aprile"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maggio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Giugno"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Luglio"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Settembre"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Ottobre"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembre"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dicembre"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "gen"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mag"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "giu"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "lug"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ago"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "set"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "ott"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dic"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Gen."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Ott."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dic."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "anno"
+msgstr[1] "anni"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mese"
+msgstr[1] "mesi"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "settimana"
+msgstr[1] "settimane"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "giorno"
+msgstr[1] "giorni"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ora"
+msgstr[1] "ore"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minuti"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengali"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Ceco"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Gallese"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Danese"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Tedesco"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Greco"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Inglese"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spagnolo"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francese"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galiziano"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "Ungherese"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "Ebreo"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandese"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Giapponese"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Olandese"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norvegese"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasiliano"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumeno"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovacco"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "Sloveno"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbo"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Svedese"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "Ucraino"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Cinese semplificato"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Cinese tradizionale"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Sono ammesse solo lettere, numeri e sottolineature ('_')."
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Sono ammesse solo lettere, numeri, sottolineature ('_'), trattini"
+"('-') e barre ('/')."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Non sono ammesse lettere maiuscole."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Non sono ammesse lettere minuscole."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Inserire solo numeri separati da virgole."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Inserire indirizzi e-mail validi separati da virgole."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Inserire un indirizzo IP valido."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "E' necessario inserire un valore."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Sono ammessi soltanto caratteri numerici."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Il valore non può essere composto solo da cifre."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Inserire un numero."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Sono ammessi solo caratteri alfabetici."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Inserire un data valida in formato AAAA-MM-GG."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Inserire un orario valido in formato OO:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Inserire una data/ora in formato AAAA-MM-GG OO:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Inserire un indirizzo e-mail valido."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Caricare un'immagine valida. Il file inserito non è un'immagine o è corrotto."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "L'URL %s non punta ad un'immagine valida."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"I numeri di telefono devono essere in formato XXX-XXX-XXXX. \"%s\" non è "
+"valido."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "L'URL %s non punta ad un video QuickTime valido."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Inserire un URL valido."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"E' richiesto HTML valido. Gli errori sono i seguenti:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML malformato: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL non valida: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "L'URL %s è un link rotto."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Inserire un nome di stato americano abbreviato valido."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Attenzione! La parola %s non è ammessa."
+msgstr[1] "Attenzione! Le parole %s non sono ammesse."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Questo campo deve corrispondere al campo '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Inserire qualcosa in almeno un campo."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Inserire entrambi i campi o lasciarli entrambi vuoti."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Il campo è obbligatorio se %(field)s è %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Il campo è obbligatorio se %(field)s non è %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Non sono ammessi valori duplicati."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Il valore deve essere una potenza di %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Inserire un numero decimale valido."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Inserire un numero decimale con non più di %s cifra."
+msgstr[1] "Inserire un numero decimale con non più di %s cifre totali."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Inserire un decimale con non più di %s cifra decimale."
+msgstr[1] "Inserire un decimale con non più di %s cifre decimali."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifica che il file inserito sia almeno di %s byte."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifica che il file inserito sia al massimo %s byte."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Formato del file non valido."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Il campo non è valido."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Impossibile recuperare alcunché da %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"L'URL %(url)s restituisce un Content-Type header non valido '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Il tag %(tag)s alla linea %(line)s non è chiuso. (La linea comincia con \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Il testo che comincia a linea %(line)s non e' ammesso in questo contesto. "
+"(La linea comincia con \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" alla linea %(line)s è un attributo invalido. (La linea comincia "
+"con \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" alla linea %(line)s: tag non valido. (La linea comincia con \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Un tag alla linea %(line)s manca di uno o più attributi richiesti. (La linea "
+"comincia con \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"L'attributo \"%(attr)s\" alla linea %(line)s ha un valore non valido. (La "
+"linea comincia con \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s·con questo·%(type)s·esistono già per questo·%(field)s."
+
+#: core/meta/fields.py:60
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s·con questo·%(fieldname)s·esiste già."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Il campo è obbligatorio."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "Il valore deve essere un intero."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "Il valore deve essere True o False."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Il campo non può essere nullo."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Inserire un nome file valido."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Inserire un %s valido."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "Separa ID multipli con virgole."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr " Premi \"Control\", o \"Command\" su Mac, per selezionarne più di uno."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Inserire un ID valido per %(self)s. Il valore %(value)r non è valido."
+msgstr[1] "Inserire un ID valido per %(self)s. I valori %(value)r non sono validi."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Assicurati che il testo sia più corto di %s carattere."
+msgstr[1] "Assicurati che il testo sia più corto di %s caratteri."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Non è ammesso andare a capo."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Selezionare un'opzione valida; '%(data)s' non presente in %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Il file sottomesso è vuoto."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Inserire un numero tra -32768 e 32767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Inserire un numero positivo."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Inserire un numero compreso tra 0 e 32767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "sì,no,forse"
+

Added: vendor/django/current/django/conf/locale/it/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/it/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/it/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/it/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/it/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,111 @@
+# Italian translation for the django-admin JS files
+# Copyright (C) 2006 the Lawrence Journal-World
+# This file is distributed under the same license as the Django package.
+# Carlo C8E Miron <carlo.miron AT gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django JavaScript 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-12-04 21:47+0100\n"
+"Last-Translator: Carlo C8E Miron <carlo.miron AT gmail.com>\n"
+"Language-Team: Italian <Django-I18N at googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Disponibile %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Seleziona tutto"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Aggiungi"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Rimuovi"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Selezionato %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Seleziona le tue scelte e clicca "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Cancella tutto"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Gennaio Febbraio Marzo Aprile Maggio Giugno Luglio Agosto Settembre Ottobre "
+"Novembre Dicembre"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domenica Lunedì Martedì Mercoledì Giovedì Venerdì Sabato"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D L M M G V S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Adesso"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Orologio"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Seleziona un orario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Mezzanotte"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 del mattino"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Mezzogiorno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Annulla"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Oggi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendario"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ieri"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Domani"

Added: vendor/django/current/django/conf/locale/ja/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ja/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ja/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/ja/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ja/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2010 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+# 
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-18 00:21+0900\n"
+"PO-Revision-Date: 2006-05-18 00:28+0900\n"
+"Last-Translator: makoto tsuyuki <mtsuyuki at gmail.com>\n"
+"Language-Team: Japanese <django-ja at googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "ベンガル語"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "チェコ語"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "ウェールズ語"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "デンマーク語"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "ドイツ語"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "ギリシャ語"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "英語"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "スペイン語"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "フランス語"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "ガリシア語"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "ハンガリー語"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "ヘブライ語"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "アイスランド語"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "イタリア語"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "日本語"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "オランダ語"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "ノルウェー語"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "ブラジル語"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "ルーマニア語"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "ロシア語"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "スロバキア語"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "スロヴェニア語"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "セルビア語"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "スウェーデン語"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "ウクライナ語"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "簡体字中国語"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "繁体字中国語"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>%s で絞り込む</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "全て"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "いつでも"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "今日"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "過去 7 日間"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "今月"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "今年"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "はい"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "いいえ"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "不明"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "操作時刻"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "オブジェクト ID"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "オブジェクトの文字列表現"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "操作種別"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "変更メッセージ"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "ログエントリ"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "ログエントリ"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "ページが見つかりません"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "申し訳ありませんが、お探しのページは見つかりませんでした。"
+
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+msgid "Home"
+msgstr "ホーム"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "サーバエラー"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "サーバエラー (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "サーバエラー <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"エラーが発生しました。エラーをサイトの管理者にメールで報告しましたので、近い"
+"うちに修正されるはずです。しばらくお待ちください。"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "ようこそ"
+
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Documentation"
+msgstr "ドキュメント"
+
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+msgid "Change password"
+msgstr "パスワードの変更"
+
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/comments/templates/comments/form.html:8
+msgid "Log out"
+msgstr "ログアウト"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django サイト管理"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django の管理"
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "追加"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "履歴"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "サイト上で表示"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "下記のエラーを修正してください。"
+msgstr[1] "下記のエラーを修正してください。"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "順序"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "並び変え:"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s を追加"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "削除"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"%(object_name)s '%(object)s' の削除時に関連づけられたオブジェクトも削除しよう"
+"としましたが、あなたのアカウントには以下のタイプのオブジェクトを削除するパー"
+"ミッションがありません:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"%(object_name)s \"%(object)s\"を削除しますか? 関連づけられている以下のオブ"
+"ジェクトも全て削除されます:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "はい。"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "%(title)s で絞り込む"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "%(name)s アプリケーションで利用可能なモデル"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "変更"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "変更のためのパーミッションがありません。"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "最近行った操作"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "操作"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "利用不可"
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "ユーザ名:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:6
+msgid "Password:"
+msgstr "パスワード:"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">パスワードをお忘れですか</a>?"
+
+#: contrib/admin/templates/admin/login.html:25
+#: contrib/admin/views/decorators.py:23
+msgid "Log in"
+msgstr "ログイン"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "日付/時刻"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "ユーザ"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "操作"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "Y/m/d H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"このオブジェクトには変更履歴がありません。おそらくこの管理サイトで追加したも"
+"のではありません。"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "検索"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "新規保存"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "保存してもう一つ追加"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "保存して編集を続ける"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "保存"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "ブックマークレット"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "ドキュメントへのブックマークレット"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">ブックマークレットをインストールするには、リンクをブック"
+"マークツールバーにドラッグするか、\n"
+"リンクを右クリックしてブックマークに追加してください。これで\n"
+"サイトのどのページからでもブックマークレットを選択可能になりました。\n"
+"ブックマークレットによっては、内部ネットワークにあるコンピュータからこのサイ"
+"トを\n"
+"参照していなければならないことがあります。内部ネットワークにあるかどうか不明"
+"な場合は、システム管理者に確認してください。</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "このページのドキュメント"
+
+# TODO
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "各ページから、ページを生成したビューのドキュメントにジャンプします。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "オブジェクト ID を表示"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"単一のオブジェクトを表示するページのコンテンツタイプと一意な IDを表示します。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "オブジェクトを (現在のウィンドウで) 編集"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "単一のオブジェクトを表示するページの管理ページへジャンプします。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "オブジェクトを (新しいウィンドウで) 編集"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "上と同じですが、新しいウィンドウで管理ページを開きます。"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "ご利用ありがとうございました。"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "もう一度ログイン"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "パスワードの変更"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "パスワードを変更しました"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "あなたのパスワードは変更されました"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"セキュリティ上の理由から元のパスワードの入力が必要です。新しいパスワードは正"
+"しく入力したか確認できるように二度入力してください。"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "元のパスワード:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "新しいパスワード:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "新しいパスワード (もう一度) :"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "パスワードの変更"
+
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+msgid "Password reset"
+msgstr "パスワードをリセット"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "パスワードをリセットしました"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"登録されているメールアドレスに新しいパスワードを送信しました。まもなく届くで"
+"しょう。"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"あなたのパスワードはリセットされましたので、ここにメールでご連絡差し上げま"
+"す。"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "リセットされたのは %(site_name)s のアカウントです。"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "新しいパスワード: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "パスワードは下記のページで自由に変更していただけます:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "あなたのユーザ名 (念のため):"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "ご利用ありがとうございました!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr " %(site_name)s チーム"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"パスワードをお忘れですか?メールアドレスを入力してください。パスワードをリ"
+"セットして、新しいパスワードをメールでお知らせします。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "メールアドレス"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "パスワードをリセット"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "日付:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "時刻:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "現在:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "変更:"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "いつでも"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"正しいユーザ名とパスワードを入力してください (大文字小文字は区別します) 。"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"再ログインしてください。ログインセッションが有効期間切れしてしまいました。入"
+"力データは失われておりませんのでご安心ください。"
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"ブラウザがクッキーの使用を許可していないようです。クッキーの使用を許可して、"
+"もう一度このページを表示してください。"
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "ユーザ名には '@' を含められません。"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "メールアドレスはユーザ名ではありません。 '%s' を試してみてください。"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "æ•´æ•°"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "ブール値 (真: True または偽: False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "文字列 ( %(maxlength)s 字まで )"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "カンマ区切りの整数"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "日付"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "日時"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "メールアドレス"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "ファイルの場所"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "10 進数 (小数可)"
+
+#: contrib/admin/views/doc.py:289 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "IP アドレス"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "ブール値 (真: True 、偽: False または None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "親モデルへのリレーション"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "電話番号"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "テキスト"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "時刻"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "アメリカの州 (大文字二文字で)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XMLテキスト"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "サイト管理"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" を追加しました。"
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "続けて編集できます。"
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "続けて別の %s を追加できます。"
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "%s を追加"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s を追加しました。"
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "と"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "%s を変更しました。"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s を削除しました。"
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "変更はありませんでした。"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" を変更しました。"
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" を追加しました。続けて編集できます。"
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "%s を変更"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(name)s に %(fieldname)s が一つ以上あります: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(name)s に %(fieldname)s が一つ以上あります:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" を削除しました。"
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "よろしいですか?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "変更履歴: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "%s を選択"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "変更する %s を選択"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"お使いのブラウザはクッキーを有効にしていないようです。ログインにはクッキーが"
+"必要です。"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "名前"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "コード名"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "パーミッション"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "パーミッション"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "グループ"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "グループ"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "ユーザ名"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "名"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "姓"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "メールアドレス"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "パスワード"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "'[アルゴリズム]$[ソルト]$[ダイジェスト(hex)]' 形式を使って下さい"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "スタッフ権限"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "ユーザが管理サイトにログイン可能かどうかを示します。"
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "有効"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "スーパーユーザ権限"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "最終ログイン"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "登録日"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"手動で付与したパーミッションに加え、所属しているグループに付与された全ての"
+"パーミッションを獲得します。"
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "ユーザパーミッション"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "ユーザ"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "ユーザ"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "個人情報"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "パーミッション"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "重要な日程"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "グループ"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "メッセージ"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "オブジェクト ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "新着情報"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "コメント"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "レーティング #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "レーティング #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "レーティング #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "レーティング #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "レーティング #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "レーティング #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "レーティング #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "レーティング #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "は有効なレーティングです"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "コメント投稿日時"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "は公開中です"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "は削除されました"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"コメントが不適切な場合はチェックを入れてください。「コメントは削除されまし"
+"た」と表示されるようになります。"
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "コメント"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "コンテンツオブジェクト"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s が %(date)s に投稿\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "名前"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP アドレス"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "スタッフの承認済み"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "フリーコメント"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "フリーコメント"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "スコア"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "スコアされた日"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "カルマスコア"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "カルマスコア"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(user)s により %(score)d 点のレーティング"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"このコメントは %(user)s がフラグ付けしました。:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "フラグ日"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "ユーザフラグ"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "ユーザフラグ"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r によるフラグ"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "削除日"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "モデレータ削除"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "モデレータ削除"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "%r によるモデレータ削除"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "パスワードをお忘れですか?"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "レーティング"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "å¿…é ˆ"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "オプション"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "写真を登録"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "コメント:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "コメントをプレビュー"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "ユーザ名:"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"他のレーティングを入力した場合は、このレーティングは必ず入力してください。"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] "このコメントを投稿したユーザのコメント数は %(count)s 未満です。"
+msgstr[1] "このコメントを投稿したユーザのコメント数は %(count)s 未満です。"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"このコメントを投稿したユーザの詳細は不明です:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "POST メソッドのみ有効です。"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "必須項目がいくつか入力されていません。"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "だれかがコメントフォームを改竄しています (セキュリティ侵害です)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"コメントフォームの 'target' パラメータが不正です。 -- オブジェクト IDが不正な"
+"値でした"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "コメントの「プレビュー」「投稿」種別が不明です。"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "非ログインユーザは投票できません。"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "コメント ID が不正です"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "自分には投票できません。"
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "Python モデルクラス名"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "コンテンツタイプ"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "コンテンツタイプ"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"例: '/about/contact/'. 先頭と最後にスラッシュがあるか確認してください。"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "タイトル"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "内容"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "コメントを有効にする"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "テンプレート名"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"例: 'flatpages/contact_page'. 指定しなければ、デフォルト設定の'flatpages/"
+"default' を使います。"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "登録が必要です"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "チェックした場合、ログインしたユーザだけがページを参照できます。"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "フラットページ"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "フラットページ"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "リダイレクト元"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "'/events/search/' のように、ドメイン名を除いた絶対パスにします。 "
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "リダイレクト先"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "上記のような絶対パスか、 'http://' で始まる完全な URL にします。"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "リダイレクト"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "リダイレクト"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "セッションキー"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "セッションデータ"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "有効期限"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "セッション"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "セッション"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "ドメイン名"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "表示名"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "サイト"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "サイト"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "半角の英数字およびアンダースコア以外は使用できません。"
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "半角の英数字、アンダースコア、ダッシュ、ラッシュ以外は使用できません。"
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "大文字はここでは使用できません。"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "小文字はここでは使用できません。"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "カンマ区切りの数字だけを入力してください。"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "カンマ区切りの有効なメールアドレスを入力してください。"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "有効な IP アドレスを入力してください。"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "入力は必須です。"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "数値以外は使用できません。"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "数値だけの値にはできません。"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "整数を入力してください。"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "半角アルファベット以外使用できません。"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "YYYY-MM-DD形式で日付を入力してください。"
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "HH:MM形式で時刻を入力してください。"
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "YYYY-MM-DD HH:MM形式で日時を入力してください。"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "有効なメールアドレスを入力してください。"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"画像をアップロードしてください。アップロードした画像は画像でないか、または壊"
+"れています。"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL ( %s )  は画像ではありません。"
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "電話番号は XXX-XXX-XXXX 形式で入力してください。\"%s\" は無効です。"
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL ( %s ) は QuickTime ビデオではありません。"
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "正しい URL を入力してください。"
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"有効な HTML を入力してください。エラー:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "不正な XML です: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "無効なURL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL ( %s ) はリンクが壊れています。"
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "正しい米州略称を入力してください。"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "言葉使いに気を付けて! %s という言葉は使えません。"
+msgstr[1] "言葉使いに気を付けて! %s という言葉は使えません。"
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "このフィールドは '%s' フィールドと一致せねばなりません。"
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "少なくとも一つのフィールドに何か入力してください。"
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "両方のフィールドに入力するか、両方とも未入力にしてください。"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+"%(field)s を %(value)s にするのなら、このフィールドに必ず入力してください。"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"%(field)s を %(value)s にしないのなら、このフィールドに必ず入力してください。"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "重複する値は認められません。"
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "この値は %s の累乗でなければなりません。"
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "有効な 10 進数を入力してください。"
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "最大桁数 %s 桁以下の有効な 10 進数を入力してください。"
+msgstr[1] "最大桁数 %s 桁以下の有効な 10 進数を入力してください。"
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "小数点以下が %s 桁までの有効な 10 進数を入力してください。"
+msgstr[1] "小数点以下が %s 桁までの有効な 10 進数を入力してください。"
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "アップロードするファイルの大きさは %s バイト以上にしてください。"
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "アップロードするファイルの大きさは %s 最大バイトまでです。"
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "フィールドの形式が正しくありません。"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "このフィールドは無効です。"
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s から何も検索できませんでした。"
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL %(url)s は無効なコンテンツタイプヘッダ '%(contenttype)s' を返しました。"
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"%(line)s 行目から始まる %(tag)s タグを閉じてください (\"%(start)s\" で始まる"
+"行です)。"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 行目から始まるテキストはこのコンテキストでは使えません。 (\"%(start)"
+"s\" で始まる行です)。"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s 行目の \"%(attr)s\" は無効なアトリビュートです (\"%(start)s\" で始ま"
+"る行です)。"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"%(line)s 行目の \"<%(tag)s>\" は無効なタグです( \"%(start)s\" で始まる行で"
+"す)。"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 行目のタグは必須アトリビュートが未入力です( \"%(start)s\" で始まる行"
+"です)。"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"%(line)s 行目の \"%(attr)s\" アトリビュートの値が正しくありません (\"%(start)"
+"s\" で始まる行です) 。"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(field)s に入力されたものは、この %(type)s の %(object)s に既に存在します。"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(fieldname)s に %(optname)s は既に存在します。"
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "このフィールドは必須です。"
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "値は整数でなければなりません。"
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "値は真: True または偽: False でなければなりません。"
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "このフィールドには NULL を指定できません。"
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "正しいファイル名を入力してください。"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "正しい %s を入力してください。"
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "複数の ID はカンマで区切ってください。"
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"複数選択するときには \"Control\"キーを押したまま選択してください。Mac では "
+"\"Command\" キーを使ってください。"
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "正しい %(self)s IDを入力してください。 %(value)r は無効です。"
+msgstr[1] "正しい %(self)s IDを入力してください。 %(value)r は無効です。"
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "%s 字以下で入力してください。"
+msgstr[1] "%s 字以下で入力してください。"
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "改行はできません。"
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "正しく選択してください。; '%(data)s' は %(choices)s にありません。"
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "入力されたファイルは空です。"
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 から 32,767 までの整数を入力してください。"
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "正の数を入力してください。"
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 から 32,767 までの整数を入力してください。"
+
+#: template/defaultfilters.py:383
+msgid "yes,no,maybe"
+msgstr "はい,いいえ,たぶん"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "月曜日"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "火曜日"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "水曜日"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "木曜日"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "金曜日"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "土曜日"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "日曜日"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "1月"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "2月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "3月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "4月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "5月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "6月"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "7月"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "8月"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "9月"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "10月"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "11月"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "12月"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "1月"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "2月"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "3月"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "4月"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "5月"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "6月"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "7月"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "8月"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "9月"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "10月"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "11月"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "12月"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "1月"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "2月"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "8月"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "9月"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "10月"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "11月"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "12月"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "å¹´"
+msgstr[1] "å¹´"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "月"
+msgstr[1] "月"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "週"
+msgstr[1] "週"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "æ—¥"
+msgstr[1] "æ—¥"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "時"
+msgstr[1] "時"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分"
+msgstr[1] "分"
+
+#: utils/translation.py:363
+msgid "DATE_FORMAT"
+msgstr "Y/m/d"
+
+#: utils/translation.py:364
+msgid "DATETIME_FORMAT"
+msgstr "Y/m/d H:i"
+
+#: utils/translation.py:365
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "文字列 (50 字まで)"
+
+#~ msgid "Comment"
+#~ msgstr "コメント"
+
+#~ msgid "Comments"
+#~ msgstr "コメント"
+
+#~ msgid "label"
+#~ msgstr "ラベル"
+
+#~ msgid "package"
+#~ msgstr "パッケージ"
+
+#~ msgid "packages"
+#~ msgstr "パッケージ"

Added: vendor/django/current/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ja/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ja/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/ja/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ja/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 1.0\n"
+"Report-Msgid-Bugs-To: Django-users Japan <django-ja at googlegroups.com>\n"
+"POT-Creation-Date: 2006-05-02 23:06+0900\n"
+"PO-Revision-Date: 2006-05-08 13:39+0900\n"
+"Last-Translator: makoto tsuyuki <mtsuyuki at gmail.com>\n"
+"Language-Team: Japanese <django-ja at googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: 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 "1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "日 月 火 水 木 金 土"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "日曜 月曜 火曜 水曜 木曜 金曜 土曜"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "利用可能 %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "全て選択"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "追加"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "削除"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "選択された %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "選択してクリック"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "全てクリア"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "現在"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "時計"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "時間を選択"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "夜中"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "午前 6 時"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "正午"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "キャンセル"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "今日"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "カレンダー"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "昨日"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "明日"
+

Added: vendor/django/current/django/conf/locale/nl/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/nl/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/nl/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/nl/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/nl/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1981 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the django package.
+# Johan C. Stöver <johan at nilling.nl>, 2005.
+# Rudolph Froger <rfroger at estrate.nl>, 2006.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django 1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 17:21+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Johan C. Stöver <johan at nilling.nl>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+"%(object)s van het type %(type)s bestaat al voor het gegeven %(field)s."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Geef een geldig IP adres."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "Scheid meerdere ID's door komma's."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Houd \"Control\", of \"Command\" op een Mac, ingedrukt om meerdere te "
+"selecteren."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Geef een geldig %(self)s IDs. De waarde %(value)r is ongeldig."
+msgstr[1] "Geef een geldig %(self)s IDs. De waarden %(value)r zijn ongeldig."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s met deze %(fieldname)s bestaat al."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Dit veld is verplicht."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "De waarde moet een geheel getal zijn."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "De waarde moet of True (waar) of False (onwaar) zijn."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Dit veld mag niet leeg zijn."
+
+#: db/models/fields/__init__.py:468 core/validators.py:132
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Geef geldige datum/tijd in JJJJ-MM-DD UU:MM formaat."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Geef een geldige bestandsnaam."
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengaals"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tjechisch"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Wels"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Deens"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Duits"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Grieks"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Engels"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spaans"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Frans"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galicisch"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "Hongaars"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "Hebreews"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "IJslands"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italiaans"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japans"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Nederlands"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Noors"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Braziliaans"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Roemeens"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Russisch"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovaaks"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "Sloveens"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Servisch"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Zweeds"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "Oekraïens"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Vereenvoudigd Chinees"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Traditioneel Chinees"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Deze waarde mag alleen letters, getallen en liggende strepen bevatten."
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Deze waarde mag alleen letters, cijfers, liggende strepen en schuine strepen "
+"bevatten."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Hoofdletters zijn hier niet toegestaan."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Kleine letters zijn hier niet toegestaan."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Geef alleen cijfers op, gescheiden door komma's."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Geef geldige e-mailadressen op, gescheiden door komma's."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Geef een geldig IP adres op."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Lege waarden zijn hier niet toegestaan."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Niet-numerieke karakters zijn hier niet toegestaan."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Deze waarde kan niet alleen uit cijfers bestaan."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Geef een geheel getal op."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Alleen alfabetische karakters zijn toegestaan"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Geef een geldige datum in JJJJ-MM-DD formaat."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Geef een geldige tijd in UU:MM formaat."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Geef een geldig e-mailadres op."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Bestand ongeldig. Het bestand dat is gegeven is geen afbeelding of was "
+"beschadigd."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "De URL %s wijst niet naar een afbeelding."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefoonnummers moeten volgens het XXX-XXX-XXXX formaat zijn. \"%s\" is "
+"ongeldig."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "De URL %s wijst niet naar een QuickTime video."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Een geldige URL is vereist."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Geldige HTML is vereist. De specifieke fouten zijn:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Foute XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ongeldige URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "De URL %s is een niet werkende link."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Geef een geldige afkorting van een VS staat."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pas op uw taalgebruik! Gebruik van %s niet toegestaan."
+msgstr[1] "Pas op uw taalgebruik! Gebruik van de woorden %s niet toegestaan."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dit veld moet overeenkomen met het '%s' veld."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Voer tenminste één veld in."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Voer waarden in in beide velden of laat beide leeg."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Dit veld moet opgegeven worden indien %(field)s %(value)s is"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Dit veld moet worden opgegeven indien %(field)s niet %(value)s is"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Dubbele waarden zijn niet toegestaan."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "De waarde moet een macht van %s zijn."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Geef een geldig decimaal getal."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Geef een geldig decimaal getal met hooguit %s cijfer."
+msgstr[1] "Geef een geldig decimaal getal met hooguit %s cijfers."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Geef een decimaal getal met hooguit %s cijfer achter de komma."
+msgstr[1] "Geef een decimaal getal met hooguit %s cijfers achter de komma."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Zorg ervoor dat het bestand minstens %s bytes groot is."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Zorg ervoor dat het bestand hoogstens %s bytes groot is."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Het formaat van dit veld is fout."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Dit veld is ongeldig."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Kan niks ophalen van %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"De geretourneerde URL %(url)s bevat een ongeldige Content-Type '%"
+"(contenttype)s."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Sluit de niet gesloten %(tag)s tag op regel %(line)s. (Regel start met \"%"
+"(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tekst beginnend op regel %(line)s is in deze context niet toegestaan. (Regel "
+"start met \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" op regel %(line)s is een ongeldig attribuut. (Regel start met "
+"\"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" op regel %(line)s is een ongeldige tag. (Regel start met \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Een of meerdere attributen ontbreken bij een tag op regel %(line)s. (Regel "
+"start met \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"De \"%(attr)s\" attribuut op regel %(line)s heeft een ongeldige waarde. "
+"(Regel start met \"%(start)s\".)"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Het lijkt erop dat uw browser geen cookies accepteerd. Om aan te melden "
+"moeten cookies worden geaccepteerd."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:41
+#: contrib/admin/views/decorators.py:9
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Voer een correcte gebruikersnaam en wachtwoord in. Let op, de velden zijn "
+"hoofdletter-gevoelig."
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "naam"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "codenaam"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "recht"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "rechten"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "groep"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "groepen"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "gebruikersnaam"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "voornaam"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "achternaam"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mailadres"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "wachtwoord"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Gebruik '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "staf status"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Bepaalt of de gebruiker kan inloggen op deze admin site."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "actief"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "supergebruiker status"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "laatste aanmelding"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "datum toegetreden"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Bovenop de rechten welke handmatig zijn toegekend, krijgt deze gebruiker ook "
+"alle rechten van de groepen waar hij of zij deel van uitmaakt."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "gebruikersrechten"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "gebruiker"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "gebruikers"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Persoonlijke informatie"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Rechten"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Belangrijke data"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Groepen"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "bericht"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "actie tijd"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "object id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "object repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "actie vlag"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "wijzig bericht"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "log ingave"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "log ingaves"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Door %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Alle"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Elke datum"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Vandaag"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Laatste 7 dagen"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Deze maand"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Dit jaar"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nee"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Onbekend"
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Aanmelden"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Uw sessie is verlopen, meldt u opnieuw aan. Maakt u geen zorgen: Uw bijdrage "
+"is opgeslagen."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Het lijkt erop dat uw browser geen cookies accepteerd. Zet het gebruik van "
+"cookies aan in uw browser, laad deze pagina nogmaals en probeer het opnieuw."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Gebruikersnamen mogen geen '@' bevatten."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Uw e-mailadres is niet uw gebruikersnaam. Probeer '%s' eens."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Site beheer"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "De %(name)s \"%(obj)s\" is toegevoegd."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "U kunt dit hieronder weer bewerken."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "U kunt hieronder de volgende %s toevoegen."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Toevoegen %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s toegevoegd."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "en"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Gewijzigd %s"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s verwijderd."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Geen velden gewijzigd."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Het wijzigen van %(name)s \"%(obj)s\" is geslaagd."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "De %(name)s \"%(obj)s\" was toegevoegd. U kunt het hieronder wijzigen."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Wijzig %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Een of meer %(fieldname)s in %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Een of meer %(fieldname)s in %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "De verwijdering van %(name)s \"%(obj)s\" is geslaagd."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Weet u het zeker?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Wijzigingsgeschiedenis: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Selecteer %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecteer %s om te wijzigen"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Geheel getal"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (True of False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Karakterreeks (hooguit %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Komma-gescheiden gehele getallen"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Datum (zonder tijd)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Datum (met tijd)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mailadres"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Bestandspad"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Decimaal getal"
+
+#: contrib/admin/views/doc.py:289 contrib/comments/models.py:85
+msgid "IP address"
+msgstr "IP adres"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (True, False of None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relatie tot ouder model"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefoonnummer"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Tijd"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Staat van de VS (twee hoofdletters)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML Tekst"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Alle data"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Documentation"
+msgstr "Documentatie"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+msgid "Change password"
+msgstr "Wachtwoord wijzigen"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_index.html:5
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/comments/templates/comments/form.html:8
+msgid "Log out"
+msgstr "Afmelden"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Home"
+msgstr "Voorpagina"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Verwijderen"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Het verwijderen van %(object_name)s '%(object)s' zal ook gerelateerde "
+"objecten verwijderen. Echter u heeft geen rechten om de volgende typen "
+"objecten te verwijderen:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Weet u zeker dat u %(object_name)s \"%(object)s\" wilt verwijderen? Alle "
+"volgende opjecten worden verwijderd:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, Ik weet het zeker"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Pagina niet gevonden"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Onze excuses, maar de gevraagde pagina komt niet voor."
+
+#: contrib/admin/templates/admin/change_form.html:15
+#: contrib/admin/templates/admin/index.html:28
+msgid "Add"
+msgstr "Toevoegen"
+
+#: contrib/admin/templates/admin/change_form.html:20
+#: contrib/admin/templates/admin/object_history.html:5
+msgid "History"
+msgstr "Geschiedenis"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Toon op site"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Herstel de fout hieronder."
+msgstr[1] "Herstel de fouten hieronder."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Sortering"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Sortering:"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Op %(title)s "
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Opslaan als nieuw item"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Opslaan en nieuw item"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Opslaan en bewerk opnieuw"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Opslaan"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s toevoegen"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Beschikbare modellen in de %(name)s toepassing."
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Wijzigen"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "U heeft geen rechten om iets te wijzigen"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Recente acties"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mijn acties"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Geen beschikbaar"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django site beheer"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django beheer"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/tijd"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Gebruiker"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Actie"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "d-n-Y H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dit object heeft geen wijzigingsgeschiedenis. Het is mogelijk niet via de "
+"admin site toegevoegd."
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Server fout"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Server fout (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Server Fout <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Er is een fout opgetreden. Dit is inmiddels doorgegeven aan de sitebeheerder "
+"via e-mail en zal spoedig worden gerepareerd. Bedankt voor uw geduld."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Zoek"
+
+#: contrib/admin/templates/admin/login.html:17
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+msgid "Username:"
+msgstr "Gebruikersnaam:"
+
+#: contrib/admin/templates/admin/login.html:20
+#: contrib/comments/templates/comments/form.html:6
+msgid "Password:"
+msgstr "Wachtwoord:"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Wachtwoord <a href=\"/password_reset/\">vergeten</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Welkom,"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Documentatie bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Om bookmarklets te installeren, sleep de link naar uw "
+"bladwijzers\n"
+"werkbalk, of rechtermuis klik op de link en voeg het toe aan de bladwijzer. "
+"Nu kan\n"
+"de bookmarklet vanuit elke pagina op de site worden gekozen. Let erop dat "
+"het soms\n"
+"noodzakelijk is dat de computer van waaruit de pagina wordt bekeken intern "
+"is\n"
+"(Raadpleeg uw systeembeheerder of uw computer zich op het interne netwerk "
+"bevind).<p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentatie voor deze pagina"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Spring vanuit elke pagina naar de documentatie voor de view die gegenereerd "
+"wordt door die pagina"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Toon object ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Toont de content-type en unieke ID voor pagina's die een enkel object "
+"voorsteld."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Bewerk dit object (huidig venster)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Ga naar de beheerpagina voor pagina's die een enkel object weergeven."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Bewerk dit object (nieuwe pagina)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Zoals hierboven, maar opent de beheerpagina in een nieuw venster."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Tijd:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Huidige:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Wijziging:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Wachtwoord hersteld"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Uw wachtwoord vergeten? Geef uw e-mailadres op en er zal een nieuw "
+"wachtwoord worden toegekend en aan u worden toegezonden."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailadres:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Herstel mijn wachtwoord"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "U krijgt deze e-mail omdat u om een nieuw wachtwoord heeft gevraagd"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "voor uw gebruikersaccount op %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Uw nieuwe wachtwoord is: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Aarzel niet om op deze pagina uw wachtwoord te wijzigen:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Uw gebruikersnaam, mocht u deze vergeten zijn:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Bedankt voor het gebruik van onze site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Het %(site_name)s team"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Bedankt voor de aanwezigheid op de site vandaag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Meld u opnieuw aan"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Wachtwoord herstel geslaagd"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Een nieuw wachtwoord is per e-mail verstuurd. U zult het spoedig ontvangen."
+
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:4
+msgid "Password change"
+msgstr "Wachtwoord wijziging"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Vanwege de beveiliging moet u uw oude en twee keer een nieuw wachtwoord"
+"invoeren, zodat we kunnen controleren of er geen typefouten zijn gemaakt."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Oud wachtwoord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nieuw wachtwoord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Bevestig wachtwoord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Wijzig mijn wachtwoord"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Wachtwoord wijzigen is geslaagd"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Uw wachtwoord is gewijzigd."
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domeinnaam"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "weergavenaam"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Voorbeeld: '/about/contact/'. Zorg voor slashes aan het begin en eind."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "inhoud"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "opmerkingen toestaan"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "sjabloonnaam"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Voorbeeld: 'flatpages/contact_page'. Als deze niet is opgegeven, dan wordt "
+"'flatpages/default' gebruikt."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registratie verplicht"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Indien dit is aangekruist kunnen alleen ingelogde gebruikers deze pagina "
+"bekijken."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "platte pagina"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "platte pagina's"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "omgeleid via"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Dit moet een absoluut pad zijn, zonder de domein naam. Bijvoorbeeld: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omleiden naar"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Dit kan een absoluut pad (zoals hierboven) zijn of een volledige URL "
+"beginnend met 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "omleiding"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "omleidingen"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "object ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "kop"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "opmerking"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "waardering #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "waardering #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "waardering #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "waardering #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "waardering #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "waardering #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "waardering #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "waardering #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "is een geldige waardering"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "datum/tijd toegevoegd"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "is openbaar"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "is verwijderd"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Kruis deze box aan indien de opmerking niet gepast is. Een \"Dit commentaar "
+"is verwijderd\" bericht wordt dan getoond"
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "opmerkingen"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Inhoud object"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Gepost door %(user)s op %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "naam van persoon"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adres"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "goedgekeurd door de staf"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "vrije opmerking"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "vrije opmerkingen"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "score"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "score datum"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karma score"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma scores"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d waardering door %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Deze opmerking is gemarkeerd door %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "markeerdatum"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "gebruikersmarkering"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "gebruikersmarkeringen"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Gemarkeerd door %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "datum verwijdering"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "verwijderd door moderator"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "verwijderd door moderator"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Verwijderd door moderator %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonieme gebruikers kunnen niet stemmen"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Ongeldige opmerkingen ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Niet op uzelf stemmen"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Deze waardering is verplicht omdat u tenminste één andere waardering hebt "
+"ingevoerd."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Deze opmerking is gepost door een gebruiker die minder dan %(count)s "
+"opmerking heeft gepost:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Deze opmerking is gepost door een gebruiker die minder dan %(count)s "
+"opmerkingen heeft gepost:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Deze opmerking is gepost door een \"fijne\" gebruiker:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Alleen POSTs zijn toegestaan"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Een of meerdere verplichte velden zijn niet ingevuld"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Iemand heeft het opmerkingenformulier gewijzigd (Beveilingsinbreuk)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Het opmerkingenformulier heeft een ongeldig 'target' parameter -- het object "
+"ID was ongeldig"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Het opmerkingenformulier heeft geen 'voorbeeld' of 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Uw wachtwoord vergeten?"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Waarderingen"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Verplicht"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Optioneel"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Plaats een foto"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Opmerking:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Concept opmerking"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Uw gebruikersnaam:"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "sessiesleutel"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "sessiegegevens"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "verloopdatum"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sessie"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sessies"
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "python model-class-naam"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "inhoudstype"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "inhoudstypen"
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Zorg ervoor dat uw tekst korter is dan %s karakter."
+msgstr[1] "Zorg ervoor dat uw tekst korter is dan %s karakters."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Regeleindes zijn niet toegestaan."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Selecteer een geldige keuze; '%(data)s is niet in %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Het gegeven bestand is leeg."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Geef een geheel getal op tussen -32.768 en 32.767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Geef een geheel getal op."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Geef een geheel getal op tussen 0 en 32.767."
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "maandag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "dinsdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "woensdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "donderdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "vrijdag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "zaterdag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "zondag"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "januari"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "februari"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "maart"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "april"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "mei"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "juni"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "juli"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "augustus"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "december"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "jan"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "feb"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "mar"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "apr"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "mei"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jun"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "jul"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "aug"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "sep"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "nov"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "dec"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "dec."
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "d-n-Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "d-n-Y H:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "jaar"
+msgstr[1] "jaren"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "maand"
+msgstr[1] "maanden"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "week"
+msgstr[1] "weken"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dagen"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "uur"
+msgstr[1] "uren"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuut"
+msgstr[1] "minuten"
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ja,nee,misschien"
+

Added: vendor/django/current/django/conf/locale/nl/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/nl/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/nl/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/nl/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/nl/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# Dutch Javascript translations.
+# Copyright (C) 2006
+# This file is distributed under the same license as the Django package.
+# Rudolph Froger <rfroger at estrate.nl>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 17:39+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Rudolph Froger <rfroger at estrate.nl>\n"
+"Language-Team: nl <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: 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 ""
+"januari februari maart april mei juni juli augustus september oktober "
+"november december"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "Z M D W D V Z"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "zondag maandag dinsdag woensdag donderdag vrijdag zaterdag"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Beschikbare %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Kies allemaal"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Toevoegen"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Verwijderen"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Gekozen %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Selecteer uw keuze(s) en klik "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Allemaal verwijderen"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Nu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Klok"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Kies een tijd"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Middernacht"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 uur"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "12 uur"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Annuleren"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Vandaag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Gisteren"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Morgen"

Added: vendor/django/current/django/conf/locale/no/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/no/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/no/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/no/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/no/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2031 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) 2005 and beyond
+# This file is distributed under the same license as the PACKAGE package.
+# Espen Grindhaug <espen at grindhaug.org>, Nov 2005.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Espen Grndhaug <espen at grindhaug.org>\n"
+"Language-Team: Norwegian\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#, fuzzy
+msgid "object ID"
+msgstr "Vis objekt ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+#, fuzzy
+msgid "comment"
+msgstr "innhold"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr ""
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr ""
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP adresse"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "innhold"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#, fuzzy
+msgid "Content object"
+msgstr "innholds type"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+#, fuzzy
+msgid "person's name"
+msgstr "fornavn"
+
+#: contrib/comments/models.py:171
+#, fuzzy
+msgid "ip address"
+msgstr "IP adresse"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "tillat kommentarer"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "tillat kommentarer"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr ""
+
+#: contrib/comments/models.py:234
+#, fuzzy
+msgid "score date"
+msgstr "utløpsdato"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr ""
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, fuzzy, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denne kommentaren er skrevet med lite omtanke:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+#, fuzzy
+msgid "flag date"
+msgstr "flatside"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Bruker"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Brukere"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+#, fuzzy
+msgid "deletion date"
+msgstr "sesjon data"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonyme brukere kan ikke stemme"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Ikke gyldig kommentar ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Du kan ikke stemme selv"
+
+#: contrib/comments/views/comments.py:28
+#, fuzzy
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Denne bla bla.."
+
+#: contrib/comments/views/comments.py:112
+#, fuzzy, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Denne kommentaren var skrevet av en bruker som har fra før skrevet under %"
+"(count)s kommentarer:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Denne kommentaren var skrevet av en bruker som har fra før skrevet under %"
+"(count)s kommentarer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, fuzzy, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Denne kommentaren er skrevet med lite omtanke:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Bare POST er tillatt"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "En eller flere av feltene som er krevd ble ikke sendt."
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Noen har endret på komentar feltene (sikkerhets advarsel)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "Skjemaet hadde en ugyldig verdi - objekt IDen var ugyldig"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+"Kommentar skjemaet returnerte ikke et 'forhåndsvisning' eller 'post' objekt"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Brukernavn:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Passord:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Endre passord"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Log ut"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "tillat kommentarer"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "tillat kommentarer"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "brukernavn"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Av %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Alle"
+
+#: contrib/admin/filterspecs.py:109
+#, fuzzy
+msgid "Any date"
+msgstr "Alle datoer"
+
+#: contrib/admin/filterspecs.py:110
+#, fuzzy
+msgid "Today"
+msgstr "Mondag"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+#, fuzzy
+msgid "No"
+msgstr "Nov."
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Ukjent"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "tid for handling"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objekt id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objekt repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "handlings flagg"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "endre melding"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "logg notis"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "logg innlegg"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Alle datoer"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Log inn"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Du må logge inn igjen, fordi sesjonen din har gått ut på dato, men ikke ikke "
+"bekjymr deg informasjonen du sendte ble lagret."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Det ser ut som om nettleseren din ikke vill ta i mot informasjonskapsler "
+"('cookies'). Vennligst omkonfigurer nettleseren din, last siden på ny og "
+"prøv igjen."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Brukernavnet kan ikke inneholde '@'"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Epost adressen din er ikke brukernavnet ditt, prøv '%s' i stede."
+
+#: contrib/admin/views/main.py:226
+#, fuzzy
+msgid "Site administration"
+msgstr "Django administrasjon"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" ble lagt inn i databasen."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Du kan endre under"
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Du kan legge til en ny %s under."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Ny %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "La til %s"
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "og"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Endret %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Slettet %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Ingen felt endret."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" ble endret."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" ble endret. Du kan endre det igjen under."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Endre %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "En eller flere %(fieldname)s i %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "En eller flere %(fieldname)s i %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" ble slettet."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Er du sikker?"
+
+#: contrib/admin/views/main.py:533
+#, fuzzy, python-format
+msgid "Change history: %s"
+msgstr "Endre historien: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Velg %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Velg %s for å endre"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Heltall"
+
+#: contrib/admin/views/doc.py:278
+#, fuzzy
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (Enten \"True\" eller \"False\")"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Tekst (opp til %(maxlength)s tegn)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Heltall skilt med kommaer"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Dato (uten tid)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Dato/tid"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Epost adresse"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Sti til fil"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Desimal tall"
+
+#: contrib/admin/views/doc.py:291
+#, fuzzy
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (enten \"True\", \"False\" eller \"None\")"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Tid"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "Internettadresse"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stat (i USA, to store bokstaver)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML tekst"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentasjon"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Endre passord"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Hjem"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Historie"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dato/tid"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Bruker"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Funksjon"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. M U - h:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Dette objektet har ingen endrings historie. Den var sannsynligvis ikke laget "
+"via denne siden"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administrasjonsside"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administrasjon"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Tjener feil"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Tjener feil (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Tjener feil <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Det har vært en feil. Feilen er blitt rapportert til administrator via e-"
+"mail, og vill bli fikset snart. Takk for din tålmodighet."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Fant ikke siden"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Beklager, men siden du spør etter finnest ikke."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Legg til"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Endre"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Du har ikke rettigheter til å endre."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Siste handlinger"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mine handlinger"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ingen tilgjengelige"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Legg til %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Har du <a href=\"/password_reset/\">glemt passordet ditt</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Velkommen"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Slett"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Vist du sletter %(object_name)s '%(object)s' vill du også slette relaterte "
+"objekter, men du har ikke tillatelse til å slette de følgende objektene:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Er du sikker på at du vill slette %(object_name)s \"%(object)s\"? Alle de "
+"følgende relaterte objektene vill bli slettet:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, jeg er sikker"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "Av %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Vis på siden"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Vennligst fiks feilen under."
+msgstr[1] "Vennligst fiks feilene under."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Rekkefølge"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Rekkefølge:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Lagre som ny"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Lagre og legg til en ny"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Lagre og fortsett å endre"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Lagre"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Endre passord"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Passordet er endret"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ditt passord er endret."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Tilbakestill passord"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Har du glemt passordet ditt? Skriv inn epost adressen din under, så sender "
+"vi deg et nytt passord via epost."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Epost adresse:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Tilbakestill mitt passord"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Takk for å bruke tid på internett siden i dag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Log inn igjen"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Passordet ble tilbakestilt"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Vi sender deg et nytt passord til epost adressen du oppgav. Du villmotta det "
+"snart."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Venligst skriv inn ditt gamle passord, for sikkerthets grunner, så skriv inn "
+"ditt nye passord to ganger slik at vi kan kontrollere at det er rett."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Gammelt passord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nytt passord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Gjenta nytt passord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Endre passord"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr ""
+"Du har mottatt denne epost-en fordi du ba om å tilbakestille passordet ditt"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "for din konto hos %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ditt nye passord er: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Du kan endre dette passordet ved å gå til denne siden:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "I tilfellet du har glemt brukernavnet ditt, så er det:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Takk for at du bruker vår side!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Hilsen %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bokmerker"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentasjon bokmerker"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentasjon for denne siden"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Hopp fra hvilken som helst side til dokumentasjonen for visnings funksjonen "
+"som laget siden."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Vis objekt ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Viser \"content-type\" og en unik ID for sider som representerer et enkelt "
+"objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Endre dette objektet (Ã¥pnes i dette vinduet)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+#, fuzzy
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Hopp til administrasjonsiden for siden som representerer et enkelt objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Endre dette objektet (Ã¥pnes i et nytt vindu)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Samme som over, men åpner administrasjonsiden i et nytt vindu."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+#, fuzzy
+msgid "Time:"
+msgstr "Tid"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "Endre"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "omadresser fra"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Denne burde vær en fullstendig sti, uten domene navnet. Foreksempel: '/"
+"nyheter/les/"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "omadresser til"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Denne kan enten være en fullstendig sti (som over), eller en hel "
+"internettadresse som starter med 'http://'"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "omadressering"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "omadresserelser"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Eksempel: '/om/kontakt/'. Vær sikker på at du har en skråstrek forran og bak."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "tittel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "innhold"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "tillat kommentarer"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "mal navn"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Eksempel: 'flatfiler/kontakt_side'. Vist denne ikke denne er gitt, vill "
+"'flatfiles/default' bli brukt."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrering kreves"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Vist denne er krysset av er det bare brukere som er logget inn som kan se "
+"siden."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "flatside"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "flatsider"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "navn"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "kodenavn"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Rettighet"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Rettigheter"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Gruppe"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grupper"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "brukernavn"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "fornavn"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "etternavn"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-post adresse"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "passord"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "administrasjons status"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Bestemmer om brukeren kan logge inn på denne administrasjons siden."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktiv"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "super bruker"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "liste logg inn"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "registrerings dato"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"I tillegg til rettighetene som blir gitt manuelt, får også brukeren full "
+"tilgang til gruppene han/hun er i."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Rettigheter"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Bruker"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Brukere"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Personlig informasjon"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Rettigheter"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Viktige datoer"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupper"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Meldinger"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "python modul navn"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "innholds type"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "innholds typer"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "sesjon nøkkel"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "sesjon data"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "utløpsdato"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesjon"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesjoner"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domene navn"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "vist navn"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "side"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sider"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "j. M U"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "j. M U - h:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "h:i"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Mondag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Tirsdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Onsdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Torsdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Fredag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Lørdag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Søndag"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mars"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Juni"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Juli"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Desember"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "og"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "Mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fef."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Des."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+#, fuzzy
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Mai"
+msgstr[1] "Mai"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+#, fuzzy
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "side"
+msgstr[1] "side"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengalsk"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tsjekkisk"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Walisisk"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Dansk"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Tysk"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Engelsk"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spansk"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Fransk"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galisisk"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandsk"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italiensk"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norsk"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasiliansk"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Romansk"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Russisk"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovakisk"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Slovakisk"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbisk"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Svensk"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brasiliansk"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Simplifisert Kinesisk"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Dette feltet må bare inneholde bokstaver, nummer og understreker."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Dette feltet må bare inneholde bokstaver, nummer, understreker og "
+"skråstreker."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Tor skrift er ikke tillatt her."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Små bokstaver er ikke tillatt her."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Skriv inn bare tall, skilt med kommaer."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Skriv inn e-post adresser skilt med kommaer."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Vennligst skriv inn en godkjent IP adresse."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Dette felte kan ikke være tomt."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Det er bare tall som kan stå i dette feltet."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Dette feltet kan ikke bare bestå av nummer."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Skriv inn et helt nummer."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Bare alfabetiske bokstaber er tillatt her."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Skriv inn en dato i Ã…Ã…Ã…Ã…-MM-DD formatet."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Skriv inn tiden i TT:MM formatet."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Skriv inn dato og tid i Ã…Ã…Ã…Ã…-MM-DD TT:MM formatet."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Skriv inn en godkjent e-post adresse."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Lastopp et bilde. Filen du lastet opp var ikke et bilde, eller så var det et "
+"ødelagt bilde"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Internettadressen %s peker ikke til et godkjent bilde."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefon nummeret må være i XXX-XXX-XXXX formatet. \"%s\" er ikke godkjent."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Internettadressen %s peker ikke til en godkjent QuickTime film."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "En godkjent internettadresse er påbudt."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Godkjent HTML er påbudt. Feilene var:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Ikke godkjent XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Ikke godkjent internettadresse: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Internettadresse fører til en side som ikke virker."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Skriv inn en godkjent amerikansk stats forkortelse."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pass munnen din! Ordet %s er ikke tillatt her."
+msgstr[1] "Pass munnen din! Ordene %s er ikke tillatt her."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Dette felte må være det samme som i '%s' feltet."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Vennligst skriv inn noe i minst et felt."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Vennligst skriv inn noe i begge felta, eller la dem stå blanke."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Dette feltet må bare brukes vist %(field)s er lik %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Dette feltet må bare brukes vist %(field)s ikke er lik %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Like verdier er ikke tillatt."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Denne verdien må være 'power' av %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Vennligst skriv inn et godkjent desimal tall."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Skriv inn et desimal tall med maksimum %s total antall tall."
+msgstr[1] "Skriv inn et desimal tall med maksimum %s total antall tall."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Skriv inn et desimal tall med maksimum %s tall bak komma. "
+msgstr[1] "Skriv inn et desimal tall med maksimum %s tall bak komma. "
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+"Er du sikker på at fila du prøver å laste opp er minimum %s bytes stor?"
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+"Er du sikker på at fila du prøver å laste opp er maksimum %s bytes stor?"
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Formatet i dette feltet er feil."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Dette feltet er feil."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Klarte ikke å motta noe fra %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Tnternettadressen %(url)s returnerte en ikke godkjent Content-Type '%"
+"(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Vennligst lukk taggen %(tag)s på linje %(line)s. (Linja starer med \"%(start)"
+"s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Noe av teksten som starter på linje %(line)s er ikke tillatt. (Linja starter "
+"med \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" på linje %(line)s er ikke en godkjent tillegg. (Linja starter "
+"med \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" på linje %(line)s er ikke en godkjent tag. (linja starter med "
+"\"%(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En tag på linje %(line)s mangler en av de påbydte tillegga. (linja starter "
+"med \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"\"%(attr)s\" tillegg på linje $(line)s har en ikke godkjent verdi. (Linja "
+"starter med \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, fuzzy, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "$(optname)s med %(fieldname)s finnes allerede."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "$(optname)s med %(fieldname)s finnes allerede."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Dette feltet er påkrevd."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Denne verdien må være 'power' av %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Denne verdien må være 'power' av %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Dette feltet er feil."
+
+#: db/models/fields/__init__.py:562
+#, fuzzy
+msgid "Enter a valid filename."
+msgstr "Skriv inn en godkjent e-post adresse."
+
+#: db/models/fields/related.py:43
+#, fuzzy, python-format
+msgid "Please enter a valid %s."
+msgstr "Vennligst skriv inn en godkjent IP adresse."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Separer Id-ene med kommaer."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+"Hold nede \"Control\", eller \"Command\" på en Mac, for å velge mere enn en."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, fuzzy, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Sjekk at teksten er kortere enn %s bokstaver"
+msgstr[1] "Sjekk at teksten er kortere enn %s bokstaver"
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Det er ikke tillatt med flere linjer her."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Velg et av valga; '%(data)s' er ikke i %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Filen er tom."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Skriv inn et heltall mellom -31768 og 32767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Skriv inn et positivt heltall."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Skriv inn et heltall mellom 0 og 32767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Comments"
+#~ msgstr "tillat kommentarer"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Tekst (opp til 50 tegn)"
+
+#~ msgid "label"
+#~ msgstr "merkelapp"
+
+#~ msgid "package"
+#~ msgstr "pakke"
+
+#~ msgid "packages"
+#~ msgstr "pakker"
+
+#~ msgid "Error in Template"
+#~ msgstr "Feil i mal"
+
+#~ msgid ""
+#~ "\n"
+#~ "In template %(name)s, error at line %(line)s:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "I mal %(name)s, var det en feil på linje %(line)s:\n"

Added: vendor/django/current/django/conf/locale/no/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/no/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/no/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/no/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/no/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,109 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Espen Grindhaug <espen.grindhaug at mail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: Espen Grindhaug <espen.grindhaug at gmail.com>\n"
+"Language-Team: no\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s er tilgjengelige"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+#, fuzzy
+msgid "Choose all"
+msgstr "Velg alle"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Ny"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Slett"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s er valgt"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Velg ditt svaralternativ(er) og klikk"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Tøm"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr "Januar Februar Mars April Mai Juni Juli August September Oktober November Desember"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Søndag Mandag Tirsdag Onsdag Torsdag Fredag Lørdag"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "S M T O T F L"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "NÃ¥"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Klokke"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Velg et klokkeslett"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "24.00"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "18.00"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "12.00"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Avbryt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "I dag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "I går"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "I morgen"

Added: vendor/django/current/django/conf/locale/pl/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/pl/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/pl/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/pl/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/pl/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1963 @@
+# Polish .po file.
+# Copyright (C) 2006 Krzysztof Kajkowski
+# This file is distributed under the same license as the django package.
+# Krzysztof Kajkowski <krzysztof.kajkowski at gmail.com>, 2006.
+# cayco <cayco at cayco.pl>, 2006.
+# 
+# 
+msgid ""
+msgstr ""
+"Project-Id-Version: 0.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2006-02-21 11:10+0100\n"
+"Last-Translator: Piotr Maliński <admin at rk.edu.pl>\n"
+"Language-Team: Polish <pl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID obiektu"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "nagłówek"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentarz"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "ocena #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "ocena #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "ocena #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "ocena #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "ocena #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "ocena #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "ocena #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "ocena #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "jest poprawnÄ… ocenÄ…"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/czas dodania"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "publicznie dostepny"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "Adres IP"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "usunięty"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Zaznacz to pole jeżeli komentarz jest nieodpowiedni. Wyświetlony zostanie tekst \"Ten "
+"komentarz został usunięty\". "
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentarze"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Obiekt Treści"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Dodane przez %(user)s dnia %(date)s\n"
+"\n"
+"%(comment)y\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "Nazwa osoby"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "adres ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "zaakceptowano"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "wolny komentarz"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "wolne komentarze"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "ilość punktów"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data przyznania punktów"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "ilość punktów"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "wyniki"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d ocenÄ™ przez %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Komentarz oflagowany przez %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "data flagi"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "flaga użytkownika"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "flagi użytkownika"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flaga %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data skasowania"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "usunięcie moderatora"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "usunięcia moderatorów"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Usunięcie moderatora przez %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonimowi użytkownicy nie mogą głosować"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Błędny ID komentarza"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Nie można głosować na siebie"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Ta ocena jest wymagana gdyż podałeś przynajmniej jedną inną ocenę."
+
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Dozwolone tylko POSTy"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno lub więcej wymaganych pól nie zostało wypełnionych"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Nazwa użytkownika:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Hasło:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Zapomniałeś hasło?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Wyloguj siÄ™"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Oceny"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Wymagane"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Opcjonalne"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Wyślij zdjęcie"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentarz:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "PodglÄ…d"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Twoje imiÄ™:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Przez %s:</h3>\n"
+"</ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Wszystko"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Jakolwiek data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Dzisiaj"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Ostatnie 7 dni"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Ten miesiÄ…c"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Ten rok"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Tak"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nie"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Nieznany"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "czas akcji"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id obiektu"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "reprezentacj obiektu"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "flaga akcji"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "zmień wiadomość"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "log"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "logi"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Wszystkie daty"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Proszę wpisać poprawną nazwę użytkownika i hasło. Uwaga: wielkość liter ma "
+"znaczenie."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Zaloguj siÄ™"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Zaloguj się ponownie. Twoja sesja wygasła lecz twoje zgłoszenie "
+"zostało zapisane."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Twoja przeglądarka nie chce akceptować ciasteczek. Zmień "
+"jej ustawienia i spróbuj ponownie."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Nazwy użytkowników nie mogą zawierać znaków '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Twój adres e-mail to nie jest twój login. Spróbuj '%s'."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Administracja stronÄ…"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" dodany pomyślnie."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Możesz ponownie edytować wpis poniżej."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Możesz dodać nowy wpis %s poniżej."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Dodano %s"
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Zmieniono %s"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Skasowano %s"
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Żadne pole nie zmienione."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" zostało pomyślnie zmienione."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" dodane pomyślnie. Możesz edytować ponownie wpis poniżej."
+
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Zmień %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jedno lub więcej %(fieldname)s w %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jedno lub więcej %(fieldname)s w %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" usunięty pomyślnie."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "JesteÅ› pewien?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Historia zmian: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Zaznacz %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Zaznacz %s aby zmienić"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Liczba całkowita"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Wartość logiczna (True, False - prawda lub fałsz)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Łańcuch (do %(maxlength)s znaków)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Liczby całkowite rozdzielone przecinkami"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Data (bez godziny)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Data (z godzinÄ…)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Adres e-mail"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Ścieżka do pliku"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Numer dziesiętny"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Wartość logiczna (True, False, None - prawda, fałsz lub nic)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Numer telefonu"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Czas"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stan USA (dwie duże litery)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Tekst XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentacja"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Zmiana hasła"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "PoczÄ…tek"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Historia"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/czas"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Użytkownik"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Akcja"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ten obiekt nie ma historii zmian. Najprawdopodobniej wpis te nie "
+"został dodany poprzez panel admina"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Administracja stronÄ… Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administracja Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "BÅ‚Ä…d serwera"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "BÅ‚ad serwera (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "BÅ‚Ä…d Serwera <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Wystąpił niespodziewany błąd. Raport został wysłany emailem "
+"administratorowi strony."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strona nie znaleziona"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Niestety nie można znaleźć rządanej strony."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Modele dostępne w aplikacji %(name)s."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Zmień"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nie masz uprawnień by edytować cokolwiek"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Ostatnie akcje"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moje akcje"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Brak"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr ""
+"Czy <a href=\"/password_reset/\">zapomniałeś/łaś</a> hasła?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Witaj,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Skasuj"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Tak, usuń"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "Używając %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Szukaj"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Pokaż na stronie"
+
+#: contrib/admin/templates/admin/change_form.html:30
+#, fuzzy
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Proszę popraw poniższy błąd"
+msgstr[1] "Proszę popraw poniższy błąd"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Sortowanie"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "PorzÄ…dek:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Zapisz jako nowe"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Zapisz i dodaj nowe"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Zapisz i kontynuuj edycjÄ™"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Zapisz"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Zmiana hasła"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Hasło zmienione"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Twoje hasło zostało zmienione"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Zresetuj hasło"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Podaj swój adres email. Hasło zostanie zresetowane i wysłane na twój "
+"adres email."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Adres e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Zresetuj moje hasło"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Dziękujemy za odwiedzenie serwisu."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Zaloguj ponownie"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Udane resetowanie hasła"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Nowe hasło zostało wysłane na podany adres email. Powinieneś "
+"otrzymać je niebawem."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "Podaj swoje stare hasło i dwa razy nowe."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Stare hasło:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nowe hasło:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potwierdź hasło:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Zmień hasło"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Otrzymałeś email gdyż zarządałeś zresetowania hasła"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "dla twojego konta użytkownika na stronie %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Twoje nowe hasło to: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Możesz zmienić je na stronie:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Twój login:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Dziękujemy za używanie strony!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Zespół %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentacja dla tej strony"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Pokaż ID obiektu"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Pokazuje typ i unikalne ID dla stron, które reprezentują "
+"pojedynczy obiekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Edytuj ten obiekt (bierzÄ…ce okno)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Przeskok do panelu admina dla stron reprezentujÄ…cych pojedynczy obiekt"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Edytuj ten obiekt (nowe onko)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Jak wyżej, tyle że otwiera nowe okno."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Czas:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Teraz:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Zmień:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "przekieruj z"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Podaj pełną ścieżkę bez nazwy domeny. Przykład: '/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "przekierowanie do"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "Ścieżka jak wyżej lub pełny URL z http://"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "przekieruj"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "przekierowania"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Przykład: '/about/contact/'. Upewnij się że wpisałeś otwierający i zamykający slash."
+
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "tytuł"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "zawartość"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "włącz komentarze"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nazwa szablonu"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "wymagana rejestracja"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Jeżeli zaznaczone - tylko zalogowani użytkownicy będą mogli zobaczyć stronę."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr ""
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nazwa"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr ""
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "uprawnienie"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "uprawnienia"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "grupa"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "grupy"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "użytkownik"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "ImiÄ™"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "Nazwisko"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "adres e-mail"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "hasło"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Użyj '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "stan w zespole"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Oznaczy czy użytkownik może zalogować się do panelu admina."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktywny"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "Główny Administrator"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "ostatnio zalogowany"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "data przyłączenia"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Oprócz uprawnień przypisanych bezpośrednio użytkownikowi otrzyma on "
+"uprawnienia grup, do których należy."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "uprawnienia użytkownika"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Użytkownik"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Uzytkownicy"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Dane osobowe"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Uprawnienia"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Ważne daty"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupy"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "wiadomość"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Twoja przeglądarka nie chce akceptować ciasteczek. Są one "
+"wymagane do zalogowania siÄ™."
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "nazwa pythonowa modelu klasy"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "typ zawartości"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "typy zawartości"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "klucz sesji"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "data sesji"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "data wygaśnięcia sesji"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesja"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesje"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nazwa domeny"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "wyświetlana nazwa"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "strona"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "strony"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "Y-m-d"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "Y-m-d H:i:s"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Poniedziałek"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Wtorek"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Åšroda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Czwartek"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "PiÄ…tek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Niedziela"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Styczeń"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Luty"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marzec"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Kwiecień"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Czerwiec"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Lipiec"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Sierpień"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Wrzesień"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Pażdziernik"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Listopad"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Grudzień"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "sty"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "luty"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "marz"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "kwie"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "maj"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "czerw"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "lip"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "sier"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "wrze"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "paź"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "list"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "gru"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Sty."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Lut."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Sier."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Wrz."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Paź."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Lis."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Gru."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "rok"
+msgstr[1] "lat"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "miesiÄ…c"
+msgstr[1] "miesięcy"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "tydzień"
+msgstr[1] "tygodni"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dzień"
+msgstr[1] "dni"
+
+#: utils/timesince.py:16
+#, fuzzy
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "godzina"
+msgstr[1] "godzina"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minut"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Czeski"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Walijski"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Duński"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Niemiecki"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Grecki"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Angielski"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Hiszpański"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francuski"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galicyjnski"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "Hebrajski"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandzki"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "WÅ‚oski"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japoński"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Holenderski"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norweski"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brazylijski"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumuński"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Rosyjski"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "SÅ‚owacki"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "SÅ‚owacki"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbski"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Szwedzki"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brazylijski"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Uproszczony Chiński"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Chiński tradycyjny"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "To pole możei zawierać tylko litery, cyfry i podkreślenia"
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "To pole może zawierać jedynie litery, cyfry, podkreślenia i slasze."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Wielkie litery nie sÄ… tutaj dozwolone"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Małe litery nie są tutaj dozwolone"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Wpisz tylko cyfry odddzielone przecinkami"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Wpisz poprawne adresy e-mai oddzielone przecinkamil"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Proszę wpisać poprawny adres IP"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Proszę wypełnić te pola"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Tu mogą być tylko cyfry"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "To pole nie może zawierać jedynie cyfr."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Wpisz całą liczbę"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tutaj sÄ… dozwolone tylko litery"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Proszę wpisać poprawną datę w formacie RRRR-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Proszę wpisać poprawny czas w formacie GG:MM"
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Wprowadź poprawną datę i czas w formacie RRRR-MM-DD GG:MM"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Wprowadź poprawny adres e-mail"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Wgraj poprawny plik graficzny. Ten, który został wgrany jest niepoprawny "
+"albo uszkodzony."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Odnośnik %s nie wskazuje na poprawny plik z obrazem."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Numery telefoniczne muszą być w formacie XXX-XXX-XXXX. \"%s\" jest "
+"niepoprawny."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Odnośnik %s nie wskazuje na poprawne plik QuickTime video."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Wymagany jest poprawny URL."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Wymagany jest poprawny odnośnik. Błędy to:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Nieprawidłowy format XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Niepoprawny odnośnik: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odnośnik %s jest nieprawidłowy."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Wpisz poprawny kod stanu U.S."
+
+#: core/validators.py:229
+#, fuzzy, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Nie wolno przeklinać! Słowo %s jest niedozwolone."
+msgstr[1] "Nie wolno przeklinać! Słowo %s jest niedozwolone."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "To pole musi pasować do pola '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Proszę wpisać cokolwiek do chociaż jednego pola."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Proszę uzupełnić oba pola lub zostawić je puste."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "To pole musi być uzupełnione jeśli %(field)s jest %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Proszę wpisać poprawną liczbę dziesiętną."
+
+#: core/validators.py:349
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną."
+msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną."
+
+#: core/validators.py:352
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Proszę wpisać poprawną liczbę dziesiętną."
+msgstr[1] "Proszę wpisać poprawną liczbę dziesiętną."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Upewnij się, że wgrany plik ma conajmniej %s bajtów."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Upewnij się, że wgrany plik nie zawiera więcej niż %s bajtów."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Format tego pola jest nieprawidłowy."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "To pole jest nieprawidłowe."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nie można otrzymać nic z %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "To pole jest wymagane"
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Wartość logiczna (True, False - prawda lub fałsz)"
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "To pole jest nieprawidłowe."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Wpisz poprawnÄ… nazwÄ™ pliku."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Proszę wpisać poprawne %s."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Oddziel kilka pól ID przecinkami."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Trzymaj przyciśnięty klawisz \"Ctrl\", lub \"Command\" na Macu aby "
+"zaznaczyć więcej niż jeden wybór."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, fuzzy, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Upewnij się, że jest mniej niż %s znaków."
+msgstr[1] "Upewnij się, że jest mniej niż %s znaków."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Znaki nowego wiersza sÄ… tutaj niedopuszczalne."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Wgrany plik jest pusty."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Proszę wpisać liczbę z zakresu od -32 768 do 32 767"
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Proszę wpisać liczbę dodatnią."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Proszę wpisać liczbę z zakresu od 0 do 32 767"
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "tak,nie, może"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Ciąg znaków (do ilości 50 znaków)"
+
+#~ msgid "Comment"
+#~ msgstr "Komentarz"
+
+#~ msgid "Comments"
+#~ msgstr "Komentarze"
+
+#~ msgid "label"
+#~ msgstr "etykieta"
+
+#~ msgid "package"
+#~ msgstr "pakiet"
+
+#~ msgid "packages"
+#~ msgstr "pakiety"

Added: vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2050 @@
+# Português do Brasil translation of django.
+# Copyright (C) 2006 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# João Marcus Christ <joaoma at gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2006-01-23 19:54-0200\n"
+"Last-Translator: João Marcus Christ <joaoma at gmail.com>\n"
+"Language-Team: Português do Brasil <pt-br at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "id do objeto"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "título"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "comentário"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "avaliação #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "avaliação #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "avaliação #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "avaliação #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "avaliação #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "avaliação #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "avaliação #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "avaliação #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "é uma avaliação válida"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "data/hora de envio"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "é público"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "Endereço IP:"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "foi removido"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Selecione esta opção se o comentário é inapropriado. Uma mensagem \"Este "
+"comentário foi removido\" será mostrada no lugar."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "comentário"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objeto de conteúdo"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Enviado por %(user)s em %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "nome da pessoa"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "endereço ip"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "aprovado pela equipe"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Comentário livre"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Comentários livres"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "pontuação"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "data de pontuação"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Pontuação de Karma"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Pontuação de Karma"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Availação %(score)d por %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"O usuário %(user)s colocou flags neste documento:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "marca de data"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Flag de usuário"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Flags de usuário"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flag por %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "data de apagamento"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Apagamento feito por moderador"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Apagamentos feitos por moderador"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Apagamento feito pelo moderador %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Usuários anônimos não podem votar"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "ID de comentário inválido"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Você não pode votar em si mesmo"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+"Esta avaliação é requerida porque você entrou com ao menos uma avaliação"
+
+#: contrib/comments/views/comments.py:112
+#, fuzzy, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Este comentário foi feito por um usuário esboço:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Este comentário foi feito por um usuário esboço:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Este comentário foi feito por um usuário esboço:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Somente POSTs são permitidos"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Um ou mais dos campos requeridos não foram enviados"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Alguém modificou o form de comentários (violação de segurança)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"O form de comentários teve um parâmetro 'target' inválido -- o ID do objeto "
+"é inválido"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "O form de comentários não forneceu nem 'preview' nem 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Usuário:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Senha:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Alterar minha senha"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Encerrar sessão"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "avaliação #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Comentário"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Comentário livre"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "usuário"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Por %s</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Todos"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Qualquer data"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Últimos 7 dias"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Este mês"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Este ano"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Sim"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Não"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Desconhecido"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "hora da ação"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id do objeto"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr do objeto"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "flag de ação"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "alterar mensagem"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "entrada de log"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "entradas de log"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Todas as datas"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Por favor entre usuário e senha corretos. Note que ambos os "
+"camposdiferenciam maiúsculas e minúsculas."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Acessar"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Por favor acesse novamente, pois sua sessão expirou. Não se preocupe: Os "
+"dados enviados foram salvos."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Parece que seu navegador não está configurado para aceitar cookies. Por "
+"favor habilite os cookies, recarregue esta página, e tente novamente."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Nomes de usuário não podem conter o caracter '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Seu endereço de e-mail não é seu nome de usuário. Tente usar '%s'"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Administração do Site"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado com sucesso."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Você pode editá-lo(a) de novo abaixo."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Você pode adicionar outro(a) %s abaixo."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Adicionar %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Adicionado %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "e"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Modificado %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Apagado %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Nenhum campo modificado."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi modificado com sucesso."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"O(A) %(name)s \"%(obj)s\" foi adicionado com sucesso. Você pode editá-lo(a) "
+"abaixo."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Modificar %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Um(a) ou mais %(fieldname)s em %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Um(a) ou mais %(fieldname)s em %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "O(A) %(name)s \"%(obj)s\" foi adicionado com sucesso."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Você tem certeza?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Histórico de Modificações: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Selecione %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Selecione %s para modificar"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Inteiro"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Lógico (Verdadeiro ou Falso)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "String (até %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Inteiros separados por vírgula"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Data (sem hora)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Data/hora"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "Endereço de e-mail"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Caminho do Arquivo"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Número decimal"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Lógico (Verdadeiro, Falso ou Nada)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relação com o modelo pai"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Número de telefone"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Texto"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Hora"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Estado dos EUA (duas letras maiúsculas)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "Texto XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Documentação"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Alterar senha"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Início"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Histórico"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Data/hora"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Usuário"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Ação"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Este objeto não tem um histórico de alterações. Ele provavelmente não foi "
+"adicionado por este site de administração."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Site de administração do Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administração do Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Erro no servidor"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Erro no servidor (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Erro no Servidor <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Houve um erro. Este foi reportado aos administradores do site através d e-"
+"mail e deve ser consertado em breve. Obrigado pela compreensão."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Página não encontrada"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Desculpe, mas a página requisitada não pode ser encontrada."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Modificar"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Você não tem permissão para edição."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Ações Recentes"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Minhas Ações"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nenhuma disponível"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Adicionar %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Você <a href=\"/password_reset/\"esqueceu a senha</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Bem vindo,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Apagar"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"A remoção de '%(object)s' %(object_name)s pode resultar na remoção de "
+"objetos relacionados, mas sua conta não tem a permissão para remoção dos "
+"seguintes tipos de objetos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Você tem certeza que quer remover o \"%(object)s\" %(object_name)s? Todos os "
+"seguintes itens relacionados serão removidos:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Sim, tenho certeza"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "Por %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Ver no site"
+
+#: contrib/admin/templates/admin/change_form.html:30
+#, fuzzy
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Por favor, corrija o erro abaixo."
+msgstr[1] "Por favor, corrija o erro abaixo."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Ordenação"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Ordem:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Salvar como novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Salvar e adicionar outro"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Salvar e continuar editando"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Salvar"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Alterar senha"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Senha alterada com sucesso"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Sua senha foi alterada."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Reinicializar senha"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Esqueceu a senha? Digite seu e-mail abaixo e nós iremos enviar uma nova "
+"senha para você."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Endereço de e-mail:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Reinicializar minha senha"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Obrigado por visitar nosso Web site hoje."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Acessar novamente"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Senha inicializada com sucesso"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Nós enviamos uma nova senha para o e-mail que você informou. Você deve estar "
+"recebendo uma mensagem em breve."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Por favor, informe sua senha antiga, por segurança, e então informe sua nova "
+"senha duas vezes para que possamos verificar que se ela está correta."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Senha antiga:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova senha:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirme a senha:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Alterar minha senha"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Você está recebendo este e-mail porque você pediu uma nova senha"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "para sua conta em %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Sua nova senha é: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Sinta-se livre para alterar esta senha visitando esta página:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Seu nome de usuário, caso tenha esquecido:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Obrigado por usar nosso site!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Time do %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Itens de bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Documentação de itens de bookmark"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Para instalar um item no bookmark, arraste o link para a \n"
+"barra de ferramentas de bookmarks, ou clique com o botão direito no link e\n"
+"adicione-o à barra de ferramentas. Agora você pode selecionar o item de\n"
+"bookmark de qualquer página do site. Lembre-se que alguns desses itens\n"
+"de bookmark requerem que você veja o site de um computador designado\n"
+"como \"interno\" (converse com seu administrador de sistemas se você não\n"
+"souber se seu computador é \"interno\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Documentação para esta página"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Leva você de qualquer página da documentação para a view que gera tal página."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Mostar ID de objeto"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Mostra o tipo de conteúdo e ID único para páginas que representam um objeto "
+"único."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Edita este objeto (janela atual)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Vai para a página de administração para páginas que representam um objeto "
+"único."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Edita este objeto (nova janela)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Como acima, mas abre a página de administração em uma nova janela."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Data:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Hora:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Atualmente:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Modificar:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirecionar de"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Deve conter um caminho absoluto, excluindo o nome de domínio. Exemplo: '/"
+"eventos/busca/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirecionar para"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Deve conter um caminho absoluto (como acima) ou uma URL completa, começando "
+"com 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "redirecionar"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "redirecionamentos"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "Exemplo: '/sobre/contato/'. Lembre-se das barras no começo e no final."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "título"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "conteúdo"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "habilitar comentários"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nome do modelo"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Exemplo: 'flatfiles/contact_page'. Se não for informado, será utilizado "
+"'flatfiles/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "é obrigatório registrar"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Se estiver marcado, apenas usuários conectados poderão ver a página."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "página plana"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "páginas planas"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nome"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "nome código"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Permissão"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Grupo"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "usuário"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "primeiro nome"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "último nome"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "endereço de e-mail"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "senha"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Use '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "status da equipe"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Informa se o usuário pode acessar este site de administração."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "ativar"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "status de superusuário"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "último login"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "data de registro"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Em adição às permissões atribuídas manualmente, este usuário também terá "
+"todas as permissões dadas a cada grupo que participar."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Usuário"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Usuários"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Informações pessoais"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Permissões"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Datas importantes"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupos"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Mensagem"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Seu navegador Web não parece estar com os cookies habilitados. Cookies são "
+"requeridos para acesssar."
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "nome do módulo python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tipo de conteúdo"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tipos de conteúdo"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "chave da sessão"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "dados da sessão"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "data de expiração"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sessão"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sessões"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nome do domínio"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nome para exibição"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "site"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sites"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Segunda Feira"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Terça Feira"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Quarta Feira"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Quinta Feira"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Sexta Feira"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sábado"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Domingo"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Janeiro"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Fevereiro"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Março"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Abril"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maio"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Junho"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Julho"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Agosto"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Setembro"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Outubro"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembro"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Dezembro"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "e"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "dia"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Fev."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Ago."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Set."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Out."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dez."
+
+#: utils/timesince.py:12
+#, fuzzy
+msgid "year"
+msgid_plural "years"
+msgstr[0] "ano"
+msgstr[1] "ano"
+
+#: utils/timesince.py:13
+#, fuzzy
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mês"
+msgstr[1] "mês"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+#, fuzzy
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dia"
+msgstr[1] "dia"
+
+#: utils/timesince.py:16
+#, fuzzy
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hora"
+msgstr[1] "hora"
+
+#: utils/timesince.py:17
+#, fuzzy
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuto"
+msgstr[1] "minuto"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tcheco"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:40
+#, fuzzy
+msgid "Danish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Alemão"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Inglês"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Espanhol"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francês"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galiciano"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandês"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italiano"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japonês"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Alemão"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norueguês"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brazileiro"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Romeno"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Russo"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Eslovaco"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Sérvio"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Sueco"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brazileiro"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Chinês Simplificado"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Chinês Tradicional"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Deve conter apenas letras, números e sublinhados (_)."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Deve conter apenas letras, números, sublinhados (_) e barras (/)."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Letras em maiúsculo não são permitidas aqui."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Letras em minúsculo não são permitidas aqui."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Informe apenas dígitos separados por vírgulas."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Informe endereços de email válidos separados por vírgulas."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Informe um endereço IP válido."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Valores em branco não são permitidos."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracteres não numéricos não são permitidos."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Este valor não pode conter apenas dígitos."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Informe um número inteiro."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Apenas caracteres do alfabeto são permitidos aqui."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Informe uma data válida no formato AAAA-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Informe uma hora válida no formato HH:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Informe uma data/hora válida no formato AAAA-MM-DD HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Informe um endereço de email válido."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Envie uma imagem válida. O arquivo enviado não é uma imagem ou está "
+"corrompido."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "A URL %s não aponta para um imagem válida."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Números de telefone deves estar no formato XXX-XXX-XXXX.\"%s\" é inválido."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "A URL %s não aponta para um vídeo QuickTime válido."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Uma URL válida é exigida."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"HTML válido é exigido. Estes são os erros específicos:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "XML mal formado: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL inválida: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "A URL %s é um link quebrado."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Informe uma abreviação válida de nome de um estado dos EUA."
+
+#: core/validators.py:229
+#, fuzzy, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Lave sua boca! A palavra %s não é permitida aqui."
+msgstr[1] "Lave sua boca! A palavra %s não é permitida aqui."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Este campo deve ser igual ao campo '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Informe algo em pelo menos um campo."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Informe ambos os campos ou deixe ambos vazios."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Este campo deve ser informado se o campo %(field)s for %(value)s."
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Este campo deve ser dado se o campo %(field)s não for %(value)s."
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Valores duplicados não são permitidos."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Este valor deve ser uma potência de %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Informe um número decimal."
+
+#: core/validators.py:349
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Por favor entre com um número decimal com no máximo %s digitos."
+msgstr[1] "Por favor entre com um número decimal com no máximo %s digitos."
+
+#: core/validators.py:352
+#, fuzzy, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Informe um número decimal com no máximo %s casa decimal."
+msgstr[1] "Informe um número decimal com no máximo %s casa decimal."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Verifique se o arquivo enviado tem pelo menos %s bytes."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Verifique se o arquivo enviado tem no máximo %s bytes."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "O formato deste campo está errado."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Este campo é inválido."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Não foi possível receber dados de %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"A URL %(url)s retornou um cabeçalho '%(contenttype)s' de Content-Type "
+"inválido."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Por favor, feche a tag %(tag)s na linha %(line)s. (A linha começa com \"%"
+"(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Algum texto começando na linha %(line)s não é permitido no contexto. (Linha "
+"começa com \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na linha %(line)s não é um atributo válido. (Linha começa com "
+"\"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na linha %(line)s é uma tag inválida. (Linha começa com \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Uma tag na linha %(line)s está não apresenta um ou mais atributos exigidos."
+"(Linha começa com \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"O atributo \"%(attr)s\" na linha %(line)s tem um valor inválido. (Linha "
+"começa com \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s com este %(type)s já existe para o %(field)s dado."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s com este %(fieldname)s já existe."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Este campo é requerido."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Este valor deve ser uma potência de %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Este valor deve ser uma potência de %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Este campo é inválido."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Informe um nome de arquivo válido."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Por favor informe um %s válido."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr " Separe IDs múltiplos com vírgulas."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Mantenha pressionado \"Control\", ou \"Command\" num Mac para selecionar "
+"mais de uma opção."
+
+#: db/models/fields/related.py:625
+#, fuzzy, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Por favor, entre IDs válidos para %(self)s. O valor %(value)r é inválido."
+msgstr[1] ""
+"Por favor, entre IDs válidos para %(self)s. O valor %(value)r é inválido."
+
+#: forms/__init__.py:380
+#, fuzzy, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Certifique-se de que seu texto tenha menos que %s caracteres."
+msgstr[1] "Certifique-se de que seu texto tenha menos que %s caracteres."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Não são permitidas múltiplas linhas aqui."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Selecione uma escolha válida; '%(data)s' não está em %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "O arquivo enviado está vazio."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Informe um número inteiro entre -32.768 e 32.767"
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Informe um número positivo"
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Informe um número inteiro entre 0 e 32.767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "sim,não,talvez"
+
+#~ msgid "Comment"
+#~ msgstr "Comentário"
+
+#~ msgid "Comments"
+#~ msgstr "Comentários"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "String (até 50)"
+
+#~ msgid "label"
+#~ msgstr "etiqueta"
+
+#~ msgid "package"
+#~ msgstr "pacote"
+
+#~ msgid "packages"
+#~ msgstr "pacotes"
+
+#~ msgid ""
+#~ "This comment was posted by a user who has posted fewer than %(count)s "
+#~ "comment:\n"
+#~ "\n"
+#~ "%(text)sThis comment was posted by a user who has posted fewer than %"
+#~ "(count)s comments:\n"
+#~ "\n"
+#~ "%(text)s"
+#~ msgstr ""
+#~ "Este comentário foi envidao por um usuário que enviou menos de %(count)s "
+#~ "comentário:\n"
+#~ "\n"
+#~ "%(text)sEste comentário foi enviado por um usuário que enviou menos de %"
+#~ "(count)s comentários:\n"
+#~ "\n"
+#~ "%(text)s"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "conteúdo"

Added: vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/pt_BR/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,109 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-01-23 19:54-0200\n"
+"Last-Translator: João Marcus Christ <joaoma at gmail.com>\n"
+"Language-Team: Português do Brasil <pt-br at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "%s Disponíveis"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Escolher todos"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Adicionar"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Remover"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "%s escolhido(s)"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Selecione sua(s) escolha(s) e clique "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Limpar tudo"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Janeiro Fevereiro Março Abrio Maio Junho Julho Agosto Setembro Outubro Novembro "
+"Dezembro"
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Domingo Segunda Terça Quarta Quinta Sexta Sábado"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "D S T Q Q S S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Agora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Relógio"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Escolha uma hora"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Meia-noite"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 da manhã"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Meio-dia"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Cancelar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Hoje"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Calendário"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Ontem"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Amanhã"

Added: vendor/django/current/django/conf/locale/ro/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ro/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ro/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/ro/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ro/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2005 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <tibimicu at gmx.net>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Django \n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:12+0200\n"
+"PO-Revision-Date: 2005-11-08 19:06+GMT+2\n"
+"Last-Translator: Tiberiu Micu <tibimicu at gmx.net>\n"
+"Language-Team: Romanian <ro at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+#, fuzzy
+msgid "object ID"
+msgstr "id obiect"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+#, fuzzy
+msgid "comment"
+msgstr "conţinut"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr ""
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr ""
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr ""
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr ""
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr ""
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr ""
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr ""
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr ""
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr ""
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr ""
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+#, fuzzy
+msgid "IP address"
+msgstr "adresa email"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr ""
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "conţinut"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+#, fuzzy
+msgid "Content object"
+msgstr "tip conţinut"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+
+#: contrib/comments/models.py:168
+#, fuzzy
+msgid "person's name"
+msgstr "Prenume"
+
+#: contrib/comments/models.py:171
+#, fuzzy
+msgid "ip address"
+msgstr "adresa email"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr ""
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "permite comentarii"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "permite comentarii"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr ""
+
+#: contrib/comments/models.py:234
+#, fuzzy
+msgid "score date"
+msgstr "data expirare"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr ""
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+#, fuzzy
+msgid "flag date"
+msgstr "pagina plată"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Utilizator"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Utilizatori"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+#, fuzzy
+msgid "deletion date"
+msgstr "date sesiune"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr ""
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr ""
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr ""
+
+#: contrib/comments/views/karma.py:23
+#, fuzzy
+msgid "Invalid comment ID"
+msgstr "permite comentarii"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr ""
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr ""
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr ""
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Utilizator:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Parola:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Schimbă-mi parola"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Deautentificare"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "permite comentarii"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "permite comentarii"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "nume utilizator"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:110
+#, fuzzy
+msgid "Today"
+msgstr "Luni"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:143
+#, fuzzy
+msgid "No"
+msgstr "Noi."
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "timp acţiune"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id obiect"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "repr obiect"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "steguleţ acţiune"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "schimbă mesaj"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "intrare log"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "intrări log"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr ""
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Login"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+#, fuzzy
+msgid "Site administration"
+msgstr "Administrare Django"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr ""
+
+#: contrib/admin/views/main.py:290
+#, fuzzy, python-format
+msgid "Add %s"
+msgstr "Adaugă"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr ""
+
+#: contrib/admin/views/main.py:338
+#, fuzzy, python-format
+msgid "Changed %s."
+msgstr "Schimbă"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr ""
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, fuzzy, python-format
+msgid "Change %s"
+msgstr "Schimbă"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr ""
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr ""
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr ""
+
+#: contrib/admin/views/main.py:533
+#, fuzzy, python-format
+msgid "Change history: %s"
+msgstr "Schimbă parola"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr ""
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr ""
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr ""
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr ""
+
+#: contrib/admin/views/doc.py:281
+#, fuzzy
+msgid "Date (without time)"
+msgstr "timp acţiune"
+
+#: contrib/admin/views/doc.py:282
+#, fuzzy
+msgid "Date (with time)"
+msgstr "Dată/oră"
+
+#: contrib/admin/views/doc.py:283
+#, fuzzy
+msgid "E-mail address"
+msgstr "Adresa email:"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+#, fuzzy
+msgid "Decimal number"
+msgstr "Decembrie"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+#, fuzzy
+msgid "Phone number"
+msgstr "Introduceţi un număr întreg."
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr ""
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr ""
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr ""
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Schimbă parola"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Acasă"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Istoric"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dată/oră"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Utilizator"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Acţiune"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Acest obiect nu are un istoric al schimbărilor. Probabil nu a fost adăugat "
+"prinintermediul acestui sit de administrare."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Administrare sit Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administrare Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Eroare de server"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Eroare de server (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Eroare server <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"A apărut o eroare. Este raportată către administrator via emailşi va fi "
+"fixată în scurt timp. Mulţumim pentru înţelegere."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Pagină inexistentă"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ne pare rău, dar pagina cerută nu există."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Adaugă"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Schimbă"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nu ai drepturi de editare."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Acţiuni Recente"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Acţiunile Mele"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Indisponibil"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, fuzzy, python-format
+msgid "Add %(name)s"
+msgstr "Adaugă"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Ai <a href=\"/password_reset/\">uitat parola</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Bine ai venit,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr ""
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Ştergînd %(object_name)s '%(object)s' va avea ca rezultat ştergerea şi a "
+"obiectelor ce au legătură, dar contul tău nu are permisiunea de a şterge "
+"următoarele tipuri de obiecte:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Eşti sigur că vrei să ştergi %(object_name)s \"%(object)s\"?Următoarele "
+"componente vor fi ÅŸterse:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Da, sînt sigur"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:7
+#, fuzzy
+msgid "Save"
+msgstr "activ"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Schimbă parola"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Schimbare reuşită a parolei"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Parola a fost schimbată."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Resetează parola"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Ai uitat parola? Introdu adresa de email mai jos, iar noi vom reseta parola "
+"şi-ţi vom trimite una nouă prin email."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "Adresa email:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Resetează-mi parola"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Mulţumesc pentru petrecerea folositoare a timpului cu saitul astăzi."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Relogare"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Parola resetată cu succes"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Am trimis o nouă parolă prin email la adresa furnizată. Ar trebuisă o "
+"primeşti în scurt timp."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Introdu te rog vechea parolă, pentru motive de siguranţă, şi apoi tastează "
+"noua parolă de două ori aşa încît putem verifica dacă ai tastat corect."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Vechea parolă:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Noua parolă:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Confirmă parola:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Schimbă-mi parola"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ai primit acest email pentru că ai cerut o resetare a parolei"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pentru contul tău la %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Noua ta parolă este: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Poţi schmiba această parolă vizitînd această pagină:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Numele tău utilizator, în caz că ai uitat:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Mulţumesc pentru folosirea saitului nostru!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Echipa %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+#, fuzzy
+msgid "Show object ID"
+msgstr "id obiect"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr ""
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "Schimbă"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirectat de la "
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Aceasta ar trebui să fie o cale absolută, excluzînd numele de domeniu. "
+"Exemplu: '/evenimente/cautare/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirectat la"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Aceasta poate fi o cale absolută (ca mai sus) sau un URL începînd cu "
+"'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "redirectare"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "redictări"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exemplu: '/about/contact'. Asiguraţi-vă că aveţi slash-uri la început şi la "
+"sfîrşit."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titlu"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "conţinut"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "permite comentarii"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "nume ÅŸablon"
+
+#: contrib/flatpages/models.py:13
+#, fuzzy
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Exemplu: 'flatfiles/pagina_contact'. Dacă aceasta nu există, sistemul va "
+"folosi 'flatfiles/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "necesită înregistrare"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Dacă aceasta este bifată, numai utilizatorii logaţi vor putea vedea pagina."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "pagina plată"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "pagini plate"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "nume"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "nume cod"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Permisiune"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Permisiuni"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Grup"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grupuri"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "nume utilizator"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "Prenume"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "Nume"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "adresa email"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "parola"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "stare staff"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Decide cînd utilizatorul se poate loga în acest sit de adminstrare."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "activ"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "stare superutilizator"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "ultima logare"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "data aderării"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Suplimentar permisiunilor manual alocate, acest utilizator va primi toate "
+"permisiunile alocate fiecărui grup din care el/ea face parte."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Permisiuni"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Utilizator"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Utilizatori"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Informaţii personale"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Permisiuni"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Date importante"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupuri"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Mesaj"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "nume modul python"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tip conţinut"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tipuri conţinute"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "cheie sesiune"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "date sesiune"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "data expirare"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "seiune"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesiuni"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "nume domeniu"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "nume afiÅŸat"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sit"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sit"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Luni"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Marţi"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Miercuri"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Joi"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Vineri"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sîmbătă"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Duminică"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Ianuarie"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februarie"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Martie"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Aprilie"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Mai"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Iunie"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Iulie"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septembrie"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Octombrie"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Noiembrie"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Decembrie"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "Mai"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Ian."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Oct"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Noi."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+#, fuzzy
+msgid "day"
+msgid_plural "days"
+msgstr[0] "Mai"
+msgstr[1] "Mai"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:17
+#, fuzzy
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "sit"
+msgstr[1] "sit"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Cehă"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:40
+#, fuzzy
+msgid "Danish"
+msgstr "Spaniolă"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Germană"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Engleză"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spaniolă"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Franceză"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galiciană"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italiană"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norvegiană"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Braziliană"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr ""
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Rusă"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr ""
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Sîrbă"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Sîrbă"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Braziliană"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Chineză simplificată"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Această valoare trebuie să conţină numai litere, numere şi liniuţe de "
+"subliniere."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Această valoare trebuie să conţină numai litere, numere, liniuţe de "
+"subliniere ÅŸi slash-uri."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Literele mari nu sînt permise aici."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Literele mici nu sînt permise aici."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Introduceţi numai numere separate de virgule."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Introduceţi adrese de email valide separate de virgule."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Introduceţi vă rog o adresă IP validă."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Valorile vide nu sînt permise aici."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Caracterele ne-numerice nu sînt permise aici."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Această valoare nu poate conţîne numai cifre."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Introduceţi un număr întreg."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Numai caractere alfabetice sînt permise aici."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Introduceţi o dată validă in format: AAAA-LL-ZZ."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Introduceţi o oră în format OO:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Introduceţi o dată/oră validă în format AAAA-LL-ZZ OO:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Introduceţi o adresă de email validă."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Încărcaţi o imagine validă. Fişierul încărcat nu era o imagine sau era o "
+"imagine coruptă."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL-ul %s nu pointează către o imagine validă."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Numerele de telefon trebuie să fie in format XXX-XXX-XXXX. \"%s\" e invalid."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL-ul %s nu pointează către o imagine video QuickTime validă."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "E necesar un URL valid."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"E necesar cod HTML valid. Erorile specifice sînt:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Format XML invalid: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "URL invalid: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL-ul %s e invalid."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Introduceţi o abreviere validă în U.S."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Îngrijiţi-vă limbajul! Cuvîntul %s nu este permis aici."
+msgstr[1] "Îngrijiţi-vă limbajul! Cuvintele %s nu sînt permise aici."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:255
+#, fuzzy
+msgid "Please enter something for at least one field."
+msgstr "Vă rog comletaţi ambele cîmpuri sau lăsaţi-le goale pe ambele."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Vă rog comletaţi ambele cîmpuri sau lăsaţi-le goale pe ambele."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Acest cîmp e necesar dacă %(field)s este %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Acest cîmp e necesar dacă %(field)s nu este %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Valorile duplicate nu sînt permise."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Această valoare trebuie să fie o putere a lui %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Vă rog introduceţi un număr zecimal valid."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Vă rog introduceţi un număr zecimal valid cu cel mult %s cifră."
+msgstr[1] "Vă rog introduceţi un număr zecimal valid cu cel mult %s cifre."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Vă rog introduceţi un număr zecimal valid cu cel mult %s zecimală."
+msgstr[1] "Vă rog introduceţi un număr zecimal valid cu cel mult %s zecimale."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Asigură-te că fişierul încărcact are cel puţin %s octeţi."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Asigură-te că fişierul încărcact are cel mult %s octeţi."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Formatul acestui cîmp este invalid."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Cîmpul este invalid."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nu pot prelua nimic de la %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"URL-ul %(url)s a returnat un header Content-Type invalid '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Te rog închide tagurile %(tag)s din linia %(line)s. ( Linia începe cu \"%"
+"(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Textul începînd cu linia %(line)s nu e permis în acest context. (Linia "
+"începînd cu \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" în linia %(line)s e un atribut invalid. (Linia începînd cu \"%"
+"(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" în linia %(line)s este un tag invalid. (Linia începe cu \"%"
+"(start)s\"."
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Unui tag din linia %(line)s îi lipseşte unul sau mai multe atribute. (Linia "
+"începe cu \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atributul \"%(attr)s\" din linia %(line)s are o valoare invalidă. ( Linia "
+"începe cu \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+#, fuzzy
+msgid "This field is required."
+msgstr "Cîmpul este invalid."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Această valoare trebuie să fie o putere a lui %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Această valoare trebuie să fie o putere a lui %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Cîmpul este invalid."
+
+#: db/models/fields/__init__.py:562
+#, fuzzy
+msgid "Enter a valid filename."
+msgstr "Introduceţi o adresă de email validă."
+
+#: db/models/fields/related.py:43
+#, fuzzy, python-format
+msgid "Please enter a valid %s."
+msgstr "Introduceţi vă rog o adresă IP validă."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Separă ID-urile multiple cu virgulă."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Ţine apăsat \"Control\", sau \"Command\" pe un Mac, pentru a selecta mai "
+"multe."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+#, fuzzy
+msgid "Line breaks are not allowed here."
+msgstr "Literele mici nu sînt permise aici."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr ""
+
+#: forms/__init__.py:699
+#, fuzzy
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Introduceţi un număr întreg."
+
+#: forms/__init__.py:708
+#, fuzzy
+msgid "Enter a positive number."
+msgstr "Introduceţi un număr întreg."
+
+#: forms/__init__.py:717
+#, fuzzy
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Introduceţi un număr întreg."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr ""
+
+#, fuzzy
+#~ msgid "Comments"
+#~ msgstr "permite comentarii"
+
+#~ msgid "label"
+#~ msgstr "etichetă"
+
+#~ msgid "package"
+#~ msgstr "pachet"
+
+#~ msgid "packages"
+#~ msgstr "pachete"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "conţinut"

Added: vendor/django/current/django/conf/locale/ru/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ru/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ru/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/ru/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ru/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1972 @@
+# Translation of django.po to russian.
+# Copyright (C) 2005 THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Dmitry Sorokin <ds at dial.com.ru>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2005-11-26 00:00\n"
+"Last-Translator: Dmitry Sorokin <ds at dial.com.ru>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID объекта"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "заголовок"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "комментарий"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "рейтинг #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "рейтинг #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "рейтинг #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "рейтинг #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "рейтинг #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "рейтинг #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "рейтинг #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "рейтинг #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "доступный рейтинг"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "дата/время добавления"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "публичный"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP адрес"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "удален"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Отметте, если комментарий нежелателен. Сообщение \"Этот комментарий был "
+"удалён\" будет показано взамен."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "комментарий"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Объект наполнения"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Добавил  %(user)s  %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "имя человека"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip адрес:"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "одобрено администрацией"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "Свободный комментарий"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "Свободные комментарии"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "счёт"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "счёт времени"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "Карма счёт"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "Карма счета"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Этот комментарий был отмечен %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "отметка даты"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "Признак пользователя"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "Признаки пользователя"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Отмечен %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "дата удаления"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "Удаленно модератором"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "Удаления модератором"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Анонимный пользователь не может голосовать"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Неверный ID комментария"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Нельзя голосовать за себя"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+msgstr[1] ""
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Коментарий был добавлен ндоверенным пользователем:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Только POSTы разрешены"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Одно или больше обязательных полей не были заполнены"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Кто-то вмешивается в форму комментария (нарушение безопасности)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Форма комментария имеет неверный 'target' параметр -- ID объекта неверно"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Форма комментария не обеспечивает и 'preview' или 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Имя:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Пароль:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Забыли свой пароль?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Выход"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Рейтинги"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Необходимое"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Необязательное"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Добавить фотографию"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Комментарий:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Просмотр комментария"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "имя пользователя:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Все"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "За любую дату"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Сегодня"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Последние 7 дней"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "В этом месяце"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "В этом году"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Да"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Нет"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Неизвестно"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "время действия"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id обьекта"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "представление обьекта"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "отметка действия"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "изменить сообщение"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "журнальная запись"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "журнальные записи"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Все даты"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Пожалуйста, вводите верные данные именя пользователя и пароль. Помните, оба "
+"поля чувствительны к регистру."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Вход"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Пожалуйста войдите снова, посколькук ваша сессия устарела. Не беспокойтесь:"
+"введенные вами данные сохранены."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Похоже, что ваш броузер не настроен на прием cookies. Пожалуйства включите "
+"cookie, перезагрузите страницу и попытайтесь снова. "
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Имя пользователя не может включать символ '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Администрирование сайта"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" были успешно добавлены."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Вы снова можете редактировать их внизу"
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Вы можете добавить %s внизу."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Добавить %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Добавлено %s"
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "и"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Изменено %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Удалено %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr ""
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr ""
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Изменить %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Одно или более  %(fieldname)s в %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Одно или более %(fieldname)s в %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" было успешно удалено."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Вы уверены?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Измени историю: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Выберите %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Выберите %s для изменения"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Целое"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Логическое (True или False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Строка (до %(maxlength)s символов)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Целые, разделенные запятыми"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Дата (без указания времени)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Дата (с указанием времени)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mail адрес"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Путь к файлу"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Десятичное число"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Логическое (True, False или None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr ""
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Номер телефона"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Время"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Штат США (два заглавных символа)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML текст"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Документация"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Изменение пароля"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Начало"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "История"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Дата/время"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Пользователь"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Действие"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Данный обьект не имеет истории изменения. Возможно он не был добавлен через "
+"данный административный сайт."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Административный сайт Django"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Администрирование Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Ошибка сервера"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Ошибка сервера (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Ошибка сервера <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Произошла ошибка. Отчет об ошибке отправлен администраторам сайта по e-mailи "
+"она должна быть вскоре исправлена. Благодарим вас на терпение и помощь."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Страница не найдена"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "К сожалению, запрашиваемая вами страница не найдена."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Модели доступны в %(name)s приложении."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Добавить"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Изменить"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Недостаточно прав для редактирования."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Последние Действия"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Мои Действия"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Недоступно"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Добавить %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Вы <a href=\"/password_reset/\">забыли пароль</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Добро пожаловать,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Удалить"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Удаление объекта %(object_name)s '%(object)s' приведет к удалению зависимых  "
+"элементов, но предоставленных вам прав недостаточно для удаления следующих "
+"типов объектов:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Вы уверены, что хотите удалить  %(object_name)s \"%(object)s\"? Все "
+"следующие объекты также будут удалены:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Да, я уверен"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr ""
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Вперёд"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Смотреть сайт"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Пожалуйста исправьте ошибку ниже."
+msgstr[1] "Пожалуйста исправьте ошибки ниже."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Очерёдность"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Порядок:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Сохранить как новое"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Сохранить и добавить другое"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Сохранить и продолжить редактирование"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Сохранить"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Изменение пароля"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Пароль успешно обновлен"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ваш пароль был изменен."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Сброс пароля"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Забыли пароль? Введите ваш e-mail адрес ниже и мы очистим ваш старый пароль, "
+"и вышлем вам по e-mail новый."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail адрес:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Очистка пароля"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Благодарим за проведенное вами сегодня время на этом сайте."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Повторный вход"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Успешная очистка пароля"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Мы отправили новый пароль по указанному вами адресу электронной почты. Вы "
+"должны его вскоре получить."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"В целях безопасности, пожалуйста, введите ваш старый пароль, затем - новый "
+"пароль дважды, с тем, чтобы мы могли убедиться в правильности написания."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Старый пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Новый пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Подтвердите пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Изменение пароля"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Вы получили это сообщение потому что была запрошена очистка пароля"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "для вашего пользовательского аккаунта на %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ваш новый пароль: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Вы всегда можете изменить этот пароль перейдя на страницу:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Ваше имя, на случай если вы его забыли:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Спасибо за посещение нашего сайта!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Команда сайта %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Закладки"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Документация по bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Документация по данной странице"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Перенаправит вас с любой страницы к просмотру документа, который генерирует "
+"эту страницу."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Показать ID обьекта"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Показывает тип наполнения и уникальный ID для страниц, которые означают "
+"одинокий объект."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Редактировать данный обьект (в текущем окне)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Перейти на страницу администратор для страниц представляющих один объект."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Редактировать данный обьект (в новом окне)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "То же что и выше, но откроет административную страницу в новом окне"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Дата:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Время:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Современно:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Изменить:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "перенаправить из"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Это должен быть абсолютный путь, исключая доменное имя. Пример: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "перенаправить на"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Это должен быть, либо абсолютный путь (как выше) или полный URL начинающийся "
+"с 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "перенаправить"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "перенаправления"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Пример: '/about/contact/'. Будьте уверенны, что вставили завепршающий слэш."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "заголовок"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "наполнение"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "активировать комментарии"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "имя шаблона"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "регистрация обязательна"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "Если отмечено, только вошедшие пользователи смогут видеть страницу."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "простая страница"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "простые страницы"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "имя"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "код"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "Права"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "Права"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "Группа"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "Группы"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "имя пользователя"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "имя"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "фамилия"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mail адрес"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "пароль"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "статус персонала"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Отметьте, если пользователь может входить в админ. часть сайта."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "активен"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "статус админа"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "последний вход"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "дата регистрации"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"К добавлению к перавам выбрнанным вуручную, этот пользователь может получить "
+"все права группы, к которой он принадлежит."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "Права пользователя"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "Пользователь"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "Пользователи"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Персональная информация"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Права"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Важные даты"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Группы"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "Сообщение"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "имя класса python модуля"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "тип наполнения"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "типы наполнения"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "ключ сессии"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "данные сессии"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "дата окончания"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "сессия"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "сессии"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "домен"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "выводимое имя"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "сайт"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "сайты"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Понедельник"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Вторник"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Среда"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Четверг"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Пятница"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Суббота"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Воскресенье"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Январь"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Февраль"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Март"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Апрель"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Май"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Июнь"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Июль"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Август"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Сентябрь"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Остябрь"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Ноябрь"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Декабрь"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "янв"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "фев"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "мар"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "апр"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "май"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "июнь"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "июль"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "авг"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "сен"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "окт"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "нояб"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "дек"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Янв."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Фев."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Авг."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Сен."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Окт."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Нояб."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Дек."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "год"
+msgstr[1] "лет"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "месяц"
+msgstr[1] "месяцев"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "неделя"
+msgstr[1] "недель"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дней"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "час"
+msgstr[1] "часов"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "минута"
+msgstr[1] "минут"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr ""
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr ""
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr ""
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr ""
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr ""
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr ""
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr ""
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr ""
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr ""
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr ""
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr ""
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr ""
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr ""
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Русский"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr ""
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr ""
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr ""
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr ""
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr ""
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr ""
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Значение может содержать только буквы, цифры и подчеркивания."
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "Значение может содержать только буквы, цифры, подчеркивания, дифисы или "
+"тере."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Заглавные буквы не разрешены"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Строчные буквы не разрешены"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Вводите только цифры разделённые запятыми"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Вводите реальные e-mail адреса разделённые запятыми"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Пожалуйста, вводите реальный IP адрес"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Пустое значение не разрешено"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Не цифровые символы не рназрешены"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Введите номер"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Только буквы можно использовать"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Вводите реальную дату в формате YYYY-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Вводите реальное время в формате HH:MM."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Вводите реальные дата/время в формате YYYY-MM-DD HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Укажите реальный e-mail адрес."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Загрузите реальное изображение. Файл, который вы загружали, не был "
+"изображением или был поврежден."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s не указывает на реальное изображение."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Телефонный номер должен быть в формате XXX-XXX-XXXX. \"%s\" не верен."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s не указывает на реальное видео QuickTime."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Реальный URL обязателен."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Реальный HTML обязателен. Специфичные ошибки:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Неверный формат XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Неверный URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s сломанная ссылка."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Вводите реальную абревиатуру штатов США."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Следите за своими словами! Слово %s здесь запрещено."
+msgstr[1] "Следите за своими словами! Слова %s здесь запрещены."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Это поле должно совпадать с полем '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Пожалуйста, заполните хотя бы одно поле."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Пожалуйста, заполните оба поля либо оставьте их пустыми."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Это поле должно быть заполнено если %(field)s равно %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Это поле должно быть заполнено если %(field)s не равно %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Двойные значения запрещенны."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Пожалуйста, вводите корректное десятичное число."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+"Пожалуйста, вводите корректное десятичное число с максимальным количеством "
+"знаков %s."
+msgstr[1] ""
+"Пожалуйста, вводите корректное десятичное число с максимальным количеством "
+"знаков %s."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Пожалуйста, вводите корректное десятичное число с максимальным количеством "
+"знаков после запятой %s."
+msgstr[1] ""
+"Пожалуйста, вводите корректное десятичное число с максимальным количеством "
+"знаков после запятой %s."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Убедитесь, что загруженный файл по крайней мере не меньше %s байт."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Убедитесь, что загруженный файл больше чем %s байт."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Формат этого поля неверен"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Это поле неверно."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Невозможно получить что-либо с %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url) вернул неверный заголовок Content-Type '%(contenttype)'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Обязательное поле."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Логическое (True или False)"
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Это поле неверно."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Укажите правильное имя файла."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Несколько значений ID разделяйте запятыми."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Удерживайте \"Control\", или \"Command\" на Макинтош, для выбора больше чем "
+"одного."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Переносы строк не допускаются здесь."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr ""
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Указанный файл - пуст."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr ""
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Введите положительное число."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Введите целое число в диапазоне от 0 до 32767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "да,нет,может быть"
+
+#~ msgid "Comment"
+#~ msgstr "Комментарий"
+
+#~ msgid "Comments"
+#~ msgstr "Комментарии"
+
+#~ msgid "label"
+#~ msgstr "метка"
+
+#~ msgid "package"
+#~ msgstr "пакет"
+
+#~ msgid "packages"
+#~ msgstr "пакеты"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Строка (до 50 символов)"
+
+#~ msgid ""
+#~ "Example: 'flatfiles/contact_page'. If this isn't provided, the system "
+#~ "will use 'flatfiles/default'."
+#~ msgstr ""
+#~ "Пример: 'flatfiles/contact_page'. Если не предусмотрена, система будет "
+#~ "использовать 'flatfiles/default'."
+
+#~ msgid "Server error <em>(500)</em>"
+#~ msgstr "Ошибка сервера <em>(500)</em>"

Added: vendor/django/current/django/conf/locale/ru/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ru/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ru/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/ru/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ru/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,111 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-03-01 17:11+0300\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Доступные %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Выбрать все"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Добавить"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Удалить"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Выбранные %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Выберите и нажмите "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Очистить всё"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь "
+"Декабрь"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Воскресенье Понедельник Вторник Среда Четверг Пятница Суббота"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "В П В С Ч П С"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Сейчас"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Часы"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Выбирите время"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Полночь"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 часов"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Полдень"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Отмена"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Сегодня"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Календарь"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Вчера"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Завтра"

Added: vendor/django/current/django/conf/locale/sk/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/sk/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/sk/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/sk/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/sk/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2002 @@
+# Translation of django.po to.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Vladimir Labath <vlado at labath.org>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-27 07:31-0400\n"
+"PO-Revision-Date: 2005-11-10 23:22-0500\n"
+"Last-Translator: Vladimir Labath <vlado at labath.org>\n"
+"Language-Team: Slovak <sk at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "pythonové meno triedy modelu"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "typ obsahu"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "typy obsahu"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "meno"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "codename"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "povolenie"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "povolenia"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "skupina"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "skupiny"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "užívateľské meno"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "krstné meno"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "priezvisko"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mailová adresa"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "heslo"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Použi '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "štatút zamestnanca"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Označenie, ak užívateľ má oprávnenie vstúpiť ako administrátor."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktívny"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "štatút superužívateľa"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "posledné prihlásenie"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "dátum registrácie"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Okrem ručne vložených povolení, tento uživateľ dostane všetky povolenia  "
+"skupin, v ktorých sa nachádza."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "pridelené povolenia"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "uživateľ"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "užívatelia"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Osobné údaje"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Povolenia"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Dôležité údaje"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Skupiny"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "zpráva"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Vyzerá, že tvoj web prehliadač nedovoľuje prístup ku cookies. Cookies sú  "
+"nevýhnutné aby si sa mohol prihlásiť."
+
+#: contrib/auth/forms.py:36 contrib/auth/forms.py:41
+#: contrib/admin/views/decorators.py:9
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Prosím, vlož spávne meno užvateľa ako aj heslo. Pripomínam, že obe polia "
+"rozlišujú malé a veľké písmena"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "presmerovaný z"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Tu by sa mala použiť absolútna cesta, bez domény. Napr.: '/events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "presmerovaný na "
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Tu môže byť buď absolútna cesta (ako hore) alebo plné  URL začínajúce s "
+"'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "presmerovanie"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "presmerovania"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "objekt ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "titulok"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentár"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "hodnotenie #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "hodnotenie #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "hodnotenie #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "hodnotenie #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "hodnotenie #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "hodnotenie #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "hodnotenie #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "hodnotenie #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "je platné hodnotenie"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "dátum/čas poslania"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "je zveréjnený"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:292
+msgid "IP address"
+msgstr "IP adresa"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "je vymazaný"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Ak je tento komentár nevhodný, tu ho poznač.  \"Tento komentár bol vymazaný"
+"\" táto správa sa objaví namiesto neho."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "komentáre"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Obsah objektu"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Od  %(user)s dňa %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "osobné meno"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adresa"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "je zamestnancom"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "voľný komentár"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "voľné komentáre"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "stav"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "údaje stavu"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "karma údaj"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "karma údaje"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(score)d hodnotiteľ %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentár bol označený užívateľom  %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "dátumové návestie"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "návestie uživateľa"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "návestia užívateľa"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr " %r návestie"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "odstránené dátumy"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "moderátor odstránenia"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "moderátor odstránení"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Moderátor odstránenia %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Hlasovať môžu len prihlásení užívatelia"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Chybné ID komentára"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Nemôžeš hlasovať za seba"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Toto hlasovanie je nevyhnutné, lebo súvisí s predchádzjúcou voľbou."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Tento komentár je od užívateľa, ktorý doteraz poslal minimálne %(count)s "
+"komentár:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Tento komentár je od užívateľa, ktorý doteraz poslal najmenej %(count)s "
+"komentárov:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Tento komentár je od veľmi náznakového užívateľa:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Dovolené sú len POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno alebo viac povinných polí nebolo vložených"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Niekto skúšal manipulovať s formulárom komentára (porušená bezpečnosť)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Formulár komentára ma chybný 'cieľový' parameter  -- the objekt ID bol "
+"poškodený"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Formulár komentára neposkytuje odpoveď buď 'prezri' alebo 'pošli'"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Tvoje meno:"
+
+#: contrib/comments/templates/comments/freeform.html:5
+#: contrib/comments/templates/comments/form.html:27
+msgid "Comment:"
+msgstr "Komentár:"
+
+#: contrib/comments/templates/comments/freeform.html:9
+#: contrib/comments/templates/comments/form.html:32
+msgid "Preview comment"
+msgstr "Pozri komentár"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Meno:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Heslo:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Zabudol si svoje heslo?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Odhlásenie"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Hodnotenia"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Požadované"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Voliteľné"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Pošli foto"
+
+#: contrib/flatpages/models.py:7 contrib/admin/views/doc.py:303
+msgid "URL"
+msgstr "URL"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Príklad: '/about/contact/'. Uisti sa, že máš vložené ako úvodné tak aj "
+"záverečné lomítka."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "názov"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "obsah"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "povolené komentáre"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "meno predlohy"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Príklad: 'flatpages/contact_page'. Ak sa toto nevykonalo,  systém použije  "
+"'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "musíte byť zaregistrovaný"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Ak je toto označené, potom len prihlásený užívateľ môže vidieť túto stránku."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "plochá stránka"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "ploché stránky"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "kľúč sedenia"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "údaje sedenia"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "dátum konca platnosti"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sedenie"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sedenia"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "meno domény"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "zobrazené meno"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "web"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "weby"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Od %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "VÅ¡etko"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Všetky dátumy"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Posledných 7 dní"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Tento mesiac"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Tento rok"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Áno"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nie"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Neznámy"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "čas udalosti"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objekt id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objekt repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "návestie udalosti"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "zmeň zprávu"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "záznam priebehu"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "záznamy priebehu"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Všetky dátumy"
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Prihlásenie"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Prosím prihlas sa znovu, lebo čas tvojho sedenia vypršal. Nemaj obavy: tvoje "
+"údaje su uchované."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Vyzerá, že tvoj prehliadač nemá povolené cookies. Prosím, povoľ cookies, "
+"znovu načítaj túto stránku a skús činnosť znovu."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Meno užívateľa nemože obsahovať  znak '@' ."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Tvoja e-mailova adresa nie je tvoje užívateľské meno. Skús '%s'."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Administrácia webu"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Objekt  %(name)s \"%(obj)s\" bol úspešne pridaný."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Môžeš urobiť zmeny zase nižšie."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Môžeš pridať ďalší %s nižšie."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Pridaj %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Bol pridaný %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "a"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Bol zmenený %s"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Bol vymazaný %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Polia neboli zmenené."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" boli úspešne zmenený."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"Objekt %(name)s \"%(obj)s\" bol úspešne zmenený. Ďalšie zmeny môžeš urobiť "
+"zase nižšie."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Zmeň %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jeden alebo viac %(fieldname)s v %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jeden alebo viac %(fieldname)s v %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Objekt %(name)s \"%(obj)s\" bol úspešne vymazaný."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Si si istý?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Zmeň históriu: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Výber %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Ktorý %s sa má zmeniť?"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:289
+#: contrib/admin/views/doc.py:291 contrib/admin/views/doc.py:297
+#: contrib/admin/views/doc.py:298 contrib/admin/views/doc.py:300
+msgid "Integer"
+msgstr "Celočíselná hodnota"
+
+#: contrib/admin/views/doc.py:280
+msgid "Boolean (Either True or False)"
+msgstr "Logická hodnota (buď True alebo False)"
+
+#: contrib/admin/views/doc.py:281 contrib/admin/views/doc.py:299
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Dĺžka reťazca (maximálne do %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Comma-separated integers"
+msgstr "Čiarka oddeľuje celé čísla"
+
+#: contrib/admin/views/doc.py:283
+msgid "Date (without time)"
+msgstr "Dátum (bez času)"
+
+#: contrib/admin/views/doc.py:284
+msgid "Date (with time)"
+msgstr "Dátum ( a čas)"
+
+#: contrib/admin/views/doc.py:285
+msgid "E-mail address"
+msgstr "E-mailová adresa"
+
+#: contrib/admin/views/doc.py:286 contrib/admin/views/doc.py:287
+#: contrib/admin/views/doc.py:290
+msgid "File path"
+msgstr "Cesta k súboru"
+
+#: contrib/admin/views/doc.py:288
+msgid "Decimal number"
+msgstr "Desiatkové číslo"
+
+#: contrib/admin/views/doc.py:294
+msgid "Boolean (Either True, False or None)"
+msgstr "Logická hodnota (buď True, False alebo None)"
+
+#: contrib/admin/views/doc.py:295
+msgid "Relation to parent model"
+msgstr "Má vzťah na rodičovský model"
+
+#: contrib/admin/views/doc.py:296
+msgid "Phone number"
+msgstr "Číslo telefónu"
+
+#: contrib/admin/views/doc.py:301
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admin/views/doc.py:302
+msgid "Time"
+msgstr "ÄŒas"
+
+#: contrib/admin/views/doc.py:304
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. štát (dve veľké písmena)"
+
+#: contrib/admin/views/doc.py:305
+msgid "XML text"
+msgstr "XML text"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Aktuálny:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Zmeň:"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Dátum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "ÄŒas:"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentácia"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Zmeň heslo"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Začiatok"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "História"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Dátum/čas"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Uživateľ"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Udalosť"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "PLNY_DATUM_AJ_CAS"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Tento object nemá históriu zmien. Možno nebol pridaný prostredníctvom tohoto "
+"web admina"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Pridaj %(name)s"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Od %(title)s "
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Chyba servera"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Chyba servera (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Chyba servera <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Vznikla chyba. Prostredníctvom e-mailu  bol o nej informovaný správca a táto "
+"by mala byť o chviľu odstránená. Ďakujeme za tvoju trpezlivosť."
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Choď"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django web admin"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administrácia Django"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "Model je prístupný v %(name)s aplikácií."
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Pridaj"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Zmeň"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nemáš povolenie na zmeny ."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Posledné udalosti"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moje udalosti"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nepovolené"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Stránka nebola nájdená"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ľutujeme, ale požadovaná stránka nebola nájdená."
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Zabudol si<a href=\"/password_reset/\"> svoje heslo</a>?"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Pozri na webe"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Oprav chybu, čo je nižšie, prosím."
+msgstr[1] "Oprav chyby, čo sú nižšie, prosím."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Určenie"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Poradie:"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Vítajte,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Vymazať"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Vymazaním objektu %(object_name)s '%(object)s' môžeš spôsobiť vymazanie "
+"súvisiacich objektov, ale tvoj účet nemá povolenie na mazanie nasledujúcich "
+"typov objektov:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Si si istý, že chceš vymazať %(object_name)s \"%(object)s\"? Všetky "
+"nasledujúce objekty budú tiež vymazané :"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ano, som si istý"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Zapísať ako nový"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Zapísať a pridať ďaší"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Zapísať a pokračovať v zmenách"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Zápis"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Zmeň heslo"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Heslo bolo úspešne zmenené"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Tvoje heslo bolo zmenené."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Generácia nového hesla"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Zabudol si svoje heslo? Vlož nižšie tvoju e-mail adresu, a nové heslo ti "
+"bude na ňu zaslané ."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mailová adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Obnova môjho hesla"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Ďakujeme ti, za stráveny čas na našej stránke."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Prihlás sa znovu"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Heslo bolo úspešne vygenerované"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Poslali sme ti,  nové heslo na tebou uvedenú emailovú adresu. Mal by si ho "
+"dostať čo najskôr."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Kvôli bezpečnosti vlož prosím tvoje staré heslo, a potom dvakrát tvoje nové "
+"heslo, tým môžeme skontrolovať jeho správnosť."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Staré heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nové heslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potvrdenie hesla:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Zmeň svoje heslo"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Dostal si túto správu preto, lebo si požadoval vygenerovať tvoje heslo"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "pre tvoj užívateľský účet na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Tvoje nové heslo je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Môžeš zmeniť toto heslo na nasledujúcej stránke:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Tvoje užívateľské meno, ak si ho zabudol:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Ďakujeme, že používaš naše stránky!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Skupina %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Záložky"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentácia záložiek"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Na inštaláciu záložiek, potiahni linku do tvojho  "
+"bookmarks\n"
+"toolbar, alebo klikni pravou myšou na linku a pridaj ju do tvojho "
+"bookmarks.\n"
+"Teraz si môžeš vybrať záložku pre ľubovoľnú stránku na webe.  Poznámka:\n"
+"niektoré záložky vyžadujú aby si prezeral web z počítača označeného \n"
+"ako \"internal\" (opýtaj sa vášho systémového administrátora ak si si nie  "
+"istý/á, \n"
+"že tvoj počítač je označený ako \"internal\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumnentácia tejto stránky"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Skoč z ľubovoľnej stránky do dokumentácie, kde je popísaná generácia tejto "
+"stránky."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Ukáž objekt ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Ukáž typ obsahu a jednoznačné ID pre stránky, ktoré zatupujú jednoduché "
+"objekty."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Edituj tento object (aktuálne okno)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Skoč na stránku admina, ktorá zastupuje jednoduchý objekt"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Edituj tento objekt (nové okno)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Ako vyššie, ale stranka admina sa otvorí v novom okne."
+
+#: utils/translation.py:363
+msgid "DATE_FORMAT"
+msgstr ""
+
+#: utils/translation.py:364
+msgid "DATETIME_FORMAT"
+msgstr ""
+
+#: utils/translation.py:365
+msgid "TIME_FORMAT"
+msgstr ""
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Pondelok"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Utorok"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Streda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Å tvrtok"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Piatok"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Nedeľa"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Január"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Február"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Marec"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Apríl"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Máj"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Jún"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Júl"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "August"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "September"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Október"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "November"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "December"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "máj"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "jún"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "júl"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "okt"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Aug."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "rok"
+msgstr[1] "rokov"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mesiac"
+msgstr[1] "mesiacov"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "ďeň"
+msgstr[1] "dní"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "hodina"
+msgstr[1] "hodín"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minúta"
+msgstr[1] "minút"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengálsky"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Český"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Waleský"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Dánsky"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Nemecký"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "Grécký"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Anglický"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Å panielsky"
+
+#: conf/global_settings.py:45
+msgid "Argentinean Spanish"
+msgstr "Argentínska španielčina"
+
+#: conf/global_settings.py:46
+msgid "French"
+msgstr "Francúzsky"
+
+#: conf/global_settings.py:47
+msgid "Galician"
+msgstr "Galicijský"
+
+#: conf/global_settings.py:48
+msgid "Hungarian"
+msgstr "Maďarský"
+
+#: conf/global_settings.py:49
+msgid "Hebrew"
+msgstr "Hebrejský"
+
+#: conf/global_settings.py:50
+msgid "Icelandic"
+msgstr "Islandský"
+
+#: conf/global_settings.py:51
+msgid "Italian"
+msgstr "Taliansky"
+
+#: conf/global_settings.py:52
+msgid "Japanese"
+msgstr "Japónsky"
+
+#: conf/global_settings.py:53
+msgid "Dutch"
+msgstr "Holándsky"
+
+#: conf/global_settings.py:54
+msgid "Norwegian"
+msgstr "Nórsky"
+
+#: conf/global_settings.py:55
+msgid "Brazilian"
+msgstr "Brazílsky"
+
+#: conf/global_settings.py:56
+msgid "Romanian"
+msgstr "Rumúnsky"
+
+#: conf/global_settings.py:57
+msgid "Russian"
+msgstr "Ruský"
+
+#: conf/global_settings.py:58
+msgid "Slovak"
+msgstr "Slovenský"
+
+#: conf/global_settings.py:59
+msgid "Slovenian"
+msgstr "Slovinský"
+
+#: conf/global_settings.py:60
+msgid "Serbian"
+msgstr "Srbský"
+
+#: conf/global_settings.py:61
+msgid "Swedish"
+msgstr "Švédsky"
+
+#: conf/global_settings.py:62
+msgid "Ukrainian"
+msgstr "Ukrajínsky"
+
+#: conf/global_settings.py:63
+msgid "Simplified Chinese"
+msgstr "Zjednodušená činština "
+
+#: conf/global_settings.py:64
+msgid "Traditional Chinese"
+msgstr "Tradičná čínština"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s s %(type)s už existuje pre prvok  %(field)s."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s s %(fieldname)s už existuje."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Toto pole  je nevyhnutné."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "Táto hodnota musí byť integer."
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "Táto hodnota musí byť buď True alebo False."
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "Toto pole nemôže obsahovať null."
+
+#: db/models/fields/__init__.py:468 core/validators.py:132
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Vlož platný dátum/čas vo formáte RRRR-MM-DD HH:MM"
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Vlož platné meno súboru."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Prosím vlož platné %s."
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "Oddeľ viacnásobné ID  čiarkami."
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Podržte \"Control\", alebo \"Command\" na  Mac_u, na výber viac ako jednej "
+"položky."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Prosím vlož platné %(self)s IDs. Hodnota  %(value)r je neplatná."
+msgstr[1] "Prosím vlož platné %(self)s IDs. Hodnoty  %(value)r sú neplatné."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Zabezpeč aby tvoj text bol menší ako %s znak."
+msgstr[1] "Zabezpeč aby tvoj text bol menší ako %s znakov."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Nový riadok tu nieje povolený."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Vyber si platnú voľbu; '%(data)s' nie je v %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Poslaný súbor je prázdný."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Vlož celé číslo s hodnotou medzi -32768 a 32767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Vlož celé kladné číslo."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Vlož celé číslo s hodnotou medzi 0 a 32767."
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Toto môže obsahovať len písmená, číslice a podčiarkovníky."
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Toto môže obsahovať len písmena, číslice, podčiarkovniky, pomlčky a lomítka."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Veľké písmená tu nie sú povolené."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Malé písmena tu nie sú povolené."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Vlož len číslice, oddelené čiarkami."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Vlož platné e-mail adresy oddelené čiarkami."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Prosím vlož platnú IP adresu."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Prázdne hodnoty tu nie sú povolené."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Znaky, ktoré nie sú číslicami, tu nie sú povolené."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Tento údaj nemôže byť vytvorený len z číslic."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Vlož celé číslo."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Tu sú povolené len alfanumerické znaky."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Vlož platný dátum vo formáte RRRR-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Vlož platný čas vo formáte HH:MM."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Vlož platnú e-mail adresu."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Nahraj platný obrázok. Súbor, ktorý si nahral buď nebol obrázok alebo je "
+"nahratý poškodený obrázok."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s neukazuje na platný obrázok."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefónne číslo musí mať formát XXX-XXX-XXXX. Číslo \"%s\" je neplatné."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s neukazuje na platné QuickTime video."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Platné URL je požadované."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Je požadovaná bezchybná stránka  HTML. Zistené chyby sú:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Chybne formované XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neplatné URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "Odkaz na URL %s je neplatný."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Vlož platnú skratku U.S. štátu."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Vyjadruj sa slušne! Slovo %s tu nie je dovolené použivať."
+msgstr[1] "Vyjadruj sa slušne! Slová %s tu nie je dovolené použivať."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Toto pole sa musí zhodovať s poľom '%s'. "
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Prosím vlož niečo aspoň pre jedno pole."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosím vlož obidve polia, alebo nechaj ich obe prázdne. "
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Toto pole musí byť vyplnené tak, že %(field)s obsahuje %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+"Toto pole musí byť vyplnené tak, že %(field)s nesmie obsahovať %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Duplicitné hodnoty nie sú povolené."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Táto hodnota musí byť mocninou  %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Prosím vlož platné desiatkové číslo. "
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Prosím vlož platné desiatkové číslo s najviac %s číslicou."
+msgstr[1] "Prosím vlož platné desiatkové číslo s najviac %s číslicami."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Prosím vlož platné desatinné číslo s najviac %s desatinným miestom."
+msgstr[1] ""
+"Prosím vlož platné desatinné číslo s najviac %s desatinnými miestami."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Presvedč sa, že posielaný súbor nemá menej ako %s bytov."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Presvedč sa, že posielaný súbor nemá viac ako %s bytov."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Formát pre toto pole je chybný."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Toto pole nie je platné."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Nič som nemohol získať z %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+" URL %(url)s vrátilo neplatnú hlavičku  Content-Type  '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Prosím zavri nezavretý  %(tag)s popisovač v riadku %(line)s. (Riadok začína "
+"s  \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Nejaký text začínajúci na riadku %(line)s nie je povolený v tomto kontexte. "
+"(Riadok začína s \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" na riadku %(line)s je neplatný atribút. (Riadok začína s \"%"
+"(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" na riadku %(line)s je neplatný popisovač. (Riadok začína s \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Popisovaču na riadku %(line)s chýba jeden alebo viac atribútov. (Riadok "
+"začína s \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atribút \"%(attr)s\" na riadku %(line)s má neplatnú hodnotu. (Riadok začína "
+"s \"%(start)s\".)"
+
+#: template/defaultfilters.py:383
+msgid "yes,no,maybe"
+msgstr "ano,nie,možno"
+
+#~ msgid "Comment"
+#~ msgstr "Komentár"
+
+#~ msgid "Comments"
+#~ msgstr "Komentáre"
+
+#~ msgid "Delete this file."
+#~ msgstr "Vymaž tento súbor."
+
+#~ msgid "label"
+#~ msgstr "popis"
+
+#~ msgid "package"
+#~ msgstr "balík"
+
+#~ msgid "packages"
+#~ msgstr "balíky"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Reťazec (do 50 )"

Added: vendor/django/current/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/sk/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/sk/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/sk/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/sk/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,111 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# VLADO LABATH  <vlado at labath.org>, 2005.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-18 19:38-0500\n"
+"PO-Revision-Date: 2005-12-18 19:26-0500\n"
+"Last-Translator: VLADO LABATH  <vlado at labath.org>\n"
+"Language-Team: LANGUAGE <sk at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr "Možný %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Vyber všetko"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Pridaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Vymaž"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Vybrané %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Vyber si svoju voľbu a klikni"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Vyčisti všetko"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+"Január Február Marec Apríl Máj Jún Júl August September Október November "
+"December"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Nedeľa Pondelok Utorok Streda Štvrtok Piatok Sobota"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P U S Å  P S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Práve teraz"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Hodiny"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Vyber čas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Polnoc"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 ráno"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Poludnie"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Zruš"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Dnes"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalendár"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Včera"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Zajtra"

Added: vendor/django/current/django/conf/locale/sl/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/sl/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/sl/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/sl/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/sl/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2020 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Igor Kolar <ike at email.si), 2006.
+# Nena Kojadin <nena at kiberpipa.org), 2006
+msgid ""
+msgstr ""
+"Project-Id-Version: Django Slovenian 0.92+svn translation\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2006-03-19 17:30+0100\n"
+"Last-Translator: Jure ÄŒuhalev <gandalf at owca.info>\n"
+"Language-Team: Slovenian <sl at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "ID objekta"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "naslov"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentar"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "rating #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "rating #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "rating #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "rating #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "rating #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "rating #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "rating #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "rating #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "je veljavni rating"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "podatek datum/čas poslan"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "je javno"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP naslov"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "je odstranjen/-a"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Odkljukaj, če je komntar neprimeren. Namesto komentarja bo vidno obvestilo "
+"\"Ta komentar je bil odstranjen\"."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "komentar"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objekt s vsebino"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Poslal uporabnik %(user)s ob %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "ime osebe"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip naslov"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "potrjeno s strani osebja"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Zastonj komentar"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Zastonj komentarji"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "ocena"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "datum ocene"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Karma"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Skrivnosti karme"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "oceno %(score)d podelil %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Komentar je z zastavico označil %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "datum označitve (zastavice)"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Uporabniška zastavica"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Uporabniške zastavice"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Avtor zastavice je %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "datum izbrisa"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Izbris s strani moderatorja"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Izbrisi s strani moderatorja"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Izbris opravil moderator %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonimni upirabniki ne morejo glasovati"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Neveljavni ID komentarja"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Ni mogoče glasovati zase"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Moraš podati tole oceno, ker si podal vsaj še eno drugo oceno."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s "
+"komentarjev Komentar:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ta komentar je poslal uporabnik, ki je do zdaj poslal manj kot %(count)s "
+"komentarjev Komentar:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ta komentar je poslal sumljiv uporabnik:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Dovoljena je le metoda HTTP POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Eden ali več obveznih polj ni vpisanih"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Nekdo se je poigraval z obrazcem za komentarje (varnostna kršitev)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Obrazec s komentarji ima neveljavni parameter 'target' -- ID objekta je "
+"neveljaven."
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Obrazec s komentarji ne zahteva niti 'preview' niti 'post' akcije."
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Uporabniško ime:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Geslo:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "Ste pozabili geslo?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Odjava"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "Ocene"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "Obvezno"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "Neobvezno"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "Objavi sliko"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "Komentar:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "Predogled komentarja"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "Vaše ime:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Avtor: %s</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Vse"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Kadarkoli"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Danes"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Zadnjih 7 dni"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Ta mesec"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Letos"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Neznano"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "čas oprave dejanja"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id objekta"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "predstavitev objekta"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "zastavica za določeno dejanje"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "spremeni sporočilo"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "vnos v dnevniku"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "vnosi v dnevniku"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Vsi datumi"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Prosimo, vnesite veljavno uporabniško ime in geslo. Opomba: obe polji sta "
+"občutljivi na velikost črk"
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Prijate se"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Vaša seja je pretekla; prosimo, prijavite se znova. Opomba: Vse vaše objave "
+"so varno shranjene."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Izgleda, da vaš brskalnik nima podpore za piškotke. Prosimo, vključite "
+"piškotke, znova naložite to stran in poskusite še enkrat."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Uporabniška imena ne smejo vsebovati znaka '@'"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Vaš e-mail naslov ne morete uporabljati kot uporabniško ime. Namesto tega "
+"uporabite '%s'"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Administracija strani"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" je bil uspešno dodan."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Vsebino lahko znova uredite spodaj."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Spodaj lahko dodate Å¡e en %s."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Dodal %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "in"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Spremenil %s"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Izbrisal %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Nobeno polje ni bilo spremenjeno."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" je bilo uspešno spremenjeno."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\" je bilo uspešno dodano. Znova ga lahko urejate spodaj."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Spremeni %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Eden ali več %(fieldname)s v %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Eden ali več %(fieldname)s v %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" je bilo uspešno izbrisano."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Ste prepričani?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Zgodovina sprememb: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Izberi %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Izberi %s, ki ga želite spremeniti"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Integer (Å¡tevilo)"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Boolean (ali True ali False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Niz (vse do %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Z vejico ločeni integerji"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Datum (brez časa)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Datum (s časom)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-naslov"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Pot do datoteke"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Decimalno Å¡tevilo"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolean (ali True ali False ali None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Razmerje z starševskim modelom"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefonska Å¡tevilka"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Besedilo"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "ÄŒas"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL (spletni naslov)"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Koda ameriške zvezne države (dve veliki črki)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML besedilo"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Spremeni geslo"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Domov"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Zgodovina"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/čas"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Uporabnik"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Dejanje"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ta objekt nima zgodovine. Verjetno ni bil dodan preko te administratorske "
+"strani."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django site admin"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administracija"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Napaka strežnika"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Django napaka (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Napaka strežnika <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Prišlo je do nepričakovane napake. Administratorji strani so že obveščeni "
+"prekoe-pošte in naj bi jo v kratkem odpravili. Hvala za vaše potrpljenje."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strani ni mogoče najti"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Se opraivčujemo, a zahtevane strani ni mogoče najti."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Spremeni"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nimate dovoljenja za urejanje česar koli."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Zadnja dejanja"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moja dejanja"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Ni na voljo"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Ste <a href=\"/password_reset/\">pozabili geslo</a>"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Izbriši"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Izbris %(object_name)s '%(object)s' bi pomenil izbris povezanih objektov, "
+"vendarvi nimate dovoljenja za izbris naslednjih tipov objektov:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Ste prepričani, da želite izbrisati %(object_name)s \"%(object)s\"?Vsi "
+"naslednji povezani elementi bodo izbrisani:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, sem prepričan"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Po %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Pojdi"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Poglej na strani"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Prosimo, odpravite sledečo napako."
+msgstr[1] "Prosimo, odpravite sledeče napake."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Urejanje"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Uredi:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Shrani kot novo"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Shrani in dodaj Å¡e eno"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Shrani in nadaljuj z urejanjem"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Shrani"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Sprememba gesla"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Geslo uspešno spremenjeno"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaše geslo je bilo spremenjeno."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Obnova gesla"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Ste pozabili geslo? Vnesite vaš e-naslov spodaj in mi vam bomo poslali novo "
+"geslo."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-naslov"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Obnova gesla"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala, ker ste si vzeli nekaj časa za to spletno stran."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Ponovna prijava"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Geslo je bilo uspešno obnovljeno"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "Po e-pošti smo vam poslali novo geslo.Morali bi ga prejeti v kratkem"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Prosim, vnesite vaše staro geslo (zaradi varnosti) in nato še dvakrat novo"
+"(da preverimo, da se niste zatipkali)"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Staro geslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Novo geslo:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potrditev gesla:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Sprememba gesla"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "To pošto ste dobili, ker ste zahtevali spremembo gesla"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "za vaš uporabniški račun pri %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaše novo geslo je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Geslo lahko spremenite z obiskom strani:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše uporabniško ime (za vsak primer)"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Hvala, ker uporabljate našo stran!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "Ekipa strani %(site_name)s"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Zaznamkice"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentacijske zaznamkice"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Za inštalacijo zaznamkic povlečite povezavo v orodno "
+"vrstico\n"
+"z zaznamki, ali kliknite z desno miškino tipko na povezavo in jo dodajte med "
+"zaznamkeZdaj lahko uporabite zaznamek s katere koli strani. Opomba: nekatere "
+"teh stranilahko gledate le z internega računalnika (preverite s sistemskim "
+"administratorjem)</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentacija za to stran"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Skok na stran z dokumentacijo za pogled (view), ki generira trenutno stran."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Pokaži ID objekta"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Pokaže content-type in unikatni ID za strani, ki predstavljajo en objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Uredi trenutni objekt (v trenutnem oknu)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Skok na administracijsko stran za vse strani, ki predstavljajo en objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Uredi ta objekt (v novem oknu)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Kot zgoraj, le da odpre administracijsko stran v novem oknu."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "ÄŒas:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Trenutno:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Sprememba:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "preusmeritev iz"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"To mora biti absolutna pot, izključujoč domeno. Primer: '/events/search'-"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "preusmeri na"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"To je ali absolutna pot (kot zgoraj) ali popoln URL naslov (začne se z "
+"'http://')"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "preusmeritev"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "preusmeritve"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Primer: '/about/contact/'. Mora vsebovati / (poševnico) na začetku in koncu."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "naslov"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "vsebina"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "omogoči komentarje"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ime predloge"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Primer: 'flatpages/contact_page'. ÄŒe to polje ni izpolnjeno, bo sistem "
+"uporabil 'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "obvezna registracija"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"ÄŒe je to polje odkljukano, si lahko to stran ogledajo le registrirani "
+"uporabniki."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "ploh stran :)"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "ploh strani :)"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "ime"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "kodno ime"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Dovoljenje"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Dovoljenja"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Skupina"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Skupine"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "uporabniško ime"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "ime"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "priimek"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-naslov"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "geslo"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Uporabi '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "status osebja"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Določi, če se sme uporabnik prijaviti v to administracijsko stran."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktiven"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "status superuporabnika"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "zadnja prijava"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "član od"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Polek ročno določenih dovoljenj bo ta uporabnik dobil tudi vsa dovoljenja,ki "
+"pripadajo vsem skupinah, v katerih je."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Dovoljenja"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Uporabnik"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Uporabniki"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Osebni podatki"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Dovoljenja"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Pomembni datumi"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Skupine"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Sporočilo"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Izgleda, da vaš brskalnik nima omogočenih piškotkov. Piškotki so potrebni za "
+"prijavo."
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "python ime modula"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "content type"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "content types"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "sejni ključ"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "podatki v seji"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "čaz izteka"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "seja"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "seje"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domena"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "prikazno ime"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "stran"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "strani"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "ponedeljek"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "torek"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "sreda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "četrtek"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "petek"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "sobota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "nedelja"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "februar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "marec"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "april"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "maj"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "junij"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "julij"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "avgust"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "december"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "in"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "feb"
+msgstr "feb."
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "dan"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "jan."
+
+#: utils/dates.py:27
+#, fuzzy
+msgid "Feb."
+msgstr "feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "avg."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "sep."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "leto"
+msgstr[1] "let"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mesec"
+msgstr[1] "mesecev"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dan"
+msgstr[1] "dni"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "ura"
+msgstr[1] "ur"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minuta"
+msgstr[1] "minut"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Češki"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Valežanski"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Danski"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Nemški"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Angleški"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Å panski"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francoski"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galičanski"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandski"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italijanski"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japonski"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Nizozemski"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norveški"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Romunski"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Ruski"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovaški"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "Slovenski"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Srbski"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Å vedski"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Poenostavljen kitajski"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Tradicionalni kitajski"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "To polje lahko vsebuje le črke, števila in podčrtaje (_)."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"To polje lahko vsebuje le črke, števila, podčrtaje (_) in poševnice (/)."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Velike tiskane črke tu niso dovoljene."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Majhne tiskane črke tu niso dovoljene."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Vnesite števila, ločena z vejicami."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Vnesite veljavne e-pošne naslove, ločene z vejicami."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Prosimo, vnesite veljavni IP naslov."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Prazne vrednosti tu niso dovoljene."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Nenumerične vrednosti tukaj niso dovoljne."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "To polje ne sme vsebovati le Å¡tevk."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Vnesite celo Å¡tevilo."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Le črke iz abecede so dovoljene tukaj."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Vnesite veljavni datum v zapisu YYYY-MM-DD (leto-mesec-dan)."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Vnesite veljavni čas v zapisu HH:MM (ura:minuta)."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+"Vnesite veljavni datum/čas v zapisu YYYY-MM-DD HH:MM (leto-mesec-dan ura:"
+"minuta)"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Vnesite veljavni e-naslov."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Uploadjate veljavno sliko. Trenutna datoteka ni bila niti slika niti "
+"okvarjena slika."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s ne kaže na veljavno sliko."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "Telefonska Å¡tevilka mora biti v zapisu XXX-XXX-XXXX. \"%s\" ni vredu."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s ne kaže na veljavni QuickTime video."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Potreben je veljavni URL naslov."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Potreben je veljavni HTML. Trenutni ima sledeče napake:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Pokvarjen XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neveljavni URL naslov: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL povezava %s je polomljena."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Vnesi veljavno okrajšavo za ameriško zvezno državo."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pazite na jezik! Beseda %s tu ni dovoljena."
+msgstr[1] "Pazite na jezik! Besede %s tu niso dovoljene."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "To polje mora ustrezati polju '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Prosim, vnesite nekaj v vsaj eno od polj."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Prosimo, izpolnite obe polji ali ju pustite obe prazni."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "To polje mora biti izpolnjeno, če je %(field)s %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "To polje mora biti izpolnjeno, če ni %(field)s %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Podvojitve niso dovoljene."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Ta vrednost mora biti potenca od %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Prosim vnesite decimalno Å¡tevilo."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Prosimo, vnesite veljavno decimalno število z največ %s števkami."
+msgstr[1] "Prosimo, vnesite veljavno decimalno število z največ %s števkami."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+"Prosimo, vnesite veljavno decimalno število z največ %s decimalnimi mesti."
+msgstr[1] ""
+"Prosimo, vnesite veljavno decimalno število z največ %s decimalnimi mesti."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Prosimo, poskrbite, da bo prenesena datoteka velika vsaj %s bajtov."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Poskrbite, da bo prenesena datoteka velika največ %s bajtov."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Format za to polje je napačen."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "To polje ni veljavno."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Iz %s nisem mogel izločiti ničesar."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s je vrnil neveljavni Content-Type '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Prosimo, zaprite nezaprto %(tag)s oznako v vrstici %(line)s. (Vrstica se "
+"začne z \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tekst z začetka vrstice %(line)s ni dovoljen v tem kontekstu. (Vrstica se "
+"začne z \"%(start)s\".)"
+
+#: core/validators.py:471
+#, fuzzy, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" v vrstici %(line)s je neveljavna oznaka. (Vrstica se začne z "
+"\"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" v vrstici %(line)s je neveljavna oznaka. (Vrstica se začne z "
+"\"%(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Oznaki v vrstici %(line)s manjka eden ali več nujnih atributov (Vrstica se "
+"začne z \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atribut \"%(attr)s\" v vrstici %(line)s vsebuje neveljavno vrednost. "
+"(Vrstica se začne z \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s s tem %(type)s že obstaja za veljavno (%field)s."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s s tem %(fieldname)s že obstaja."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "To polje je obvezno"
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Ta vrednost mora biti potenca od %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Ta vrednost mora biti potenca od %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "To polje ni veljavno."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Vnesite veljavno ime datoteke."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Prosimo, vnesite veljaven %s."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr "Več ID-jev ločite z vejicami."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Stisni \"Control\" (ali \"Command\" na Mac-u), da izbereš več kot enega."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+"Prosimo, vnesite veljavni %(self)s ID-je. Vrednost %(value)r ni veljavna."
+msgstr[1] ""
+"Prosimo, vnesite veljavni %(self)s ID-je. Vrednosti %(value)r niso veljavne."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Poskrbite, da bo tekst krajši do %s znakov."
+msgstr[1] "Poskrbite, da bo tekst krajši od %s znakov."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Prelomi vrstice tu niso dovoljeni."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Izberite veljavno možnost; '%(data)s' ni v %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Poslano polje je prazno."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Vnesite celo Å¡tevilo med -32,768 in 32,767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Vnesite pozitivno Å¡tevilo."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Vnesite celo Å¡tevilo med 0 in 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ja,ne,morda"
+
+#~ msgid "Comment"
+#~ msgstr "Komentar"
+
+#~ msgid "Comments"
+#~ msgstr "Komentarji"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Niz (do 50 znakov)"
+
+#~ msgid "label"
+#~ msgstr "oznaka"
+
+#~ msgid "package"
+#~ msgstr "paket"
+
+#~ msgid "packages"
+#~ msgstr "paketi"
+
+#~ msgid "Slovene"
+#~ msgstr "Slovenski"

Added: vendor/django/current/django/conf/locale/sr/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/sr/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/sr/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/sr/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/sr/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2057 @@
+msgid ""
+msgstr ""
+"Project-Id-Version: Django Serbian (latin) translation v1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:11+0200\n"
+"PO-Revision-Date: 2006-01-15 11:21+0100\n"
+"Last-Translator: Nebojša Đorđević <nesh at studioquattro.co.yu>\n"
+"Language-Team: Nesh <nesh at studioquatro.co.yu> & Petar <petar.maric at gmail."
+"com>\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"
+"X-Poedit-Language: Serbian\n"
+"X-Poedit-Country: YUGOSLAVIA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"X-Poedit-Basepath: ../../../../\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "id objekta"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "naslov"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "komentar"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "rejting #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "rejting #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "rejting #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "rejting #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "rejting #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "rejting #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "rejting #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "rejting #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "da li je rejting validan"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "datum/vreme slanja"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "da li je javni"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP adresa"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "obrisan je"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Selektujte ako je komentar neodgovarajući. Biće ispisano \"Ovaj komentar je "
+"obrisan\" umesto teksta komentara."
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "komentar"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "Objekt sa sadržajem"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Poslao %(user)s u %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "ime"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip adresa"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "odobreno od moderatora"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Slobodan komentar"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Slobodni komentari"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "rezultat"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "datum rezultata"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "\"Karma\" rezultat"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "\"Karma\" rezultati"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Rezultat %(score)d od %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ovaj komentar je markiran od %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "datum markiranja"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Korisnički marker"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Korisnički markeri"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r je markirao"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "datum brisanja"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Brisanje od strane moderatora"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Brisanja od strane moderatora"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Obrisao moderator %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonimni korisnici ne mogu da glasaju"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Neispravan ID komentara"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Ne možete da glasate sami za sebe"
+
+# nesh: grrrrr, ala je rogobatno
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Ovaj rejting je obavezan pošto ste uneli još najmanje jedan rejting."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s "
+"komentara:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s "
+"komentara:\n"
+"\n"
+"%(text)s"
+msgstr[2] ""
+"Ovaj komentar je poslat od korisnika koji je poslao manje od %(count)s "
+"komentara:\n"
+"\n"
+"%(text)s"
+
+# nesh: skethcy???
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Ovaj komentar je poslat od \"sketcy\" korisnika:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Jedino je POST dozvoljen"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Jedno ili više obaveznih polja nije poslato."
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Neko je menjao form za komentare (povreda sigurnosti)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Form komentara ima neispravni 'target' parametar -- ID objekta nije ispravan"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Ovaj komentar nije koristio 'preview' ili 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Korisničko ime:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Lozinka:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Izmeni moju lozinku"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Odjavi se"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "rejting #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Komentar"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Slobodan komentar"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "korisničko ime"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Od %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Sve"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Bilo koji datum"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Danas"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Zadnjih sedam dana"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Ovaj mesec"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Ova godina"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Da"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Ne"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Nepoznato"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "vreme akcije"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id objekta"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "opis objekta"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "akcija"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "opis promene"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "unos u dnevnik izmena"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "unosi u dnevnik izmena"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Svi datumi"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+"Unesite ispravno korisničko ime i šifru. Napomena: oba polja prave razliku "
+"između velikih i malih slova."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Prijavi se"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Ponovo se prijavite pošto je vaša sesija istekla. Ne brinite, vaši podaci su "
+"sačuvani."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Izgleda da vaš browser ne podržava \"cookie\". Uključite ih, ponovo učitajte "
+"stranu i pokušajte ponovo."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Korisnička imena ne mogu sadržati karakter '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Vaša e-mail adresa nije koriničko ime. Probajte sa '%s'."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Administracija sajta"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "Uspešno dodat %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Ispod ga možete ponovo izmeniti."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Ispod možete dodati još jedan %s."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Dodaj %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Dodat %s"
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "i"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Izmenjen %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Obrisan %s"
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Nijedno polje nije promenjeno."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "Uspešno izmenjen: %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" je uspešno dodat. Ispod ga možete ponovo menjati."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Izmeni %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Jedno ili više %(fieldname)s u %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Jedan ili više %(fieldname)s u %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "Uspešno obrisan: %(name)s \"%(obj)s\"."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Da li ste sigurni?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Istorija izmena: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Izaberi %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Izaberi %s za izmenu"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Ceo broj"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Logička vrednost (Tačno ili Netačno)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Niz karaktera (maksimalno %(maxlength)s karaktera)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Brojevi razdvojeni zarezima"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Datum (bez vremena)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Datum (sa vremenom)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mail adresa"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Putanja do fajla"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Decimalni broj"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Logička vrednost (Tačno, Netačno ili prazno)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relacija prema nadređenom objektu"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefonski broj"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Tekst"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Vreme"
+
+# nesh: ovo se valjda ne prevodi
+# petar: ne prevodi se
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. država (dva VELIKA slova)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML tekst"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentacija"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Izmeni lozinku"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Početna strana"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Istorija"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/vreme"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Korisnik"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Akcija"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "j. N Y, H:i"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Ovaj objekat nema istoriju promena. Najverovatnije nije dodat korišćenjem "
+"administracije sajta."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django administracija sajta"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django administracija"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Greška na serveru"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Greška na serveru (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Greška na serveru <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Dogodila se greška koja je prijavljena administratorima i biće popravljena "
+"uskoro. Hvala Vam na strpljenju."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Strana nije pronađena"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Tražena strana ne postoji."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Izmena"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Nemate prava da vršite izmene."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Skorije akcije"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Moje akcije"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Nema dostupnih"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Dodaj %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Da li ste <a href=\"/password_reset/\">zaboravili Vašu lozinku?</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Dobrodošli,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Obriši"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Brisanjem %(object_name)s  '%(object)s' došlo bi do brisanja dodatnih "
+"podataka, ali nemate prava da brišete sledeće tipove podataka:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Da li ste sigurni da želite da obrišete %(object_name)s \"%(object)s\"? Biće "
+"obrisani i sledeći pridruženi objekti:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Da, siguran sam"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "Po %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Uradi"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Pogledaj na sajtu"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Ispravite dole navedenu grešku."
+msgstr[1] "Ispravite dole navedene greške."
+msgstr[2] "Ispravite dole navedene greške."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Redosled"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Red:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Snimi kao novi"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Snimi i dodaj još jedan"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Snimi i nastavi sa izmenama"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Snimi"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Izmena lozinke"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Lozinka je uspešno izmenjena"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Vaša lozinka je izmenjena."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Resetovanje lozinke"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Zaboravili ste svoju lozinku? Unesite vašu e-mail adresu i dobićete novu "
+"lozinku na dati e-mail."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail adresa:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Resetuj moju lozinku"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Hvala Vam na poseti."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Prijavi se ponovo"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Vaša lozinka je uspešno resetovana"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Nova lozinka poslata vam je na zadatu e-mail adresu. E-mail bi trebao da "
+"stigne u narednih nekoliko minuta."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Unesite staru lozinku, nakon toga unesite novu lozinku dva puta, radi "
+"provere ispravnosti unosa."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Stara lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nova lozinka:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Potvrdite novu lozinku:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Izmeni moju lozinku"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Primili ste ovaj e-mail jer ste tražili resetovanje lozinke"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "za vaš korisnički nalog na %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Vaša nova lozinka je: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Lozinku možete izmeniti na sledećoj strani:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Vaše korisničko ime, u slučaju da ste zaboravili:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Hvala Vam na poseti!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s tim"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Dokumentacioni \"bookmarklets\""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">Da bi ste instalirali \"bookmarklet\", odvučite link u "
+"vaše \"bookmark\"-e, ili kliknite desnim tasterom i dodajte ga. Sada možete "
+"da izaberete \"bookmark\" sa bilo koje strane na sajtu. Napomena: pristup "
+"nekima od strana mora biti sa kompjutera čija je IP adresa označena kao "
+"\"internal\" (kontaktirajte sistem administratora ako niste sigurni da li je "
+"vaš IP označen kao \"internal\").</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentacija za ovu stranu"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Skače sa bilo koje strane na stranu sa dokumentacijom za \"view\" koji "
+"generiše tu stranu."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Prikaži ID objekta"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Prikazuje \"content-type\" i jedinstveni ID strane koje predstavlja jedan "
+"objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Izmena objekta (u aktivnom prozoru)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "Skače na admin stranu za strane koje predstavljaju objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Izmeni objekt (novi prozor)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Kao iznad, samo otvara admin stranu u novom prozoru."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Vreme:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Trenutno:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "Izmenite:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "redirekcija od"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Ovde treba upisati apsolutnu putanju bez imena domena. Primer: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "redirekcija na"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Ovo može biti apsolutna putanja (kao gore) ili puni URL koji počinje sa "
+"'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "redirekcija"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "redirekcije"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Primer: '/about/contact/'. Proverite da li ste uneli početnu i kranju kosu "
+"crtu."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "naslov"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "sadržaj"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "omogućite komentare"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ime templejta"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Primer: 'flatpages/contact-page'. Ako nije dato sistem će koristiti "
+"flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "samo za registrovane korisnike"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Ako izaberete ovu opciju samo prijavljeni korisnici će imati pristup datoj "
+"strani."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "statična strana"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "statične strane"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "ime"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "kodno ime"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Pravo"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Prava"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Grupa"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grupe"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "korisničko ime"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "ime"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "prezime"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mail adresa"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "lozinka"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Koristite '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "dozvoli pristup administraciji sajta"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Određuje da li će korisnik imati pristup administratorskom delu sajta."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktivan"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "da li je korisnik administrator"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "vreme poslednje posete"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "datum otvaranja naloga"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Uz ručno dodata prava, korisnik će dobiti sva prava iz grupa kojima pripada."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Prava"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Korisnik"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Korisnici"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Lične informacije"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Prava"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Važni datumi"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupe"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Poruka"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+"Vaš web brovser nema omogućenje \"cookie\". \"cookie\" podrška je potrebna "
+"da bi ste mogli da se prijavite."
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "ime python modula"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "tip sadržaja"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "tipovi sadržaja"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "ključ sesije"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "podaci sesije"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "datum prestanka važenja sesije"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "sesija"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sesije"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "ime domena"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "naziv"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "sajt"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "sajtovi"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "D, d.m.Y."
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "d.m.Y. H:i:s"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Ponedeljak"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Utorak"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Sreda"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "ÄŒetvrtak"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "Petak"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Subota"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Nedelja"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Januar"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Februar"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Mart"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "April"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Maj"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Jun"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Jul"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Avgust"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Septembar"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Oktobar"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Novembar"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Decembar"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "i"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "dan"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Jan."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Feb."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Avg."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Sept."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Okt."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Nov."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Dec."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "godina"
+msgstr[1] "godine"
+msgstr[2] "godina"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "mesec"
+msgstr[1] "meseca"
+msgstr[2] "meseci"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dan"
+msgstr[1] "dana"
+msgstr[2] "dana"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "sat"
+msgstr[1] "sata"
+msgstr[2] "sati"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "munuta"
+msgstr[2] "minuta"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengalski"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Češki"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Welšski"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Danski"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Nemački"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Engleski"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Å panski"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Francuski"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galski"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Islandski"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italijanski"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Japanski"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "Holandski"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norveški"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumunski"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Ruski"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovački"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Slovački"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Srpski"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Å vedski"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brazilski"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Kineski (pojednostavljen)"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Tradicionalni Kineski"
+
+# nesh: Ovo je opis za stari SlugField
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Ovo polje može sadržati samo slova, brojeve i donju crtu (_)."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Ovo polje može sadržati samo slova, brojeve, donju crtu (_) i kose crte."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Velika slova ovde nisu dozvoljena."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Mala slova ovde nisu dozvoljena."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Unesite samo brojeve razdvojene zarezima."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Unesite ispravne e-mail adrese razdvojene zarezima."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Unesite ispravnu IP adresu."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Prazne vrednosti ovde nisu dozvoljene."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Ovde možete uneti samo brojeve."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Podatak se ne može sastojati samo od brojeva."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Unesite celi broj."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Ovde možete koristiti samo slova."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Unesite ispravan datum u YYYY-MM-DD formatu."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Unesite ispravno vreme u HH:MM formatu."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Unesite ispravan datum i vreme u YYYY-MM-DD HH:MM formatu."
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Unesite ispravnu e-mail adresu."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Pošaljite ispravnu sliku. Fajl koji ste poslali ili nije slika ili je sam "
+"fajl oštećen."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s ne pokazuje na ispravnu sliku"
+
+# nesh: tel. brojevi su u američkom formatu, ovo se ionako neće koristiti u i18n delu
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonski brojevi moraju biti u formatu XXX-XXX-XXXX. \"%s\" je neispravan."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s ne pokazuje na ispravni QuickTime video fajl."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "Unesite ispravan URL."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Unesite ispravan HTML. Greške su:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Neispravan XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Neispravan URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s je neispravan link."
+
+# nesh: Ni ovo nije interesantno za i18n
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Unesite ispravnu skraćenicu za U.S. državu."
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Pripazi na jezik! %s reč nije ovde dozvoljena."
+msgstr[1] "Pripazi na jezik! %s reči nisu ovde dozvoljene."
+msgstr[2] "Pripazi na jezik! %s reči nisu ovde dozvoljene."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Ovo polje mora biti jednako sa poljem '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Morate popuniti barem jedno polje."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Popunite oba polja ili oba ostavite prazna."
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Ovo polje mora biti uneto ako polje %(field)s ima vrednost %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Ovo polje mora biti uneto ako polje %(field)s nema vrednost %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Duple vrednosti nisu dozvoljene."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Vrednost mora biti stepena %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Unesite ispravan decimalni broj."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Unesite ispravan decimalni broj sa %s cifrom."
+msgstr[1] "Unesite ispravan decimalni broj sa %s cifre."
+msgstr[2] "Unesite ispravan decimalni broj sa %s cifara."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Unesite decimalni broj sa najviše %s decimalnim mestom."
+msgstr[1] "Unesite decimalni broj sa najviše %s decimalna mesta."
+msgstr[2] "Unesite decimalni broj sa najviše %s decimalnih mesta."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Veličina fajla mora biti najmanje %s bajtova."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Veličina fajla mora biti najviše %s bajtova."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Pogrešan format polja."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Neispravno polje."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Ništa nije moglo da se skine sa URL-a %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Sa URL-a %(url)s se vratio pogrešan Content-Type header '%(contenttype)s'."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Zatvorite nezatvoren tag \"%(tag)s\" iz reda %(line)s. (Red počinje sa \"%"
+"(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tekst koji počinje u redu %(line)s nije dozvoljen u ovom kontekstu. (Red "
+"počinje sa \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Atribut \"%(attr)s\" u red %(line)s je neispravan. (Red počinje sa \"%(start)"
+"s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"Tag \"<%(tag)s>\" u redu %(line)s je neispravan. (Red počinje \"%(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Tag-u u redu %(line)s nedostaje jedan ili više atributa. (Red počinje sa \"%"
+"(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Atribut \"%(attr)s\" u redu %(line)s ima neispravnu vrednost. (Red počinje "
+"sa \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(object)s sa ovim tipom %(type)s već postoji za polje %(field)s."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s sa ovim %(fieldname)s već postoji."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Obavezno polje."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Vrednost mora biti stepena %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Vrednost mora biti stepena %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Neispravno polje."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Unesite ispravno ime fajla."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Unesite ispravan %s."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr " Odvojite višestruke ID-ove zarezima."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Koristite \"Ctrl\" (PC) ili \"Jabuku\" (Mek) da bi ste selektovali više "
+"stavki."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
+msgstr[1] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
+msgstr[2] "Unesite validne %(self)s ID-ove. Vrednost %(value)r je neispravna."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Tekst mora imati manje od %s slova."
+msgstr[1] "Tekst mora imati manje od %s slova."
+msgstr[2] "Tekst mora imati manje od %s slova."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Novi redovi ovde nisu dozvoljeni."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Izaberite validnu opciju: '%(data)s' nije u %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Poslati fajl je prazan."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Unesite celi broj između -32,768 i 32,767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Unesite pozitivan broj."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Unesite celi broj između 0 i 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "da,ne,možda"
+
+#~ msgid "Comment"
+#~ msgstr "Komentar"
+
+#~ msgid "Comments"
+#~ msgstr "Komentari"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Niz karaktera (maksimalno 50 karaktera)"
+
+#~ msgid "label"
+#~ msgstr "labela"
+
+#~ msgid "package"
+#~ msgstr "paket"
+
+#~ msgid "packages"
+#~ msgstr "paketi"
+
+#~ msgid "Error in Template"
+#~ msgstr "Greška u templejtu"
+
+#~ msgid ""
+#~ "\n"
+#~ "In template %(name)s, error at line %(line)s:\n"
+#~ msgstr ""
+#~ "\n"
+#~ "U templejtu %(name)s, greška u redu %(line)s:\n"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "sadržaj"

Added: vendor/django/current/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/sr/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/sr/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/sr/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/sr/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,110 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2006-01-15 11:24+0100\n"
+"Last-Translator: Nebojša Đorđević <nesh at studioquattro.co.yu>\n"
+"Language-Team: Nesh <nesh at studioquatro.co.yu> & Petar <petar.maric at gmail.com> <sr at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Serbian\n"
+"X-Poedit-Country: YUGOSLAVIA\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:33
+#, perl-format
+msgid "Available %s"
+msgstr "Dostupno %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "Izaberi sve"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "Dodaj"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "Izbaci"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr "Izabrano %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "Izaberite potrebno i kliknite"
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "Obrišite sve"
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid "January February March April May June July August September October November December"
+msgstr "Januar Februar Mart April Maj Jun Jul Avgust Septembar Oktobar Novembar Decembar"
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "Nedelja Ponedeljak Utorak Sreda ÄŒetvrtak Petak Subota"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "N P U S Č P S"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Sada"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Sat"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Izaberi vreme"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Ponoć"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "6 sati"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Podne"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Poništi"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Danas"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalendar"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Juče"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Sutra"
+

Added: vendor/django/current/django/conf/locale/sv/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/sv/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/sv/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/sv/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/sv/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2028 @@
+# Swedish translation of Django
+# Copyright (C) 2005
+# This file is distributed under the same license as the Django package.
+# Robin Sonefors <ozamosi at blinkenlights.se>, 2005.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2005-12-04 16:20+0100\n"
+"Last-Translator: Robin Sonefors <ozamosi at blinkenlights.se>\n"
+"Language-Team: Django translators <djangoi18n at googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
+"X-Poedit-Language: Swedish\n"
+"X-Poedit-Country: SWEDEN\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "objektets id"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "rubrik"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "kommentar"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "betyg #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "betyg #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "betyg #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "betyg #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "betyg #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "betyg #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "betyg #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "betyg #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "är ett giltigt betyg"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "datum/tid postat"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "är offentligt"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP-adress"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "är borttaget"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+"Bocka för den här rutan om kommentaren är olämplig. Ett \"Den här "
+"kommentaren har tagits bort\"-meddelande kommer visas istället"
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "kommentar"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "innehållsobjekt"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Postat av %(user)s %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "personens namn"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP-adress"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "godkänd av personal"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Fri kommentar"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Fria kommentarer"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "poäng"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "poängens datum"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Karmapoäng"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Karmapoäng"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "Betyget %(score)d av %(user)s"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Den här kommentaren flaggades av %(user)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "flaggdatum"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Användarflagga"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Användarflaggor"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "Flaggad av %r"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "borttagningsdatum"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Moderatorborttagning"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Moderatorborttagningar"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "Moderatorborttagning av %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Anonyma användare kan inte rösta"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Kommentaren har ett ogiltigt ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Du får inte rösta på dig själv"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "Det här betyget krävs eftersom du har fyllt i minst ett annat betyg."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Den här kommentaren postades av en användare som har postat färre än %(count)"
+"s kommentar:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"Den här kommentaren postades av en användare som har postat färre än %(count)"
+"s kommentarer:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"Den här kommentaren postades av en oseriös användare:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Endast POSTningar är tillåtna"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Ett eller fler av fälten som krävs fylldes inte i"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "Någon fifflade med kommenteringsformuläret (säkerhetsbrott)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Kommenteringsformuläret har en ogiltig 'target'-parameter -- objektets ID är "
+"ogiltigt"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Kommenteringsformuläret skickade varken 'förhandsgranska' eller 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Användarnamn:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Lösenord:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Ändra mitt lösenord"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Logga ut"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "betyg #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Kommentar"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Fri kommentar"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "användarnamn"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>Av %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Alla"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Alla datum"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Idag"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Senaste 7 dagarna"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Den här månaden"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Det här året"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Ja"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Nej"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "Okänt"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "tid för händelse"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "objektets id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "objektets beskrivning"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "händelseflagga"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "ändra meddelande"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "loggpost"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "loggposter"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Alla datum"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Logga in"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Du måste logga in igen, eftersom din session har tagit slut. Oroa dig inte: "
+"ditt bidrag har sparats."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Det ser ut som om din webbläsare inte är konfigurerad att acceptera kakor. "
+"Aktivera kakor, ladda om den här sidan, och försök igen."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Användarnamn kan inte innehålla tecknet '@'."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "Din e-postadress är inte ditt användarnamn. Försök med '%s' istället."
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Hemsideadministration"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)set \"%(obj)s\" lades till."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Du kan ändra det igen här under."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Du kan lägga till en till %s här under"
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Lägg till %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Lade till %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "och"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Ändrade %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Tog bort %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Inga fält ändrade."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)set \"%(obj)s\" ändrades."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)set \"%(obj)s\" lades till. Du kan ändra det igen här under."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Ändra %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Ett eller flera %(fieldname)s i %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Ett eller flera %(fieldname)s i %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)set \"%(obj)s\" togs bort."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Är du säker?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Ändra historien: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Välj %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Välj vilken %s du vill ändra"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Heltal"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "Boolesk (antingen Sann eller Falsk)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Sträng (upp till %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Komma-separerade heltal"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Datum (utan tid)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Datum (med tid)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-postadress:"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "Sökväg"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "decemaltal"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "Boolesk (antingen Sann, Falsk eller Inget)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Relation till förälder"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Telefonnummer"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Text"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Tid"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "Stat i USA (två stora bokstäver)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML-text"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Dokumentation"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Ändra lösenord"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Hem"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Historik"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Datum/tid"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Användare"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Händelse"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "D j F Y, H:i:s"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Det här objektet har ingen ändringshistorik. Det lades antagligen inte till "
+"i den här admin-sidan"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Djangos sidadministration"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Administration för Django"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Serverfel"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Serverfel (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Serverfel <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Ett fel har uppstått. Sidadministratören har meddelats via e-post och felet "
+"bör åtgärdas snart. Tack för ditt tålamod."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Sidan kunde inte hittas"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Vi är ledsna, men den efterfrågade sidan kunde inte hittas."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Lägg&nbsp;till"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Ändra"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "Du har inte rätt att ändra något."
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Senaste händelserna"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Mina händelser"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "Inga tillgängliga"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Lägg till %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "Har du <a href=\"/password_reset/\">glömt ditt lösenord</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Välkommen,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Ta bort"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Att ta bort %(object_name)s '%(object)s' skulle innebära att besläktade "
+"objekt togs bort, men ditt konto har inte rättigheter att ta bort följande "
+"objekttyper:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Är du säker på att du vill ta bort %(object_name)s \"%(object)s\"? Följande "
+"besläktade föremål kommer att tas bort:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Ja, jag är säker"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " Efter %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Utför"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Visa på hemsidan"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Rätta till felet nedan."
+msgstr[1] "Rätta till felen nedan."
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "Sortering"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "Sortera:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Spara som ny"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Spara och lägg till ytterligare en"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Spara och fortsätt redigera"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Spara"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Ändra lösenord"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Lösenordet ändrades"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ditt lösenord har ändrats."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Nollställ lösenordet"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Har du glömt ditt lösenord? Fyll i din e-postadress nedan, så nollställer vi "
+"ditt lösenord och mailar det nya till dig."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-postadress:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Nollställ mitt lösenord"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Tack för att du spenderade kvalitetstid med webbsidan idag."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Logga in igen"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Nollställning av lösenordet lyckades"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Vi har skickat ett nytt lösenord till e-postadressen du fyllde i. Det bör "
+"anlända snarast."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Var god fyll i ditt gamla lösenord, för säkerhets skull, och skriv sedan in "
+"det nya lösenordet två gånger så vi kan kontrollera att du skrev det rätt."
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Gamla lösenordet:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Nytt lösenord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Bekräfta lösenord:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Ändra mitt lösenord"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Du får det här mailet eftersom du bad om att få lösenordet nollställt"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "för ditt användarkonto på %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ditt nya lösenord är: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr ""
+"Känn dig välkommen att ändra det här lösenordet genom att gå till den här "
+"sidan:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "Ditt användarnamn, om du har glömt:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Tack för att du använder vår sida!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s-laget"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Smarta bokmärken"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "Smarta bokmärken för dokumentation"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">För att installera smarta bokmärken, dra länken till din\n"
+"verktygsrad med bokmärken, eller högerklicka på länken och lägg till den\n"
+"till dina bokmärken. Nu kan du välja det smarta bokmärket från alla sidor\n"
+"på hemsidan. Notera att några av desa smarta bokmärken kräver att du tittar\n"
+"på sidan på en dator som är \"intern\" (prata med din systemadministratör\n"
+"om du inte är säker på om din dator är \"intern\")</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Dokumentation för den här sidan"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+"Förflyttar dig från valfri sida till dokumentationen för vyn som genererar "
+"den sidan."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Visa objektets id"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Visa innehållstypen och ID:t för sidor som representerar ett enskillt objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Redigera det här objektet (nuvarande fönster)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+"Hoppar till administrationssidan för sidor som representerar ett enskillt "
+"objekt."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Redigera det här objektet (nytt fönster)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Som ovan, men öppnaradministrationssidan i ett nytt fönster."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Datum:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Tid:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr ""
+
+#: contrib/admin/templates/widget/file.html:3
+#, fuzzy
+msgid "Change:"
+msgstr "Ändra"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "vidarebefodra från"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Det här bör vara en absolut sökväg, förutom domännamnet. Exempel: '/"
+"handelser/sok/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "vidarebefodra till"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Det här kan vara antingen en absolut sökväg (som ovan), eller en komplett "
+"adress som börjar med 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "vidarebefodra"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "vidarebefodringar"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Exempel: '/om/kontakt/'. Se till att ha inledande och avslutande snedsträck."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "titel"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "innehåll"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "aktivera kommentarer"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "mallnamn"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Exempel: 'flatpages/kontaktsida'. Om det här inte fylls i kommer systemet "
+"att använda 'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "registrering krävs"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Om det här bockas i kommer endast inloggade användare att kunna visa sidan"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "flatsida"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "flatsidor"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "namn"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "kodnamn"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Rättighet"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Rättigheter"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Grupp"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Grupper"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "användarnamn"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "förnamn"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "efternamn"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-postadress"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "lösenord"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "Använd '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "personalstatus"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Avgör om användaren kan logga in till den här administrationssidan."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "aktiv"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "superanvändare"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "senaste inloggning"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "registreringsdatum"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"Förutom de rättigheterna som utdelas manuellt så kommer användaren dessutom "
+"få samma rättigheter som de grupper där han/hon är medlem."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Rättigheter"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Användare"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Användare"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Personlig information"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Rättigheter"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Viktiga datum"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Grupper"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Meddelande"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "pythonmodulnamn"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "innehållstyp"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "innehållstyper"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "sessionsnyckel"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "sessionsdata"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "utgångsdatum"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sessioner"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "domännamn"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "visat namn"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "hemsida"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "hemsidor"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "Y-m-d"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "Y-m-d, H:i"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "H:i:s"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "måndag"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "tisdag"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "onsdag"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "torsdag"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "fredag"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "lördag"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "söndag"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "januari"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "februari"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "mars"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "april"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "maj"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "juni"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "juli"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "augusti"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "september"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "oktober"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "november"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "december"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "och"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "dag"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "jan"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "feb"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "aug"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "sept"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "okt"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "nov"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "dec"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "Ã¥r"
+msgstr[1] "Ã¥r"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "månad"
+msgstr[1] "månader"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "dag"
+msgstr[1] "dagar"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "timme"
+msgstr[1] "timmar"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "minut"
+msgstr[1] "minuter"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Bengaliska"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Tjeckiska"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Walesiska"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Danska"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Tyska"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Engelska"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Spanska"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Franska"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "Galisiska"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Isländska"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Italienska"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr ""
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Norska"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Brasilianska"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Rumänska"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Ryska"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Slovakiska"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Slovakiska"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Serbiska"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Svenska"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Brasilianska"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Förenklad kinesiska"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr ""
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "Det här värdet får bara innehålla bokstäver, tal och understräck."
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Det här värdet får bara innehålla bokstäver, tal, understräck och snedsträck"
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Stora bokstäver är inte tillåtna här."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Små bokstäver är inte tillåtna här."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Fyll enbart i siffror avskillda med kommatecken."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Fyll i giltiga e-postadresser avskillda med kommatecken."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Var god fyll i ett giltigt IP-nummer."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Tomma värden är inte tillåtna här."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "Icke-numeriska tecken är inte tillåtna här."
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "Det här värdet kan inte enbart bestå av siffror."
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Fyll i ett heltal."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Endast alfabetiska bokstäver är tillåtna här."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Fyll i ett giltigt datum i formatet Ã…Ã…Ã…Ã…-MM-DD."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Fyll i en giltig tid i formatet TT:MM"
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "Fyll i en giltig tidpunkt i formatet Ã…Ã…Ã…Ã…-MM-DD TT:MM"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Fyll i en giltig e-postadress."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Ladda upp en giltig bild. Filen du laddade upp var antingen inte en bild, "
+"eller så var det en korrupt bild."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "Adressen %s pekar inte till en giltig bild."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Telefonnummer måste vara i det amerikanska formatet XXX-XXX-XXXX. \"%s\" är "
+"ogiltigt."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "Adressen %s pekar inte till en giltig QuickTime-video."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "En giltig adress krävs."
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"Giltig HTML krävs. Specifika fel är:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Missformad XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Felaktig URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL:en %s är en trasig länk."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "Fyll i en giltig förkortning för en amerikansk delstat"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "Håll i tungan! Ordet %s är inte tillåtet här."
+msgstr[1] "Håll i tungan! Orden %s är inte tillåtna här."
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "Det här fältet måste matcha fältet '%s'."
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "Fyll i något i minst ett fält."
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "Fyll antingen i båda fälten, eller lämna båda tomma"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "Det är fältet måste anges om %(field)s är %(value)s"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "Det här fältet måste anges om %(field)s inte är %(value)s"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "Upprepade värden är inte tillåtna."
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "Det här värdet måste vara en multipel av %s."
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "Fyll i ett giltigt decimaltal."
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "Fyll i ett giltigt decimaltal med mindre än %s siffra totalt."
+msgstr[1] "Fyll i ett giltigt decimaltal med mindre än %s siffror totalt."
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "Fyll i ett giltigt decimaltal med som mest %s decimalsiffra."
+msgstr[1] "Fyll i ett giltigt decimaltal med som mest %s decimalsiffror."
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "Se till att filen du laddade upp är minst %s bytes stor."
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "Se till att filen du laddade upp är max %s bytes stor."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "Formatet på det här fältet är fel."
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "Det här fältet är ogiltigt."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "Kunde inte hämta något från %s."
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+"Adressen %(url)s returnerade det ogiltiga innehållstyphuvudet (Content-Type "
+"header) '%(contenttype)s'"
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"Var god avsluta den oavslutade taggen %(tag)s på rad %(line)s. (Raden börjar "
+"med \"%(start)s\".)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En del text från rad %(line)s är inte tillåtet i det sammanhanget. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"%(attr)s\" på rad %(line)s är inte ett gilltigt attribut. (Raden startar "
+"med \"%(start)s\".)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"\"<%(tag)s>\" på rad %(line)s är inte en giltig tagg. (Raden börjar med \"%"
+"(start)s\".)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"En tagg på rad %(line)s saknar en eller flera nödvändiga attribut. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"Attributet \"%(attr)s\" på rad %(line)s har ett ogiltigt värde. (Raden "
+"börjar med \"%(start)s\".)"
+
+#: db/models/manipulators.py:302
+#, fuzzy, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(optname)s med det här %(fieldname)s finns redan."
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s med det här %(fieldname)s finns redan."
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Det här fältet är obligatoriskt."
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "Det här värdet måste vara en multipel av %s."
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "Det här värdet måste vara en multipel av %s."
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Det här fältet är ogiltigt."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "Fyll i ett giltigt filnamn."
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "Var god fyll i ett giltigt %s."
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr " Separera flera ID:n med kommatecken."
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+" Håll ner \"Control\", eller \"Command\" på en Mac, för att välja mer än en."
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "Var god och fyll giltiga %(self)s ID. Värdet %(value)r är ogiltigt."
+msgstr[1] ""
+"Var god och fyll giltiga %(self)s ID. Värdena %(value)r är ogiltigt."
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Se till att din text är kortare än %s tecken."
+msgstr[1] "Se till att din text är kortare än %s tecken."
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Radbrytningar är inte tillåtna här."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Välj ett giltigt alternativ. '%(data)s' finns inte bland %(choices)s"
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Den insända filen är tom."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Fyll i ett heltal mellan -32 768 och 32 767."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Fyll i ett positivt heltal."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Fyll i ett heltal mellan 0 och 32 767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ja,nej,kanske"
+
+#~ msgid "Comment"
+#~ msgstr "Kommentar"
+
+#~ msgid "Comments"
+#~ msgstr "Kommentarer"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Sträng (upp till 50)"
+
+#~ msgid "label"
+#~ msgstr "etikett"
+
+#~ msgid "package"
+#~ msgstr "paket"
+
+#~ msgid "packages"
+#~ msgstr "paket"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "innehåll"

Added: vendor/django/current/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/sv/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/sv/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/sv/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/sv/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,112 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: Django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2005-12-09 11:51+0100\n"
+"PO-Revision-Date: 2005-12-04 14:12+0100\n"
+"Last-Translator: Robin Sonefors <ozamosi at blinkenlights.se>\n"
+"Language-Team: Django Translators <Django-I18N at googlegroups.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=n != 1\n"
+"X-Poedit-Language: Swedish\n"
+"X-Poedit-Country: SWEDEN\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+#, perl-format
+msgid "Available %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+#, fuzzy
+msgid "Choose all"
+msgstr "Välj en tidpunkt"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+#, perl-format
+msgid "Chosen %s"
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr ""
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:26
+#: contrib/admin/media/js/calendar.js:24
+msgid ""
+"January February March April May June July August September October November "
+"December"
+msgstr ""
+
+#: contrib/admin/media/js/dateparse.js:27
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr ""
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr ""
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "Nu"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "Klocka"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "Välj en tidpunkt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "Midnatt"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "06.00"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "Mitt på dagen"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "Ã…ngra"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "Idag"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "Kalender"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "Igår"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "Imorgon"

Added: vendor/django/current/django/conf/locale/ta/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/ta/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/ta/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/ta/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/ta/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2111 @@
+# translation of django.po to 
+# translation of django_aa.po to
+# translation of django_aa.po to tamil
+# Parthan <parthan at au-kbc.org>, 2006.
+# R Hariram Aatreya <rha at localhost.localdomain>, 2006.
+msgid ""
+msgstr ""
+"Project-Id-Version: django\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:14+0200\n"
+"PO-Revision-Date: 2006-07-18 16:47+0530\n"
+"Last-Translator: R Hariram Aatreya <rha at localhost.localdomain>\n"
+"Language-Team:  <en at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.9\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "அடையாளம்"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "தலையங்கம்"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "குறிப்பு"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "#1 தரவரிசை"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "#2 தரவரிசை"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "#3 தரவரிசை"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "#4 தரவரிசை"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "#5 தரவரிசை"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "#6 தரவரிசை"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "#7 தரவரிசை"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "#8 தரவரிசை"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "அங்கீகரிக்கப்பட்ட தரவரிசை"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "தேதிநேரம் சமர்ப்பிக்கப்பட்டுள்ளது"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "பொதுவானது"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "ip விலாசம்"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "நீக்கபட்டது"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr "குறிப்பு செரியாக இல்லையென்றால் இந்த் பெட்டியில் குறியிடவும். இதற்கு பதிலாக \"இந்த குறிப்பு நீக்கபட்டது\" காண்பிக்கபடும்."
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "குறிப்பு"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "பொருள் அடக்க object"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"%(user)s ஆல் %(date)s இல் அளிக்கப்பட்டது \n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "நபரின் பெயர்"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip விலாசம்"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "பணியாளர்களால் அனுமதிக்கப்பட்டது"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "சுதந்தரமான குறிப்பு"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "சுதந்தரமான குறிப்பு"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "மதிப்பீடு"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "மதிப்பீடு தேதி"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "கர்மா மதிப்பீடு"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "கர்மா மதிப்பீடு"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "%(user)s ஈட்டய %(score)d "
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"இந்த குறிப்பு %(user)s ஆல் குறிக்கபட்டது:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "குறியின் தேதி"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "பயனாளர் குறி"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "பயனாளர் குறிகள்"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "%r ஆல் குறிக்கப்பட்டது"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "நீக்கப்பட்ட தேதி"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "மட்டொறுத்தால் நீக்கப்பட்டது"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "மட்டொறுத்தால் நீக்கப்பட்டது"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "மட்டொறுத்தால் நீக்கப்பட்டது %r"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "அடயாள்ம் இல்லாத பயனாளறால் வாக்களிக்க முடியாது"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "செல்லாத குறிப்பு ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "உங்களை நீங்களே தேர்வு செய்து கொள்ள முடியாது"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "மற்றொரு தரவரிசை அளிக்க்பட்டதால் இந்த தரவரிசை தேவைப்படுகிறது."
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"%(count)s குறைவாக அளித்த பயனாளரால் இந்த குரிப்பை அள்த்தபடது:\n"
+"\n"
+"%(text)s"
+"%(count)s குறைவாக அளித்த பயனாளரால் இந்த குரிப்பை அள்த்தபடது:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"முழுமையான விவரஙகளை அளிக்காத பயனாளறால் கொடுக்கப்பட்டது:\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "POSTகளுக்கு மட்டும் அனுமதி உண்டு"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "ஒன்று அல்லது ஒன்றிற்கு மேற்ப்பட்ட புலங்கள் சமற்பிக்கப்படவில்லை"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "எவறோ குரிப்புறையை செதப்படுத்திவிட்டாற்கள் (பாதுகாப்பு மீறல்)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "குறிப்புறை படிவத்தில் முறையான இலக்கு அளவுருக்க இல்லை -- object ID முறையானதாக இல்லை"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "குறிப்பு படிவம் முன்னோட்டம் அல்லது பிற்பட்டதை வழங்கவில்லை."
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "பயணர் பெயர்:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "கடவுச்சொல்:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "கடவுச்சொல்லை மறந்துவிட்டீரா?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "வெளியேறு"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "விகிதம்"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "தேவைப்படுகிறது "
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "விருப்பத்தேர்வு"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "புகைப்படத்தை அணுப்பு"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "விவரம்:"
+
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# translation of django_ab.po to
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# R Hariram Aatreya <rha at localhost.localdomain>, 2006.
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "குறிப்பை முன்னேற்றமிடு"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "உங்கள்பெயர்:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3> %s ஆல்:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "அணைத்தும்"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "எந்த தேதியும்"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "இண்று"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "கடந்த 7 நாட்களில்"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "இந்த மாதம்"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "இந்த வருடம்"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "ஆம்"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "இல்லை"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "தெரியாத"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "செயல் நேரம்"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "பொருள் அடையாளம்"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "பொருள் உருவகித்தம்"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "செயர்குறி"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "செய்தியை மாற்று"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "புகுபதிவு உள்ளீடு"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "புகுபதிவு உள்ளீடு"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "அனைத்து தேதியும்"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "தயவுசெய்து சரியான பயனர்பபெயர் மற்றும் கடவுச்சொல்லை உள்ள்ளிடவும். இரண்டும் எழுத்துவகையை சார்ந்தது."
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "உள்ளே போ"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "தயவுசெய்து மறுபடியும் புகுபதிவு செய். ஏனென்றாள் காலம் முடிவடைந்தவு. கவலை படவேண்டாம்: உங்களுடைய அணுப்புதல் சேமிக்கப்பட்டுள்ளது. "
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr "உங்களுடைய உலாவி தற்கால நிரல்களை அணுமதிக்காதவாறு உள்ளமைக்கப் பட்டவாறு தெரிகிறது. தயவுசெய்து தற்காலிக நிரலை செயல்பட செய்து, பக்கத்தை மறுபடி உள்ள்வாங்கவும்."
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "பயனர் பெயர் '@' குறியீட்டை கொண்டிருக்க முடியாது."
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "உன்கள் மிண்அஞ்சள் முகவரிஉங்கள் பயனர் பெயர் இல்லை. '%s'  யை முயற்ச்சி செய்யவும். "
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "இணைய மேளான்மை"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக சேர்க்கப்பட்டது."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "நீங்கள் மறுபடியும் தொகுக்க முடியும். "
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "நீங்கள் மற்ற %s யை கீழே சேர்க்க முடியும்."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "%s யை சேர்"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s சேர்க்கப்பட்டுள்ளது."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "மற்றும்"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "%s மாற்றப்பட்டுள்ளது."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s அழிக்கப்பட்டது."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "எந்த புலமும் மாறவில்லை."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr " %(name)s \"%(obj)s\" வெற்றிகரமாக மாற்றப்பட்டது."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக சேர்க்கப்பட்டுள்ளது. நீங்கள் கீழே தொகுக்க முடியும்."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "%s யை மாற்று"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "%(name)s ல் உள்ள %(fieldname)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "%(name)s ல் உள்ள %(fieldname)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" வெற்றிகரமாக அழிக்கப்பட்டுள்ளது."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "உறுதியாக சொகிறீர்களா?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "வரலாற்றை மாற்று: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "%s யை தேர்ந்தெடு"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "%s யை மாற்ற தேர்ந்தெடு"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "முழு எண்"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "பூலியன் (சரி அல்லது தவறு)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "உரை (%(maxlength)s வரைக்கும்)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "கமாவாள் பிரிக்கப்பட்ட முழு எண்"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "தேதி (நேரமில்லாமல்)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "தேதி (நேரமுடன்)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "மின் அஞ்சல்"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "கோப்ப்பு பாதை"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "புள்ளி எண்கள்"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "இலக்கு முறை (சரி, தவறு அல்லது ஒன்றும் இல்லை)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "ஆதி மாதிரிக்கு தொடர்புடையது"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "தொலைபேசி எண்"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "உரை"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "நேரம்"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. மாநிலம் (இரண்டு மேல் எழுத்துவகை எழுத்து)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML உரை"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "ஆவணமாக்கம்"
+
+# translation of django_ac.po to
+# translation of django_ac.po to tamil
+# Ashwin <ashwin at au-kbc.org>, 2006.
+# R Hariram Aatreya <rha at localhost.localdomain>, 2006.
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "கடவுச்சொல்லை மாற்று "
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "வீடு"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "வரலாறு"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "தேதி/நேரம் "
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "பயனர்"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "செயல்"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "தேதியும் முழு நேரமும்"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"இந்த பொருள் மாற்ற வரலாற்றில் இல்லை"
+"ஒரு வேளை நிர்வாகத்தளத்தின் மூலம் சேர்க்கப்படாமலிருக்கலாம்"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "டிஜாங்ஙோ தள நிர்வாகி"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "டிஜாங்ஙோ நிர்வாகம் "
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "சேவகன் பிழை"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "சேவையகம் தவறு(500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "சேவையகம் பிழை<em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"தவறு ஏற்பட்டுள்ளது"
+"வலைத்தள நிர்வாகிக்கு மின்னஞ்சல் அனுப்பப்பட்டுள்ளது. விரைவில் சரி செய்யப்படும். உங்க்ளது பொறுமைக்கு நன்றி"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "பக்கத்தை காணவில்லை"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr ""
+"நீங்கள் விரும்பிய பக்கத்தை காண இயலவில்லை. "
+"அதற்காக வருந்துகிறோம்."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "செயலியில் கிடைக்கக் கூடிய  %(name)s  மாதிரிகள்"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "சேர்"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "மாற்று"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "உங்களுக்கு மாற்றுவதற்கு உரிமையில்லை"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "தற்போதைய செயல்கள்"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "எனது செயல்கள்"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "எதுவும் கிடைக்கவில்லை"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "%(name)s சேர்"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "நீங்கள் தங்களது கடவுச்சொல்லை  <a href=\"/password_reset/\"> மறந்து விட்டீர்களா?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "நல்வரவு,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "நீக்கு"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr "இந்த '%(object)s' இல் %(object_name)s நீக்குவது தொடர்புடைய மற்றவற்றையும் நீக்கும். ஆனால் அதற்கு உங்களுக்கு  உரிமையில்லை"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"நீங்கள் இந்த \"%(object)s\" %(object_name)s நீக்குவதில் நிச்சயமா?"
+"தொடர்புடைய மற்றவையும் நீக்கப்படும். "
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "ஆம் எனக்கு உறுதி "
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "%(title)s ஆல் "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "செல்"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "தள்த்தில் பார் "
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgstr "கீழே உள்ள தவறுகளைத்திருத்து"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "வரிசைப்படுத்துதல்"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "வரிசைப்படுத்து"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "புதியதாக சேமி"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "சேமித்து இன்னுமொன்றைச் சேர்"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "சேமித்து மாற்றத்தை தொடருக"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "சேமி"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "கடவுச்சொல் மாற்றம்"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "கடவுச்சொல் மாற்றம் வெற்றி "
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "உங்கள் கடவுச்சொல் மாற்றப் பட்டுள்ளது"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "கடவுச்சொல்லை மாற்றியமை"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"கடவுச்சொல்லை  மறந்து விட்டால்"
+"உங்களது மின்னஞ்சல்  முகவரியை உள்ளிடுக"
+"அதன் பிறகு உங்கள் கடவுச்சொல்  மாற்றியமைக்கப்பட்டு "
+"உங்களது மின்னஞ்சல்  முகவரிக்கு அனுப்பப்படும்"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "மின்அஞ்சல் முகவரி:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "எனது கடவுச்சொல்லை மாற்றியமை"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr ""
+"வலைத்தளத்தில் உங்களது பொன்னான நேரத்தை "
+"செலவழித்தமைக்கு மிகுந்த நன்றி"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "மீண்டும் உள்ளே பதிவு செய்யவும்"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "கடவுச்சொல் மாற்றியமைத்தல் வெற்றி"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"கடவுச்சொல்லை  மறந்து விட்டால்"
+"உங்களது மின்னஞ்சல்  முகவரியை உள்ளிடுக"
+"புதிய கடவுச்சொல்  "
+"உங்களது மின்னஞ்சல்  முகவரிக்கு அனுப்பப்பட்டுள்ளது. விரைவில் அது உங்களுக்கு கிடைக்கும்"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr "பாதுகாப்பு காரணங்களுக்காக , முதலில் உங்களது பழைய கடவுச்சொல்லை உள்ளிடுக. அதன் பிறகு புதிய கடவுச்சொல்லை இரு முறை உள்ளிடுக.  இது உங்களது உள்ளிடுதலை சரிபார்க்க உதவும். "
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "பழைய கடவுச்சொல் :"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "புதிய கடவுச்சொல்:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "கடவுச்சொல் மாற்றத்தை உறுதிப்படுத்து:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "கடவுச் சொல்லை மாற்றவும்"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "கடவுச்சொல்லை மாற்றியமைக்க நீங்கள் கேட்டதனால் உங்களுக்கு இந்த மின்னஞ்சல் அனுப்பப்பட்டுள்ளது"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "%(site_name)s -இல் உள்ள உங்களது பயனாளர் கணக்கு"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "உங்களது  புதிய  கடவுச்சொல் : %(new_password)s "
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "கடவுச்சொல்லை மாற்றியமைக்க நீங்கள் இந்த பக்கத்திற்கு தாராளமாக போகலாம்."
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "உங்களது பயனாளர் பெயர், (நீங்கள் மறந்திருந்தால் ): "
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "எங்களது வலைத்தளத்தை பயன் படுத்தியதற்கு மிகுந்த நன்றி"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "இந்த %(site_name)s -இன்  குழு "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "புத்தகக்குறிகள்"
+
+# translation of django_ad.po to
+# translation of django_ad.po to
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# aukbc-guest, 2006.
+# R Hariram Aatreya <rha at localhost.localdomain>, 2006.
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "ஆவணமாக்கக் குறியீடு"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\"> புத்தக குறியீடுகளை நிறுவ இந்த இணைப்பினை புத்தகக்குறியீட்டுப் \n"
+"பட்டைக்கு இழுக்கவும். அல்லது வலது கிிளிக செய்து புத்தகக்குறியீடுகளில் சேர்க்கவும். \n"
+" இனி தளத்தில் எந்தப் பக்கத்தில் இருந்தும் புத்தகக்குறியீட்டினை தேர்வுசெய்ய முடியும். \n"
+" நீங்கள் இந்த தளத்தை  \"internal\" என  குுறிக்கப்பட்ட கணிணியில் இருந்து மட்டுமே \n"
+" ஒருசில புத்தகக்குறிகளை செயல்படுத்தமுடியும்\n "
+" உங்களுக்கு, கணிணி  \"internal\" என உறுதி செய்ய கணிணிமேளாலரை அணுகவும்.</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "இந்த பக்கத்திற்கான ஆவணம்"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "எந்த ஒரு பக்கத்திலிருந்தும் ஆவணப்பக்கத்தை பார்வையிடுதல், அந்த பக்கத்தை உருவாக்குகிறது."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "object ID-ஐ காட்டு"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "ஒரே object-ஐ குறிக்கும் பக்கங்களின் பொருளடக்க வகை மற்றும் unique ID-ஐ   காட்டுகிறது."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "இதை திருத்துக (தற்போதைய சாளரம்)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "ஒரே object-ஐ குறிக்கும் பக்கங்களைக் காண மேலாளர் பக்கத்திற்கு செல்க."
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "இதை திருத்துக. (புதிய சாளரம்)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "மேளாலர் பக்கத்தை முன்பு கண்டதுபோல், ஆனால் புதிய சாளரத்தில் திறக்கிறது."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "தேதி:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "நேரம்:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "தற்போது:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "மாற்று:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "லிருந்து திசைமாற்று"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"இது ஒரு முழுமையான பாதையாக இருக்கவேண்டும். "
+"இணையத்தளப்பெயராக இருக்கக்கூடாது. உதாரணம்:'/"
+"events/search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "திரும்ப அனுப்பு"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "இது முழுமையான பாதையாக (மேலே உள்ளது போல) அல்லது  \"http\"//\" என தொடங்கும் வலை  முகவரியாக இருக்கலாம்."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "திரும்ப அனுப்பு"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "திரும்ப அனுப்புகிறது. "
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "உதாரணம்: '/about/contact/'. முன்னும் பின்னும் '/' உள்ளதை உறுதி செய்க. "
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "தலைப்பு"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "பொருளடக்கம்"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "விமர்சனங்களை செயலாக்கு"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "வார்ப்புரு பெயர்"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr "உதாரணம்  'flatpages/contact_page'. இது இல்லையெனில் 'flatpages/default' என்பதே பயன்படுத்தப்படும்.ப்படும்."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "முன்பதிவு தேவை"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "இது தெரிவு செய்யப்பட்டிருந்தால், உள்நுழைந்த பயனர்கள் மட்டுமே இந்தப் பக்கத்தை பார்க்க முடியும்."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "எளிய பக்கம்"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "எளிய பக்கங்கள்"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "பெயர்"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "குறிமுறை பெயர்"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "அனுமதி"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+msgid "permissions"
+msgstr "அனுமதிகள்"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "குழு"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+msgid "groups"
+msgstr "குழுக்கள்"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "பயனர் பெயர்"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "முதல் பெயர்"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "கடைசி பெயர்"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "மின்னஞ்சல் முகவரி"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "கடவுச்சொல்"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "பயன்படுத்து '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "பணியாளர் நிலை"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "பயனர், 'மேலாளலர்' பக்கத்தில் நுழை்ழைவதை முடிவு செய்கிறது "
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "செயல்படும்"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "மேலாளர் இருப்பு நிலை"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "கடைசி உள்நுழைவு"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "சேர்ந்த தேதி"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "பயனர் தனது அனுமதிகளோடு ,தான் உள்ள குழுவினது அனுமதிகளைையும் பெறுவார்."
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "பயனர் அனுமதிகள்"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "பயனர்"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "பயனர்கள்"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "தனிப்பட்ட விவரம்"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "அனுமதிகள்"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "முக்கியமான தேதிகள்"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "குழுக்கள்"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "செய்தி"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr " உங்கள் இணைய உலாவியில்  குக்கிகள்  செயலாக்கம் பெறவில்லை. உள்நுழைவதற்க்கு குக்கிகள் அவசியம்."
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "python model class name"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "பொருளடக்க வகை "
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "பொருளடக்க வகைகள்"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "அமர்வு குறியீ"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "அமர்வு தகவல்"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "காலாவதியாகும் தேதி"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "அமர்வு"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "அமர்வுகள்"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "களப் பெயர்"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "காட்டும்  பெயர்"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "வலைத்தளம்"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "வலைத்தளங்கள்"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "தேதி வடிவம்"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "தேதிநேர வடிவம்"
+
+# translation of django_ae.po to
+# translation of django_ae.po to
+# R Hariram Aatreya <rha at localhost.localdomain>, 2006.
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "நேரத்தின் அமைப்பும்"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "திங்கள்"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "செவ்வாய்"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "புதன்"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "வியாழன்"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "வெள்ளி"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "சனி"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "ஞாயிறு"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "ஜனவரி"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "பிப்ரவரி"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "மார்ச்"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "ஏப்ரல்"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "மே"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "ஜூன்"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "ஜூலை"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "ஆகஸ்டு"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "செப்டம்பர்"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "அக்டோபர்"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "நவம்பர்"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "டிசம்பர்"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "ஜன"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "பிப்"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "மார்"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "ஏப்"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "மே"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "ஜூன்"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "ஜூலை"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "ஆக"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "செப்"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "அக்"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "நவ"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "டிச"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "ஜன."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "பிப்."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "ஆக."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "செப்."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "அக்."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "நவ."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "டிச."
+
+#: utils/timesince.py:12
+msgid "year"
+msgstr "வருடம்"
+
+#: utils/timesince.py:13
+msgid "month"
+msgstr "மாதம்"
+
+#: utils/timesince.py:14
+msgid "week"
+msgstr "வாரம்"
+
+#: utils/timesince.py:15
+msgid "day"
+msgstr "நாள்"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgstr "மணி"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgstr "நிமிடம்"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "பெங்காலி"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "செக்"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "வெல்ஸ்"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "டேனிஷ்"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "ஜெர்மன்"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "கிரேக்கம்"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "ஆங்கிலம்"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "ஸ்பானிஷ்"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "ப்ரென்சு"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "கலீஷீயன்"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "ஹங்கேரியன்"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "ஹீப்ரு"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "ஐஸ்லான்டிக்"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "இத்தாலியன்"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "ஜப்பானிய"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "டச்சு"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "நார்வீசியன்"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "பிரேசிலியன்"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "ரோமானியன்"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "ரஷ்யன்"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "சுலோவாக்"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "ஸ்லோவேனியன்"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "செர்பியன்"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "சுவிடிஷ்"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "உக்ரேனியன்"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "எளிய சீன மொழி"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "மரபு சீன மொழி"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "இந்த மதிப்பு எழுத்துகள் எண்கள் அன்டர்ஸ்கோர் மற்றும் உள்ளடக்க வேண்டும்  "
+
+#: core/validators.py:64
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "இந்த மதிப்பு எழுத்துகள் எண்கள் அன்டர்ஸ்கோர் டஷ் அல்லது சலஷ் மற்றும் உள்ளடக்க வேண்டும்"
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "பெரிய எழுத்துகளுக்கு இங்கு அனுமதி இல்லை இல்லை."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "சிறிய ய எழுத்துகளுக்கு இங்கு அனுமதி இல்லை"
+
+# translation of django_af.po to
+# translation of django_af.po to
+# translation of django_af.po to
+# translation of django_af.po to
+# translation of django_af.po to
+# translation of django_af.po to
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# , 2006.
+# R Hariram Aatreya <rha at localhost.localdomain>, 2006.
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "காற்புள்ளிகளால் தனிமைப்படுத்திய இலக்கஙகள மட்டும் எழுதவும்"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "காற்புள்ளிகளால் தனிமைப்படுத்திய முறையான e முகவரிகள்் மட்டும் எழுதவும்"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "தயவு செய்து முறையான ஐ.பி முகவறி மட்டும் எழுதவும்"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "காலியான மதிப்புக்கள் அனுமதி இல்லை"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "எண் வடிவமில்லாத எழுத்துக்கள் அனுமதி இல்லை"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "இந்த மதிப்பு இலக்கங்கள் மட்டுமே கொண்டதாக இருக்க கூடாது"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "முழு எண் மட்டுமே எழுதவும்"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "அகர வரிசை எழுத்துக்கள் மட்டுமே அனுமதி உன்டு"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "வவவவ-மாமா-நாநா என்ற அமைப்பில் உள்ள முறையான தேதி மட்டுமே எழுதவும்"
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "மம-நிநி என்ற அமைப்பில் உள்ள முறையான நேரம் மட்டுமே எழுதவும்"
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "வவவவ-மாமா-நாநா மம-நிநி என்ற அமைப்பில் உள்ள முறையான தேதி/நேரம் மட்டுமே எழுதவும்"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "முறையான e முகவரிகள்் மட்டும் எழுதவும்"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "முறையான படம் மட்டுமே பதிவேற்றம் செய்யவும். நீங்கள் பதிவேற்றம் செய்த கோப்பு படம் அள்ளாத அள்ளது கெட்டுப்போன கோப்பாகும்"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "%s என்ற இணையதள முகவறி சறியான படத்தைச் சுட்டவில்லை"
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "தொலைபேசி எண்கள் XXX-XXX-XXXX என்ற அமைப்பில் இருக்க வேண்டும். \"%s\" என்பது முறையள்ள"
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "%s என்ற இணையதள முகவறி முறையான குயிக் டைம் படக்காட்சியைச் சுட்டவில்லை"
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "முறையான இணையதள முகவறி தேவை"
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"முறையான இணையதள முகவறி தேவை. குறிப்பிடத்தக்கத் தவறுகளாவன:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "முறைப்படுத்தப்படாத XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "முறைப்படுத்தப்படாத இணையதள முகவறி: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "%s என்ற இணையதள முகவறி உடைந்துள்ளது"
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "முறையான U.S மாநில பெயர் சுருக்கம் எழுதவும்ழுதவும்"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgstr "வார்த்தைகளை அளன்து பேசுங்கள். %s என்ற வார்த்தை இங்கு அனுமதி இல்லை"
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "இந்த புலம் %s என்ற புலத்துடன் ஒத்திறுக்க வேண்டும்"
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "தயவு செய்து ஒரு புலத்திலாவது ஏதாவது எழுதவும்"
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "தயவு செய்து இரு்புலங்கலையும்ும் நிரப்பவும்; அல்லது இரண்டையும் காலியாக விடவும்"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "%(field)s, %(value)s ஆக இருந்தால் இன்த புலம் இருக்க வேண்டும்"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "%(field)s, %(value)s ஆக இல்லை என்றால் இன்த புலம் இருக்க வேண்டும்"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "போலியான மதிப்புகள் அனுமதி இல்லை"
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "இந்த மதிப்பு %s இன் அடுக்காக இருக்க வேன்டும்"
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "தயவுசெய்து முறையான பதின்ம எண்ணை நழைக்கcவும்"
+
+#: core/validators.py:349
+#, python-format
+msgid ""
+"Please enter a valid decimal number with at most %s total digit."
+"Please enter a valid decimal number with at most %s total digits."
+msgstr ""
+"அதிகபட்சம் %s எண்ணை உள்ள பதின்ம எண்ணை நுழை."
+"அதிகபட்சம் %s எண்கள் உள்ள பதின்ம எண்ணை நுழை."
+
+#: core/validators.py:352
+#, python-format
+msgid ""
+"Please enter a valid decimal number with at most %s decimal place."
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr ""
+"அதிகபட்சம் %s புள்ளி இடம் ள் உள்ள பதின்ம எண்ை  நுழை"
+"அதிகபட்சம் %s புள்ளி இடங்கள் உள்ள பதின்ம எண்ை  நுழை"
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "மேல்ஏற்று செய்யப்பட்ட கோப்பு குறைந்தபட்சம்  %s  பைட்டுகள் உள்ளனவா என சரி பார்க்கவும்"
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "மேல்ஏற்று செய்யப்பட்ட கோப்பு அதிகபட்சம்  %s  பைட்டுகள் உள்ளனவா என சரி பார்க்கவும்."
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "புலனுடைய அமைப்பு தவறு"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "இந்த புலம் செல்லாது."
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "%s இருந்து எதுவும் எடுக்க முடியவில்லை"
+
+#: core/validators.py:429
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "வலைமனை %(url)s என்பது செல்லாத உள்ளடக்க-வகை தலைப்பான  '%(contenttype)s' ஐ திருப்பி தந்துள்ளது."
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr " %(line)s கோடு லிருந்து மூடாத %(tag)s டாகை மூடு. ( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள  சில உரைகள் இருப்பதற்கு அனுமதி இல்லை.( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள  \"%(attr)s\" என்பது தவறான பண்பாகும.( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள \"<%(tag)s>\" என்பது தவறான ஒட்டாகும் .( வரி,\"%(start)s\"வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள ஒட்டு இன பண்புகள்  தேவைப்படுகின்றன.(வரி,\"%(start)s\" வுடன் துவங்குகின்றது)"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr "வரி %(line)s இல் உள்ள \"%(attr)s\"  பண்பின் மதிப்பு தவறானது.(வரி \"%(start)s\" இருந்து ஆரம்பம்)"
+
+#: db/models/manipulators.py:302
+#, python-format
+#, fuzzy
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "%(type)s உடன் உள்ள %(object)s  உள்ளது"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(fieldname)s உடன் உள்ள %(optname)s உயிருடன உள்ளது"
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "இந்த  புலத்தில் மதிப்பு தேவை"
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "இந்த மதிப்பு முழுவெண்ணாக இருக்க வேண்டும"
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "இந்த மதிப்பு சரி அல்லது தவறாக இருக்க வேண்டும்"
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "இந்த புலம் காலியாக இருக்கக் கூடாது"
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "முறையான கோப்புப் பெயரை எழுதவும்"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "தயவு செய்து முறையான %s எழுதவும்"
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "பன்மையிலுள்ள அடையாளங்களை காற்புள்ளிகளால் பிரிக்கவும்"
+
+#: db/models/fields/related.py:581
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "Mac இல், ஒன்றுக்கு மேற்பட்டவற்றை தேர்வு செய்ய \"Control\" அல்லது \"Command\" ஐ அழுத்தவும்"
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid ""
+"Please enter valid %(self)s IDs. The value %(value)r is invalid."
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr ""
+"தயவு செய்து முறையான %(self)s அடையாளங்களை எழுதவும். %(value)r என்ற மதிப்பு முறையானதல்ல. "
+"தயவு செய்து முறையான %(self)s அடையாளங்களை எழுதவும். %(value)r என்ற மதிப்புகள் முறையானதல்ல. "
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgstr "உங்கள் உரை %s ஐ விட குறைவான எழுத்துக்களை உடையதென உறுதி செய்து கொள்ளுங்கள்"
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "வரி உடைவுகள் அனுமதி இல்லை"
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "முறையான விருப்பத்தை தேர்வு செய்யவும்; '%(data)s என்பது %(choices)s இல் இல்லை"
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "சமர்பிக்கப் பட்ட கோப்பு காலியாக உள்ளது"
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "-32,768 மற்றும் 32,767 கு நடுவில் ஒரு முழு எண்ணை எழுதவும்"
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "ஒரு நேர்க்குறி எண்ணை எழுதவும்"
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "0 மற்றும் 32,767 கு நடுவில் ஒரு முழு எண்ணை எழுதவும்"
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "ஆம், இல்லை, இருக்கலாம்"
+

Added: vendor/django/current/django/conf/locale/uk/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/uk/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/uk/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/uk/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/uk/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1970 @@
+# Django, ukrainian translation.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# Denis Kuzmichyov <kuzmichyov at gmail.com>, 2006.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2006-03-20 21:18+0300\n"
+"Last-Translator: Denis Kuzmichyov <kuzmichyov at gmail.com>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr ""
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr ""
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "коментар"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "рейтінг #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "рейтінг #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "рейтінг #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "рейтінг #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "рейтінг #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "рейтінг #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "рейтінг #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "рейтінг #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr ""
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "дата/час додання"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "публічний"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP адреса"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "видалений"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr ""
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "коментар"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr ""
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"Додав %(user)s %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "Ім'я людини"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip адреса"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "схвалено адміністрацією"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "Вільний коментар"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "Вільні коментарі"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "рахунок"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr ""
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "рахунок"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr ""
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr ""
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr ""
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "Ознака користувача"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "Ознаки користувача"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr ""
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "Дата видалення"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "Видалено модератором"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "Видалено модератором"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr ""
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "Анонімний користувач не може голосувати"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "Невірний ID коментарю"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "Не можна голосувати за себе"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr ""
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"Цей коментар доданий користувачем, який додав меньше ніж %(count)s коментаря"
+msgstr[1] ""
+"Цей коментар доданий користувачем, який додав меньше ніж %(count)s коментарів"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "Тільки POST'и дозволені"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "Одне або більше обов'язкових полів не було заповнено"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr ""
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr ""
+"Форма для коментарів мала невірний параметр 'target' -- ID об'єкту був "
+"невірний"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "Форма для коментарів не надавала ані 'переглянути', ні 'додати'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "Ім'я:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "Пароль:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "Змінити мій пароль"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "Вийти"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "рейтінг #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr ""
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "Коментар"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "Вільний коментар"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "Ім'я користувача"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "Всі"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "Будь-яка дата"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "Сьогодні"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "Останні 7 днів"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "Цього місяця"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "Цього року"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "Так"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "Ні"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr ""
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "час дії"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "id об'єкту"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr ""
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "прапор дії"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "змінити повідомлення"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr ""
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr ""
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "Всі дати"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr ""
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "Увійти"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr ""
+"Будь ласка, ввійдіть знову, ваша сесія скінчилася. Не хвилюйтеся: все що ви "
+"додавали збережено."
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"Здається ваш броузер не сконфігурований приймати cookies. Будьласка "
+"увімкнить cookies, перезавантажте цю старінку і спробуйте знову"
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "Ім'я не може містити '@' символ"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr ""
+"Ваша e-mail адреса не є вашим ім'ям користувача. Замість спробуйте '%s'"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "Адміністрування сайта"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" було додано успішно."
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "Ви можете редагувати це знову внизу."
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "Ви можете додати інший %s внизу."
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "Додати %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "Додано %s."
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "та"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "Змінено %s."
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "Видалено %s."
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "Поля не змінені."
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" був успішно змінений."
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr ""
+"%(name)s \"%(obj)s\"  був успішно доданий. Ви модете редагувати його знову "
+"внизу."
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "Змінити %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "Одне або більше %(fieldname)s у %(name)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "Одне або більше %(fieldname)s у %(name)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" був видалений успышно."
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "Ви упевнені?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "Історія змін: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "Вибрати %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "Виберіть %s щоб змінити"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "Ціле"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "Рядок (до %(maxlength)s символів)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "Цілі розділені комою"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "Дата (без часу)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "Дата (з часом)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "E-mail адреса"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr ""
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "Десяткове число"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "Відношення до батьківської моделі"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "Телефонний номер"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "Текст"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "Час"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr ""
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr ""
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "текст XML"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "Документація"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "Змінити пароль"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "Домівка"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "Історія"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "Дата/час"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "Користувач"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "Дія"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr ""
+"Цей об'єкт немає історії змін. Напевно він був доданий не через сайт "
+"адміністрування."
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django сайт адміністрування"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django адміністрування"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "Помилка сервера"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "Помилка сервера (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "Помилка сервера <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"Відбулася помилка. Її було повідомлено адміністраторам сайту e-mail'ом і "
+"вона повинна бути незабаром виправлена. Дякуємо за ваше терпіння."
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "Сторінка не знайдена"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "Ми шкодуємо, але сторінка яку ви запросили не знайдена."
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "Додати"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "Змінити"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "У вас немає дозволу редагувати будь-що"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "Недавні дії"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "Мої дії"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "Додати %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">Забули ваш пароль</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "Вітаємо,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "Видалити"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"Видалення %(object_name)s '%(object)s' призводить до видалення пов'язаних "
+"об'єктів, але ваш рахунок не має дозволу видаляти наступні типи об'єктів:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"Ви впевнені що хочете видалити %(object_name)s \"%(object)s\"? Всі наступні "
+"пов'язані записи будуть видалені:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "Так, я впевнений"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr "За %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "Уперед"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "Дивитися на сайті"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "Будь ласка, виправте помилку, що зазначена нижче"
+msgstr[1] "Будь ласка, виправте помилки, що зазначені нижче"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr ""
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr ""
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "Зберегти як нове"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "Зберегти і додати інше"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "Зберегти і продовжити редагування"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "Зберегти"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "Зміна пароля"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "Зміна паролю успішна"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "Ваш пароль було змінено."
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "Пароль перевстановлено"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"Забули свій пароль? Введить свою e-mail адресу і ми перевстановимо ваш "
+"пароль і надішлемо вам новий поштою."
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "E-mail адреса:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "Перевстановіть мій пароль"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "Дякуємо за проведений вами час із сайтом сьогодні."
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "Увійти знову"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "Пароль перевстановлено успішно"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr ""
+"Ми надіслали новий пароль поштою на адресу, яку ви вказали. Незабаром ви "
+"повинні його отримати."
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"Будь ласка введить ваш старий пароль, задля беспекі, та потім введить ваш "
+"новий пароль двічі, щоб ми могли перевірити що ви ввели його коректно"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "Старий пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "Новий пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "Підтвердіть пароль:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "Змінити мій пароль"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "Ви отримали цього листа, тому що запросили перевстановлення паролю"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "для вашого рахунку користувача на сайті %(site_name)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "Ваш новий пароль: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "Ви можете вільно змінити цей пароль, перейшовши до цієї сторінки:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "У разі, якщо ви забули, ваше им'я:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "Дякуємо за користування нашим сайтом."
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "команда %(site_name)s "
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "Документіця для цієї сторінки"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "Показати ID об'єкту"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr ""
+"Показує content-type та унікальний ID для сторінок, які являють собою єдиний "
+"об'єкт"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "Редагувати цей об'єкт (поточне вікно)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr ""
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "Редагувати цей об'єкт (нове вікно)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "Як і вище, але відкриває сторінку адміністрування у новому вікні."
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "Дата:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "Час:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "Зараз:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr ""
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr ""
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr ""
+"Це повинно бути абсолютний шлях, виключаючи ім'я домену. Приклад: '/events/"
+"search/'."
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr ""
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr ""
+"Це може бути або абсолютний шлях (як вище), або повний URL, який починається "
+"з 'http://'."
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr ""
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr ""
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr ""
+"Приклад: '/about/contact/'. Переконайтеся у наявності слешу на початку та у "
+"кінці."
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "заголовок"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "зміст"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "ввімкнути коментарі"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "ім'я шаблона"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"Приклад: 'flatpages/contact_page'. Якщо це не надано, система буда "
+"використовувати 'flatpages/default'."
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "потрібна регістрація"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr ""
+"Якщо тут відзначено, тільки користувачи, що увійшли будуть мати змогу "
+"переглядати цю сторінку."
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr ""
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "прості сторінки"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "ім'я"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr ""
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "Група"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "Ім'я користувача"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "ім'я"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "прізвище"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "e-mail адреса"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "пароль"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr ""
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "статус персоналу"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "Визначає, чи може користувач увійти до цього сайту адміністрування."
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "активний"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "статус суперкористувача"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "Останній вхід"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "дата приєднання"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr ""
+"На додаток до прав які призначені вручну, цей користувач також отримує усі "
+"права, які має група в якій він є."
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "Користувач"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "Користувачі"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "Персональна інформація"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "Дозвіл"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "Важливі дати"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "Групи"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "Повідомлення"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr ""
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr ""
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr ""
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr ""
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr ""
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr ""
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr ""
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "сесія"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "сесії"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "доменне ім'я"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr ""
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "сайт"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "сайти"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "N j, Y"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "N j, Y, P"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "P"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "Понеділок"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "Вівторок"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "Середа"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "Четвер"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "П'ятниця"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "Субота"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "Неділя"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "Січень"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "Лютий"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "Березень"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "Квітень"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "Травень"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "Червень"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "Липень"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "Серпень"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "Вересень"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "Жовтень"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "Листопад"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "Грудень"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "та"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "день"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "Січ."
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "Лют."
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "Сер."
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "Вер."
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "Жов."
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "Лис."
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "Груд."
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "рік"
+msgstr[1] "рокі(в)"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "місяць"
+msgstr[1] "місяці(в)"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "день"
+msgstr[1] "дні(в)"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "година"
+msgstr[1] "годин(и)"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "хвилина"
+msgstr[1] "хвилин(и)"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "Бенгалська"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "Чеська"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "Валлійська"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "Датська"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "Німецька"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "Англійська"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "Іспанська"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "Французька"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr ""
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "Ісландська"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "Італійська"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "Японська"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr ""
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "Норвезька"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "Бразильска"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "Румунська"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "Російська"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "Словацька"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "Словацька"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "Сербська"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "Шведська"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "Бразильска"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "Китайська спрощена"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "Китайська традиційна"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr ""
+"Це значення може містити тільки літери, числа та символи підкреслювання"
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr ""
+"Це значення може містити тільки літери, числа, символи підкреслювання та "
+"слеші."
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "Літери у верхньому регістрі тут неприпустимі."
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "Літери у нижньому регістрі тут неприпустимі."
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "Уведіть тільки цифри розділені комами."
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "Уведіть коректні e-mail адреси, розділені комами."
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "Будь ласка уведіть коректу IP адресу."
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "Порожні значенні тут не дозволені."
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr ""
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr ""
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "Уведіть ціле число."
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "Тільки алфавітні символи дозволені тут."
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "Уведіть коректну дату у форматі РРРР-ММ-ДД."
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "Уведіть коректий час у форматі ГГ:ХХ."
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr ""
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "Уведіть коректну e-mail адресу."
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr ""
+"Завантажте коректний малюнок. Файл який ви завантажили був або не малюнок, "
+"або малюнок, який є зіпсованим."
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s не вказує на коректний малюнок."
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr ""
+"Телефонні номери мають бути у форматі XXX-XXX-XXXX. \"%s\" не є коректним."
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s не вказує на коректне відео у форматі QuickTime."
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr ""
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "Погано сформований XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "Невірний URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s є пошкодженим посиланням."
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr ""
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr ""
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr ""
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr ""
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr ""
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr ""
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr ""
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr ""
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr ""
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] ""
+msgstr[1] ""
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr ""
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr ""
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr ""
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr ""
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr ""
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr ""
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr ""
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr ""
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "Це поле обов'язкове."
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr ""
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr ""
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "Це поле обов'язкове."
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr ""
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr ""
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr ""
+
+#: db/models/fields/related.py:581
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr ""
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "Переконайтеся, що ваш текст меньше, ніж %s символ"
+msgstr[1] "Переконайтеся, що ваш текст меньше, ніж %s символів"
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "Символи нового рядку не дозволені тут."
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "Зробить коректний вибір; '%(data)s' немає у %(choices)s."
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "Переданий файл порожній."
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "Уведіть ціле число між -32,768 та 32,768."
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "Уведіть позитивне число."
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "Уведіть ціле число між 0 та 32,767."
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "так,ні,можливо"
+
+#~ msgid "Comments"
+#~ msgstr "Коментарі"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "Рядок (до 50 символів)"
+
+#~ msgid "label"
+#~ msgstr "мітка"
+
+#~ msgid "package"
+#~ msgstr "пакунок"
+
+#~ msgid "packages"
+#~ msgstr "пакунки"

Added: vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1879 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: django v1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:10+0200\n"
+"PO-Revision-Date: 2006-05-17 13:47+0800\n"
+"Last-Translator: limodou <limodou at gmail.com>\n"
+"Language-Team: Simplified Chinese <limodou at gmail.com>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Poedit-Language: Chinese\n"
+"X-Poedit-Country: CHINA\n"
+"X-Poedit-SourceCharset: utf-8\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
+
+#: contrib/comments/models.py:67
+#: contrib/comments/models.py:166
+msgid "object ID"
+msgstr "对象ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "大字标题"
+
+#: contrib/comments/models.py:69
+#: contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "评论"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "等级 #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "等级 #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "等级 #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "等级 #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "等级 #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "等级 #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "等级 #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "等级 #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "是无效等级"
+
+#: contrib/comments/models.py:83
+#: contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "日期/时间已提交"
+
+#: contrib/comments/models.py:84
+#: contrib/comments/models.py:170
+msgid "is public"
+msgstr "公开"
+
+#: contrib/comments/models.py:85
+#: contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP地址"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "被删除"
+
+#: contrib/comments/models.py:86
+msgid "Check this box if the comment is inappropriate. A \"This comment has been removed\" message will be displayed instead."
+msgstr "如果评论不适合选中这个检查框。评论将被一条\"此评论已经被删除\"的消息所替换。"
+
+#: contrib/comments/models.py:91
+msgid "comments"
+msgstr "评论"
+
+#: contrib/comments/models.py:131
+#: contrib/comments/models.py:207
+msgid "Content object"
+msgstr "内容对象"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"由 %(user)s 在 %(date)s 张贴\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "人名"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "IP地址"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "由团队批准"
+
+#: contrib/comments/models.py:176
+msgid "free comment"
+msgstr "自由评论"
+
+#: contrib/comments/models.py:177
+msgid "free comments"
+msgstr "自由评论"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "得分"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "得分日期"
+
+#: contrib/comments/models.py:237
+msgid "karma score"
+msgstr "Karma得分"
+
+#: contrib/comments/models.py:238
+msgid "karma scores"
+msgstr "Karma得分"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "被 %(user)s 定级为 %(score)d"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此评论由 %(user)s 标记:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "标记日期"
+
+#: contrib/comments/models.py:268
+msgid "user flag"
+msgstr "用户标志"
+
+#: contrib/comments/models.py:269
+msgid "user flags"
+msgstr "用户标志"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "由 %r 标记"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "删除日期"
+
+#: contrib/comments/models.py:280
+msgid "moderator deletion"
+msgstr "删除仲裁"
+
+#: contrib/comments/models.py:281
+msgid "moderator deletions"
+msgstr "删除仲裁"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "被 %r 仲裁删除"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "匿名用户不能投票"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "无效评论ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "不能给自已投票"
+
+#: contrib/comments/views/comments.py:28
+msgid "This rating is required because you've entered at least one other rating."
+msgstr "要求此等级,因为你已经输入了至少一个等级。"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"此评论由一个发表过少于 %(count)s 条评论的用户张贴:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此评论由一个肤浅的用户张贴:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "只允许张贴"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "一个或多个必输字段没有被提交"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "有人篡改了评论表格(安全侵害)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid "The comment form had an invalid 'target' parameter -- the object ID was invalid"
+msgstr "评论表格有一个无效的 'target' 参数 -- 对象 ID 无效"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "评论表格无法提供 '预览' 或 '张贴' 功能"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "用户名:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "口令:"
+
+#: contrib/comments/templates/comments/form.html:6
+msgid "Forgotten your password?"
+msgstr "忘记你的口令?"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "注销"
+
+#: contrib/comments/templates/comments/form.html:12
+msgid "Ratings"
+msgstr "等级"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "必须的"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "可选的"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "上传一张照片"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+msgid "Comment:"
+msgstr "评论:"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+msgid "Preview comment"
+msgstr "预览评论"
+
+#: contrib/comments/templates/comments/freeform.html:4
+msgid "Your name:"
+msgstr "你的名字:"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>ç”± %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70
+#: contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "全部"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "任意日期"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "今天"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "前7天"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "本月"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "今年"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "是"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "否"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "未知"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "动作时间"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "对象id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "对象表示"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "动作标志"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "修改消息"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "日志记录"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "日志记录"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "全有日期"
+
+#: contrib/admin/views/decorators.py:9
+#: contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid "Please enter a correct username and password. Note that both fields are case-sensitive."
+msgstr "请输入正确的用户名和口令。请注意两个域都是大小写敏感的。"
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "登录"
+
+#: contrib/admin/views/decorators.py:61
+msgid "Please log in again, because your session has expired. Don't worry: Your submission has been saved."
+msgstr "请重新登录,因为你的会话已经过期。不用担心:你的提交已经被保存。"
+
+#: contrib/admin/views/decorators.py:68
+msgid "Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again."
+msgstr "看上去你的浏览器没有配置成接受 cookie 。请允许 cookie,重新装入本页面,再试一次。"
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "用户名不能包含 '@' 字符。"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "你的邮箱地址不是你的用户名。换 '%s' 试试。"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "站点管理员"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 添加成功。"
+
+#: contrib/admin/views/main.py:264
+#: contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "你可以在下面再次编辑它。"
+
+#: contrib/admin/views/main.py:272
+#: contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "你可以在下面增加另一个 %s 。"
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "增加 %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s 已增加。"
+
+#: contrib/admin/views/main.py:336
+#: contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "和"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "已修改 %s 。"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s 已删除。"
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "没有字段被修改。"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 修改成功。"
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 添加成功。你可以在下面再次编辑它。"
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "修改 %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "一个或多个 %(fieldname)s 在 %(name)s 中: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "一个或多个 %(fieldname)s 在 %(name)s 中:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 删除成功。"
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "你确信吗?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "修改历史: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "选择 %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "选择 %s 来修改"
+
+#: contrib/admin/views/doc.py:277
+#: contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288
+#: contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295
+#: contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "æ•´æ•°"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "布尔(True或False)"
+
+#: contrib/admin/views/doc.py:279
+#: contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "字符串(最长 %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "逗号分隔的整数"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "日期(无时间)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "日期(带时间)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "邮箱地址"
+
+#: contrib/admin/views/doc.py:284
+#: contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "文件路径"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "小数"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "布尔(True, False或None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "与父模型的关系"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "电话号码"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "文本"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "时间"
+
+#: contrib/admin/views/doc.py:300
+#: contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "美国州名(两个大写字母)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML文本"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "文档"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "修改口令"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "首页"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "历史"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "日期/时间"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "用户"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "动作"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "N j, Y, P"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid "This object doesn't have a change history. It probably wasn't added via this admin site."
+msgstr "此对象没有修改历史。可能不能通过这个管理站点来增加。"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django管理站点"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django管理员"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "服务器错误"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "服务器错误(500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "服务器错误 <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience."
+msgstr "存在一个错误。它已经通过电子邮件被报告给站点管理员了,并且应该很快被改正。谢谢你的关心。"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "页面没有找到"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "很报歉,请求页面无法找到。"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr "在 %(name)s 应用中模块有效。"
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "增加"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "修改"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "你无权修改任何东西。"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "最近动作"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "我的动作"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "无可用的"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "增加 %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "<a href=\"/password_reset/\">忘记你的密码</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "欢迎,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "删除"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid "Deleting the %(object_name)s '%(object)s' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:"
+msgstr "删除 %(object_name)s  '%(object)s' 会导致删除相关的对象,但你的帐号无权删除下列类型的对象:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid "Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of the following related items will be deleted:"
+msgstr "你确信相要删除 %(object_name)s \"%(object)s\"?所有相关的项目都将被删除:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "是的,我确定"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " ç”± %(title)s"
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "去"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "在站点上查看"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "请改正下面的错误。"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "排序中"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "排序:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "保存为新的"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "保存并增加另一个"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "保存并继续编辑"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "保存"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "口令修改"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "口令修改成功"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "你的口令已经被修改。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "口令重设"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you."
+msgstr "忘记你的口令?在下面输入你的邮箱地址,我们将重设你的口令并且将新的口令通过邮件发送给你。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "邮箱地址:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "重设我的口令"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感谢今天在本网站花费了您的一些宝贵时间。"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "重新登录"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "口令重设成功"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly."
+msgstr "我们已经按你所提交的邮箱地址发送了一个新的口令给你。你应该很会收到这封邮件。"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly."
+msgstr "请输入你的旧口令,为了安全起见,接着要输入你的新口令两遍,这样我们可以校验你输入的是否正确。"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "旧口令:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "新口令:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "确认口令:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "修改我的口令"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "你所收到的这封邮件是由于你请求了口令重设"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "在 %(site_name)s 你的用户帐号"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "你的新口令是: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "到这个页面可以自由地修改口令:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "你的用户名,一旦你忘记了:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "感谢使用我们的站点!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 小组"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "书签"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "文档书签"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">为安装书签,拖动链接到你的工具条,\n"
+"或右击鼠标,然后增加到你的书签上。现在你可以从这个站\n"
+"点的任何页面选择书签。注意一些这样的书签要求你从一个\n"
+"被指定为\"内部\"的计算机上来进行查看(如果你不确定是\n"
+"否你的计算机是否是\"内部\"的,同你的系统管理员沟通一\n"
+"下。</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "本页面的文档"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid "Jumps you from any page to the documentation for the view that generates that page."
+msgstr "对于任何页面跳转到生成这个页面的view所在的文件。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "显示对象ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid "Shows the content-type and unique ID for pages that represent a single object."
+msgstr "用于那些表现单个对象的页面显示 content-type 和唯一ID。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "编辑本对象(当前窗口)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "用于那些表现单个对象的页面跳转到管理页面。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "编辑本对象(新窗口)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "同上,但在新窗口中打开管理页面。"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "日期:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "时间:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "当前:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "改动:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "重定向自"
+
+#: contrib/redirects/models.py:8
+msgid "This should be an absolute path, excluding the domain name. Example: '/events/search/'."
+msgstr "应该是一个绝对路径,不包括域名。例如:'/events/search/'。"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "重定向到"
+
+#: contrib/redirects/models.py:10
+msgid "This can be either an absolute path (as above) or a full URL starting with 'http://'."
+msgstr "可以是绝对路径(同上)或以'http://'开始的全URL。"
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "重定向"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "重定向"
+
+#: contrib/flatpages/models.py:8
+msgid "Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "例如:'/about/contact/'。请确保前导和结尾的除号。"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "标题"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "内容"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "允许评论"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "模板名称"
+
+#: contrib/flatpages/models.py:13
+msgid "Example: 'flatpages/contact_page'. If this isn't provided, the system will use 'flatpages/default'."
+msgstr "例如:'flatfiles/contact_page'。如果未提供,系统将使用'flatfiles/default'。"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "请先注册"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "如果被选中,仅登录用户才可以查看此页。"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "简单页面"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "简单页面"
+
+#: contrib/auth/models.py:13
+#: contrib/auth/models.py:26
+msgid "name"
+msgstr "名称"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "代码名称"
+
+#: contrib/auth/models.py:17
+msgid "permission"
+msgstr "权限"
+
+#: contrib/auth/models.py:18
+#: contrib/auth/models.py:27
+msgid "permissions"
+msgstr "权限"
+
+#: contrib/auth/models.py:29
+msgid "group"
+msgstr "组"
+
+#: contrib/auth/models.py:30
+#: contrib/auth/models.py:65
+msgid "groups"
+msgstr "组"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "用户名"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "名字"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "姓"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "邮件地址"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "口令"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "使用 '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "人员状态"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "指定是否用户可以登录到这个管理站点。"
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "活动"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "超级用户状态"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "上次登录"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "加入日期"
+
+#: contrib/auth/models.py:66
+msgid "In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."
+msgstr "除了手动设置权限以外,用户也会从他(她)所在的小组获得所赋组小组的所有权限。"
+
+#: contrib/auth/models.py:67
+msgid "user permissions"
+msgstr "用户权限"
+
+#: contrib/auth/models.py:70
+msgid "user"
+msgstr "用户"
+
+#: contrib/auth/models.py:71
+msgid "users"
+msgstr "用户"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "个人信息"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "许可"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "重要日期"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "组"
+
+#: contrib/auth/models.py:219
+msgid "message"
+msgstr "消息"
+
+#: contrib/auth/forms.py:30
+msgid "Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in."
+msgstr "你的Web浏览器好象不允许使用cookie。登录需要使用cookie。"
+
+#: contrib/contenttypes/models.py:25
+msgid "python model class name"
+msgstr "python模块类名"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "内容类型"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "内容类型"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "session键字"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "session数据"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "过期日期"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "会话(session)"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "会话(session)"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "域名"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "显示名"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "站点"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "站点"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "星期一"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "星期二"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "星期三"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "星期四"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "星期五"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "星期六"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "星期日"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "一月"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "二月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "March"
+msgstr "三月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "April"
+msgstr "四月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "May"
+msgstr "五月"
+
+#: utils/dates.py:14
+#: utils/dates.py:27
+msgid "June"
+msgstr "六月"
+
+#: utils/dates.py:15
+#: utils/dates.py:27
+msgid "July"
+msgstr "七月"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "八月"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "九月"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "十月"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "十一月"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "十二月"
+
+#: utils/dates.py:19
+msgid "jan"
+msgstr "一月"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr "二月"
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr "三月"
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr "四月"
+
+#: utils/dates.py:19
+msgid "may"
+msgstr "三月"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr "六月"
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr "七月"
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr "八月"
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr "九月"
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr "十月"
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr "十一月"
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr "十二月"
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "一月"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "二月"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "八月"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "九月"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "十月"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "十一月"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "十二月"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "å¹´"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "月"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] "周"
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "天"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "小时"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分钟"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "孟加拉语"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "捷克语"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "威尔士语"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "丹麦语"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "德语"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr "希腊语"
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "英语"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "西班牙语"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "法语"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "加利西亚语"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr "匈牙利语"
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr "希伯来语"
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "冰岛语"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "意大利语"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "日语"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "荷兰语"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "挪威语"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "巴西语"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "罗马尼亚语"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "俄语"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "斯洛伐克语"
+
+#: conf/global_settings.py:58
+msgid "Slovenian"
+msgstr "斯洛文尼亚语"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "塞尔维亚语"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "瑞典语"
+
+#: conf/global_settings.py:61
+msgid "Ukrainian"
+msgstr "乌克兰语"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "简体中文"
+
+#: conf/global_settings.py:63
+msgid "Traditional Chinese"
+msgstr "繁体中文"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "此值只能包含字母、数字和下划线。"
+
+#: core/validators.py:64
+msgid "This value must contain only letters, numbers, underscores, dashes or slashes."
+msgstr "此值只能包含字母、数字、下划线、反斜线和斜线。"
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "这里不允许大写字母。"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "这里不允许小写字母。"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "只能输入用逗号分隔的数字。"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "输入用逗号分隔的有效邮件地址。"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "请输入一个有效的IP地址。"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "这里不允许输入空值。"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "这里不允许非数字字符。"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "此值不能全部由数字组成。"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "输入整数。"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "这里只允许字母。"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "输入一个 YYYY-MM-DD 格式的有效日期。"
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "输入一个 HH:MM 格式的有效时间。"
+
+#: core/validators.py:132
+#: db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "输入一个 YYYY-MM-DD HH:MM 格式的有效日期/时间。"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "输入一个有效的邮件地址。"
+
+#: core/validators.py:148
+msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image."
+msgstr "上传一个有效的图片。您所上传的文件或者不是图片或是一个破坏的图片。"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s 指向的不是一个有效的图片。"
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "电话号码必须为 XXX-XXX-XXXX 格式。\"%s\"是无效的。"
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s 指向的不是一个有效的 QuickTime 视频。"
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "需要是一个有效的URL。"
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"需要有效的HTML。详细的错误是:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "格式错误的 XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "无效 URL: %s"
+
+#: core/validators.py:206
+#: core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s 是一个断开的链接。"
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "输入一个有效的 U.S. 州缩写。"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "看住你的嘴!%s 不允许在这里出现。"
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "这个字段必须与 '%s' 字段相匹配。"
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "请至少在一个字段上输入些什么。"
+
+#: core/validators.py:264
+#: core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "请要么两个字段都输入或者两个字段都空着。"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "如果 %(field)s 是 %(value)s 时这个字段必须给出"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "如果 %(field)s 不是 %(value)s 时这个字段必须给出"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "重复值不允许。"
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "这个值必须是 %s 的乘方。"
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "请输入一个有效的小数。"
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural "Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "请输入一个有效的小数,最多 %s 个数字。 "
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural "Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "请输入一个有效的小数,最多 %s 个小数位。 "
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "请确保你上传的文件至少 %s 字节大。"
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "请确保你上传的文件至多 %s 字节大。"
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "这个字段的格式不正确。"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "这个字段无效。"
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "不能从 %s 得到任何东西。"
+
+#: core/validators.py:429
+#, python-format
+msgid "The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s 返回了无效的 Content-Type 头 '%(contenttype)s'。"
+
+#: core/validators.py:462
+#, python-format
+msgid "Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with \"%(start)s\".)"
+msgstr "请关闭未关闭的 %(tag)s 标签从第 %(line)s 行。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:466
+#, python-format
+msgid "Some text starting on line %(line)s is not allowed in that context. (Line starts with \"%(start)s\".)"
+msgstr "在 %(line)s 行开始的一些文本不允许在那个上下文中。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:471
+#, python-format
+msgid "\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%(start)s\".)"
+msgstr "在 %(line)s 行的\"%(attr)s\"不是一个有效的属性。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:476
+#, python-format
+msgid "\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%(start)s\".)"
+msgstr "在 %(line)s 行的\"<%(tag)s>\"不是一个有效的标签。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:480
+#, python-format
+msgid "A tag on line %(line)s is missing one or more required attributes. (Line starts with \"%(start)s\".)"
+msgstr "在行 %(line)s 的标签少了一个或多个必须的属性。(行开始于 \"%(start)s\"。)"
+
+#: core/validators.py:485
+#, python-format
+msgid "The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line starts with \"%(start)s\".)"
+msgstr "在行 %(line)s 的\"%(attr)s\"属性有一个无效的值。(行开始于 \"%(start)s\"。)"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "带有这个 %(type)s 的 %(object)s 对于给定的 %(field)s 已经存在了。"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "%(optname)s 带有 %(fieldname)s 已经存在。"
+
+#: db/models/fields/__init__.py:114
+#: db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542
+#: db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "这个字段是必输项。"
+
+#: db/models/fields/__init__.py:337
+msgid "This value must be an integer."
+msgstr "这个值必须是一个整数。"
+
+#: db/models/fields/__init__.py:369
+msgid "This value must be either True or False."
+msgstr "这个值必须是 True 或 False。"
+
+#: db/models/fields/__init__.py:385
+msgid "This field cannot be null."
+msgstr "这个值不能为 null。"
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "输入一个有效的文件名。"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "请输入一个有效的 %s 。"
+
+#: db/models/fields/related.py:579
+msgid "Separate multiple IDs with commas."
+msgstr "用逗号分隔多个ID。"
+
+#: db/models/fields/related.py:581
+msgid "Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr "按下 \"Control\",或者在Mac上按 \"Command\" 来选择多个值。"
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural "Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "请输入有效的 %(self)s ID。值 %(value)r 无效。"
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "确定你输入的文本少于 %s 个字符。"
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "这里不允许换行符。"
+
+#: forms/__init__.py:480
+#: forms/__init__.py:551
+#: forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "选择一个有效的选项: '%(data)s' 不在 %(choices)s 中。"
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "所提交的文件为空。"
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "输入在 -32,768 到 32,767 之间的一个整数。"
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "输入正整数。"
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "输入在 0 到 32,767 之间的一个整数。"
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "是、否、也许"
+
+#~ msgid "Comment"
+#~ msgstr "评论"
+#~ msgid "Comments"
+#~ msgstr "评论"
+#~ msgid "String (up to 50)"
+#~ msgstr "整数(最长50)"
+#~ msgid "label"
+#~ msgstr "标签"
+#~ msgid "package"
+#~ msgstr "包"
+#~ msgid "packages"
+#~ msgstr "包"
+
+#, fuzzy
+#~ msgid "count"
+#~ msgstr "内容"
+

Added: vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po
===================================================================
--- vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/zh_CN/LC_MESSAGES/djangojs.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,107 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-03-21 18:43+0800\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <max at exoweb.net>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/admin/media/js/SelectFilter2.js:33
+msgid "Available %s"
+msgstr "可行 %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:41
+msgid "Choose all"
+msgstr "全选"
+
+#: contrib/admin/media/js/SelectFilter2.js:46
+msgid "Add"
+msgstr "增加"
+
+#: contrib/admin/media/js/SelectFilter2.js:48
+msgid "Remove"
+msgstr "移出"
+
+#: contrib/admin/media/js/SelectFilter2.js:53
+msgid "Chosen %s"
+msgstr "选择 %s"
+
+#: contrib/admin/media/js/SelectFilter2.js:54
+msgid "Select your choice(s) and click "
+msgstr "挑选你的选择并且点击 "
+
+#: contrib/admin/media/js/SelectFilter2.js:59
+msgid "Clear all"
+msgstr "清除所有"
+
+#: 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 "一月 二月 三月 四月 五月 六月 六月 七月 八月 九月 十月 十一月 十二月"
+
+#: contrib/admin/media/js/dateparse.js:33
+msgid "Sunday Monday Tuesday Wednesday Thursday Friday Saturday"
+msgstr "星期天 星期一 星期二 星期三 星期四 星期五 星期六"
+
+#: contrib/admin/media/js/calendar.js:25
+msgid "S M T W T F S"
+msgstr "日 月 火 水 木 金 土"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:45
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:80
+msgid "Now"
+msgstr "现在"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:48
+msgid "Clock"
+msgstr "时钟"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:77
+msgid "Choose a time"
+msgstr "选择一个时间"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:81
+msgid "Midnight"
+msgstr "午夜"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:82
+msgid "6 a.m."
+msgstr "上午6点"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:83
+msgid "Noon"
+msgstr "正午"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:87
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:168
+msgid "Cancel"
+msgstr "取消"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:111
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:162
+msgid "Today"
+msgstr "今天"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:114
+msgid "Calendar"
+msgstr "日历"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:160
+msgid "Yesterday"
+msgstr "昨天"
+
+#: contrib/admin/media/js/admin/DateTimeShortcuts.js:164
+msgid "Tomorrow"
+msgstr "明天"

Added: vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/django.mo
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/django.mo
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/django.po
===================================================================
--- vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/django.po	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/locale/zh_TW/LC_MESSAGES/django.po	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1974 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: django v1.0\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2006-05-16 10:13+0200\n"
+"PO-Revision-Date: 2005-12-28 23:30+0800\n"
+"Last-Translator: yungyuc <yyc at seety.org>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: contrib/comments/models.py:67 contrib/comments/models.py:166
+msgid "object ID"
+msgstr "物件 ID"
+
+#: contrib/comments/models.py:68
+msgid "headline"
+msgstr "頭條"
+
+#: contrib/comments/models.py:69 contrib/comments/models.py:90
+#: contrib/comments/models.py:167
+msgid "comment"
+msgstr "è©•è«–"
+
+#: contrib/comments/models.py:70
+msgid "rating #1"
+msgstr "等級 #1"
+
+#: contrib/comments/models.py:71
+msgid "rating #2"
+msgstr "等級 #2"
+
+#: contrib/comments/models.py:72
+msgid "rating #3"
+msgstr "等級 #3"
+
+#: contrib/comments/models.py:73
+msgid "rating #4"
+msgstr "等級 #4"
+
+#: contrib/comments/models.py:74
+msgid "rating #5"
+msgstr "等級 #5"
+
+#: contrib/comments/models.py:75
+msgid "rating #6"
+msgstr "等級 #6"
+
+#: contrib/comments/models.py:76
+msgid "rating #7"
+msgstr "等級 #7"
+
+#: contrib/comments/models.py:77
+msgid "rating #8"
+msgstr "等級 #8"
+
+#: contrib/comments/models.py:82
+msgid "is valid rating"
+msgstr "是有效的等級"
+
+#: contrib/comments/models.py:83 contrib/comments/models.py:169
+msgid "date/time submitted"
+msgstr "日期/時間已發送"
+
+#: contrib/comments/models.py:84 contrib/comments/models.py:170
+msgid "is public"
+msgstr "是公開的"
+
+#: contrib/comments/models.py:85 contrib/admin/views/doc.py:289
+msgid "IP address"
+msgstr "IP 位址"
+
+#: contrib/comments/models.py:86
+msgid "is removed"
+msgstr "已移除"
+
+#: contrib/comments/models.py:86
+msgid ""
+"Check this box if the comment is inappropriate. A \"This comment has been "
+"removed\" message will be displayed instead."
+msgstr "如果此評論不恰當則選取這個方塊,其將以 \"此評論已被移除\" 訊息取代。"
+
+#: contrib/comments/models.py:91
+#, fuzzy
+msgid "comments"
+msgstr "è©•è«–"
+
+#: contrib/comments/models.py:131 contrib/comments/models.py:207
+msgid "Content object"
+msgstr "內容物件"
+
+#: contrib/comments/models.py:159
+#, python-format
+msgid ""
+"Posted by %(user)s at %(date)s\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+msgstr ""
+"由 %(user)s 在 %(date)s 張貼\n"
+"\n"
+"%(comment)s\n"
+"\n"
+"http://%(domain)s%(url)s"
+
+#: contrib/comments/models.py:168
+msgid "person's name"
+msgstr "人名"
+
+#: contrib/comments/models.py:171
+msgid "ip address"
+msgstr "ip 位址"
+
+#: contrib/comments/models.py:173
+msgid "approved by staff"
+msgstr "由工作人員核准"
+
+#: contrib/comments/models.py:176
+#, fuzzy
+msgid "free comment"
+msgstr "自由評論"
+
+#: contrib/comments/models.py:177
+#, fuzzy
+msgid "free comments"
+msgstr "自由評論"
+
+#: contrib/comments/models.py:233
+msgid "score"
+msgstr "分數"
+
+#: contrib/comments/models.py:234
+msgid "score date"
+msgstr "分數日期"
+
+#: contrib/comments/models.py:237
+#, fuzzy
+msgid "karma score"
+msgstr "Karma 分數"
+
+#: contrib/comments/models.py:238
+#, fuzzy
+msgid "karma scores"
+msgstr "Karma 分數"
+
+#: contrib/comments/models.py:242
+#, python-format
+msgid "%(score)d rating by %(user)s"
+msgstr "被 %(user)s 評定為 %(score)d 等級"
+
+#: contrib/comments/models.py:258
+#, python-format
+msgid ""
+"This comment was flagged by %(user)s:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此評論被 %(user)s 標識:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/models.py:265
+msgid "flag date"
+msgstr "標識日期"
+
+#: contrib/comments/models.py:268
+#, fuzzy
+msgid "user flag"
+msgstr "使用者旗標"
+
+#: contrib/comments/models.py:269
+#, fuzzy
+msgid "user flags"
+msgstr "使用者旗標"
+
+#: contrib/comments/models.py:273
+#, python-format
+msgid "Flag by %r"
+msgstr "被 %r 標識"
+
+#: contrib/comments/models.py:278
+msgid "deletion date"
+msgstr "刪除日期"
+
+#: contrib/comments/models.py:280
+#, fuzzy
+msgid "moderator deletion"
+msgstr "仲裁刪除"
+
+#: contrib/comments/models.py:281
+#, fuzzy
+msgid "moderator deletions"
+msgstr "仲裁刪除"
+
+#: contrib/comments/models.py:285
+#, python-format
+msgid "Moderator deletion by %r"
+msgstr "由 %r 仲裁刪除"
+
+#: contrib/comments/views/karma.py:19
+msgid "Anonymous users cannot vote"
+msgstr "匿名使用者不可投票"
+
+#: contrib/comments/views/karma.py:23
+msgid "Invalid comment ID"
+msgstr "無效的評論 ID"
+
+#: contrib/comments/views/karma.py:25
+msgid "No voting for yourself"
+msgstr "不要投票給你自己"
+
+#: contrib/comments/views/comments.py:28
+msgid ""
+"This rating is required because you've entered at least one other rating."
+msgstr "此等級被要求是因為你至少輸入了一個其它的等級。"
+
+#: contrib/comments/views/comments.py:112
+#, python-format
+msgid ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comment:\n"
+"\n"
+"%(text)s"
+msgid_plural ""
+"This comment was posted by a user who has posted fewer than %(count)s "
+"comments:\n"
+"\n"
+"%(text)s"
+msgstr[0] ""
+"張貼此評論的使用者之所有評論少於 %(count)s:\n"
+"\n"
+"%(text)s"
+msgstr[1] ""
+"張貼此評論的使用者之所有評論少於 %(count)s:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:117
+#, python-format
+msgid ""
+"This comment was posted by a sketchy user:\n"
+"\n"
+"%(text)s"
+msgstr ""
+"此評論被一個隨便的使用者所張貼:\n"
+"\n"
+"%(text)s"
+
+#: contrib/comments/views/comments.py:189
+#: contrib/comments/views/comments.py:280
+msgid "Only POSTs are allowed"
+msgstr "只允許 POST"
+
+#: contrib/comments/views/comments.py:193
+#: contrib/comments/views/comments.py:284
+msgid "One or more of the required fields wasn't submitted"
+msgstr "一個或多個所需的欄位沒有送出"
+
+#: contrib/comments/views/comments.py:197
+#: contrib/comments/views/comments.py:286
+msgid "Somebody tampered with the comment form (security violation)"
+msgstr "有人篡改了評論表單 (違反保全)"
+
+#: contrib/comments/views/comments.py:207
+#: contrib/comments/views/comments.py:292
+msgid ""
+"The comment form had an invalid 'target' parameter -- the object ID was "
+"invalid"
+msgstr "此評論表單有一個無效的 'target' 參數 -- 物件 ID 是無效的"
+
+#: contrib/comments/views/comments.py:257
+#: contrib/comments/views/comments.py:321
+msgid "The comment form didn't provide either 'preview' or 'post'"
+msgstr "此評論表單沒有提供 'preview' 或 'post'"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/login.html:17
+msgid "Username:"
+msgstr "使用者名稱:"
+
+#: contrib/comments/templates/comments/form.html:6
+#: contrib/admin/templates/admin/login.html:20
+msgid "Password:"
+msgstr "密碼:"
+
+#: contrib/comments/templates/comments/form.html:6
+#, fuzzy
+msgid "Forgotten your password?"
+msgstr "變更我的密碼"
+
+#: contrib/comments/templates/comments/form.html:8
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Log out"
+msgstr "登出"
+
+#: contrib/comments/templates/comments/form.html:12
+#, fuzzy
+msgid "Ratings"
+msgstr "等級 #1"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Required"
+msgstr "必需的"
+
+#: contrib/comments/templates/comments/form.html:12
+#: contrib/comments/templates/comments/form.html:23
+msgid "Optional"
+msgstr "可選擇的"
+
+#: contrib/comments/templates/comments/form.html:23
+msgid "Post a photo"
+msgstr "張貼照片"
+
+#: contrib/comments/templates/comments/form.html:27
+#: contrib/comments/templates/comments/freeform.html:5
+#, fuzzy
+msgid "Comment:"
+msgstr "è©•è«–"
+
+#: contrib/comments/templates/comments/form.html:32
+#: contrib/comments/templates/comments/freeform.html:9
+#, fuzzy
+msgid "Preview comment"
+msgstr "自由評論"
+
+#: contrib/comments/templates/comments/freeform.html:4
+#, fuzzy
+msgid "Your name:"
+msgstr "使用者名稱"
+
+#: contrib/admin/filterspecs.py:40
+#, python-format
+msgid ""
+"<h3>By %s:</h3>\n"
+"<ul>\n"
+msgstr ""
+"<h3>ç”± %s:</h3>\n"
+"<ul>\n"
+
+#: contrib/admin/filterspecs.py:70 contrib/admin/filterspecs.py:88
+#: contrib/admin/filterspecs.py:143
+msgid "All"
+msgstr "全部"
+
+#: contrib/admin/filterspecs.py:109
+msgid "Any date"
+msgstr "任何日期"
+
+#: contrib/admin/filterspecs.py:110
+msgid "Today"
+msgstr "本日"
+
+#: contrib/admin/filterspecs.py:113
+msgid "Past 7 days"
+msgstr "過去 7 天"
+
+#: contrib/admin/filterspecs.py:115
+msgid "This month"
+msgstr "本月"
+
+#: contrib/admin/filterspecs.py:117
+msgid "This year"
+msgstr "本年"
+
+#: contrib/admin/filterspecs.py:143
+msgid "Yes"
+msgstr "是"
+
+#: contrib/admin/filterspecs.py:143
+msgid "No"
+msgstr "否"
+
+#: contrib/admin/filterspecs.py:150
+msgid "Unknown"
+msgstr "未知"
+
+#: contrib/admin/models.py:16
+msgid "action time"
+msgstr "動作時間"
+
+#: contrib/admin/models.py:19
+msgid "object id"
+msgstr "物件 id"
+
+#: contrib/admin/models.py:20
+msgid "object repr"
+msgstr "物件 repr"
+
+#: contrib/admin/models.py:21
+msgid "action flag"
+msgstr "動作旗標"
+
+#: contrib/admin/models.py:22
+msgid "change message"
+msgstr "變更訊息"
+
+#: contrib/admin/models.py:25
+msgid "log entry"
+msgstr "紀錄項目"
+
+#: contrib/admin/models.py:26
+msgid "log entries"
+msgstr "紀錄項目"
+
+#: contrib/admin/templatetags/admin_list.py:228
+msgid "All dates"
+msgstr "所有日期"
+
+#: contrib/admin/views/decorators.py:9 contrib/auth/forms.py:36
+#: contrib/auth/forms.py:41
+msgid ""
+"Please enter a correct username and password. Note that both fields are case-"
+"sensitive."
+msgstr "請輸入一個正確的使用者名稱與密碼。注意此二欄位都是大小寫有別的。"
+
+#: contrib/admin/views/decorators.py:23
+#: contrib/admin/templates/admin/login.html:25
+msgid "Log in"
+msgstr "登入"
+
+#: contrib/admin/views/decorators.py:61
+msgid ""
+"Please log in again, because your session has expired. Don't worry: Your "
+"submission has been saved."
+msgstr "請再登入一次,因為你的 session 已經到期。不必擔心: 你的提交已被儲存。"
+
+#: contrib/admin/views/decorators.py:68
+msgid ""
+"Looks like your browser isn't configured to accept cookies. Please enable "
+"cookies, reload this page, and try again."
+msgstr ""
+"看起來你的瀏覽器沒有組態成允許 cookie。請啟用 cookie、重新載入此頁,然後再試"
+"一次。"
+
+#: contrib/admin/views/decorators.py:82
+msgid "Usernames cannot contain the '@' character."
+msgstr "使用者名稱不能包含 '@' 字元。"
+
+#: contrib/admin/views/decorators.py:84
+#, python-format
+msgid "Your e-mail address is not your username. Try '%s' instead."
+msgstr "你的電子郵件地址不是你的使用者名稱。試著改用 '%s'。"
+
+#: contrib/admin/views/main.py:226
+msgid "Site administration"
+msgstr "網站管理"
+
+#: contrib/admin/views/main.py:260
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was added successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功新增。"
+
+#: contrib/admin/views/main.py:264 contrib/admin/views/main.py:348
+msgid "You may edit it again below."
+msgstr "你可以在下面再編輯一次。"
+
+#: contrib/admin/views/main.py:272 contrib/admin/views/main.py:357
+#, python-format
+msgid "You may add another %s below."
+msgstr "你可以在下面新增另一個 %s。"
+
+#: contrib/admin/views/main.py:290
+#, python-format
+msgid "Add %s"
+msgstr "新增 %s"
+
+#: contrib/admin/views/main.py:336
+#, python-format
+msgid "Added %s."
+msgstr "%s 已新增。"
+
+#: contrib/admin/views/main.py:336 contrib/admin/views/main.py:338
+#: contrib/admin/views/main.py:340
+msgid "and"
+msgstr "和"
+
+#: contrib/admin/views/main.py:338
+#, python-format
+msgid "Changed %s."
+msgstr "%s 已變更。"
+
+#: contrib/admin/views/main.py:340
+#, python-format
+msgid "Deleted %s."
+msgstr "%s 已刪除。"
+
+#: contrib/admin/views/main.py:343
+msgid "No fields changed."
+msgstr "沒有欄位被變更。"
+
+#: contrib/admin/views/main.py:346
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was changed successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功變更。"
+
+#: contrib/admin/views/main.py:354
+#, python-format
+msgid ""
+"The %(name)s \"%(obj)s\" was added successfully. You may edit it again below."
+msgstr "%(name)s \"%(obj)s\" 已成功新增。你可以在下面再次編輯。"
+
+#: contrib/admin/views/main.py:392
+#, python-format
+msgid "Change %s"
+msgstr "變更 %s"
+
+#: contrib/admin/views/main.py:470
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s: %(obj)s"
+msgstr "在 %(name) 裡的一個或多個 %(fieldname)s: %(obj)s"
+
+#: contrib/admin/views/main.py:475
+#, python-format
+msgid "One or more %(fieldname)s in %(name)s:"
+msgstr "在 %(name)s 裡的一個或多個 %(fieldname)s:"
+
+#: contrib/admin/views/main.py:508
+#, python-format
+msgid "The %(name)s \"%(obj)s\" was deleted successfully."
+msgstr "%(name)s \"%(obj)s\" 已成功刪除。"
+
+#: contrib/admin/views/main.py:511
+msgid "Are you sure?"
+msgstr "你確定?"
+
+#: contrib/admin/views/main.py:533
+#, python-format
+msgid "Change history: %s"
+msgstr "變更歷史: %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s"
+msgstr "選擇 %s"
+
+#: contrib/admin/views/main.py:565
+#, python-format
+msgid "Select %s to change"
+msgstr "選擇 %s 來變更"
+
+#: contrib/admin/views/doc.py:277 contrib/admin/views/doc.py:286
+#: contrib/admin/views/doc.py:288 contrib/admin/views/doc.py:294
+#: contrib/admin/views/doc.py:295 contrib/admin/views/doc.py:297
+msgid "Integer"
+msgstr "整數"
+
+#: contrib/admin/views/doc.py:278
+msgid "Boolean (Either True or False)"
+msgstr "布林值 (True 或 False)"
+
+#: contrib/admin/views/doc.py:279 contrib/admin/views/doc.py:296
+#, python-format
+msgid "String (up to %(maxlength)s)"
+msgstr "字串 (最長到 %(maxlength)s)"
+
+#: contrib/admin/views/doc.py:280
+msgid "Comma-separated integers"
+msgstr "逗號分隔的整數"
+
+#: contrib/admin/views/doc.py:281
+msgid "Date (without time)"
+msgstr "日期 (不包括時間)"
+
+#: contrib/admin/views/doc.py:282
+msgid "Date (with time)"
+msgstr "日期 (包括時間)"
+
+#: contrib/admin/views/doc.py:283
+msgid "E-mail address"
+msgstr "電子郵件地址"
+
+#: contrib/admin/views/doc.py:284 contrib/admin/views/doc.py:287
+msgid "File path"
+msgstr "檔案路徑"
+
+#: contrib/admin/views/doc.py:285
+msgid "Decimal number"
+msgstr "小數"
+
+#: contrib/admin/views/doc.py:291
+msgid "Boolean (Either True, False or None)"
+msgstr "布林值 (True, False 或 None)"
+
+#: contrib/admin/views/doc.py:292
+msgid "Relation to parent model"
+msgstr "與父模型的關係"
+
+#: contrib/admin/views/doc.py:293
+msgid "Phone number"
+msgstr "電話號碼"
+
+#: contrib/admin/views/doc.py:298
+msgid "Text"
+msgstr "文字"
+
+#: contrib/admin/views/doc.py:299
+msgid "Time"
+msgstr "時間"
+
+#: contrib/admin/views/doc.py:300 contrib/flatpages/models.py:7
+msgid "URL"
+msgstr "URL"
+
+#: contrib/admin/views/doc.py:301
+msgid "U.S. state (two uppercase letters)"
+msgstr "U.S. 州名 (兩個大寫字母)"
+
+#: contrib/admin/views/doc.py:302
+msgid "XML text"
+msgstr "XML 文字"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Documentation"
+msgstr "文件"
+
+#: contrib/admin/templates/admin/object_history.html:3
+#: contrib/admin/templates/admin/change_list.html:5
+#: contrib/admin/templates/admin/base.html:23
+#: contrib/admin/templates/admin/delete_confirmation.html:3
+#: contrib/admin/templates/admin/change_form.html:10
+#: contrib/admin/templates/registration/password_change_done.html:3
+#: contrib/admin/templates/registration/password_change_form.html:3
+#: contrib/admin/templates/admin_doc/bookmarklets.html:4
+#: contrib/admin/templates/admin_doc/view_detail.html:4
+#: contrib/admin/templates/admin_doc/template_tag_index.html:5
+#: contrib/admin/templates/admin_doc/template_detail.html:4
+#: contrib/admin/templates/admin_doc/template_filter_index.html:5
+#: contrib/admin/templates/admin_doc/missing_docutils.html:4
+#: contrib/admin/templates/admin_doc/view_index.html:5
+#: contrib/admin/templates/admin_doc/model_detail.html:3
+#: contrib/admin/templates/admin_doc/index.html:4
+#: contrib/admin/templates/admin_doc/model_index.html:5
+msgid "Change password"
+msgstr "變更密碼"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/500.html:4
+#: contrib/admin/templates/admin/change_list.html:6
+#: contrib/admin/templates/admin/base.html:28
+#: contrib/admin/templates/admin/delete_confirmation.html:6
+#: contrib/admin/templates/admin/change_form.html:13
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/logged_out.html:4
+#: contrib/admin/templates/registration/password_reset_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Home"
+msgstr "首頁"
+
+#: contrib/admin/templates/admin/object_history.html:5
+#: contrib/admin/templates/admin/change_form.html:20
+msgid "History"
+msgstr "歷史"
+
+#: contrib/admin/templates/admin/object_history.html:18
+msgid "Date/time"
+msgstr "日期/時間"
+
+#: contrib/admin/templates/admin/object_history.html:19
+msgid "User"
+msgstr "使用者"
+
+#: contrib/admin/templates/admin/object_history.html:20
+msgid "Action"
+msgstr "動作"
+
+#: contrib/admin/templates/admin/object_history.html:26
+msgid "DATE_WITH_TIME_FULL"
+msgstr "DATE_WITH_TIME_FULL"
+
+#: contrib/admin/templates/admin/object_history.html:36
+msgid ""
+"This object doesn't have a change history. It probably wasn't added via this "
+"admin site."
+msgstr "這個物件沒有變更的歷史。它可能不是透過這個管理網站新增的。"
+
+#: contrib/admin/templates/admin/base_site.html:4
+msgid "Django site admin"
+msgstr "Django 網站管理"
+
+#: contrib/admin/templates/admin/base_site.html:7
+msgid "Django administration"
+msgstr "Django 管理"
+
+#: contrib/admin/templates/admin/500.html:4
+msgid "Server error"
+msgstr "伺服器錯誤"
+
+#: contrib/admin/templates/admin/500.html:6
+msgid "Server error (500)"
+msgstr "伺服器錯誤 (500)"
+
+#: contrib/admin/templates/admin/500.html:9
+msgid "Server Error <em>(500)</em>"
+msgstr "伺服器錯誤 <em>(500)</em>"
+
+#: contrib/admin/templates/admin/500.html:10
+msgid ""
+"There's been an error. It's been reported to the site administrators via e-"
+"mail and should be fixed shortly. Thanks for your patience."
+msgstr ""
+"有一個錯誤。它已經被透過電子郵件報告給了網站管理員,應該不久就會解決。感謝你"
+"的忍耐。"
+
+#: contrib/admin/templates/admin/404.html:4
+#: contrib/admin/templates/admin/404.html:8
+msgid "Page not found"
+msgstr "找不到頁面"
+
+#: contrib/admin/templates/admin/404.html:10
+msgid "We're sorry, but the requested page could not be found."
+msgstr "我們很抱歉,不過被要求的頁面找不到。"
+
+#: contrib/admin/templates/admin/index.html:17
+#, python-format
+msgid "Models available in the %(name)s application."
+msgstr ""
+
+#: contrib/admin/templates/admin/index.html:28
+#: contrib/admin/templates/admin/change_form.html:15
+msgid "Add"
+msgstr "新增"
+
+#: contrib/admin/templates/admin/index.html:34
+msgid "Change"
+msgstr "變更"
+
+#: contrib/admin/templates/admin/index.html:44
+msgid "You don't have permission to edit anything."
+msgstr "你沒有編輯任何東西的權限。"
+
+#: contrib/admin/templates/admin/index.html:52
+msgid "Recent Actions"
+msgstr "最近的動作"
+
+#: contrib/admin/templates/admin/index.html:53
+msgid "My Actions"
+msgstr "我的動作"
+
+#: contrib/admin/templates/admin/index.html:57
+msgid "None available"
+msgstr "沒有可用的"
+
+#: contrib/admin/templates/admin/change_list.html:11
+#, python-format
+msgid "Add %(name)s"
+msgstr "新增 %(name)s"
+
+#: contrib/admin/templates/admin/login.html:22
+msgid "Have you <a href=\"/password_reset/\">forgotten your password</a>?"
+msgstr "你 <a href=\"/password_reset/\">忘記密碼了嗎</a>?"
+
+#: contrib/admin/templates/admin/base.html:23
+msgid "Welcome,"
+msgstr "æ­¡è¿Ž,"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:9
+#: contrib/admin/templates/admin/submit_line.html:3
+msgid "Delete"
+msgstr "刪除"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:14
+#, python-format
+msgid ""
+"Deleting the %(object_name)s '%(object)s' would result in deleting related "
+"objects, but your account doesn't have permission to delete the following "
+"types of objects:"
+msgstr ""
+"刪除 %(object_name)s '%(object)s' 會把相關的物件也刪除,不過你的帳號並沒有刪"
+"除以下型態物件的權限:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:21
+#, python-format
+msgid ""
+"Are you sure you want to delete the %(object_name)s \"%(object)s\"? All of "
+"the following related items will be deleted:"
+msgstr ""
+"你確定想要刪除 %(object_name)s \"%(object)s\"?以下所有的相關項目都會被刪除:"
+
+#: contrib/admin/templates/admin/delete_confirmation.html:26
+msgid "Yes, I'm sure"
+msgstr "是的,我確定"
+
+#: contrib/admin/templates/admin/filter.html:2
+#, python-format
+msgid " By %(title)s "
+msgstr " 根據 %(title)s "
+
+#: contrib/admin/templates/admin/search_form.html:8
+msgid "Go"
+msgstr "去"
+
+#: contrib/admin/templates/admin/change_form.html:21
+msgid "View on site"
+msgstr "在網站上檢視"
+
+#: contrib/admin/templates/admin/change_form.html:30
+msgid "Please correct the error below."
+msgid_plural "Please correct the errors below."
+msgstr[0] "請更正以下的錯誤。"
+msgstr[1] "請更正以下的錯誤。"
+
+#: contrib/admin/templates/admin/change_form.html:48
+msgid "Ordering"
+msgstr "排序中"
+
+#: contrib/admin/templates/admin/change_form.html:51
+msgid "Order:"
+msgstr "順序:"
+
+#: contrib/admin/templates/admin/submit_line.html:4
+msgid "Save as new"
+msgstr "儲存為新的"
+
+#: contrib/admin/templates/admin/submit_line.html:5
+msgid "Save and add another"
+msgstr "儲存並新增另一個"
+
+#: contrib/admin/templates/admin/submit_line.html:6
+msgid "Save and continue editing"
+msgstr "儲存並繼續編輯"
+
+#: contrib/admin/templates/admin/submit_line.html:7
+msgid "Save"
+msgstr "儲存"
+
+#: contrib/admin/templates/registration/password_change_done.html:4
+#: contrib/admin/templates/registration/password_change_form.html:4
+#: contrib/admin/templates/registration/password_change_form.html:6
+#: contrib/admin/templates/registration/password_change_form.html:10
+msgid "Password change"
+msgstr "密碼變更"
+
+#: contrib/admin/templates/registration/password_change_done.html:6
+#: contrib/admin/templates/registration/password_change_done.html:10
+msgid "Password change successful"
+msgstr "密碼成功地變更"
+
+#: contrib/admin/templates/registration/password_change_done.html:12
+msgid "Your password was changed."
+msgstr "你的密碼已變更。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:4
+#: contrib/admin/templates/registration/password_reset_form.html:6
+#: contrib/admin/templates/registration/password_reset_form.html:10
+#: contrib/admin/templates/registration/password_reset_done.html:4
+msgid "Password reset"
+msgstr "密碼重設"
+
+#: contrib/admin/templates/registration/password_reset_form.html:12
+msgid ""
+"Forgotten your password? Enter your e-mail address below, and we'll reset "
+"your password and e-mail the new one to you."
+msgstr ""
+"忘記你的密碼了?在下面輸入你的電子郵件地址,我們就會重設你的密碼並把新的用電"
+"子郵件寄給你。"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "E-mail address:"
+msgstr "電子郵件地址:"
+
+#: contrib/admin/templates/registration/password_reset_form.html:16
+msgid "Reset my password"
+msgstr "重設我的密碼"
+
+#: contrib/admin/templates/registration/logged_out.html:8
+msgid "Thanks for spending some quality time with the Web site today."
+msgstr "感謝你今天花了重要的時間留在本網站。"
+
+#: contrib/admin/templates/registration/logged_out.html:10
+msgid "Log in again"
+msgstr "再次登入"
+
+#: contrib/admin/templates/registration/password_reset_done.html:6
+#: contrib/admin/templates/registration/password_reset_done.html:10
+msgid "Password reset successful"
+msgstr "密碼成功地重設"
+
+#: contrib/admin/templates/registration/password_reset_done.html:12
+msgid ""
+"We've e-mailed a new password to the e-mail address you submitted. You "
+"should be receiving it shortly."
+msgstr "我們已經把新的密碼寄到你送出的電子郵件地址。你應該不久就能收到。"
+
+#: contrib/admin/templates/registration/password_change_form.html:12
+msgid ""
+"Please enter your old password, for security's sake, and then enter your new "
+"password twice so we can verify you typed it in correctly."
+msgstr ""
+"為了安全上的考慮,請輸入你的舊密碼,再輸入新密碼兩次,讓我們核驗你已正確地輸"
+"入。"
+
+#: contrib/admin/templates/registration/password_change_form.html:17
+msgid "Old password:"
+msgstr "舊密碼:"
+
+#: contrib/admin/templates/registration/password_change_form.html:19
+msgid "New password:"
+msgstr "新密碼:"
+
+#: contrib/admin/templates/registration/password_change_form.html:21
+msgid "Confirm password:"
+msgstr "確認密碼:"
+
+#: contrib/admin/templates/registration/password_change_form.html:23
+msgid "Change my password"
+msgstr "變更我的密碼"
+
+#: contrib/admin/templates/registration/password_reset_email.html:2
+msgid "You're receiving this e-mail because you requested a password reset"
+msgstr "因為你要求重設密碼,所以收到了這封電子郵件"
+
+#: contrib/admin/templates/registration/password_reset_email.html:3
+#, python-format
+msgid "for your user account at %(site_name)s"
+msgstr "你在 %(site_name)s 裡的使用者帳號"
+
+#: contrib/admin/templates/registration/password_reset_email.html:5
+#, python-format
+msgid "Your new password is: %(new_password)s"
+msgstr "你的新密碼是: %(new_password)s"
+
+#: contrib/admin/templates/registration/password_reset_email.html:7
+msgid "Feel free to change this password by going to this page:"
+msgstr "放心地到此頁面變更密碼:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:11
+msgid "Your username, in case you've forgotten:"
+msgstr "你的使用者名稱,萬一你已經忘記的話:"
+
+#: contrib/admin/templates/registration/password_reset_email.html:13
+msgid "Thanks for using our site!"
+msgstr "感謝使用本網站!"
+
+#: contrib/admin/templates/registration/password_reset_email.html:15
+#, python-format
+msgid "The %(site_name)s team"
+msgstr "%(site_name)s 團隊"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:3
+msgid "Bookmarklets"
+msgstr "Bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:5
+msgid "Documentation bookmarklets"
+msgstr "文件 bookmarklets"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:9
+msgid ""
+"\n"
+"<p class=\"help\">To install bookmarklets, drag the link to your bookmarks\n"
+"toolbar, or right-click the link and add it to your bookmarks. Now you can\n"
+"select the bookmarklet from any page in the site.  Note that some of these\n"
+"bookmarklets require you to be viewing the site from a computer designated\n"
+"as \"internal\" (talk to your system administrator if you aren't sure if\n"
+"your computer is \"internal\").</p>\n"
+msgstr ""
+"\n"
+"<p class=\"help\">要安裝 bookmarklet,把連結拖進你的書籤工具列,或右擊該連結"
+"後新增到你的書籤裡。現在你可以從網站的任何頁面來選擇 bookmarklet。注意其中某"
+"些 bookmarklet 要求你必須是從被稱為 \"內部\" 的電腦來檢視網站的 (如果你不確定"
+"你的電腦是否在 \"內部\",那就和你的系統管理員談談)。</p>\n"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:19
+msgid "Documentation for this page"
+msgstr "本頁面的文件"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:20
+msgid ""
+"Jumps you from any page to the documentation for the view that generates "
+"that page."
+msgstr "讓你跳到用來產生該頁面之檢視的任何一頁文件。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:22
+msgid "Show object ID"
+msgstr "顯示物件 ID"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:23
+msgid ""
+"Shows the content-type and unique ID for pages that represent a single "
+"object."
+msgstr "顯示用來表示單一物件的頁面 content-type 與唯一 ID。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:25
+msgid "Edit this object (current window)"
+msgstr "編輯此物件 (目前視窗)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:26
+msgid "Jumps to the admin page for pages that represent a single object."
+msgstr "跳到用來表示單一物件的管理頁面。"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:28
+msgid "Edit this object (new window)"
+msgstr "編輯此物件 (新視窗)"
+
+#: contrib/admin/templates/admin_doc/bookmarklets.html:29
+msgid "As above, but opens the admin page in a new window."
+msgstr "如上,但在新視窗裡開啟管理頁面。"
+
+#: contrib/admin/templates/widget/date_time.html:3
+msgid "Date:"
+msgstr "日期:"
+
+#: contrib/admin/templates/widget/date_time.html:4
+msgid "Time:"
+msgstr "時間:"
+
+#: contrib/admin/templates/widget/file.html:2
+msgid "Currently:"
+msgstr "目前:"
+
+#: contrib/admin/templates/widget/file.html:3
+msgid "Change:"
+msgstr "變更:"
+
+#: contrib/redirects/models.py:7
+msgid "redirect from"
+msgstr "重導向自"
+
+#: contrib/redirects/models.py:8
+msgid ""
+"This should be an absolute path, excluding the domain name. Example: '/"
+"events/search/'."
+msgstr "此應為一絕對路徑,但不包括網域名稱。範例: '/events/search/'。"
+
+#: contrib/redirects/models.py:9
+msgid "redirect to"
+msgstr "重導向至"
+
+#: contrib/redirects/models.py:10
+msgid ""
+"This can be either an absolute path (as above) or a full URL starting with "
+"'http://'."
+msgstr "此可為一絕對路徑 (如上) 或一個以 'http://' 開頭的完整 URL. "
+
+#: contrib/redirects/models.py:12
+msgid "redirect"
+msgstr "重導向"
+
+#: contrib/redirects/models.py:13
+msgid "redirects"
+msgstr "重導向"
+
+#: contrib/flatpages/models.py:8
+msgid ""
+"Example: '/about/contact/'. Make sure to have leading and trailing slashes."
+msgstr "範例: '/about/contact/'。開頭與結束都一定要有斜線。"
+
+#: contrib/flatpages/models.py:9
+msgid "title"
+msgstr "標題"
+
+#: contrib/flatpages/models.py:10
+msgid "content"
+msgstr "內容"
+
+#: contrib/flatpages/models.py:11
+msgid "enable comments"
+msgstr "啟用評論"
+
+#: contrib/flatpages/models.py:12
+msgid "template name"
+msgstr "模板名稱"
+
+#: contrib/flatpages/models.py:13
+msgid ""
+"Example: 'flatpages/contact_page'. If this isn't provided, the system will "
+"use 'flatpages/default'."
+msgstr ""
+"範例: 'flatpages/contact_page'。如果沒有提供它,系統會使用 'flatpages/"
+"default'。"
+
+#: contrib/flatpages/models.py:14
+msgid "registration required"
+msgstr "需要註冊"
+
+#: contrib/flatpages/models.py:14
+msgid "If this is checked, only logged-in users will be able to view the page."
+msgstr "如果此項被選取,則只有登入的使用者可以檢視頁面。"
+
+#: contrib/flatpages/models.py:18
+msgid "flat page"
+msgstr "簡平頁面"
+
+#: contrib/flatpages/models.py:19
+msgid "flat pages"
+msgstr "簡平頁面"
+
+#: contrib/auth/models.py:13 contrib/auth/models.py:26
+msgid "name"
+msgstr "名稱"
+
+#: contrib/auth/models.py:15
+msgid "codename"
+msgstr "codename"
+
+#: contrib/auth/models.py:17
+#, fuzzy
+msgid "permission"
+msgstr "權限"
+
+#: contrib/auth/models.py:18 contrib/auth/models.py:27
+#, fuzzy
+msgid "permissions"
+msgstr "權限"
+
+#: contrib/auth/models.py:29
+#, fuzzy
+msgid "group"
+msgstr "群組"
+
+#: contrib/auth/models.py:30 contrib/auth/models.py:65
+#, fuzzy
+msgid "groups"
+msgstr "群組"
+
+#: contrib/auth/models.py:55
+msgid "username"
+msgstr "使用者名稱"
+
+#: contrib/auth/models.py:56
+msgid "first name"
+msgstr "名字"
+
+#: contrib/auth/models.py:57
+msgid "last name"
+msgstr "姓氏"
+
+#: contrib/auth/models.py:58
+msgid "e-mail address"
+msgstr "電子郵件地址"
+
+#: contrib/auth/models.py:59
+msgid "password"
+msgstr "密碼"
+
+#: contrib/auth/models.py:59
+msgid "Use '[algo]$[salt]$[hexdigest]'"
+msgstr "使用 '[algo]$[salt]$[hexdigest]'"
+
+#: contrib/auth/models.py:60
+msgid "staff status"
+msgstr "工作人員狀態"
+
+#: contrib/auth/models.py:60
+msgid "Designates whether the user can log into this admin site."
+msgstr "指明何使用者可以登入此管理網站。"
+
+#: contrib/auth/models.py:61
+msgid "active"
+msgstr "活動中"
+
+#: contrib/auth/models.py:62
+msgid "superuser status"
+msgstr "超級使用者狀態"
+
+#: contrib/auth/models.py:63
+msgid "last login"
+msgstr "上次登入"
+
+#: contrib/auth/models.py:64
+msgid "date joined"
+msgstr "加入日期"
+
+#: contrib/auth/models.py:66
+msgid ""
+"In addition to the permissions manually assigned, this user will also get "
+"all permissions granted to each group he/she is in."
+msgstr "除了手動指定的權限之外,這個使用者也會得到其群組擁有的所有權限。"
+
+#: contrib/auth/models.py:67
+#, fuzzy
+msgid "user permissions"
+msgstr "權限"
+
+#: contrib/auth/models.py:70
+#, fuzzy
+msgid "user"
+msgstr "使用者"
+
+#: contrib/auth/models.py:71
+#, fuzzy
+msgid "users"
+msgstr "使用者"
+
+#: contrib/auth/models.py:76
+msgid "Personal info"
+msgstr "個人資訊"
+
+#: contrib/auth/models.py:77
+msgid "Permissions"
+msgstr "權限"
+
+#: contrib/auth/models.py:78
+msgid "Important dates"
+msgstr "重要日期"
+
+#: contrib/auth/models.py:79
+msgid "Groups"
+msgstr "群組"
+
+#: contrib/auth/models.py:219
+#, fuzzy
+msgid "message"
+msgstr "訊息"
+
+#: contrib/auth/forms.py:30
+msgid ""
+"Your Web browser doesn't appear to have cookies enabled. Cookies are "
+"required for logging in."
+msgstr "你的網頁瀏覽器看來沒有啟用 cookie。若要登入則需使用 cookie。"
+
+#: contrib/contenttypes/models.py:25
+#, fuzzy
+msgid "python model class name"
+msgstr "python 模組名稱"
+
+#: contrib/contenttypes/models.py:28
+msgid "content type"
+msgstr "內容型態"
+
+#: contrib/contenttypes/models.py:29
+msgid "content types"
+msgstr "內容型態"
+
+#: contrib/sessions/models.py:35
+msgid "session key"
+msgstr "session 鍵值"
+
+#: contrib/sessions/models.py:36
+msgid "session data"
+msgstr "session 資料"
+
+#: contrib/sessions/models.py:37
+msgid "expire date"
+msgstr "到期日期"
+
+#: contrib/sessions/models.py:41
+msgid "session"
+msgstr "session"
+
+#: contrib/sessions/models.py:42
+msgid "sessions"
+msgstr "sessions"
+
+#: contrib/sites/models.py:10
+msgid "domain name"
+msgstr "網域名稱"
+
+#: contrib/sites/models.py:11
+msgid "display name"
+msgstr "顯示名稱"
+
+#: contrib/sites/models.py:15
+msgid "site"
+msgstr "網站"
+
+#: contrib/sites/models.py:16
+msgid "sites"
+msgstr "網站"
+
+#: utils/translation.py:360
+msgid "DATE_FORMAT"
+msgstr "DATE_FORMAT"
+
+#: utils/translation.py:361
+msgid "DATETIME_FORMAT"
+msgstr "DATETIME_FORMAT"
+
+#: utils/translation.py:362
+msgid "TIME_FORMAT"
+msgstr "TIME_FORMAT"
+
+#: utils/dates.py:6
+msgid "Monday"
+msgstr "週一"
+
+#: utils/dates.py:6
+msgid "Tuesday"
+msgstr "週二"
+
+#: utils/dates.py:6
+msgid "Wednesday"
+msgstr "週三"
+
+#: utils/dates.py:6
+msgid "Thursday"
+msgstr "週四"
+
+#: utils/dates.py:6
+msgid "Friday"
+msgstr "週五"
+
+#: utils/dates.py:7
+msgid "Saturday"
+msgstr "週六"
+
+#: utils/dates.py:7
+msgid "Sunday"
+msgstr "週日"
+
+#: utils/dates.py:14
+msgid "January"
+msgstr "一月"
+
+#: utils/dates.py:14
+msgid "February"
+msgstr "二月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "March"
+msgstr "三月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "April"
+msgstr "四月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "May"
+msgstr "五月"
+
+#: utils/dates.py:14 utils/dates.py:27
+msgid "June"
+msgstr "六月"
+
+#: utils/dates.py:15 utils/dates.py:27
+msgid "July"
+msgstr "七月"
+
+#: utils/dates.py:15
+msgid "August"
+msgstr "八月"
+
+#: utils/dates.py:15
+msgid "September"
+msgstr "九月"
+
+#: utils/dates.py:15
+msgid "October"
+msgstr "十月"
+
+#: utils/dates.py:15
+msgid "November"
+msgstr "十一月"
+
+#: utils/dates.py:16
+msgid "December"
+msgstr "十二月"
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "jan"
+msgstr "和"
+
+#: utils/dates.py:19
+msgid "feb"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "mar"
+msgstr ""
+
+#: utils/dates.py:19
+msgid "apr"
+msgstr ""
+
+#: utils/dates.py:19
+#, fuzzy
+msgid "may"
+msgstr "æ—¥"
+
+#: utils/dates.py:19
+msgid "jun"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "jul"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "aug"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "sep"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "oct"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "nov"
+msgstr ""
+
+#: utils/dates.py:20
+msgid "dec"
+msgstr ""
+
+#: utils/dates.py:27
+msgid "Jan."
+msgstr "一月"
+
+#: utils/dates.py:27
+msgid "Feb."
+msgstr "二月"
+
+#: utils/dates.py:28
+msgid "Aug."
+msgstr "八月"
+
+#: utils/dates.py:28
+msgid "Sept."
+msgstr "九月"
+
+#: utils/dates.py:28
+msgid "Oct."
+msgstr "十月"
+
+#: utils/dates.py:28
+msgid "Nov."
+msgstr "十一月"
+
+#: utils/dates.py:28
+msgid "Dec."
+msgstr "十二月"
+
+#: utils/timesince.py:12
+msgid "year"
+msgid_plural "years"
+msgstr[0] "å¹´"
+msgstr[1] "å¹´"
+
+#: utils/timesince.py:13
+msgid "month"
+msgid_plural "months"
+msgstr[0] "月"
+msgstr[1] "月"
+
+#: utils/timesince.py:14
+msgid "week"
+msgid_plural "weeks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: utils/timesince.py:15
+msgid "day"
+msgid_plural "days"
+msgstr[0] "æ—¥"
+msgstr[1] "æ—¥"
+
+#: utils/timesince.py:16
+msgid "hour"
+msgid_plural "hours"
+msgstr[0] "時"
+msgstr[1] "時"
+
+#: utils/timesince.py:17
+msgid "minute"
+msgid_plural "minutes"
+msgstr[0] "分"
+msgstr[1] "分"
+
+#: conf/global_settings.py:37
+msgid "Bengali"
+msgstr "孟加拉文"
+
+#: conf/global_settings.py:38
+msgid "Czech"
+msgstr "捷克文"
+
+#: conf/global_settings.py:39
+msgid "Welsh"
+msgstr "威爾斯文"
+
+#: conf/global_settings.py:40
+msgid "Danish"
+msgstr "丹麥文"
+
+#: conf/global_settings.py:41
+msgid "German"
+msgstr "å¾·æ–‡"
+
+#: conf/global_settings.py:42
+msgid "Greek"
+msgstr ""
+
+#: conf/global_settings.py:43
+msgid "English"
+msgstr "英文"
+
+#: conf/global_settings.py:44
+msgid "Spanish"
+msgstr "西班牙文"
+
+#: conf/global_settings.py:45
+msgid "French"
+msgstr "法文"
+
+#: conf/global_settings.py:46
+msgid "Galician"
+msgstr "加利西亞文"
+
+#: conf/global_settings.py:47
+msgid "Hungarian"
+msgstr ""
+
+#: conf/global_settings.py:48
+msgid "Hebrew"
+msgstr ""
+
+#: conf/global_settings.py:49
+msgid "Icelandic"
+msgstr "冰島文"
+
+#: conf/global_settings.py:50
+msgid "Italian"
+msgstr "義大利文"
+
+#: conf/global_settings.py:51
+msgid "Japanese"
+msgstr "日文"
+
+#: conf/global_settings.py:52
+msgid "Dutch"
+msgstr "荷蘭文"
+
+#: conf/global_settings.py:53
+msgid "Norwegian"
+msgstr "挪威文"
+
+#: conf/global_settings.py:54
+msgid "Brazilian"
+msgstr "巴西文"
+
+#: conf/global_settings.py:55
+msgid "Romanian"
+msgstr "羅馬尼亞文"
+
+#: conf/global_settings.py:56
+msgid "Russian"
+msgstr "ä¿„æ–‡"
+
+#: conf/global_settings.py:57
+msgid "Slovak"
+msgstr "斯洛伐克文"
+
+#: conf/global_settings.py:58
+#, fuzzy
+msgid "Slovenian"
+msgstr "斯洛伐克文"
+
+#: conf/global_settings.py:59
+msgid "Serbian"
+msgstr "塞爾維亞文"
+
+#: conf/global_settings.py:60
+msgid "Swedish"
+msgstr "瑞典文"
+
+#: conf/global_settings.py:61
+#, fuzzy
+msgid "Ukrainian"
+msgstr "巴西文"
+
+#: conf/global_settings.py:62
+msgid "Simplified Chinese"
+msgstr "簡體中文"
+
+#: conf/global_settings.py:63
+#, fuzzy
+msgid "Traditional Chinese"
+msgstr "繁體中文"
+
+#: core/validators.py:60
+msgid "This value must contain only letters, numbers and underscores."
+msgstr "此值僅能包含字母、數字與底線。"
+
+#: core/validators.py:64
+#, fuzzy
+msgid ""
+"This value must contain only letters, numbers, underscores, dashes or "
+"slashes."
+msgstr "此值僅能包含字母、數字、底線與斜線。"
+
+#: core/validators.py:72
+msgid "Uppercase letters are not allowed here."
+msgstr "此處不允許大寫字母。"
+
+#: core/validators.py:76
+msgid "Lowercase letters are not allowed here."
+msgstr "此處不允許小寫字母。"
+
+#: core/validators.py:83
+msgid "Enter only digits separated by commas."
+msgstr "輸入以逗號分隔的數字。"
+
+#: core/validators.py:95
+msgid "Enter valid e-mail addresses separated by commas."
+msgstr "輸入以逗號分隔的有效電子郵件地址。"
+
+#: core/validators.py:99
+msgid "Please enter a valid IP address."
+msgstr "請輸入有效的 IP 位址。"
+
+#: core/validators.py:103
+msgid "Empty values are not allowed here."
+msgstr "此處不允許空值。"
+
+#: core/validators.py:107
+msgid "Non-numeric characters aren't allowed here."
+msgstr "此處不允許非數字字元。"
+
+#: core/validators.py:111
+msgid "This value can't be comprised solely of digits."
+msgstr "此值不能只以數字組成。"
+
+#: core/validators.py:116
+msgid "Enter a whole number."
+msgstr "輸入一個整數。"
+
+#: core/validators.py:120
+msgid "Only alphabetical characters are allowed here."
+msgstr "此處只允許字母。"
+
+#: core/validators.py:124
+msgid "Enter a valid date in YYYY-MM-DD format."
+msgstr "以 YYYY-MM-DD 格式輸入有效的日期。"
+
+#: core/validators.py:128
+msgid "Enter a valid time in HH:MM format."
+msgstr "以 HH:MM 格式輸入有效的時間。"
+
+#: core/validators.py:132 db/models/fields/__init__.py:468
+msgid "Enter a valid date/time in YYYY-MM-DD HH:MM format."
+msgstr "以 YYYY-MM-DD HH:MM 格式輸入有效的日期/時間。"
+
+#: core/validators.py:136
+msgid "Enter a valid e-mail address."
+msgstr "輸入有效的電子郵件地址。"
+
+#: core/validators.py:148
+msgid ""
+"Upload a valid image. The file you uploaded was either not an image or a "
+"corrupted image."
+msgstr "上傳一個有效的影像。你上傳的檔案不是影像,否則就是壞掉了。"
+
+#: core/validators.py:155
+#, python-format
+msgid "The URL %s does not point to a valid image."
+msgstr "URL %s 未指向有效的影像。"
+
+#: core/validators.py:159
+#, python-format
+msgid "Phone numbers must be in XXX-XXX-XXXX format. \"%s\" is invalid."
+msgstr "電話號碼必須是 XXX-XXX-XXXX 格式。\"%s\" 無效。"
+
+#: core/validators.py:167
+#, python-format
+msgid "The URL %s does not point to a valid QuickTime video."
+msgstr "URL %s 未指向有效的 QuickTime 視像。"
+
+#: core/validators.py:171
+msgid "A valid URL is required."
+msgstr "必須是有效的 URL。"
+
+#: core/validators.py:185
+#, python-format
+msgid ""
+"Valid HTML is required. Specific errors are:\n"
+"%s"
+msgstr ""
+"必須是有效的 HTML。具體的錯誤是:\n"
+"%s"
+
+#: core/validators.py:192
+#, python-format
+msgid "Badly formed XML: %s"
+msgstr "排列錯誤的 XML: %s"
+
+#: core/validators.py:202
+#, python-format
+msgid "Invalid URL: %s"
+msgstr "無效的 URL: %s"
+
+#: core/validators.py:206 core/validators.py:208
+#, python-format
+msgid "The URL %s is a broken link."
+msgstr "URL %s 是斷掉的連結。"
+
+#: core/validators.py:214
+msgid "Enter a valid U.S. state abbreviation."
+msgstr "輸入有效的 U.S. 州名簡稱。"
+
+#: core/validators.py:229
+#, python-format
+msgid "Watch your mouth! The word %s is not allowed here."
+msgid_plural "Watch your mouth! The words %s are not allowed here."
+msgstr[0] "看管口舌!此處不允許 %s 這樣的字眼。"
+
+#: core/validators.py:236
+#, python-format
+msgid "This field must match the '%s' field."
+msgstr "此欄位必須符合 '%s' 欄位。"
+
+#: core/validators.py:255
+msgid "Please enter something for at least one field."
+msgstr "請在至少一個欄位裡進行輸入。"
+
+#: core/validators.py:264 core/validators.py:275
+msgid "Please enter both fields or leave them both empty."
+msgstr "請輸入兩個欄位或全部留空。"
+
+#: core/validators.py:282
+#, python-format
+msgid "This field must be given if %(field)s is %(value)s"
+msgstr "如果 %(field)s 是 %(value)s 則此欄位必須給定。"
+
+#: core/validators.py:294
+#, python-format
+msgid "This field must be given if %(field)s is not %(value)s"
+msgstr "如果 %(field)s 不是 %(value)s 則此欄位必須給定。"
+
+#: core/validators.py:313
+msgid "Duplicate values are not allowed."
+msgstr "不允許重複值。"
+
+#: core/validators.py:336
+#, python-format
+msgid "This value must be a power of %s."
+msgstr "此值必須是 %s 的乘方。"
+
+#: core/validators.py:347
+msgid "Please enter a valid decimal number."
+msgstr "請輸入有效的小數。"
+
+#: core/validators.py:349
+#, python-format
+msgid "Please enter a valid decimal number with at most %s total digit."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s total digits."
+msgstr[0] "請輸入最長 %s 位的有效小數。"
+msgstr[1] "請輸入最長 %s 位的有效小數。"
+
+#: core/validators.py:352
+#, python-format
+msgid "Please enter a valid decimal number with at most %s decimal place."
+msgid_plural ""
+"Please enter a valid decimal number with at most %s decimal places."
+msgstr[0] "請輸入小數最長 %s 位的有效小數。"
+msgstr[1] "請輸入小數最長 %s 位的有效小數。"
+
+#: core/validators.py:362
+#, python-format
+msgid "Make sure your uploaded file is at least %s bytes big."
+msgstr "確定你上傳的檔案至少有 %s 位元組。"
+
+#: core/validators.py:363
+#, python-format
+msgid "Make sure your uploaded file is at most %s bytes big."
+msgstr "確定你上傳的檔案最多是 %s 位元組。"
+
+#: core/validators.py:376
+msgid "The format for this field is wrong."
+msgstr "此欄位的格式錯誤。"
+
+#: core/validators.py:391
+msgid "This field is invalid."
+msgstr "此欄位無效。"
+
+#: core/validators.py:426
+#, python-format
+msgid "Could not retrieve anything from %s."
+msgstr "無法從 %s 取得任何東西。"
+
+#: core/validators.py:429
+#, python-format
+msgid ""
+"The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'."
+msgstr "URL %(url)s 傳回了無效的 Content-Type 標頭 '%(contenttype)s'。"
+
+#: core/validators.py:462
+#, python-format
+msgid ""
+"Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "
+"\"%(start)s\".)"
+msgstr ""
+"請將第 %(line)s 行開始未封閉的 %(tag)s 標籤封閉起來 (行開始於 \"%(start)s"
+"\")。"
+
+#: core/validators.py:466
+#, python-format
+msgid ""
+"Some text starting on line %(line)s is not allowed in that context. (Line "
+"starts with \"%(start)s\".)"
+msgstr "該內容不允許某些從第 %(line)s 開始的文字 (行開始於 \"%(start)s\")。"
+
+#: core/validators.py:471
+#, python-format
+msgid ""
+"\"%(attr)s\" on line %(line)s is an invalid attribute. (Line starts with \"%"
+"(start)s\".)"
+msgstr ""
+"第 \"%(line)s\" 的 \"%(attr)s\" 是無效的屬性 (行開始顧 \"%(start)s\")。"
+
+#: core/validators.py:476
+#, python-format
+msgid ""
+"\"<%(tag)s>\" on line %(line)s is an invalid tag. (Line starts with \"%"
+"(start)s\".)"
+msgstr "第 %(line)s 行的 \"<%(tag)s>\" 是無效的標籤 (行開始於 \"%(start)s\")。"
+
+#: core/validators.py:480
+#, python-format
+msgid ""
+"A tag on line %(line)s is missing one or more required attributes. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"第 %(line)s 有一個標籤缺少了一個或更多必需的屬性 (行開始顧 \"%(start)s\")。"
+
+#: core/validators.py:485
+#, python-format
+msgid ""
+"The \"%(attr)s\" attribute on line %(line)s has an invalid value. (Line "
+"starts with \"%(start)s\".)"
+msgstr ""
+"在第 %(line)s 的 \"%(attr)s\" 屬性有一個無效值 (行開始於 \"%(start)s\")。"
+
+#: db/models/manipulators.py:302
+#, python-format
+msgid "%(object)s with this %(type)s already exists for the given %(field)s."
+msgstr "此 %(type)s 的 %(object)s 已存在於給定的 %(field)s 裡。"
+
+#: db/models/fields/__init__.py:40
+#, python-format
+msgid "%(optname)s with this %(fieldname)s already exists."
+msgstr "此 %(fieldname)s 欄位的 %(optname)s 已經存在。"
+
+#: db/models/fields/__init__.py:114 db/models/fields/__init__.py:265
+#: db/models/fields/__init__.py:542 db/models/fields/__init__.py:553
+#: forms/__init__.py:346
+msgid "This field is required."
+msgstr "此欄位是必需的。"
+
+#: db/models/fields/__init__.py:337
+#, fuzzy
+msgid "This value must be an integer."
+msgstr "此值必須是 %s 的乘方。"
+
+#: db/models/fields/__init__.py:369
+#, fuzzy
+msgid "This value must be either True or False."
+msgstr "此值必須是 %s 的乘方。"
+
+#: db/models/fields/__init__.py:385
+#, fuzzy
+msgid "This field cannot be null."
+msgstr "此欄位無效。"
+
+#: db/models/fields/__init__.py:562
+msgid "Enter a valid filename."
+msgstr "輸入有效的檔名。"
+
+#: db/models/fields/related.py:43
+#, python-format
+msgid "Please enter a valid %s."
+msgstr "請輸入一個有效的 %s。"
+
+#: db/models/fields/related.py:579
+#, fuzzy
+msgid "Separate multiple IDs with commas."
+msgstr " 以逗號分隔多個 ID。"
+
+#: db/models/fields/related.py:581
+#, fuzzy
+msgid ""
+"Hold down \"Control\", or \"Command\" on a Mac, to select more than one."
+msgstr " 押下 \"Control\" 或 Mac 下的 \"Command\",以進行多重選擇。"
+
+#: db/models/fields/related.py:625
+#, python-format
+msgid "Please enter valid %(self)s IDs. The value %(value)r is invalid."
+msgid_plural ""
+"Please enter valid %(self)s IDs. The values %(value)r are invalid."
+msgstr[0] "請輸入有效的 %(self)s ID。%(value)r 是無效的。"
+msgstr[1] "請輸入有效的 %(self)s ID。%(value)r 是無效的。"
+
+#: forms/__init__.py:380
+#, python-format
+msgid "Ensure your text is less than %s character."
+msgid_plural "Ensure your text is less than %s characters."
+msgstr[0] "確定你的文字少於 %s 個字元。"
+msgstr[1] "確定你的文字少於 %s 個字元。"
+
+#: forms/__init__.py:385
+msgid "Line breaks are not allowed here."
+msgstr "此處不允許斷行。"
+
+#: forms/__init__.py:480 forms/__init__.py:551 forms/__init__.py:589
+#, python-format
+msgid "Select a valid choice; '%(data)s' is not in %(choices)s."
+msgstr "進行有效的選擇: '%(data)s' 不在 %(choices)s 裡。"
+
+#: forms/__init__.py:645
+msgid "The submitted file is empty."
+msgstr "提交的檔案是空的。"
+
+#: forms/__init__.py:699
+msgid "Enter a whole number between -32,768 and 32,767."
+msgstr "輸入一個介於 -32,768 與 32,767 之間的整數。"
+
+#: forms/__init__.py:708
+msgid "Enter a positive number."
+msgstr "輸入一個正數。"
+
+#: forms/__init__.py:717
+msgid "Enter a whole number between 0 and 32,767."
+msgstr "輸入一個介於 0 與 32,767 之間的整數。"
+
+#: template/defaultfilters.py:379
+msgid "yes,no,maybe"
+msgstr "是,否,也許"
+
+#~ msgid "Comment"
+#~ msgstr "è©•è«–"
+
+#~ msgid "Comments"
+#~ msgstr "è©•è«–"
+
+#~ msgid "String (up to 50)"
+#~ msgstr "字串 (最長到 50)"
+
+#~ msgid "label"
+#~ msgstr "標示"
+
+#~ msgid "package"
+#~ msgstr "套件"
+
+#~ msgid "packages"
+#~ msgstr "套件"

Added: vendor/django/current/django/conf/project_template/__init__.py
===================================================================

Added: vendor/django/current/django/conf/project_template/manage.py
===================================================================
--- vendor/django/current/django/conf/project_template/manage.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/project_template/manage.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)


Property changes on: vendor/django/current/django/conf/project_template/manage.py
___________________________________________________________________
Name: svn:executable
   + 

Added: vendor/django/current/django/conf/project_template/settings.py
===================================================================
--- vendor/django/current/django/conf/project_template/settings.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/project_template/settings.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,72 @@
+# Django settings for {{ project_name }} project.
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+
+ADMINS = (
+    # ('Your Name', 'your_email at domain.com'),
+)
+
+MANAGERS = ADMINS
+
+DATABASE_ENGINE = ''           # 'postgresql', 'mysql', 'sqlite3' or 'ado_mssql'.
+DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+# Local time zone for this installation. All choices can be found here:
+# http://www.postgresql.org/docs/current/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
+TIME_ZONE = 'America/Chicago'
+
+# Language code for this installation. All choices can be found here:
+# http://www.w3.org/TR/REC-html40/struct/dirlang.html#langcodes
+# http://blogs.law.harvard.edu/tech/stories/storyReader$15
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT.
+# Example: "http://media.lawrence.com"
+MEDIA_URL = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = ''
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+#     'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'django.middleware.doc.XViewMiddleware',
+)
+
+ROOT_URLCONF = '{{ project_name }}.urls'
+
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates".
+    # Always use forward slashes, even on Windows.
+)
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+)

Added: vendor/django/current/django/conf/project_template/urls.py
===================================================================
--- vendor/django/current/django/conf/project_template/urls.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/project_template/urls.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,9 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    # Example:
+    # (r'^{{ project_name }}/', include('{{ project_name }}.apps.foo.urls.foo')),
+
+    # Uncomment this for admin:
+#     (r'^admin/', include('django.contrib.admin.urls')),
+)

Added: vendor/django/current/django/conf/urls/__init__.py
===================================================================

Added: vendor/django/current/django/conf/urls/admin_password_reset.py
===================================================================
--- vendor/django/current/django/conf/urls/admin_password_reset.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/urls/admin_password_reset.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,6 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('django.views',
+    (r'^$', 'registration.passwords.password_reset', {'is_admin_site' : True}),
+    (r'^done/$', 'registration.passwords.password_reset_done'),
+)

Added: vendor/django/current/django/conf/urls/defaults.py
===================================================================
--- vendor/django/current/django/conf/urls/defaults.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/urls/defaults.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,17 @@
+from django.core.urlresolvers import RegexURLPattern, RegexURLResolver
+
+__all__ = ['handler404', 'handler500', 'include', 'patterns']
+
+handler404 = 'django.views.defaults.page_not_found'
+handler500 = 'django.views.defaults.server_error'
+
+include = lambda urlconf_module: [urlconf_module]
+
+def patterns(prefix, *tuples):
+    pattern_list = []
+    for t in tuples:
+        if type(t[1]) == list:
+            pattern_list.append(RegexURLResolver(t[0], t[1][0]))
+        else:
+            pattern_list.append(RegexURLPattern(t[0], prefix and (prefix + '.' + t[1]) or t[1], *t[2:]))
+    return pattern_list

Added: vendor/django/current/django/conf/urls/i18n.py
===================================================================
--- vendor/django/current/django/conf/urls/i18n.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/urls/i18n.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,5 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    (r'^setlang/$', 'django.views.i18n.set_language'),
+)

Added: vendor/django/current/django/conf/urls/registration.py
===================================================================
--- vendor/django/current/django/conf/urls/registration.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/urls/registration.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,19 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    (r'^login/$', 'django.contrib.auth.views.login'),
+    (r'^logout/$', 'django.contrib.auth.views.logout'),
+    (r'^login_another/$', 'django.contrib.auth.views.logout_then_login'),
+
+    (r'^register/$', 'ellington.registration.views.registration.signup'),
+    (r'^register/(?P<challenge_string>\w{32})/$', 'ellington.registration.views.registration.register_form'),
+
+    (r'^profile/$', 'ellington.registration.views.profile.profile'),
+    (r'^profile/welcome/$', 'ellington.registration.views.profile.profile_welcome'),
+    (r'^profile/edit/$', 'ellington.registration.views.profile.edit_profile'),
+
+    (r'^password_reset/$', 'django.contrib.auth.views.password_reset'),
+    (r'^password_reset/done/$', 'django.contrib.auth.views.password_reset_done'),
+    (r'^password_change/$', 'django.contrib.auth.views.password_change'),
+    (r'^password_change/done/$', 'django.contrib.auth.views.password_change_done'),
+)

Added: vendor/django/current/django/conf/urls/shortcut.py
===================================================================
--- vendor/django/current/django/conf/urls/shortcut.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/conf/urls/shortcut.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,5 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('django.views',
+    (r'^(?P<content_type_id>\d+)/(?P<object_id>\d+)/$', 'defaults.shortcut'),
+)

Added: vendor/django/current/django/contrib/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/admin/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/admin/filterspecs.py
===================================================================
--- vendor/django/current/django/contrib/admin/filterspecs.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/filterspecs.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,175 @@
+"""
+FilterSpec encapsulates the logic for displaying filters in the Django admin.
+Filters are specified in models with the "list_filter" option.
+
+Each filter subclass knows how to display a filter for a field that passes a
+certain test -- e.g. being a DateField or ForeignKey.
+"""
+
+from django.db import models
+import datetime
+
+class FilterSpec(object):
+    filter_specs = []
+    def __init__(self, f, request, params, model):
+        self.field = f
+        self.params = params
+
+    def register(cls, test, factory):
+        cls.filter_specs.append((test, factory))
+    register = classmethod(register)
+
+    def create(cls, f, request, params, model):
+        for test, factory in cls.filter_specs:
+            if test(f):
+                return factory(f, request, params, model)
+    create = classmethod(create)
+
+    def has_output(self):
+        return True
+
+    def choices(self, cl):
+        raise NotImplementedError()
+
+    def title(self):
+        return self.field.verbose_name
+
+    def output(self, cl):
+        t = []
+        if self.has_output():
+            t.append(_('<h3>By %s:</h3>\n<ul>\n') % self.title())
+
+            for choice in self.choices(cl):
+                t.append('<li%s><a href="%s">%s</a></li>\n' % \
+                    ((choice['selected'] and ' class="selected"' or ''),
+                     choice['query_string'] ,
+                     choice['display']))
+            t.append('</ul>\n\n')
+        return "".join(t)
+
+class RelatedFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model):
+        super(RelatedFilterSpec, self).__init__(f, request, params, model)
+        if isinstance(f, models.ManyToManyField):
+            self.lookup_title = f.rel.to._meta.verbose_name
+        else:
+            self.lookup_title = f.verbose_name
+        self.lookup_kwarg = '%s__%s__exact' % (f.name, f.rel.to._meta.pk.name)
+        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
+        self.lookup_choices = f.rel.to._default_manager.all()
+
+    def has_output(self):
+        return len(self.lookup_choices) > 1
+
+    def title(self):
+        return self.lookup_title
+
+    def choices(self, cl):
+        yield {'selected': self.lookup_val is None,
+               'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
+               'display': _('All')}
+        for val in self.lookup_choices:
+            pk_val = getattr(val, self.field.rel.to._meta.pk.attname)
+            yield {'selected': self.lookup_val == str(pk_val),
+                   'query_string': cl.get_query_string({self.lookup_kwarg: pk_val}),
+                   'display': val}
+
+FilterSpec.register(lambda f: bool(f.rel), RelatedFilterSpec)
+
+class ChoicesFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model):
+        super(ChoicesFilterSpec, self).__init__(f, request, params, model)
+        self.lookup_kwarg = '%s__exact' % f.name
+        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
+
+    def choices(self, cl):
+        yield {'selected': self.lookup_val is None,
+               'query_string': cl.get_query_string({}, [self.lookup_kwarg]),
+               'display': _('All')}
+        for k, v in self.field.choices:
+            yield {'selected': str(k) == self.lookup_val,
+                    'query_string': cl.get_query_string({self.lookup_kwarg: k}),
+                    'display': v}
+
+FilterSpec.register(lambda f: bool(f.choices), ChoicesFilterSpec)
+
+class DateFieldFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model):
+        super(DateFieldFilterSpec, self).__init__(f, request, params, model)
+
+        self.field_generic = '%s__' % self.field.name
+
+        self.date_params = dict([(k, v) for k, v in params.items() if k.startswith(self.field_generic)])
+
+        today = datetime.date.today()
+        one_week_ago = today - datetime.timedelta(days=7)
+        today_str = isinstance(self.field, models.DateTimeField) and today.strftime('%Y-%m-%d 23:59:59') or today.strftime('%Y-%m-%d')
+
+        self.links = (
+            (_('Any date'), {}),
+            (_('Today'), {'%s__year' % self.field.name: str(today.year),
+                       '%s__month' % self.field.name: str(today.month),
+                       '%s__day' % self.field.name: str(today.day)}),
+            (_('Past 7 days'), {'%s__gte' % self.field.name: one_week_ago.strftime('%Y-%m-%d'),
+                             '%s__lte' % f.name: today_str}),
+            (_('This month'), {'%s__year' % self.field.name: str(today.year),
+                             '%s__month' % f.name: str(today.month)}),
+            (_('This year'), {'%s__year' % self.field.name: str(today.year)})
+        )
+
+    def title(self):
+        return self.field.verbose_name
+
+    def choices(self, cl):
+        for title, param_dict in self.links:
+            yield {'selected': self.date_params == param_dict,
+                   'query_string': cl.get_query_string(param_dict, [self.field_generic]),
+                   'display': title}
+
+FilterSpec.register(lambda f: isinstance(f, models.DateField), DateFieldFilterSpec)
+
+class BooleanFieldFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model):
+        super(BooleanFieldFilterSpec, self).__init__(f, request, params, model)
+        self.lookup_kwarg = '%s__exact' % f.name
+        self.lookup_kwarg2 = '%s__isnull' % f.name
+        self.lookup_val = request.GET.get(self.lookup_kwarg, None)
+        self.lookup_val2 = request.GET.get(self.lookup_kwarg2, None)
+
+    def title(self):
+        return self.field.verbose_name
+
+    def choices(self, cl):
+        for k, v in ((_('All'), None), (_('Yes'), '1'), (_('No'), '0')):
+            yield {'selected': self.lookup_val == v and not self.lookup_val2,
+                   'query_string': cl.get_query_string({self.lookup_kwarg: v}, [self.lookup_kwarg2]),
+                   'display': k}
+        if isinstance(self.field, models.NullBooleanField):
+            yield {'selected': self.lookup_val2 == 'True',
+                   'query_string': cl.get_query_string({self.lookup_kwarg2: 'True'}, [self.lookup_kwarg]),
+                   'display': _('Unknown')}
+
+FilterSpec.register(lambda f: isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField), BooleanFieldFilterSpec)
+
+# This should be registered last, because it's a last resort. For example,
+# if a field is eligible to use the BooleanFieldFilterSpec, that'd be much
+# more appropriate, and the AllValuesFilterSpec won't get used for it.
+class AllValuesFilterSpec(FilterSpec):
+    def __init__(self, f, request, params, model):
+        super(AllValuesFilterSpec, self).__init__(f, request, params, model)
+        self.lookup_val = request.GET.get(f.name, None)
+        self.lookup_choices = model._meta.admin.manager.distinct().order_by(f.name).values(f.name)
+
+    def title(self):
+        return self.field.verbose_name
+
+    def choices(self, cl):
+        yield {'selected': self.lookup_val is None,
+               'query_string': cl.get_query_string({}, [self.field.name]),
+               'display': _('All')}
+        for val in self.lookup_choices:
+            val = str(val[self.field.name])
+            yield {'selected': self.lookup_val == val,
+                   'query_string': cl.get_query_string({self.field.name: val}),
+                   'display': val}
+FilterSpec.register(lambda f: True, AllValuesFilterSpec)

Added: vendor/django/current/django/contrib/admin/media/css/base.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/base.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/base.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,14 @@
+/*
+    DJANGO Admin
+    by Wilson Miner wilson at lawrence.com
+*/
+
+/* Block IE 5 */
+ at import "null?\"\{";
+
+/* Import other styles */
+ at import url('global.css');
+ at import url('layout.css');
+
+/* Import patch for IE 6 Windows */
+/*\*/ @import "patch-iewin.css"; /**/
\ No newline at end of file

Added: vendor/django/current/django/contrib/admin/media/css/changelists.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/changelists.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/changelists.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,50 @@
+ at import url('base.css');
+
+/* CHANGELISTS */
+#changelist { position:relative; width:100%; }
+#changelist table { width:100%; }
+.change-list .filtered table { border-right:1px solid #ddd;  }
+.change-list .filtered { min-height:400px; }
+.change-list .filtered { 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 { margin-right:160px !important; width:auto !important; }
+.change-list .filtered table tbody th { padding-right:1em; }
+#changelist .toplinks { border-bottom:1px solid #ccc !important; }
+#changelist .paginator { color:#666; border-top:1px solid #eee; border-bottom:1px solid #eee; background:white url(../img/admin/nav-bg.gif) 0 180% repeat-x; overflow:hidden; }
+.change-list .filtered .paginator { border-right:1px solid #ddd; }
+
+/*  CHANGELIST TABLES  */
+#changelist table thead th { white-space:nowrap; }
+#changelist table tbody td { border-left: 1px solid #ddd; }
+#changelist table tfoot { color: #666; }
+
+/*  TOOLBAR  */
+#changelist #toolbar { padding:3px; border-bottom:1px solid #ddd; background:#e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; color:#666; }
+#changelist #toolbar form input { font-size:11px; padding:1px 2px; }
+#changelist #toolbar form #searchbar { padding:2px; }
+#changelist #changelist-search img { vertical-align:middle; }
+
+/*  FILTER COLUMN  */
+#changelist-filter { position:absolute; top:0; right:0; z-index:1000; width:160px; border-left:1px solid #ddd; background:#efefef; margin:0; }
+#changelist-filter h2 { font-size:11px; padding:2px 5px; border-bottom:1px solid #ddd; }
+#changelist-filter h3 { font-size:12px; margin-bottom:0; }
+#changelist-filter ul { padding-left:0;margin-left:10px; }
+#changelist-filter li { list-style-type:none; margin-left:0; padding-left:0; }
+#changelist-filter a { color:#999; }
+#changelist-filter a:hover { color:#036; }
+#changelist-filter li.selected { border-left:5px solid #ccc; padding-left:5px;margin-left:-10px; }
+#changelist-filter li.selected a { color:#5b80b2 !important; }
+
+/*  DATE DRILLDOWN  */
+.change-list ul.toplinks { display:block; background:white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x; border-top:1px solid white; float:left;  padding:0 !important;  margin:0 !important; width:100%; }
+.change-list ul.toplinks li { float: left; width: 9em; padding:3px 6px; font-weight: bold; list-style-type:none; }
+.change-list ul.toplinks .date-back a { color:#999; }
+.change-list ul.toplinks .date-back a:hover { color:#036; }
+
+/* PAGINATOR */
+.paginator { font-size:11px; padding-top:10px; padding-bottom:10px; line-height:22px; margin:0; border-top:1px solid #ddd; }
+.paginator a:link, .paginator a:visited { padding:2px 6px; border:solid 1px #ccc; background:white; text-decoration:none; }
+.paginator a.showall { padding:0 !important; border:none !important; }
+.paginator a.showall:hover { color:#036 !important; background:transparent !important; }
+.paginator .end { border-width:2px !important; margin-right:6px; }
+.paginator .this-page { padding:2px 6px; font-weight:bold; font-size:13px; vertical-align:top; }
+.paginator a:hover { color:white; background:#5b80b2; border-color:#036; }

Added: vendor/django/current/django/contrib/admin/media/css/dashboard.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/dashboard.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/dashboard.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+ at import url('base.css');
+
+/* DASHBOARD */
+.dashboard .module table th { width:100%; }
+.dashboard .module table td { white-space:nowrap; }
+.dashboard .module table td a { display:block; padding-right:.6em; }
+
+/*  RECENT ACTIONS MODULE  */
+.module ul.actionlist { margin-left:0; }
+ul.actionlist li { list-style-type:none; }
\ No newline at end of file

Added: vendor/django/current/django/contrib/admin/media/css/forms.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/forms.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/forms.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,60 @@
+ at import url('base.css');
+ at import url('widgets.css');
+
+/* FORM ROWS */
+.form-row { overflow:hidden; padding:8px 12px; font-size:11px; border-bottom:1px solid #eee; }
+.form-row img, .form-row input { vertical-align:middle; }
+form .form-row p { padding-left:0; font-size:11px; }
+
+/* FORM LABELS */
+form h4 { margin:0 !important; padding:0 !important; border:none !important; }
+label { font-weight:normal !important; color:#666; font-size:12px; }
+label.inline { margin-left:20px; }
+.required label, label.required { font-weight:bold !important; color:#333 !important; }
+
+/* RADIO BUTTONS */
+form ul.radiolist li { list-style-type:none; }
+form ul.radiolist label { float:none; display:inline; }
+form ul.inline { margin-left:0; padding:0; }
+form ul.inline li { float:left; padding-right:7px; }
+
+/* ALIGNED FIELDSETS */
+.aligned label { display:block; padding:0 1em 3px 0; float:left; width:8em; }
+.aligned label.inline { display:inline; float:none; }
+.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { width:350px; }
+form .aligned p, form .aligned ul { margin-left:7em; padding-left:30px; }
+form .aligned table p { margin-left:0; padding-left:0; }
+form .aligned p.help { padding-left:38px; }
+.aligned .vCheckboxLabel { float:none !important; display:inline; padding-left:4px; }
+.colM .aligned .vLargeTextField, colM .aligned .vXMLLargeTextField { width:610px; }
+.checkbox-row p.help { margin-left:0; padding-left:0 !important; }
+
+/* WIDE FIELDSETS */
+.wide label { width:15em !important; }
+form .wide p { margin-left:15em; }
+form .wide p.help { padding-left:38px; }
+.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { width:450px; }
+
+/* COLLAPSED FIELDSETS */
+fieldset.collapsed * { display:none; }
+fieldset.collapsed h2, fieldset.collapsed { display:block !important; }
+fieldset.collapsed h2 { background-image:url(../img/admin/nav-bg.gif); background-position:bottom left; color:#999; }
+fieldset.collapsed .collapse-toggle { padding:3px 5px !important; background:transparent; display:inline !important;}
+
+/* MONOSPACE TEXTAREAS */
+fieldset.monospace textarea { font-family:"Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace; }
+
+/* SUBMIT ROW */
+.submit-row { padding:5px 7px; text-align:right; background:white url(../img/admin/nav-bg.gif) 0 100% repeat-x; border:1px solid #ccc; margin:5px 0; }
+.submit-row input { margin:0 0 0 5px; }
+.submit-row p { margin-top:0.3em; }
+.submit-row .deletelink { background:url(../img/admin/icon_deletelink.gif) 0 50% no-repeat; padding-left:14px; }
+
+/* CUSTOM FORM FIELDS */
+.vSelectMultipleField { vertical-align:top !important; }
+.vCheckboxField { border:none; }
+.vDateField, .vTimeField { margin-right:2px; }
+.vURLField { width:30em; }
+.vLargeTextField, .vXMLLargeTextField { width:48em; }
+.flatpages-flatpage #id_content { height:40.2em; }
+.module table .vPositiveSmallIntegerField { width:2.2em; }
\ No newline at end of file

Added: vendor/django/current/django/contrib/admin/media/css/global.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/global.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/global.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,141 @@
+body { margin:0; padding:0; font-size:12px; font-family:"Lucida Grande","Bitstream Vera Sans",Verdana,Arial,sans-serif; color:#333; background:#fff; }
+
+/* LINKS */
+a:link, a:visited { color: #5b80b2; text-decoration:none; }
+a:hover { color: #036; }
+a img { border:none; }
+
+/* GLOBAL DEFAULTS */
+p, ol, ul, dl { margin:.2em 0 .8em 0; }
+p { padding:0; line-height:140%; }
+
+h1,h2,h3,h4,h5 { font-weight:bold; }
+h1 { font-size:18px; color:#666; padding:0 6px 0 0; margin:0 0 .2em 0; }
+h2 { font-size:16px; margin:1em 0 .5em 0; }
+h2.subhead { font-weight:normal;margin-top:0; }
+h3 { font-size:14px; margin:.8em 0 .3em 0; color:#666; font-weight:bold; }
+h4 { font-size:12px; margin:1em 0 .8em 0; padding-bottom:3px; }
+h5 { font-size:10px; margin:1.5em 0 .5em 0; color:#666; text-transform:uppercase; letter-spacing:1px; }
+
+ul li { list-style-type:square; padding:1px 0; }
+ul.plainlist { margin-left:0 !important; }
+ul.plainlist li { list-style-type:none; }
+li ul { margin-bottom:0; }
+li, dt, dd { font-size:11px; line-height:14px; }
+dt { font-weight:bold; margin-top:4px; }
+dd { margin-left:0; }
+
+form { margin:0; padding:0; }
+fieldset { margin:0; padding:0; }
+
+blockquote { font-size:11px; color:#777; margin-left:2px; padding-left:10px; border-left:5px solid #ddd; }
+code, pre { font-family:"Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; background:inherit; color:#666; font-size:11px; }
+pre.literal-block { margin:10px; background:#eee; padding:6px 8px; }
+code strong { color:#930; }
+hr { clear:both; color:#eee; background-color:#eee; height:1px; border:none; margin:0; padding:0; font-size:1px; line-height:1px; }
+
+/* TEXT STYLES & MODIFIERS */
+.small { font-size:11px; }
+.tiny { font-size:10px; }
+p.tiny { margin-top:-2px; }
+.mini { font-size:9px; }
+p.mini { margin-top:-3px; }
+.help, p.help { font-size:10px !important; color:#999; }
+p img, h1 img, h2 img, h3 img, h4 img, td img { vertical-align:middle; }
+.quiet, a.quiet:link, a.quiet:visited { color:#999 !important;font-weight:normal !important; }
+.quiet strong { font-weight:bold !important; }
+.float-right { float:right; }
+.float-left { float:left; }
+.clear { clear:both; }
+.align-left { text-align:left; }
+.align-right { text-align:right; }
+.example { margin:10px 0; padding:5px 10px; background:#efefef; }
+.nowrap { white-space:nowrap; }
+
+/* TABLES */
+table { border-collapse:collapse; border-color:#ccc; }
+td, th { font-size:11px; line-height:13px; border-bottom:1px solid #eee; vertical-align:top; padding:5px; font-family:"Lucida Grande", Verdana, Arial, sans-serif; }
+th { text-align:left; font-size:12px; font-weight:bold; }
+thead th, 
+tfoot td { color:#666; padding:2px 5px; font-size:11px; background:#e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; border-left:1px solid #ddd; border-bottom:1px solid #ddd; }
+tfoot td { border-bottom:none; border-top:1px solid #ddd; }
+thead th:first-child, 
+tfoot td:first-child { border-left:none !important; }
+thead th.optional { font-weight:normal !important; }
+fieldset table { border-right:1px solid #eee; }
+tr.row-label td { font-size:9px; padding-top:2px; padding-bottom:0; border-bottom:none; color:#666; margin-top:-1px; }
+tr.alt { background:#f6f6f6; }
+.row1 { background:#EDF3FE; }
+.row2 { background:white; }
+
+/* SORTABLE TABLES */
+thead th a:link, thead th a:visited { color:#666; display:block; }
+table thead th.sorted { background-position:bottom left !important; }
+table thead th.sorted a { padding-right:13px; }
+table thead th.ascending a { background:url(../img/admin/arrow-down.gif) right .4em no-repeat; }
+table thead th.descending a { background:url(../img/admin/arrow-up.gif) right .4em no-repeat; }
+
+/* ORDERABLE TABLES */
+table.orderable tbody tr td:hover { cursor:move; }
+table.orderable tbody tr td:first-child { padding-left:14px; background-image:url(../img/admin/nav-bg-grabber.gif); background-repeat:repeat-y; }
+table.orderable-initalized .order-cell, body>tr>td.order-cell { display:none; }
+
+/* FORM DEFAULTS */
+input, textarea, select { margin:2px 0; padding:2px 3px; vertical-align:middle; font-family:"Lucida Grande", Verdana, Arial, sans-serif; font-weight:normal; font-size:11px; }
+textarea { vertical-align:top !important; }
+input[type=text], input[type=password], textarea, select, .vTextField { border:1px solid #ccc; }
+
+/*  FORM BUTTONS  */
+input[type=submit], input[type=button], .submit-row input { background:white url(../img/admin/nav-bg.gif) bottom repeat-x; padding:3px; color:black; border:1px solid #bbb; border-color:#ddd #aaa #aaa #ddd; }
+input[type=submit]:active, input[type=button]:active { background-image:url(../img/admin/nav-bg-reverse.gif); background-position:top; }
+input[type=submit].default, .submit-row input.default { border:2px solid #5b80b2; background:#7CA0C7 url(../img/admin/default-bg.gif) bottom repeat-x; font-weight:bold; color:white; }
+input[type=submit].default:active { background-image:url(../img/admin/default-bg-reverse.gif); background-position:top; }
+
+/* MODULES */
+.module { border:1px solid #ccc; margin-bottom:5px; background:white; }
+.module p, .module ul, .module h3, .module h4, .module dl, .module pre { padding-left:10px; padding-right:10px; }
+.module blockquote { margin-left:12px; }
+.module ul, .module ol { margin-left:1.5em; }
+.module h3 { margin-top:.6em; }
+.module h2, .module caption { margin:0; padding:2px 5px 3px 5px; font-size:11px; text-align:left; font-weight:bold; background:#7CA0C7 url(../img/admin/default-bg.gif) top left repeat-x; color:white; }
+.module table { border-collapse: collapse; }
+
+/* MESSAGES & ERRORS */
+ul.messagelist { padding:0 0 5px 0; margin:0; }
+ul.messagelist li { font-size:12px; display:block; padding:4px 5px 4px 25px; margin:0 0 3px 0; border-bottom:1px solid #ddd; color:#666; background:#ffc url(../img/admin/icon_success.gif) 5px .3em no-repeat; }
+.errornote { font-size:12px !important; display:block; padding:4px 5px 4px 25px; margin:0 0 3px 0; border:1px solid red; color:red;background:#ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat; }
+ul.errorlist { margin:0 !important; padding:0 !important; }
+.errorlist li { font-size:12px !important; display:block; padding:4px 5px 4px 25px; margin:0 0 3px 0; border:1px solid red; color:white; background:red url(../img/admin/icon_alert.gif) 5px .3em no-repeat; }
+td ul.errorlist { margin:0 !important; padding:0 !important; }
+td ul.errorlist li { margin:0 !important; }
+.error { background:#ffc; }
+.error input, .error select { border:1px solid red; }
+div.system-message { background: #ffc; margin: 10px; padding: 6px 8px; font-size: .8em; }
+div.system-message p.system-message-title { padding:4px 5px 4px 25px; margin:0; color:red; background:#ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat; }
+.description { font-size:12px; padding:5px 0 0 12px; }
+
+/* BREADCRUMBS */
+div.breadcrumbs { background:white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x; padding:2px 8px 3px 8px; font-size:11px;  color:#999;  border-top:1px solid white; border-bottom:1px solid #ccc; text-align:left; }
+
+/* ACTION ICONS */
+.addlink { padding-left:12px; background:url(../img/admin/icon_addlink.gif) 0 .2em no-repeat; }
+.changelink { padding-left:12px; background:url(../img/admin/icon_changelink.gif) 0 .2em no-repeat; }
+.deletelink { padding-left:12px; background:url(../img/admin/icon_deletelink.gif) 0 .25em no-repeat; }
+a.deletelink:link, a.deletelink:visited { color:#CC3434; }
+a.deletelink:hover { color:#993333; }
+
+/* OBJECT TOOLS */
+.object-tools { font-size:10px; font-weight:bold; font-family:Arial,Helvetica,sans-serif; padding-left:0; float:right; position:relative; margin-top:-2.4em; margin-bottom:-2em; }
+.form-row .object-tools { margin-top:5px; margin-bottom:5px; float:none; height:2em; padding-left:3.5em; }
+.object-tools li { display:block; float:left; background:url(../img/admin/tool-left.gif) 0 0 no-repeat; padding:0 0 0 8px; margin-left:2px; height:16px; }
+.object-tools li:hover { background:url(../img/admin/tool-left_over.gif) 0 0 no-repeat; }
+.object-tools a:link, .object-tools a:visited { display:block; float:left; color:white; padding:.1em 14px .1em 8px; height:14px; background:#999 url(../img/admin/tool-right.gif) 100% 0 no-repeat; }
+.object-tools a:hover, .object-tools li:hover a { background:#5b80b2 url(../img/admin/tool-right_over.gif) 100% 0 no-repeat; }
+.object-tools a.viewsitelink, .object-tools a.golink { background:#999 url(../img/admin/tooltag-arrowright.gif) top right no-repeat; padding-right:28px; }
+.object-tools a.viewsitelink:hover, .object-tools a.golink:hover { background:#5b80b2 url(../img/admin/tooltag-arrowright_over.gif) top right no-repeat; }
+.object-tools a.addlink { background:#999 url(../img/admin/tooltag-add.gif) top right no-repeat; padding-right:28px; }
+.object-tools a.addlink:hover { background:#5b80b2 url(../img/admin/tooltag-add_over.gif) top right no-repeat; }
+
+/* OBJECT HISTORY */
+table#change-history { width:100%; }
+table#change-history tbody th { width:16em; }

Added: vendor/django/current/django/contrib/admin/media/css/layout.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/layout.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/layout.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,29 @@
+/* PAGE STRUCTURE */
+#container { position:relative; width:100%; min-width:760px; padding:0; }
+#content { margin:10px 15px; }
+#header { width:100%; }
+#content-main { float:left; width:100%; }
+#content-related { float:right; width:18em; position:relative; margin-right:-19em; }
+#footer { clear:both; padding:10px; }
+
+/*  COLUMN TYPES  */
+.colMS { margin-right:20em !important; }
+.colSM { margin-left:20em !important; }
+.colSM #content-related { float:left; margin-right:0; margin-left:-19em; }
+.colSM #content-main { float:right; }
+.popup .colM { width:95%; }
+.subcol { float:left; width:46%; margin-right:15px; }
+.dashboard #content { width:500px; }
+
+/*  HEADER  */
+#header { background:#417690; color:#ffc; overflow:hidden; }
+#header a:link, #header a:visited { color:white; }
+#header a:hover { text-decoration:underline; }
+#branding h1 { padding:0 10px; font-size:18px; margin:8px 0; font-weight:normal; color:#f4f379; }
+#branding h2 { padding:0 10px; font-size:14px; margin:-8px 0 8px 0; font-weight:normal; color:#ffc; }
+#user-tools { position:absolute; top:0; right:0; padding:1.2em 10px; font-size:11px; text-align:right; }
+
+/* SIDEBAR */
+#content-related h3 { font-size:12px; color:#666; margin-bottom:3px; }
+#content-related h4 { font-size:11px; }
+#content-related .module h2 { background:#eee url(../img/admin/nav-bg.gif) bottom left repeat-x; color:#666; }
\ No newline at end of file

Added: vendor/django/current/django/contrib/admin/media/css/login.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/login.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/login.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,13 @@
+ at import url('base.css');
+ at import url('layout.css');
+
+/* LOGIN FORM */
+body.login { background:#eee; }
+.login #container { background:white; border:1px solid #ccc; width:28em; min-width:300px; margin-left:auto; margin-right:auto; margin-top:100px; }
+.login #content-main { width:100%; }
+.login form { margin-top:1em; }
+.login .form-row { padding:4px 0; float:left; width:100%; }
+.login .form-row label { float:left; width:9em; padding-right:0.5em; line-height:2em; text-align:right; font-size:1em; color:#333; }
+.login .form-row #id_username, .login .form-row #id_password { width:14em; }
+.login span.help { font-size:10px; display:block; }
+.login .submit-row { clear:both; padding:1em 0 0 9.4em; }
\ No newline at end of file

Added: vendor/django/current/django/contrib/admin/media/css/patch-iewin.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/patch-iewin.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/patch-iewin.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,8 @@
+* html #container { position:static; } /* keep header from flowing off the page */
+* html .colMS #content-related { margin-right:0; margin-left:10px; position:static; } /* put the right sidebars back on the page */
+* html .colSM #content-related { margin-right:10px; margin-left:-115px; position:static; } /* put the left sidebars back on the page */
+* html .form-row { height:1%; }
+* html .dashboard #content { width:768px; } /* proper fixed width for dashboard in IE6 */
+* html .dashboard #content-main { width:535px; } /* proper fixed width for dashboard in IE6 */
+* html #changelist-filter ul { margin-right:-10px; } /* fix right margin for changelist filters in IE6 */
+* html .change-list .filtered { height:400px; } /* IE ignores min-height, but treats height as if it were min-height */
\ No newline at end of file

Added: vendor/django/current/django/contrib/admin/media/css/rtl.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/rtl.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/rtl.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,46 @@
+body { direction: rtl; }
+
+/* login styles */
+
+.login .form-row { float:right; }
+.login .form-row label { float:right; padding-left:0.5em; padding-right:0; text-align:left;}
+.login .submit-row { clear:both; padding:1em 9.4em 0 0; }
+
+
+/* global styles */
+th { text-align: right; }
+.module h2, .module caption { text-align: right; }
+.addlink, .changelink { padding-left:0px; padding-right:12px; background-position:100% 0.2em; }
+.deletelink { padding-left:0px; padding-right:12px; background-position:100% 0.25em; }
+.object-tools { float:left; }
+
+
+/* layout styles */
+#user-tools { right:auto; left:0; text-align:left; }
+div.breadcrumbs { text-align:right; }
+#content-main { float:right;}
+#content-related { float:left; margin-left:-19em; margin-right:auto;}
+.colMS { margin-left:20em !important; margin-right:10px !important;}
+
+/* dashboard styles */
+.dashboard .module table td a { padding-left:.6em; padding-right:12px; }
+
+/* changelists styles */
+.change-list .filtered { background:white url(../img/admin/changelist-bg_rtl.gif) top left repeat-y !important; }
+.change-list .filtered table { border-left:1px solid #ddd; border-right:0px none; }
+#changelist-filter { right:auto; left:0; border-left:0px none; border-right:1px solid #ddd;}
+.change-list .filtered table, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { margin-right:0px !important; margin-left:160px !important; }
+#changelist-filter li.selected { border-left:0px none; padding-left:0px; margin-left:0; border-right:5px solid #ccc; padding-right:5px;margin-right:-10px; }
+
+/* fomrs styles */
+.aligned label { padding:0 0 3px 1em;  float:right; }
+.submit-row { text-align: left }
+.vDateField, .vTimeField { margin-left:2px; }
+
+/* widget styles */
+.calendarnav-previous { top:0; left:auto; right:0; }
+.calendarnav-next { top:0; right:auto; left:0;}
+.calendar caption, .calendarbox h2 { text-align:center; }
+
+.selector { float: right;}
+.selector .selector-filter { text-align: right;}

Added: vendor/django/current/django/contrib/admin/media/css/widgets.css
===================================================================
--- vendor/django/current/django/contrib/admin/media/css/widgets.css	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/css/widgets.css	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,101 @@
+/* SELECTOR (FILTER INTERFACE) */
+.selector { width:580px; float:left; }
+.selector select { width:270px; height:17.2em; }
+.selector-available, .selector-chosen { float:left; width:270px; text-align:center; margin-bottom:5px; }
+.selector-available h2, .selector-chosen h2 { border:1px solid #ccc; }
+.selector .selector-available h2 { background:white url(../img/admin/nav-bg.gif) bottom left repeat-x; color:#666; }
+.selector .selector-filter { background:white; border:1px solid #ccc; border-width:0 1px; padding:3px; color:#999; font-size:10px; margin:0; text-align:left; }
+.selector .selector-chosen .selector-filter { padding:4px 5px; }
+.selector .selector-available input { width:230px; }
+.selector ul.selector-chooser { float:left; width:22px; height:50px; background:url(../img/admin/chooser-bg.gif) top center no-repeat; margin:8em 3px 0 3px; padding:0; }
+.selector-chooser li { margin:0; padding:3px; list-style-type:none; }
+.selector select { margin-bottom:5px; margin-top:0; }
+.selector-add, .selector-remove { width:16px; height:16px; display:block; text-indent:-3000px; }
+.selector-add { background:url(../img/admin/selector-add.gif) top center no-repeat; margin-bottom:2px; }
+.selector-remove { background:url(../img/admin/selector-remove.gif) top center no-repeat; }
+a.selector-chooseall, a.selector-clearall { display:block; width:6em; text-align:left; margin-left:auto; margin-right:auto; font-weight:bold; color:#666;  padding:3px 0 3px 18px; }
+a.selector-chooseall:hover, a.selector-clearall:hover { color:#036; }
+a.selector-chooseall { width:7em; background:url(../img/admin/selector-addall.gif) left center no-repeat; }
+a.selector-clearall { background:url(../img/admin/selector-removeall.gif) left center no-repeat; }
+
+/* STACKED SELECTORS */
+.stacked { float:left; width:500px; }
+.stacked select { width:480px; height:10.1em; }
+.stacked .selector-available, .stacked .selector-chosen { width:480px; }
+.stacked .selector-available { margin-bottom:0; }
+.stacked .selector-available input { width:442px; }
+.stacked ul.selector-chooser { height:22px; width:50px; margin:0 0 3px 40%; background:url(../img/admin/chooser_stacked-bg.gif) top center no-repeat; }
+.stacked .selector-chooser li { float:left; padding:3px 3px 3px 5px; }
+.stacked .selector-chooseall, .stacked .selector-clearall { display:none; }
+.stacked .selector-add { background-image:url(../img/admin/selector_stacked-add.gif); }
+.stacked .selector-remove { background-image:url(../img/admin/selector_stacked-remove.gif); }
+
+/* DATE AND TIME */
+p.datetime { line-height:20px; margin:0; padding:0; color:#666; font-size:11px; font-weight:bold; }
+.datetime span { font-size:11px; color:#ccc; font-weight:normal; white-space:nowrap; }
+.vDateField { margin-left:4px; }
+table p.datetime { font-size:10px; margin-left:0; padding-left:0; }
+
+/* FILE UPLOADS */
+p.file-upload { line-height:20px; margin:0; padding:0; color:#666; font-size:11px; font-weight:bold; }
+.file-upload a { font-weight:normal; }
+.file-upload .deletelink { margin-left:5px; }
+
+/* CALENDARS & CLOCKS */
+.calendarbox, .clockbox { margin:5px auto; font-size:11px; width:16em; text-align:center; background:white; position:relative; }
+.clockbox { width:9em; }
+.calendar { margin:0; padding: 0; }
+.calendar table { margin:0; padding:0; border-collapse:collapse; background:white; width:99%; }
+.calendar caption, .calendarbox h2 { margin: 0; font-size:11px; text-align:center; border-top:none; }
+.calendar th { font-size:10px; color:#666; padding:2px 3px; text-align:center; background:#e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; border-bottom:1px solid #ddd; }
+.calendar td { font-size:11px; text-align: center; padding: 0; border-top:1px solid #eee; border-bottom:none; }
+.calendar td.selected a { background: #C9DBED; }
+.calendar td.nonday { background:#efefef; }
+.calendar td.today a { background:#ffc; }
+.calendar td a, .timelist a { display: block; font-weight:bold; padding:4px; text-decoration: none; color:#444; }
+.calendar td a:hover, .timelist a:hover { background: #5b80b2; color:white; }
+.calendar td a:active, .timelist a:active { background: #036; color:white; }
+.calendarnav { font-size:10px; text-align: center; color:#ccc; margin:0; padding:1px 3px; }
+.calendarnav a:link, #calendarnav a:visited, #calendarnav a:hover { color: #999; }
+.calendar-shortcuts { background:white; font-size:10px; line-height:11px; border-top:1px solid #eee; padding:3px 0 4px; color:#ccc; }
+.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { display:block; position:absolute; font-weight:bold; font-size:12px; background:#C9DBED url(../img/admin/default-bg.gif) bottom left repeat-x; padding:1px 4px 2px 4px; color:white; }
+.calendarnav-previous:hover, .calendarnav-next:hover { background:#036; }
+.calendarnav-previous { top:0; left:0; }
+.calendarnav-next { top:0; right:0; }
+.calendar-cancel { margin:0 !important; padding:0; font-size:10px; background:#e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x;  border-top:1px solid #ddd; }
+.calendar-cancel a { padding:2px; color:#999; }
+ul.timelist, .timelist li { list-style-type:none; margin:0; padding:0; }
+.timelist a { padding:2px; }
+
+/* INLINE ORDERER */
+ul.orderer {  position:relative; padding:0 !important; margin:0 !important; list-style-type:none; }
+ul.orderer li { list-style-type:none; display:block; padding:0; margin:0; border:1px solid #bbb; border-width:0 1px 1px 0; white-space:nowrap; overflow:hidden; background:#e2e2e2 url(../img/admin/nav-bg-grabber.gif) repeat-y; }
+ul.orderer li:hover { cursor:move; background-color:#ddd; }
+ul.orderer li a.selector { margin-left:12px; overflow:hidden; width:83%; font-size:10px !important; padding:0.6em 0; }
+ul.orderer li a:link, ul.orderer li a:visited { color:#333; }
+ul.orderer li .inline-deletelink { position:absolute; right:4px; margin-top:0.6em; }
+ul.orderer li.selected { background-color:#f8f8f8; border-right-color:#f8f8f8; }
+ul.orderer li.deleted { background:#bbb url(../img/admin/deleted-overlay.gif); }
+ul.orderer li.deleted a:link, ul.orderer li.deleted a:visited { color:#888; }
+ul.orderer li.deleted .inline-deletelink { background-image:url(../img/admin/inline-restore.png);  }
+ul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover { cursor:default; }
+
+/* EDIT INLINE */
+.inline-deletelink { display:block; text-indent:-9999px; background:transparent url(../img/admin/inline-delete.png) no-repeat; width:15px; height:15px; margin:0.4em 0; border: 0px none; }
+.inline-deletelink:hover { background-position:-15px 0; cursor:pointer; }
+.editinline button.addlink { border: 0px none; color: #5b80b2; font-size: 100%; cursor: pointer; }
+.editinline button.addlink:hover { color: #036; cursor: pointer; }
+.editinline table .help { text-align:right; float:right; padding-left:2em; }
+.editinline tfoot .addlink { white-space:nowrap; }
+.editinline table thead th:last-child { border-left:none; }
+.editinline tr.deleted { background:#ddd url(../img/admin/deleted-overlay.gif); }
+.editinline tr.deleted .inline-deletelink { background-image:url(../img/admin/inline-restore.png); }
+.editinline tr.deleted td:hover { cursor:default; }
+.editinline tr.deleted td:first-child { background-image:none !important; }
+
+/* EDIT INLINE - STACKED */
+.editinline-stacked { min-width:758px; }
+.editinline-stacked .inline-object { margin-left:210px; background:white; }
+.editinline-stacked .inline-source { float:left; width:200px; background:#f8f8f8;  }
+.editinline-stacked .inline-splitter { float:left; width:9px; background:#f8f8f8 url(../img/admin/inline-splitter-bg.gif) 50% 50% no-repeat; border-right:1px solid #ccc; }
+.editinline-stacked .controls { clear:both; background:#e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; padding:3px 4px; font-size:11px; border-top:1px solid #ddd; }
\ No newline at end of file

Added: vendor/django/current/django/contrib/admin/media/img/admin/arrow-down.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/arrow-down.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/arrow-up.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/arrow-up.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/changelist-bg.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/changelist-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/chooser-bg.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/chooser-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/default-bg-reverse.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/default-bg-reverse.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/default-bg.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/default-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/deleted-overlay.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/deleted-overlay.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon-no.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon-no.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon-unknown.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon-unknown.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon-yes.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon-yes.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_addlink.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_addlink.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_alert.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_alert.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_calendar.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_calendar.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_changelink.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_changelink.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_clock.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_clock.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_deletelink.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_deletelink.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_error.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_error.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_searchbox.png
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_searchbox.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/icon_success.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/icon_success.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/inline-delete-8bit.png
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/inline-delete-8bit.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/inline-delete.png
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/inline-delete.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/inline-restore-8bit.png
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/inline-restore-8bit.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/inline-restore.png
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/inline-restore.png
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/inline-splitter-bg.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/inline-splitter-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/nav-bg-grabber.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/nav-bg-grabber.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/nav-bg-reverse.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/nav-bg-reverse.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/nav-bg.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/nav-bg.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/selector-add.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/selector-add.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/selector-addall.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/selector-addall.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/selector-remove.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/selector-remove.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/selector-removeall.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/selector-removeall.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/selector-search.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/selector-search.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/selector_stacked-add.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/selector_stacked-add.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/selector_stacked-remove.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/selector_stacked-remove.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tool-left.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tool-left.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tool-left_over.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tool-left_over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tool-right.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tool-right.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tool-right_over.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tool-right_over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-add.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-add.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-add_over.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-add_over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-arrowright.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-arrowright.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif
===================================================================
(Binary files differ)


Property changes on: vendor/django/current/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif
___________________________________________________________________
Name: svn:mime-type
   + application/octet-stream

Added: vendor/django/current/django/contrib/admin/media/js/SelectBox.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/SelectBox.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/SelectBox.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,109 @@
+var SelectBox = {
+    cache: new Object(),
+    init: function(id) {
+        var box = document.getElementById(id);
+        var node;
+        SelectBox.cache[id] = new Array();
+        var cache = SelectBox.cache[id];
+        for (var i = 0; (node = box.options[i]); i++) {
+            cache.push({ value: node.value, text: node.text, displayed: 1 });
+        }
+    },
+    redisplay: function(id) {
+        // Repopulate HTML select box from cache
+        var box = document.getElementById(id);
+        box.options.length = 0; // clear all options
+        for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) {
+            var node = SelectBox.cache[id][i];
+            if (node.displayed) {
+                box.options[box.options.length] = new Option(node.text, node.value, false, false);
+            }
+        }
+    },
+    filter: function(id, text) {
+        // Redisplay the HTML select box, displaying only the choices containing ALL
+        // the words in text. (It's an AND search.)
+        var tokens = text.toLowerCase().split(/\s+/);
+        var node, token;
+        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+            node.displayed = 1;
+            for (var j = 0; (token = tokens[j]); j++) {
+                if (node.text.toLowerCase().indexOf(token) == -1) {
+                    node.displayed = 0;
+                }
+            }
+        }
+        SelectBox.redisplay(id);
+    },
+    delete_from_cache: function(id, value) {
+        var node, delete_index = null;
+        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+            if (node.value == value) {
+                delete_index = i;
+                break;
+            }
+        }
+        var j = SelectBox.cache[id].length - 1;
+        for (var i = delete_index; i < j; i++) {
+            SelectBox.cache[id][i] = SelectBox.cache[id][i+1];
+        }
+        SelectBox.cache[id].length--;
+    },
+    add_to_cache: function(id, option) {
+        SelectBox.cache[id].push({ value: option.value, text: option.text, displayed: 1 });
+    },
+    cache_contains: function(id, value) {
+        // Check if an item is contained in the cache
+        var node;
+        for (var i = 0; (node = SelectBox.cache[id][i]); i++) {
+            if (node.value == value) {
+                return true;
+            }
+        }
+        return false;
+    },
+    move: function(from, to) {
+        var from_box = document.getElementById(from);
+        var to_box = document.getElementById(to);
+        var option;
+        for (var i = 0; (option = from_box.options[i]); i++) {
+            if (option.selected && SelectBox.cache_contains(from, option.value)) {
+                SelectBox.add_to_cache(to, { value: option.value, text: option.text, displayed: 1 });
+                SelectBox.delete_from_cache(from, option.value);
+            }
+        }
+        SelectBox.redisplay(from);
+        SelectBox.redisplay(to);
+    },
+    move_all: function(from, to) {
+        var from_box = document.getElementById(from);
+        var to_box = document.getElementById(to);
+        var option;
+        for (var i = 0; (option = from_box.options[i]); i++) {
+            SelectBox.add_to_cache(to, { value: option.value, text: option.text, displayed: 1 });
+            SelectBox.delete_from_cache(from, option.value);
+        }
+        SelectBox.redisplay(from);
+        SelectBox.redisplay(to);
+    },
+    sort: function(id) {
+        SelectBox.cache[id].sort( function(a, b) {
+            a = a.text.toLowerCase();
+            b = b.text.toLowerCase();
+            try {
+                if (a > b) return 1;
+                if (a < b) return -1;
+            }
+            catch (e) {
+                // silently fail on IE 'unknown' exception
+            }
+            return 0;
+        } );
+    },
+    select_all: function(id) {
+        var box = document.getElementById(id);
+        for (var i = 0; i < box.options.length; i++) {
+            box.options[i].selected = 'selected';
+        }
+    }
+}

Added: vendor/django/current/django/contrib/admin/media/js/SelectFilter.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/SelectFilter.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/SelectFilter.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,81 @@
+/*
+SelectFilter - Turns a multiple-select box into a filter interface.
+
+Requires SelectBox.js and addevent.js.
+*/
+
+function findForm(node) {
+    // returns the node of the form containing the given node
+    if (node.tagName.toLowerCase() != 'form') {
+        return findForm(node.parentNode);
+    }
+    return node;
+}
+
+var SelectFilter = {
+    init: function(field_id) {
+        var from_box = document.getElementById(field_id);
+        from_box.id += '_from'; // change its ID
+        // Create the INPUT input box
+        var input_box = document.createElement('input');
+        input_box.id = field_id + '_input';
+        input_box.setAttribute('type', 'text');
+        from_box.parentNode.insertBefore(input_box, from_box);
+        from_box.parentNode.insertBefore(document.createElement('br'), input_box.nextSibling);
+        // Create the TO box
+        var to_box = document.createElement('select');
+        to_box.id = field_id + '_to';
+        to_box.setAttribute('multiple', 'multiple');
+        to_box.setAttribute('size', from_box.size);
+        from_box.parentNode.insertBefore(to_box, from_box.nextSibling);
+        to_box.setAttribute('name', from_box.getAttribute('name'));
+        from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
+        // Give the filters a CSS hook
+        from_box.setAttribute('class', 'filtered');
+        to_box.setAttribute('class', 'filtered');
+        // Set up the JavaScript event handlers for the select box filter interface
+        addEvent(input_box, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
+        addEvent(input_box, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
+        addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); });
+        addEvent(from_box, 'focus', function() { input_box.focus(); });
+        addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); });
+        addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
+        SelectBox.init(field_id + '_from');
+        SelectBox.init(field_id + '_to');
+        // Move selected from_box options to to_box
+        SelectBox.move(field_id + '_from', field_id + '_to');
+    },
+    filter_key_up: function(event, field_id) {
+        from = document.getElementById(field_id + '_from');
+        // don't submit form if user pressed Enter
+        if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
+            from.selectedIndex = 0;
+            SelectBox.move(field_id + '_from', field_id + '_to');
+            from.selectedIndex = 0;
+            return false;
+        }
+        var temp = from.selectedIndex;
+        SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
+        from.selectedIndex = temp;
+        return true;
+    },
+    filter_key_down: function(event, field_id) {
+        from = document.getElementById(field_id + '_from');
+        // right arrow -- move across
+        if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
+            var old_index = from.selectedIndex;
+            SelectBox.move(field_id + '_from', field_id + '_to');
+            from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
+            return false;
+        }
+        // down arrow -- wrap around
+        if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
+            from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
+        }
+        // up arrow -- wrap around
+        if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
+            from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;
+        }
+        return true;
+    }
+}

Added: vendor/django/current/django/contrib/admin/media/js/SelectFilter2.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/SelectFilter2.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/SelectFilter2.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,113 @@
+/*
+SelectFilter2 - Turns a multiple-select box into a filter interface.
+
+Different than SelectFilter because this is coupled to the admin framework.
+
+Requires core.js, SelectBox.js and addevent.js.
+*/
+
+function findForm(node) {
+    // returns the node of the form containing the given node
+    if (node.tagName.toLowerCase() != 'form') {
+        return findForm(node.parentNode);
+    }
+    return node;
+}
+
+var SelectFilter = {
+    init: function(field_id, field_name, is_stacked, admin_media_prefix) {
+        var from_box = document.getElementById(field_id);
+        from_box.id += '_from'; // change its ID
+        from_box.className = 'filtered';
+
+        // Remove <p class="info">, because it just gets in the way.
+        var ps = from_box.parentNode.getElementsByTagName('p');
+        for (var i=0; i<ps.length; i++) {
+            from_box.parentNode.removeChild(ps[i]);
+        }
+
+        // <div class="selector"> or <div class="selector stacked">
+        var selector_div = quickElement('div', from_box.parentNode);
+        selector_div.className = is_stacked ? 'selector stacked' : 'selector';
+
+        // <div class="selector-available">
+        var selector_available = quickElement('div', selector_div, '');
+        selector_available.className = 'selector-available';
+        quickElement('h2', selector_available, interpolate(gettext('Available %s'), [field_name]));
+        var filter_p = quickElement('p', selector_available, '');
+        filter_p.className = 'selector-filter';
+        quickElement('img', filter_p, '', 'src', admin_media_prefix + 'img/admin/selector-search.gif');
+        filter_p.appendChild(document.createTextNode(' '));
+        var filter_input = quickElement('input', filter_p, '', 'type', 'text');
+        filter_input.id = field_id + '_input';
+        selector_available.appendChild(from_box);
+        var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'href', 'javascript: (function(){ SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); })()');
+        choose_all.className = 'selector-chooseall';
+
+        // <ul class="selector-chooser">
+        var selector_chooser = quickElement('ul', selector_div, '');
+        selector_chooser.className = 'selector-chooser';
+        var add_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Add'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_from","' + field_id + '_to");})()');
+        add_link.className = 'selector-add';
+        var remove_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_to","' + field_id + '_from");})()');
+        remove_link.className = 'selector-remove';
+
+        // <div class="selector-chosen">
+        var selector_chosen = quickElement('div', selector_div, '');
+        selector_chosen.className = 'selector-chosen';
+        quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s'), [field_name]));
+        var selector_filter = quickElement('p', selector_chosen, gettext('Select your choice(s) and click '));
+        selector_filter.className = 'selector-filter';
+        quickElement('img', selector_filter, '', 'src', admin_media_prefix + 'img/admin/selector-add.gif', 'alt', 'Add');
+        var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name'));
+        to_box.className = 'filtered';
+        var clear_all = quickElement('a', selector_chosen, gettext('Clear all'), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from");})()');
+        clear_all.className = 'selector-clearall';
+
+        from_box.setAttribute('name', from_box.getAttribute('name') + '_old');
+
+        // Set up the JavaScript event handlers for the select box filter interface
+        addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); });
+        addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); });
+        addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); });
+        addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); });
+        addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); });
+        SelectBox.init(field_id + '_from');
+        SelectBox.init(field_id + '_to');
+        // Move selected from_box options to to_box
+        SelectBox.move(field_id + '_from', field_id + '_to');
+    },
+    filter_key_up: function(event, field_id) {
+        from = document.getElementById(field_id + '_from');
+        // don't submit form if user pressed Enter
+        if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) {
+            from.selectedIndex = 0;
+            SelectBox.move(field_id + '_from', field_id + '_to');
+            from.selectedIndex = 0;
+            return false;
+        }
+        var temp = from.selectedIndex;
+        SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value);
+        from.selectedIndex = temp;
+        return true;
+    },
+    filter_key_down: function(event, field_id) {
+        from = document.getElementById(field_id + '_from');
+        // right arrow -- move across
+        if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) {
+            var old_index = from.selectedIndex;
+            SelectBox.move(field_id + '_from', field_id + '_to');
+            from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index;
+            return false;
+        }
+        // down arrow -- wrap around
+        if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) {
+            from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1;
+        }
+        // up arrow -- wrap around
+        if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) {
+            from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1;
+        }
+        return true;
+    }
+}

Added: vendor/django/current/django/contrib/admin/media/js/admin/CollapsedFieldsets.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/admin/CollapsedFieldsets.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/admin/CollapsedFieldsets.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,85 @@
+// Finds all fieldsets with class="collapse", collapses them, and gives each
+// one a "Show" link that uncollapses it. The "Show" link becomes a "Hide"
+// link when the fieldset is visible.
+
+function findForm(node) {
+    // returns the node of the form containing the given node
+    if (node.tagName.toLowerCase() != 'form') {
+        return findForm(node.parentNode);
+    }
+    return node;
+}
+
+var CollapsedFieldsets = {
+    collapse_re: /\bcollapse\b/,   // Class of fieldsets that should be dealt with.
+    collapsed_re: /\bcollapsed\b/, // Class that fieldsets get when they're hidden.
+    collapsed_class: 'collapsed',
+    init: function() {
+        var fieldsets = document.getElementsByTagName('fieldset');
+        var collapsed_seen = false;
+        for (var i = 0, fs; fs = fieldsets[i]; i++) {
+            // Collapse this fieldset if it has the correct class, and if it
+            // doesn't have any errors. (Collapsing shouldn't apply in the case
+            // of error messages.)
+            if (fs.className.match(CollapsedFieldsets.collapse_re) && !CollapsedFieldsets.fieldset_has_errors(fs)) {
+                collapsed_seen = true;
+                // Give it an additional class, used by CSS to hide it.
+                fs.className += ' ' + CollapsedFieldsets.collapsed_class;
+                // (<a id="fieldsetcollapser3" class="collapse-toggle" href="#">Show</a>)
+                var collapse_link = document.createElement('a');
+                collapse_link.className = 'collapse-toggle';
+                collapse_link.id = 'fieldsetcollapser' + i;
+                collapse_link.onclick = new Function('CollapsedFieldsets.show('+i+'); return false;');
+                collapse_link.href = '#';
+                collapse_link.innerHTML = gettext('Show');
+                var h2 = fs.getElementsByTagName('h2')[0];
+                h2.appendChild(document.createTextNode(' ('));
+                h2.appendChild(collapse_link);
+                h2.appendChild(document.createTextNode(')'));
+            }
+        }
+        if (collapsed_seen) {
+            // Expand all collapsed fieldsets when form is submitted.
+            addEvent(findForm(document.getElementsByTagName('fieldset')[0]), 'submit', function() { CollapsedFieldsets.uncollapse_all(); });
+        }
+    },
+    fieldset_has_errors: function(fs) {
+        // Returns true if any fields in the fieldset have validation errors.
+        var divs = fs.getElementsByTagName('div');
+        for (var i=0; i<divs.length; i++) {
+            if (divs[i].className.match(/\berror\b/)) {
+                return true;
+            }
+        }
+        return false;
+    },
+    show: function(fieldset_index) {
+        var fs = document.getElementsByTagName('fieldset')[fieldset_index];
+        // Remove the class name that causes the "display: none".
+        fs.className = fs.className.replace(CollapsedFieldsets.collapsed_re, '');
+        // Toggle the "Show" link to a "Hide" link
+        var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
+        collapse_link.onclick = new Function('CollapsedFieldsets.hide('+fieldset_index+'); return false;');
+        collapse_link.innerHTML = gettext('Hide');
+    },
+    hide: function(fieldset_index) {
+        var fs = document.getElementsByTagName('fieldset')[fieldset_index];
+        // Add the class name that causes the "display: none".
+        fs.className += ' ' + CollapsedFieldsets.collapsed_class;
+        // Toggle the "Hide" link to a "Show" link
+        var collapse_link = document.getElementById('fieldsetcollapser' + fieldset_index);
+        collapse_link.onclick = new Function('CollapsedFieldsets.show('+fieldset_index+'); return false;');
+        collapse_link.innerHTML = gettext('Show');
+    },
+
+    uncollapse_all: function() {
+        var fieldsets = document.getElementsByTagName('fieldset');
+        for (var i=0; i<fieldsets.length; i++) {
+            if (fieldsets[i].className.match(CollapsedFieldsets.collapsed_re)) {
+                CollapsedFieldsets.show(i);
+            }
+        }
+    }
+}
+
+addEvent(window, 'load', CollapsedFieldsets.init);

Added: vendor/django/current/django/contrib/admin/media/js/admin/DateTimeShortcuts.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/admin/DateTimeShortcuts.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/admin/DateTimeShortcuts.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,226 @@
+// Inserts shortcut buttons after all of the following:
+//     <input type="text" class="vDateField">
+//     <input type="text" class="vTimeField">
+
+var DateTimeShortcuts = {
+    calendars: [],
+    calendarInputs: [],
+    clockInputs: [],
+    calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
+    calendarDivName2: 'calendarin',  // name of <div> that contains calendar
+    clockDivName: 'clockbox',        // name of clock <div> that gets toggled
+    admin_media_prefix: '',
+    init: function() {
+        // Deduce admin_media_prefix by looking at the <script>s in the
+        // current document and finding the URL of *this* module.
+        var scripts = document.getElementsByTagName('script');
+        for (var i=0; i<scripts.length; i++) {
+            if (scripts[i].src.match(/DateTimeShortcuts/)) {
+                var idx = scripts[i].src.indexOf('js/admin/DateTimeShortcuts');
+                DateTimeShortcuts.admin_media_prefix = scripts[i].src.substring(0, idx);
+                break;
+            }
+        }
+
+        var inputs = document.getElementsByTagName('input');
+        for (i=0; i<inputs.length; i++) {
+            var inp = inputs[i];
+            if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) {
+                DateTimeShortcuts.addClock(inp);
+            }
+            else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) {
+                DateTimeShortcuts.addCalendar(inp);
+            }
+        }
+    },
+    // Add clock widget to a given field
+    addClock: function(inp) {
+        var num = DateTimeShortcuts.clockInputs.length;
+        DateTimeShortcuts.clockInputs[num] = inp;
+
+        // Shortcut links (clock icon and "Now" link)
+        var shortcuts_span = document.createElement('span');
+        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+        var now_link = document.createElement('a');
+        now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinute());");
+        now_link.appendChild(document.createTextNode(gettext('Now')));
+        var clock_link = document.createElement('a');
+        clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');');
+        quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_clock.gif', 'alt', gettext('Clock'));
+        shortcuts_span.appendChild(document.createTextNode('\240'));
+        shortcuts_span.appendChild(now_link);
+        shortcuts_span.appendChild(document.createTextNode('\240|\240'));
+        shortcuts_span.appendChild(clock_link);
+
+        // Create clock link div
+        //
+        // Markup looks like:
+        // <div id="clockbox1" class="clockbox module">
+        //     <h2>Choose a time</h2>
+        //     <ul class="timelist">
+        //         <li><a href="#">Now</a></li>
+        //         <li><a href="#">Midnight</a></li>
+        //         <li><a href="#">6 a.m.</a></li>
+        //         <li><a href="#">Noon</a></li>
+        //     </ul>
+        //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
+        // </div>
+
+        var clock_box = document.createElement('div');
+        clock_box.style.display = 'none';
+        clock_box.style.position = 'absolute';
+        if (getStyle(document.body,'direction')!='rtl') {
+            clock_box.style.left = findPosX(clock_link) + 17 + 'px';
+        }
+        else {
+            // since style's width is in em, it'd be tough to calculate
+            // px value of it. let's use an estimated px for now
+            // TODO: IE returns wrong value for findPosX when in rtl mode
+            //       (it returns as it was left aligned), needs to be fixed.
+            clock_box.style.left = findPosX(clock_link) - 110 + 'px';
+        }
+        clock_box.style.top = findPosY(clock_link) - 30 + 'px';
+        clock_box.className = 'clockbox module';
+        clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num);
+        document.body.appendChild(clock_box);
+        addEvent(clock_box, 'click', DateTimeShortcuts.cancelEventPropagation);
+
+        quickElement('h2', clock_box, gettext('Choose a time'));
+        time_list = quickElement('ul', clock_box, '');
+        time_list.className = 'timelist';
+        quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().getHourMinute());")
+        quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '00:00');")
+        quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '06:00');")
+        quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", '12:00');")
+
+        cancel_p = quickElement('p', clock_box, '');
+        cancel_p.className = 'calendar-cancel';
+        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');');
+    },
+    openClock: function(num) {
+        document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'block';
+        addEvent(window, 'click', function() { DateTimeShortcuts.dismissClock(num); return true; });
+    },
+    dismissClock: function(num) {
+       document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none';
+       window.onclick = null;
+    },
+    handleClockQuicklink: function(num, val) {
+       DateTimeShortcuts.clockInputs[num].value = val;
+       DateTimeShortcuts.dismissClock(num);
+    },
+    // Add calendar widget to a given field.
+    addCalendar: function(inp) {
+        var num = DateTimeShortcuts.calendars.length;
+
+        DateTimeShortcuts.calendarInputs[num] = inp;
+
+        // Shortcut links (calendar icon and "Today" link)
+        var shortcuts_span = document.createElement('span');
+        inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling);
+        var today_link = document.createElement('a');
+        today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+        today_link.appendChild(document.createTextNode(gettext('Today')));
+        var cal_link = document.createElement('a');
+        cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');');
+        quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_calendar.gif', 'alt', gettext('Calendar'));
+        shortcuts_span.appendChild(document.createTextNode('\240'));
+        shortcuts_span.appendChild(today_link);
+        shortcuts_span.appendChild(document.createTextNode('\240|\240'));
+        shortcuts_span.appendChild(cal_link);
+
+        // Create calendarbox div.
+        //
+        // Markup looks like:
+        //
+        // <div id="calendarbox3" class="calendarbox module">
+        //     <h2>
+        //           <a href="#" class="link-previous">&lsaquo;</a>
+        //           <a href="#" class="link-next">&rsaquo;</a> February 2003
+        //     </h2>
+        //     <div class="calendar" id="calendarin3">
+        //         <!-- (cal) -->
+        //     </div>
+        //     <div class="calendar-shortcuts">
+        //          <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
+        //     </div>
+        //     <p class="calendar-cancel"><a href="#">Cancel</a></p>
+        // </div>
+        var cal_box = document.createElement('div');
+        cal_box.style.display = 'none';
+        cal_box.style.position = 'absolute';
+        // is it left-to-right or right-to-left layout ?
+        if (getStyle(document.body,'direction')!='rtl') {
+            cal_box.style.left = findPosX(cal_link) + 17 + 'px';
+        }
+        else {
+            // since style's width is in em, it'd be tough to calculate
+            // px value of it. let's use an estimated px for now
+            // TODO: IE returns wrong value for findPosX when in rtl mode
+            //       (it returns as it was left aligned), needs to be fixed.
+            cal_box.style.left = findPosX(cal_link) - 180 + 'px';
+        }
+        cal_box.style.top = findPosY(cal_link) - 75 + 'px';
+        cal_box.className = 'calendarbox module';
+        cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num);
+        document.body.appendChild(cal_box);
+        addEvent(cal_box, 'click', DateTimeShortcuts.cancelEventPropagation);
+
+        // next-prev links
+        var cal_nav = quickElement('div', cal_box, '');
+        var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');');
+        cal_nav_prev.className = 'calendarnav-previous';
+        var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');');
+        cal_nav_next.className = 'calendarnav-next';
+        cal_box.appendChild(cal_nav);
+
+        // main box
+        var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num);
+        cal_main.className = 'calendar';
+        DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num));
+        DateTimeShortcuts.calendars[num].drawCurrent();
+
+        // calendar shortcuts
+        var shortcuts = quickElement('div', cal_box, '');
+        shortcuts.className = 'calendar-shortcuts';
+        quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);');
+        shortcuts.appendChild(document.createTextNode('\240|\240'));
+        quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);');
+        shortcuts.appendChild(document.createTextNode('\240|\240'));
+        quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);');
+
+        // cancel bar
+        var cancel_p = quickElement('p', cal_box, '');
+        cancel_p.className = 'calendar-cancel';
+        quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');');
+    },
+    openCalendar: function(num) {
+        document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'block';
+        addEvent(window, 'click', function() { DateTimeShortcuts.dismissCalendar(num); return true; });
+    },
+    dismissCalendar: function(num) {
+        document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none';
+    },
+    drawPrev: function(num) {
+        DateTimeShortcuts.calendars[num].drawPreviousMonth();
+    },
+    drawNext: function(num) {
+        DateTimeShortcuts.calendars[num].drawNextMonth();
+    },
+    handleCalendarCallback: function(num) {
+        return "function(y, m, d) { DateTimeShortcuts.calendarInputs["+num+"].value = y+'-'+m+'-'+d; document.getElementById(DateTimeShortcuts.calendarDivName1+"+num+").style.display='none';}";
+    },
+    handleCalendarQuickLink: function(num, offset) {
+       var d = new Date();
+       d.setDate(d.getDate() + offset)
+       DateTimeShortcuts.calendarInputs[num].value = d.getISODate();
+       DateTimeShortcuts.dismissCalendar(num);
+    },
+    cancelEventPropagation: function(e) {
+        if (!e) e = window.event;
+        e.cancelBubble = true;
+        if (e.stopPropagation) e.stopPropagation();
+    }
+}
+
+addEvent(window, 'load', DateTimeShortcuts.init);

Added: vendor/django/current/django/contrib/admin/media/js/admin/RelatedObjectLookups.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/admin/RelatedObjectLookups.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/admin/RelatedObjectLookups.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,57 @@
+// Handles related-objects functionality: lookup link for raw_id_admin=True
+// and Add Another links.
+
+function showRelatedObjectLookupPopup(triggeringLink) {
+    var name = triggeringLink.id.replace(/^lookup_/, '');
+    // IE doesn't like periods in the window name, so convert temporarily.
+    name = name.replace(/\./g, '___');
+    var href;
+    if (triggeringLink.href.search(/\?/) >= 0) {
+        href = triggeringLink.href + '&pop=1';
+    } else {
+        href = triggeringLink.href + '?pop=1';
+    }
+    var win = window.open(href, name, 'height=500,width=740,resizable=yes,scrollbars=yes');
+    win.focus();
+    return false;
+}
+
+function dismissRelatedLookupPopup(win, chosenId) {
+    var name = win.name.replace(/___/g, '.');
+    var elem = document.getElementById(name);
+    if (elem.className.indexOf('vRawIdAdminField') != -1 && elem.value) {
+        elem.value += ',' + chosenId;
+    } else {
+        document.getElementById(name).value = chosenId;
+    }
+    win.close();
+}
+
+function showAddAnotherPopup(triggeringLink) {
+    var name = triggeringLink.id.replace(/^add_/, '');
+    name = name.replace(/\./g, '___');
+    var win = window.open(triggeringLink.href + '?_popup=1', name, 'height=500,width=800,resizable=yes,scrollbars=yes');
+    win.focus();
+    return false;
+}
+
+function dismissAddAnotherPopup(win, newId, newRepr) {
+    var name = win.name.replace(/___/g, '.');
+    var elem = document.getElementById(name);
+    if (elem) {
+        if (elem.nodeName == 'SELECT') {
+            var o = new Option(newRepr, newId);
+            elem.options[elem.options.length] = o;
+            o.selected = true;
+        } else if (elem.nodeName == 'INPUT') {
+            elem.value = newId;
+        }
+    } else {
+        var toId = name + "_to";
+        elem = document.getElementById(toId);
+        var o = new Option(newRepr, newId);
+        SelectBox.add_to_cache(toId, o);
+        SelectBox.redisplay(toId);
+    }
+    win.close();
+}

Added: vendor/django/current/django/contrib/admin/media/js/admin/ordering.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/admin/ordering.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/admin/ordering.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,137 @@
+addEvent(window, 'load', reorder_init);
+
+var lis;
+var top = 0;
+var left = 0;
+var height = 30;
+
+function reorder_init() {
+    lis = document.getElementsBySelector('ul#orderthese li');
+    var input = document.getElementsBySelector('input[name=order_]')[0];
+    setOrder(input.value.split(','));
+    input.disabled = true;
+    draw();
+    // Now initialise the dragging behaviour
+    var limit = (lis.length - 1) * height;
+    for (var i = 0; i < lis.length; i++) {
+        var li = lis[i];
+        var img = document.getElementById('handle'+li.id);
+        li.style.zIndex = 1;
+        Drag.init(img, li, left + 10, left + 10, top + 10, top + 10 + limit);
+        li.onDragStart = startDrag;
+        li.onDragEnd = endDrag;
+        img.style.cursor = 'move';
+    }
+}
+
+function submitOrderForm() {
+    var inputOrder = document.getElementsBySelector('input[name=order_]')[0];
+    inputOrder.value = getOrder();
+    inputOrder.disabled=false;
+}
+
+function startDrag() {
+    this.style.zIndex = '10';
+    this.className = 'dragging';
+}
+
+function endDrag(x, y) {
+    this.style.zIndex = '1';
+    this.className = '';
+    // Work out how far along it has been dropped, using x co-ordinate
+    var oldIndex = this.index;
+    var newIndex = Math.round((y - 10 - top) / height);
+    // 'Snap' to the correct position
+    this.style.top = (10 + top + newIndex * height) + 'px';
+    this.index = newIndex;
+    moveItem(oldIndex, newIndex);
+}
+
+function moveItem(oldIndex, newIndex) {
+    // Swaps two items, adjusts the index and left co-ord for all others
+    if (oldIndex == newIndex) {
+        return; // Nothing to swap;
+    }
+    var direction, lo, hi;
+    if (newIndex > oldIndex) {
+        lo = oldIndex;
+        hi = newIndex;
+        direction = -1;
+    } else {
+        direction = 1;
+        hi = oldIndex;
+        lo = newIndex;
+    }
+    var lis2 = new Array(); // We will build the new order in this array
+    for (var i = 0; i < lis.length; i++) {
+        if (i < lo || i > hi) {
+            // Position of items not between the indexes is unaffected
+            lis2[i] = lis[i];
+            continue;
+        } else if (i == newIndex) {
+            lis2[i] = lis[oldIndex];
+            continue;
+        } else {
+            // Item is between the two indexes - move it along 1
+            lis2[i] = lis[i - direction];
+        }
+    }
+    // Re-index everything
+    reIndex(lis2);
+    lis = lis2;
+    draw();
+//    document.getElementById('hiddenOrder').value = getOrder();
+    document.getElementsBySelector('input[name=order_]')[0].value = getOrder();
+}
+
+function reIndex(lis) {
+    for (var i = 0; i < lis.length; i++) {
+        lis[i].index = i;
+    }
+}
+
+function draw() {
+    for (var i = 0; i < lis.length; i++) {
+        var li = lis[i];
+        li.index = i;
+        li.style.position = 'absolute';
+        li.style.left = (10 + left) + 'px';
+        li.style.top = (10 + top + (i * height)) + 'px';
+    }
+}
+
+function getOrder() {
+    var order = new Array(lis.length);
+    for (var i = 0; i < lis.length; i++) {
+        order[i] = lis[i].id.substring(1, 100);
+    }
+    return order.join(',');
+}
+
+function setOrder(id_list) {
+    /* Set the current order to match the lsit of IDs */
+    var temp_lis = new Array();
+    for (var i = 0; i < id_list.length; i++) {
+        var id = 'p' + id_list[i];
+        temp_lis[temp_lis.length] = document.getElementById(id);
+    }
+    reIndex(temp_lis);
+    lis = temp_lis;
+    draw();
+}
+
+function addEvent(elm, evType, fn, useCapture)
+// addEvent and removeEvent
+// cross-browser event handling for IE5+,  NS6 and Mozilla
+// By Scott Andrew
+{
+  if (elm.addEventListener){
+    elm.addEventListener(evType, fn, useCapture);
+    return true;
+  } else if (elm.attachEvent){
+    var r = elm.attachEvent("on"+evType, fn);
+    return r;
+  } else {
+    elm['on'+evType] = fn;
+  }
+}

Added: vendor/django/current/django/contrib/admin/media/js/calendar.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/calendar.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/calendar.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,143 @@
+/*
+calendar.js - Calendar functions by Adrian Holovaty
+*/
+
+function removeChildren(a) { // "a" is reference to an object
+    while (a.hasChildNodes()) a.removeChild(a.lastChild);
+}
+
+// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
+function quickElement() {
+    var obj = document.createElement(arguments[0]);
+    if (arguments[2] != '' && arguments[2] != null) {
+        var textNode = document.createTextNode(arguments[2]);
+        obj.appendChild(textNode);
+    }
+    var len = arguments.length;
+    for (var i = 3; i < len; i += 2) {
+        obj.setAttribute(arguments[i], arguments[i+1]);
+    }
+    arguments[1].appendChild(obj);
+    return obj;
+}
+
+// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
+var CalendarNamespace = {
+    monthsOfYear: gettext('January February March April May June July August September October November December').split(' '),
+    daysOfWeek: gettext('S M T W T F S').split(' '),
+    isLeapYear: function(year) {
+        return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0));
+    },
+    getDaysInMonth: function(month,year) {
+        var days;
+        if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) {
+            days = 31;
+        }
+        else if (month==4 || month==6 || month==9 || month==11) {
+            days = 30;
+        }
+        else if (month==2 && CalendarNamespace.isLeapYear(year)) {
+            days = 29;
+        }
+        else {
+            days = 28;
+        }
+        return days;
+    },
+    draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
+        month = parseInt(month);
+        year = parseInt(year);
+        var calDiv = document.getElementById(div_id);
+        removeChildren(calDiv);
+        var calTable = document.createElement('table');
+        quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year);
+        var tableBody = quickElement('tbody', calTable);
+
+        // Draw days-of-week header
+        var tableRow = quickElement('tr', tableBody);
+        for (var i = 0; i < 7; i++) {
+            quickElement('th', tableRow, CalendarNamespace.daysOfWeek[i]);
+        }
+
+        var startingPos = new Date(year, month-1, 1).getDay();
+        var days = CalendarNamespace.getDaysInMonth(month, year);
+
+        // Draw blanks before first of month
+        tableRow = quickElement('tr', tableBody);
+        for (var i = 0; i < startingPos; i++) {
+            var _cell = quickElement('td', tableRow, ' ');
+            _cell.style.backgroundColor = '#f3f3f3';
+        }
+
+        // Draw days of month
+        var currentDay = 1;
+        for (var i = startingPos; currentDay <= days; i++) {
+            if (i%7 == 0 && currentDay != 1) {
+                tableRow = quickElement('tr', tableBody);
+            }
+            var cell = quickElement('td', tableRow, '');
+            quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));');
+            currentDay++;
+        }
+
+        // Draw blanks after end of month (optional, but makes for valid code)
+        while (tableRow.childNodes.length < 7) {
+            var _cell = quickElement('td', tableRow, ' ');
+            _cell.style.backgroundColor = '#f3f3f3';
+        }
+
+        calDiv.appendChild(calTable);
+    }
+}
+
+// Calendar -- A calendar instance
+function Calendar(div_id, callback) {
+    // div_id (string) is the ID of the element in which the calendar will
+    //     be displayed
+    // callback (string) is the name of a JavaScript function that will be
+    //     called with the parameters (year, month, day) when a day in the
+    //     calendar is clicked
+    this.div_id = div_id;
+    this.callback = callback;
+    this.today = new Date();
+    this.currentMonth = this.today.getMonth() + 1;
+    this.currentYear = this.today.getFullYear();
+}
+Calendar.prototype = {
+    drawCurrent: function() {
+        CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback);
+    },
+    drawDate: function(month, year) {
+        this.currentMonth = month;
+        this.currentYear = year;
+        this.drawCurrent();
+    },
+    drawPreviousMonth: function() {
+        if (this.currentMonth == 1) {
+            this.currentMonth = 12;
+            this.currentYear--;
+        }
+        else {
+            this.currentMonth--;
+        }
+        this.drawCurrent();
+    },
+    drawNextMonth: function() {
+        if (this.currentMonth == 12) {
+            this.currentMonth = 1;
+            this.currentYear++;
+        }
+        else {
+            this.currentMonth++;
+        }
+        this.drawCurrent();
+    },
+    drawPreviousYear: function() {
+        this.currentYear--;
+        this.drawCurrent();
+    },
+    drawNextYear: function() {
+        this.currentYear++;
+        this.drawCurrent();
+    }
+}

Added: vendor/django/current/django/contrib/admin/media/js/core.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/core.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/core.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,156 @@
+// Core javascript helper functions
+
+// Cross-browser event handlers.
+function addEvent(obj, evType, fn) {
+    if (obj.addEventListener) {
+        obj.addEventListener(evType, fn, false);
+        return true;
+    } else if (obj.attachEvent) {
+        var r = obj.attachEvent("on" + evType, fn);
+        return r;
+    } else {
+        return false;
+    }
+}
+
+function removeEvent(obj, evType, fn) {
+    if (obj.removeEventListener) {
+        obj.removeEventListener(evType, fn, false);
+        return true;
+    } else if (obj.detachEvent) {
+        obj.detachEvent("on" + evType, fn);
+        return true;
+    } else {
+        return false;
+    }
+}
+
+// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
+function quickElement() {
+    var obj = document.createElement(arguments[0]);
+    if (arguments[2] != '' && arguments[2] != null) {
+        var textNode = document.createTextNode(arguments[2]);
+        obj.appendChild(textNode);
+    }
+    var len = arguments.length;
+    for (var i = 3; i < len; i += 2) {
+        obj.setAttribute(arguments[i], arguments[i+1]);
+    }
+    arguments[1].appendChild(obj);
+    return obj;
+}
+
+// ----------------------------------------------------------------------------
+// Cross-browser xmlhttp object
+// from http://jibbering.com/2002/4/httprequest.html
+// ----------------------------------------------------------------------------
+var xmlhttp;
+/*@cc_on @*/
+/*@if (@_jscript_version >= 5)
+    try {
+        xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
+    } catch (e) {
+        try {
+            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
+        } catch (E) {
+            xmlhttp = false;
+        }
+    }
+ at else
+    xmlhttp = false;
+ at end @*/
+if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
+  xmlhttp = new XMLHttpRequest();
+}
+
+// ----------------------------------------------------------------------------
+// Find-position functions by PPK
+// See http://www.quirksmode.org/js/findpos.html
+// ----------------------------------------------------------------------------
+function findPosX(obj) {
+    var curleft = 0;
+    if (obj.offsetParent) {
+        while (obj.offsetParent) {
+            curleft += obj.offsetLeft;
+            obj = obj.offsetParent;
+        }
+    } else if (obj.x) {
+        curleft += obj.x;
+    }
+    return curleft;
+}
+
+function findPosY(obj) {
+    var curtop = 0;
+    if (obj.offsetParent) {
+        while (obj.offsetParent) {
+            curtop += obj.offsetTop;
+            obj = obj.offsetParent;
+        }
+    } else if (obj.y) {
+        curtop += obj.y;
+    }
+    return curtop;
+}
+
+//-----------------------------------------------------------------------------
+// Date object extensions
+// ----------------------------------------------------------------------------
+Date.prototype.getCorrectYear = function() {
+    // Date.getYear() is unreliable --
+    // see http://www.quirksmode.org/js/introdate.html#year
+    var y = this.getYear() % 100;
+    return (y < 38) ? y + 2000 : y + 1900;
+}
+
+Date.prototype.getTwoDigitMonth = function() {
+    return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1);
+}
+
+Date.prototype.getTwoDigitDate = function() {
+    return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate();
+}
+
+Date.prototype.getTwoDigitHour = function() {
+    return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours();
+}
+
+Date.prototype.getTwoDigitMinute = function() {
+    return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes();
+}
+
+Date.prototype.getISODate = function() {
+    return this.getCorrectYear() + '-' + this.getTwoDigitMonth() + '-' + this.getTwoDigitDate();
+}
+
+Date.prototype.getHourMinute = function() {
+    return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute();
+}
+
+// ----------------------------------------------------------------------------
+// String object extensions
+// ----------------------------------------------------------------------------
+String.prototype.pad_left = function(pad_length, pad_string) {
+    var new_string = this;
+    for (var i = 0; new_string.length < pad_length; i++) {
+        new_string = pad_string + new_string;
+    }
+    return new_string;
+}
+
+// ----------------------------------------------------------------------------
+// Get the computed style for and element
+// ----------------------------------------------------------------------------
+function getStyle(oElm, strCssRule){
+    var strValue = "";
+    if(document.defaultView && document.defaultView.getComputedStyle){
+        strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule);
+    }
+    else if(oElm.currentStyle){
+        strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){
+            return p1.toUpperCase();
+        });
+        strValue = oElm.currentStyle[strCssRule];
+    }
+    return strValue;
+}

Added: vendor/django/current/django/contrib/admin/media/js/dateparse.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/dateparse.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/dateparse.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,233 @@
+/* 'Magic' date parsing, by Simon Willison (6th October 2003)
+   http://simon.incutio.com/archive/2003/10/06/betterDateInput
+   Adapted for 6newslawrence.com, 28th January 2004
+*/
+
+/* Finds the index of the first occurence of item in the array, or -1 if not found */
+if (typeof Array.prototype.indexOf == 'undefined') {
+    Array.prototype.indexOf = function(item) {
+        var len = this.length;
+        for (var i = 0; i < len; i++) {
+            if (this[i] == item) {
+                return i;
+            }
+        }
+        return -1;
+    };
+}
+/* Returns an array of items judged 'true' by the passed in test function */
+if (typeof Array.prototype.filter == 'undefined') {
+    Array.prototype.filter = function(test) {
+        var matches = [];
+        var len = this.length;
+        for (var i = 0; i < len; i++) {
+            if (test(this[i])) {
+                matches[matches.length] = this[i];
+            }
+        }
+        return matches;
+    };
+}
+
+var monthNames = gettext("January February March April May June July August September October November December").split(" ");
+var weekdayNames = gettext("Sunday Monday Tuesday Wednesday Thursday Friday Saturday").split(" ");
+
+/* Takes a string, returns the index of the month matching that string, throws
+   an error if 0 or more than 1 matches
+*/
+function parseMonth(month) {
+    var matches = monthNames.filter(function(item) { 
+        return new RegExp("^" + month, "i").test(item);
+    });
+    if (matches.length == 0) {
+        throw new Error("Invalid month string");
+    }
+    if (matches.length > 1) {
+        throw new Error("Ambiguous month");
+    }
+    return monthNames.indexOf(matches[0]);
+}
+/* Same as parseMonth but for days of the week */
+function parseWeekday(weekday) {
+    var matches = weekdayNames.filter(function(item) {
+        return new RegExp("^" + weekday, "i").test(item);
+    });
+    if (matches.length == 0) {
+        throw new Error("Invalid day string");
+    }
+    if (matches.length > 1) {
+        throw new Error("Ambiguous weekday");
+    }
+    return weekdayNames.indexOf(matches[0]);
+}
+
+/* Array of objects, each has 're', a regular expression and 'handler', a 
+   function for creating a date from something that matches the regular 
+   expression. Handlers may throw errors if string is unparseable. 
+*/
+var dateParsePatterns = [
+    // Today
+    {   re: /^tod/i,
+        handler: function() { 
+            return new Date();
+        } 
+    },
+    // Tomorrow
+    {   re: /^tom/i,
+        handler: function() {
+            var d = new Date(); 
+            d.setDate(d.getDate() + 1); 
+            return d;
+        }
+    },
+    // Yesterday
+    {   re: /^yes/i,
+        handler: function() {
+            var d = new Date();
+            d.setDate(d.getDate() - 1);
+            return d;
+        }
+    },
+    // 4th
+    {   re: /^(\d{1,2})(st|nd|rd|th)?$/i, 
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[1], 10));
+            return d;
+        }
+    },
+    // 4th Jan
+    {   re: /^(\d{1,2})(?:st|nd|rd|th)? (\w+)$/i, 
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[1], 10));
+            d.setMonth(parseMonth(bits[2]));
+            return d;
+        }
+    },
+    // 4th Jan 2003
+    {   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.setYear(bits[3]);
+            return d;
+        }
+    },
+    // Jan 4th
+    {   re: /^(\w+) (\d{1,2})(?:st|nd|rd|th)?$/i, 
+        handler: function(bits) {
+            var d = new Date();
+            d.setDate(parseInt(bits[2], 10));
+            d.setMonth(parseMonth(bits[1]));
+            return d;
+        }
+    },
+    // Jan 4th 2003
+    {   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.setYear(bits[3]);
+            return d;
+        }
+    },
+    // next Tuesday - this is suspect due to weird meaning of "next"
+    {   re: /^next (\w+)$/i,
+        handler: function(bits) {
+            var d = new Date();
+            var day = d.getDay();
+            var newDay = parseWeekday(bits[1]);
+            var addDays = newDay - day;
+            if (newDay <= day) {
+                addDays += 7;
+            }
+            d.setDate(d.getDate() + addDays);
+            return d;
+        }
+    },
+    // last Tuesday
+    {   re: /^last (\w+)$/i,
+        handler: function(bits) {
+            throw new Error("Not yet implemented");
+        }
+    },
+    // mm/dd/yyyy (American style)
+    {   re: /(\d{1,2})\/(\d{1,2})\/(\d{4})/,
+        handler: function(bits) {
+            var d = new Date();
+            d.setYear(bits[3]);
+            d.setDate(parseInt(bits[2], 10));
+            d.setMonth(parseInt(bits[1], 10) - 1); // Because months indexed from 0
+            return d;
+        }
+    },
+    // yyyy-mm-dd (ISO style)
+    {   re: /(\d{4})-(\d{1,2})-(\d{1,2})/,
+        handler: function(bits) {
+            var d = new Date();
+            d.setYear(parseInt(bits[1]));
+            d.setDate(parseInt(bits[3], 10));
+            d.setMonth(parseInt(bits[2], 10) - 1);
+            return d;
+        }
+    },
+];
+
+function parseDateString(s) {
+    for (var i = 0; i < dateParsePatterns.length; i++) {
+        var re = dateParsePatterns[i].re;
+        var handler = dateParsePatterns[i].handler;
+        var bits = re.exec(s);
+        if (bits) {
+            return handler(bits);
+        }
+    }
+    throw new Error("Invalid date string");
+}
+
+function fmt00(x) {
+    // fmt00: Tags leading zero onto numbers 0 - 9.
+    // Particularly useful for displaying results from Date methods.
+    //
+    if (Math.abs(parseInt(x)) < 10){
+        x = "0"+ Math.abs(x);
+    }
+    return x;
+}
+
+function parseDateStringISO(s) {
+    try {
+        var d = parseDateString(s);
+        return d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' + fmt00(d.getDate())
+    }
+    catch (e) { return s; }
+}
+function magicDate(input) {
+    var messagespan = input.id + 'Msg';
+    try {
+        var d = parseDateString(input.value);
+        input.value = d.getFullYear() + '-' + (fmt00(d.getMonth() + 1)) + '-' + 
+            fmt00(d.getDate());
+        input.className = '';
+        // Human readable date
+        if (document.getElementById(messagespan)) {
+            document.getElementById(messagespan).firstChild.nodeValue = d.toDateString();
+            document.getElementById(messagespan).className = 'normal';
+        }
+    }
+    catch (e) {
+        input.className = 'error';
+        var message = e.message;
+        // Fix for IE6 bug
+        if (message.indexOf('is null or not an object') > -1) {
+            message = 'Invalid date string';
+        }
+        if (document.getElementById(messagespan)) {
+            document.getElementById(messagespan).firstChild.nodeValue = message;
+            document.getElementById(messagespan).className = 'error';
+        }
+    }
+}

Added: vendor/django/current/django/contrib/admin/media/js/getElementsBySelector.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/getElementsBySelector.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/getElementsBySelector.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,167 @@
+/* document.getElementsBySelector(selector)
+   - returns an array of element objects from the current document
+     matching the CSS selector. Selectors can contain element names, 
+     class names and ids and can be nested. For example:
+     
+       elements = document.getElementsBySelect('div#main p a.external')
+     
+     Will return an array of all 'a' elements with 'external' in their 
+     class attribute that are contained inside 'p' elements that are 
+     contained inside the 'div' element which has id="main"
+
+   New in version 0.4: Support for CSS2 and CSS3 attribute selectors:
+   See http://www.w3.org/TR/css3-selectors/#attribute-selectors
+
+   Version 0.4 - Simon Willison, March 25th 2003
+   -- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows
+   -- Opera 7 fails 
+*/
+
+function getAllChildren(e) {
+  // Returns all children of element. Workaround required for IE5/Windows. Ugh.
+  return e.all ? e.all : e.getElementsByTagName('*');
+}
+
+document.getElementsBySelector = function(selector) {
+  // Attempt to fail gracefully in lesser browsers
+  if (!document.getElementsByTagName) {
+    return new Array();
+  }
+  // Split selector in to tokens
+  var tokens = selector.split(' ');
+  var currentContext = new Array(document);
+  for (var i = 0; i < tokens.length; i++) {
+    token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
+    if (token.indexOf('#') > -1) {
+      // Token is an ID selector
+      var bits = token.split('#');
+      var tagName = bits[0];
+      var id = bits[1];
+      var element = document.getElementById(id);
+      if (tagName && element.nodeName.toLowerCase() != tagName) {
+        // tag with that ID not found, return false
+        return new Array();
+      }
+      // Set currentContext to contain just this element
+      currentContext = new Array(element);
+      continue; // Skip to next token
+    }
+    if (token.indexOf('.') > -1) {
+      // Token contains a class selector
+      var bits = token.split('.');
+      var tagName = bits[0];
+      var className = bits[1];
+      if (!tagName) {
+        tagName = '*';
+      }
+      // Get elements matching tag, filter them for class selector
+      var found = new Array;
+      var foundCount = 0;
+      for (var h = 0; h < currentContext.length; h++) {
+        var elements;
+        if (tagName == '*') {
+            elements = getAllChildren(currentContext[h]);
+        } else {
+            try {
+                elements = currentContext[h].getElementsByTagName(tagName);
+            }
+            catch(e) {
+                elements = [];
+            }
+        }
+        for (var j = 0; j < elements.length; j++) {
+          found[foundCount++] = elements[j];
+        }
+      }
+      currentContext = new Array;
+      var currentContextIndex = 0;
+      for (var k = 0; k < found.length; k++) {
+        if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) {
+          currentContext[currentContextIndex++] = found[k];
+        }
+      }
+      continue; // Skip to next token
+    }
+    // Code to deal with attribute selectors
+    if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) {
+      var tagName = RegExp.$1;
+      var attrName = RegExp.$2;
+      var attrOperator = RegExp.$3;
+      var attrValue = RegExp.$4;
+      if (!tagName) {
+        tagName = '*';
+      }
+      // Grab all of the tagName elements within current context
+      var found = new Array;
+      var foundCount = 0;
+      for (var h = 0; h < currentContext.length; h++) {
+        var elements;
+        if (tagName == '*') {
+            elements = getAllChildren(currentContext[h]);
+        } else {
+            elements = currentContext[h].getElementsByTagName(tagName);
+        }
+        for (var j = 0; j < elements.length; j++) {
+          found[foundCount++] = elements[j];
+        }
+      }
+      currentContext = new Array;
+      var currentContextIndex = 0;
+      var checkFunction; // This function will be used to filter the elements
+      switch (attrOperator) {
+        case '=': // Equality
+          checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); };
+          break;
+        case '~': // Match one of space seperated words 
+          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); };
+          break;
+        case '|': // Match start with value followed by optional hyphen
+          checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); };
+          break;
+        case '^': // Match starts with value
+          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); };
+          break;
+        case '$': // Match ends with value - fails with "Warning" in Opera 7
+          checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); };
+          break;
+        case '*': // Match ends with value
+          checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); };
+          break;
+        default :
+          // Just test for existence of attribute
+          checkFunction = function(e) { return e.getAttribute(attrName); };
+      }
+      currentContext = new Array;
+      var currentContextIndex = 0;
+      for (var k = 0; k < found.length; k++) {
+        if (checkFunction(found[k])) {
+          currentContext[currentContextIndex++] = found[k];
+        }
+      }
+      // alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
+      continue; // Skip to next token
+    }
+    // If we get here, token is JUST an element (not a class or ID selector)
+    tagName = token;
+    var found = new Array;
+    var foundCount = 0;
+    for (var h = 0; h < currentContext.length; h++) {
+      var elements = currentContext[h].getElementsByTagName(tagName);
+      for (var j = 0; j < elements.length; j++) {
+        found[foundCount++] = elements[j];
+      }
+    }
+    currentContext = found;
+  }
+  return currentContext;
+}
+
+/* That revolting regular expression explained 
+/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/
+  \---/  \---/\-------------/    \-------/
+    |      |         |               |
+    |      |         |           The value
+    |      |    ~,|,^,$,* or =
+    |   Attribute 
+   Tag
+*/

Added: vendor/django/current/django/contrib/admin/media/js/timeparse.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/timeparse.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/timeparse.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,94 @@
+var timeParsePatterns = [
+    // 9
+    {   re: /^\d{1,2}$/i,
+        handler: function(bits) {
+            if (bits[0].length == 1) {
+                return '0' + bits[0] + ':00';
+            } else {
+                return bits[0] + ':00';
+            }
+        }
+    },
+    // 13:00
+    {   re: /^\d{2}[:.]\d{2}$/i,
+        handler: function(bits) {
+            return bits[0].replace('.', ':');
+        }
+    },
+    // 9:00
+    {   re: /^\d[:.]\d{2}$/i,
+        handler: function(bits) {
+            return '0' + bits[0].replace('.', ':');
+        }
+    },
+    // 3 am / 3 a.m. / 3am
+    {   re: /^(\d+)\s*([ap])(?:.?m.?)?$/i,
+        handler: function(bits) {
+            var hour = parseInt(bits[1]);
+            if (hour == 12) {
+                hour = 0;
+            }
+            if (bits[2].toLowerCase() == 'p') {
+                if (hour == 12) {
+                    hour = 0;
+                }
+                return (hour + 12) + ':00';
+            } else {
+                if (hour < 10) {
+                    return '0' + hour + ':00';
+                } else {
+                    return hour + ':00';
+                }
+            }
+        }
+    },
+    // 3.30 am / 3:15 a.m. / 3.00am
+    {   re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i,
+        handler: function(bits) {
+            var hour = parseInt(bits[1]);
+            var mins = parseInt(bits[2]);
+            if (mins < 10) {
+                mins = '0' + mins;
+            }
+            if (hour == 12) {
+                hour = 0;
+            }
+            if (bits[3].toLowerCase() == 'p') {
+                if (hour == 12) {
+                    hour = 0;
+                }
+                return (hour + 12) + ':' + mins;
+            } else {
+                if (hour < 10) {
+                    return '0' + hour + ':' + mins;
+                } else {
+                    return hour + ':' + mins;
+                }
+            }
+        }
+    },
+    // noon
+    {   re: /^no/i,
+        handler: function(bits) {
+            return '12:00';
+        }
+    },
+    // midnight
+    {   re: /^mid/i,
+        handler: function(bits) {
+            return '00:00';
+        }
+    }
+];
+
+function parseTimeString(s) {
+    for (var i = 0; i < timeParsePatterns.length; i++) {
+        var re = timeParsePatterns[i].re;
+        var handler = timeParsePatterns[i].handler;
+        var bits = re.exec(s);
+        if (bits) {
+            return handler(bits);
+        }
+    }
+    return s;
+}

Added: vendor/django/current/django/contrib/admin/media/js/urlify.js
===================================================================
--- vendor/django/current/django/contrib/admin/media/js/urlify.js	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/media/js/urlify.js	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,15 @@
+function URLify(s, num_chars) {
+    // changes, e.g., "Petty theft" to "petty_theft"
+    // remove all these words from the string before urlifying
+    removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from",
+                  "is", "in", "into", "like", "of", "off", "on", "onto", "per",
+                  "since", "than", "the", "this", "that", "to", "up", "via",
+                  "with"];
+    r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi');
+    s = s.replace(r, '');
+    s = s.replace(/[^-A-Z0-9\s]/gi, '');  // remove unneeded chars
+    s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
+    s = s.replace(/[-\s]+/g, '-');   // convert spaces to hyphens
+    s = s.toLowerCase();             // convert to lowercase
+    return s.substring(0, num_chars);// trim to first num_chars chars
+}

Added: vendor/django/current/django/contrib/admin/models.py
===================================================================
--- vendor/django/current/django/contrib/admin/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,51 @@
+from django.db import models
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.auth.models import User
+from django.utils.translation import gettext_lazy as _
+
+ADDITION = 1
+CHANGE = 2
+DELETION = 3
+
+class LogEntryManager(models.Manager):
+    def log_action(self, user_id, content_type_id, object_id, object_repr, action_flag, change_message=''):
+        e = self.model(None, None, user_id, content_type_id, object_id, object_repr[:200], action_flag, change_message)
+        e.save()
+
+class LogEntry(models.Model):
+    action_time = models.DateTimeField(_('action time'), auto_now=True)
+    user = models.ForeignKey(User)
+    content_type = models.ForeignKey(ContentType, blank=True, null=True)
+    object_id = models.TextField(_('object id'), blank=True, null=True)
+    object_repr = models.CharField(_('object repr'), maxlength=200)
+    action_flag = models.PositiveSmallIntegerField(_('action flag'))
+    change_message = models.TextField(_('change message'), blank=True)
+    objects = LogEntryManager()
+    class Meta:
+        verbose_name = _('log entry')
+        verbose_name_plural = _('log entries')
+        db_table = 'django_admin_log'
+        ordering = ('-action_time',)
+
+    def __repr__(self):
+        return str(self.action_time)
+
+    def is_addition(self):
+        return self.action_flag == ADDITION
+
+    def is_change(self):
+        return self.action_flag == CHANGE
+
+    def is_deletion(self):
+        return self.action_flag == DELETION
+
+    def get_edited_object(self):
+        "Returns the edited object represented by this log entry"
+        return self.content_type.get_object_for_this_type(pk=self.object_id)
+
+    def get_admin_url(self):
+        """
+        Returns the admin URL to edit the object represented by this log entry.
+        This is relative to the Django admin index page.
+        """
+        return "%s/%s/%s/" % (self.content_type.app_label, self.content_type.model, self.object_id)

Added: vendor/django/current/django/contrib/admin/templates/admin/404.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/404.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/404.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block title %}{% trans 'Page not found' %}{% endblock %}
+
+{% block content %}
+
+<h2>{% trans 'Page not found' %}</h2>
+
+<p>{% trans "We're sorry, but the requested page could not be found." %}</p>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/500.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/500.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/500.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans "Home" %}</a> &rsaquo; {% trans "Server error" %}</div>{% endblock %}
+
+{% block title %}{% trans 'Server error (500)' %}{% endblock %}
+
+{% block content %}
+<h1>{% trans 'Server Error <em>(500)</em>' %}</h1>
+<p>{% trans "There's been an error. It's been reported to the site administrators via e-mail and should be fixed shortly. Thanks for your patience." %}</p>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/base.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/base.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/base.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,51 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE }}" xml:lang="{{ LANGUAGE_CODE }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
+<head>
+<title>{% block title %}{% endblock %}</title>
+<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/base.css{% endblock %}" />
+{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" />{% endif %}
+{% block extrastyle %}{% endblock %}
+{% block extrahead %}{% endblock %}
+</head>
+{% load i18n %}
+
+<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}">
+
+<!-- Container -->
+<div id="container">
+
+    {% if not is_popup %}
+    <!-- Header -->
+    <div id="header">
+        <div id="branding">
+        {% block branding %}{% endblock %}
+        </div>
+        {% if user.is_authenticated and user.is_staff %}
+        <div id="user-tools">{% trans 'Welcome,' %} <strong>{% if user.first_name %}{{ user.first_name|escape }}{% else %}{{ user.username }}{% endif %}</strong>. {% block userlinks %}<a href="doc/">{% trans 'Documentation' %}</a> / <a href="password_change/">{% trans 'Change password' %}</a> / <a href="logout/">{% trans 'Log out' %}</a>{% endblock %}</div>
+        {% endif %}
+        {% block nav-global %}{% endblock %}
+    </div>
+    <!-- END Header -->
+    {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a>{% if title %} &rsaquo; {{ title|escape }}{% endif %}</div>{% endblock %}
+    {% endif %}
+
+        {% if messages %}
+        <ul class="messagelist">{% for message in messages %}<li>{{ message|escape }}</li>{% endfor %}</ul>
+        {% endif %}
+
+    <!-- Content -->
+    <div id="content" class="{% block coltype %}colM{% endblock %}">
+        {% block pretitle %}{% endblock %}
+        {% block content_title %}{% if title %}<h1>{{ title|escape }}</h1>{% endif %}{% endblock %}
+        {% block content %}{{ content }}{% endblock %}
+        {% block sidebar %}{% endblock %}
+        <br class="clear" />
+    </div>
+    <!-- END Content -->
+
+    {% block footer %}<div id="footer"></div>{% endblock %}
+</div>
+<!-- END Container -->
+
+</body>
+</html>

Added: vendor/django/current/django/contrib/admin/templates/admin/base_site.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/base_site.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/base_site.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+{% extends "admin/base.html" %}
+{% load i18n %}
+
+{% block title %}{{ title|escape }} | {% trans 'Django site admin' %}{% endblock %}
+
+{% block branding %}
+<h1 id="site-name">{% trans 'Django administration' %}</h1>
+{% endblock %}
+
+{% block nav-global %}{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/change_form.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/change_form.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/change_form.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,68 @@
+{% extends "admin/base_site.html" %}
+{% load i18n admin_modify adminmedia %}
+{% block extrahead %}{{ block.super }}
+<script type="text/javascript" src="../../../jsi18n/"></script>
+{% for js in javascript_imports %}{% include_admin_script js %}{% endfor %}
+{% endblock %}
+{% block stylesheet %}{% admin_media_prefix %}css/forms.css{% endblock %}
+{% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %}
+{% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %}
+{% block userlinks %}<a href="../../../doc/">{% trans 'Documentation' %}</a> / <a href="../../../password_change/">{% trans 'Change password' %}</a> / <a href="../../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}{% if not is_popup %}
+<div class="breadcrumbs">
+     <a href="../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../">{{ opts.verbose_name_plural|capfirst|escape }}</a> &rsaquo;
+     {% if add %}{% trans "Add" %} {{ opts.verbose_name|escape }}{% else %}{{ original|truncatewords:"18"|escape }}{% endif %}
+</div>
+{% endif %}{% endblock %}
+{% block content %}<div id="content-main">
+{% if change %}{% if not is_popup %}
+  <ul class="object-tools"><li><a href="history/" class="historylink">{% trans "History" %}</a></li>
+  {% if has_absolute_url %}<li><a href="../../../r/{{ content_type_id }}/{{ object_id }}/" class="viewsitelink">{% trans "View on site" %}</a></li>{% endif%}
+  </ul>
+{% endif %}{% endif %}
+<form {% if has_file_field %}enctype="multipart/form-data" {% endif %}action="{{ form_url }}" method="post">{% block form_top %}{% endblock %}
+<div>
+{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
+{% if opts.admin.save_on_top %}{% submit_row %}{% endif %}
+{% if form.error_dict %}
+    <p class="errornote">
+    {% blocktrans count form.error_dict.items|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
+    </p>
+{% endif %}
+{% for bound_field_set in bound_field_sets %}
+   <fieldset class="module aligned {{ bound_field_set.classes }}">
+    {% if bound_field_set.name %}<h2>{{ bound_field_set.name }}</h2>{% endif %}
+    {% if bound_field_set.description %}<div class="description">{{ bound_field_set.description }}</div>{% endif %}
+    {% for bound_field_line in bound_field_set %}
+        {% admin_field_line bound_field_line %}
+        {% for bound_field in bound_field_line %}
+            {% filter_interface_script_maybe bound_field %}
+        {% endfor %}
+    {% endfor %}
+   </fieldset>
+{% endfor %}
+{% block after_field_sets %}{% endblock %}
+{% if change %}
+   {% if ordered_objects %}
+   <fieldset class="module"><h2>{% trans "Ordering" %}</h2>
+   <div class="form-row{% if form.order_.errors %} error{% endif %} ">
+   {% if form.order_.errors %}{{ form.order_.html_error_list }}{% endif %}
+   <p><label for="id_order_">{% trans "Order:" %}</label> {{ form.order_ }}</p>
+   </div></fieldset>
+   {% endif %}
+{% endif %}
+{% for related_object in inline_related_objects %}{% edit_inline related_object %}{% endfor %}
+{% block after_related_objects %}{% endblock %}
+{% submit_row %}
+{% if add %}
+   <script type="text/javascript">document.getElementById("{{ first_form_field_id }}").focus();</script>
+{% endif %}
+{% if auto_populated_fields %}
+   <script type="text/javascript">
+   {% auto_populated_field_script auto_populated_fields change %}
+   </script>
+{% endif %}
+</div>
+</form></div>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/change_list.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/change_list.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/change_list.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,21 @@
+{% extends "admin/base_site.html" %}
+{% load adminmedia admin_list i18n %}
+{% block stylesheet %}{% admin_media_prefix %}css/changelists.css{% endblock %}
+{% block bodyclass %}change-list{% endblock %}
+{% block userlinks %}<a href="../../doc/">{% trans 'Documentation' %}</a> / <a href="../../password_change/">{% trans 'Change password' %}</a> / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% if not is_popup %}{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans "Home" %}</a> &rsaquo; {{ cl.opts.verbose_name_plural|capfirst|escape }}</div>{% endblock %}{% endif %}
+{% block coltype %}flex{% endblock %}
+{% block content %}
+<div id="content-main">
+{% if has_add_permission %}
+<ul class="object-tools"><li><a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink">{% blocktrans with cl.opts.verbose_name|escape as name %}Add {{ name }}{% endblocktrans %}</a></li></ul>
+{% endif %}
+<div class="module{% if cl.has_filters %} filtered{% endif %}" id="changelist">
+{% block search %}{% search_form cl %}{% endblock %}
+{% block date_hierarchy %}{% date_hierarchy cl %}{% endblock %}
+{% block filters %}{% filters cl %}{% endblock %}
+{% block result_list %}{% result_list cl %}{% endblock %}
+{% block pagination %}{% pagination cl %}{% endblock %}
+</div>
+</div>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/change_list_results.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/change_list_results.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/change_list_results.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,17 @@
+{% if results %}
+<table cellspacing="0">
+<thead>
+<tr>
+{% for header in result_headers %}<th{{ header.class_attrib }}>
+{% if header.sortable %}<a href="{{ header.url }}">{% endif %}
+{{ header.text|capfirst }}
+{% if header.sortable %}</a>{% endif %}</th>{% endfor %}
+</tr>
+</thead>
+<tbody>
+{% for result in results %}
+<tr class="{% cycle row1,row2 %}">{% for item in result %}{{ item }}{% endfor %}</tr>
+{% endfor %}
+</tbody>
+</table>
+{% endif %}

Added: vendor/django/current/django/contrib/admin/templates/admin/date_hierarchy.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/date_hierarchy.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/date_hierarchy.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+{% if show %}
+<div class="xfull">
+<ul class="toplinks">
+{% if back %}<li class="date-back"><a href="{{ back.link }}">&lsaquo; {{ back.title|escape }}</a></li>{% endif %}
+{% for choice in choices %}
+<li> {% if choice.link %}<a href="{{ choice.link }}">{% endif %}{{ choice.title|escape }}{% if choice.link %}</a>{% endif %}</li>
+{% endfor %}
+</ul><br class="clear" />
+</div>
+{% endif %}

Added: vendor/django/current/django/contrib/admin/templates/admin/delete_confirmation.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/delete_confirmation.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/delete_confirmation.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,30 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}<a href="../../../../doc/">{% trans 'Documentation' %}</a> / <a href="../../../../password_change/">{% trans 'Change password' %}</a> / <a href="../../../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}
+<div class="breadcrumbs">
+     <a href="../../../../">{% trans "Home" %}</a> &rsaquo;
+     <a href="../../">{{ opts.verbose_name_plural|capfirst|escape }}</a> &rsaquo;
+     <a href="../">{{ object|escape|truncatewords:"18" }}</a> &rsaquo;
+     {% trans 'Delete' %}
+</div>
+{% endblock %}
+{% block content %}
+{% if perms_lacking %}
+    <p>{% blocktrans with object|escape as escaped_object %}Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:{% endblocktrans %}</p>
+    <ul>
+    {% for obj in perms_lacking %}
+        <li>{{ obj|escape }}</li>
+    {% endfor %}
+    </ul>
+{% else %}
+    <p>{% blocktrans with object|escape as escaped_object %}Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:{% endblocktrans %}</p>
+    <ul>{{ deleted_objects|unordered_list }}</ul>
+    <form action="" method="post">
+    <div>
+    <input type="hidden" name="post" value="yes" />
+    <input type="submit" value="{% trans "Yes, I'm sure" %}" />
+    </div>
+    </form>
+{% endif %}
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/edit_inline_stacked.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/edit_inline_stacked.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/edit_inline_stacked.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,16 @@
+{% load admin_modify %}
+<fieldset class="module aligned">
+   {% for fcw in bound_related_object.form_field_collection_wrappers %}
+      <h2>{{ bound_related_object.relation.opts.verbose_name|capfirst|escape }}&nbsp;#{{ forloop.counter }}</h2>
+      {% if bound_related_object.show_url %}{% if fcw.obj.original %}
+      <p><a href="/r/{{ fcw.obj.original.content_type_id }}/{{ fcw.obj.original.id }}/">View on site</a></p>
+      {% endif %}{% endif %}
+      {% for bound_field in fcw.bound_fields %}
+         {% if bound_field.hidden %}
+            {% field_widget bound_field %}
+         {% else %}
+            {% admin_field_line bound_field %}
+         {% endif %}
+      {% endfor %}
+    {% endfor %}
+</fieldset>

Added: vendor/django/current/django/contrib/admin/templates/admin/edit_inline_tabular.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/edit_inline_tabular.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/edit_inline_tabular.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,43 @@
+{% load admin_modify %}
+<fieldset class="module">
+   <h2>{{ bound_related_object.relation.opts.verbose_name_plural|capfirst|escape }}</h2><table>
+   <thead><tr>
+   {% for fw in bound_related_object.field_wrapper_list %}
+      {% if fw.needs_header %}
+         <th{{ fw.header_class_attribute }}>{{ fw.field.verbose_name|capfirst|escape }}</th>
+      {% endif %}
+   {% endfor %}
+   {% for fcw in bound_related_object.form_field_collection_wrappers %}
+      {% if change %}{% if original_row_needed %}
+         {% if fcw.obj.original %}
+            <tr class="row-label {% cycle row1,row2 %}"><td colspan="{{ num_headers }}"><strong>{{ fcw.obj.original }}</strong></tr>
+         {% endif %}
+      {% endif %}{% endif %}
+      {% if fcw.obj.errors %}
+         <tr class="errorlist"><td colspan="{{ num_headers }}">
+            {{ fcw.obj.html_combined_error_list }}
+         </tr>
+      {% endif %}
+      <tr class="{% cycle row1,row2 %}">
+      {% for bound_field in fcw.bound_fields %}
+         {% if not bound_field.hidden %}
+         <td {{ bound_field.cell_class_attribute }}>
+            {% field_widget bound_field %}
+         </td>
+         {% endif %}
+      {% endfor %}
+      {% if bound_related_object.show_url %}<td>
+         {% if fcw.obj.original %}<a href="/r/{{ fcw.obj.original.content_type_id }}/{{ fcw.obj.original.id }}/">View on site</a>{% endif %}
+      </td>{% endif %}
+      </tr>
+
+   {% endfor %} </table>
+
+   {% for fcw in bound_related_object.form_field_collection_wrappers %}
+      {% for bound_field in fcw.bound_fields %}
+         {% if bound_field.hidden %}
+            {% field_widget bound_field %}
+         {% endif %}
+      {% endfor %}
+   {% endfor %}
+</fieldset>

Added: vendor/django/current/django/contrib/admin/templates/admin/field_line.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/field_line.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/field_line.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+{% load admin_modify %}
+<div class="{{ class_names }}" >
+{% for bound_field in bound_fields %}{{ bound_field.html_error_list }}{% endfor %}
+{% for bound_field in bound_fields %}
+  {% if bound_field.has_label_first %}{% field_label bound_field %}{% endif %}
+  {% field_widget bound_field %}
+  {% if not bound_field.has_label_first %}{% field_label bound_field %}{% endif %}
+  {% if bound_field.field.help_text %}<p class="help">{{ bound_field.field.help_text }}</p>{% endif %}
+{% endfor %}
+</div>

Added: vendor/django/current/django/contrib/admin/templates/admin/filter.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/filter.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/filter.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,8 @@
+{% load i18n %}
+<h3>{% blocktrans with title|escape as filter_title %} By {{ filter_title }} {% endblocktrans %}</h3>
+<ul>
+{% for choice in choices %}
+    <li{% if choice.selected %} class="selected"{% endif %}>
+    <a href="{{ choice.query_string }}">{{ choice.display|escape }}</a></li>
+{% endfor %}
+</ul>

Added: vendor/django/current/django/contrib/admin/templates/admin/filters.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/filters.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/filters.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,7 @@
+{% load admin_list %}
+{% load i18n %}
+{% if cl.has_filters %}<div id="changelist-filter">
+<h2>{% trans 'Filter' %}</h2>
+{% for spec in cl.filter_specs %}
+   {% filter cl spec %}
+{% endfor %}</div>{% endif %}

Added: vendor/django/current/django/contrib/admin/templates/admin/index.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/index.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/index.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,67 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css{% endblock %}
+{% block coltype %}colMS{% endblock %}
+{% block bodyclass %}dashboard{% endblock %}
+{% block breadcrumbs %}{% endblock %}
+{% block content %}
+<div id="content-main">
+
+{% load adminapplist %}
+
+{% get_admin_app_list as app_list %}
+{% if app_list %}
+    {% for app in app_list %}
+        <div class="module">
+        <table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}">
+        <caption>{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</caption>
+        {% for model in app.models %}
+            <tr>
+            {% if model.perms.change %}
+                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name|escape }}</a></th>
+            {% else %}
+                <th scope="row">{{ model.name|escape }}</th>
+            {% endif %}
+
+            {% if model.perms.add %}
+                <td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td>
+            {% else %}
+                <td>&nbsp;</td>
+            {% endif %}
+
+            {% if model.perms.change %}
+                <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
+            {% else %}
+                <td>&nbsp;</td>
+            {% endif %}
+            </tr>
+        {% endfor %}
+        </table>
+        </div>
+    {% endfor %}
+{% else %}
+    <p>{% trans "You don't have permission to edit anything." %}</p>
+{% endif %}
+</div>
+{% endblock %}
+
+{% block sidebar %}
+<div id="content-related">
+    <div class="module" id="recent-actions-module">
+        <h2>{% trans 'Recent Actions' %}</h2>
+        <h3>{% trans 'My Actions' %}</h3>
+            {% load log %}
+            {% get_admin_log 10 as admin_log for_user user %}
+            {% if not admin_log %}
+            <p>{% trans 'None available' %}</p>
+            {% else %}
+            <ul class="actionlist">
+            {% for entry in admin_log %}
+                <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">{% if not entry.is_deletion %}<a href="{{ entry.get_admin_url }}">{% endif %}{{ entry.object_repr|escape }}{% if not entry.is_deletion %}</a>{% endif %}<br /><span class="mini quiet">{{ entry.content_type.name|capfirst|escape }}</span></li>
+            {% endfor %}
+            </ul>
+            {% endif %}
+    </div>
+</div>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/invalid_setup.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/invalid_setup.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/invalid_setup.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> &rsaquo; {{ title|escape }}</div>{% endblock %}
+
+{% block content %}
+
+<p>{% trans "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user." %}</p>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/login.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/login.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/login.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,33 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/login.css{% endblock %}
+{% block bodyclass %}login{% endblock %}
+{% block content_title %}{% endblock %}
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+
+{% if error_message %}
+<p class="errornote">{{ error_message }}</p>
+{% endif %}
+<div id="content-main">
+<form action="{{ app_path }}" method="post" id="login-form">
+  <div class="form-row">
+    <label for="id_username">{% trans 'Username:' %}</label> <input type="text" name="username" id="id_username" />
+  </div>
+  <div class="form-row">
+    <label for="id_password">{% trans 'Password:' %}</label> <input type="password" name="password" id="id_password" />
+    <input type="hidden" name="this_is_the_login_form" value="1" />
+    <input type="hidden" name="post_data" value="{{ post_data }}" /> {% comment %}<span class="help">{% trans 'Have you <a href="/password_reset/">forgotten your password</a>?' %}</span>{% endcomment %}
+  </div>
+  <div class="submit-row">
+    <label>&nbsp;</label><input type="submit" value="{% trans 'Log in' %}" />
+  </div>
+</form>
+
+<script type="text/javascript">
+document.getElementById('id_username').focus()
+</script>
+</div>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/object_history.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/object_history.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/object_history.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,43 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}<a href="../../../../doc/">{% trans 'Documentation' %}</a> / <a href="../../../../password_change/">{% trans 'Change password' %}</a> / <a href="../../../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}
+<div class="breadcrumbs"><a href="../../../../">{% trans 'Home' %}</a> &rsaquo; <a href="../../">{{ module_name|escape }}</a> &rsaquo; <a href="../">{{ object|escape|truncatewords:"18" }}</a> &rsaquo; {% trans 'History' %}</div>
+{% endblock %}
+
+{% block content %}
+
+<div id="content-main">
+<div class="module">
+
+{% if action_list %}
+
+    <table id="change-history">
+        <thead>
+        <tr>
+            <th scope="col">{% trans 'Date/time' %}</th>
+            <th scope="col">{% trans 'User' %}</th>
+            <th scope="col">{% trans 'Action' %}</th>
+        </tr>
+        </thead>
+        <tbody>
+        {% for action in action_list %}
+        <tr>
+            <th scope="row">{{ action.action_time|date:_("DATE_WITH_TIME_FULL") }}</th>
+            <td>{{ action.user.username }}{% if action.user.first_name %} ({{ action.user.first_name|escape }} {{ action.user.last_name|escape }}){% endif %}</td>
+            <td>{{ action.change_message|escape }}</td>
+        </tr>
+        {% endfor %}
+        </tbody>
+    </table>
+
+{% else %}
+
+    <p>{% trans "This object doesn't have a change history. It probably wasn't added via this admin site." %}</p>
+
+{% endif %}
+
+</div>
+</div>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin/pagination.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/pagination.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/pagination.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,11 @@
+{% load admin_list %}
+{% load i18n %}
+<p class="paginator">
+{% if pagination_required %}
+{% for i in page_range %}
+    {% paginator_number cl i %}
+{% endfor %}
+{% endif %}
+{{ cl.result_count }} {% ifequal cl.result_count 1 %}{{ cl.opts.verbose_name|escape }}{% else %}{{ cl.opts.verbose_name_plural|escape }}{% endifequal %}
+{% if show_all_url %}&nbsp;&nbsp;<a href="{{ show_all_url }}" class="showall">{% trans 'Show all' %}</a>{% endif %}
+</p>

Added: vendor/django/current/django/contrib/admin/templates/admin/search_form.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/search_form.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/search_form.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,18 @@
+{% load adminmedia %}
+{% load i18n %}
+{% if cl.lookup_opts.admin.search_fields %}
+<div id="toolbar"><form id="changelist-search" action="" method="get">
+<div><!-- DIV needed for valid HTML -->
+<label for="searchbar"><img src="{% admin_media_prefix %}img/admin/icon_searchbox.png" alt="Search" /></label>
+<input type="text" size="40" name="{{ search_var }}" value="{{ cl.query|escape }}" id="searchbar" />
+<input type="submit" value="{% trans 'Go' %}" />
+{% if show_result_count %}
+    <span class="small quiet">{% blocktrans count cl.result_count as counter %}1 result{% plural %}{{ counter }} results{% endblocktrans %} (<a href="?">{% blocktrans with cl.full_result_count as full_result_count %}{{ full_result_count }} total{% endblocktrans %}</a>)</span>
+{% endif %}
+{% for pair in cl.params.items %}
+    {% ifnotequal pair.0 search_var %}<input type="hidden" name="{{ pair.0|escape }}" value="{{ pair.1|escape }}"/>{% endifnotequal %}
+{% endfor %}
+</div>
+</form></div>
+<script type="text/javascript">document.getElementById("searchbar").focus();</script>
+{% endif %}

Added: vendor/django/current/django/contrib/admin/templates/admin/submit_line.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/submit_line.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/submit_line.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,8 @@
+{% load i18n %}
+<div class="submit-row">
+{% if show_delete_link %}<p class="float-left"><a href="delete/" class="deletelink">{% trans "Delete" %}</a></p>{% endif %}
+{% if show_save_as_new %}<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" {{ onclick_attrib }}/>{%endif%}
+{% if show_save_and_add_another %}<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" {{ onclick_attrib }} />{% endif %}
+{% if show_save_and_continue %}<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" {{ onclick_attrib }}/>{% endif %}
+{% if show_save %}<input type="submit" value="{% trans 'Save' %}" class="default" {{ onclick_attrib }}/>{% endif %}
+</div>

Added: vendor/django/current/django/contrib/admin/templates/admin/template_validator.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin/template_validator.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin/template_validator.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,31 @@
+{% extends "admin/base_site.html" %}
+
+{% block content %}
+
+<div id="content-main">
+
+<form action="" method="post">
+
+{% if form.error_dict %}
+<p class="errornote">Your template had {{ form.error_dict.items|length }} error{{ form.error_dict.items|pluralize }}:</p>
+{% endif %}
+
+<fieldset class="module aligned">
+<div class="form-row{% if form.site.errors %} error{% endif %} required">
+    {% if form.site.errors %}{{ form.site.html_error_list }}{% endif %}
+    <h4><label for="id_site">Site:</label> {{ form.site }}</h4>
+</div>
+<div class="form-row{% if form.template.errors %} error{% endif %} required">
+    {% if form.template.errors %}{{ form.template.html_error_list }}{% endif %}
+    <h4><label for="id_template">Template:</label> {{ form.template }}</h4>
+</div>
+</fieldset>
+
+<div class="submit-row">
+    <input type="submit" value="Check for errors" class="default" />
+</div>
+
+</form>
+</div>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/bookmarklets.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/bookmarklets.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/bookmarklets.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,32 @@
+{% extends "admin/base_site.html" %}
+
+{% block breadcrumbs %}{% load i18n %}<div class="breadcrumbs"><a href="../../">{% trans "Home" %}</a> &rsaquo; <a href="../">{% trans "Documentation" %}</a> &rsaquo; {% trans "Bookmarklets" %}</div>{% endblock %}
+{% block userlinks %}<a href="../../password_change/">{% trans 'Change password' %}</a> / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block title %}{% trans "Documentation bookmarklets" %}{% endblock %}
+
+{% block content %}
+
+{% blocktrans %}
+<p class="help">To install bookmarklets, drag the link to your bookmarks
+toolbar, or right-click the link and add it to your bookmarks. Now you can
+select the bookmarklet from any page in the site.  Note that some of these
+bookmarklets require you to be viewing the site from a computer designated
+as "internal" (talk to your system administrator if you aren't sure if
+your computer is "internal").</p>
+{% endblocktrans %}
+
+<div id="content-main">
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){x=new XMLHttpRequest()}else{return;}x.open('HEAD',location.href,false);x.send(null);try{view=x.getResponseHeader('x-view');}catch(e){alert('No view found for this page');return;}if(view=='undefined'){alert('No view found for this page');}document.location='{{ admin_url }}doc/views/'+view+'/';})()">{% trans "Documentation for this page" %}</a></h3>
+    <p>{% trans "Jumps you from any page to the documentation for the view that generates that page." %}</p>
+
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){x=new XMLHttpRequest()}else{return;}x.open('GET',location.href,false);x.send(null);try{type=x.getResponseHeader('x-object-type');id=x.getResponseHeader('x-object-id');}catch(e){type='(none)';id='(none)';}d=document;b=d.body;e=d.createElement('div');e.id='xxxhhh';s=e.style;s.position='absolute';s.left='10px';s.top='10px';s.font='10px monospace';s.border='1px black solid';s.padding='4px';s.backgroundColor='#eee';e.appendChild(d.createTextNode('Type: '+type));e.appendChild(d.createElement('br'));e.appendChild(d.createTextNode('ID: '+id));e.appendChild(d.createElement('br'));l=d.createElement('a');l.href='#';l.onclick=function(){b.removeChild(e);};l.appendChild(d.createTextNode('[close]'));l.style.textDecoration='none';e.appendChild(l);b.appendChild(e);})();">{% trans "Show object ID" %}</a></h3>
+    <p>{% trans "Shows the content-type and unique ID for pages that represent a single object." %}</p>
+
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){var x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){var x=new XMLHttpRequest()}else{return;}x.open('GET',location.href,false);x.send(null);try{var type=x.getResponseHeader('x-object-type');var id=x.getResponseHeader('x-object-id');}catch(e){return;}document.location='{{ admin_url }}'+type.split('.').join('/')+'/'+id+'/';})()">{% trans "Edit this object (current window)" %}</a></h3>
+    <p>{% trans "Jumps to the admin page for pages that represent a single object." %}</p>
+
+    <h3><a href="javascript:(function(){if(typeof ActiveXObject!='undefined'){var x=new ActiveXObject('Microsoft.XMLHTTP')}else if(typeof XMLHttpRequest!='undefined'){var x=new XMLHttpRequest()}else{return;}x.open('GET',location.href,false);x.send(null);try{var type=x.getResponseHeader('x-object-type');var id=x.getResponseHeader('x-object-id');}catch(e){return;}window.open('{{ admin_url }}'+type.split('.').join('/')+'/'+id+'/');})()">{% trans "Edit this object (new window)" %}</a></h3>
+    <p>{% trans "As above, but opens the admin page in a new window." %}</p>
+</div>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/index.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/index.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/index.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,28 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Documentation</div>{% endblock %}
+{% block userlinks %}<a href="../password_change/">{% trans 'Change password' %}</a> / <a href="../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block title %}Documentation{% endblock %}
+
+{% block content %}
+
+<h1>Documentation</h1>
+
+<div id="content-main">
+  <h3><a href="tags/">Tags</a></h3>
+  <p>List of all the template tags and their functions.</p>
+
+  <h3><a href="filters/">Filters</a></h3>
+  <p>Filters are actions which can be applied to variables in a template to alter the output.</p>
+
+  <h3><a href="models/">Models</a></h3>
+  <p>Models are descriptions of all the objects in the system and their associated fields. Each model has a list of fields which can be accessed as template variables.</p>
+
+  <h3><a href="views/">Views</a></h3>
+  <p>Each page on the public site is generated by a view. The view defines which template is used to generate the page and which objects are available to that template.</p>
+
+    <h3><a href="bookmarklets/">Bookmarklets</a></h3>
+    <p>Tools for your browser to quickly access admin functionality.</p>
+</div>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/missing_docutils.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/missing_docutils.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/missing_docutils.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,17 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> &rsaquo; Documentation</div>{% endblock %}
+{% block userlinks %}<a href="../password_change/">{% trans 'Change password' %}</a> / <a href="../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block title %}Please install docutils{% endblock %}
+
+{% block content %}
+
+<h1>Documentation</h1>
+
+<div id="content-main">
+  <h3>The admin documentation system requires Python's <a href="http://docutils.sf.net/">docutils</a> library.</h3>
+
+  <p>Please ask your administrators to install <a href="http://docutils.sf.net/">docutils</a>.</p>
+</div>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/model_detail.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/model_detail.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/model_detail.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,47 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}<a href="../../../password_change/">{% trans 'Change password' %}</a> / <a href="../../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block extrahead %}
+{{ block.super }}
+<style type="text/css">
+.module table { width:100%; }
+.module table p { padding: 0; margin: 0; }
+</style>
+{% endblock %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> &rsaquo; <a href="../../">Documentation</a> &rsaquo; <a href="../">Models</a> &rsaquo; {{ name|escape }}</div>{% endblock %}
+
+{% block title %}Model: {{ name|escape }}{% endblock %}
+
+{% block content %}
+<div id="content-main">
+<h1>{{ summary|escape }}</h1>
+
+{% if description %}
+  <p>{% filter escape|linebreaksbr %}{% trans description %}{% endfilter %}</p>
+{% endif %}
+
+<div class="module">
+<table class="model">
+<thead>
+<tr>
+    <th>Field</th>
+    <th>Type</th>
+    <th>Description</th>
+</tr>
+</thead>
+<tbody>
+{% for field in fields|dictsort:"name" %}
+<tr>
+    <td>{{ field.name }}</td>
+    <td>{{ field.data_type }}</td>
+    <td>{% if field.verbose %}{{ field.verbose|escape }}{% endif %}{% if field.help_text %} - {{ field.help_text|escape }}{% endif %}</td>
+</tr>
+{% endfor %}
+</tbody>
+</table>
+</div>
+
+<p class="small"><a href="../">&lsaquo; Back to Models Documentation</a></p>
+</div>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/model_index.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/model_index.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/model_index.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,45 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; Models</div>{% endblock %}
+{% block userlinks %}<a href="../../password_change/">{% trans 'Change password' %}</a> / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+
+{% block title %}Models{% endblock %}
+
+{% block content %}
+
+<h1>Model documentation</h1>
+
+{% regroup models by app_label as grouped_models %}
+
+<div id="content-main">
+{% for group in grouped_models %}
+<div class="module">
+<h2 id="{{ group.grouper }}">{{ group.grouper|capfirst }}</h2>
+
+<table class="xfull">
+{% for model in group.list %}
+<tr>
+<th><a href="{{ model.app_label }}.{{ model.object_name.lower }}/">{{ model.object_name }}</a></th>
+</tr>
+{% endfor %}
+</table>
+</div>
+{% endfor %}
+
+</div>
+{% endblock %}
+
+{% block sidebar %}
+<div id="content-related" class="sidebar">
+<div class="module">
+<h2>Model groups</h2>
+<ul>
+{% regroup models by app_label as grouped_models %}
+{% for group in grouped_models %}
+    <li><a href="#{{ group.grouper }}">{{ group.grouper|capfirst }}</a></li>
+{% endfor %}
+</ul>
+</div>
+</div>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/template_detail.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/template_detail.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/template_detail.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,22 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> &rsaquo; <a href="../../">Documentation</a> &rsaquo; Templates &rsaquo; {{ name|escape }}</div>{% endblock %}
+{% block userlinks %}<a href="../../../password_change/">{% trans 'Change password' %}</a> / <a href="../../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+
+{% block title %}Template: {{ name|escape }}{% endblock %}
+
+{% block content %}
+<h1>Template: "{{ name|escape }}"</h1>
+
+{% regroup templates|dictsort:"site_id" by site as templates_by_site %}
+{% for group in templates_by_site %}
+    <h2>Search path for template "{{ name|escape }}" on {{ group.grouper }}:</h2>
+    <ol>
+    {% for template in group.list|dictsort:"order" %}
+        <li><code>{{ template.file|escape }}</code>{% if not template.exists %} <em>(does not exist)</em>{% endif %}</li>
+    {% endfor %}
+    </ol>
+{% endfor %}
+
+<p class="small"><a href="../../">&lsaquo; Back to Documentation</a></p>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/template_filter_index.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/template_filter_index.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/template_filter_index.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,48 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; filters</div>{% endblock %}
+{% block userlinks %}<a href="../../password_change/">{% trans 'Change password' %}</a> / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block title %}Template filters{% endblock %}
+
+{% block content %}
+
+<h1>Template filter documentation</h1>
+
+<div id="content-main">
+{% regroup filters|dictsort:"library" by library as filter_libraries %}
+{% for library in filter_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in filters{% endif %}</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>
+    <p>{{ filter.title }}</p>
+    <p>{{ filter.body }}</p>
+    {% if not forloop.last %}<hr />{% endif %}
+    {% endfor %}
+</div>
+{% endfor %}
+</div>
+
+{% endblock %}
+
+{% block sidebar %}
+
+<div id="content-related">
+
+{% regroup filters|dictsort:"library" by library as filter_libraries %}
+{% for library in filter_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in filters{% endif %}</h2>
+    <ul>
+    {% for filter in library.list|dictsort:"name" %}
+        <li><a href="#{{ filter.name }}">{{ filter.name }}</a></li>
+    {% endfor %}
+    </ul>
+</div>
+{% endfor %}
+
+</div>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/template_tag_index.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/template_tag_index.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/template_tag_index.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,48 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; Tags</div>{% endblock %}
+{% block userlinks %}<a href="../../password_change/">{% trans 'Change password' %}</a> / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block title %}Template tags{% endblock %}
+
+{% block content %}
+
+<h1>Template tag documentation</h1>
+
+<div id="content-main">
+{% regroup tags|dictsort:"library" by library as tag_libraries %}
+{% for library in tag_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in tags{% endif %}</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>
+    <h4>{{ tag.title }}</h4>
+    <p>{{ tag.body }}</p>
+    {% if not forloop.last %}<hr />{% endif %}
+    {% endfor %}
+</div>
+{% endfor %}
+</div>
+
+{% endblock %}
+
+{% block sidebar %}
+
+<div id="content-related">
+
+{% regroup tags|dictsort:"library" by library as tag_libraries %}
+{% for library in tag_libraries %}
+<div class="module">
+    <h2>{% if library.grouper %}{{ library.grouper }}{% else %}Built-in tags{% endif %}</h2>
+    <ul>
+    {% for tag in library.list|dictsort:"name" %}
+        <li><a href="#{{ tag.name }}">{{ tag.name }}</a></li>
+    {% endfor %}
+    </ul>
+</div>
+{% endfor %}
+
+</div>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/view_detail.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/view_detail.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/view_detail.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,26 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> &rsaquo; <a href="../../">Documentation</a> &rsaquo; <a href="../">Views</a> &rsaquo; {{ name }}</div>{% endblock %}
+{% block userlinks %}<a href="../../../password_change/">{% trans 'Change password' %}</a> / <a href="../../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block title %}View: {{ name }}{% endblock %}
+
+{% block content %}
+
+<h1>{{ name }}</h1>
+
+<h2 class="subhead">{{ summary|escape }}</h2>
+
+<p>{{ body }}</p>
+
+{% if meta.Context %}
+<h3>Context:</h3>
+<p>{{ meta.Context }}</p>
+{% endif %}
+
+{% if meta.Templates %}
+<h3>Templates:</h3>
+<p>{{ meta.Templates }}</p>
+{% endif %}
+
+<p class="small"><a href="../">&lsaquo; Back to Views Documentation</a></p>
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/admin_doc/view_index.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/admin_doc/view_index.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/admin_doc/view_index.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,43 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block coltype %}colSM{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> &rsaquo; <a href="../">Documentation</a> &rsaquo; Views</div>{% endblock %}
+{% block userlinks %}<a href="../../password_change/">{% trans 'Change password' %}</a> / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block title %}Views{% endblock %}
+
+{% block content %}
+
+<h1>View documentation</h1>
+
+{% regroup views|dictsort:"site_id" by site as views_by_site %}
+
+<div id="content-related" class="sidebar">
+<div class="module">
+<h2>Jump to site</h2>
+<ul>
+    {% for site_views in views_by_site %}
+    <li><a href="#site{{ site_views.grouper.id }}">{{ site_views.grouper.name }}</a></li>
+    {% endfor %}
+</ul>
+</div>
+</div>
+
+<div id="content-main">
+
+{% for site_views in views_by_site %}
+<div class="module">
+<h2 id="site{{ site_views.grouper.id }}">Views by URL on {{ site_views.grouper.name }}</h2>
+
+{% for view in site_views.list|dictsort:"url" %}
+{% ifchanged %}
+<h3><a href="{{ view.module }}.{{ view.name }}/"/>{{ view.url|escape }}</a></h3>
+<p class="small quiet">View function: {{ view.module }}.{{ view.name }}</p>
+<p>{{ view.title }}</p>
+<hr>
+{% endifchanged %}
+{% endfor %}
+</div>
+{% endfor %}
+</div>
+{% endblock %}
+

Added: vendor/django/current/django/contrib/admin/templates/registration/logged_out.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/registration/logged_out.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/registration/logged_out.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,12 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a></div>{% endblock %}
+
+{% block content %}
+
+<p>{% trans "Thanks for spending some quality time with the Web site today." %}</p>
+
+<p><a href="../">{% trans 'Log in again' %}</a></p>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/registration/password_change_done.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/registration/password_change_done.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/registration/password_change_done.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,14 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}<a href="../../doc/">{% trans 'Documentation' %}</a> / {% trans 'Change password' %} / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password change' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password change successful' %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'Password change successful' %}</h1>
+
+<p>{% trans 'Your password was changed.' %}</p>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/registration/password_change_form.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/registration/password_change_form.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/registration/password_change_form.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,26 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+{% block userlinks %}<a href="../doc/">{% trans 'Documentation' %}</a> / {% trans 'Change password' %} / <a href="../logout/">{% trans 'Log out' %}</a>{% endblock %}
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password change' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password change' %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'Password change' %}</h1>
+
+<p>{% trans "Please enter your old password, for security's sake, and then enter your new password twice so we can verify you typed it in correctly." %}</p>
+
+<form action="" method="post">
+
+{% if form.old_password.errors %}{{ form.old_password.html_error_list }}{% endif %}
+<p class="aligned wide"><label for="id_old_password">{% trans 'Old password:' %}</label>{{ form.old_password }}</p>
+{% if form.new_password1.errors %}{{ form.new_password1.html_error_list }}{% endif %}
+<p class="aligned wide"><label for="id_new_password1">{% trans 'New password:' %}</label>{{ form.new_password1 }}</p>
+{% if form.new_password2.errors %}{{ form.new_password2.html_error_list }}{% endif %}
+<p class="aligned wide"><label for="id_new_password2">{% trans 'Confirm password:' %}</label>{{ form.new_password2 }}</p>
+
+<p><input type="submit" value="{% trans 'Change my password' %}" /></p>
+</form>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/registration/password_reset_done.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/registration/password_reset_done.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/registration/password_reset_done.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,14 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset' %}</div>{% endblock %}
+
+{% block title %}{% trans 'Password reset successful' %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans 'Password reset successful' %}</h1>
+
+<p>{% trans "We've e-mailed a new password to the e-mail address you submitted. You should be receiving it shortly." %}</p>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/registration/password_reset_email.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/registration/password_reset_email.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/registration/password_reset_email.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,15 @@
+{% load i18n %}
+{% trans "You're receiving this e-mail because you requested a password reset" %}
+{% blocktrans %}for your user account at {{ site_name }}{% endblocktrans %}.
+
+{% blocktrans %}Your new password is: {{ new_password }}{% endblocktrans %}
+
+{% trans "Feel free to change this password by going to this page:" %}
+
+http://{{ domain }}/password_change/
+
+{% trans "Your username, in case you've forgotten:" %} {{ user.username }}
+
+{% trans "Thanks for using our site!" %}
+
+{% blocktrans %}The {{ site_name }} team{% endblocktrans %}

Added: vendor/django/current/django/contrib/admin/templates/registration/password_reset_form.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/registration/password_reset_form.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/registration/password_reset_form.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,19 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> &rsaquo; {% trans 'Password reset' %}</div>{% endblock %}
+
+{% block title %}{% trans "Password reset" %}{% endblock %}
+
+{% block content %}
+
+<h1>{% trans "Password reset" %}</h1>
+
+<p>{% trans "Forgotten your password? Enter your e-mail address below, and we'll reset your password and e-mail the new one to you." %}</p>
+
+<form action="" method="post">
+{% if form.email.errors %}{{ form.email.html_error_list }}{% endif %}
+<p><label for="id_email">{% trans 'E-mail address:' %}</label> {{ form.email }} <input type="submit" value="{% trans 'Reset my password' %}" /></p>
+</form>
+
+{% endblock %}

Added: vendor/django/current/django/contrib/admin/templates/widget/date_time.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/widget/date_time.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/widget/date_time.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,5 @@
+{% load i18n %}
+<p class="datetime"> 
+   {% trans "Date:" %} {{ bound_field.form_fields.0 }}<br />
+   {% trans "Time:" %} {{ bound_field.form_fields.1 }}
+</p>

Added: vendor/django/current/django/contrib/admin/templates/widget/default.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/widget/default.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/widget/default.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+{% load admin_modify %}{% output_all bound_field.form_fields %}

Added: vendor/django/current/django/contrib/admin/templates/widget/file.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/widget/file.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/widget/file.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,4 @@
+{% load admin_modify i18n %}{% if bound_field.original_value %}
+{% trans "Currently:" %} <a href="{{ bound_field.original_url }}" > {{ bound_field.original_value|escape }} </a><br />
+{% trans "Change:" %}{% output_all bound_field.form_fields %}
+{% else %} {% output_all bound_field.form_fields %} {% endif %}

Added: vendor/django/current/django/contrib/admin/templates/widget/foreign.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/widget/foreign.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/widget/foreign.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,20 @@
+{% load admin_modify adminmedia %}
+{% output_all bound_field.form_fields %}
+{% if bound_field.raw_id_admin %}
+    {% if bound_field.field.rel.limit_choices_to %}
+        <a href="{{ bound_field.related_url }}?{% for limit_choice in bound_field.field.rel.limit_choices_to.items %}{% if not forloop.first %}&amp;{% endif %}{{ limit_choice|join:"=" }}{% endfor %}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
+    {% else %}
+        <a href="{{ bound_field.related_url }}" class="related-lookup" id="lookup_{{ bound_field.element_id }}" onclick="return showRelatedObjectLookupPopup(this);"> <img src="{% admin_media_prefix %}img/admin/selector-search.gif" width="16" height="16" alt="Lookup"></a>
+    {% endif %}
+{% else %}
+{% if bound_field.needs_add_label %}
+    <a href="{{ bound_field.related_url }}add/" class="add-another" id="add_{{ bound_field.element_id }}" onclick="return showAddAnotherPopup(this);"> <img src="{% admin_media_prefix %}img/admin/icon_addlink.gif" width="10" height="10" alt="Add Another"/></a>
+{% endif %}{% endif %}
+{% if change %}
+    {% if bound_field.field.primary_key %}
+        {{ bound_field.original_value }}
+    {% endif %}
+    {% if bound_field.raw_id_admin %}
+        {% if bound_field.existing_display %}&nbsp;<strong>{{ bound_field.existing_display|truncatewords:"14"|escape }}</strong>{% endif %}
+    {% endif %}
+{% endif %}

Added: vendor/django/current/django/contrib/admin/templates/widget/many_to_many.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/widget/many_to_many.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/widget/many_to_many.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+{% include "widget/foreign.html" %}

Added: vendor/django/current/django/contrib/admin/templates/widget/one_to_one.html
===================================================================
--- vendor/django/current/django/contrib/admin/templates/widget/one_to_one.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templates/widget/one_to_one.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2 @@
+{% if add %}{% include "widget/foreign.html" %}{% endif %}
+{% if change %}{% if bound_field.existing_display %}&nbsp;<strong>{{ bound_field.existing_display|truncatewords:"14"|escape }}</strong>{% endif %}{% endif %}

Added: vendor/django/current/django/contrib/admin/templatetags/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/admin/templatetags/admin_list.py
===================================================================
--- vendor/django/current/django/contrib/admin/templatetags/admin_list.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templatetags/admin_list.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,262 @@
+from django.conf import settings
+from django.contrib.admin.views.main import ALL_VAR, EMPTY_CHANGELIST_VALUE
+from django.contrib.admin.views.main import ORDER_VAR, ORDER_TYPE_VAR, PAGE_VAR, SEARCH_VAR
+from django.core.exceptions import ObjectDoesNotExist
+from django.db import models
+from django.utils import dateformat
+from django.utils.html import escape
+from django.utils.text import capfirst
+from django.utils.translation import get_date_formats, get_partial_date_formats
+from django.template import Library
+import datetime
+
+register = Library()
+
+DOT = '.'
+
+def paginator_number(cl,i):
+    if i == DOT:
+        return '... '
+    elif i == cl.page_num:
+        return '<span class="this-page">%d</span> ' % (i+1)
+    else:
+        return '<a href="%s"%s>%d</a> ' % (cl.get_query_string({PAGE_VAR: i}), (i == cl.paginator.pages-1 and ' class="end"' or ''), i+1)
+paginator_number = register.simple_tag(paginator_number)
+
+def pagination(cl):
+    paginator, page_num = cl.paginator, cl.page_num
+
+    pagination_required = (not cl.show_all or not cl.can_show_all) and cl.multi_page
+    if not pagination_required:
+        page_range = []
+    else:
+        ON_EACH_SIDE = 3
+        ON_ENDS = 2
+
+        # If there are 10 or fewer pages, display links to every page.
+        # Otherwise, do some fancy
+        if paginator.pages <= 10:
+            page_range = range(paginator.pages)
+        else:
+            # Insert "smart" pagination links, so that there are always ON_ENDS
+            # links at either end of the list of pages, and there are always
+            # ON_EACH_SIDE links at either end of the "current page" link.
+            page_range = []
+            if page_num > (ON_EACH_SIDE + ON_ENDS):
+                page_range.extend(range(0, ON_EACH_SIDE - 1))
+                page_range.append(DOT)
+                page_range.extend(range(page_num - ON_EACH_SIDE, page_num + 1))
+            else:
+                page_range.extend(range(0, page_num + 1))
+            if page_num < (paginator.pages - ON_EACH_SIDE - ON_ENDS - 1):
+                page_range.extend(range(page_num + 1, page_num + ON_EACH_SIDE + 1))
+                page_range.append(DOT)
+                page_range.extend(range(paginator.pages - ON_ENDS, paginator.pages))
+            else:
+                page_range.extend(range(page_num + 1, paginator.pages))
+
+    need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page
+    return {
+        'cl': cl,
+        'pagination_required': pagination_required,
+        'show_all_url': need_show_all_link and cl.get_query_string({ALL_VAR: ''}),
+        'page_range': page_range,
+        'ALL_VAR': ALL_VAR,
+        '1': 1,
+    }
+pagination = register.inclusion_tag('admin/pagination.html')(pagination)
+
+def result_headers(cl):
+    lookup_opts = cl.lookup_opts
+
+    for i, field_name in enumerate(lookup_opts.admin.list_display):
+        try:
+            f = lookup_opts.get_field(field_name)
+        except models.FieldDoesNotExist:
+            # For non-field list_display values, check for the function
+            # attribute "short_description". If that doesn't exist, fall
+            # back to the method name. And __str__ is a special-case.
+            if field_name == '__str__':
+                header = lookup_opts.verbose_name
+            else:
+                attr = getattr(cl.model, field_name) # Let AttributeErrors propagate.
+                try:
+                    header = attr.short_description
+                except AttributeError:
+                    header = field_name.replace('_', ' ')
+            # Non-field list_display values don't get ordering capability.
+            yield {"text": header}
+        else:
+            if isinstance(f.rel, models.ManyToOneRel) and f.null:
+                yield {"text": f.verbose_name}
+            else:
+                th_classes = []
+                new_order_type = 'asc'
+                if field_name == cl.order_field:
+                    th_classes.append('sorted %sending' % cl.order_type.lower())
+                    new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()]
+
+                yield {"text": f.verbose_name,
+                       "sortable": True,
+                       "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}),
+                       "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')}
+
+def items_for_result(cl, result):
+    first = True
+    pk = cl.lookup_opts.pk.attname
+    for field_name in cl.lookup_opts.admin.list_display:
+        row_class = ''
+        try:
+            f = cl.lookup_opts.get_field(field_name)
+        except models.FieldDoesNotExist:
+            # For non-field list_display values, the value is either a method
+            # or a property.
+            try:
+                attr = getattr(result, field_name)
+                allow_tags = getattr(attr, 'allow_tags', False)
+                if callable(attr):
+                    attr = attr()
+                result_repr = str(attr)
+            except (AttributeError, ObjectDoesNotExist):
+                result_repr = EMPTY_CHANGELIST_VALUE
+            else:
+                # Strip HTML tags in the resulting text, except if the
+                # function has an "allow_tags" attribute set to True.
+                if not allow_tags:
+                    result_repr = escape(result_repr)
+        else:
+            field_val = getattr(result, f.attname)
+
+            if isinstance(f.rel, models.ManyToOneRel):
+                if field_val is not None:
+                    result_repr = escape(getattr(result, f.name))
+                else:
+                    result_repr = EMPTY_CHANGELIST_VALUE
+            # Dates and times are special: They're formatted in a certain way.
+            elif isinstance(f, models.DateField) or isinstance(f, models.TimeField):
+                if field_val:
+                    (date_format, datetime_format, time_format) = get_date_formats()
+                    if isinstance(f, models.DateTimeField):
+                        result_repr = capfirst(dateformat.format(field_val, datetime_format))
+                    elif isinstance(f, models.TimeField):
+                        result_repr = capfirst(dateformat.time_format(field_val, time_format))
+                    else:
+                        result_repr = capfirst(dateformat.format(field_val, date_format))
+                else:
+                    result_repr = EMPTY_CHANGELIST_VALUE
+                row_class = ' class="nowrap"'
+            # Booleans are special: We use images.
+            elif isinstance(f, models.BooleanField) or isinstance(f, models.NullBooleanField):
+                BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'}
+                result_repr = '<img src="%simg/admin/icon-%s.gif" alt="%s" />' % (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val)
+            # FloatFields are special: Zero-pad the decimals.
+            elif isinstance(f, models.FloatField):
+                if field_val is not None:
+                    result_repr = ('%%.%sf' % f.decimal_places) % field_val
+                else:
+                    result_repr = EMPTY_CHANGELIST_VALUE
+            # Fields with choices are special: Use the representation
+            # of the choice.
+            elif f.choices:
+                result_repr = dict(f.choices).get(field_val, EMPTY_CHANGELIST_VALUE)
+            else:
+                result_repr = escape(str(field_val))
+        if result_repr == '':
+            result_repr = '&nbsp;'
+        # If list_display_links not defined, add the link tag to the first field
+        if (first and not cl.lookup_opts.admin.list_display_links) or field_name in cl.lookup_opts.admin.list_display_links: 
+            table_tag = {True:'th', False:'td'}[first]
+            first = False
+            url = cl.url_for_result(result)
+            result_id = str(getattr(result, pk)) # str() is needed in case of 23L (long ints)
+            yield ('<%s%s><a href="%s"%s>%s</a></%s>' % \
+                (table_tag, row_class, url, (cl.is_popup and ' onclick="opener.dismissRelatedLookupPopup(window, %r); return false;"' % result_id or ''), result_repr, table_tag))
+        else:
+            yield ('<td%s>%s</td>' % (row_class, result_repr))
+
+def results(cl):
+    for res in cl.result_list:
+        yield list(items_for_result(cl,res))
+
+def result_list(cl):
+    return {'cl': cl,
+            'result_headers': list(result_headers(cl)),
+            'results': list(results(cl))}
+result_list = register.inclusion_tag("admin/change_list_results.html")(result_list)
+
+def date_hierarchy(cl):
+    if cl.lookup_opts.admin.date_hierarchy:
+        field_name = cl.lookup_opts.admin.date_hierarchy
+        year_field = '%s__year' % field_name
+        month_field = '%s__month' % field_name
+        day_field = '%s__day' % field_name
+        field_generic = '%s__' % field_name
+        year_lookup = cl.params.get(year_field)
+        month_lookup = cl.params.get(month_field)
+        day_lookup = cl.params.get(day_field)
+        year_month_format, month_day_format = get_partial_date_formats()
+
+        link = lambda d: cl.get_query_string(d, [field_generic])
+
+        if year_lookup and month_lookup and day_lookup:
+            day = datetime.date(int(year_lookup), int(month_lookup), int(day_lookup))
+            return {
+                'show': True,
+                'back': {
+                    'link': link({year_field: year_lookup, month_field: month_lookup}),
+                    'title': dateformat.format(day, year_month_format)
+                },
+                'choices': [{'title': dateformat.format(day, month_day_format)}]
+            }
+        elif year_lookup and month_lookup:
+            days = cl.query_set.filter(**{year_field: year_lookup, month_field: month_lookup}).dates(field_name, 'day')
+            return {
+                'show': True,
+                'back': {
+                    'link': link({year_field: year_lookup}),
+                    'title': year_lookup
+                },
+                'choices': [{
+                    'link': link({year_field: year_lookup, month_field: month_lookup, day_field: day.day}),
+                    'title': dateformat.format(day, month_day_format)
+                } for day in days]
+            }
+        elif year_lookup:
+            months = cl.query_set.filter(**{year_field: year_lookup}).dates(field_name, 'month')
+            return {
+                'show' : True,
+                'back': {
+                    'link' : link({}),
+                    'title': _('All dates')
+                },
+                'choices': [{
+                    'link': link({year_field: year_lookup, month_field: month.month}),
+                    'title': dateformat.format(month, year_month_format)
+                } for month in months]
+            }
+        else:
+            years = cl.query_set.dates(field_name, 'year')
+            return {
+                'show': True,
+                'choices': [{
+                    'link': link({year_field: year.year}),
+                    'title': year.year
+                } for year in years]
+            }
+date_hierarchy = register.inclusion_tag('admin/date_hierarchy.html')(date_hierarchy)
+
+def search_form(cl):
+    return {
+        'cl': cl,
+        'show_result_count': cl.result_count != cl.full_result_count and not cl.opts.one_to_one_field,
+        'search_var': SEARCH_VAR
+    }
+search_form = register.inclusion_tag('admin/search_form.html')(search_form)
+
+def filter(cl, spec):
+    return {'title': spec.title(), 'choices' : list(spec.choices(cl))}
+filter = register.inclusion_tag('admin/filter.html')(filter)
+
+def filters(cl):
+    return {'cl': cl}
+filters = register.inclusion_tag('admin/filters.html')(filters)

Added: vendor/django/current/django/contrib/admin/templatetags/admin_modify.py
===================================================================
--- vendor/django/current/django/contrib/admin/templatetags/admin_modify.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templatetags/admin_modify.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,243 @@
+from django import template
+from django.contrib.admin.views.main import AdminBoundField
+from django.template import loader
+from django.utils.text import capfirst
+from django.db import models
+from django.db.models.fields import Field
+from django.db.models.related import BoundRelatedObject
+from django.conf import settings
+import re
+
+register = template.Library()
+
+word_re = re.compile('[A-Z][a-z]+')
+
+def class_name_to_underscored(name):
+    return '_'.join([s.lower() for s in word_re.findall(name)[:-1]])
+
+def include_admin_script(script_path):
+    """
+    Returns an HTML script element for including a script from the admin
+    media url.
+
+    Example usage::
+
+        {% include_admin_script js/calendar.js %}
+
+    could return::
+
+        <script type="text/javascript" src="/media/admin/js/calendar.js">
+    """
+
+    return '<script type="text/javascript" src="%s%s"></script>' % (settings.ADMIN_MEDIA_PREFIX, script_path)
+include_admin_script = register.simple_tag(include_admin_script)
+
+def submit_row(context):
+    opts = context['opts']
+    change = context['change']
+    is_popup = context['is_popup']
+    return {
+        'onclick_attrib': (opts.get_ordered_objects() and change
+                            and 'onclick="submitOrderForm();"' or ''),
+        'show_delete_link': (not is_popup and context['has_delete_permission']
+                              and (change or context['show_delete'])),
+        'show_save_as_new': not is_popup and change and opts.admin.save_as,
+        'show_save_and_add_another': not is_popup and (not opts.admin.save_as or context['add']),
+        'show_save_and_continue': not is_popup and context['has_change_permission'],
+        'show_save': True
+    }
+submit_row = register.inclusion_tag('admin/submit_line.html', takes_context=True)(submit_row)
+
+def field_label(bound_field):
+    class_names = []
+    if isinstance(bound_field.field, models.BooleanField):
+        class_names.append("vCheckboxLabel")
+        colon = ""
+    else:
+        if not bound_field.field.blank:
+            class_names.append('required')
+        if not bound_field.first:
+            class_names.append('inline')
+        colon = ":"
+    class_str = class_names and ' class="%s"' % ' '.join(class_names) or ''
+    return '<label for="%s"%s>%s%s</label> ' % (bound_field.element_id, class_str, \
+        capfirst(bound_field.field.verbose_name), colon)
+field_label = register.simple_tag(field_label)
+
+class FieldWidgetNode(template.Node):
+    nodelists = {}
+    default = None
+
+    def __init__(self, bound_field_var):
+        self.bound_field_var = bound_field_var
+
+    def get_nodelist(cls, klass):
+        if not cls.nodelists.has_key(klass):
+            try:
+                field_class_name = klass.__name__
+                template_name = "widget/%s.html" % class_name_to_underscored(field_class_name)
+                nodelist = loader.get_template(template_name).nodelist
+            except template.TemplateDoesNotExist:
+                super_klass = bool(klass.__bases__) and klass.__bases__[0] or None
+                if super_klass and super_klass != Field:
+                    nodelist = cls.get_nodelist(super_klass)
+                else:
+                    if not cls.default:
+                        cls.default = loader.get_template("widget/default.html").nodelist
+                    nodelist = cls.default
+
+            cls.nodelists[klass] = nodelist
+            return nodelist
+        else:
+            return cls.nodelists[klass]
+    get_nodelist = classmethod(get_nodelist)
+
+    def render(self, context):
+        bound_field = template.resolve_variable(self.bound_field_var, context)
+
+        context.push()
+        context['bound_field'] = bound_field
+
+        output = self.get_nodelist(bound_field.field.__class__).render(context)
+        context.pop()
+        return output
+
+class FieldWrapper(object):
+    def __init__(self, field ):
+        self.field = field
+
+    def needs_header(self):
+        return not isinstance(self.field, models.AutoField)
+
+    def header_class_attribute(self):
+        return self.field.blank and ' class="optional"' or ''
+
+    def use_raw_id_admin(self):
+        return isinstance(self.field.rel, (models.ManyToOneRel, models.ManyToManyRel)) \
+            and self.field.rel.raw_id_admin
+
+class FormFieldCollectionWrapper(object):
+    def __init__(self, field_mapping, fields, index):
+        self.field_mapping = field_mapping
+        self.fields = fields
+        self.bound_fields = [AdminBoundField(field, self.field_mapping, field_mapping['original'])
+                             for field in self.fields]
+        self.index = index
+
+class TabularBoundRelatedObject(BoundRelatedObject):
+    def __init__(self, related_object, field_mapping, original):
+        super(TabularBoundRelatedObject, self).__init__(related_object, field_mapping, original)
+        self.field_wrapper_list = [FieldWrapper(field) for field in self.relation.editable_fields()]
+
+        fields = self.relation.editable_fields()
+
+        self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping, fields, i)
+                                               for (i,field_mapping) in self.field_mappings.items() ]
+        self.original_row_needed = max([fw.use_raw_id_admin() for fw in self.field_wrapper_list])
+        self.show_url = original and hasattr(self.relation.opts, 'get_absolute_url')
+
+    def template_name(self):
+        return "admin/edit_inline_tabular.html"
+
+class StackedBoundRelatedObject(BoundRelatedObject):
+    def __init__(self, related_object, field_mapping, original):
+        super(StackedBoundRelatedObject, self).__init__(related_object, field_mapping, original)
+        fields = self.relation.editable_fields()
+        self.field_mappings.fill()
+        self.form_field_collection_wrappers = [FormFieldCollectionWrapper(field_mapping ,fields, i)
+                                               for (i,field_mapping) in self.field_mappings.items()]
+        self.show_url = original and hasattr(self.relation.opts, 'get_absolute_url')
+
+    def template_name(self):
+        return "admin/edit_inline_stacked.html"
+
+class EditInlineNode(template.Node):
+    def __init__(self, rel_var):
+        self.rel_var = rel_var
+
+    def render(self, context):
+        relation = template.resolve_variable(self.rel_var, context)
+        context.push()
+        if relation.field.rel.edit_inline == models.TABULAR:
+            bound_related_object_class = TabularBoundRelatedObject
+        else:
+            bound_related_object_class = StackedBoundRelatedObject
+        original = context.get('original', None)
+        bound_related_object = relation.bind(context['form'], original, bound_related_object_class)
+        context['bound_related_object'] = bound_related_object
+        t = loader.get_template(bound_related_object.template_name())
+        output = t.render(context)
+        context.pop()
+        return output
+
+def output_all(form_fields):
+    return ''.join([str(f) for f in form_fields])
+output_all = register.simple_tag(output_all)
+
+def auto_populated_field_script(auto_pop_fields, change = False):
+    for field in auto_pop_fields:
+        t = []
+        if change:
+            t.append('document.getElementById("id_%s")._changed = true;' % field.name)
+        else:
+            t.append('document.getElementById("id_%s").onchange = function() { this._changed = true; };' % field.name)
+
+        add_values = ' + " " + '.join(['document.getElementById("id_%s").value' % g for g in field.prepopulate_from])
+        for f in field.prepopulate_from:
+            t.append('document.getElementById("id_%s").onkeyup = function() {' \
+                     ' var e = document.getElementById("id_%s");' \
+                     ' if(!e._changed) { e.value = URLify(%s, %s);} }; ' % (
+                     f, field.name, add_values, field.maxlength))
+    return ''.join(t)
+auto_populated_field_script = register.simple_tag(auto_populated_field_script)
+
+def filter_interface_script_maybe(bound_field):
+    f = bound_field.field
+    if f.rel and isinstance(f.rel, models.ManyToManyRel) and f.rel.filter_interface:
+        return '<script type="text/javascript">addEvent(window, "load", function(e) {' \
+              ' SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % (
+              f.name, f.verbose_name, f.rel.filter_interface-1, settings.ADMIN_MEDIA_PREFIX)
+    else:
+        return ''
+filter_interface_script_maybe = register.simple_tag(filter_interface_script_maybe)
+
+def field_widget(parser, token):
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise template.TemplateSyntaxError, "%s takes 1 argument" % bits[0]
+    return FieldWidgetNode(bits[1])
+field_widget = register.tag(field_widget)
+
+def edit_inline(parser, token):
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise template.TemplateSyntaxError, "%s takes 1 argument" % bits[0]
+    return EditInlineNode(bits[1])
+edit_inline = register.tag(edit_inline)
+
+def admin_field_line(context, argument_val):
+    if isinstance(argument_val, AdminBoundField):
+        bound_fields = [argument_val]
+    else:
+        bound_fields = [bf for bf in argument_val]
+    add = context['add']
+    change = context['change']
+
+    class_names = ['form-row']
+    for bound_field in bound_fields:
+        for f in bound_field.form_fields:
+            if f.errors():
+                class_names.append('errors')
+                break
+
+    # Assumes BooleanFields won't be stacked next to each other!
+    if isinstance(bound_fields[0].field, models.BooleanField):
+        class_names.append('checkbox-row')
+
+    return {
+        'add': context['add'],
+        'change': context['change'],
+        'bound_fields': bound_fields,
+        'class_names': " ".join(class_names),
+    }
+admin_field_line = register.inclusion_tag('admin/field_line.html', takes_context=True)(admin_field_line)

Added: vendor/django/current/django/contrib/admin/templatetags/adminapplist.py
===================================================================
--- vendor/django/current/django/contrib/admin/templatetags/adminapplist.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templatetags/adminapplist.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,79 @@
+from django import template
+from django.db.models import get_models
+
+register = template.Library()
+
+class AdminApplistNode(template.Node):
+    def __init__(self, varname):
+        self.varname = varname
+
+    def render(self, context):
+        from django.db import models
+        from django.utils.text import capfirst
+        app_list = []
+        user = context['user']
+
+        for app in models.get_apps():
+            # Determine the app_label.
+            app_models = get_models(app)
+            if not app_models:
+                continue
+            app_label = app_models[0]._meta.app_label
+
+            has_module_perms = user.has_module_perms(app_label)
+
+            if has_module_perms:
+                model_list = []
+                for m in app_models:
+                    if m._meta.admin:
+                        perms = {
+                            'add': user.has_perm("%s.%s" % (app_label, m._meta.get_add_permission())),
+                            'change': user.has_perm("%s.%s" % (app_label, m._meta.get_change_permission())),
+                            'delete': user.has_perm("%s.%s" % (app_label, m._meta.get_delete_permission())),
+                        }
+
+                        # Check whether user has any perm for this module.
+                        # If so, add the module to the model_list.
+                        if True in perms.values():
+                            model_list.append({
+                                'name': capfirst(m._meta.verbose_name_plural),
+                                'admin_url': '%s/%s/' % (app_label, m.__name__.lower()),
+                                'perms': perms,
+                            })
+
+                if model_list:
+                    # Sort using verbose decorate-sort-undecorate pattern
+                    # instead of key argument to sort() for python 2.3 compatibility
+                    decorated = [(x['name'], x) for x in model_list]
+                    decorated.sort()
+                    model_list = [x for key, x in decorated]
+
+                    app_list.append({
+                        'name': app_label.title(),
+                        'has_module_perms': has_module_perms,
+                        'models': model_list,
+                    })
+        context[self.varname] = app_list
+        return ''
+
+def get_admin_app_list(parser, token):
+    """
+    Returns a list of installed applications and models for which the current user
+    has at least one permission.
+
+    Syntax::
+    
+        {% get_admin_app_list as [context_var_containing_app_list] %}
+
+    Example usage::
+
+        {% get_admin_app_list as admin_app_list %}
+    """
+    tokens = token.contents.split()
+    if len(tokens) < 3:
+        raise template.TemplateSyntaxError, "'%s' tag requires two arguments" % tokens[0]
+    if tokens[1] != 'as':
+        raise template.TemplateSyntaxError, "First argument to '%s' tag must be 'as'" % tokens[0]
+    return AdminApplistNode(tokens[2])
+
+register.tag('get_admin_app_list', get_admin_app_list)

Added: vendor/django/current/django/contrib/admin/templatetags/adminmedia.py
===================================================================
--- vendor/django/current/django/contrib/admin/templatetags/adminmedia.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templatetags/adminmedia.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,14 @@
+from django.template import Library
+
+register = Library()
+
+def admin_media_prefix():
+    """
+    Returns the string contained in the setting ADMIN_MEDIA_PREFIX.
+    """
+    try:
+        from django.conf import settings
+    except ImportError:
+        return ''
+    return settings.ADMIN_MEDIA_PREFIX
+admin_media_prefix = register.simple_tag(admin_media_prefix)

Added: vendor/django/current/django/contrib/admin/templatetags/log.py
===================================================================
--- vendor/django/current/django/contrib/admin/templatetags/log.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/templatetags/log.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,53 @@
+from django import template
+from django.contrib.admin.models import LogEntry
+
+register = template.Library()
+
+class AdminLogNode(template.Node):
+    def __init__(self, limit, varname, user):
+        self.limit, self.varname, self.user = limit, varname, user
+
+    def __repr__(self):
+        return "<GetAdminLog Node>"
+
+    def render(self, context):
+        if self.user is not None and not self.user.isdigit():
+            self.user = context[self.user].id
+        context[self.varname] = LogEntry.objects.filter(user__id__exact=self.user).select_related()[:self.limit]
+        return ''
+
+class DoGetAdminLog:
+    """
+    Populates a template variable with the admin log for the given criteria.
+
+    Usage::
+
+        {% get_admin_log [limit] as [varname] for_user [context_var_containing_user_obj] %}
+
+    Examples::
+
+        {% get_admin_log 10 as admin_log for_user 23 %}
+        {% get_admin_log 10 as admin_log for_user user %}
+        {% get_admin_log 10 as admin_log %}
+
+    Note that ``context_var_containing_user_obj`` can be a hard-coded integer
+    (user ID) or the name of a template context variable containing the user
+    object whose ID you want.
+    """
+    def __init__(self, tag_name):
+        self.tag_name = tag_name
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        if len(tokens) < 4:
+            raise template.TemplateSyntaxError, "'%s' statements require two arguments" % self.tag_name
+        if not tokens[1].isdigit():
+            raise template.TemplateSyntaxError, "First argument in '%s' must be an integer" % self.tag_name
+        if tokens[2] != 'as':
+            raise template.TemplateSyntaxError, "Second argument in '%s' must be 'as'" % self.tag_name
+        if len(tokens) > 4:
+            if tokens[4] != 'for_user':
+                raise template.TemplateSyntaxError, "Fourth argument in '%s' must be 'for_user'" % self.tag_name
+        return AdminLogNode(limit=tokens[1], varname=tokens[3], user=(len(tokens) > 5 and tokens[5] or None))
+
+register.tag('get_admin_log', DoGetAdminLog('get_admin_log'))

Added: vendor/django/current/django/contrib/admin/urls.py
===================================================================
--- vendor/django/current/django/contrib/admin/urls.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/urls.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,39 @@
+from django.conf import settings
+from django.conf.urls.defaults import *
+
+if settings.USE_I18N:
+    i18n_view = 'django.views.i18n.javascript_catalog'
+else:
+    i18n_view = 'django.views.i18n.null_javascript_catalog'
+
+urlpatterns = patterns('',
+    ('^$', 'django.contrib.admin.views.main.index'),
+    ('^r/(\d+)/(.*)/$', 'django.views.defaults.shortcut'),
+    ('^jsi18n/$', i18n_view, {'packages': 'django.conf'}),
+    ('^logout/$', 'django.contrib.auth.views.logout'),
+    ('^password_change/$', 'django.contrib.auth.views.password_change'),
+    ('^password_change/done/$', 'django.contrib.auth.views.password_change_done'),
+    ('^template_validator/$', 'django.contrib.admin.views.template.template_validator'),
+
+    # Documentation
+    ('^doc/$', 'django.contrib.admin.views.doc.doc_index'),
+    ('^doc/bookmarklets/$', 'django.contrib.admin.views.doc.bookmarklets'),
+    ('^doc/tags/$', 'django.contrib.admin.views.doc.template_tag_index'),
+    ('^doc/filters/$', 'django.contrib.admin.views.doc.template_filter_index'),
+    ('^doc/views/$', 'django.contrib.admin.views.doc.view_index'),
+    ('^doc/views/jump/$', 'django.contrib.admin.views.doc.jump_to_view'),
+    ('^doc/views/(?P<view>[^/]+)/$', 'django.contrib.admin.views.doc.view_detail'),
+    ('^doc/models/$', 'django.contrib.admin.views.doc.model_index'),
+    ('^doc/models/(?P<app_label>[^\.]+)\.(?P<model_name>[^/]+)/$', 'django.contrib.admin.views.doc.model_detail'),
+#    ('^doc/templates/$', 'django.views.admin.doc.template_index'),
+    ('^doc/templates/(?P<template>.*)/$', 'django.contrib.admin.views.doc.template_detail'),
+
+    # Add/change/delete/history
+    ('^([^/]+)/([^/]+)/$', 'django.contrib.admin.views.main.change_list'),
+    ('^([^/]+)/([^/]+)/add/$', 'django.contrib.admin.views.main.add_stage'),
+    ('^([^/]+)/([^/]+)/(.+)/history/$', 'django.contrib.admin.views.main.history'),
+    ('^([^/]+)/([^/]+)/(.+)/delete/$', 'django.contrib.admin.views.main.delete_stage'),
+    ('^([^/]+)/([^/]+)/(.+)/$', 'django.contrib.admin.views.main.change_stage'),
+)
+
+del i18n_view

Added: vendor/django/current/django/contrib/admin/utils.py
===================================================================
--- vendor/django/current/django/contrib/admin/utils.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/utils.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,102 @@
+"Misc. utility functions/classes for admin documentation generator."
+
+import re
+from email.Parser import HeaderParser
+from email.Errors import HeaderParseError
+try:
+    import docutils.core
+    import docutils.nodes
+    import docutils.parsers.rst.roles
+except ImportError:
+    docutils_is_available = False
+else:
+    docutils_is_available = True
+
+def trim_docstring(docstring):
+    """
+    Uniformly trims leading/trailing whitespace from docstrings.
+
+    Based on http://www.python.org/peps/pep-0257.html#handling-docstring-indentation
+    """
+    if not docstring or not docstring.strip():
+        return ''
+    # Convert tabs to spaces and split into lines
+    lines = docstring.expandtabs().splitlines()
+    indent = min([len(line) - len(line.lstrip()) for line in lines if line.lstrip()])
+    trimmed = [lines[0].lstrip()] + [line[indent:].rstrip() for line in lines[1:]]
+    return "\n".join(trimmed).strip()
+
+def parse_docstring(docstring):
+    """
+    Parse out the parts of a docstring.  Returns (title, body, metadata).
+    """
+    docstring = trim_docstring(docstring)
+    parts = re.split(r'\n{2,}', docstring)
+    title = parts[0]
+    if len(parts) == 1:
+        body = ''
+        metadata = {}
+    else:
+        parser = HeaderParser()
+        try:
+            metadata = parser.parsestr(parts[-1])
+        except HeaderParseError:
+            metadata = {}
+            body = "\n\n".join(parts[1:])
+        else:
+            metadata = dict(metadata.items())
+            if metadata:
+                body = "\n\n".join(parts[1:-1])
+            else:
+                body = "\n\n".join(parts[1:])
+    return title, body, metadata
+
+def parse_rst(text, default_reference_context, thing_being_parsed=None, link_base='../..'):
+    """
+    Convert the string from reST to an XHTML fragment.
+    """
+    overrides = {
+        'doctitle_xform' : True,
+        'inital_header_level' : 3,
+        "default_reference_context" : default_reference_context,
+        "link_base" : link_base,
+    }
+    if thing_being_parsed:
+        thing_being_parsed = "<%s>" % thing_being_parsed
+    parts = docutils.core.publish_parts(text, source_path=thing_being_parsed,
+                destination_path=None, writer_name='html',
+                settings_overrides=overrides)
+    return parts['fragment']
+
+#
+# reST roles
+#
+ROLES = {
+    'model'    : '%s/models/%s/',
+    'view'     : '%s/views/%s/',
+    'template' : '%s/templates/%s/',
+    'filter'   : '%s/filters/#%s',
+    'tag'      : '%s/tags/#%s',
+}
+
+def create_reference_role(rolename, urlbase):
+    def _role(name, rawtext, text, lineno, inliner, options=None, content=None):
+        if options is None: options = {}
+        if content is None: content = []
+        node = docutils.nodes.reference(rawtext, text, refuri=(urlbase % (inliner.document.settings.link_base, text.lower())), **options)
+        return [node], []
+    docutils.parsers.rst.roles.register_canonical_role(rolename, _role)
+
+def default_reference_role(name, rawtext, text, lineno, inliner, options=None, content=None):
+    if options is None: options = {}
+    if content is None: content = []
+    context = inliner.document.settings.default_reference_context
+    node = docutils.nodes.reference(rawtext, text, refuri=(ROLES[context] % (inliner.document.settings.link_base, text.lower())), **options)
+    return [node], []
+
+if docutils_is_available:
+    docutils.parsers.rst.roles.register_canonical_role('cmsreference', default_reference_role)
+    docutils.parsers.rst.roles.DEFAULT_INTERPRETED_ROLE = 'cmsreference'
+
+    for name, urlbase in ROLES.items():
+        create_reference_role(name, urlbase)

Added: vendor/django/current/django/contrib/admin/views/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/admin/views/decorators.py
===================================================================
--- vendor/django/current/django/contrib/admin/views/decorators.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/views/decorators.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,108 @@
+from django import http, template
+from django.conf import settings
+from django.contrib.auth.models import User
+from django.contrib.auth import authenticate, login
+from django.shortcuts import render_to_response
+from django.utils.translation import gettext_lazy
+import base64, datetime, md5
+import cPickle as pickle
+
+ERROR_MESSAGE = gettext_lazy("Please enter a correct username and password. Note that both fields are case-sensitive.")
+LOGIN_FORM_KEY = 'this_is_the_login_form'
+
+def _display_login_form(request, error_message=''):
+    request.session.set_test_cookie()
+    if request.POST and request.POST.has_key('post_data'):
+        # User has failed login BUT has previously saved post data.
+        post_data = request.POST['post_data']
+    elif request.POST:
+        # User's session must have expired; save their post data.
+        post_data = _encode_post_data(request.POST)
+    else:
+        post_data = _encode_post_data({})
+    return render_to_response('admin/login.html', {
+        'title': _('Log in'),
+        'app_path': request.path,
+        'post_data': post_data,
+        'error_message': error_message
+    }, context_instance=template.RequestContext(request))
+
+def _encode_post_data(post_data):
+    pickled = pickle.dumps(post_data)
+    pickled_md5 = md5.new(pickled + settings.SECRET_KEY).hexdigest()
+    return base64.encodestring(pickled + pickled_md5)
+
+def _decode_post_data(encoded_data):
+    encoded_data = base64.decodestring(encoded_data)
+    pickled, tamper_check = encoded_data[:-32], encoded_data[-32:]
+    if md5.new(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
+        from django.core.exceptions import SuspiciousOperation
+        raise SuspiciousOperation, "User may have tampered with session cookie."
+    return pickle.loads(pickled)
+
+def staff_member_required(view_func):
+    """
+    Decorator for views that checks that the user is logged in and is a staff
+    member, displaying the login page if necessary.
+    """
+    def _checklogin(request, *args, **kwargs):
+        if request.user.is_authenticated() and request.user.is_staff:
+            # The user is valid. Continue to the admin page.
+            if request.POST.has_key('post_data'):
+                # User must have re-authenticated through a different window
+                # or tab.
+                request.POST = _decode_post_data(request.POST['post_data'])
+            return view_func(request, *args, **kwargs)
+
+        assert hasattr(request, 'session'), "The Django admin requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
+
+        # If this isn't already the login page, display it.
+        if not request.POST.has_key(LOGIN_FORM_KEY):
+            if request.POST:
+                message = _("Please log in again, because your session has expired. Don't worry: Your submission has been saved.")
+            else:
+                message = ""
+            return _display_login_form(request, message)
+
+        # Check that the user accepts cookies.
+        if not request.session.test_cookie_worked():
+            message = _("Looks like your browser isn't configured to accept cookies. Please enable cookies, reload this page, and try again.")
+            return _display_login_form(request, message)
+
+        # Check the password.
+        username = request.POST.get('username', None)
+        password = request.POST.get('password', None)
+        user = authenticate(username=username, password=password)
+        if user is None:
+            message = ERROR_MESSAGE
+            if '@' in username:
+                # Mistakenly entered e-mail address instead of username? Look it up.
+                try:
+                    user = User.objects.get(email=username)
+                except User.DoesNotExist:
+                    message = _("Usernames cannot contain the '@' character.")
+                else:
+                    message = _("Your e-mail address is not your username. Try '%s' instead.") % user.username
+            return _display_login_form(request, message)
+
+        # The user data is correct; log in the user in and continue.
+        else:
+            if user.is_staff:
+                login(request, user)
+                # TODO: set last_login with an event.
+                user.last_login = datetime.datetime.now()
+                user.save()
+                if request.POST.has_key('post_data'):
+                    post_data = _decode_post_data(request.POST['post_data'])
+                    if post_data and not post_data.has_key(LOGIN_FORM_KEY):
+                        # overwrite request.POST with the saved post_data, and continue
+                        request.POST = post_data
+                        request.user = user
+                        return view_func(request, *args, **kwargs)
+                    else:
+                        request.session.delete_test_cookie()
+                        return http.HttpResponseRedirect(request.path)
+            else:
+                return _display_login_form(request, ERROR_MESSAGE)
+
+    return _checklogin

Added: vendor/django/current/django/contrib/admin/views/doc.py
===================================================================
--- vendor/django/current/django/contrib/admin/views/doc.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/views/doc.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,361 @@
+from django import template, templatetags
+from django.template import RequestContext
+from django.conf import settings
+from django.contrib.admin.views.decorators import staff_member_required
+from django.db import models
+from django.shortcuts import render_to_response
+from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
+from django.http import Http404, get_host
+from django.core import urlresolvers
+from django.contrib.admin import utils
+from django.contrib.sites.models import Site
+import inspect, os, re
+
+# Exclude methods starting with these strings from documentation
+MODEL_METHODS_EXCLUDE = ('_', 'add_', 'delete', 'save', 'set_')
+
+class GenericSite(object):
+    domain = 'example.com'
+    name = 'my site'
+
+def doc_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+    return render_to_response('admin_doc/index.html', context_instance=RequestContext(request))
+doc_index = staff_member_required(doc_index)
+
+def bookmarklets(request):
+    # Hack! This couples this view to the URL it lives at.
+    admin_root = request.path[:-len('doc/bookmarklets/')]
+    return render_to_response('admin_doc/bookmarklets.html', {
+        'admin_url': "%s://%s%s" % (request.is_secure() and 'https' or 'http', get_host(request), admin_root),
+    }, context_instance=RequestContext(request))
+bookmarklets = staff_member_required(bookmarklets)
+
+def template_tag_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    load_all_installed_template_libraries()
+
+    tags = []
+    for module_name, library in template.libraries.items():
+        for tag_name, tag_func in library.tags.items():
+            title, body, metadata = utils.parse_docstring(tag_func.__doc__)
+            if title:
+                title = utils.parse_rst(title, 'tag', 'tag:' + tag_name)
+            if body:
+                body = utils.parse_rst(body, 'tag', 'tag:' + tag_name)
+            for key in metadata:
+                metadata[key] = utils.parse_rst(metadata[key], 'tag', 'tag:' + tag_name)
+            if library in template.builtins:
+                tag_library = None
+            else:
+                tag_library = module_name.split('.')[-1]
+            tags.append({
+                'name': tag_name,
+                'title': title,
+                'body': body,
+                'meta': metadata,
+                'library': tag_library,
+            })
+
+    return render_to_response('admin_doc/template_tag_index.html', {'tags': tags}, context_instance=RequestContext(request))
+template_tag_index = staff_member_required(template_tag_index)
+
+def template_filter_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    load_all_installed_template_libraries()
+
+    filters = []
+    for module_name, library in template.libraries.items():
+        for filter_name, filter_func in library.filters.items():
+            title, body, metadata = utils.parse_docstring(filter_func.__doc__)
+            if title:
+                title = utils.parse_rst(title, 'filter', 'filter:' + filter_name)
+            if body:
+                body = utils.parse_rst(body, 'filter', 'filter:' + filter_name)
+            for key in metadata:
+                metadata[key] = utils.parse_rst(metadata[key], 'filter', 'filter:' + filter_name)
+            if library in template.builtins:
+                tag_library = None
+            else:
+                tag_library = module_name.split('.')[-1]
+            filters.append({
+                'name': filter_name,
+                'title': title,
+                'body': body,
+                'meta': metadata,
+                'library': tag_library,
+            })
+    return render_to_response('admin_doc/template_filter_index.html', {'filters': filters}, context_instance=RequestContext(request))
+template_filter_index = staff_member_required(template_filter_index)
+
+def view_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    if settings.ADMIN_FOR:
+        settings_modules = [__import__(m, '', '', ['']) for m in settings.ADMIN_FOR]
+    else:
+        settings_modules = [settings]
+
+    views = []
+    for settings_mod in settings_modules:
+        urlconf = __import__(settings_mod.ROOT_URLCONF, '', '', [''])
+        view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns)
+        if Site._meta.installed:
+            site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
+        else:
+            site_obj = GenericSite()
+        for (func, regex) in view_functions:
+            views.append({
+                'name': func.__name__,
+                'module': func.__module__,
+                'site_id': settings_mod.SITE_ID,
+                'site': site_obj,
+                'url': simplify_regex(regex),
+            })
+    return render_to_response('admin_doc/view_index.html', {'views': views}, context_instance=RequestContext(request))
+view_index = staff_member_required(view_index)
+
+def view_detail(request, view):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    mod, func = urlresolvers.get_mod_func(view)
+    try:
+        view_func = getattr(__import__(mod, '', '', ['']), func)
+    except (ImportError, AttributeError):
+        raise Http404
+    title, body, metadata = utils.parse_docstring(view_func.__doc__)
+    if title:
+        title = utils.parse_rst(title, 'view', 'view:' + view)
+    if body:
+        body = utils.parse_rst(body, 'view', 'view:' + view)
+    for key in metadata:
+        metadata[key] = utils.parse_rst(metadata[key], 'model', 'view:' + view)
+    return render_to_response('admin_doc/view_detail.html', {
+        'name': view,
+        'summary': title,
+        'body': body,
+        'meta': metadata,
+    }, context_instance=RequestContext(request))
+view_detail = staff_member_required(view_detail)
+
+def model_index(request):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    m_list = [m._meta for m in models.get_models()]
+    return render_to_response('admin_doc/model_index.html', {'models': m_list}, context_instance=RequestContext(request))
+model_index = staff_member_required(model_index)
+
+def model_detail(request, app_label, model_name):
+    if not utils.docutils_is_available:
+        return missing_docutils_page(request)
+
+    # Get the model class.
+    try:
+        app_mod = models.get_app(app_label)
+    except ImproperlyConfigured:
+        raise Http404, "App %r not found" % app_label
+    model = None
+    for m in models.get_models(app_mod):
+        if m._meta.object_name.lower() == model_name:
+            model = m
+            break
+    if model is None:
+        raise Http404, "Model %r not found in app %r" % (model_name, app_label)
+
+    opts = model._meta
+
+    # Gather fields/field descriptions.
+    fields = []
+    for field in opts.fields:
+        # ForeignKey is a special case since the field will actually be a
+        # descriptor that returns the other object
+        if isinstance(field, models.ForeignKey):
+            data_type = related_object_name = field.rel.to.__name__
+            app_label = field.rel.to._meta.app_label
+            verbose = utils.parse_rst(("the related `%s.%s` object"  % (app_label, data_type)), 'model', 'model:' + data_type)
+        else:
+            data_type = get_readable_field_data_type(field)
+            verbose = field.verbose_name
+        fields.append({
+            'name': field.name,
+            'data_type': data_type,
+            'verbose': verbose,
+            'help_text': field.help_text,
+        })
+
+    # Gather model methods.
+    for func_name, func in model.__dict__.items():
+        if (inspect.isfunction(func) and len(inspect.getargspec(func)[0]) == 1):
+            try:
+                for exclude in MODEL_METHODS_EXCLUDE:
+                    if func_name.startswith(exclude):
+                        raise StopIteration
+            except StopIteration:
+                continue
+            verbose = func.__doc__
+            if verbose:
+                verbose = utils.parse_rst(utils.trim_docstring(verbose), 'model', 'model:' + opts.module_name)
+            fields.append({
+                'name': func_name,
+                'data_type': get_return_data_type(func_name),
+                'verbose': verbose,
+            })
+
+    # Gather related objects
+    for rel in opts.get_all_related_objects():
+        verbose = "related `%s.%s` objects" % (rel.opts.app_label, rel.opts.object_name)
+        accessor = rel.get_accessor_name()
+        fields.append({
+            'name'      : "%s.all" % accessor,
+            'data_type' : 'List',
+            'verbose'   : utils.parse_rst("all " + verbose , 'model', 'model:' + opts.module_name),
+        })
+        fields.append({
+            'name'      : "%s.count" % accessor,
+            'data_type' : 'Integer',
+            'verbose'   : utils.parse_rst("number of " + verbose , 'model', 'model:' + opts.module_name),
+        })
+
+    return render_to_response('admin_doc/model_detail.html', {
+        'name': '%s.%s' % (opts.app_label, opts.object_name),
+        'summary': "Fields on %s objects" % opts.object_name,
+        'description': model.__doc__,
+        'fields': fields,
+    }, context_instance=RequestContext(request))
+model_detail = staff_member_required(model_detail)
+
+def template_detail(request, template):
+    templates = []
+    for site_settings_module in settings.ADMIN_FOR:
+        settings_mod = __import__(site_settings_module, '', '', [''])
+        if Site._meta.installed:
+            site_obj = Site.objects.get(pk=settings_mod.SITE_ID)
+        else:
+            site_obj = GenericSite()
+        for dir in settings_mod.TEMPLATE_DIRS:
+            template_file = os.path.join(dir, "%s.html" % template)
+            templates.append({
+                'file': template_file,
+                'exists': os.path.exists(template_file),
+                'contents': lambda: os.path.exists(template_file) and open(template_file).read() or '',
+                'site_id': settings_mod.SITE_ID,
+                'site': site_obj,
+                'order': list(settings_mod.TEMPLATE_DIRS).index(dir),
+            })
+    return render_to_response('admin_doc/template_detail.html', {
+        'name': template,
+        'templates': templates,
+    }, context_instance=RequestContext(request))
+template_detail = staff_member_required(template_detail)
+
+####################
+# Helper functions #
+####################
+
+def missing_docutils_page(request):
+    """Display an error message for people without docutils"""
+    return render_to_response('admin_doc/missing_docutils.html')
+
+def load_all_installed_template_libraries():
+    # Load/register all template tag libraries from installed apps.
+    for e in templatetags.__path__:
+        libraries = [os.path.splitext(p)[0] for p in os.listdir(e) if p.endswith('.py') and p[0].isalpha()]
+        for library_name in libraries:
+            try:
+                lib = template.get_library("django.templatetags.%s" % library_name.split('.')[-1])
+            except template.InvalidTemplateLibrary:
+                pass
+
+def get_return_data_type(func_name):
+    """Return a somewhat-helpful data type given a function name"""
+    if func_name.startswith('get_'):
+        if func_name.endswith('_list'):
+            return 'List'
+        elif func_name.endswith('_count'):
+            return 'Integer'
+    return ''
+
+# Maps Field objects to their human-readable data types, as strings.
+# Column-type strings can contain format strings; they'll be interpolated
+# against the values of Field.__dict__ before being output.
+# If a column type is set to None, it won't be included in the output.
+DATA_TYPE_MAPPING = {
+    'AutoField'                 : _('Integer'),
+    'BooleanField'              : _('Boolean (Either True or False)'),
+    'CharField'                 : _('String (up to %(maxlength)s)'),
+    'CommaSeparatedIntegerField': _('Comma-separated integers'),
+    'DateField'                 : _('Date (without time)'),
+    'DateTimeField'             : _('Date (with time)'),
+    'EmailField'                : _('E-mail address'),
+    'FileField'                 : _('File path'),
+    'FilePathField'             : _('File path'),
+    'FloatField'                : _('Decimal number'),
+    'ForeignKey'                : _('Integer'),
+    'ImageField'                : _('File path'),
+    'IntegerField'              : _('Integer'),
+    'IPAddressField'            : _('IP address'),
+    'ManyToManyField'           : '',
+    'NullBooleanField'          : _('Boolean (Either True, False or None)'),
+    'OneToOneField'             : _('Relation to parent model'),
+    'PhoneNumberField'          : _('Phone number'),
+    'PositiveIntegerField'      : _('Integer'),
+    'PositiveSmallIntegerField' : _('Integer'),
+    'SlugField'                 : _('String (up to %(maxlength)s)'),
+    'SmallIntegerField'         : _('Integer'),
+    'TextField'                 : _('Text'),
+    'TimeField'                 : _('Time'),
+    'URLField'                  : _('URL'),
+    'USStateField'              : _('U.S. state (two uppercase letters)'),
+    'XMLField'                  : _('XML text'),
+}
+
+def get_readable_field_data_type(field):
+    return DATA_TYPE_MAPPING[field.get_internal_type()] % field.__dict__
+
+def extract_views_from_urlpatterns(urlpatterns, base=''):
+    """
+    Return a list of views from a list of urlpatterns.
+
+    Each object in the returned list is a two-tuple: (view_func, regex)
+    """
+    views = []
+    for p in urlpatterns:
+        if hasattr(p, 'get_callback'):
+            try:
+                views.append((p.get_callback(), base + p.regex.pattern))
+            except ViewDoesNotExist:
+                continue
+        elif hasattr(p, '_get_url_patterns'):
+            views.extend(extract_views_from_urlpatterns(p.url_patterns, base + p.regex.pattern))
+        else:
+            raise TypeError, "%s does not appear to be a urlpattern object" % p
+    return views
+
+named_group_matcher = re.compile(r'\(\?P(<\w+>).+?\)')
+non_named_group_matcher = re.compile(r'\(.*?\)')
+
+def simplify_regex(pattern):
+    """
+    Clean up urlpattern regexes into something somewhat readable by Mere Humans:
+    turns something like "^(?P<sport_slug>\w+)/athletes/(?P<athlete_slug>\w+)/$"
+    into "<sport_slug>/athletes/<athlete_slug>/"
+    """
+    # handle named groups first
+    pattern = named_group_matcher.sub(lambda m: m.group(1), pattern)
+
+    # handle non-named groups
+    pattern = non_named_group_matcher.sub("<var>", pattern)
+
+    # clean up any outstanding regex-y characters.
+    pattern = pattern.replace('^', '').replace('$', '').replace('?', '').replace('//', '/').replace('\\', '')
+    if not pattern.startswith('/'):
+        pattern = '/' + pattern
+    return pattern

Added: vendor/django/current/django/contrib/admin/views/main.py
===================================================================
--- vendor/django/current/django/contrib/admin/views/main.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/views/main.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,755 @@
+from django import forms, template
+from django.conf import settings
+from django.contrib.admin.filterspecs import FilterSpec
+from django.contrib.admin.views.decorators import staff_member_required
+from django.views.decorators.cache import never_cache
+from django.contrib.contenttypes.models import ContentType
+from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist, PermissionDenied
+from django.core.paginator import ObjectPaginator, InvalidPage
+from django.shortcuts import get_object_or_404, render_to_response
+from django.db import models
+from django.db.models.query import handle_legacy_orderlist, QuerySet
+from django.http import Http404, HttpResponse, HttpResponseRedirect
+from django.utils.html import escape
+from django.utils.text import capfirst, get_text_list
+import operator
+
+from django.contrib.admin.models import LogEntry, ADDITION, CHANGE, DELETION
+if not LogEntry._meta.installed:
+    raise ImproperlyConfigured, "You'll need to put 'django.contrib.admin' in your INSTALLED_APPS setting before you can use the admin application."
+
+if 'django.core.context_processors.auth' not in settings.TEMPLATE_CONTEXT_PROCESSORS:
+    raise ImproperlyConfigured, "You'll need to put 'django.core.context_processors.auth' in your TEMPLATE_CONTEXT_PROCESSORS setting before you can use the admin application."
+
+# The system will display a "Show all" link on the change list only if the
+# total result count is less than or equal to this setting.
+MAX_SHOW_ALL_ALLOWED = 200
+
+# Changelist settings
+ALL_VAR = 'all'
+ORDER_VAR = 'o'
+ORDER_TYPE_VAR = 'ot'
+PAGE_VAR = 'p'
+SEARCH_VAR = 'q'
+IS_POPUP_VAR = 'pop'
+ERROR_FLAG = 'e'
+
+# Text to display within change-list table cells if the value is blank.
+EMPTY_CHANGELIST_VALUE = '(None)'
+
+use_raw_id_admin = lambda field: isinstance(field.rel, (models.ManyToOneRel, models.ManyToManyRel)) and field.rel.raw_id_admin
+
+class IncorrectLookupParameters(Exception):
+    pass
+
+def quote(s):
+    """
+    Ensure that primary key values do not confuse the admin URLs by escaping
+    any '/', '_' and ':' characters. Similar to urllib.quote, except that the
+    quoting is slightly different so that it doesn't get autoamtically
+    unquoted by the web browser.
+    """
+    if type(s) != type(''):
+        return s
+    res = list(s)
+    for i in range(len(res)):
+        c = res[i]
+        if c in ':/_':
+            res[i] = '_%02X' % ord(c)
+    return ''.join(res)
+
+def unquote(s):
+    """
+    Undo the effects of quote(). Based heavily on urllib.unquote().
+    """
+    mychr = chr
+    myatoi = int
+    list = s.split('_')
+    res = [list[0]]
+    myappend = res.append
+    del list[0]
+    for item in list:
+        if item[1:2]:
+            try:
+                myappend(mychr(myatoi(item[:2], 16)) + item[2:])
+            except ValueError:
+                myappend('_' + item)
+        else:
+            myappend('_' + item)
+    return "".join(res)
+
+def get_javascript_imports(opts, auto_populated_fields, field_sets):
+# Put in any necessary JavaScript imports.
+    js = ['js/core.js', 'js/admin/RelatedObjectLookups.js']
+    if auto_populated_fields:
+        js.append('js/urlify.js')
+    if opts.has_field_type(models.DateTimeField) or opts.has_field_type(models.TimeField) or opts.has_field_type(models.DateField):
+        js.extend(['js/calendar.js', 'js/admin/DateTimeShortcuts.js'])
+    if opts.get_ordered_objects():
+        js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js'])
+    if opts.admin.js:
+        js.extend(opts.admin.js)
+    seen_collapse = False
+    for field_set in field_sets:
+        if not seen_collapse and 'collapse' in field_set.classes:
+            seen_collapse = True
+            js.append('js/admin/CollapsedFieldsets.js')
+
+        for field_line in field_set:
+            try:
+                for f in field_line:
+                    if f.rel and isinstance(f, models.ManyToManyField) and f.rel.filter_interface:
+                        js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js'])
+                        raise StopIteration
+            except StopIteration:
+                break
+    return js
+
+class AdminBoundField(object):
+    def __init__(self, field, field_mapping, original):
+        self.field = field
+        self.original = original
+        self.form_fields = [field_mapping[name] for name in self.field.get_manipulator_field_names('')]
+        self.element_id = self.form_fields[0].get_id()
+        self.has_label_first = not isinstance(self.field, models.BooleanField)
+        self.raw_id_admin = use_raw_id_admin(field)
+        self.is_date_time = isinstance(field, models.DateTimeField)
+        self.is_file_field = isinstance(field, models.FileField)
+        self.needs_add_label = field.rel and (isinstance(field.rel, models.ManyToOneRel) or isinstance(field.rel, models.ManyToManyRel)) and field.rel.to._meta.admin
+        self.hidden = isinstance(self.field, models.AutoField)
+        self.first = False
+
+        classes = []
+        if self.raw_id_admin:
+            classes.append('nowrap')
+        if max([bool(f.errors()) for f in self.form_fields]):
+            classes.append('error')
+        if classes:
+            self.cell_class_attribute = ' class="%s" ' % ' '.join(classes)
+        self._repr_filled = False
+
+        if field.rel:
+            self.related_url = '../../../%s/%s/' % (field.rel.to._meta.app_label, field.rel.to._meta.object_name.lower())
+
+    def original_value(self):
+        if self.original:
+            return self.original.__dict__[self.field.column]
+
+    def existing_display(self):
+        try:
+            return self._display
+        except AttributeError:
+            if isinstance(self.field.rel, models.ManyToOneRel):
+                self._display = getattr(self.original, self.field.name)
+            elif isinstance(self.field.rel, models.ManyToManyRel):
+                self._display = ", ".join([str(obj) for obj in getattr(self.original, self.field.name).all()])
+            return self._display
+
+    def __repr__(self):
+        return repr(self.__dict__)
+
+    def html_error_list(self):
+        return " ".join([form_field.html_error_list() for form_field in self.form_fields if form_field.errors])
+
+    def original_url(self):
+        if self.is_file_field and self.original and self.field.attname:
+            url_method = getattr(self.original, 'get_%s_url' % self.field.attname)
+            if callable(url_method):
+                return url_method()
+        return ''
+
+class AdminBoundFieldLine(object):
+    def __init__(self, field_line, field_mapping, original):
+        self.bound_fields = [field.bind(field_mapping, original, AdminBoundField) for field in field_line]
+        for bound_field in self:
+            bound_field.first = True
+            break
+
+    def __iter__(self):
+        for bound_field in self.bound_fields:
+            yield bound_field
+
+    def __len__(self):
+        return len(self.bound_fields)
+
+class AdminBoundFieldSet(object):
+    def __init__(self, field_set, field_mapping, original):
+        self.name = field_set.name
+        self.classes = field_set.classes
+        self.description = field_set.description
+        self.bound_field_lines = [field_line.bind(field_mapping, original, AdminBoundFieldLine) for field_line in field_set]
+
+    def __iter__(self):
+        for bound_field_line in self.bound_field_lines:
+            yield bound_field_line
+
+    def __len__(self):
+        return len(self.bound_field_lines)
+
+def render_change_form(model, manipulator, context, add=False, change=False, form_url=''):
+    opts = model._meta
+    app_label = opts.app_label
+    auto_populated_fields = [f for f in opts.fields if f.prepopulate_from]
+    field_sets = opts.admin.get_field_sets(opts)
+    original = getattr(manipulator, 'original_object', None)
+    bound_field_sets = [field_set.bind(context['form'], original, AdminBoundFieldSet) for field_set in field_sets]
+    first_form_field_id = bound_field_sets[0].bound_field_lines[0].bound_fields[0].form_fields[0].get_id();
+    ordered_objects = opts.get_ordered_objects()
+    inline_related_objects = opts.get_followed_related_objects(manipulator.follow)
+    extra_context = {
+        'add': add,
+        'change': change,
+        'has_delete_permission': context['perms'][app_label][opts.get_delete_permission()],
+        'has_change_permission': context['perms'][app_label][opts.get_change_permission()],
+        'has_file_field': opts.has_field_type(models.FileField),
+        'has_absolute_url': hasattr(model, 'get_absolute_url'),
+        'auto_populated_fields': auto_populated_fields,
+        'bound_field_sets': bound_field_sets,
+        'first_form_field_id': first_form_field_id,
+        'javascript_imports': get_javascript_imports(opts, auto_populated_fields, field_sets),
+        'ordered_objects': ordered_objects,
+        'inline_related_objects': inline_related_objects,
+        'form_url': form_url,
+        'opts': opts,
+        'content_type_id': ContentType.objects.get_for_model(model).id,
+    }
+    context.update(extra_context)
+    return render_to_response([
+        "admin/%s/%s/change_form.html" % (app_label, opts.object_name.lower()),
+        "admin/%s/change_form.html" % app_label,
+        "admin/change_form.html"], context_instance=context)
+
+def index(request):
+    return render_to_response('admin/index.html', {'title': _('Site administration')}, context_instance=template.RequestContext(request))
+index = staff_member_required(never_cache(index))
+
+def add_stage(request, app_label, model_name, show_delete=False, form_url='', post_url=None, post_url_continue='../%s/', object_id_override=None):
+    model = models.get_model(app_label, model_name)
+    if model is None:
+        raise Http404, "App %r, model %r, not found" % (app_label, model_name)
+    opts = model._meta
+
+    if not request.user.has_perm(app_label + '.' + opts.get_add_permission()):
+        raise PermissionDenied
+
+    if post_url is None:
+        if request.user.has_perm(app_label + '.' + opts.get_change_permission()):
+            # redirect to list view
+            post_url = '../'
+        else:
+            # Object list will give 'Permission Denied', so go back to admin home
+            post_url = '../../../'
+
+    manipulator = model.AddManipulator()
+    if request.POST:
+        new_data = request.POST.copy()
+
+        if opts.has_field_type(models.FileField):
+            new_data.update(request.FILES)
+
+        errors = manipulator.get_validation_errors(new_data)
+        manipulator.do_html2python(new_data)
+
+        if not errors:
+            new_object = manipulator.save(new_data)
+            pk_value = new_object._get_pk_val()
+            LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), ADDITION)
+            msg = _('The %(name)s "%(obj)s" was added successfully.') % {'name': opts.verbose_name, 'obj': new_object}
+            # Here, we distinguish between different save types by checking for
+            # the presence of keys in request.POST.
+            if request.POST.has_key("_continue"):
+                request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
+                if request.POST.has_key("_popup"):
+                    post_url_continue += "?_popup=1"
+                return HttpResponseRedirect(post_url_continue % pk_value)
+            if request.POST.has_key("_popup"):
+                return HttpResponse('<script type="text/javascript">opener.dismissAddAnotherPopup(window, %s, "%s");</script>' % \
+                    (pk_value, str(new_object).replace('"', '\\"')))
+            elif request.POST.has_key("_addanother"):
+                request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % opts.verbose_name))
+                return HttpResponseRedirect(request.path)
+            else:
+                request.user.message_set.create(message=msg)
+                return HttpResponseRedirect(post_url)
+    else:
+        # Add default data.
+        new_data = manipulator.flatten_data()
+
+        # Override the defaults with GET params, if they exist.
+        new_data.update(dict(request.GET.items()))
+
+        errors = {}
+
+    # Populate the FormWrapper.
+    form = forms.FormWrapper(manipulator, new_data, errors)
+
+    c = template.RequestContext(request, {
+        'title': _('Add %s') % opts.verbose_name,
+        'form': form,
+        'is_popup': request.REQUEST.has_key('_popup'),
+        'show_delete': show_delete,
+    })
+
+    if object_id_override is not None:
+        c['object_id'] = object_id_override
+
+    return render_change_form(model, manipulator, c, add=True)
+add_stage = staff_member_required(never_cache(add_stage))
+
+def change_stage(request, app_label, model_name, object_id):
+    model = models.get_model(app_label, model_name)
+    object_id = unquote(object_id)
+    if model is None:
+        raise Http404, "App %r, model %r, not found" % (app_label, model_name)
+    opts = model._meta
+
+    if not request.user.has_perm(app_label + '.' + opts.get_change_permission()):
+        raise PermissionDenied
+
+    if request.POST and request.POST.has_key("_saveasnew"):
+        return add_stage(request, app_label, model_name, form_url='../../add/')
+
+    try:
+        manipulator = model.ChangeManipulator(object_id)
+    except ObjectDoesNotExist:
+        raise Http404
+
+    if request.POST:
+        new_data = request.POST.copy()
+
+        if opts.has_field_type(models.FileField):
+            new_data.update(request.FILES)
+
+        errors = manipulator.get_validation_errors(new_data)
+        manipulator.do_html2python(new_data)
+
+        if not errors:
+            new_object = manipulator.save(new_data)
+            pk_value = new_object._get_pk_val()
+
+            # Construct the change message.
+            change_message = []
+            if manipulator.fields_added:
+                change_message.append(_('Added %s.') % get_text_list(manipulator.fields_added, _('and')))
+            if manipulator.fields_changed:
+                change_message.append(_('Changed %s.') % get_text_list(manipulator.fields_changed, _('and')))
+            if manipulator.fields_deleted:
+                change_message.append(_('Deleted %s.') % get_text_list(manipulator.fields_deleted, _('and')))
+            change_message = ' '.join(change_message)
+            if not change_message:
+                change_message = _('No fields changed.')
+            LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, pk_value, str(new_object), CHANGE, change_message)
+
+            msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': opts.verbose_name, 'obj': new_object}
+            if request.POST.has_key("_continue"):
+                request.user.message_set.create(message=msg + ' ' + _("You may edit it again below."))
+                if request.REQUEST.has_key('_popup'):
+                    return HttpResponseRedirect(request.path + "?_popup=1")
+                else:
+                    return HttpResponseRedirect(request.path)
+            elif request.POST.has_key("_saveasnew"):
+                request.user.message_set.create(message=_('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': opts.verbose_name, 'obj': new_object})
+                return HttpResponseRedirect("../%s/" % pk_value)
+            elif request.POST.has_key("_addanother"):
+                request.user.message_set.create(message=msg + ' ' + (_("You may add another %s below.") % opts.verbose_name))
+                return HttpResponseRedirect("../add/")
+            else:
+                request.user.message_set.create(message=msg)
+                return HttpResponseRedirect("../")
+    else:
+        # Populate new_data with a "flattened" version of the current data.
+        new_data = manipulator.flatten_data()
+
+        # TODO: do this in flatten_data...
+        # If the object has ordered objects on its admin page, get the existing
+        # order and flatten it into a comma-separated list of IDs.
+
+        id_order_list = []
+        for rel_obj in opts.get_ordered_objects():
+            id_order_list.extend(getattr(manipulator.original_object, 'get_%s_order' % rel_obj.object_name.lower())())
+        if id_order_list:
+            new_data['order_'] = ','.join(map(str, id_order_list))
+        errors = {}
+
+    # Populate the FormWrapper.
+    form = forms.FormWrapper(manipulator, new_data, errors)
+    form.original = manipulator.original_object
+    form.order_objects = []
+
+    #TODO Should be done in flatten_data  / FormWrapper construction
+    for related in opts.get_followed_related_objects():
+        wrt = related.opts.order_with_respect_to
+        if wrt and wrt.rel and wrt.rel.to == opts:
+            func = getattr(manipulator.original_object, 'get_%s_list' %
+                    related.get_accessor_name())
+            orig_list = func()
+            form.order_objects.extend(orig_list)
+
+    c = template.RequestContext(request, {
+        'title': _('Change %s') % opts.verbose_name,
+        'form': form,
+        'object_id': object_id,
+        'original': manipulator.original_object,
+        'is_popup': request.REQUEST.has_key('_popup'),
+    })
+    return render_change_form(model, manipulator, c, change=True)
+change_stage = staff_member_required(never_cache(change_stage))
+
+def _nest_help(obj, depth, val):
+    current = obj
+    for i in range(depth):
+        current = current[-1]
+    current.append(val)
+
+def _get_deleted_objects(deleted_objects, perms_needed, user, obj, opts, current_depth):
+    "Helper function that recursively populates deleted_objects."
+    nh = _nest_help # Bind to local variable for performance
+    if current_depth > 16:
+        return # Avoid recursing too deep.
+    opts_seen = []
+    for related in opts.get_all_related_objects():
+        if related.opts in opts_seen:
+            continue
+        opts_seen.append(related.opts)
+        rel_opts_name = related.get_accessor_name()
+        if isinstance(related.field.rel, models.OneToOneRel):
+            try:
+                sub_obj = getattr(obj, rel_opts_name)
+            except ObjectDoesNotExist:
+                pass
+            else:
+                if related.opts.admin:
+                    p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission())
+                    if not user.has_perm(p):
+                        perms_needed.add(related.opts.verbose_name)
+                        # We don't care about populating deleted_objects now.
+                        continue
+                if related.field.rel.edit_inline or not related.opts.admin:
+                    # Don't display link to edit, because it either has no
+                    # admin or is edited inline.
+                    nh(deleted_objects, current_depth, ['%s: %s' % (capfirst(related.opts.verbose_name), sub_obj), []])
+                else:
+                    # Display a link to the admin page.
+                    nh(deleted_objects, current_depth, ['%s: <a href="../../../../%s/%s/%s/">%s</a>' % \
+                        (capfirst(related.opts.verbose_name), related.opts.app_label, related.opts.object_name.lower(),
+                        sub_obj._get_pk_val(), sub_obj), []])
+                _get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2)
+        else:
+            has_related_objs = False
+            for sub_obj in getattr(obj, rel_opts_name).all():
+                has_related_objs = True
+                if related.field.rel.edit_inline or not related.opts.admin:
+                    # Don't display link to edit, because it either has no
+                    # admin or is edited inline.
+                    nh(deleted_objects, current_depth, ['%s: %s' % (capfirst(related.opts.verbose_name), escape(str(sub_obj))), []])
+                else:
+                    # Display a link to the admin page.
+                    nh(deleted_objects, current_depth, ['%s: <a href="../../../../%s/%s/%s/">%s</a>' % \
+                        (capfirst(related.opts.verbose_name), related.opts.app_label, related.opts.object_name.lower(), sub_obj._get_pk_val(), escape(str(sub_obj))), []])
+                _get_deleted_objects(deleted_objects, perms_needed, user, sub_obj, related.opts, current_depth+2)
+            # If there were related objects, and the user doesn't have
+            # permission to delete them, add the missing perm to perms_needed.
+            if related.opts.admin and has_related_objs:
+                p = '%s.%s' % (related.opts.app_label, related.opts.get_delete_permission())
+                if not user.has_perm(p):
+                    perms_needed.add(rel_opts_name)
+    for related in opts.get_all_related_many_to_many_objects():
+        if related.opts in opts_seen:
+            continue
+        opts_seen.append(related.opts)
+        rel_opts_name = related.get_accessor_name()
+        has_related_objs = False
+        rel_objs = getattr(obj, rel_opts_name, None)
+        if rel_objs:
+            has_related_objs = True
+
+        if has_related_objs:
+            for sub_obj in rel_objs.all():
+                if related.field.rel.edit_inline or not related.opts.admin:
+                    # Don't display link to edit, because it either has no
+                    # admin or is edited inline.
+                    nh(deleted_objects, current_depth, [_('One or more %(fieldname)s in %(name)s: %(obj)s') % \
+                        {'fieldname': related.field.verbose_name, 'name': related.opts.verbose_name, 'obj': escape(str(sub_obj))}, []])
+                else:
+                    # Display a link to the admin page.
+                    nh(deleted_objects, current_depth, [
+                        (_('One or more %(fieldname)s in %(name)s:') % {'fieldname': related.field.verbose_name, 'name':related.opts.verbose_name}) + \
+                        (' <a href="../../../../%s/%s/%s/">%s</a>' % \
+                            (related.opts.app_label, related.opts.module_name, sub_obj._get_pk_val(), escape(str(sub_obj)))), []])
+        # If there were related objects, and the user doesn't have
+        # permission to change them, add the missing perm to perms_needed.
+        if related.opts.admin and has_related_objs:
+            p = '%s.%s' % (related.opts.app_label, related.opts.get_change_permission())
+            if not user.has_perm(p):
+                perms_needed.add(related.opts.verbose_name)
+
+def delete_stage(request, app_label, model_name, object_id):
+    import sets
+    model = models.get_model(app_label, model_name)
+    object_id = unquote(object_id)
+    if model is None:
+        raise Http404, "App %r, model %r, not found" % (app_label, model_name)
+    opts = model._meta
+    if not request.user.has_perm(app_label + '.' + opts.get_delete_permission()):
+        raise PermissionDenied
+    obj = get_object_or_404(model, pk=object_id)
+
+    # Populate deleted_objects, a data structure of all related objects that
+    # will also be deleted.
+    deleted_objects = ['%s: <a href="../../%s/">%s</a>' % (capfirst(opts.verbose_name), object_id, escape(str(obj))), []]
+    perms_needed = sets.Set()
+    _get_deleted_objects(deleted_objects, perms_needed, request.user, obj, opts, 1)
+
+    if request.POST: # The user has already confirmed the deletion.
+        if perms_needed:
+            raise PermissionDenied
+        obj_display = str(obj)
+        obj.delete()
+        LogEntry.objects.log_action(request.user.id, ContentType.objects.get_for_model(model).id, object_id, obj_display, DELETION)
+        request.user.message_set.create(message=_('The %(name)s "%(obj)s" was deleted successfully.') % {'name': opts.verbose_name, 'obj': obj_display})
+        return HttpResponseRedirect("../../")
+    extra_context = {
+        "title": _("Are you sure?"),
+        "object_name": opts.verbose_name,
+        "object": obj,
+        "deleted_objects": deleted_objects,
+        "perms_lacking": perms_needed,
+        "opts": model._meta,
+    }
+    return render_to_response(["admin/%s/%s/delete_confirmation.html" % (app_label, opts.object_name.lower() ),
+                               "admin/%s/delete_confirmation.html" % app_label ,
+                               "admin/delete_confirmation.html"], extra_context, context_instance=template.RequestContext(request))
+delete_stage = staff_member_required(never_cache(delete_stage))
+
+def history(request, app_label, model_name, object_id):
+    model = models.get_model(app_label, model_name)
+    object_id = unquote(object_id)
+    if model is None:
+        raise Http404, "App %r, model %r, not found" % (app_label, model_name)
+    action_list = LogEntry.objects.filter(object_id=object_id,
+        content_type__id__exact=ContentType.objects.get_for_model(model).id).select_related().order_by('action_time')
+    # If no history was found, see whether this object even exists.
+    obj = get_object_or_404(model, pk=object_id)
+    extra_context = {
+        'title': _('Change history: %s') % obj,
+        'action_list': action_list,
+        'module_name': capfirst(model._meta.verbose_name_plural),
+        'object': obj,
+    }
+    return render_to_response(["admin/%s/%s/object_history.html" % (app_label, model._meta.object_name.lower()),
+                               "admin/%s/object_history.html" % app_label ,
+                               "admin/object_history.html"], extra_context, context_instance=template.RequestContext(request))
+history = staff_member_required(never_cache(history))
+
+class ChangeList(object):
+    def __init__(self, request, model):
+        self.model = model
+        self.opts = model._meta
+        self.lookup_opts = self.opts
+        self.manager = self.opts.admin.manager
+
+        # Get search parameters from the query string.
+        try:
+            self.page_num = int(request.GET.get(PAGE_VAR, 0))
+        except ValueError:
+            self.page_num = 0
+        self.show_all = request.GET.has_key(ALL_VAR)
+        self.is_popup = request.GET.has_key(IS_POPUP_VAR)
+        self.params = dict(request.GET.items())
+        if self.params.has_key(PAGE_VAR):
+            del self.params[PAGE_VAR]
+        if self.params.has_key(ERROR_FLAG):
+            del self.params[ERROR_FLAG]
+
+        self.order_field, self.order_type = self.get_ordering()
+        self.query = request.GET.get(SEARCH_VAR, '')
+        self.query_set = self.get_query_set()
+        self.get_results(request)
+        self.title = (self.is_popup and _('Select %s') % self.opts.verbose_name or _('Select %s to change') % self.opts.verbose_name)
+        self.filter_specs, self.has_filters = self.get_filters(request)
+        self.pk_attname = self.lookup_opts.pk.attname
+
+    def get_filters(self, request):
+        filter_specs = []
+        if self.lookup_opts.admin.list_filter and not self.opts.one_to_one_field:
+            filter_fields = [self.lookup_opts.get_field(field_name) \
+                              for field_name in self.lookup_opts.admin.list_filter]
+            for f in filter_fields:
+                spec = FilterSpec.create(f, request, self.params, self.model)
+                if spec and spec.has_output():
+                    filter_specs.append(spec)
+        return filter_specs, bool(filter_specs)
+
+    def get_query_string(self, new_params=None, remove=None):
+        if new_params is None: new_params = {}
+        if remove is None: remove = []
+        p = self.params.copy()
+        for r in remove:
+            for k in p.keys():
+                if k.startswith(r):
+                    del p[k]
+        for k, v in new_params.items():
+            if p.has_key(k) and v is None:
+                del p[k]
+            elif v is not None:
+                p[k] = v
+        return '?' + '&amp;'.join(['%s=%s' % (k, v) for k, v in p.items()]).replace(' ', '%20')
+
+    def get_results(self, request):
+        paginator = ObjectPaginator(self.query_set, self.lookup_opts.admin.list_per_page)
+
+        # Get the number of objects, with admin filters applied.
+        try:
+            result_count = paginator.hits
+        # Naked except! Because we don't have any other way of validating
+        # "params". They might be invalid if the keyword arguments are
+        # incorrect, or if the values are not in the correct type (which would
+        # result in a database error).
+        except:
+            raise IncorrectLookupParameters
+
+        # Get the total number of objects, with no admin filters applied.
+        # Perform a slight optimization: Check to see whether any filters were
+        # given. If not, use paginator.hits to calculate the number of objects,
+        # because we've already done paginator.hits and the value is cached.
+        if isinstance(self.query_set._filters, models.Q) and not self.query_set._filters.kwargs:
+            full_result_count = result_count
+        else:
+            full_result_count = self.manager.count()
+
+        can_show_all = result_count <= MAX_SHOW_ALL_ALLOWED
+        multi_page = result_count > self.lookup_opts.admin.list_per_page
+
+        # Get the list of objects to display on this page.
+        if (self.show_all and can_show_all) or not multi_page:
+            result_list = list(self.query_set)
+        else:
+            try:
+                result_list = paginator.get_page(self.page_num)
+            except InvalidPage:
+                result_list = ()
+
+        self.result_count = result_count
+        self.full_result_count = full_result_count
+        self.result_list = result_list
+        self.can_show_all = can_show_all
+        self.multi_page = multi_page
+        self.paginator = paginator
+
+    def get_ordering(self):
+        lookup_opts, params = self.lookup_opts, self.params
+        # For ordering, first check the "ordering" parameter in the admin options,
+        # then check the object's default ordering. If neither of those exist,
+        # order descending by ID by default. Finally, look for manually-specified
+        # ordering from the query string.
+        ordering = lookup_opts.admin.ordering or lookup_opts.ordering or ['-' + lookup_opts.pk.name]
+
+        # Normalize it to new-style ordering.
+        ordering = handle_legacy_orderlist(ordering)
+
+        if ordering[0].startswith('-'):
+            order_field, order_type = ordering[0][1:], 'desc'
+        else:
+            order_field, order_type = ordering[0], 'asc'
+        if params.has_key(ORDER_VAR):
+            try:
+                try:
+                    f = lookup_opts.get_field(lookup_opts.admin.list_display[int(params[ORDER_VAR])])
+                except models.FieldDoesNotExist:
+                    pass
+                else:
+                    if not isinstance(f.rel, models.ManyToOneRel) or not f.null:
+                        order_field = f.name
+            except (IndexError, ValueError):
+                pass # Invalid ordering specified. Just use the default.
+        if params.has_key(ORDER_TYPE_VAR) and params[ORDER_TYPE_VAR] in ('asc', 'desc'):
+            order_type = params[ORDER_TYPE_VAR]
+        return order_field, order_type
+
+    def get_query_set(self):
+        qs = self.manager.get_query_set()
+        lookup_params = self.params.copy() # a dictionary of the query string
+        for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR):
+            if lookup_params.has_key(i):
+                del lookup_params[i]
+
+        # Apply lookup parameters from the query string.
+        qs = qs.filter(**lookup_params)
+
+        # Use select_related() if one of the list_display options is a field
+        # with a relationship.
+        if self.lookup_opts.admin.list_select_related:
+            qs = qs.select_related()
+        else:
+            for field_name in self.lookup_opts.admin.list_display:
+                try:
+                    f = self.lookup_opts.get_field(field_name)
+                except models.FieldDoesNotExist:
+                    pass
+                else:
+                    if isinstance(f.rel, models.ManyToOneRel):
+                        qs = qs.select_related()
+                        break
+
+        # Calculate lookup_order_field.
+        # If the order-by field is a field with a relationship, order by the
+        # value in the related table.
+        lookup_order_field = self.order_field
+        try:
+            f = self.lookup_opts.get_field(self.order_field, many_to_many=False)
+        except models.FieldDoesNotExist:
+            pass
+        else:
+            if isinstance(f.rel, models.OneToOneRel):
+                # For OneToOneFields, don't try to order by the related object's ordering criteria.
+                pass
+            elif isinstance(f.rel, models.ManyToOneRel):
+                rel_ordering = f.rel.to._meta.ordering and f.rel.to._meta.ordering[0] or f.rel.to._meta.pk.column
+                lookup_order_field = '%s.%s' % (f.rel.to._meta.db_table, rel_ordering)
+
+        # Set ordering.
+        qs = qs.order_by((self.order_type == 'desc' and '-' or '') + lookup_order_field)
+
+        # Apply keyword searches.
+        if self.lookup_opts.admin.search_fields and self.query:
+            for bit in self.query.split():
+                or_queries = [models.Q(**{'%s__icontains' % field_name: bit}) for field_name in self.lookup_opts.admin.search_fields]
+                other_qs = QuerySet(self.model)
+                other_qs = other_qs.filter(reduce(operator.or_, or_queries))
+                qs = qs & other_qs
+
+        if self.opts.one_to_one_field:
+            qs = qs.complex_filter(self.opts.one_to_one_field.rel.limit_choices_to)
+
+        return qs
+
+    def url_for_result(self, result):
+        return "%s/" % quote(getattr(result, self.pk_attname))
+
+def change_list(request, app_label, model_name):
+    model = models.get_model(app_label, model_name)
+    if model is None:
+        raise Http404, "App %r, model %r, not found" % (app_label, model_name)
+    if not request.user.has_perm(app_label + '.' + model._meta.get_change_permission()):
+        raise PermissionDenied
+    try:
+        cl = ChangeList(request, model)
+    except IncorrectLookupParameters:
+        # Wacky lookup parameters were given, so redirect to the main
+        # changelist page, without parameters, and pass an 'invalid=1'
+        # parameter via the query string. If wacky parameters were given and
+        # the 'invalid=1' parameter was already in the query string, something
+        # is screwed up with the database, so display an error page.
+        if ERROR_FLAG in request.GET.keys():
+            return render_to_response('admin/invalid_setup.html', {'title': _('Database error')})
+        return HttpResponseRedirect(request.path + '?' + ERROR_FLAG + '=1')
+    c = template.RequestContext(request, {
+        'title': cl.title,
+        'is_popup': cl.is_popup,
+        'cl': cl,
+    })
+    c.update({'has_add_permission': c['perms'][app_label][cl.opts.get_add_permission()]}),
+    return render_to_response(['admin/%s/%s/change_list.html' % (app_label, cl.opts.object_name.lower()),
+                               'admin/%s/change_list.html' % app_label,
+                               'admin/change_list.html'], context_instance=c)
+change_list = staff_member_required(never_cache(change_list))

Added: vendor/django/current/django/contrib/admin/views/template.py
===================================================================
--- vendor/django/current/django/contrib/admin/views/template.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/admin/views/template.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,72 @@
+from django.contrib.admin.views.decorators import staff_member_required
+from django.core import validators
+from django import template, forms
+from django.template import loader
+from django.shortcuts import render_to_response
+from django.contrib.sites.models import Site
+from django.conf import settings
+
+def template_validator(request):
+    """
+    Displays the template validator form, which finds and displays template
+    syntax errors.
+    """
+    # get a dict of {site_id : settings_module} for the validator
+    settings_modules = {}
+    for mod in settings.ADMIN_FOR:
+        settings_module = __import__(mod, '', '', [''])
+        settings_modules[settings_module.SITE_ID] = settings_module
+    manipulator = TemplateValidator(settings_modules)
+    new_data, errors = {}, {}
+    if request.POST:
+        new_data = request.POST.copy()
+        errors = manipulator.get_validation_errors(new_data)
+        if not errors:
+            request.user.message_set.create(message='The template is valid.')
+    return render_to_response('admin/template_validator.html', {
+        'title': 'Template validator',
+        'form': forms.FormWrapper(manipulator, new_data, errors),
+    }, context_instance=template.RequestContext(request))
+template_validator = staff_member_required(template_validator)
+
+class TemplateValidator(forms.Manipulator):
+    def __init__(self, settings_modules):
+        self.settings_modules = settings_modules
+        site_list = Site.objects.in_bulk(settings_modules.keys()).values()
+        self.fields = (
+            forms.SelectField('site', is_required=True, choices=[(s.id, s.name) for s in site_list]),
+            forms.LargeTextField('template', is_required=True, rows=25, validator_list=[self.isValidTemplate]),
+        )
+
+    def isValidTemplate(self, field_data, all_data):
+        # get the settings module
+        # if the site isn't set, we don't raise an error since the site field will
+        try:
+            site_id = int(all_data.get('site', None))
+        except (ValueError, TypeError):
+            return
+        settings_module = self.settings_modules.get(site_id, None)
+        if settings_module is None:
+            return
+
+        # so that inheritance works in the site's context, register a new function
+        # for "extends" that uses the site's TEMPLATE_DIRS instead.
+        def new_do_extends(parser, token):
+            node = loader.do_extends(parser, token)
+            node.template_dirs = settings_module.TEMPLATE_DIRS
+            return node
+        register = template.Library()
+        register.tag('extends', new_do_extends)
+        template.builtins.append(register)
+
+        # Now validate the template using the new template dirs
+        # making sure to reset the extends function in any case.
+        error = None
+        try:
+            tmpl = loader.get_template_from_string(field_data)
+            tmpl.render(template.Context({}))
+        except template.TemplateSyntaxError, e:
+            error = e
+        template.builtins.remove(register)
+        if error:
+            raise validators.ValidationError, e.args

Added: vendor/django/current/django/contrib/auth/__init__.py
===================================================================
--- vendor/django/current/django/contrib/auth/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,77 @@
+from django.core.exceptions import ImproperlyConfigured
+
+SESSION_KEY = '_auth_user_id'
+BACKEND_SESSION_KEY = '_auth_user_backend'
+LOGIN_URL = '/accounts/login/'
+REDIRECT_FIELD_NAME = 'next'
+
+def load_backend(path):
+    i = path.rfind('.')
+    module, attr = path[:i], path[i+1:]
+    try:
+        mod = __import__(module, '', '', [attr])
+    except ImportError, e:
+        raise ImproperlyConfigured, 'Error importing authentication backend %s: "%s"' % (module, e)
+    try:
+        cls = getattr(mod, attr)
+    except AttributeError:
+        raise ImproperlyConfigured, 'Module "%s" does not define a "%s" authentication backend' % (module, attr)
+    return cls()
+
+def get_backends():
+    from django.conf import settings
+    backends = []
+    for backend_path in settings.AUTHENTICATION_BACKENDS:
+        backends.append(load_backend(backend_path))
+    return backends
+
+def authenticate(**credentials):
+    """
+    If the given credentials are valid, return a User object.
+    """
+    for backend in get_backends():
+        try:
+            user = backend.authenticate(**credentials)
+        except TypeError:
+            # This backend doesn't accept these credentials as arguments. Try the next one.
+            continue
+        if user is None:
+            continue
+        # Annotate the user object with the path of the backend.
+        user.backend = "%s.%s" % (backend.__module__, backend.__class__.__name__)
+        return user
+
+def login(request, user):
+    """
+    Persist a user id and a backend in the request. This way a user doesn't
+    have to reauthenticate on every request.
+    """
+    if user is None:
+        user = request.user
+    # TODO: It would be nice to support different login methods, like signed cookies.
+    request.session[SESSION_KEY] = user.id
+    request.session[BACKEND_SESSION_KEY] = user.backend
+
+def logout(request):
+    """
+    Remove the authenticated user's ID from the request.
+    """
+    try:
+        del request.session[SESSION_KEY]
+    except KeyError:
+        pass
+    try:
+        del request.session[BACKEND_SESSION_KEY]
+    except KeyError:
+        pass
+
+def get_user(request):
+    from django.contrib.auth.models import AnonymousUser
+    try:
+        user_id = request.session[SESSION_KEY]
+        backend_path = request.session[BACKEND_SESSION_KEY]
+        backend = load_backend(backend_path)
+        user = backend.get_user(user_id) or AnonymousUser()
+    except KeyError:
+        user = AnonymousUser()
+    return user

Added: vendor/django/current/django/contrib/auth/backends.py
===================================================================
--- vendor/django/current/django/contrib/auth/backends.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/backends.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,21 @@
+from django.contrib.auth.models import User
+
+class ModelBackend:
+    """
+    Authenticate against django.contrib.auth.models.User
+    """
+    # TODO: Model, login attribute name and password attribute name should be
+    # configurable.
+    def authenticate(self, username=None, password=None):
+        try:
+            user = User.objects.get(username=username)
+            if user.check_password(password):
+                return user
+        except User.DoesNotExist:
+            return None
+
+    def get_user(self, user_id):
+        try:
+            return User.objects.get(pk=user_id)
+        except User.DoesNotExist:
+            return None

Added: vendor/django/current/django/contrib/auth/create_superuser.py
===================================================================
--- vendor/django/current/django/contrib/auth/create_superuser.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/create_superuser.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,90 @@
+"""
+Helper function for creating superusers in the authentication system.
+
+If run from the command line, this module lets you create a superuser
+interactively.
+"""
+
+from django.core import validators
+from django.contrib.auth.models import User
+import getpass
+import os
+import sys
+
+def createsuperuser(username=None, email=None, password=None):
+    """
+    Helper function for creating a superuser from the command line. All
+    arguments are optional and will be prompted-for if invalid or not given.
+    """
+    try:
+        import pwd
+    except ImportError:
+        default_username = ''
+    else:
+        # Determine the current system user's username, to use as a default.
+        default_username = pwd.getpwuid(os.getuid())[0].replace(' ', '').lower()
+
+    # Determine whether the default username is taken, so we don't display
+    # it as an option.
+    if default_username:
+        try:
+            User.objects.get(username=default_username)
+        except User.DoesNotExist:
+            pass
+        else:
+            default_username = ''
+
+    try:
+        while 1:
+            if not username:
+                input_msg = 'Username'
+                if default_username:
+                    input_msg += ' (Leave blank to use %r)' % default_username
+                username = raw_input(input_msg + ': ')
+            if default_username and username == '':
+                username = default_username
+            if not username.isalnum():
+                sys.stderr.write("Error: That username is invalid. Use only letters, digits and underscores.\n")
+                username = None
+            try:
+                User.objects.get(username=username)
+            except User.DoesNotExist:
+                break
+            else:
+                sys.stderr.write("Error: That username is already taken.\n")
+                username = None
+        while 1:
+            if not email:
+                email = raw_input('E-mail address: ')
+            try:
+                validators.isValidEmail(email, None)
+            except validators.ValidationError:
+                sys.stderr.write("Error: That e-mail address is invalid.\n")
+                email = None
+            else:
+                break
+        while 1:
+            if not password:
+                password = getpass.getpass()
+                password2 = getpass.getpass('Password (again): ')
+                if password != password2:
+                    sys.stderr.write("Error: Your passwords didn't match.\n")
+                    password = None
+                    continue
+            if password.strip() == '':
+                sys.stderr.write("Error: Blank passwords aren't allowed.\n")
+                password = None
+                continue
+            break
+    except KeyboardInterrupt:
+        sys.stderr.write("\nOperation cancelled.\n")
+        sys.exit(1)
+    u = User.objects.create_user(username, email, password)
+    u.is_staff = True
+    u.is_active = True
+    u.is_superuser = True
+    u.save()
+    print "Superuser created successfully."
+
+if __name__ == "__main__":
+    createsuperuser()

Added: vendor/django/current/django/contrib/auth/decorators.py
===================================================================
--- vendor/django/current/django/contrib/auth/decorators.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/decorators.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,28 @@
+from django.contrib.auth import LOGIN_URL, REDIRECT_FIELD_NAME
+from django.http import HttpResponseRedirect
+from urllib import quote
+
+def user_passes_test(test_func, login_url=LOGIN_URL):
+    """
+    Decorator for views that checks that the user passes the given test,
+    redirecting to the log-in page if necessary. The test should be a callable
+    that takes the user object and returns True if the user passes.
+    """
+    def _dec(view_func):
+        def _checklogin(request, *args, **kwargs):
+            if test_func(request.user):
+                return view_func(request, *args, **kwargs)
+            return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, quote(request.get_full_path())))
+        _checklogin.__doc__ = view_func.__doc__
+        _checklogin.__dict__ = view_func.__dict__
+
+        return _checklogin
+    return _dec
+
+login_required = user_passes_test(lambda u: u.is_authenticated())
+login_required.__doc__ = (
+    """
+    Decorator for views that checks that the user is logged in, redirecting
+    to the log-in page if necessary.
+    """
+    )

Added: vendor/django/current/django/contrib/auth/forms.py
===================================================================
--- vendor/django/current/django/contrib/auth/forms.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/forms.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,106 @@
+from django.contrib.auth.models import User
+from django.contrib.auth import authenticate
+from django.contrib.sites.models import Site
+from django.template import Context, loader
+from django.core import validators
+from django import forms
+
+class AuthenticationForm(forms.Manipulator):
+    """
+    Base class for authenticating users. Extend this to get a form that accepts
+    username/password logins.
+    """
+    def __init__(self, request=None):
+        """
+        If request is passed in, the manipulator will validate that cookies are
+        enabled. Note that the request (a HttpRequest object) must have set a
+        cookie with the key TEST_COOKIE_NAME and value TEST_COOKIE_VALUE before
+        running this validator.
+        """
+        self.request = request
+        self.fields = [
+            forms.TextField(field_name="username", length=15, maxlength=30, is_required=True,
+                validator_list=[self.isValidUser, self.hasCookiesEnabled]),
+            forms.PasswordField(field_name="password", length=15, maxlength=30, is_required=True),
+        ]
+        self.user_cache = None
+
+    def hasCookiesEnabled(self, field_data, all_data):
+        if self.request and not self.request.session.test_cookie_worked():
+            raise validators.ValidationError, _("Your Web browser doesn't appear to have cookies enabled. Cookies are required for logging in.")
+
+    def isValidUser(self, field_data, all_data):
+        username = field_data
+        password = all_data.get('password', None)
+        self.user_cache = authenticate(username=username, password=password)
+        if self.user_cache is None:
+            raise validators.ValidationError, _("Please enter a correct username and password. Note that both fields are case-sensitive.")
+        elif not self.user_cache.is_active:
+            raise validators.ValidationError, _("This account is inactive.")
+
+    def get_user_id(self):
+        if self.user_cache:
+            return self.user_cache.id
+        return None
+
+    def get_user(self):
+        return self.user_cache
+
+class PasswordResetForm(forms.Manipulator):
+    "A form that lets a user request a password reset"
+    def __init__(self):
+        self.fields = (
+            forms.EmailField(field_name="email", length=40, is_required=True,
+                validator_list=[self.isValidUserEmail]),
+        )
+
+    def isValidUserEmail(self, new_data, all_data):
+        "Validates that a user exists with the given e-mail address"
+        try:
+            self.user_cache = User.objects.get(email__iexact=new_data)
+        except User.DoesNotExist:
+            raise validators.ValidationError, "That e-mail address doesn't have an associated user acount. Are you sure you've registered?"
+
+    def save(self, domain_override=None, email_template_name='registration/password_reset_email.html'):
+        "Calculates a new password randomly and sends it to the user"
+        from django.core.mail import send_mail
+        new_pass = User.objects.make_random_password()
+        self.user_cache.set_password(new_pass)
+        self.user_cache.save()
+        if not domain_override:
+            current_site = Site.objects.get_current()
+            site_name = current_site.name
+            domain = current_site.domain
+        else:
+            site_name = domain = domain_override
+        t = loader.get_template(email_template_name)
+        c = {
+            'new_password': new_pass,
+            'email': self.user_cache.email,
+            'domain': domain,
+            'site_name': site_name,
+            'user': self.user_cache,
+        }
+        send_mail('Password reset on %s' % site_name, t.render(Context(c)), None, [self.user_cache.email])
+
+class PasswordChangeForm(forms.Manipulator):
+    "A form that lets a user change his password."
+    def __init__(self, user):
+        self.user = user
+        self.fields = (
+            forms.PasswordField(field_name="old_password", length=30, maxlength=30, is_required=True,
+                validator_list=[self.isValidOldPassword]),
+            forms.PasswordField(field_name="new_password1", length=30, maxlength=30, is_required=True,
+                validator_list=[validators.AlwaysMatchesOtherField('new_password2', "The two 'new password' fields didn't match.")]),
+            forms.PasswordField(field_name="new_password2", length=30, maxlength=30, is_required=True),
+        )
+
+    def isValidOldPassword(self, new_data, all_data):
+        "Validates that the old_password field is correct."
+        if not self.user.check_password(new_data):
+            raise validators.ValidationError, "Your old password was entered incorrectly. Please enter it again."
+
+    def save(self, new_data):
+        "Saves the new password."
+        self.user.set_password(new_data['new_password1'])
+        self.user.save()

Added: vendor/django/current/django/contrib/auth/handlers/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/auth/handlers/modpython.py
===================================================================
--- vendor/django/current/django/contrib/auth/handlers/modpython.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/handlers/modpython.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,47 @@
+from mod_python import apache
+import os
+
+def authenhandler(req, **kwargs):
+    """
+    Authentication handler that checks against Django's auth database.
+    """
+
+    # mod_python fakes the environ, and thus doesn't process SetEnv.  This fixes
+    # that so that the following import works
+    os.environ.update(req.subprocess_env)
+
+    # check for PythonOptions
+    _str_to_bool = lambda s: s.lower() in ('1', 'true', 'on', 'yes')
+
+    options = req.get_options()
+    permission_name = options.get('DjangoPermissionName', None)
+    staff_only = _str_to_bool(options.get('DjangoRequireStaffStatus', "on"))
+    superuser_only = _str_to_bool(options.get('DjangoRequireSuperuserStatus', "off"))
+    settings_module = options.get('DJANGO_SETTINGS_MODULE', None)
+    if settings_module:
+        os.environ['DJANGO_SETTINGS_MODULE'] = settings_module
+
+    from django.contrib.auth.models import User
+
+    # check that the username is valid
+    kwargs = {'username': req.user, 'is_active': True}
+    if staff_only:
+        kwargs['is_staff'] = True
+    if superuser_only:
+        kwargs['is_superuser'] = True
+    try:
+        user = User.objects.get(**kwargs)
+    except User.DoesNotExist:
+        return apache.HTTP_UNAUTHORIZED
+
+    # check the password and any permission given
+    if user.check_password(req.get_basic_auth_pw()):
+        if permission_name:
+            if user.has_perm(permission_name):
+                return apache.OK
+            else:
+                return apache.HTTP_UNAUTHORIZED
+        else:
+            return apache.OK
+    else:
+        return apache.HTTP_UNAUTHORIZED

Added: vendor/django/current/django/contrib/auth/management.py
===================================================================
--- vendor/django/current/django/contrib/auth/management.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/management.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,49 @@
+"""
+Creates permissions for all installed apps that need permissions.
+"""
+
+from django.dispatch import dispatcher
+from django.db.models import get_models, signals
+from django.contrib.auth import models as auth_app
+
+def _get_permission_codename(action, opts):
+    return '%s_%s' % (action, opts.object_name.lower())
+
+def _get_all_permissions(opts):
+    "Returns (codename, name) for all permissions in the given opts."
+    perms = []
+    for action in ('add', 'change', 'delete'):
+        perms.append((_get_permission_codename(action, opts), 'Can %s %s' % (action, opts.verbose_name)))
+    return perms + list(opts.permissions)
+
+def create_permissions(app, created_models):
+    from django.contrib.contenttypes.models import ContentType
+    from django.contrib.auth.models import Permission
+    app_models = get_models(app)
+    if not app_models:
+        return
+    for klass in app_models:
+        ctype = ContentType.objects.get_for_model(klass)
+        for codename, name in _get_all_permissions(klass._meta):
+            p, created = Permission.objects.get_or_create(codename=codename, content_type__pk=ctype.id,
+                defaults={'name': name, 'content_type': ctype})
+            if created:
+                print "Adding permission '%s'" % p
+
+def create_superuser(app, created_models):
+    from django.contrib.auth.models import User
+    from django.contrib.auth.create_superuser import createsuperuser as do_create
+    if User in created_models:
+        msg = "\nYou just installed Django's auth system, which means you don't have " \
+                "any superusers defined.\nWould you like to create one now? (yes/no): "
+        confirm = raw_input(msg)
+        while 1:
+            if confirm not in ('yes', 'no'):
+                confirm = raw_input('Please enter either "yes" or "no": ')
+                continue
+            if confirm == 'yes':
+                do_create()
+            break
+
+dispatcher.connect(create_permissions, signal=signals.post_syncdb)
+dispatcher.connect(create_superuser, sender=auth_app, signal=signals.post_syncdb)

Added: vendor/django/current/django/contrib/auth/middleware.py
===================================================================
--- vendor/django/current/django/contrib/auth/middleware.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/middleware.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,12 @@
+class LazyUser(object):
+    def __get__(self, request, obj_type=None):
+        if not hasattr(request, '_cached_user'):
+            from django.contrib.auth import get_user
+            request._cached_user = get_user(request)
+        return request._cached_user
+
+class AuthenticationMiddleware(object):
+    def process_request(self, request):
+        assert hasattr(request, 'session'), "The Django authentication middleware requires session middleware to be installed. Edit your MIDDLEWARE_CLASSES setting to insert 'django.contrib.sessions.middleware.SessionMiddleware'."
+        request.__class__.user = LazyUser()
+        return None

Added: vendor/django/current/django/contrib/auth/models.py
===================================================================
--- vendor/django/current/django/contrib/auth/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,304 @@
+from django.core import validators
+from django.core.exceptions import ImproperlyConfigured
+from django.db import backend, connection, models
+from django.contrib.contenttypes.models import ContentType
+from django.utils.translation import gettext_lazy as _
+import datetime
+
+def check_password(raw_password, enc_password):
+    """
+    Returns a boolean of whether the raw_password was correct. Handles
+    encryption formats behind the scenes.
+    """
+    algo, salt, hsh = enc_password.split('$')
+    if algo == 'md5':
+        import md5
+        return hsh == md5.new(salt+raw_password).hexdigest()
+    elif algo == 'sha1':
+        import sha
+        return hsh == sha.new(salt+raw_password).hexdigest()
+    raise ValueError, "Got unknown password algorithm type in password."
+
+class SiteProfileNotAvailable(Exception):
+    pass
+
+class Permission(models.Model):
+    """The permissions system provides a way to assign permissions to specific users and groups of users.
+
+    The permission system is used by the Django admin site, but may also be useful in your own code. The Django admin site uses permissions as follows:
+
+        - The "add" permission limits the user's ability to view the "add" form and add an object.
+        - The "change" permission limits a user's ability to view the change list, view the "change" form and change an object.
+        - The "delete" permission limits the ability to delete an object.
+
+    Permissions are set globally per type of object, not per specific object instance. It is possible to say "Mary may change news stories," but it's not currently possible to say "Mary may change news stories, but only the ones she created herself" or "Mary may only change news stories that have a certain status or publication date."
+
+    Three basic permissions -- add, create and delete -- are automatically created for each Django model.
+    """
+    name = models.CharField(_('name'), maxlength=50)
+    content_type = models.ForeignKey(ContentType)
+    codename = models.CharField(_('codename'), maxlength=100)
+    class Meta:
+        verbose_name = _('permission')
+        verbose_name_plural = _('permissions')
+        unique_together = (('content_type', 'codename'),)
+        ordering = ('content_type', 'codename')
+
+    def __str__(self):
+        return "%s | %s" % (self.content_type, self.name)
+
+class Group(models.Model):
+    """Groups are a generic way of categorizing users to apply permissions, or some other label, to those users. A user can belong to any number of groups.
+
+    A user in a group automatically has all the permissions granted to that group. For example, if the group Site editors has the permission can_edit_home_page, any user in that group will have that permission.
+
+    Beyond permissions, groups are a convenient way to categorize users to apply some label, or extended functionality, to them. For example, you could create a group 'Special users', and you could write code that would do special things to those users -- such as giving them access to a members-only portion of your site, or sending them members-only e-mail messages.
+    """
+    name = models.CharField(_('name'), maxlength=80, unique=True)
+    permissions = models.ManyToManyField(Permission, verbose_name=_('permissions'), blank=True, filter_interface=models.HORIZONTAL)
+    class Meta:
+        verbose_name = _('group')
+        verbose_name_plural = _('groups')
+        ordering = ('name',)
+    class Admin:
+        search_fields = ('name',)
+
+    def __str__(self):
+        return self.name
+
+class UserManager(models.Manager):
+    def create_user(self, username, email, password):
+        "Creates and saves a User with the given username, e-mail and password."
+        now = datetime.datetime.now()
+        user = self.model(None, username, '', '', email.strip().lower(), 'placeholder', False, True, False, now, now)
+        user.set_password(password)
+        user.save()
+        return user
+
+    def make_random_password(self, length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789'):
+        "Generates a random password with the given length and given allowed_chars"
+        # Note that default value of allowed_chars does not have "I" or letters
+        # that look like it -- just to avoid confusion.
+        from random import choice
+        return ''.join([choice(allowed_chars) for i in range(length)])
+
+class User(models.Model):
+    """Users within the Django authentication system are represented by this model.
+
+    Username and password are required. Other fields are optional.
+    """
+    username = models.CharField(_('username'), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric], help_text=_("Required. 30 characters or fewer. Alphanumeric characters only (letters, digits and underscores)."))
+    first_name = models.CharField(_('first name'), maxlength=30, blank=True)
+    last_name = models.CharField(_('last name'), maxlength=30, blank=True)
+    email = models.EmailField(_('e-mail address'), blank=True)
+    password = models.CharField(_('password'), maxlength=128, help_text=_("Use '[algo]$[salt]$[hexdigest]'"))
+    is_staff = models.BooleanField(_('staff status'), help_text=_("Designates whether the user can log into this admin site."))
+    is_active = models.BooleanField(_('active'), default=True, help_text=_("Designates whether this user can log into the Django admin. Unselect this instead of deleting accounts."))
+    is_superuser = models.BooleanField(_('superuser status'), help_text=_("Designates that this user has all permissions without explicitly assigning them."))
+    last_login = models.DateTimeField(_('last login'), default=models.LazyDate())
+    date_joined = models.DateTimeField(_('date joined'), default=models.LazyDate())
+    groups = models.ManyToManyField(Group, verbose_name=_('groups'), blank=True,
+        help_text=_("In addition to the permissions manually assigned, this user will also get all permissions granted to each group he/she is in."))
+    user_permissions = models.ManyToManyField(Permission, verbose_name=_('user permissions'), blank=True, filter_interface=models.HORIZONTAL)
+    objects = UserManager()
+    class Meta:
+        verbose_name = _('user')
+        verbose_name_plural = _('users')
+        ordering = ('username',)
+    class Admin:
+        fields = (
+            (None, {'fields': ('username', 'password')}),
+            (_('Personal info'), {'fields': ('first_name', 'last_name', 'email')}),
+            (_('Permissions'), {'fields': ('is_staff', 'is_active', 'is_superuser', 'user_permissions')}),
+            (_('Important dates'), {'fields': ('last_login', 'date_joined')}),
+            (_('Groups'), {'fields': ('groups',)}),
+        )
+        list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
+        list_filter = ('is_staff', 'is_superuser')
+        search_fields = ('username', 'first_name', 'last_name', 'email')
+
+    def __str__(self):
+        return self.username
+
+    def get_absolute_url(self):
+        return "/users/%s/" % self.username
+
+    def is_anonymous(self):
+        "Always returns False. This is a way of comparing User objects to anonymous users."
+        return False
+    
+    def is_authenticated(self):
+        """Always return True. This is a way to tell if the user has been authenticated in templates.
+        """
+        return True
+
+    def get_full_name(self):
+        "Returns the first_name plus the last_name, with a space in between."
+        full_name = '%s %s' % (self.first_name, self.last_name)
+        return full_name.strip()
+
+    def set_password(self, raw_password):
+        import sha, random
+        algo = 'sha1'
+        salt = sha.new(str(random.random())).hexdigest()[:5]
+        hsh = sha.new(salt+raw_password).hexdigest()
+        self.password = '%s$%s$%s' % (algo, salt, hsh)
+
+    def check_password(self, raw_password):
+        """
+        Returns a boolean of whether the raw_password was correct. Handles
+        encryption formats behind the scenes.
+        """
+        # Backwards-compatibility check. Older passwords won't include the
+        # algorithm or salt.
+        if '$' not in self.password:
+            import md5
+            is_correct = (self.password == md5.new(raw_password).hexdigest())
+            if is_correct:
+                # Convert the password to the new, more secure format.
+                self.set_password(raw_password)
+                self.save()
+            return is_correct
+        return check_password(raw_password, self.password)
+
+    def get_group_permissions(self):
+        "Returns a list of permission strings that this user has through his/her groups."
+        if not hasattr(self, '_group_perm_cache'):
+            import sets
+            cursor = connection.cursor()
+            # The SQL below works out to the following, after DB quoting:
+            # cursor.execute("""
+            #     SELECT ct."app_label", p."codename"
+            #     FROM "auth_permission" p, "auth_group_permissions" gp, "auth_user_groups" ug, "django_content_type" ct
+            #     WHERE p."id" = gp."permission_id"
+            #         AND gp."group_id" = ug."group_id"
+            #         AND ct."id" = p."content_type_id"
+            #         AND ug."user_id" = %s, [self.id])
+            sql = """
+                SELECT ct.%s, p.%s
+                FROM %s p, %s gp, %s ug, %s ct
+                WHERE p.%s = gp.%s
+                    AND gp.%s = ug.%s
+                    AND ct.%s = p.%s
+                    AND ug.%s = %%s""" % (
+                backend.quote_name('app_label'), backend.quote_name('codename'),
+                backend.quote_name('auth_permission'), backend.quote_name('auth_group_permissions'),
+                backend.quote_name('auth_user_groups'), backend.quote_name('django_content_type'),
+                backend.quote_name('id'), backend.quote_name('permission_id'),
+                backend.quote_name('group_id'), backend.quote_name('group_id'),
+                backend.quote_name('id'), backend.quote_name('content_type_id'),
+                backend.quote_name('user_id'),)
+            cursor.execute(sql, [self.id])
+            self._group_perm_cache = sets.Set(["%s.%s" % (row[0], row[1]) for row in cursor.fetchall()])
+        return self._group_perm_cache
+
+    def get_all_permissions(self):
+        if not hasattr(self, '_perm_cache'):
+            import sets
+            self._perm_cache = sets.Set(["%s.%s" % (p.content_type.app_label, p.codename) for p in self.user_permissions.select_related()])
+            self._perm_cache.update(self.get_group_permissions())
+        return self._perm_cache
+
+    def has_perm(self, perm):
+        "Returns True if the user has the specified permission."
+        if not self.is_active:
+            return False
+        if self.is_superuser:
+            return True
+        return perm in self.get_all_permissions()
+
+    def has_perms(self, perm_list):
+        "Returns True if the user has each of the specified permissions."
+        for perm in perm_list:
+            if not self.has_perm(perm):
+                return False
+        return True
+
+    def has_module_perms(self, app_label):
+        "Returns True if the user has any permissions in the given app label."
+        if self.is_superuser:
+            return True
+        return bool(len([p for p in self.get_all_permissions() if p[:p.index('.')] == app_label]))
+
+    def get_and_delete_messages(self):
+        messages = []
+        for m in self.message_set.all():
+            messages.append(m.message)
+            m.delete()
+        return messages
+
+    def email_user(self, subject, message, from_email=None):
+        "Sends an e-mail to this User."
+        from django.core.mail import send_mail
+        send_mail(subject, message, from_email, [self.email])
+
+    def get_profile(self):
+        """
+        Returns site-specific profile for this user. Raises
+        SiteProfileNotAvailable if this site does not allow profiles.
+        """
+        if not hasattr(self, '_profile_cache'):
+            from django.conf import settings
+            if not settings.AUTH_PROFILE_MODULE:
+                raise SiteProfileNotAvailable
+            try:
+                app_label, model_name = settings.AUTH_PROFILE_MODULE.split('.')
+                model = models.get_model(app_label, model_name)
+                self._profile_cache = model._default_manager.get(user__id__exact=self.id)
+            except (ImportError, ImproperlyConfigured):
+                raise SiteProfileNotAvailable
+        return self._profile_cache
+
+class Message(models.Model):
+    """The message system is a lightweight way to queue messages for given users. A message is associated with a User instance (so it is only applicable for registered users). There's no concept of expiration or timestamps. Messages are created by the Django admin after successful actions. For example, "The poll Foo was created successfully." is a message.
+    """
+    user = models.ForeignKey(User)
+    message = models.TextField(_('message'))
+
+    def __str__(self):
+        return self.message
+
+class AnonymousUser(object):
+    id = None
+    username = ''
+
+    def __init__(self):
+        pass
+
+    def __str__(self):
+        return 'AnonymousUser'
+
+    def save(self):
+        raise NotImplementedError
+
+    def delete(self):
+        raise NotImplementedError
+
+    def set_password(self, raw_password):
+        raise NotImplementedError
+
+    def check_password(self, raw_password):
+        raise NotImplementedError
+
+    def _get_groups(self):
+        raise NotImplementedError
+    groups = property(_get_groups)
+
+    def _get_user_permissions(self):
+        raise NotImplementedError
+    user_permissions = property(_get_user_permissions)
+
+    def has_perm(self, perm):
+        return False
+
+    def has_module_perms(self, module):
+        return False
+
+    def get_and_delete_messages(self):
+        return []
+
+    def is_anonymous(self):
+        return True
+    
+    def is_authenticated(self):
+        return False

Added: vendor/django/current/django/contrib/auth/views.py
===================================================================
--- vendor/django/current/django/contrib/auth/views.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/auth/views.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,85 @@
+from django.contrib.auth.forms import AuthenticationForm
+from django.contrib.auth.forms import PasswordResetForm, PasswordChangeForm
+from django import forms
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.contrib.sites.models import Site
+from django.http import HttpResponseRedirect
+from django.contrib.auth.decorators import login_required
+from django.contrib.auth import LOGIN_URL, REDIRECT_FIELD_NAME
+
+def login(request, template_name='registration/login.html'):
+    "Displays the login form and handles the login action."
+    manipulator = AuthenticationForm(request)
+    redirect_to = request.REQUEST.get(REDIRECT_FIELD_NAME, '')
+    if request.POST:
+        errors = manipulator.get_validation_errors(request.POST)
+        if not errors:
+            # Light security check -- make sure redirect_to isn't garbage.
+            if not redirect_to or '://' in redirect_to or ' ' in redirect_to:
+                redirect_to = '/accounts/profile/'
+            from django.contrib.auth import login
+            login(request, manipulator.get_user())
+            request.session.delete_test_cookie()
+            return HttpResponseRedirect(redirect_to)
+    else:
+        errors = {}
+    request.session.set_test_cookie()
+    return render_to_response(template_name, {
+        'form': forms.FormWrapper(manipulator, request.POST, errors),
+        REDIRECT_FIELD_NAME: redirect_to,
+        'site_name': Site.objects.get_current().name,
+    }, context_instance=RequestContext(request))
+
+def logout(request, next_page=None, template_name='registration/logged_out.html'):
+    "Logs out the user and displays 'You are logged out' message."
+    from django.contrib.auth import logout
+    logout(request)
+    if next_page is None:
+        return render_to_response(template_name, {'title': _('Logged out')}, context_instance=RequestContext(request))
+    else:
+        # Redirect to this page until the session has been cleared.
+        return HttpResponseRedirect(next_page or request.path)
+
+def logout_then_login(request, login_url=LOGIN_URL):
+    "Logs out the user if he is logged in. Then redirects to the log-in page."
+    return logout(request, login_url)
+
+def redirect_to_login(next, login_url=LOGIN_URL):
+    "Redirects the user to the login page, passing the given 'next' page"
+    return HttpResponseRedirect('%s?%s=%s' % (login_url, REDIRECT_FIELD_NAME, next))
+
+def password_reset(request, is_admin_site=False, template_name='registration/password_reset_form.html',
+        email_template_name='registration/password_reset_email.html'):
+    new_data, errors = {}, {}
+    form = PasswordResetForm()
+    if request.POST:
+        new_data = request.POST.copy()
+        errors = form.get_validation_errors(new_data)
+        if not errors:
+            if is_admin_site:
+                form.save(domain_override=request.META['HTTP_HOST'])
+            else:
+                form.save(email_template_name=email_template_name)
+            return HttpResponseRedirect('%sdone/' % request.path)
+    return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)},
+        context_instance=RequestContext(request))
+
+def password_reset_done(request, template_name='registration/password_reset_done.html'):
+    return render_to_response(template_name, context_instance=RequestContext(request))
+
+def password_change(request, template_name='registration/password_change_form.html'):
+    new_data, errors = {}, {}
+    form = PasswordChangeForm(request.user)
+    if request.POST:
+        new_data = request.POST.copy()
+        errors = form.get_validation_errors(new_data)
+        if not errors:
+            form.save(new_data)
+            return HttpResponseRedirect('%sdone/' % request.path)
+    return render_to_response(template_name, {'form': forms.FormWrapper(form, new_data, errors)},
+        context_instance=RequestContext(request))
+password_change = login_required(password_change)
+
+def password_change_done(request, template_name='registration/password_change_done.html'):
+    return render_to_response(template_name, context_instance=RequestContext(request))

Added: vendor/django/current/django/contrib/comments/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/comments/feeds.py
===================================================================
--- vendor/django/current/django/contrib/comments/feeds.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/feeds.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,41 @@
+from django.conf import settings
+from django.contrib.comments.models import Comment, FreeComment
+from django.contrib.syndication.feeds import Feed
+from django.contrib.sites.models import Site
+
+class LatestFreeCommentsFeed(Feed):
+    "Feed of latest comments on the current site."
+
+    comments_class = FreeComment
+
+    def title(self):
+        if not hasattr(self, '_site'):
+            self._site = Site.objects.get_current()
+        return "%s comments" % self._site.name
+
+    def link(self):
+        if not hasattr(self, '_site'):
+            self._site = Site.objects.get_current()
+        return "http://%s/" % (self._site.domain)
+
+    def description(self):
+        if not hasattr(self, '_site'):
+            self._site = Site.objects.get_current()
+        return "Latest comments on %s" % self._site.name
+
+    def items(self):
+        return self.comments_class.objects.filter(site__pk=settings.SITE_ID, is_public=True)[:40]
+
+class LatestCommentsFeed(LatestFreeCommentsFeed):
+    """Feed of latest free comments on the current site"""
+
+    comments_class = Comment
+
+    def items(self):
+        qs = LatestFreeCommentsFeed.items(self)
+        qs = qs.filter(is_removed=False)
+        if settings.COMMENTS_BANNED_USERS_GROUP:
+            where = ['user_id NOT IN (SELECT user_id FROM auth_users_group WHERE group_id = %s)']
+            params = [settings.COMMENTS_BANNED_USERS_GROUP]
+            qs = qs.extra(where=where, params=params)
+        return qs

Added: vendor/django/current/django/contrib/comments/models.py
===================================================================
--- vendor/django/current/django/contrib/comments/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,285 @@
+from django.db import models
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.sites.models import Site
+from django.contrib.auth.models import User
+from django.utils.translation import gettext_lazy as _
+from django.conf import settings
+import datetime
+
+MIN_PHOTO_DIMENSION = 5
+MAX_PHOTO_DIMENSION = 1000
+
+# option codes for comment-form hidden fields
+PHOTOS_REQUIRED = 'pr'
+PHOTOS_OPTIONAL = 'pa'
+RATINGS_REQUIRED = 'rr'
+RATINGS_OPTIONAL = 'ra'
+IS_PUBLIC = 'ip'
+
+# what users get if they don't have any karma
+DEFAULT_KARMA = 5
+KARMA_NEEDED_BEFORE_DISPLAYED = 3
+
+class CommentManager(models.Manager):
+    def get_security_hash(self, options, photo_options, rating_options, target):
+        """
+        Returns the MD5 hash of the given options (a comma-separated string such as
+        'pa,ra') and target (something like 'lcom.eventtimes:5157'). Used to
+        validate that submitted form options have not been tampered-with.
+        """
+        import md5
+        return md5.new(options + photo_options + rating_options + target + settings.SECRET_KEY).hexdigest()
+
+    def get_rating_options(self, rating_string):
+        """
+        Given a rating_string, this returns a tuple of (rating_range, options).
+        >>> s = "scale:1-10|First_category|Second_category"
+        >>> get_rating_options(s)
+        ([1, 2, 3, 4, 5, 6, 7, 8, 9, 10], ['First category', 'Second category'])
+        """
+        rating_range, options = rating_string.split('|', 1)
+        rating_range = range(int(rating_range[6:].split('-')[0]), int(rating_range[6:].split('-')[1])+1)
+        choices = [c.replace('_', ' ') for c in options.split('|')]
+        return rating_range, choices
+
+    def get_list_with_karma(self, **kwargs):
+        """
+        Returns a list of Comment objects matching the given lookup terms, with
+        _karma_total_good and _karma_total_bad filled.
+        """
+        extra_kwargs = {}
+        extra_kwargs.setdefault('select', {})
+        extra_kwargs['select']['_karma_total_good'] = 'SELECT COUNT(*) FROM comments_karmascore, comments_comment WHERE comments_karmascore.comment_id=comments_comment.id AND score=1'
+        extra_kwargs['select']['_karma_total_bad'] = 'SELECT COUNT(*) FROM comments_karmascore, comments_comment WHERE comments_karmascore.comment_id=comments_comment.id AND score=-1'
+        return self.filter(**kwargs).extra(**extra_kwargs)
+
+    def user_is_moderator(self, user):
+        if user.is_superuser:
+            return True
+        for g in user.groups.all():
+            if g.id == settings.COMMENTS_MODERATORS_GROUP:
+                return True
+        return False
+
+class Comment(models.Model):
+    user = models.ForeignKey(User, raw_id_admin=True)
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.IntegerField(_('object ID'))
+    headline = models.CharField(_('headline'), maxlength=255, blank=True)
+    comment = models.TextField(_('comment'), maxlength=3000)
+    rating1 = models.PositiveSmallIntegerField(_('rating #1'), blank=True, null=True)
+    rating2 = models.PositiveSmallIntegerField(_('rating #2'), blank=True, null=True)
+    rating3 = models.PositiveSmallIntegerField(_('rating #3'), blank=True, null=True)
+    rating4 = models.PositiveSmallIntegerField(_('rating #4'), blank=True, null=True)
+    rating5 = models.PositiveSmallIntegerField(_('rating #5'), blank=True, null=True)
+    rating6 = models.PositiveSmallIntegerField(_('rating #6'), blank=True, null=True)
+    rating7 = models.PositiveSmallIntegerField(_('rating #7'), blank=True, null=True)
+    rating8 = models.PositiveSmallIntegerField(_('rating #8'), blank=True, null=True)
+    # This field designates whether to use this row's ratings in aggregate
+    # functions (summaries). We need this because people are allowed to post
+    # multiple reviews on the same thing, but the system will only use the
+    # latest one (with valid_rating=True) in tallying the reviews.
+    valid_rating = models.BooleanField(_('is valid rating'))
+    submit_date = models.DateTimeField(_('date/time submitted'), auto_now_add=True)
+    is_public = models.BooleanField(_('is public'))
+    ip_address = models.IPAddressField(_('IP address'), blank=True, null=True)
+    is_removed = models.BooleanField(_('is removed'), help_text=_('Check this box if the comment is inappropriate. A "This comment has been removed" message will be displayed instead.'))
+    site = models.ForeignKey(Site)
+    objects = CommentManager()
+    class Meta:
+        verbose_name = _('comment')
+        verbose_name_plural = _('comments')
+        ordering = ('-submit_date',)
+    class Admin:
+        fields = (
+            (None, {'fields': ('content_type', 'object_id', 'site')}),
+            ('Content', {'fields': ('user', 'headline', 'comment')}),
+            ('Ratings', {'fields': ('rating1', 'rating2', 'rating3', 'rating4', 'rating5', 'rating6', 'rating7', 'rating8', 'valid_rating')}),
+            ('Meta', {'fields': ('is_public', 'is_removed', 'ip_address')}),
+        )
+        list_display = ('user', 'submit_date', 'content_type', 'get_content_object')
+        list_filter = ('submit_date',)
+        date_hierarchy = 'submit_date'
+        search_fields = ('comment', 'user__username')
+
+    def __repr__(self):
+        return "%s: %s..." % (self.user.username, self.comment[:100])
+
+    def get_absolute_url(self):
+        return self.get_content_object().get_absolute_url() + "#c" + str(self.id)
+
+    def get_crossdomain_url(self):
+        return "/r/%d/%d/" % (self.content_type_id, self.object_id)
+
+    def get_flag_url(self):
+        return "/comments/flag/%s/" % self.id
+
+    def get_deletion_url(self):
+        return "/comments/delete/%s/" % self.id
+
+    def get_content_object(self):
+        """
+        Returns the object that this comment is a comment on. Returns None if
+        the object no longer exists.
+        """
+        from django.core.exceptions import ObjectDoesNotExist
+        try:
+            return self.content_type.get_object_for_this_type(pk=self.object_id)
+        except ObjectDoesNotExist:
+            return None
+
+    get_content_object.short_description = _('Content object')
+
+    def _fill_karma_cache(self):
+        "Helper function that populates good/bad karma caches"
+        good, bad = 0, 0
+        for k in self.karmascore_set:
+            if k.score == -1:
+                bad +=1
+            elif k.score == 1:
+                good +=1
+        self._karma_total_good, self._karma_total_bad = good, bad
+
+    def get_good_karma_total(self):
+        if not hasattr(self, "_karma_total_good"):
+            self._fill_karma_cache()
+        return self._karma_total_good
+
+    def get_bad_karma_total(self):
+        if not hasattr(self, "_karma_total_bad"):
+            self._fill_karma_cache()
+        return self._karma_total_bad
+
+    def get_karma_total(self):
+        if not hasattr(self, "_karma_total_good") or not hasattr(self, "_karma_total_bad"):
+            self._fill_karma_cache()
+        return self._karma_total_good + self._karma_total_bad
+
+    def get_as_text(self):
+        return _('Posted by %(user)s at %(date)s\n\n%(comment)s\n\nhttp://%(domain)s%(url)s') % \
+            {'user': self.user.username, 'date': self.submit_date,
+            'comment': self.comment, 'domain': self.site.domain, 'url': self.get_absolute_url()}
+
+class FreeComment(models.Model):
+    # A FreeComment is a comment by a non-registered user.
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.IntegerField(_('object ID'))
+    comment = models.TextField(_('comment'), maxlength=3000)
+    person_name = models.CharField(_("person's name"), maxlength=50)
+    submit_date = models.DateTimeField(_('date/time submitted'), auto_now_add=True)
+    is_public = models.BooleanField(_('is public'))
+    ip_address = models.IPAddressField(_('ip address'))
+    # TODO: Change this to is_removed, like Comment
+    approved = models.BooleanField(_('approved by staff'))
+    site = models.ForeignKey(Site)
+    class Meta:
+        verbose_name = _('free comment')
+        verbose_name_plural = _('free comments')
+        ordering = ('-submit_date',)
+    class Admin:
+        fields = (
+            (None, {'fields': ('content_type', 'object_id', 'site')}),
+            ('Content', {'fields': ('person_name', 'comment')}),
+            ('Meta', {'fields': ('submit_date', 'is_public', 'ip_address', 'approved')}),
+        )
+        list_display = ('person_name', 'submit_date', 'content_type', 'get_content_object')
+        list_filter = ('submit_date',)
+        date_hierarchy = 'submit_date'
+        search_fields = ('comment', 'person_name')
+
+    def __repr__(self):
+        return "%s: %s..." % (self.person_name, self.comment[:100])
+
+    def get_absolute_url(self):
+        return self.get_content_object().get_absolute_url() + "#c" + str(self.id)
+
+    def get_content_object(self):
+        """
+        Returns the object that this comment is a comment on. Returns None if
+        the object no longer exists.
+        """
+        from django.core.exceptions import ObjectDoesNotExist
+        try:
+            return self.content_type.get_object_for_this_type(pk=self.object_id)
+        except ObjectDoesNotExist:
+            return None
+
+    get_content_object.short_description = _('Content object')
+
+class KarmaScoreManager(models.Manager):
+    def vote(self, user_id, comment_id, score):
+        try:
+            karma = self.objects.get(comment__pk=comment_id, user__pk=user_id)
+        except self.model.DoesNotExist:
+            karma = self.model(None, user_id=user_id, comment_id=comment_id, score=score, scored_date=datetime.datetime.now())
+            karma.save()
+        else:
+            karma.score = score
+            karma.scored_date = datetime.datetime.now()
+            karma.save()
+
+    def get_pretty_score(self, score):
+        """
+        Given a score between -1 and 1 (inclusive), returns the same score on a
+        scale between 1 and 10 (inclusive), as an integer.
+        """
+        if score is None:
+            return DEFAULT_KARMA
+        return int(round((4.5 * score) + 5.5))
+
+class KarmaScore(models.Model):
+    user = models.ForeignKey(User)
+    comment = models.ForeignKey(Comment)
+    score = models.SmallIntegerField(_('score'), db_index=True)
+    scored_date = models.DateTimeField(_('score date'), auto_now=True)
+    objects = KarmaScoreManager()
+    class Meta:
+        verbose_name = _('karma score')
+        verbose_name_plural = _('karma scores')
+        unique_together = (('user', 'comment'),)
+
+    def __repr__(self):
+        return _("%(score)d rating by %(user)s") % {'score': self.score, 'user': self.user}
+
+class UserFlagManager(models.Manager):
+    def flag(self, comment, user):
+        """
+        Flags the given comment by the given user. If the comment has already
+        been flagged by the user, or it was a comment posted by the user,
+        nothing happens.
+        """
+        if int(comment.user_id) == int(user.id):
+            return # A user can't flag his own comment. Fail silently.
+        try:
+            f = self.objects.get(user__pk=user.id, comment__pk=comment.id)
+        except self.model.DoesNotExist:
+            from django.core.mail import mail_managers
+            f = self.model(None, user.id, comment.id, None)
+            message = _('This comment was flagged by %(user)s:\n\n%(text)s') % {'user': user.username, 'text': comment.get_as_text()}
+            mail_managers('Comment flagged', message, fail_silently=True)
+            f.save()
+
+class UserFlag(models.Model):
+    user = models.ForeignKey(User)
+    comment = models.ForeignKey(Comment)
+    flag_date = models.DateTimeField(_('flag date'), auto_now_add=True)
+    objects = UserFlagManager()
+    class Meta:
+        verbose_name = _('user flag')
+        verbose_name_plural = _('user flags')
+        unique_together = (('user', 'comment'),)
+
+    def __repr__(self):
+        return _("Flag by %r") % self.user
+
+class ModeratorDeletion(models.Model):
+    user = models.ForeignKey(User, verbose_name='moderator')
+    comment = models.ForeignKey(Comment)
+    deletion_date = models.DateTimeField(_('deletion date'), auto_now_add=True)
+    class Meta:
+        verbose_name = _('moderator deletion')
+        verbose_name_plural = _('moderator deletions')
+        unique_together = (('user', 'comment'),)
+
+    def __repr__(self):
+        return _("Moderator deletion by %r") % self.user

Added: vendor/django/current/django/contrib/comments/templates/comments/form.html
===================================================================
--- vendor/django/current/django/contrib/comments/templates/comments/form.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/templates/comments/form.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,38 @@
+{% load i18n %}
+{% if display_form %}
+<form {% if photos_optional or photos_required %}enctype="multipart/form-data" {% endif %}action="/comments/post/" method="post">
+
+{% if user.is_authenticated %}
+<p>{% trans "Username:" %} <strong>{{ user.username }}</strong> (<a href="/accounts/logout/">{% trans "Log out" %}</a>)</p>
+{% else %}
+<p><label for="id_username">{% trans "Username:" %}</label> <input type="text" name="username" id="id_username" /><br />{% trans "Password:" %} <input type="password" name="password" id="id_password" /> (<a href="/accounts/password_reset/">{% trans "Forgotten your password?" %}</a>)</p>
+{% endif %}
+
+{% if ratings_optional or ratings_required %}
+<p>{% trans "Ratings" %} ({% if ratings_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}):</p>
+<table>
+<tr><th>&nbsp;</th>{% for value in rating_range %}<th>{{ value }}</th>{% endfor %}</tr>
+{% for rating in rating_choices %}
+<tr><th>{{ rating }}</th>{% for value in rating_range %}<th><input type="radio" name="rating{{ forloop.parentloop.counter }}" value="{{ value }}" /></th>{% endfor %}</tr>
+{% endfor %}
+</table>
+<input type="hidden" name="rating_options" value="{{ rating_options }}" />
+{% endif %}
+
+{% if photos_optional or photos_required %}
+<p><label for="id_photo">{% trans "Post a photo" %}</label> ({% if photos_required %}{% trans "Required" %}{% else %}{% trans "Optional" %}{% endif %}):
+<input type="file" name="photo" id="id_photo" /></p>
+<input type="hidden" name="photo_options" value="{{ photo_options }}" />
+{% endif %}
+
+<p><label for="id_comment">{% trans "Comment:" %}</label><br />
+<textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
+
+<p>
+<input type="hidden" name="options" value="{{ options }}" />
+<input type="hidden" name="target" value="{{ target }}" />
+<input type="hidden" name="gonzo" value="{{ hash }}" />
+<input type="submit" name="preview" value="{% trans "Preview comment" %}" />
+</p>
+</form>
+{% endif %}

Added: vendor/django/current/django/contrib/comments/templates/comments/freeform.html
===================================================================
--- vendor/django/current/django/contrib/comments/templates/comments/freeform.html	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/templates/comments/freeform.html	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,13 @@
+{% load i18n %}
+{% if display_form %}
+<form action="/comments/postfree/" method="post">
+<p><label for="id_person_name">{% trans "Your name:" %}</label> <input type="text" id="id_person_name" name="person_name" /></p>
+<p><label for="id_comment">{% trans "Comment:" %}</label><br /><textarea name="comment" id="id_comment" rows="10" cols="60"></textarea></p>
+<p>
+<input type="hidden" name="options" value="{{ options }}" />
+<input type="hidden" name="target" value="{{ target }}" />
+<input type="hidden" name="gonzo" value="{{ hash }}" />
+<input type="submit" name="preview" value="{% trans "Preview comment" %}" />
+</p>
+</form>
+{% endif %}

Added: vendor/django/current/django/contrib/comments/templatetags/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/comments/templatetags/comments.py
===================================================================
--- vendor/django/current/django/contrib/comments/templatetags/comments.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/templatetags/comments.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,322 @@
+from django.contrib.comments.models import Comment, FreeComment
+from django.contrib.comments.models import PHOTOS_REQUIRED, PHOTOS_OPTIONAL, RATINGS_REQUIRED, RATINGS_OPTIONAL, IS_PUBLIC
+from django.contrib.comments.models import MIN_PHOTO_DIMENSION, MAX_PHOTO_DIMENSION
+from django import template
+from django.template import loader
+from django.core.exceptions import ObjectDoesNotExist
+from django.contrib.contenttypes.models import ContentType
+import re
+
+register = template.Library()
+
+COMMENT_FORM = 'comments/form.html'
+FREE_COMMENT_FORM = 'comments/freeform.html'
+
+class CommentFormNode(template.Node):
+    def __init__(self, content_type, obj_id_lookup_var, obj_id, free,
+        photos_optional=False, photos_required=False, photo_options='',
+        ratings_optional=False, ratings_required=False, rating_options='',
+        is_public=True):
+        self.content_type = content_type
+        self.obj_id_lookup_var, self.obj_id, self.free = obj_id_lookup_var, obj_id, free
+        self.photos_optional, self.photos_required = photos_optional, photos_required
+        self.ratings_optional, self.ratings_required = ratings_optional, ratings_required
+        self.photo_options, self.rating_options = photo_options, rating_options
+        self.is_public = is_public
+
+    def render(self, context):
+        from django.utils.text import normalize_newlines
+        import base64
+        context.push()
+        if self.obj_id_lookup_var is not None:
+            try:
+                self.obj_id = template.resolve_variable(self.obj_id_lookup_var, context)
+            except template.VariableDoesNotExist:
+                return ''
+            # Validate that this object ID is valid for this content-type.
+            # We only have to do this validation if obj_id_lookup_var is provided,
+            # because do_comment_form() validates hard-coded object IDs.
+            try:
+                self.content_type.get_object_for_this_type(pk=self.obj_id)
+            except ObjectDoesNotExist:
+                context['display_form'] = False
+            else:
+                context['display_form'] = True
+        else:
+            context['display_form'] = True
+        context['target'] = '%s:%s' % (self.content_type.id, self.obj_id)
+        options = []
+        for var, abbr in (('photos_required', PHOTOS_REQUIRED),
+                          ('photos_optional', PHOTOS_OPTIONAL),
+                          ('ratings_required', RATINGS_REQUIRED),
+                          ('ratings_optional', RATINGS_OPTIONAL),
+                          ('is_public', IS_PUBLIC)):
+            context[var] = getattr(self, var)
+            if getattr(self, var):
+                options.append(abbr)
+        context['options'] = ','.join(options)
+        if self.free:
+            context['hash'] = Comment.objects.get_security_hash(context['options'], '', '', context['target'])
+            default_form = loader.get_template(FREE_COMMENT_FORM)
+        else:
+            context['photo_options'] = self.photo_options
+            context['rating_options'] = normalize_newlines(base64.encodestring(self.rating_options).strip())
+            if self.rating_options:
+                context['rating_range'], context['rating_choices'] = Comment.objects.get_rating_options(self.rating_options)
+            context['hash'] = Comment.objects.get_security_hash(context['options'], context['photo_options'], context['rating_options'], context['target'])
+            default_form = loader.get_template(COMMENT_FORM)
+        output = default_form.render(context)
+        context.pop()
+        return output
+
+class CommentCountNode(template.Node):
+    def __init__(self, package, module, context_var_name, obj_id, var_name, free):
+        self.package, self.module = package, module
+        self.context_var_name, self.obj_id = context_var_name, obj_id
+        self.var_name, self.free = var_name, free
+
+    def render(self, context):
+        from django.conf import settings
+        manager = self.free and FreeComment.objects or Comment.objects
+        if self.context_var_name is not None:
+            self.obj_id = template.resolve_variable(self.context_var_name, context)
+        comment_count = manager.filter(object_id__exact=self.obj_id,
+            content_type__app_label__exact=self.package,
+            content_type__model__exact=self.module, site__id__exact=settings.SITE_ID).count()
+        context[self.var_name] = comment_count
+        return ''
+
+class CommentListNode(template.Node):
+    def __init__(self, package, module, context_var_name, obj_id, var_name, free, ordering, extra_kwargs=None):
+        self.package, self.module = package, module
+        self.context_var_name, self.obj_id = context_var_name, obj_id
+        self.var_name, self.free = var_name, free
+        self.ordering = ordering
+        self.extra_kwargs = extra_kwargs or {}
+
+    def render(self, context):
+        from django.conf import settings
+        get_list_function = self.free and FreeComment.objects.filter or Comment.objects.get_list_with_karma
+        if self.context_var_name is not None:
+            try:
+                self.obj_id = template.resolve_variable(self.context_var_name, context)
+            except template.VariableDoesNotExist:
+                return ''
+        kwargs = {
+            'object_id__exact': self.obj_id,
+            'content_type__app_label__exact': self.package,
+            'content_type__model__exact': self.module,
+            'site__id__exact': settings.SITE_ID,
+        }
+        kwargs.update(self.extra_kwargs)
+        if not self.free and settings.COMMENTS_BANNED_USERS_GROUP:
+            kwargs['select'] = {'is_hidden': 'user_id IN (SELECT user_id FROM auth_user_groups WHERE group_id = %s)' % settings.COMMENTS_BANNED_USERS_GROUP}
+        comment_list = get_list_function(**kwargs).order_by(self.ordering + 'submit_date').select_related()
+
+        if not self.free:
+            if context.has_key('user') and context['user'].is_authenticated():
+                user_id = context['user'].id
+                context['user_can_moderate_comments'] = Comment.objects.user_is_moderator(context['user'])
+            else:
+                user_id = None
+                context['user_can_moderate_comments'] = False
+            # Only display comments by banned users to those users themselves.
+            if settings.COMMENTS_BANNED_USERS_GROUP:
+                comment_list = [c for c in comment_list if not c.is_hidden or (user_id == c.user_id)]
+
+        context[self.var_name] = comment_list
+        return ''
+
+class DoCommentForm:
+    """
+    Displays a comment form for the given params.
+
+    Syntax::
+
+        {% comment_form for [pkg].[py_module_name] [context_var_containing_obj_id] with [list of options] %}
+
+    Example usage::
+
+        {% comment_form for lcom.eventtimes event.id with is_public yes photos_optional thumbs,200,400 ratings_optional scale:1-5|first_option|second_option %}
+
+    ``[context_var_containing_obj_id]`` can be a hard-coded integer or a variable containing the ID.
+    """
+    def __init__(self, free):
+        self.free = free
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        if len(tokens) < 4:
+            raise template.TemplateSyntaxError, "%r tag requires at least 3 arguments" % tokens[0]
+        if tokens[1] != 'for':
+            raise template.TemplateSyntaxError, "Second argument in %r tag must be 'for'" % tokens[0]
+        try:
+            package, module = tokens[2].split('.')
+        except ValueError: # unpack list of wrong size
+            raise template.TemplateSyntaxError, "Third argument in %r tag must be in the format 'package.module'" % tokens[0]
+        try:
+            content_type = ContentType.objects.get(app_label__exact=package, model__exact=module)
+        except ContentType.DoesNotExist:
+            raise template.TemplateSyntaxError, "%r tag has invalid content-type '%s.%s'" % (tokens[0], package, module)
+        obj_id_lookup_var, obj_id = None, None
+        if tokens[3].isdigit():
+            obj_id = tokens[3]
+            try: # ensure the object ID is valid
+                content_type.get_object_for_this_type(pk=obj_id)
+            except ObjectDoesNotExist:
+                raise template.TemplateSyntaxError, "%r tag refers to %s object with ID %s, which doesn't exist" % (tokens[0], content_type.name, obj_id)
+        else:
+            obj_id_lookup_var = tokens[3]
+        kwargs = {}
+        if len(tokens) > 4:
+            if tokens[4] != 'with':
+                raise template.TemplateSyntaxError, "Fourth argument in %r tag must be 'with'" % tokens[0]
+            for option, args in zip(tokens[5::2], tokens[6::2]):
+                if option in ('photos_optional', 'photos_required') and not self.free:
+                    # VALIDATION ##############################################
+                    option_list = args.split(',')
+                    if len(option_list) % 3 != 0:
+                        raise template.TemplateSyntaxError, "Incorrect number of comma-separated arguments to %r tag" % tokens[0]
+                    for opt in option_list[::3]:
+                        if not opt.isalnum():
+                            raise template.TemplateSyntaxError, "Invalid photo directory name in %r tag: '%s'" % (tokens[0], opt)
+                    for opt in option_list[1::3] + option_list[2::3]:
+                        if not opt.isdigit() or not (MIN_PHOTO_DIMENSION <= int(opt) <= MAX_PHOTO_DIMENSION):
+                            raise template.TemplateSyntaxError, "Invalid photo dimension in %r tag: '%s'. Only values between %s and %s are allowed." % (tokens[0], opt, MIN_PHOTO_DIMENSION, MAX_PHOTO_DIMENSION)
+                    # VALIDATION ENDS #########################################
+                    kwargs[option] = True
+                    kwargs['photo_options'] = args
+                elif option in ('ratings_optional', 'ratings_required') and not self.free:
+                    # VALIDATION ##############################################
+                    if 2 < len(args.split('|')) > 9:
+                        raise template.TemplateSyntaxError, "Incorrect number of '%s' options in %r tag. Use between 2 and 8." % (option, tokens[0])
+                    if re.match('^scale:\d+\-\d+\:$', args.split('|')[0]):
+                        raise template.TemplateSyntaxError, "Invalid 'scale' in %r tag's '%s' options" % (tokens[0], option)
+                    # VALIDATION ENDS #########################################
+                    kwargs[option] = True
+                    kwargs['rating_options'] = args
+                elif option in ('is_public'):
+                    kwargs[option] = (args == 'true')
+                else:
+                    raise template.TemplateSyntaxError, "%r tag got invalid parameter '%s'" % (tokens[0], option)
+        return CommentFormNode(content_type, obj_id_lookup_var, obj_id, self.free, **kwargs)
+
+class DoCommentCount:
+    """
+    Gets comment count for the given params and populates the template context
+    with a variable containing that value, whose name is defined by the 'as'
+    clause.
+
+    Syntax::
+
+        {% get_comment_count for [pkg].[py_module_name] [context_var_containing_obj_id] as [varname]  %}
+
+    Example usage::
+
+        {% get_comment_count for lcom.eventtimes event.id as comment_count %}
+
+    Note: ``[context_var_containing_obj_id]`` can also be a hard-coded integer, like this::
+
+        {% get_comment_count for lcom.eventtimes 23 as comment_count %}
+    """
+    def __init__(self, free):
+        self.free = free
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        # Now tokens is a list like this:
+        # ['get_comment_list', 'for', 'lcom.eventtimes', 'event.id', 'as', 'comment_list']
+        if len(tokens) != 6:
+            raise template.TemplateSyntaxError, "%r tag requires 5 arguments" % tokens[0]
+        if tokens[1] != 'for':
+            raise template.TemplateSyntaxError, "Second argument in %r tag must be 'for'" % tokens[0]
+        try:
+            package, module = tokens[2].split('.')
+        except ValueError: # unpack list of wrong size
+            raise template.TemplateSyntaxError, "Third argument in %r tag must be in the format 'package.module'" % tokens[0]
+        try:
+            content_type = ContentType.objects.get(app_label__exact=package, model__exact=module)
+        except ContentType.DoesNotExist:
+            raise template.TemplateSyntaxError, "%r tag has invalid content-type '%s.%s'" % (tokens[0], package, module)
+        var_name, obj_id = None, None
+        if tokens[3].isdigit():
+            obj_id = tokens[3]
+            try: # ensure the object ID is valid
+                content_type.get_object_for_this_type(pk=obj_id)
+            except ObjectDoesNotExist:
+                raise template.TemplateSyntaxError, "%r tag refers to %s object with ID %s, which doesn't exist" % (tokens[0], content_type.name, obj_id)
+        else:
+            var_name = tokens[3]
+        if tokens[4] != 'as':
+            raise template.TemplateSyntaxError, "Fourth argument in %r must be 'as'" % tokens[0]
+        return CommentCountNode(package, module, var_name, obj_id, tokens[5], self.free)
+
+class DoGetCommentList:
+    """
+    Gets comments for the given params and populates the template context with a
+    special comment_package variable, whose name is defined by the ``as``
+    clause.
+
+    Syntax::
+
+        {% get_comment_list for [pkg].[py_module_name] [context_var_containing_obj_id] as [varname] (reversed) %}
+
+    Example usage::
+
+        {% get_comment_list for lcom.eventtimes event.id as comment_list %}
+
+    Note: ``[context_var_containing_obj_id]`` can also be a hard-coded integer, like this::
+
+        {% get_comment_list for lcom.eventtimes 23 as comment_list %}
+
+    To get a list of comments in reverse order -- that is, most recent first --
+    pass ``reversed`` as the last param::
+
+        {% get_comment_list for lcom.eventtimes event.id as comment_list reversed %}
+    """
+    def __init__(self, free):
+        self.free = free
+
+    def __call__(self, parser, token):
+        tokens = token.contents.split()
+        # Now tokens is a list like this:
+        # ['get_comment_list', 'for', 'lcom.eventtimes', 'event.id', 'as', 'comment_list']
+        if not len(tokens) in (6, 7):
+            raise template.TemplateSyntaxError, "%r tag requires 5 or 6 arguments" % tokens[0]
+        if tokens[1] != 'for':
+            raise template.TemplateSyntaxError, "Second argument in %r tag must be 'for'" % tokens[0]
+        try:
+            package, module = tokens[2].split('.')
+        except ValueError: # unpack list of wrong size
+            raise template.TemplateSyntaxError, "Third argument in %r tag must be in the format 'package.module'" % tokens[0]
+        try:
+            content_type = ContentType.objects.get(app_label__exact=package,model__exact=module)
+        except ContentType.DoesNotExist:
+            raise template.TemplateSyntaxError, "%r tag has invalid content-type '%s.%s'" % (tokens[0], package, module)
+        var_name, obj_id = None, None
+        if tokens[3].isdigit():
+            obj_id = tokens[3]
+            try: # ensure the object ID is valid
+                content_type.get_object_for_this_type(pk=obj_id)
+            except ObjectDoesNotExist:
+                raise template.TemplateSyntaxError, "%r tag refers to %s object with ID %s, which doesn't exist" % (tokens[0], content_type.name, obj_id)
+        else:
+            var_name = tokens[3]
+        if tokens[4] != 'as':
+            raise template.TemplateSyntaxError, "Fourth argument in %r must be 'as'" % tokens[0]
+        if len(tokens) == 7:
+            if tokens[6] != 'reversed':
+                raise template.TemplateSyntaxError, "Final argument in %r must be 'reversed' if given" % tokens[0]
+            ordering = "-"
+        else:
+            ordering = ""
+        return CommentListNode(package, module, var_name, obj_id, tokens[5], self.free, ordering)
+
+# registration comments
+register.tag('get_comment_list', DoGetCommentList(False))
+register.tag('comment_form', DoCommentForm(False))
+register.tag('get_comment_count', DoCommentCount(False))
+# free comments
+register.tag('get_free_comment_list', DoGetCommentList(True))
+register.tag('free_comment_form', DoCommentForm(True))
+register.tag('get_free_comment_count', DoCommentCount(True))

Added: vendor/django/current/django/contrib/comments/urls/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/comments/urls/comments.py
===================================================================
--- vendor/django/current/django/contrib/comments/urls/comments.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/urls/comments.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,12 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('django.contrib.comments.views',
+    (r'^post/$', 'comments.post_comment'),
+    (r'^postfree/$', 'comments.post_free_comment'),
+    (r'^posted/$', 'comments.comment_was_posted'),
+    (r'^karma/vote/(?P<comment_id>\d+)/(?P<vote>up|down)/$', 'karma.vote'),
+    (r'^flag/(?P<comment_id>\d+)/$', 'userflags.flag'),
+    (r'^flag/(?P<comment_id>\d+)/done/$', 'userflags.flag_done'),
+    (r'^delete/(?P<comment_id>\d+)/$', 'userflags.delete'),
+    (r'^delete/(?P<comment_id>\d+)/done/$', 'userflags.delete_done'),
+)

Added: vendor/django/current/django/contrib/comments/views/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/comments/views/comments.py
===================================================================
--- vendor/django/current/django/contrib/comments/views/comments.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/views/comments.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,340 @@
+from django.core import validators
+from django import forms
+from django.core.mail import mail_admins, mail_managers
+from django.http import Http404
+from django.core.exceptions import ObjectDoesNotExist
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.contrib.comments.models import Comment, FreeComment, RATINGS_REQUIRED, RATINGS_OPTIONAL, IS_PUBLIC
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.auth.forms import AuthenticationForm
+from django.http import HttpResponseRedirect
+from django.utils.text import normalize_newlines
+from django.conf import settings
+from django.utils.translation import ngettext
+import base64, datetime
+
+COMMENTS_PER_PAGE = 20
+
+class PublicCommentManipulator(AuthenticationForm):
+    "Manipulator that handles public registered comments"
+    def __init__(self, user, ratings_required, ratings_range, num_rating_choices):
+        AuthenticationForm.__init__(self)
+        self.ratings_range, self.num_rating_choices = ratings_range, num_rating_choices
+        choices = [(c, c) for c in ratings_range]
+        def get_validator_list(rating_num):
+            if rating_num <= num_rating_choices:
+                return [validators.RequiredIfOtherFieldsGiven(['rating%d' % i for i in range(1, 9) if i != rating_num], _("This rating is required because you've entered at least one other rating."))]
+            else:
+                return []
+        self.fields.extend([
+            forms.LargeTextField(field_name="comment", maxlength=3000, is_required=True,
+                validator_list=[self.hasNoProfanities]),
+            forms.RadioSelectField(field_name="rating1", choices=choices,
+                is_required=ratings_required and num_rating_choices > 0,
+                validator_list=get_validator_list(1),
+            ),
+            forms.RadioSelectField(field_name="rating2", choices=choices,
+                is_required=ratings_required and num_rating_choices > 1,
+                validator_list=get_validator_list(2),
+            ),
+            forms.RadioSelectField(field_name="rating3", choices=choices,
+                is_required=ratings_required and num_rating_choices > 2,
+                validator_list=get_validator_list(3),
+            ),
+            forms.RadioSelectField(field_name="rating4", choices=choices,
+                is_required=ratings_required and num_rating_choices > 3,
+                validator_list=get_validator_list(4),
+            ),
+            forms.RadioSelectField(field_name="rating5", choices=choices,
+                is_required=ratings_required and num_rating_choices > 4,
+                validator_list=get_validator_list(5),
+            ),
+            forms.RadioSelectField(field_name="rating6", choices=choices,
+                is_required=ratings_required and num_rating_choices > 5,
+                validator_list=get_validator_list(6),
+            ),
+            forms.RadioSelectField(field_name="rating7", choices=choices,
+                is_required=ratings_required and num_rating_choices > 6,
+                validator_list=get_validator_list(7),
+            ),
+            forms.RadioSelectField(field_name="rating8", choices=choices,
+                is_required=ratings_required and num_rating_choices > 7,
+                validator_list=get_validator_list(8),
+            ),
+        ])
+        if user.is_authenticated():
+            self["username"].is_required = False
+            self["username"].validator_list = []
+            self["password"].is_required = False
+            self["password"].validator_list = []
+            self.user_cache = user
+
+    def hasNoProfanities(self, field_data, all_data):
+        if settings.COMMENTS_ALLOW_PROFANITIES:
+            return
+        return validators.hasNoProfanities(field_data, all_data)
+
+    def get_comment(self, new_data):
+        "Helper function"
+        return Comment(None, self.get_user_id(), new_data["content_type_id"],
+            new_data["object_id"], new_data.get("headline", "").strip(),
+            new_data["comment"].strip(), new_data.get("rating1", None),
+            new_data.get("rating2", None), new_data.get("rating3", None),
+            new_data.get("rating4", None), new_data.get("rating5", None),
+            new_data.get("rating6", None), new_data.get("rating7", None),
+            new_data.get("rating8", None), new_data.get("rating1", None) is not None,
+            datetime.datetime.now(), new_data["is_public"], new_data["ip_address"], False, settings.SITE_ID)
+
+    def save(self, new_data):
+        today = datetime.date.today()
+        c = self.get_comment(new_data)
+        for old in Comment.objects.filter(content_type__id__exact=new_data["content_type_id"],
+            object_id__exact=new_data["object_id"], user__id__exact=self.get_user_id()):
+            # Check that this comment isn't duplicate. (Sometimes people post
+            # comments twice by mistake.) If it is, fail silently by pretending
+            # the comment was posted successfully.
+            if old.submit_date.date() == today and old.comment == c.comment \
+                and old.rating1 == c.rating1 and old.rating2 == c.rating2 \
+                and old.rating3 == c.rating3 and old.rating4 == c.rating4 \
+                and old.rating5 == c.rating5 and old.rating6 == c.rating6 \
+                and old.rating7 == c.rating7 and old.rating8 == c.rating8:
+                return old
+            # If the user is leaving a rating, invalidate all old ratings.
+            if c.rating1 is not None:
+                old.valid_rating = False
+                old.save()
+        c.save()
+        # If the commentor has posted fewer than COMMENTS_FIRST_FEW comments,
+        # send the comment to the managers.
+        if self.user_cache.comment_set.count() <= settings.COMMENTS_FIRST_FEW:
+            message = ngettext('This comment was posted by a user who has posted fewer than %(count)s comment:\n\n%(text)s',
+                'This comment was posted by a user who has posted fewer than %(count)s comments:\n\n%(text)s') % \
+                {'count': settings.COMMENTS_FIRST_FEW, 'text': c.get_as_text()}
+            mail_managers("Comment posted by rookie user", message)
+        if settings.COMMENTS_SKETCHY_USERS_GROUP and settings.COMMENTS_SKETCHY_USERS_GROUP in [g.id for g in self.user_cache.get_group_list()]:
+            message = _('This comment was posted by a sketchy user:\n\n%(text)s') % {'text': c.get_as_text()}
+            mail_managers("Comment posted by sketchy user (%s)" % self.user_cache.username, c.get_as_text())
+        return c
+
+class PublicFreeCommentManipulator(forms.Manipulator):
+    "Manipulator that handles public free (unregistered) comments"
+    def __init__(self):
+        self.fields = (
+            forms.TextField(field_name="person_name", maxlength=50, is_required=True,
+                validator_list=[self.hasNoProfanities]),
+            forms.LargeTextField(field_name="comment", maxlength=3000, is_required=True,
+                validator_list=[self.hasNoProfanities]),
+        )
+
+    def hasNoProfanities(self, field_data, all_data):
+        if settings.COMMENTS_ALLOW_PROFANITIES:
+            return
+        return validators.hasNoProfanities(field_data, all_data)
+
+    def get_comment(self, new_data):
+        "Helper function"
+        return FreeComment(None, new_data["content_type_id"],
+            new_data["object_id"], new_data["comment"].strip(),
+            new_data["person_name"].strip(), datetime.datetime.now(), new_data["is_public"],
+            new_data["ip_address"], False, settings.SITE_ID)
+
+    def save(self, new_data):
+        today = datetime.date.today()
+        c = self.get_comment(new_data)
+        # Check that this comment isn't duplicate. (Sometimes people post
+        # comments twice by mistake.) If it is, fail silently by pretending
+        # the comment was posted successfully.
+        for old_comment in FreeComment.objects.filter(content_type__id__exact=new_data["content_type_id"],
+            object_id__exact=new_data["object_id"], person_name__exact=new_data["person_name"],
+            submit_date__year=today.year, submit_date__month=today.month,
+            submit_date__day=today.day):
+            if old_comment.comment == c.comment:
+                return old_comment
+        c.save()
+        return c
+
+def post_comment(request):
+    """
+    Post a comment
+
+    Redirects to the `comments.comments.comment_was_posted` view upon success.
+
+    Templates: `comment_preview`
+    Context:
+        comment
+            the comment being posted
+        comment_form
+            the comment form
+        options
+            comment options
+        target
+            comment target
+        hash
+            security hash (must be included in a posted form to succesfully
+            post a comment).
+        rating_options
+            comment ratings options
+        ratings_optional
+            are ratings optional?
+        ratings_required
+            are ratings required?
+        rating_range
+            range of ratings
+        rating_choices
+            choice of ratings
+    """
+    if not request.POST:
+        raise Http404, _("Only POSTs are allowed")
+    try:
+        options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
+    except KeyError:
+        raise Http404, _("One or more of the required fields wasn't submitted")
+    photo_options = request.POST.get('photo_options', '')
+    rating_options = normalize_newlines(request.POST.get('rating_options', ''))
+    if Comment.objects.get_security_hash(options, photo_options, rating_options, target) != security_hash:
+        raise Http404, _("Somebody tampered with the comment form (security violation)")
+    # Now we can be assured the data is valid.
+    if rating_options:
+        rating_range, rating_choices = Comment.objects.get_rating_options(base64.decodestring(rating_options))
+    else:
+        rating_range, rating_choices = [], []
+    content_type_id, object_id = target.split(':') # target is something like '52:5157'
+    try:
+        obj = ContentType.objects.get(pk=content_type_id).get_object_for_this_type(pk=object_id)
+    except ObjectDoesNotExist:
+        raise Http404, _("The comment form had an invalid 'target' parameter -- the object ID was invalid")
+    option_list = options.split(',') # options is something like 'pa,ra'
+    new_data = request.POST.copy()
+    new_data['content_type_id'] = content_type_id
+    new_data['object_id'] = object_id
+    new_data['ip_address'] = request.META.get('REMOTE_ADDR')
+    new_data['is_public'] = IS_PUBLIC in option_list
+    manipulator = PublicCommentManipulator(request.user,
+        ratings_required=RATINGS_REQUIRED in option_list,
+        ratings_range=rating_range,
+        num_rating_choices=len(rating_choices))
+    errors = manipulator.get_validation_errors(new_data)
+    # If user gave correct username/password and wasn't already logged in, log them in
+    # so they don't have to enter a username/password again.
+    if manipulator.get_user() and new_data.has_key('password') and manipulator.get_user().check_password(new_data['password']):
+        from django.contrib.auth import login
+        login(request, manipulator.get_user())
+    if errors or request.POST.has_key('preview'):
+        class CommentFormWrapper(forms.FormWrapper):
+            def __init__(self, manipulator, new_data, errors, rating_choices):
+                forms.FormWrapper.__init__(self, manipulator, new_data, errors)
+                self.rating_choices = rating_choices
+            def ratings(self):
+                field_list = [self['rating%d' % (i+1)] for i in range(len(rating_choices))]
+                for i, f in enumerate(field_list):
+                    f.choice = rating_choices[i]
+                return field_list
+        comment = errors and '' or manipulator.get_comment(new_data)
+        comment_form = CommentFormWrapper(manipulator, new_data, errors, rating_choices)
+        return render_to_response('comments/preview.html', {
+            'comment': comment,
+            'comment_form': comment_form,
+            'options': options,
+            'target': target,
+            'hash': security_hash,
+            'rating_options': rating_options,
+            'ratings_optional': RATINGS_OPTIONAL in option_list,
+            'ratings_required': RATINGS_REQUIRED in option_list,
+            'rating_range': rating_range,
+            'rating_choices': rating_choices,
+        }, context_instance=RequestContext(request))
+    elif request.POST.has_key('post'):
+        # If the IP is banned, mail the admins, do NOT save the comment, and
+        # serve up the "Thanks for posting" page as if the comment WAS posted.
+        if request.META['REMOTE_ADDR'] in settings.BANNED_IPS:
+            mail_admins("Banned IP attempted to post comment", str(request.POST) + "\n\n" + str(request.META))
+        else:
+            manipulator.do_html2python(new_data)
+            comment = manipulator.save(new_data)
+        return HttpResponseRedirect("../posted/?c=%s:%s" % (content_type_id, object_id))
+    else:
+        raise Http404, _("The comment form didn't provide either 'preview' or 'post'")
+
+def post_free_comment(request):
+    """
+    Post a free comment (not requiring a log in)
+
+    Redirects to `comments.comments.comment_was_posted` view on success.
+
+    Templates: `comment_free_preview`
+    Context:
+        comment
+            comment being posted
+        comment_form
+            comment form object
+        options
+            comment options
+        target
+            comment target
+        hash
+            security hash (must be included in a posted form to succesfully
+            post a comment).
+    """
+    if not request.POST:
+        raise Http404, _("Only POSTs are allowed")
+    try:
+        options, target, security_hash = request.POST['options'], request.POST['target'], request.POST['gonzo']
+    except KeyError:
+        raise Http404, _("One or more of the required fields wasn't submitted")
+    if Comment.objects.get_security_hash(options, '', '', target) != security_hash:
+        raise Http404, _("Somebody tampered with the comment form (security violation)")
+    content_type_id, object_id = target.split(':') # target is something like '52:5157'
+    content_type = ContentType.objects.get(pk=content_type_id)
+    try:
+        obj = content_type.get_object_for_this_type(pk=object_id)
+    except ObjectDoesNotExist:
+        raise Http404, _("The comment form had an invalid 'target' parameter -- the object ID was invalid")
+    option_list = options.split(',')
+    new_data = request.POST.copy()
+    new_data['content_type_id'] = content_type_id
+    new_data['object_id'] = object_id
+    new_data['ip_address'] = request.META['REMOTE_ADDR']
+    new_data['is_public'] = IS_PUBLIC in option_list
+    manipulator = PublicFreeCommentManipulator()
+    errors = manipulator.get_validation_errors(new_data)
+    if errors or request.POST.has_key('preview'):
+        comment = errors and '' or manipulator.get_comment(new_data)
+        return render_to_response('comments/free_preview.html', {
+            'comment': comment,
+            'comment_form': forms.FormWrapper(manipulator, new_data, errors),
+            'options': options,
+            'target': target,
+            'hash': security_hash,
+        }, context_instance=RequestContext(request))
+    elif request.POST.has_key('post'):
+        # If the IP is banned, mail the admins, do NOT save the comment, and
+        # serve up the "Thanks for posting" page as if the comment WAS posted.
+        if request.META['REMOTE_ADDR'] in settings.BANNED_IPS:
+            from django.core.mail import mail_admins
+            mail_admins("Practical joker", str(request.POST) + "\n\n" + str(request.META))
+        else:
+            manipulator.do_html2python(new_data)
+            comment = manipulator.save(new_data)
+        return HttpResponseRedirect("../posted/?c=%s:%s" % (content_type_id, object_id))
+    else:
+        raise Http404, _("The comment form didn't provide either 'preview' or 'post'")
+
+def comment_was_posted(request):
+    """
+    Display "comment was posted" success page
+
+    Templates: `comment_posted`
+    Context:
+        object
+            The object the comment was posted on
+    """
+    obj = None
+    if request.GET.has_key('c'):
+        content_type_id, object_id = request.GET['c'].split(':')
+        try:
+            content_type = ContentType.objects.get(pk=content_type_id)
+            obj = content_type.get_object_for_this_type(pk=object_id)
+        except ObjectDoesNotExist:
+            pass
+    return render_to_response('comments/posted.html', {'object': obj}, context_instance=RequestContext(request))

Added: vendor/django/current/django/contrib/comments/views/karma.py
===================================================================
--- vendor/django/current/django/contrib/comments/views/karma.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/views/karma.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,29 @@
+from django.http import Http404
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.contrib.comments.models import Comment, KarmaScore
+
+def vote(request, comment_id, vote):
+    """
+    Rate a comment (+1 or -1)
+
+    Templates: `karma_vote_accepted`
+    Context:
+        comment
+            `comments.comments` object being rated
+    """
+    rating = {'up': 1, 'down': -1}.get(vote, False)
+    if not rating:
+        raise Http404, "Invalid vote"
+    if not request.user.is_authenticated():
+        raise Http404, _("Anonymous users cannot vote")
+    try:
+        comment = Comment.objects.get(pk=comment_id)
+    except Comment.DoesNotExist:
+        raise Http404, _("Invalid comment ID")
+    if comment.user.id == request.user.id:
+        raise Http404, _("No voting for yourself")
+    KarmaScore.objects.vote(request.user.id, comment_id, rating)
+    # Reload comment to ensure we have up to date karma count
+    comment = Comment.objects.get(pk=comment_id)
+    return render_to_response('comments/karma_vote_accepted.html', {'comment': comment}, context_instance=RequestContext(request))

Added: vendor/django/current/django/contrib/comments/views/userflags.py
===================================================================
--- vendor/django/current/django/contrib/comments/views/userflags.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/comments/views/userflags.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,54 @@
+from django.shortcuts import render_to_response, get_object_or_404
+from django.template import RequestContext
+from django.http import Http404
+from django.contrib.comments.models import Comment, ModeratorDeletion, UserFlag
+from django.contrib.auth.decorators import login_required
+from django.http import HttpResponseRedirect
+from django.conf import settings
+
+def flag(request, comment_id):
+    """
+    Flags a comment. Confirmation on GET, action on POST.
+
+    Templates: `comments/flag_verify`, `comments/flag_done`
+    Context:
+        comment
+            the flagged `comments.comments` object
+    """
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    if request.POST:
+        UserFlag.objects.flag(comment, request.user)
+        return HttpResponseRedirect('%sdone/' % request.path)
+    return render_to_response('comments/flag_verify.html', {'comment': comment}, context_instance=RequestContext(request))
+flag = login_required(flag)
+
+def flag_done(request, comment_id):
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    return render_to_response('comments/flag_done.html', {'comment': comment}, context_instance=RequestContext(request))
+
+def delete(request, comment_id):
+    """
+    Deletes a comment. Confirmation on GET, action on POST.
+
+    Templates: `comments/delete_verify`, `comments/delete_done`
+    Context:
+        comment
+            the flagged `comments.comments` object
+    """
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    if not Comment.objects.user_is_moderator(request.user):
+        raise Http404
+    if request.POST:
+        # If the comment has already been removed, silently fail.
+        if not comment.is_removed:
+            comment.is_removed = True
+            comment.save()
+            m = ModeratorDeletion(None, request.user.id, comment.id, None)
+            m.save()
+        return HttpResponseRedirect('%sdone/' % request.path)
+    return render_to_response('comments/delete_verify.html', {'comment': comment}, context_instance=RequestContext(request))
+delete = login_required(delete)
+
+def delete_done(request, comment_id):
+    comment = get_object_or_404(Comment,pk=comment_id, site__id__exact=settings.SITE_ID)
+    return render_to_response('comments/delete_done.html', {'comment': comment}, context_instance=RequestContext(request))

Added: vendor/django/current/django/contrib/contenttypes/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/contenttypes/management.py
===================================================================
--- vendor/django/current/django/contrib/contenttypes/management.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/contenttypes/management.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,24 @@
+"""
+Creates content types for all installed models.
+"""
+
+from django.dispatch import dispatcher
+from django.db.models import get_models, signals
+
+def create_contenttypes(app, created_models):
+    from django.contrib.contenttypes.models import ContentType
+    app_models = get_models(app)
+    if not app_models:
+        return
+    for klass in app_models:
+        opts = klass._meta
+        try:
+            ContentType.objects.get(app_label=opts.app_label,
+                model=opts.object_name.lower())
+        except ContentType.DoesNotExist:
+            ct = ContentType(name=str(opts.verbose_name),
+                app_label=opts.app_label, model=opts.object_name.lower())
+            ct.save()
+            print "Adding content type '%s | %s'" % (ct.app_label, ct.model)
+
+dispatcher.connect(create_contenttypes, signal=signals.post_syncdb)

Added: vendor/django/current/django/contrib/contenttypes/models.py
===================================================================
--- vendor/django/current/django/contrib/contenttypes/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/contenttypes/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,44 @@
+from django.db import models
+from django.utils.translation import gettext_lazy as _
+
+class ContentTypeManager(models.Manager):
+    def get_for_model(self, model):
+        """
+        Returns the ContentType object for the given model, creating the
+        ContentType if necessary.
+        """
+        opts = model._meta
+        # The str() is needed around opts.verbose_name because it's a
+        # django.utils.functional.__proxy__ object.
+        ct, created = self.model._default_manager.get_or_create(app_label=opts.app_label,
+            model=opts.object_name.lower(), defaults={'name': str(opts.verbose_name)})
+        return ct
+
+class ContentType(models.Model):
+    name = models.CharField(maxlength=100)
+    app_label = models.CharField(maxlength=100)
+    model = models.CharField(_('python model class name'), maxlength=100)
+    objects = ContentTypeManager()
+    class Meta:
+        verbose_name = _('content type')
+        verbose_name_plural = _('content types')
+        db_table = 'django_content_type'
+        ordering = ('name',)
+        unique_together = (('app_label', 'model'),)
+
+    def __str__(self):
+        return self.name
+
+    def model_class(self):
+        "Returns the Python model class for this type of content."
+        from django.db import models
+        return models.get_model(self.app_label, self.model)
+
+    def get_object_for_this_type(self, **kwargs):
+        """
+        Returns an object of this type for the keyword arguments given.
+        Basically, this is a proxy around this object_type's get_object() model
+        method. The ObjectNotExist exception, if thrown, will not be caught,
+        so code that calls this method should catch it.
+        """
+        return self.model_class()._default_manager.get(**kwargs)

Added: vendor/django/current/django/contrib/csrf/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/csrf/middleware.py
===================================================================
--- vendor/django/current/django/contrib/csrf/middleware.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/csrf/middleware.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,92 @@
+"""
+Cross Site Request Forgery Middleware.
+
+This module provides a middleware that implements protection
+against request forgeries from other sites. 
+
+"""
+from django.conf import settings
+from django.http import HttpResponseForbidden
+import md5
+import re
+import itertools
+
+_ERROR_MSG = "<h1>403 Forbidden</h1><p>Cross Site Request Forgery detected.  Request aborted.</p>"
+
+_POST_FORM_RE = \
+    re.compile(r'(<form\W[^>]*\bmethod=(\'|"|)POST(\'|"|)\b[^>]*>)', re.IGNORECASE)
+    
+_HTML_TYPES = ('text/html', 'application/xhtml+xml')    
+
+def _make_token(session_id):
+    return md5.new(settings.SECRET_KEY + session_id).hexdigest()
+
+class CsrfMiddleware(object):
+    """Django middleware that adds protection against Cross Site
+    Request Forgeries by adding hidden form fields to POST forms and 
+    checking requests for the correct value.  
+    
+    In the list of middlewares, SessionMiddleware is required, and must come 
+    after this middleware.  CsrfMiddleWare must come after compression 
+    middleware.
+   
+    If a session ID cookie is present, it is hashed with the SECRET_KEY 
+    setting to create an authentication token.  This token is added to all 
+    outgoing POST forms and is expected on all incoming POST requests that 
+    have a session ID cookie.
+    
+    If you are setting cookies directly, instead of using Django's session 
+    framework, this middleware will not work.
+    """
+    
+    def process_request(self, request):
+        if request.POST:
+            try:
+                session_id = request.COOKIES[settings.SESSION_COOKIE_NAME]
+            except KeyError:
+                # No session, no check required
+                return None
+
+            csrf_token = _make_token(session_id)
+            # check incoming token
+            try:
+                request_csrf_token = request.POST['csrfmiddlewaretoken']
+            except KeyError:
+                return HttpResponseForbidden(_ERROR_MSG)
+            
+            if request_csrf_token != csrf_token:
+                return HttpResponseForbidden(_ERROR_MSG)
+                
+        return None
+
+    def process_response(self, request, response):
+        csrf_token = None
+        try:
+            cookie = response.cookies[settings.SESSION_COOKIE_NAME]
+            csrf_token = _make_token(cookie.value)
+        except KeyError:
+            # No outgoing cookie to set session, but 
+            # a session might already exist.
+            try:
+                session_id = request.COOKIES[settings.SESSION_COOKIE_NAME]
+                csrf_token = _make_token(session_id)
+            except KeyError:
+                # no incoming or outgoing cookie
+                pass
+            
+        if csrf_token is not None and \
+                response['Content-Type'].split(';')[0] in _HTML_TYPES:
+            
+            # ensure we don't add the 'id' attribute twice (HTML validity)
+            idattributes = itertools.chain(("id='csrfmiddlewaretoken'",), 
+                                            itertools.repeat(''))
+            def add_csrf_field(match):
+                """Returns the matched <form> tag plus the added <input> element"""
+                return match.group() + "<div style='display:none;'>" + \
+                "<input type='hidden' " + idattributes.next() + \
+                " name='csrfmiddlewaretoken' value='" + csrf_token + \
+                "' /></div>"
+
+            # Modify any POST forms
+            response.content = _POST_FORM_RE.sub(add_csrf_field, response.content)
+        return response

Added: vendor/django/current/django/contrib/flatpages/README.TXT
===================================================================
--- vendor/django/current/django/contrib/flatpages/README.TXT	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/flatpages/README.TXT	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,8 @@
+This is an optional add-on app, flatpages.
+
+For full documentation, see either of these:
+
+    * The file django/docs/flatpages.txt in the Django distribution
+    * http://www.djangoproject.com/documentation/flatpages/ on the Web
+
+Both have identical content.
\ No newline at end of file

Added: vendor/django/current/django/contrib/flatpages/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/flatpages/middleware.py
===================================================================
--- vendor/django/current/django/contrib/flatpages/middleware.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/flatpages/middleware.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,18 @@
+from django.contrib.flatpages.views import flatpage
+from django.http import Http404
+from django.conf import settings
+
+class FlatpageFallbackMiddleware(object):
+    def process_response(self, request, response):
+        if response.status_code != 404:
+            return response # No need to check for a flatpage for non-404 responses.
+        try:
+            return flatpage(request, request.path)
+        # Return the original response if any errors happened. Because this
+        # is a middleware, we can't assume the errors will be caught elsewhere.
+        except Http404:
+            return response
+        except:
+            if settings.DEBUG:
+                raise
+            return response

Added: vendor/django/current/django/contrib/flatpages/models.py
===================================================================
--- vendor/django/current/django/contrib/flatpages/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/flatpages/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,33 @@
+from django.core import validators
+from django.db import models
+from django.contrib.sites.models import Site
+from django.utils.translation import gettext_lazy as _
+
+class FlatPage(models.Model):
+    url = models.CharField(_('URL'), maxlength=100, validator_list=[validators.isAlphaNumericURL],
+        help_text=_("Example: '/about/contact/'. Make sure to have leading and trailing slashes."))
+    title = models.CharField(_('title'), maxlength=200)
+    content = models.TextField(_('content'))
+    enable_comments = models.BooleanField(_('enable comments'))
+    template_name = models.CharField(_('template name'), maxlength=70, blank=True,
+        help_text=_("Example: 'flatpages/contact_page.html'. If this isn't provided, the system will use 'flatpages/default.html'."))
+    registration_required = models.BooleanField(_('registration required'), help_text=_("If this is checked, only logged-in users will be able to view the page."))
+    sites = models.ManyToManyField(Site)
+    class Meta:
+        db_table = 'django_flatpage'
+        verbose_name = _('flat page')
+        verbose_name_plural = _('flat pages')
+        ordering = ('url',)
+    class Admin:
+        fields = (
+            (None, {'fields': ('url', 'title', 'content', 'sites')}),
+            ('Advanced options', {'classes': 'collapse', 'fields': ('enable_comments', 'registration_required', 'template_name')}),
+        )
+        list_filter = ('sites',)
+        search_fields = ('url', 'title')
+
+    def __str__(self):
+        return "%s -- %s" % (self.url, self.title)
+
+    def get_absolute_url(self):
+        return self.url

Added: vendor/django/current/django/contrib/flatpages/urls.py
===================================================================
--- vendor/django/current/django/contrib/flatpages/urls.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/flatpages/urls.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,5 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('django.contrib.flatpages.views',
+    (r'^(?P<url>.*)$', 'flatpage'),
+)

Added: vendor/django/current/django/contrib/flatpages/views.py
===================================================================
--- vendor/django/current/django/contrib/flatpages/views.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/flatpages/views.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,35 @@
+from django.contrib.flatpages.models import FlatPage
+from django.template import loader, RequestContext
+from django.shortcuts import get_object_or_404
+from django.http import HttpResponse
+from django.conf import settings
+
+DEFAULT_TEMPLATE = 'flatpages/default.html'
+
+def flatpage(request, url):
+    """
+    Flat page view.
+
+    Models: `flatpages.flatpages`
+    Templates: Uses the template defined by the ``template_name`` field,
+        or `flatpages/default.html` if template_name is not defined.
+    Context:
+        flatpage
+            `flatpages.flatpages` object
+    """
+    if not url.startswith('/'):
+        url = "/" + url
+    f = get_object_or_404(FlatPage, url__exact=url, sites__id__exact=settings.SITE_ID)
+    # 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():
+        from django.contrib.auth.views import redirect_to_login
+        return redirect_to_login(request.path)
+    if f.template_name:
+        t = loader.select_template((f.template_name, DEFAULT_TEMPLATE))
+    else:
+        t = loader.get_template(DEFAULT_TEMPLATE)
+    c = RequestContext(request, {
+        'flatpage': f,
+    })
+    return HttpResponse(t.render(c))

Added: vendor/django/current/django/contrib/humanize/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/humanize/templatetags/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/humanize/templatetags/humanize.py
===================================================================
--- vendor/django/current/django/contrib/humanize/templatetags/humanize.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/humanize/templatetags/humanize.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,64 @@
+from django import template
+import re
+
+register = template.Library()
+
+def ordinal(value):
+    """
+    Converts an integer to its ordinal as a string. 1 is '1st', 2 is '2nd',
+    3 is '3rd', etc. Works for any integer.
+    """
+    try:
+        value = int(value)
+    except ValueError:
+        return value
+    t = ('th', 'st', 'nd', 'rd', 'th', 'th', 'th', 'th', 'th', 'th')
+    if value % 100 in (11, 12, 13): # special case
+        return '%dth' % value
+    return '%d%s' % (value, t[value % 10])
+register.filter(ordinal)
+
+def intcomma(value):
+    """
+    Converts an integer to a string containing commas every three digits.
+    For example, 3000 becomes '3,000' and 45000 becomes '45,000'.
+    """
+    orig = str(value)
+    new = re.sub("^(-?\d+)(\d{3})", '\g<1>,\g<2>', str(value))
+    if orig == new:
+        return new
+    else:
+        return intcomma(new)
+register.filter(intcomma)
+
+def intword(value):
+    """
+    Converts a large integer to a friendly text representation. Works best for
+    numbers over 1 million. For example, 1000000 becomes '1.0 million', 1200000
+    becomes '1.2 million' and '1200000000' becomes '1.2 billion'.
+    """
+    value = int(value)
+    if value < 1000000:
+        return value
+    if value < 1000000000:
+        return '%.1f million' % (value / 1000000.0)
+    if value < 1000000000000:
+        return '%.1f billion' % (value / 1000000000.0)
+    if value < 1000000000000000:
+        return '%.1f trillion' % (value / 1000000000000.0)
+    return value
+register.filter(intword)
+
+def apnumber(value):
+    """
+    For numbers 1-9, returns the number spelled out. Otherwise, returns the
+    number. This follows Associated Press style.
+    """
+    try:
+        value = int(value)
+    except ValueError:
+        return value
+    if not 0 < value < 10:
+        return value
+    return ('one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine')[value-1]
+register.filter(apnumber)

Added: vendor/django/current/django/contrib/markup/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/markup/templatetags/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/markup/templatetags/markup.py
===================================================================
--- vendor/django/current/django/contrib/markup/templatetags/markup.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/markup/templatetags/markup.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,56 @@
+"""
+Set of "markup" template filters for Django.  These filters transform plain text
+markup syntaxes to HTML; currently there is support for:
+
+    * Textile, which requires the PyTextile library available at
+      http://dealmeida.net/projects/textile/
+
+    * Markdown, which requires the Python-markdown library from
+      http://www.freewisdom.org/projects/python-markdown
+
+    * ReStructuredText, which requires docutils from http://docutils.sf.net/
+
+In each case, if the required library is not installed, the filter will
+silently fail and return the un-marked-up text.
+"""
+
+from django import template
+from django.conf import settings
+
+register = template.Library()
+
+def textile(value):
+    try:
+        import textile
+    except ImportError:
+        if settings.DEBUG:
+            raise template.TemplateSyntaxError, "Error in {% textile %} filter: The Python textile library isn't installed."
+        return value
+    else:
+        return textile.textile(value, encoding=settings.DEFAULT_CHARSET, output=settings.DEFAULT_CHARSET)
+
+def markdown(value):
+    try:
+        import markdown
+    except ImportError:
+        if settings.DEBUG:
+            raise template.TemplateSyntaxError, "Error in {% markdown %} filter: The Python markdown library isn't installed."
+        return value
+    else:
+        return markdown.markdown(value)
+
+def restructuredtext(value):
+    try:
+        from docutils.core import publish_parts
+    except ImportError:
+        if settings.DEBUG:
+            raise template.TemplateSyntaxError, "Error in {% restructuredtext %} filter: The Python docutils library isn't installed."
+        return value
+    else:
+        docutils_settings = getattr(settings, "RESTRUCTUREDTEXT_FILTER_SETTINGS", {})
+        parts = publish_parts(source=value, writer_name="html4css1", settings_overrides=docutils_settings)
+        return parts["fragment"]
+
+register.filter(textile)
+register.filter(markdown)
+register.filter(restructuredtext)

Added: vendor/django/current/django/contrib/redirects/README.TXT
===================================================================
--- vendor/django/current/django/contrib/redirects/README.TXT	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/redirects/README.TXT	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,8 @@
+This is an optional add-on app, redirects.
+
+For full documentation, see either of these:
+
+    * The file django/docs/redirects.txt in the Django distribution
+    * http://www.djangoproject.com/documentation/redirects/ on the Web
+
+Both have identical content.
\ No newline at end of file

Added: vendor/django/current/django/contrib/redirects/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/redirects/middleware.py
===================================================================
--- vendor/django/current/django/contrib/redirects/middleware.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/redirects/middleware.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,27 @@
+from django.contrib.redirects.models import Redirect
+from django import http
+from django.conf import settings
+
+class RedirectFallbackMiddleware(object):
+    def process_response(self, request, response):
+        if response.status_code != 404:
+            return response # No need to check for a redirect for non-404 responses.
+        path = request.get_full_path()
+        try:
+            r = Redirect.objects.get(site__id__exact=settings.SITE_ID, old_path=path)
+        except Redirect.DoesNotExist:
+            r = None
+        if r is None and settings.APPEND_SLASH:
+            # Try removing the trailing slash.
+            try:
+                r = Redirect.objects.get(site__id__exact=settings.SITE_ID,
+                    old_path=path[:path.rfind('/')]+path[path.rfind('/')+1:])
+            except Redirect.DoesNotExist:
+                pass
+        if r is not None:
+            if r == '':
+                return http.HttpResponseGone()
+            return http.HttpResponsePermanentRedirect(r.new_path)
+
+        # No redirect was found. Return the response.
+        return response

Added: vendor/django/current/django/contrib/redirects/models.py
===================================================================
--- vendor/django/current/django/contrib/redirects/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/redirects/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,24 @@
+from django.db import models
+from django.contrib.sites.models import Site
+from django.utils.translation import gettext_lazy as _
+
+class Redirect(models.Model):
+    site = models.ForeignKey(Site, radio_admin=models.VERTICAL)
+    old_path = models.CharField(_('redirect from'), maxlength=200, db_index=True,
+        help_text=_("This should be an absolute path, excluding the domain name. Example: '/events/search/'."))
+    new_path = models.CharField(_('redirect to'), maxlength=200, blank=True,
+        help_text=_("This can be either an absolute path (as above) or a full URL starting with 'http://'."))
+
+    class Meta:
+        verbose_name = _('redirect')
+        verbose_name_plural = _('redirects')
+        db_table = 'django_redirect'
+        unique_together=(('site', 'old_path'),)
+        ordering = ('old_path',)
+
+    class Admin:
+        list_filter = ('site',)
+        search_fields = ('old_path', 'new_path')
+
+    def __str__(self):
+        return "%s ---> %s" % (self.old_path, self.new_path)

Added: vendor/django/current/django/contrib/sessions/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/sessions/middleware.py
===================================================================
--- vendor/django/current/django/contrib/sessions/middleware.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/sessions/middleware.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,92 @@
+from django.conf import settings
+from django.contrib.sessions.models import Session
+from django.utils.cache import patch_vary_headers
+import datetime
+
+TEST_COOKIE_NAME = 'testcookie'
+TEST_COOKIE_VALUE = 'worked'
+
+class SessionWrapper(object):
+    def __init__(self, session_key):
+        self.session_key = session_key
+        self.modified = False
+
+    def __contains__(self, key):
+        return key in self._session
+
+    def __getitem__(self, key):
+        return self._session[key]
+
+    def __setitem__(self, key, value):
+        self._session[key] = value
+        self.modified = True
+
+    def __delitem__(self, key):
+        del self._session[key]
+        self.modified = True
+
+    def keys(self):
+        return self._session.keys()
+
+    def items(self):
+        return self._session.items()
+
+    def get(self, key, default=None):
+        return self._session.get(key, default)
+
+    def set_test_cookie(self):
+        self[TEST_COOKIE_NAME] = TEST_COOKIE_VALUE
+
+    def test_cookie_worked(self):
+        return self.get(TEST_COOKIE_NAME) == TEST_COOKIE_VALUE
+
+    def delete_test_cookie(self):
+        del self[TEST_COOKIE_NAME]
+
+    def _get_session(self):
+        # Lazily loads session from storage.
+        try:
+            return self._session_cache
+        except AttributeError:
+            if self.session_key is None:
+                self._session_cache = {}
+            else:
+                try:
+                    s = Session.objects.get(session_key=self.session_key,
+                        expire_date__gt=datetime.datetime.now())
+                    self._session_cache = s.get_decoded()
+                except Session.DoesNotExist:
+                    self._session_cache = {}
+                    # Set the session_key to None to force creation of a new
+                    # key, for extra security.
+                    self.session_key = None
+            return self._session_cache
+
+    _session = property(_get_session)
+
+class SessionMiddleware(object):
+    def process_request(self, request):
+        request.session = SessionWrapper(request.COOKIES.get(settings.SESSION_COOKIE_NAME, None))
+
+    def process_response(self, request, response):
+        # If request.session was modified, or if response.session was set, save
+        # those changes and set a session cookie.
+        patch_vary_headers(response, ('Cookie',))
+        try:
+            modified = request.session.modified
+        except AttributeError:
+            pass
+        else:
+            if modified or settings.SESSION_SAVE_EVERY_REQUEST:
+                session_key = request.session.session_key or Session.objects.get_new_session_key()
+                if settings.SESSION_EXPIRE_AT_BROWSER_CLOSE:
+                    max_age = None
+                    expires = None
+                else:
+                    max_age = settings.SESSION_COOKIE_AGE
+                    expires = datetime.datetime.strftime(datetime.datetime.utcnow() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE), "%a, %d-%b-%Y %H:%M:%S GMT")
+                new_session = Session.objects.save(session_key, request.session._session,
+                    datetime.datetime.now() + datetime.timedelta(seconds=settings.SESSION_COOKIE_AGE))
+                response.set_cookie(settings.SESSION_COOKIE_NAME, session_key,
+                    max_age=max_age, expires=expires, domain=settings.SESSION_COOKIE_DOMAIN)
+        return response

Added: vendor/django/current/django/contrib/sessions/models.py
===================================================================
--- vendor/django/current/django/contrib/sessions/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/sessions/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,71 @@
+import base64, md5, random, sys
+import cPickle as pickle
+from django.db import models
+from django.utils.translation import gettext_lazy as _
+from django.conf import settings
+
+class SessionManager(models.Manager):
+    def encode(self, session_dict):
+        "Returns the given session dictionary pickled and encoded as a string."
+        pickled = pickle.dumps(session_dict)
+        pickled_md5 = md5.new(pickled + settings.SECRET_KEY).hexdigest()
+        return base64.encodestring(pickled + pickled_md5)
+
+    def get_new_session_key(self):
+        "Returns session key that isn't being used."
+        # The random module is seeded when this Apache child is created.
+        # Use person_id and SECRET_KEY as added salt.
+        while 1:
+            session_key = md5.new(str(random.randint(0, sys.maxint - 1)) + str(random.randint(0, sys.maxint - 1)) + settings.SECRET_KEY).hexdigest()
+            try:
+                self.get(session_key=session_key)
+            except self.model.DoesNotExist:
+                break
+        return session_key
+
+    def save(self, session_key, session_dict, expire_date):
+        s = self.model(session_key, self.encode(session_dict), expire_date)
+        if session_dict:
+            s.save()
+        else:
+            s.delete() # Clear sessions with no data.
+        return s
+
+class Session(models.Model):
+    """
+    Django provides full support for anonymous sessions. The session
+    framework lets you store and retrieve arbitrary data on a
+    per-site-visitor basis. It stores data on the server side and
+    abstracts the sending and receiving of cookies. Cookies contain a
+    session ID -- not the data itself.
+
+    The Django sessions framework is entirely cookie-based. It does
+    not fall back to putting session IDs in URLs. This is an intentional
+    design decision. Not only does that behavior make URLs ugly, it makes
+    your site vulnerable to session-ID theft via the "Referer" header.
+
+    For complete documentation on using Sessions in your code, consult
+    the sessions documentation that is shipped with Django (also available
+    on the Django website).
+    """
+    session_key = models.CharField(_('session key'), maxlength=40, primary_key=True)
+    session_data = models.TextField(_('session data'))
+    expire_date = models.DateTimeField(_('expire date'))
+    objects = SessionManager()
+    class Meta:
+        db_table = 'django_session'
+        verbose_name = _('session')
+        verbose_name_plural = _('sessions')
+
+    def get_decoded(self):
+        encoded_data = base64.decodestring(self.session_data)
+        pickled, tamper_check = encoded_data[:-32], encoded_data[-32:]
+        if md5.new(pickled + settings.SECRET_KEY).hexdigest() != tamper_check:
+            from django.core.exceptions import SuspiciousOperation
+            raise SuspiciousOperation, "User tampered with session cookie."
+        try:
+            return pickle.loads(pickled)
+        # Unpickling can cause a variety of exceptions. If something happens,
+        # just return an empty dictionary (an empty session).
+        except:
+            return {}

Added: vendor/django/current/django/contrib/sites/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/sites/management.py
===================================================================
--- vendor/django/current/django/contrib/sites/management.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/sites/management.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,16 @@
+"""
+Creates the default Site object.
+"""
+
+from django.dispatch import dispatcher
+from django.db.models import signals
+from django.contrib.sites.models import Site
+from django.contrib.sites import models as site_app
+
+def create_default_site(app, created_models):
+    if Site in created_models:
+        print "Creating example.com Site object"
+        s = Site(domain="example.com", name="example.com")
+        s.save()
+
+dispatcher.connect(create_default_site, sender=site_app, signal=signals.post_syncdb)

Added: vendor/django/current/django/contrib/sites/managers.py
===================================================================
--- vendor/django/current/django/contrib/sites/managers.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/sites/managers.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,20 @@
+from django.conf import settings
+from django.db import models
+from django.db.models.fields import FieldDoesNotExist
+
+class CurrentSiteManager(models.Manager):
+    "Use this to limit objects to those associated with the current site."
+    def __init__(self, field_name='site'):
+        super(CurrentSiteManager, self).__init__()
+        self.__field_name = field_name
+        self.__is_validated = False
+
+    def get_query_set(self):
+        if not self.__is_validated:
+            try:
+                self.model._meta.get_field(self.__field_name)
+            except FieldDoesNotExist:
+                raise ValueError, "%s couldn't find a field named %s in %s." % \
+                    (self.__class__.__name__, self.__field_name, self.model._meta.object_name)
+            self.__is_validated = True
+        return super(CurrentSiteManager, self).get_query_set().filter(**{self.__field_name + '__id__exact': settings.SITE_ID})

Added: vendor/django/current/django/contrib/sites/models.py
===================================================================
--- vendor/django/current/django/contrib/sites/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/sites/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,23 @@
+from django.db import models
+from django.utils.translation import gettext_lazy as _
+
+class SiteManager(models.Manager):
+    def get_current(self):
+        from django.conf import settings
+        return self.get(pk=settings.SITE_ID)
+
+class Site(models.Model):
+    domain = models.CharField(_('domain name'), maxlength=100)
+    name = models.CharField(_('display name'), maxlength=50)
+    objects = SiteManager()
+    class Meta:
+        db_table = 'django_site'
+        verbose_name = _('site')
+        verbose_name_plural = _('sites')
+        ordering = ('domain',)
+    class Admin:
+        list_display = ('domain', 'name')
+        search_fields = ('domain', 'name')
+
+    def __str__(self):
+        return self.domain

Added: vendor/django/current/django/contrib/syndication/__init__.py
===================================================================

Added: vendor/django/current/django/contrib/syndication/feeds.py
===================================================================
--- vendor/django/current/django/contrib/syndication/feeds.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/syndication/feeds.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,120 @@
+from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist
+from django.template import Context, loader, Template, TemplateDoesNotExist
+from django.contrib.sites.models import Site
+from django.utils import feedgenerator
+from django.conf import settings
+
+def add_domain(domain, url):
+    if not url.startswith('http://'):
+        url = u'http://%s%s' % (domain, url)
+    return url
+
+class FeedDoesNotExist(ObjectDoesNotExist):
+    pass
+
+class Feed(object):
+    item_pubdate = None
+    item_enclosure_url = None
+    feed_type = feedgenerator.DefaultFeed
+    title_template = None
+    description_template = None
+
+    def __init__(self, slug, feed_url):
+        self.slug = slug
+        self.feed_url = feed_url
+        self.title_template_name = self.title_template or ('feeds/%s_title.html' % slug)
+        self.description_template_name = self.description_template or ('feeds/%s_description.html' % slug)
+
+    def item_link(self, item):
+        try:
+            return item.get_absolute_url()
+        except AttributeError:
+            raise ImproperlyConfigured, "Give your %s class a get_absolute_url() method, or define an item_link() method in your Feed class." % item.__class__.__name__
+
+    def __get_dynamic_attr(self, attname, obj, default=None):
+        try:
+            attr = getattr(self, attname)
+        except AttributeError:
+            return default
+        if callable(attr):
+            # Check func_code.co_argcount rather than try/excepting the
+            # function and catching the TypeError, because something inside
+            # the function may raise the TypeError. This technique is more
+            # accurate.
+            if hasattr(attr, 'func_code'):
+                argcount = attr.func_code.co_argcount
+            else:
+                argcount = attr.__call__.func_code.co_argcount
+            if argcount == 2: # one argument is 'self'
+                return attr(obj)
+            else:
+                return attr()
+        return attr
+
+    def get_feed(self, url=None):
+        """
+        Returns a feedgenerator.DefaultFeed object, fully populated, for
+        this feed. Raises FeedDoesNotExist for invalid parameters.
+        """
+        if url:
+            try:
+                obj = self.get_object(url.split('/'))
+            except (AttributeError, ObjectDoesNotExist):
+                raise FeedDoesNotExist
+        else:
+            obj = None
+
+        current_site = Site.objects.get_current()
+        link = self.__get_dynamic_attr('link', obj)
+        link = add_domain(current_site.domain, link)
+
+        feed = self.feed_type(
+            title = self.__get_dynamic_attr('title', obj),
+            link = link,
+            description = self.__get_dynamic_attr('description', obj),
+            language = settings.LANGUAGE_CODE.decode(),
+            feed_url = add_domain(current_site, self.__get_dynamic_attr('feed_url', obj)),
+            author_name = self.__get_dynamic_attr('author_name', obj),
+            author_link = self.__get_dynamic_attr('author_link', obj),
+            author_email = self.__get_dynamic_attr('author_email', obj),
+            categories = self.__get_dynamic_attr('categories', obj),
+        )
+
+        try:
+            title_tmp = loader.get_template(self.title_template_name)
+        except TemplateDoesNotExist:
+            title_tmp = Template('{{ obj }}')
+        try:
+            description_tmp = loader.get_template(self.description_template_name)
+        except TemplateDoesNotExist:
+            description_tmp = Template('{{ obj }}')
+
+        for item in self.__get_dynamic_attr('items', obj):
+            link = add_domain(current_site.domain, self.__get_dynamic_attr('item_link', item))
+            enc = None
+            enc_url = self.__get_dynamic_attr('item_enclosure_url', item)
+            if enc_url:
+                enc = feedgenerator.Enclosure(
+                    url = enc_url.decode('utf-8'),
+                    length = str(self.__get_dynamic_attr('item_enclosure_length', item)).decode('utf-8'),
+                    mime_type = self.__get_dynamic_attr('item_enclosure_mime_type', item).decode('utf-8'),
+                )
+            author_name = self.__get_dynamic_attr('item_author_name', item)
+            if author_name is not None:
+                author_email = self.__get_dynamic_attr('item_author_email', item)
+                author_link = self.__get_dynamic_attr('item_author_link', item)
+            else:
+                author_email = author_link = None
+            feed.add_item(
+                title = title_tmp.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
+                link = link,
+                description = description_tmp.render(Context({'obj': item, 'site': current_site})).decode('utf-8'),
+                unique_id = link,
+                enclosure = enc,
+                pubdate = self.__get_dynamic_attr('item_pubdate', item),
+                author_name = author_name,
+                author_email = author_email,
+                author_link = author_link,
+                categories = self.__get_dynamic_attr('item_categories', item),
+            )
+        return feed

Added: vendor/django/current/django/contrib/syndication/views.py
===================================================================
--- vendor/django/current/django/contrib/syndication/views.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/contrib/syndication/views.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,25 @@
+from django.contrib.syndication import feeds
+from django.http import HttpResponse, Http404
+
+def feed(request, url, feed_dict=None):
+    if not feed_dict:
+        raise Http404, "No feeds are registered."
+
+    try:
+        slug, param = url.split('/', 1)
+    except ValueError:
+        slug, param = url, ''
+
+    try:
+        f = feed_dict[slug]
+    except KeyError:
+        raise Http404, "Slug %r isn't registered." % slug
+
+    try:
+        feedgen = f(slug, request.path).get_feed(param)
+    except feeds.FeedDoesNotExist:
+        raise Http404, "Invalid feed parameters. Slug %r is valid, but other parameters, or lack thereof, are not." % slug
+
+    response = HttpResponse(mimetype=feedgen.mime_type)
+    feedgen.write(response, 'utf-8')
+    return response

Added: vendor/django/current/django/core/__init__.py
===================================================================

Added: vendor/django/current/django/core/cache/__init__.py
===================================================================
--- vendor/django/current/django/core/cache/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,54 @@
+"""
+Caching framework.
+
+This package defines set of cache backends that all conform to a simple API.
+In a nutshell, a cache is a set of values -- which can be any object that
+may be pickled -- identified by string keys.  For the complete API, see
+the abstract BaseCache class in django.core.cache.backends.base.
+
+Client code should not access a cache backend directly; instead it should
+either use the "cache" variable made available here, or it should use the
+get_cache() function made available here. get_cache() takes a backend URI
+(e.g. "memcached://127.0.0.1:11211/") and returns an instance of a backend
+cache class.
+
+See docs/cache.txt for information on the public API.
+"""
+
+from cgi import parse_qsl
+from django.conf import settings
+from django.core.cache.backends.base import InvalidCacheBackendError
+
+BACKENDS = {
+    # name for use in settings file --> name of module in "backends" directory
+    'memcached': 'memcached',
+    'simple': 'simple',
+    'locmem': 'locmem',
+    'file': 'filebased',
+    'db': 'db',
+    'dummy': 'dummy',
+}
+
+def get_cache(backend_uri):
+    if backend_uri.find(':') == -1:
+        raise InvalidCacheBackendError, "Backend URI must start with scheme://"
+    scheme, rest = backend_uri.split(':', 1)
+    if not rest.startswith('//'):
+        raise InvalidCacheBackendError, "Backend URI must start with scheme://"
+    if scheme not in BACKENDS:
+        raise InvalidCacheBackendError, "%r is not a valid cache backend" % scheme
+
+    host = rest[2:]
+    qpos = rest.find('?')
+    if qpos != -1:
+        params = dict(parse_qsl(rest[qpos+1:]))
+        host = rest[2:qpos]
+    else:
+        params = {}
+    if host.endswith('/'):
+        host = host[:-1]
+
+    cache_class = getattr(__import__('django.core.cache.backends.%s' % BACKENDS[scheme], '', '', ['']), 'CacheClass')
+    return cache_class(host, params)
+
+cache = get_cache(settings.CACHE_BACKEND)

Added: vendor/django/current/django/core/cache/backends/__init__.py
===================================================================

Added: vendor/django/current/django/core/cache/backends/base.py
===================================================================
--- vendor/django/current/django/core/cache/backends/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/backends/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,56 @@
+"Base Cache class."
+
+from django.core.exceptions import ImproperlyConfigured
+
+class InvalidCacheBackendError(ImproperlyConfigured):
+    pass
+
+class BaseCache(object):
+    def __init__(self, params):
+        timeout = params.get('timeout', 300)
+        try:
+            timeout = int(timeout)
+        except (ValueError, TypeError):
+            timeout = 300
+        self.default_timeout = timeout
+
+    def get(self, key, default=None):
+        """
+        Fetch a given key from the cache.  If the key does not exist, return
+        default, which itself defaults to None.
+        """
+        raise NotImplementedError
+
+    def set(self, key, value, timeout=None):
+        """
+        Set a value in the cache.  If timeout is given, that timeout will be
+        used for the key; otherwise the default cache timeout will be used.
+        """
+        raise NotImplementedError
+
+    def delete(self, key):
+        """
+        Delete a key from the cache, failing silently.
+        """
+        raise NotImplementedError
+
+    def get_many(self, keys):
+        """
+        Fetch a bunch of keys from the cache.  For certain backends (memcached,
+        pgsql) this can be *much* faster when fetching multiple values.
+
+        Returns a dict mapping each key in keys to its value.  If the given
+        key is missing, it will be missing from the response dict.
+        """
+        d = {}
+        for k in keys:
+            val = self.get(k)
+            if val is not None:
+                d[k] = val
+        return d
+
+    def has_key(self, key):
+        """
+        Returns True if the key is in the cache and has not expired.
+        """
+        return self.get(key) is not None

Added: vendor/django/current/django/core/cache/backends/db.py
===================================================================
--- vendor/django/current/django/core/cache/backends/db.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/backends/db.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,82 @@
+"Database cache backend."
+
+from django.core.cache.backends.base import BaseCache
+from django.db import connection, transaction, DatabaseError
+import base64, time
+from datetime import datetime
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+class CacheClass(BaseCache):
+    def __init__(self, table, params):
+        BaseCache.__init__(self, params)
+        self._table = table
+        max_entries = params.get('max_entries', 300)
+        try:
+            self._max_entries = int(max_entries)
+        except (ValueError, TypeError):
+            self._max_entries = 300
+        cull_frequency = params.get('cull_frequency', 3)
+        try:
+            self._cull_frequency = int(cull_frequency)
+        except (ValueError, TypeError):
+            self._cull_frequency = 3
+
+    def get(self, key, default=None):
+        cursor = connection.cursor()
+        cursor.execute("SELECT cache_key, value, expires FROM %s WHERE cache_key = %%s" % self._table, [key])
+        row = cursor.fetchone()
+        if row is None:
+            return default
+        now = datetime.now()
+        if row[2] < now:
+            cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key])
+            transaction.commit_unless_managed()
+            return default
+        return pickle.loads(base64.decodestring(row[1]))
+
+    def set(self, key, value, timeout=None):
+        if timeout is None:
+            timeout = self.default_timeout
+        cursor = connection.cursor()
+        cursor.execute("SELECT COUNT(*) FROM %s" % self._table)
+        num = cursor.fetchone()[0]
+        now = datetime.now().replace(microsecond=0)
+        exp = datetime.fromtimestamp(time.time() + timeout).replace(microsecond=0)
+        if num > self._max_entries:
+            self._cull(cursor, now)
+        encoded = base64.encodestring(pickle.dumps(value, 2)).strip()
+        cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s" % self._table, [key])
+        try:
+            if cursor.fetchone():
+                cursor.execute("UPDATE %s SET value = %%s, expires = %%s WHERE cache_key = %%s" % self._table, [encoded, str(exp), key])
+            else:
+                cursor.execute("INSERT INTO %s (cache_key, value, expires) VALUES (%%s, %%s, %%s)" % self._table, [key, encoded, str(exp)])
+        except DatabaseError:
+            # To be threadsafe, updates/inserts are allowed to fail silently
+            pass
+        else:
+            transaction.commit_unless_managed()
+
+    def delete(self, key):
+        cursor = connection.cursor()
+        cursor.execute("DELETE FROM %s WHERE cache_key = %%s" % self._table, [key])
+        transaction.commit_unless_managed()
+
+    def has_key(self, key):
+        cursor = connection.cursor()
+        cursor.execute("SELECT cache_key FROM %s WHERE cache_key = %%s" % self._table, [key])
+        return cursor.fetchone() is not None
+
+    def _cull(self, cursor, now):
+        if self._cull_frequency == 0:
+            cursor.execute("DELETE FROM %s" % self._table)
+        else:
+            cursor.execute("DELETE FROM %s WHERE expires < %%s" % self._table, [str(now)])
+            cursor.execute("SELECT COUNT(*) FROM %s" % self._table)
+            num = cursor.fetchone()[0]
+            if num > self._max_entries:
+                cursor.execute("SELECT cache_key FROM %s ORDER BY cache_key LIMIT 1 OFFSET %%s" % self._table, [num / self._cull_frequency])
+                cursor.execute("DELETE FROM %s WHERE cache_key < %%s" % self._table, [cursor.fetchone()[0]])

Added: vendor/django/current/django/core/cache/backends/dummy.py
===================================================================
--- vendor/django/current/django/core/cache/backends/dummy.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/backends/dummy.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,22 @@
+"Dummy cache backend"
+
+from django.core.cache.backends.base import BaseCache
+
+class CacheClass(BaseCache):
+    def __init__(self, *args, **kwargs):
+        pass
+
+    def get(self, *args, **kwargs):
+        pass
+
+    def set(self, *args, **kwargs):
+        pass
+
+    def delete(self, *args, **kwargs):
+        pass
+
+    def get_many(self, *args, **kwargs):
+        pass
+
+    def has_key(self, *args, **kwargs):
+        return False

Added: vendor/django/current/django/core/cache/backends/filebased.py
===================================================================
--- vendor/django/current/django/core/cache/backends/filebased.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/backends/filebased.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,80 @@
+"File-based cache backend"
+
+from django.core.cache.backends.simple import CacheClass as SimpleCacheClass
+import os, time, urllib
+try:
+    import cPickle as pickle
+except ImportError:
+    import pickle
+
+class CacheClass(SimpleCacheClass):
+    def __init__(self, dir, params):
+        self._dir = dir
+        if not os.path.exists(self._dir):
+            self._createdir()
+        SimpleCacheClass.__init__(self, dir, params)
+        del self._cache
+        del self._expire_info
+
+    def get(self, key, default=None):
+        fname = self._key_to_file(key)
+        try:
+            f = open(fname, 'rb')
+            exp = pickle.load(f)
+            now = time.time()
+            if exp < now:
+                f.close()
+                os.remove(fname)
+            else:
+                return pickle.load(f)
+        except (IOError, OSError, EOFError, pickle.PickleError):
+            pass
+        return default
+
+    def set(self, key, value, timeout=None):
+        fname = self._key_to_file(key)
+        if timeout is None:
+            timeout = self.default_timeout
+        try:
+            filelist = os.listdir(self._dir)
+        except (IOError, OSError):
+            self._createdir()
+            filelist = []
+        if len(filelist) > self._max_entries:
+            self._cull(filelist)
+        try:
+            f = open(fname, 'wb')
+            now = time.time()
+            pickle.dump(now + timeout, f, 2)
+            pickle.dump(value, f, 2)
+        except (IOError, OSError):
+            pass
+
+    def delete(self, key):
+        try:
+            os.remove(self._key_to_file(key))
+        except (IOError, OSError):
+            pass
+
+    def has_key(self, key):
+        return os.path.exists(self._key_to_file(key))
+
+    def _cull(self, filelist):
+        if self._cull_frequency == 0:
+            doomed = filelist
+        else:
+            doomed = [k for (i, k) in enumerate(filelist) if i % self._cull_frequency == 0]
+        for fname in doomed:
+            try:
+                os.remove(os.path.join(self._dir, fname))
+            except (IOError, OSError):
+                pass
+
+    def _createdir(self):
+        try:
+            os.makedirs(self._dir)
+        except OSError:
+            raise EnvironmentError, "Cache directory '%s' does not exist and could not be created'" % self._dir
+
+    def _key_to_file(self, key):
+        return os.path.join(self._dir, urllib.quote_plus(key))

Added: vendor/django/current/django/core/cache/backends/locmem.py
===================================================================
--- vendor/django/current/django/core/cache/backends/locmem.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/backends/locmem.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,47 @@
+"Thread-safe in-memory cache backend."
+
+from django.core.cache.backends.simple import CacheClass as SimpleCacheClass
+from django.utils.synch import RWLock
+import copy, time
+
+class CacheClass(SimpleCacheClass):
+    def __init__(self, host, params):
+        SimpleCacheClass.__init__(self, host, params)
+        self._lock = RWLock()
+
+    def get(self, key, default=None):
+        should_delete = False
+        self._lock.reader_enters()
+        try:
+            now = time.time()
+            exp = self._expire_info.get(key)
+            if exp is None:
+                return default
+            elif exp < now:
+                should_delete = True
+            else:
+                return copy.deepcopy(self._cache[key])
+        finally:
+            self._lock.reader_leaves()
+        if should_delete:
+            self._lock.writer_enters()
+            try:
+                del self._cache[key]
+                del self._expire_info[key]
+                return default
+            finally:
+                self._lock.writer_leaves()
+
+    def set(self, key, value, timeout=None):
+        self._lock.writer_enters()
+        try:
+            SimpleCacheClass.set(self, key, value, timeout)
+        finally:
+            self._lock.writer_leaves()
+
+    def delete(self, key):
+        self._lock.writer_enters()
+        try:
+            SimpleCacheClass.delete(self, key)
+        finally:
+            self._lock.writer_leaves()

Added: vendor/django/current/django/core/cache/backends/memcached.py
===================================================================
--- vendor/django/current/django/core/cache/backends/memcached.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/backends/memcached.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,29 @@
+"Memcached cache backend"
+
+from django.core.cache.backends.base import BaseCache, InvalidCacheBackendError
+
+try:
+    import memcache
+except ImportError:
+    raise InvalidCacheBackendError, "Memcached cache backend requires the 'memcache' library"
+
+class CacheClass(BaseCache):
+    def __init__(self, server, params):
+        BaseCache.__init__(self, params)
+        self._cache = memcache.Client(server.split(';'))
+
+    def get(self, key, default=None):
+        val = self._cache.get(key)
+        if val is None:
+            return default
+        else:
+            return val
+
+    def set(self, key, value, timeout=0):
+        self._cache.set(key, value, timeout)
+
+    def delete(self, key):
+        self._cache.delete(key)
+
+    def get_many(self, keys):
+        return self._cache.get_multi(keys)

Added: vendor/django/current/django/core/cache/backends/simple.py
===================================================================
--- vendor/django/current/django/core/cache/backends/simple.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/cache/backends/simple.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,64 @@
+"Single-process in-memory cache backend."
+
+from django.core.cache.backends.base import BaseCache
+import time
+
+class CacheClass(BaseCache):
+    def __init__(self, host, params):
+        BaseCache.__init__(self, params)
+        self._cache = {}
+        self._expire_info = {}
+
+        max_entries = params.get('max_entries', 300)
+        try:
+            self._max_entries = int(max_entries)
+        except (ValueError, TypeError):
+            self._max_entries = 300
+
+        cull_frequency = params.get('cull_frequency', 3)
+        try:
+            self._cull_frequency = int(cull_frequency)
+        except (ValueError, TypeError):
+            self._cull_frequency = 3
+
+    def get(self, key, default=None):
+        now = time.time()
+        exp = self._expire_info.get(key)
+        if exp is None:
+            return default
+        elif exp < now:
+            del self._cache[key]
+            del self._expire_info[key]
+            return default
+        else:
+            return self._cache[key]
+
+    def set(self, key, value, timeout=None):
+        if len(self._cache) >= self._max_entries:
+            self._cull()
+        if timeout is None:
+            timeout = self.default_timeout
+        self._cache[key] = value
+        self._expire_info[key] = time.time() + timeout
+
+    def delete(self, key):
+        try:
+            del self._cache[key]
+        except KeyError:
+            pass
+        try:
+            del self._expire_info[key]
+        except KeyError:
+            pass
+
+    def has_key(self, key):
+        return self._cache.has_key(key)
+
+    def _cull(self):
+        if self._cull_frequency == 0:
+            self._cache.clear()
+            self._expire_info.clear()
+        else:
+            doomed = [k for (i, k) in enumerate(self._cache) if i % self._cull_frequency == 0]
+            for k in doomed:
+                self.delete(k)

Added: vendor/django/current/django/core/context_processors.py
===================================================================
--- vendor/django/current/django/core/context_processors.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/context_processors.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,65 @@
+"""
+A set of request processors that return dictionaries to be merged into a
+template context. Each function takes the request object as its only parameter
+and returns a dictionary to add to the context.
+
+These are referenced from the setting TEMPLATE_CONTEXT_PROCESSORS and used by
+RequestContext.
+"""
+
+from django.conf import settings
+
+def auth(request):
+    """
+    Returns context variables required by apps that use Django's authentication
+    system.
+    """
+    return {
+        'user': request.user,
+        'messages': request.user.get_and_delete_messages(),
+        'perms': PermWrapper(request.user),
+    }
+
+def debug(request):
+    "Returns context variables helpful for debugging."
+    context_extras = {}
+    if settings.DEBUG and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
+        context_extras['debug'] = True
+        from django.db import connection
+        context_extras['sql_queries'] = connection.queries
+    return context_extras
+
+def i18n(request):
+    context_extras = {}
+    context_extras['LANGUAGES'] = settings.LANGUAGES
+    if hasattr(request, 'LANGUAGE_CODE'):
+        context_extras['LANGUAGE_CODE'] = request.LANGUAGE_CODE
+    else:
+        context_extras['LANGUAGE_CODE'] = settings.LANGUAGE_CODE
+
+    from django.utils import translation
+    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()
+
+    return context_extras
+
+def request(request):
+    return {'request': request}
+
+# PermWrapper and PermLookupDict proxy the permissions system into objects that
+# the template system can understand.
+
+class PermLookupDict(object):
+    def __init__(self, user, module_name):
+        self.user, self.module_name = user, module_name
+    def __repr__(self):
+        return str(self.user.get_permission_list())
+    def __getitem__(self, perm_name):
+        return self.user.has_perm("%s.%s" % (self.module_name, perm_name))
+    def __nonzero__(self):
+        return self.user.has_module_perms(self.module_name)
+
+class PermWrapper(object):
+    def __init__(self, user):
+        self.user = user
+    def __getitem__(self, module_name):
+        return PermLookupDict(self.user, module_name)

Added: vendor/django/current/django/core/exceptions.py
===================================================================
--- vendor/django/current/django/core/exceptions.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/exceptions.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,25 @@
+"Global Django exceptions"
+
+class ObjectDoesNotExist(Exception):
+    "The requested object does not exist"
+    silent_variable_failure = True
+
+class SuspiciousOperation(Exception):
+    "The user did something suspicious"
+    pass
+
+class PermissionDenied(Exception):
+    "The user did not have permission to do that"
+    pass
+
+class ViewDoesNotExist(Exception):
+    "The requested view does not exist"
+    pass
+
+class MiddlewareNotUsed(Exception):
+    "This middleware is not used in this server configuration"
+    pass
+
+class ImproperlyConfigured(Exception):
+    "Django is somehow improperly configured"
+    pass

Added: vendor/django/current/django/core/handler.py
===================================================================
--- vendor/django/current/django/core/handler.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/handler.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,11 @@
+# This module is DEPRECATED!
+#
+# You should no longer be pointing your mod_python configuration
+# at "django.core.handler".
+#
+# Use "django.core.handlers.modpython" instead.
+
+from django.core.handlers.modpython import ModPythonHandler
+
+def handler(req):
+    return ModPythonHandler()(req)

Added: vendor/django/current/django/core/handlers/__init__.py
===================================================================

Added: vendor/django/current/django/core/handlers/base.py
===================================================================
--- vendor/django/current/django/core/handlers/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/handlers/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,139 @@
+from django.core import signals
+from django.dispatch import dispatcher
+from django import http
+import sys
+
+class BaseHandler(object):
+    def __init__(self):
+        self._request_middleware = self._view_middleware = self._response_middleware = self._exception_middleware = None
+
+    def load_middleware(self):
+        """
+        Populate middleware lists from settings.MIDDLEWARE_CLASSES.
+
+        Must be called after the environment is fixed (see __call__).
+        """
+        from django.conf import settings
+        from django.core import exceptions
+        self._request_middleware = []
+        self._view_middleware = []
+        self._response_middleware = []
+        self._exception_middleware = []
+        for middleware_path in settings.MIDDLEWARE_CLASSES:
+            try:
+                dot = middleware_path.rindex('.')
+            except ValueError:
+                raise exceptions.ImproperlyConfigured, '%s isn\'t a middleware module' % middleware_path
+            mw_module, mw_classname = middleware_path[:dot], middleware_path[dot+1:]
+            try:
+                mod = __import__(mw_module, '', '', [''])
+            except ImportError, e:
+                raise exceptions.ImproperlyConfigured, 'Error importing middleware %s: "%s"' % (mw_module, e)
+            try:
+                mw_class = getattr(mod, mw_classname)
+            except AttributeError:
+                raise exceptions.ImproperlyConfigured, 'Middleware module "%s" does not define a "%s" class' % (mw_module, mw_classname)
+
+            try:
+                mw_instance = mw_class()
+            except exceptions.MiddlewareNotUsed:
+                continue
+
+            if hasattr(mw_instance, 'process_request'):
+                self._request_middleware.append(mw_instance.process_request)
+            if hasattr(mw_instance, 'process_view'):
+                self._view_middleware.append(mw_instance.process_view)
+            if hasattr(mw_instance, 'process_response'):
+                self._response_middleware.insert(0, mw_instance.process_response)
+            if hasattr(mw_instance, 'process_exception'):
+                self._exception_middleware.insert(0, mw_instance.process_exception)
+
+    def get_response(self, path, request):
+        "Returns an HttpResponse object for the given HttpRequest"
+        from django.core import exceptions, urlresolvers
+        from django.core.mail import mail_admins
+        from django.conf import settings
+
+        # Apply request middleware
+        for middleware_method in self._request_middleware:
+            response = middleware_method(request)
+            if response:
+                return response
+
+        resolver = urlresolvers.RegexURLResolver(r'^/', settings.ROOT_URLCONF)
+        try:
+            callback, callback_args, callback_kwargs = resolver.resolve(path)
+
+            # Apply view middleware
+            for middleware_method in self._view_middleware:
+                response = middleware_method(request, callback, callback_args, callback_kwargs)
+                if response:
+                    return response
+
+            try:
+                response = callback(request, *callback_args, **callback_kwargs)
+            except Exception, e:
+                # If the view raised an exception, run it through exception
+                # middleware, and if the exception middleware returns a
+                # response, use that. Otherwise, reraise the exception.
+                for middleware_method in self._exception_middleware:
+                    response = middleware_method(request, e)
+                    if response:
+                        return response
+                raise
+
+            # Complain if the view returned None (a common error).
+            if response is None:
+                raise ValueError, "The view %s.%s didn't return an HttpResponse object." % (callback.__module__, callback.func_name)
+
+            return response
+        except http.Http404, e:
+            if settings.DEBUG:
+                return self.get_technical_error_response(request, is404=True, exception=e)
+            else:
+                callback, param_dict = resolver.resolve404()
+                return callback(request, **param_dict)
+        except exceptions.PermissionDenied:
+            return http.HttpResponseForbidden('<h1>Permission denied</h1>')
+        except SystemExit:
+            pass # See http://code.djangoproject.com/ticket/1023
+        except: # Handle everything else, including SuspiciousOperation, etc.
+            if settings.DEBUG:
+                return self.get_technical_error_response(request)
+            else:
+                # Get the exception info now, in case another exception is thrown later.
+                exc_info = sys.exc_info()
+                receivers = dispatcher.send(signal=signals.got_request_exception)
+                # When DEBUG is False, send an error message to the admins.
+                subject = 'Error (%s IP): %s' % ((request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS and 'internal' or 'EXTERNAL'), getattr(request, 'path', ''))
+                try:
+                    request_repr = repr(request)
+                except:
+                    request_repr = "Request repr() unavailable"
+                message = "%s\n\n%s" % (self._get_traceback(exc_info), request_repr)
+                mail_admins(subject, message, fail_silently=True)
+                return self.get_friendly_error_response(request, resolver)
+
+    def get_friendly_error_response(self, request, resolver):
+        """
+        Returns an HttpResponse that displays a PUBLIC error message for a
+        fundamental error.
+        """
+        callback, param_dict = resolver.resolve500()
+        return callback(request, **param_dict)
+
+    def get_technical_error_response(self, request, is404=False, exception=None):
+        """
+        Returns an HttpResponse that displays a TECHNICAL error message for a
+        fundamental error.
+        """
+        from django.views import debug
+        if is404:
+            return debug.technical_404_response(request, exception)
+        else:
+            return debug.technical_500_response(request, *sys.exc_info())
+
+    def _get_traceback(self, exc_info=None):
+        "Helper function to return the traceback as a string"
+        import traceback
+        return '\n'.join(traceback.format_exception(*(exc_info or sys.exc_info())))

Added: vendor/django/current/django/core/handlers/modpython.py
===================================================================
--- vendor/django/current/django/core/handlers/modpython.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/handlers/modpython.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,163 @@
+from django.core.handlers.base import BaseHandler
+from django.core import signals
+from django.dispatch import dispatcher
+from django.utils import datastructures
+from django import http
+from pprint import pformat
+import os
+
+# NOTE: do *not* import settings (or any module which eventually imports
+# settings) until after ModPythonHandler has been called; otherwise os.environ
+# won't be set up correctly (with respect to settings).
+
+class ModPythonRequest(http.HttpRequest):
+    def __init__(self, req):
+        self._req = req
+        self.path = req.uri
+
+    def __repr__(self):
+        return '<ModPythonRequest\npath:%s,\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' % \
+            (self.path, pformat(self.GET), pformat(self.POST), pformat(self.COOKIES),
+            pformat(self.META))
+
+    def get_full_path(self):
+        return '%s%s' % (self.path, self._req.args and ('?' + self._req.args) or '')
+
+    def is_secure(self):
+        return self._req.subprocess_env.has_key('HTTPS') and self._req.subprocess_env['HTTPS'] == 'on'
+
+    def _load_post_and_files(self):
+        "Populates self._post and self._files"
+        if self._req.headers_in.has_key('content-type') and self._req.headers_in['content-type'].startswith('multipart'):
+            self._post, self._files = http.parse_file_upload(self._req.headers_in, self.raw_post_data)
+        else:
+            self._post, self._files = http.QueryDict(self.raw_post_data), datastructures.MultiValueDict()
+
+    def _get_request(self):
+        if not hasattr(self, '_request'):
+            self._request = datastructures.MergeDict(self.POST, self.GET)
+        return self._request
+
+    def _get_get(self):
+        if not hasattr(self, '_get'):
+            self._get = http.QueryDict(self._req.args)
+        return self._get
+
+    def _set_get(self, get):
+        self._get = get
+
+    def _get_post(self):
+        if not hasattr(self, '_post'):
+            self._load_post_and_files()
+        return self._post
+
+    def _set_post(self, post):
+        self._post = post
+
+    def _get_cookies(self):
+        if not hasattr(self, '_cookies'):
+            self._cookies = http.parse_cookie(self._req.headers_in.get('cookie', ''))
+        return self._cookies
+
+    def _set_cookies(self, cookies):
+        self._cookies = cookies
+
+    def _get_files(self):
+        if not hasattr(self, '_files'):
+            self._load_post_and_files()
+        return self._files
+
+    def _get_meta(self):
+        "Lazy loader that returns self.META dictionary"
+        if not hasattr(self, '_meta'):
+            self._meta = {
+                'AUTH_TYPE':         self._req.ap_auth_type,
+                'CONTENT_LENGTH':    self._req.clength, # This may be wrong
+                'CONTENT_TYPE':      self._req.content_type, # This may be wrong
+                'GATEWAY_INTERFACE': 'CGI/1.1',
+                'PATH_INFO':         self._req.path_info,
+                'PATH_TRANSLATED':   None, # Not supported
+                'QUERY_STRING':      self._req.args,
+                'REMOTE_ADDR':       self._req.connection.remote_ip,
+                'REMOTE_HOST':       None, # DNS lookups not supported
+                'REMOTE_IDENT':      self._req.connection.remote_logname,
+                'REMOTE_USER':       self._req.user,
+                'REQUEST_METHOD':    self._req.method,
+                'SCRIPT_NAME':       None, # Not supported
+                'SERVER_NAME':       self._req.server.server_hostname,
+                'SERVER_PORT':       self._req.server.port,
+                'SERVER_PROTOCOL':   self._req.protocol,
+                'SERVER_SOFTWARE':   'mod_python'
+            }
+            for key, value in self._req.headers_in.items():
+                key = 'HTTP_' + key.upper().replace('-', '_')
+                self._meta[key] = value
+        return self._meta
+
+    def _get_raw_post_data(self):
+        try:
+            return self._raw_post_data
+        except AttributeError:
+            self._raw_post_data = self._req.read()
+            return self._raw_post_data
+
+    def _get_method(self):
+        return self.META['REQUEST_METHOD'].upper()
+
+    GET = property(_get_get, _set_get)
+    POST = property(_get_post, _set_post)
+    COOKIES = property(_get_cookies, _set_cookies)
+    FILES = property(_get_files)
+    META = property(_get_meta)
+    REQUEST = property(_get_request)
+    raw_post_data = property(_get_raw_post_data)
+    method = property(_get_method)
+
+class ModPythonHandler(BaseHandler):
+    def __call__(self, req):
+        # mod_python fakes the environ, and thus doesn't process SetEnv.  This fixes that
+        os.environ.update(req.subprocess_env)
+
+        # now that the environ works we can see the correct settings, so imports
+        # that use settings now can work
+        from django.conf import settings
+
+        if settings.ENABLE_PSYCO:
+            import psyco
+            psyco.profile()
+
+        # if we need to set up middleware, now that settings works we can do it now.
+        if self._request_middleware is None:
+            self.load_middleware()
+
+        dispatcher.send(signal=signals.request_started)
+        try:
+            request = ModPythonRequest(req)
+            response = self.get_response(req.uri, request)
+
+            # Apply response middleware
+            for middleware_method in self._response_middleware:
+                response = middleware_method(request, response)
+
+        finally:
+            dispatcher.send(signal=signals.request_finished)
+
+        # Convert our custom HttpResponse object back into the mod_python req.
+        populate_apache_request(response, req)
+        return 0 # mod_python.apache.OK
+
+def populate_apache_request(http_response, mod_python_req):
+    "Populates the mod_python request object with an HttpResponse"
+    mod_python_req.content_type = http_response['Content-Type']
+    for key, value in http_response.headers.items():
+        if key != 'Content-Type':
+            mod_python_req.headers_out[key] = value
+    for c in http_response.cookies.values():
+        mod_python_req.headers_out.add('Set-Cookie', c.output(header=''))
+    mod_python_req.status = http_response.status_code
+    for chunk in http_response.iterator:
+        mod_python_req.write(chunk)
+
+def handler(req):
+    # mod_python hooks into this function.
+    return ModPythonHandler()(req)

Added: vendor/django/current/django/core/handlers/profiler-hotshot.py
===================================================================
--- vendor/django/current/django/core/handlers/profiler-hotshot.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/handlers/profiler-hotshot.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,22 @@
+import hotshot, time, os
+from django.core.handlers.modpython import ModPythonHandler
+
+PROFILE_DATA_DIR = "/var/log/cmsprofile"
+
+def handler(req):
+    '''
+    Handler that uses hotshot to store profile data.
+
+    Stores profile data in PROFILE_DATA_DIR.  Since hotshot has no way (that I
+    know of) to append profile data to a single file, each request gets its own
+    profile.  The file names are in the format <url>.<n>.prof where <url> is
+    the request path with "/" replaced by ".", and <n> is a timestamp with
+    microseconds to prevent overwriting files.
+
+    Use the gather_profile_stats.py script to gather these individual request
+    profiles into aggregated profiles by request path.
+    '''
+    profname = "%s.%.3f.prof" % (req.uri.strip("/").replace('/', '.'), time.time())
+    profname = os.path.join(PROFILE_DATA_DIR, profname)
+    prof = hotshot.Profile(profname)
+    return prof.runcall(ModPythonHandler(), req)

Added: vendor/django/current/django/core/handlers/wsgi.py
===================================================================
--- vendor/django/current/django/core/handlers/wsgi.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/handlers/wsgi.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,166 @@
+from django.core.handlers.base import BaseHandler
+from django.core import signals
+from django.dispatch import dispatcher
+from django.utils import datastructures
+from django import http
+from pprint import pformat
+
+# See http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
+STATUS_CODE_TEXT = {
+    100: 'CONTINUE',
+    101: 'SWITCHING PROTOCOLS',
+    200: 'OK',
+    201: 'CREATED',
+    202: 'ACCEPTED',
+    203: 'NON-AUTHORITATIVE INFORMATION',
+    204: 'NO CONTENT',
+    205: 'RESET CONTENT',
+    206: 'PARTIAL CONTENT',
+    300: 'MULTIPLE CHOICES',
+    301: 'MOVED PERMANENTLY',
+    302: 'FOUND',
+    303: 'SEE OTHER',
+    304: 'NOT MODIFIED',
+    305: 'USE PROXY',
+    306: 'RESERVED',
+    307: 'TEMPORARY REDIRECT',
+    400: 'BAD REQUEST',
+    401: 'UNAUTHORIZED',
+    402: 'PAYMENT REQUIRED',
+    403: 'FORBIDDEN',
+    404: 'NOT FOUND',
+    405: 'METHOD NOT ALLOWED',
+    406: 'NOT ACCEPTABLE',
+    407: 'PROXY AUTHENTICATION REQUIRED',
+    408: 'REQUEST TIMEOUT',
+    409: 'CONFLICT',
+    410: 'GONE',
+    411: 'LENGTH REQUIRED',
+    412: 'PRECONDITION FAILED',
+    413: 'REQUEST ENTITY TOO LARGE',
+    414: 'REQUEST-URI TOO LONG',
+    415: 'UNSUPPORTED MEDIA TYPE',
+    416: 'REQUESTED RANGE NOT SATISFIABLE',
+    417: 'EXPECTATION FAILED',
+    500: 'INTERNAL SERVER ERROR',
+    501: 'NOT IMPLEMENTED',
+    502: 'BAD GATEWAY',
+    503: 'SERVICE UNAVAILABLE',
+    504: 'GATEWAY TIMEOUT',
+    505: 'HTTP VERSION NOT SUPPORTED',
+}
+
+class WSGIRequest(http.HttpRequest):
+    def __init__(self, environ):
+        self.environ = environ
+        self.path = environ['PATH_INFO']
+        self.META = environ 
+        self.method = environ['REQUEST_METHOD'].upper()
+
+    def __repr__(self):
+        return '<WSGIRequest\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' % \
+            (pformat(self.GET), pformat(self.POST), pformat(self.COOKIES),
+            pformat(self.META))
+
+    def get_full_path(self):
+        return '%s%s' % (self.path, self.environ.get('QUERY_STRING', '') and ('?' + self.environ.get('QUERY_STRING', '')) or '')
+
+    def is_secure(self):
+        return self.environ.has_key('HTTPS') and self.environ['HTTPS'] == 'on'
+
+    def _load_post_and_files(self):
+        # Populates self._post and self._files
+        if self.method == 'POST':
+            if self.environ.get('CONTENT_TYPE', '').startswith('multipart'):
+                header_dict = dict([(k, v) for k, v in self.environ.items() if k.startswith('HTTP_')])
+                header_dict['Content-Type'] = self.environ.get('CONTENT_TYPE', '')
+                self._post, self._files = http.parse_file_upload(header_dict, self.raw_post_data)
+            else:
+                self._post, self._files = http.QueryDict(self.raw_post_data), datastructures.MultiValueDict()
+        else:
+            self._post, self._files = http.QueryDict(''), datastructures.MultiValueDict()
+
+    def _get_request(self):
+        if not hasattr(self, '_request'):
+            self._request = datastructures.MergeDict(self.POST, self.GET)
+        return self._request
+
+    def _get_get(self):
+        if not hasattr(self, '_get'):
+            # The WSGI spec says 'QUERY_STRING' may be absent.
+            self._get = http.QueryDict(self.environ.get('QUERY_STRING', ''))
+        return self._get
+
+    def _set_get(self, get):
+        self._get = get
+
+    def _get_post(self):
+        if not hasattr(self, '_post'):
+            self._load_post_and_files()
+        return self._post
+
+    def _set_post(self, post):
+        self._post = post
+
+    def _get_cookies(self):
+        if not hasattr(self, '_cookies'):
+            self._cookies = http.parse_cookie(self.environ.get('HTTP_COOKIE', ''))
+        return self._cookies
+
+    def _set_cookies(self, cookies):
+        self._cookies = cookies
+
+    def _get_files(self):
+        if not hasattr(self, '_files'):
+            self._load_post_and_files()
+        return self._files
+
+    def _get_raw_post_data(self):
+        try:
+            return self._raw_post_data
+        except AttributeError:
+            self._raw_post_data = self.environ['wsgi.input'].read(int(self.environ["CONTENT_LENGTH"]))
+            return self._raw_post_data
+
+    GET = property(_get_get, _set_get)
+    POST = property(_get_post, _set_post)
+    COOKIES = property(_get_cookies, _set_cookies)
+    FILES = property(_get_files)
+    REQUEST = property(_get_request)
+    raw_post_data = property(_get_raw_post_data)
+
+class WSGIHandler(BaseHandler):
+    def __call__(self, environ, start_response):
+        from django.conf import settings
+
+        if settings.ENABLE_PSYCO:
+            import psyco
+            psyco.profile()
+
+        # Set up middleware if needed. We couldn't do this earlier, because
+        # settings weren't available.
+        if self._request_middleware is None:
+            self.load_middleware()
+
+        dispatcher.send(signal=signals.request_started)
+        try:
+            request = WSGIRequest(environ)
+            response = self.get_response(request.path, request)
+
+            # Apply response middleware
+            for middleware_method in self._response_middleware:
+                response = middleware_method(request, response)
+
+        finally:
+            dispatcher.send(signal=signals.request_finished)
+
+        try:
+            status_text = STATUS_CODE_TEXT[response.status_code]
+        except KeyError:
+            status_text = 'UNKNOWN STATUS CODE'
+        status = '%s %s' % (response.status_code, status_text)
+        response_headers = response.headers.items()
+        for c in response.cookies.values():
+            response_headers.append(('Set-Cookie', c.output(header='')))
+        start_response(status, response_headers)
+        return response.iterator

Added: vendor/django/current/django/core/mail.py
===================================================================
--- vendor/django/current/django/core/mail.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/mail.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,73 @@
+# Use this module for e-mailing.
+
+from django.conf import settings
+from email.MIMEText import MIMEText
+from email.Header import Header
+import smtplib, rfc822
+
+class BadHeaderError(ValueError):
+    pass
+
+class SafeMIMEText(MIMEText):
+    def __setitem__(self, name, val):
+        "Forbids multi-line headers, to prevent header injection."
+        if '\n' in val or '\r' in val:
+            raise BadHeaderError, "Header values can't contain newlines (got %r for header %r)" % (val, name)
+        if name == "Subject":
+            val = Header(val, settings.DEFAULT_CHARSET)
+        MIMEText.__setitem__(self, name, val)
+
+def send_mail(subject, message, from_email, recipient_list, fail_silently=False, auth_user=settings.EMAIL_HOST_USER, auth_password=settings.EMAIL_HOST_PASSWORD):
+    """
+    Easy wrapper for sending a single message to a recipient list. All members
+    of the recipient list will see the other recipients in the 'To' field.
+    """
+    return send_mass_mail([[subject, message, from_email, recipient_list]], fail_silently, auth_user, auth_password)
+
+def send_mass_mail(datatuple, fail_silently=False, auth_user=settings.EMAIL_HOST_USER, auth_password=settings.EMAIL_HOST_PASSWORD):
+    """
+    Given a datatuple of (subject, message, from_email, recipient_list), sends
+    each message to each recipient list. Returns the number of e-mails sent.
+
+    If from_email is None, the DEFAULT_FROM_EMAIL setting is used.
+    If auth_user and auth_password are set, they're used to log in.
+    """
+    try:
+        server = smtplib.SMTP(settings.EMAIL_HOST, settings.EMAIL_PORT)
+        if auth_user and auth_password:
+            server.login(auth_user, auth_password)
+    except:
+        if fail_silently:
+            return
+        raise
+    num_sent = 0
+    for subject, message, from_email, recipient_list in datatuple:
+        if not recipient_list:
+            continue
+        from_email = from_email or settings.DEFAULT_FROM_EMAIL
+        msg = SafeMIMEText(message, 'plain', settings.DEFAULT_CHARSET)
+        msg['Subject'] = subject
+        msg['From'] = from_email
+        msg['To'] = ', '.join(recipient_list)
+        msg['Date'] = rfc822.formatdate()
+        try:
+            server.sendmail(from_email, recipient_list, msg.as_string())
+            num_sent += 1
+        except:
+            if not fail_silently:
+                raise
+    try:
+        server.quit()
+    except:
+        if fail_silently:
+            return
+        raise
+    return num_sent
+
+def mail_admins(subject, message, fail_silently=False):
+    "Sends a message to the admins, as defined by the ADMINS setting."
+    send_mail(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.ADMINS], fail_silently)
+
+def mail_managers(subject, message, fail_silently=False):
+    "Sends a message to the managers, as defined by the MANAGERS setting."
+    send_mail(settings.EMAIL_SUBJECT_PREFIX + subject, message, settings.SERVER_EMAIL, [a[1] for a in settings.MANAGERS], fail_silently)

Added: vendor/django/current/django/core/management.py
===================================================================
--- vendor/django/current/django/core/management.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/management.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1319 @@
+# Django management-related functions, including "CREATE TABLE" generation and
+# development-server initialization.
+
+import django
+from django.core.exceptions import ImproperlyConfigured
+import os, re, shutil, sys, textwrap
+from optparse import OptionParser
+from django.utils import termcolors
+
+# For Python 2.3
+if not hasattr(__builtins__, 'set'):
+    from sets import Set as set
+
+MODULE_TEMPLATE = '''    {%% if perms.%(app)s.%(addperm)s or perms.%(app)s.%(changeperm)s %%}
+    <tr>
+        <th>{%% if perms.%(app)s.%(changeperm)s %%}<a href="%(app)s/%(mod)s/">{%% endif %%}%(name)s{%% if perms.%(app)s.%(changeperm)s %%}</a>{%% endif %%}</th>
+        <td class="x50">{%% if perms.%(app)s.%(addperm)s %%}<a href="%(app)s/%(mod)s/add/" class="addlink">{%% endif %%}Add{%% if perms.%(app)s.%(addperm)s %%}</a>{%% endif %%}</td>
+        <td class="x75">{%% if perms.%(app)s.%(changeperm)s %%}<a href="%(app)s/%(mod)s/" class="changelink">{%% endif %%}Change{%% if perms.%(app)s.%(changeperm)s %%}</a>{%% endif %%}</td>
+    </tr>
+    {%% endif %%}'''
+
+APP_ARGS = '[appname ...]'
+
+# Use django.__path__[0] because we don't know which directory django into
+# which has been installed.
+PROJECT_TEMPLATE_DIR = os.path.join(django.__path__[0], 'conf', '%s_template')
+
+INVALID_PROJECT_NAMES = ('django', 'test')
+
+# Set up the terminal color scheme.
+class dummy: pass
+style = dummy()
+style.ERROR = termcolors.make_style(fg='red', opts=('bold',))
+style.ERROR_OUTPUT = termcolors.make_style(fg='red', opts=('bold',))
+style.SQL_FIELD = termcolors.make_style(fg='green', opts=('bold',))
+style.SQL_COLTYPE = termcolors.make_style(fg='green')
+style.SQL_KEYWORD = termcolors.make_style(fg='yellow')
+style.SQL_TABLE = termcolors.make_style(opts=('bold',))
+del dummy
+
+def disable_termcolors():
+    class dummy:
+        def __getattr__(self, attr):
+            return lambda x: x
+    global style
+    style = dummy()
+
+# Disable terminal coloring on Windows, Pocket PC, or if somebody's piping the output.
+if sys.platform == 'win32' or sys.platform == 'Pocket PC' or not sys.stdout.isatty():
+    disable_termcolors()
+
+def _is_valid_dir_name(s):
+    return bool(re.search(r'^\w+$', s))
+
+def _get_installed_models(table_list):
+    "Gets a set of all models that are installed, given a list of existing tables"
+    from django.db import models
+    all_models = []
+    for app in models.get_apps():
+        for model in models.get_models(app):
+            all_models.append(model)
+    return set([m for m in all_models if m._meta.db_table in table_list])
+
+def _get_table_list():
+    "Gets a list of all db tables that are physically installed."
+    from django.db import connection, get_introspection_module
+    cursor = connection.cursor()
+    return get_introspection_module().get_table_list(cursor)
+
+# If the foreign key points to an AutoField, a PositiveIntegerField or a
+# PositiveSmallIntegerField, the foreign key should be an IntegerField, not the
+# referred field type. Otherwise, the foreign key should be the same type of
+# field as the field to which it points.
+get_rel_data_type = lambda f: (f.get_internal_type() in ('AutoField', 'PositiveIntegerField', 'PositiveSmallIntegerField')) and 'IntegerField' or f.get_internal_type()
+
+def get_version():
+    "Returns the version as a human-format string."
+    from django import VERSION
+    v = '.'.join([str(i) for i in VERSION[:-1]])
+    if VERSION[-1]:
+        v += '-' + VERSION[-1]
+    return v
+
+def get_sql_create(app):
+    "Returns a list of the CREATE TABLE SQL statements for the given app."
+    from django.db import get_creation_module, models
+    data_types = get_creation_module().DATA_TYPES
+
+    if not data_types:
+        # This must be the "dummy" database backend, which means the user
+        # hasn't set DATABASE_ENGINE.
+        sys.stderr.write(style.ERROR("Error: Django doesn't know which syntax to use for your SQL statements,\n" +
+            "because you haven't specified the DATABASE_ENGINE setting.\n" +
+            "Edit your settings file and change DATABASE_ENGINE to something like 'postgresql' or 'mysql'.\n"))
+        sys.exit(1)
+
+    # Get installed models, so we generate REFERENCES right
+    final_output = []
+    known_models = set(_get_installed_models(_get_table_list()))
+    pending_references = {}
+
+    app_models = models.get_models(app)
+
+    for model in app_models:
+        output, references = _get_sql_model_create(model, known_models)
+        final_output.extend(output)
+        for refto, refs in references.items():
+            pending_references.setdefault(refto,[]).extend(refs)
+        final_output.extend(_get_sql_for_pending_references(model, pending_references))
+        # Keep track of the fact that we've created the table for this model.
+        known_models.add(model)
+
+    # Create the many-to-many join tables.
+    for model in app_models:
+        final_output.extend(_get_many_to_many_sql_for_model(model))
+
+    # Handle references to tables that are from other apps
+    # but don't exist physically
+    not_installed_models = set(pending_references.keys())
+    if not_installed_models:
+        final_output.append('-- The following references should be added but depend on non-existant tables:')
+        for model in not_installed_models:
+            final_output.extend(['-- ' + sql for sql in
+                _get_sql_for_pending_references(model, pending_references)])
+
+    return final_output
+get_sql_create.help_doc = "Prints the CREATE TABLE SQL statements for the given app name(s)."
+get_sql_create.args = APP_ARGS
+
+def _get_sql_model_create(model, known_models=set()):
+    """
+    Get the SQL required to create a single model.
+
+    Returns list_of_sql, pending_references_dict
+    """
+    from django.db import backend, get_creation_module, models
+    data_types = get_creation_module().DATA_TYPES
+
+    opts = model._meta
+    final_output = []
+    table_output = []
+    pending_references = {}
+    for f in opts.fields:
+        if isinstance(f, models.ForeignKey):
+            rel_field = f.rel.get_related_field()
+            data_type = get_rel_data_type(rel_field)
+        else:
+            rel_field = f
+            data_type = f.get_internal_type()
+        col_type = data_types[data_type]
+        if col_type is not None:
+            # Make the definition (e.g. 'foo VARCHAR(30)') for this field.
+            field_output = [style.SQL_FIELD(backend.quote_name(f.column)),
+                style.SQL_COLTYPE(col_type % rel_field.__dict__)]
+            field_output.append(style.SQL_KEYWORD('%sNULL' % (not f.null and 'NOT ' or '')))
+            if f.unique:
+                field_output.append(style.SQL_KEYWORD('UNIQUE'))
+            if f.primary_key:
+                field_output.append(style.SQL_KEYWORD('PRIMARY KEY'))
+            if f.rel:
+                if f.rel.to in known_models:
+                    field_output.append(style.SQL_KEYWORD('REFERENCES') + ' ' + \
+                        style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)) + ' (' + \
+                        style.SQL_FIELD(backend.quote_name(f.rel.to._meta.get_field(f.rel.field_name).column)) + ')'
+                    )
+                else:
+                    # We haven't yet created the table to which this field
+                    # is related, so save it for later.
+                    pr = pending_references.setdefault(f.rel.to, []).append((model, f))
+            table_output.append(' '.join(field_output))
+    if opts.order_with_respect_to:
+        table_output.append(style.SQL_FIELD(backend.quote_name('_order')) + ' ' + \
+            style.SQL_COLTYPE(data_types['IntegerField']) + ' ' + \
+            style.SQL_KEYWORD('NULL'))
+    for field_constraints in opts.unique_together:
+        table_output.append(style.SQL_KEYWORD('UNIQUE') + ' (%s)' % \
+            ", ".join([backend.quote_name(style.SQL_FIELD(opts.get_field(f).column)) for f in field_constraints]))
+
+    full_statement = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + style.SQL_TABLE(backend.quote_name(opts.db_table)) + ' (']
+    for i, line in enumerate(table_output): # Combine and add commas.
+        full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
+    full_statement.append(');')
+    final_output.append('\n'.join(full_statement))
+
+    return final_output, pending_references
+
+def _get_sql_for_pending_references(model, pending_references):
+    """
+    Get any ALTER TABLE statements to add constraints after the fact.
+    """
+    from django.db import backend, get_creation_module
+    data_types = get_creation_module().DATA_TYPES
+
+    final_output = []
+    reference_names = {}
+    if backend.supports_constraints:
+        opts = model._meta
+        if model in pending_references:
+            for rel_class, f in pending_references[model]:
+                rel_opts = rel_class._meta
+                r_table = rel_opts.db_table
+                r_col = f.column
+                table = opts.db_table
+                col = opts.get_field(f.rel.field_name).column
+                r_name = '%s_referencing_%s_%s' % (r_col, table, col)
+                if r_name in reference_names:
+                    reference_names[r_name] += 1
+                    r_name += '_%s' % reference_names[r_name]
+                else:
+                    reference_names[r_name] = 0
+                final_output.append(style.SQL_KEYWORD('ALTER TABLE') + ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s);' % \
+                    (backend.quote_name(r_table), r_name,
+                    backend.quote_name(r_col), backend.quote_name(table), backend.quote_name(col)))
+            del pending_references[model]
+    return final_output
+
+def _get_many_to_many_sql_for_model(model):
+    from django.db import backend, get_creation_module
+    from django.db.models import GenericRel
+
+    data_types = get_creation_module().DATA_TYPES
+
+    opts = model._meta
+    final_output = []
+    for f in opts.many_to_many:
+        if not isinstance(f.rel, GenericRel):
+            table_output = [style.SQL_KEYWORD('CREATE TABLE') + ' ' + \
+                style.SQL_TABLE(backend.quote_name(f.m2m_db_table())) + ' (']
+            table_output.append('    %s %s %s,' % \
+                (style.SQL_FIELD(backend.quote_name('id')),
+                style.SQL_COLTYPE(data_types['AutoField']),
+                style.SQL_KEYWORD('NOT NULL PRIMARY KEY')))
+            table_output.append('    %s %s %s %s (%s),' % \
+                (style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
+                style.SQL_COLTYPE(data_types[get_rel_data_type(opts.pk)] % opts.pk.__dict__),
+                style.SQL_KEYWORD('NOT NULL REFERENCES'),
+                style.SQL_TABLE(backend.quote_name(opts.db_table)),
+                style.SQL_FIELD(backend.quote_name(opts.pk.column))))
+            table_output.append('    %s %s %s %s (%s),' % \
+                (style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name())),
+                style.SQL_COLTYPE(data_types[get_rel_data_type(f.rel.to._meta.pk)] % f.rel.to._meta.pk.__dict__),
+                style.SQL_KEYWORD('NOT NULL REFERENCES'),
+                style.SQL_TABLE(backend.quote_name(f.rel.to._meta.db_table)),
+                style.SQL_FIELD(backend.quote_name(f.rel.to._meta.pk.column))))
+            table_output.append('    %s (%s, %s)' % \
+                (style.SQL_KEYWORD('UNIQUE'),
+                style.SQL_FIELD(backend.quote_name(f.m2m_column_name())),
+                style.SQL_FIELD(backend.quote_name(f.m2m_reverse_name()))))
+            table_output.append(');')
+            final_output.append('\n'.join(table_output))
+    return final_output
+
+def get_sql_delete(app):
+    "Returns a list of the DROP TABLE SQL statements for the given app."
+    from django.db import backend, connection, models, get_introspection_module
+    introspection = get_introspection_module()
+
+    # This should work even if a connecton isn't available
+    try:
+        cursor = connection.cursor()
+    except:
+        cursor = None
+
+    # Figure out which tables already exist
+    if cursor:
+        table_names = introspection.get_table_list(cursor)
+    else:
+        table_names = []
+
+    output = []
+
+    # Output DROP TABLE statements for standard application tables.
+    to_delete = set()
+
+    references_to_delete = {}
+    app_models = models.get_models(app)
+    for model in app_models:
+        if cursor and model._meta.db_table in table_names:
+            # The table exists, so it needs to be dropped
+            opts = model._meta
+            for f in opts.fields:
+                if f.rel and f.rel.to not in to_delete:
+                    references_to_delete.setdefault(f.rel.to, []).append( (model, f) )
+
+            to_delete.add(model)
+
+    for model in app_models:
+        if cursor and model._meta.db_table in table_names:
+            # Drop the table now
+            output.append('%s %s;' % (style.SQL_KEYWORD('DROP TABLE'),
+                style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
+            if backend.supports_constraints and references_to_delete.has_key(model):
+                for rel_class, f in references_to_delete[model]:
+                    table = rel_class._meta.db_table
+                    col = f.column
+                    r_table = model._meta.db_table
+                    r_col = model._meta.get_field(f.rel.field_name).column
+                    output.append('%s %s %s %s;' % \
+                        (style.SQL_KEYWORD('ALTER TABLE'),
+                        style.SQL_TABLE(backend.quote_name(table)),
+                        style.SQL_KEYWORD(backend.get_drop_foreignkey_sql()),
+                        style.SQL_FIELD(backend.quote_name("%s_referencing_%s_%s" % (col, r_table, r_col)))))
+                del references_to_delete[model]
+
+    # Output DROP TABLE statements for many-to-many tables.
+    for model in app_models:
+        opts = model._meta
+        for f in opts.many_to_many:
+            if cursor and f.m2m_db_table() in table_names:
+                output.append("%s %s;" % (style.SQL_KEYWORD('DROP TABLE'),
+                    style.SQL_TABLE(backend.quote_name(f.m2m_db_table()))))
+
+    app_label = app_models[0]._meta.app_label
+
+    # Close database connection explicitly, in case this output is being piped
+    # directly into a database client, to avoid locking issues.
+    if cursor:
+        cursor.close()
+        connection.close()
+
+    return output[::-1] # Reverse it, to deal with table dependencies.
+get_sql_delete.help_doc = "Prints the DROP TABLE SQL statements for the given app name(s)."
+get_sql_delete.args = APP_ARGS
+
+def get_sql_reset(app):
+    "Returns a list of the DROP TABLE SQL, then the CREATE TABLE SQL, for the given module."
+    return get_sql_delete(app) + get_sql_all(app)
+get_sql_reset.help_doc = "Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given app name(s)."
+get_sql_reset.args = APP_ARGS
+
+def get_sql_initial_data_for_model(model):
+    from django.db import models
+    from django.conf import settings
+
+    opts = model._meta
+    app_dir = os.path.normpath(os.path.join(os.path.dirname(models.get_app(model._meta.app_label).__file__), 'sql'))
+    output = []
+
+    # Some backends can't execute more than one SQL statement at a time,
+    # so split into separate statements.
+    statements = re.compile(r";[ \t]*$", re.M)
+
+    # Find custom SQL, if it's available.
+    sql_files = [os.path.join(app_dir, "%s.%s.sql" % (opts.object_name.lower(), settings.DATABASE_ENGINE)),
+                 os.path.join(app_dir, "%s.sql" % opts.object_name.lower())]
+    for sql_file in sql_files:
+        if os.path.exists(sql_file):
+            fp = open(sql_file)
+            for statement in statements.split(fp.read()):
+                if statement.strip():
+                    output.append(statement + ";")
+            fp.close()
+
+    return output
+
+def get_sql_initial_data(app):
+    "Returns a list of the initial INSERT SQL statements for the given app."
+    from django.db.models import get_models
+    output = []
+
+    app_models = get_models(app)
+    app_dir = os.path.normpath(os.path.join(os.path.dirname(app.__file__), 'sql'))
+
+    for model in app_models:
+        output.extend(get_sql_initial_data_for_model(model))
+
+    return output
+get_sql_initial_data.help_doc = "Prints the initial INSERT SQL statements for the given app name(s)."
+get_sql_initial_data.args = APP_ARGS
+
+def get_sql_sequence_reset(app):
+    "Returns a list of the SQL statements to reset PostgreSQL sequences for the given app."
+    from django.db import backend, models
+    output = []
+    for model in models.get_models(app):
+        for f in model._meta.fields:
+            if isinstance(f, models.AutoField):
+                output.append("%s setval('%s', (%s max(%s) %s %s));" % \
+                    (style.SQL_KEYWORD('SELECT'),
+                    style.SQL_FIELD('%s_%s_seq' % (model._meta.db_table, f.column)),
+                    style.SQL_KEYWORD('SELECT'),
+                    style.SQL_FIELD(backend.quote_name(f.column)),
+                    style.SQL_KEYWORD('FROM'),
+                    style.SQL_TABLE(backend.quote_name(model._meta.db_table))))
+                break # Only one AutoField is allowed per model, so don't bother continuing.
+        for f in model._meta.many_to_many:
+            output.append("%s setval('%s', (%s max(%s) %s %s));" % \
+                (style.SQL_KEYWORD('SELECT'),
+                style.SQL_FIELD('%s_id_seq' % f.m2m_db_table()),
+                style.SQL_KEYWORD('SELECT'),
+                style.SQL_FIELD(backend.quote_name('id')),
+                style.SQL_KEYWORD('FROM'),
+                style.SQL_TABLE(f.m2m_db_table())))
+    return output
+get_sql_sequence_reset.help_doc = "Prints the SQL statements for resetting PostgreSQL sequences for the given app name(s)."
+get_sql_sequence_reset.args = APP_ARGS
+
+def get_sql_indexes(app):
+    "Returns a list of the CREATE INDEX SQL statements for the given app."
+    from django.db import backend, models
+    output = []
+
+    for model in models.get_models(app):
+        for f in model._meta.fields:
+            if f.db_index:
+                unique = f.unique and 'UNIQUE ' or ''
+                output.append(
+                    style.SQL_KEYWORD('CREATE %sINDEX' % unique) + ' ' + \
+                    style.SQL_TABLE('%s_%s' % (model._meta.db_table, f.column)) + ' ' + \
+                    style.SQL_KEYWORD('ON') + ' ' + \
+                    style.SQL_TABLE(backend.quote_name(model._meta.db_table)) + ' ' + \
+                    "(%s);" % style.SQL_FIELD(backend.quote_name(f.column))
+                )
+    return output
+get_sql_indexes.help_doc = "Prints the CREATE INDEX SQL statements for the given model module name(s)."
+get_sql_indexes.args = APP_ARGS
+
+def get_sql_all(app):
+    "Returns a list of CREATE TABLE SQL, initial-data inserts, and CREATE INDEX SQL for the given module."
+    return get_sql_create(app) + get_sql_initial_data(app) + get_sql_indexes(app)
+get_sql_all.help_doc = "Prints the CREATE TABLE, initial-data and CREATE INDEX SQL statements for the given model module name(s)."
+get_sql_all.args = APP_ARGS
+
+def syncdb():
+    "Creates the database tables for all apps in INSTALLED_APPS whose tables haven't already been created."
+    from django.db import connection, transaction, models, get_creation_module
+    from django.db.models import signals
+    from django.conf import settings
+    from django.dispatch import dispatcher
+
+    disable_termcolors()
+
+    # First, try validating the models.
+    _check_for_validation_errors()
+
+    # Import the 'management' module within each installed app, to register
+    # dispatcher events.
+    for app_name in settings.INSTALLED_APPS:
+        try:
+            __import__(app_name + '.management', '', '', [''])
+        except ImportError:
+            pass
+
+    data_types = get_creation_module().DATA_TYPES
+
+    cursor = connection.cursor()
+
+    # Get a list of all existing database tables,
+    # so we know what needs to be added.
+    table_list = _get_table_list()
+
+    # Get a list of already installed *models* so that references work right.
+    seen_models = _get_installed_models(table_list)
+    created_models = set()
+    pending_references = {}
+
+    for app in models.get_apps():
+        model_list = models.get_models(app)
+        for model in model_list:
+            # Create the model's database table, if it doesn't already exist.
+            if model._meta.db_table in table_list:
+                continue
+            sql, references = _get_sql_model_create(model, seen_models)
+            seen_models.add(model)
+            created_models.add(model)
+            for refto, refs in references.items():
+                try:
+                    pending_references[refto].extend(refs)
+                except KeyError:
+                    pending_references[refto] = refs
+            sql.extend(_get_sql_for_pending_references(model, pending_references))
+            print "Creating table %s" % model._meta.db_table
+            for statement in sql:
+                cursor.execute(statement)
+            table_list.append(model._meta.db_table)
+
+        for model in model_list:
+            if model in created_models:
+                sql = _get_many_to_many_sql_for_model(model)
+                if sql:
+                    print "Creating many-to-many tables for %s model" % model.__name__
+                    for statement in sql:
+                        cursor.execute(statement)
+
+        transaction.commit_unless_managed()
+
+    # Send the post_syncdb signal, so individual apps can do whatever they need
+    # to do at this point.
+    for app in models.get_apps():
+        dispatcher.send(signal=signals.post_syncdb, sender=app,
+            app=app, created_models=created_models)
+
+        # Install initial data for the app (but only if this is a model we've
+        # just created)
+        for model in models.get_models(app):
+            if model in created_models:
+                initial_sql = get_sql_initial_data_for_model(model)
+                if initial_sql:
+                    print "Installing initial data for %s model" % model._meta.object_name
+                    try:
+                        for sql in initial_sql:
+                            cursor.execute(sql)
+                    except Exception, e:
+                        sys.stderr.write("Failed to install initial SQL data for %s model: %s" % \
+                                            (model._meta.object_name, e))
+                        transaction.rollback_unless_managed()
+                    else:
+                        transaction.commit_unless_managed()
+
+syncdb.args = ''
+
+def get_admin_index(app):
+    "Returns admin-index template snippet (in list form) for the given app."
+    from django.utils.text import capfirst
+    from django.db.models import get_models
+    output = []
+    app_models = get_models(app)
+    app_label = app_models[0]._meta.app_label
+    output.append('{%% if perms.%s %%}' % app_label)
+    output.append('<div class="module"><h2>%s</h2><table>' % app_label.title())
+    for model in app_models:
+        if model._meta.admin:
+            output.append(MODULE_TEMPLATE % {
+                'app': app_label,
+                'mod': model._meta.module_name,
+                'name': capfirst(model._meta.verbose_name_plural),
+                'addperm': model._meta.get_add_permission(),
+                'changeperm': model._meta.get_change_permission(),
+            })
+    output.append('</table></div>')
+    output.append('{% endif %}')
+    return output
+get_admin_index.help_doc = "Prints the admin-index template snippet for the given app name(s)."
+get_admin_index.args = APP_ARGS
+
+def _module_to_dict(module, omittable=lambda k: k.startswith('_')):
+    "Converts a module namespace to a Python dictionary. Used by get_settings_diff."
+    return dict([(k, repr(v)) for k, v in module.__dict__.items() if not omittable(k)])
+
+def diffsettings():
+    """
+    Displays differences between the current settings.py and Django's
+    default settings. Settings that don't appear in the defaults are
+    followed by "###".
+    """
+    # Inspired by Postfix's "postconf -n".
+    from django.conf import settings, global_settings
+
+    user_settings = _module_to_dict(settings)
+    default_settings = _module_to_dict(global_settings)
+
+    output = []
+    keys = user_settings.keys()
+    keys.sort()
+    for key in keys:
+        if key not in default_settings:
+            output.append("%s = %s  ###" % (key, user_settings[key]))
+        elif user_settings[key] != default_settings[key]:
+            output.append("%s = %s" % (key, user_settings[key]))
+    print '\n'.join(output)
+diffsettings.args = ""
+
+def install(app):
+    "Executes the equivalent of 'get_sql_all' in the current database."
+    from django.db import connection, transaction
+
+    app_name = app.__name__.split('.')[-2]
+
+    disable_termcolors()
+
+    # First, try validating the models.
+    _check_for_validation_errors(app)
+
+    sql_list = get_sql_all(app)
+
+    try:
+        cursor = connection.cursor()
+        for sql in sql_list:
+            cursor.execute(sql)
+    except Exception, e:
+        sys.stderr.write(style.ERROR("""Error: %s couldn't be installed. Possible reasons:
+  * The database isn't running or isn't configured correctly.
+  * At least one of the database tables already exists.
+  * The SQL was invalid.
+Hint: Look at the output of 'django-admin.py sqlall %s'. That's the SQL this command wasn't able to run.
+The full error: """ % (app_name, app_name)) + style.ERROR_OUTPUT(str(e)) + '\n')
+        transaction.rollback_unless_managed()
+        sys.exit(1)
+    transaction.commit_unless_managed()
+install.help_doc = "Executes ``sqlall`` for the given app(s) in the current database."
+install.args = APP_ARGS
+
+def reset(app):
+    "Executes the equivalent of 'get_sql_reset' in the current database."
+    from django.db import connection, transaction
+    app_name = app.__name__.split('.')[-2]
+
+    disable_termcolors()
+
+    # First, try validating the models.
+    _check_for_validation_errors(app)
+    sql_list = get_sql_reset(app)
+
+    confirm = raw_input("""
+You have requested a database reset.
+This will IRREVERSIBLY DESTROY any data in your database.
+Are you sure you want to do this?
+
+Type 'yes' to continue, or 'no' to cancel: """)
+    if confirm == 'yes':
+        try:
+            cursor = connection.cursor()
+            for sql in sql_list:
+                cursor.execute(sql)
+        except Exception, e:
+            sys.stderr.write(style.ERROR("""Error: %s couldn't be installed. Possible reasons:
+  * The database isn't running or isn't configured correctly.
+  * At least one of the database tables already exists.
+  * The SQL was invalid.
+Hint: Look at the output of 'django-admin.py sqlreset %s'. That's the SQL this command wasn't able to run.
+The full error: """ % (app_name, app_name)) + style.ERROR_OUTPUT(str(e)) + '\n')
+            transaction.rollback_unless_managed()
+            sys.exit(1)
+        transaction.commit_unless_managed()
+    else:
+        print "Reset cancelled."
+reset.help_doc = "Executes ``sqlreset`` for the given app(s) in the current database."
+reset.args = APP_ARGS
+
+def _start_helper(app_or_project, name, directory, other_name=''):
+    other = {'project': 'app', 'app': 'project'}[app_or_project]
+    if not _is_valid_dir_name(name):
+        sys.stderr.write(style.ERROR("Error: %r is not a valid %s name. Please use only numbers, letters and underscores.\n" % (name, app_or_project)))
+        sys.exit(1)
+    top_dir = os.path.join(directory, name)
+    try:
+        os.mkdir(top_dir)
+    except OSError, e:
+        sys.stderr.write(style.ERROR("Error: %s\n" % e))
+        sys.exit(1)
+    template_dir = PROJECT_TEMPLATE_DIR % app_or_project
+    for d, subdirs, files in os.walk(template_dir):
+        relative_dir = d[len(template_dir)+1:].replace('%s_name' % app_or_project, name)
+        if relative_dir:
+            os.mkdir(os.path.join(top_dir, relative_dir))
+        for i, subdir in enumerate(subdirs):
+            if subdir.startswith('.'):
+                del subdirs[i]
+        for f in files:
+            if f.endswith('.pyc'):
+                continue
+            path_old = os.path.join(d, f)
+            path_new = os.path.join(top_dir, relative_dir, f.replace('%s_name' % app_or_project, name))
+            fp_old = open(path_old, 'r')
+            fp_new = open(path_new, 'w')
+            fp_new.write(fp_old.read().replace('{{ %s_name }}' % app_or_project, name).replace('{{ %s_name }}' % other, other_name))
+            fp_old.close()
+            fp_new.close()
+            shutil.copymode(path_old, path_new)
+
+def startproject(project_name, directory):
+    "Creates a Django project for the given project_name in the given directory."
+    from random import choice
+    if project_name in INVALID_PROJECT_NAMES:
+        sys.stderr.write(style.ERROR("Error: %r isn't a valid project name. Please try another.\n" % project_name))
+        sys.exit(1)
+    _start_helper('project', project_name, directory)
+    # Create a random SECRET_KEY hash, and put it in the main settings.
+    main_settings_file = os.path.join(directory, project_name, 'settings.py')
+    settings_contents = open(main_settings_file, 'r').read()
+    fp = open(main_settings_file, 'w')
+    secret_key = ''.join([choice('abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)])
+    settings_contents = re.sub(r"(?<=SECRET_KEY = ')'", secret_key + "'", settings_contents)
+    fp.write(settings_contents)
+    fp.close()
+startproject.help_doc = "Creates a Django project directory structure for the given project name in the current directory."
+startproject.args = "[projectname]"
+
+def startapp(app_name, directory):
+    "Creates a Django app for the given app_name in the given directory."
+    # Determine the project_name a bit naively -- by looking at the name of
+    # the parent directory.
+    project_dir = os.path.normpath(os.path.join(directory, '..'))
+    project_name = os.path.basename(project_dir)
+    if app_name == os.path.basename(directory):
+        sys.stderr.write(style.ERROR("Error: You cannot create an app with the same name (%r) as your project.\n" % app_name))
+        sys.exit(1)
+    _start_helper('app', app_name, directory, project_name)
+startapp.help_doc = "Creates a Django app directory structure for the given app name in the current directory."
+startapp.args = "[appname]"
+
+def inspectdb():
+    "Generator that introspects the tables in the given database name and returns a Django model, one line at a time."
+    from django.db import connection, get_introspection_module
+    import keyword
+
+    introspection_module = get_introspection_module()
+
+    def table2model(table_name):
+        object_name = table_name.title().replace('_', '')
+        return object_name.endswith('s') and object_name[:-1] or object_name
+
+    cursor = connection.cursor()
+    yield "# This is an auto-generated Django model module."
+    yield "# You'll have to do the following manually to clean this up:"
+    yield "#     * Rearrange models' order"
+    yield "#     * Make sure each model has one field with primary_key=True"
+    yield "# Feel free to rename the models, but don't rename db_table values or field names."
+    yield "#"
+    yield "# Also note: You'll have to insert the output of 'django-admin.py sqlinitialdata [appname]'"
+    yield "# into your database."
+    yield ''
+    yield 'from django.db import models'
+    yield ''
+    for table_name in introspection_module.get_table_list(cursor):
+        yield 'class %s(models.Model):' % table2model(table_name)
+        try:
+            relations = introspection_module.get_relations(cursor, table_name)
+        except NotImplementedError:
+            relations = {}
+        try:
+            indexes = introspection_module.get_indexes(cursor, table_name)
+        except NotImplementedError:
+            indexes = {}
+        for i, row in enumerate(introspection_module.get_table_description(cursor, table_name)):
+            att_name = row[0]
+            comment_notes = [] # Holds Field notes, to be displayed in a Python comment.
+            extra_params = {}  # Holds Field parameters such as 'db_column'.
+
+            if keyword.iskeyword(att_name):
+                extra_params['db_column'] = att_name
+                att_name += '_field'
+                comment_notes.append('Field renamed because it was a Python reserved word.')
+
+            if relations.has_key(i):
+                rel_to = relations[i][1] == table_name and "'self'" or table2model(relations[i][1])
+                field_type = 'ForeignKey(%s' % rel_to
+                if att_name.endswith('_id'):
+                    att_name = att_name[:-3]
+                else:
+                    extra_params['db_column'] = att_name
+            else:
+                try:
+                    field_type = introspection_module.DATA_TYPES_REVERSE[row[1]]
+                except KeyError:
+                    field_type = 'TextField'
+                    comment_notes.append('This field type is a guess.')
+
+                # This is a hook for DATA_TYPES_REVERSE to return a tuple of
+                # (field_type, extra_params_dict).
+                if type(field_type) is tuple:
+                    field_type, new_params = field_type
+                    extra_params.update(new_params)
+
+                # Add maxlength for all CharFields.
+                if field_type == 'CharField' and row[3]:
+                    extra_params['maxlength'] = row[3]
+
+                if field_type == 'FloatField':
+                    extra_params['max_digits'] = row[4]
+                    extra_params['decimal_places'] = row[5]
+
+                # Add primary_key and unique, if necessary.
+                column_name = extra_params.get('db_column', att_name)
+                if column_name in indexes:
+                    if indexes[column_name]['primary_key']:
+                        extra_params['primary_key'] = True
+                    elif indexes[column_name]['unique']:
+                        extra_params['unique'] = True
+
+                field_type += '('
+
+            # Don't output 'id = meta.AutoField(primary_key=True)', because
+            # that's assumed if it doesn't exist.
+            if att_name == 'id' and field_type == 'AutoField(' and extra_params == {'primary_key': True}:
+                continue
+
+            # Add 'null' and 'blank', if the 'null_ok' flag was present in the
+            # table description.
+            if row[6]: # If it's NULL...
+                extra_params['blank'] = True
+                if not field_type in ('TextField(', 'CharField('):
+                    extra_params['null'] = True
+
+            field_desc = '%s = models.%s' % (att_name, field_type)
+            if extra_params:
+                if not field_desc.endswith('('):
+                    field_desc += ', '
+                field_desc += ', '.join(['%s=%r' % (k, v) for k, v in extra_params.items()])
+            field_desc += ')'
+            if comment_notes:
+                field_desc += ' # ' + ' '.join(comment_notes)
+            yield '    %s' % field_desc
+        yield '    class Meta:'
+        yield '        db_table = %r' % table_name
+        yield ''
+inspectdb.help_doc = "Introspects the database tables in the given database and outputs a Django model module."
+inspectdb.args = ""
+
+class ModelErrorCollection:
+    def __init__(self, outfile=sys.stdout):
+        self.errors = []
+        self.outfile = outfile
+
+    def add(self, context, error):
+        self.errors.append((context, error))
+        self.outfile.write(style.ERROR("%s: %s\n" % (context, error)))
+
+def get_validation_errors(outfile, app=None):
+    """
+    Validates all models that are part of the specified app. If no app name is provided,
+    validates all models of all installed apps. Writes errors, if any, to outfile.
+    Returns number of errors.
+    """
+    from django.db import models
+    from django.db.models.loading import get_app_errors
+    from django.db.models.fields.related import RelatedObject
+
+    e = ModelErrorCollection(outfile)
+
+    for (app_name, error) in get_app_errors().items():
+        e.add(app_name, error)
+
+    for cls in models.get_models(app):
+        opts = cls._meta
+
+        # Do field-specific validation.
+        for f in opts.fields:
+            if f.name == 'id' and not f.primary_key and opts.pk.name == 'id':
+                e.add(opts, '"%s": You can\'t use "id" as a field name, because each model automatically gets an "id" field if none of the fields have primary_key=True. You need to either remove/rename your "id" field or add primary_key=True to a field.' % f.name)
+            if isinstance(f, models.CharField) and f.maxlength in (None, 0):
+                e.add(opts, '"%s": CharFields require a "maxlength" attribute.' % f.name)
+            if isinstance(f, models.FloatField):
+                if f.decimal_places is None:
+                    e.add(opts, '"%s": FloatFields require a "decimal_places" attribute.' % f.name)
+                if f.max_digits is None:
+                    e.add(opts, '"%s": FloatFields require a "max_digits" attribute.' % f.name)
+            if isinstance(f, models.FileField) and not f.upload_to:
+                e.add(opts, '"%s": FileFields require an "upload_to" attribute.' % f.name)
+            if isinstance(f, models.ImageField):
+                try:
+                    from PIL import Image
+                except ImportError:
+                    e.add(opts, '"%s": To use ImageFields, you need to install the Python Imaging Library. Get it at http://www.pythonware.com/products/pil/ .' % f.name)
+            if f.prepopulate_from is not None and type(f.prepopulate_from) not in (list, tuple):
+                e.add(opts, '"%s": prepopulate_from should be a list or tuple.' % f.name)
+            if f.choices:
+                if not hasattr(f.choices, '__iter__'):
+                    e.add(opts, '"%s": "choices" should be iterable (e.g., a tuple or list).' % f.name)
+                else:
+                    for c in f.choices:
+                        if not type(c) in (tuple, list) or len(c) != 2:
+                            e.add(opts, '"%s": "choices" should be a sequence of two-tuples.' % f.name)
+            if f.db_index not in (None, True, False):
+                e.add(opts, '"%s": "db_index" should be either None, True or False.' % f.name)
+
+            # Check to see if the related field will clash with any
+            # existing fields, m2m fields, m2m related objects or related objects
+            if f.rel:
+                rel_opts = f.rel.to._meta
+                if f.rel.to not in models.get_models():
+                    e.add(opts, "'%s' has relation with model %s, which has not been installed" % (f.name, rel_opts.object_name))
+
+                rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
+                rel_query_name = f.related_query_name()
+                for r in rel_opts.fields:
+                    if r.name == rel_name:
+                        e.add(opts, "Accessor for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                    if r.name == rel_query_name:
+                        e.add(opts, "Reverse query name for field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                for r in rel_opts.many_to_many:
+                    if r.name == rel_name:
+                        e.add(opts, "Accessor for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                    if r.name == rel_query_name:
+                        e.add(opts, "Reverse query name for field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                for r in rel_opts.get_all_related_many_to_many_objects():
+                    if r.get_accessor_name() == rel_name:
+                        e.add(opts, "Accessor for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                    if r.get_accessor_name() == rel_query_name:
+                        e.add(opts, "Reverse query name for field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                for r in rel_opts.get_all_related_objects():
+                    if r.field is not f:
+                        if r.get_accessor_name() == rel_name:
+                            e.add(opts, "Accessor for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                        if r.get_accessor_name() == rel_query_name:
+                            e.add(opts, "Reverse query name for field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+
+
+        for i, f in enumerate(opts.many_to_many):
+            # Check to see if the related m2m field will clash with any
+            # existing fields, m2m fields, m2m related objects or related objects
+            rel_opts = f.rel.to._meta
+            if f.rel.to not in models.get_models():
+                e.add(opts, "'%s' has m2m relation with model %s, which has not been installed" % (f.name, rel_opts.object_name))
+
+            rel_name = RelatedObject(f.rel.to, cls, f).get_accessor_name()
+            rel_query_name = f.related_query_name()
+            for r in rel_opts.fields:
+                if r.name == rel_name:
+                    e.add(opts, "Accessor for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                if r.name == rel_query_name:
+                    e.add(opts, "Reverse query name for m2m field '%s' clashes with field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+            for r in rel_opts.many_to_many:
+                if r.name == rel_name:
+                    e.add(opts, "Accessor for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+                if r.name == rel_query_name:
+                    e.add(opts, "Reverse query name for m2m field '%s' clashes with m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.name, f.name))
+            for r in rel_opts.get_all_related_many_to_many_objects():
+                if r.field is not f:
+                    if r.get_accessor_name() == rel_name:
+                        e.add(opts, "Accessor for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                    if r.get_accessor_name() == rel_query_name:
+                        e.add(opts, "Reverse query name for m2m field '%s' clashes with related m2m field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+            for r in rel_opts.get_all_related_objects():
+                if r.get_accessor_name() == rel_name:
+                    e.add(opts, "Accessor for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+                if r.get_accessor_name() == rel_query_name:
+                    e.add(opts, "Reverse query name for m2m field '%s' clashes with related field '%s.%s'. Add a related_name argument to the definition for '%s'." % (f.name, rel_opts.object_name, r.get_accessor_name(), f.name))
+
+        # Check admin attribute.
+        if opts.admin is not None:
+            if not isinstance(opts.admin, models.AdminOptions):
+                e.add(opts, '"admin" attribute, if given, must be set to a models.AdminOptions() instance.')
+            else:
+                # list_display
+                if not isinstance(opts.admin.list_display, (list, tuple)):
+                    e.add(opts, '"admin.list_display", if given, must be set to a list or tuple.')
+                else:
+                    for fn in opts.admin.list_display:
+                        try:
+                            f = opts.get_field(fn)
+                        except models.FieldDoesNotExist:
+                            if not hasattr(cls, fn):
+                                e.add(opts, '"admin.list_display" refers to %r, which isn\'t an attribute, method or property.' % fn)
+                        else:
+                            if isinstance(f, models.ManyToManyField):
+                                e.add(opts, '"admin.list_display" doesn\'t support ManyToManyFields (%r).' % fn)
+                # list_display_links
+                if opts.admin.list_display_links and not opts.admin.list_display:
+                    e.add(opts, '"admin.list_display" must be defined for "admin.list_display_links" to be used.')
+                if not isinstance(opts.admin.list_display_links, (list, tuple)):
+                    e.add(opts, '"admin.list_display_links", if given, must be set to a list or tuple.')
+                else:
+                    for fn in opts.admin.list_display_links:
+                        try:
+                            f = opts.get_field(fn)
+                        except models.FieldDoesNotExist:
+                            e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn)
+                        if fn not in opts.admin.list_display:
+                            e.add(opts, '"admin.list_display_links" refers to %r, which is not defined in "admin.list_display".' % fn)
+                # list_filter
+                if not isinstance(opts.admin.list_filter, (list, tuple)):
+                    e.add(opts, '"admin.list_filter", if given, must be set to a list or tuple.')
+                else:
+                    for fn in opts.admin.list_filter:
+                        try:
+                            f = opts.get_field(fn)
+                        except models.FieldDoesNotExist:
+                            e.add(opts, '"admin.list_filter" refers to %r, which isn\'t a field.' % fn)
+
+        # Check ordering attribute.
+        if opts.ordering:
+            for field_name in opts.ordering:
+                if field_name == '?': continue
+                if field_name.startswith('-'):
+                    field_name = field_name[1:]
+                if opts.order_with_respect_to and field_name == '_order':
+                    continue
+                if '.' in field_name: continue # Skip ordering in the format 'table.field'.
+                try:
+                    opts.get_field(field_name, many_to_many=False)
+                except models.FieldDoesNotExist:
+                    e.add(opts, '"ordering" refers to "%s", a field that doesn\'t exist.' % field_name)
+
+        # Check core=True, if needed.
+        for related in opts.get_followed_related_objects():
+            if not related.edit_inline:
+                continue
+            try:
+                for f in related.opts.fields:
+                    if f.core:
+                        raise StopIteration
+                e.add(related.opts, "At least one field in %s should have core=True, because it's being edited inline by %s.%s." % (related.opts.object_name, opts.module_name, opts.object_name))
+            except StopIteration:
+                pass
+
+        # Check unique_together.
+        for ut in opts.unique_together:
+            for field_name in ut:
+                try:
+                    f = opts.get_field(field_name, many_to_many=True)
+                except models.FieldDoesNotExist:
+                    e.add(opts, '"unique_together" refers to %s, a field that doesn\'t exist. Check your syntax.' % field_name)
+                else:
+                    if isinstance(f.rel, models.ManyToManyRel):
+                        e.add(opts, '"unique_together" refers to %s. ManyToManyFields are not supported in unique_together.' % f.name)
+
+    return len(e.errors)
+
+def validate(outfile=sys.stdout):
+    "Validates all installed models."
+    try:
+        num_errors = get_validation_errors(outfile)
+        outfile.write('%s error%s found.\n' % (num_errors, num_errors != 1 and 's' or ''))
+    except ImproperlyConfigured:
+        outfile.write("Skipping validation because things aren't configured properly.")
+validate.args = ''
+
+def _check_for_validation_errors(app=None):
+    """Check that an app has no validation errors, and exit with errors if it does."""
+    try:
+        from cStringIO import StringIO
+    except ImportError:
+        from StringIO import StringIO
+    s = StringIO()
+    num_errors = get_validation_errors(s, app)
+    if num_errors:
+        if app:
+            sys.stderr.write(style.ERROR("Error: %s couldn't be installed, because there were errors in your model:\n" % app))
+        else:
+            sys.stderr.write(style.ERROR("Error: Couldn't install apps, because there were errors in one or more models:\n"))
+        s.seek(0)
+        sys.stderr.write(s.read())
+        sys.exit(1)
+
+def runserver(addr, port, use_reloader=True):
+    "Starts a lightweight Web server for development."
+    from django.core.servers.basehttp import run, AdminMediaHandler, WSGIServerException
+    from django.core.handlers.wsgi import WSGIHandler
+    if not addr:
+        addr = '127.0.0.1'
+    if not port.isdigit():
+        sys.stderr.write(style.ERROR("Error: %r is not a valid port number.\n" % port))
+        sys.exit(1)
+    quit_command = sys.platform == 'win32' and 'CTRL-BREAK' or 'CONTROL-C'
+    def inner_run():
+        from django.conf import settings
+        print "Validating models..."
+        validate()
+        print "\nDjango version %s, using settings %r" % (get_version(), settings.SETTINGS_MODULE)
+        print "Development server is running at http://%s:%s/" % (addr, port)
+        print "Quit the server with %s." % quit_command
+        try:
+            run(addr, int(port), AdminMediaHandler(WSGIHandler()))
+        except WSGIServerException, e:
+            # Use helpful error messages instead of ugly tracebacks.
+            ERRORS = {
+                13: "You don't have permission to access that port.",
+                98: "That port is already in use.",
+                99: "That IP address can't be assigned-to.",
+            }
+            try:
+                error_text = ERRORS[e.args[0].args[0]]
+            except (AttributeError, KeyError):
+                error_text = str(e)
+            sys.stderr.write(style.ERROR("Error: %s" % error_text) + '\n')
+            sys.exit(1)
+        except KeyboardInterrupt:
+            sys.exit(0)
+    if use_reloader:
+        from django.utils import autoreload
+        autoreload.main(inner_run)
+    else:
+        inner_run()
+runserver.args = '[--noreload] [optional port number, or ipaddr:port]'
+
+def createcachetable(tablename):
+    "Creates the table needed to use the SQL cache backend"
+    from django.db import backend, connection, transaction, get_creation_module, models
+    data_types = get_creation_module().DATA_TYPES
+    fields = (
+        # "key" is a reserved word in MySQL, so use "cache_key" instead.
+        models.CharField(name='cache_key', maxlength=255, unique=True, primary_key=True),
+        models.TextField(name='value'),
+        models.DateTimeField(name='expires', db_index=True),
+    )
+    table_output = []
+    index_output = []
+    for f in fields:
+        field_output = [backend.quote_name(f.name), data_types[f.get_internal_type()] % f.__dict__]
+        field_output.append("%sNULL" % (not f.null and "NOT " or ""))
+        if f.unique:
+            field_output.append("UNIQUE")
+        if f.primary_key:
+            field_output.append("PRIMARY KEY")
+        if f.db_index:
+            unique = f.unique and "UNIQUE " or ""
+            index_output.append("CREATE %sINDEX %s_%s ON %s (%s);" % \
+                (unique, tablename, f.name, backend.quote_name(tablename),
+                backend.quote_name(f.name)))
+        table_output.append(" ".join(field_output))
+    full_statement = ["CREATE TABLE %s (" % backend.quote_name(tablename)]
+    for i, line in enumerate(table_output):
+        full_statement.append('    %s%s' % (line, i < len(table_output)-1 and ',' or ''))
+    full_statement.append(');')
+    curs = connection.cursor()
+    curs.execute("\n".join(full_statement))
+    for statement in index_output:
+        curs.execute(statement)
+    transaction.commit_unless_managed()
+createcachetable.args = "[tablename]"
+
+def run_shell(use_plain=False):
+    "Runs a Python interactive interpreter. Tries to use IPython, if it's available."
+    try:
+        if use_plain:
+            # Don't bother loading IPython, because the user wants plain Python.
+            raise ImportError
+        import IPython
+        # Explicitly pass an empty list as arguments, because otherwise IPython
+        # would use sys.argv from this script.
+        shell = IPython.Shell.IPShell(argv=[])
+        shell.mainloop()
+    except ImportError:
+        import code
+        try: # Try activating rlcompleter, because it's handy.
+            import readline
+        except ImportError:
+            pass
+        else:
+            # We don't have to wrap the following import in a 'try', because
+            # we already know 'readline' was imported successfully.
+            import rlcompleter
+            readline.parse_and_bind("tab:complete")
+        code.interact()
+run_shell.args = '[--plain]'
+
+def dbshell():
+    "Runs the command-line client for the current DATABASE_ENGINE."
+    from django.db import runshell
+    runshell()
+dbshell.args = ""
+
+def runfcgi(args):
+    """Run this project as a FastCGI application. requires flup."""
+    from django.core.servers.fastcgi import runfastcgi
+    runfastcgi(args)
+runfcgi.args = '[various KEY=val options, use `runfcgi help` for help]'
+
+# Utilities for command-line script
+
+DEFAULT_ACTION_MAPPING = {
+    'adminindex': get_admin_index,
+    'createcachetable' : createcachetable,
+    'dbshell': dbshell,
+    'diffsettings': diffsettings,
+    'inspectdb': inspectdb,
+    'install': install,
+    'reset': reset,
+    'runfcgi': runfcgi,
+    'runserver': runserver,
+    'shell': run_shell,
+    'sql': get_sql_create,
+    'sqlall': get_sql_all,
+    'sqlclear': get_sql_delete,
+    'sqlindexes': get_sql_indexes,
+    'sqlinitialdata': get_sql_initial_data,
+    'sqlreset': get_sql_reset,
+    'sqlsequencereset': get_sql_sequence_reset,
+    'startapp': startapp,
+    'startproject': startproject,
+    'syncdb': syncdb,
+    'validate': validate,
+}
+
+NO_SQL_TRANSACTION = (
+    'adminindex',
+    'createcachetable',
+    'dbshell',
+    'diffsettings',
+    'install',
+    'reset',
+    'sqlindexes',
+    'syncdb',
+)
+
+class DjangoOptionParser(OptionParser):
+    def print_usage_and_exit(self):
+        self.print_help(sys.stderr)
+        sys.exit(1)
+
+def get_usage(action_mapping):
+    """
+    Returns a usage string. Doesn't do the options stuff, because optparse
+    takes care of that.
+    """
+    usage = ["%prog action [options]\nactions:"]
+    available_actions = action_mapping.keys()
+    available_actions.sort()
+    for a in available_actions:
+        func = action_mapping[a]
+        usage.append("  %s %s" % (a, func.args))
+        usage.extend(textwrap.wrap(getattr(func, 'help_doc', textwrap.dedent(func.__doc__.strip())), initial_indent='    ', subsequent_indent='    '))
+        usage.append("")
+    return '\n'.join(usage[:-1]) # Cut off last list element, an empty space.
+
+def print_error(msg, cmd):
+    sys.stderr.write(style.ERROR('Error: %s' % msg) + '\nRun "%s --help" for help.\n' % cmd)
+    sys.exit(1)
+
+def execute_from_command_line(action_mapping=DEFAULT_ACTION_MAPPING, argv=None):
+    # Use sys.argv if we've not passed in a custom argv
+    if argv is None:
+        argv = sys.argv
+
+    # Parse the command-line arguments. optparse handles the dirty work.
+    parser = DjangoOptionParser(usage=get_usage(action_mapping), version=get_version())
+    parser.add_option('--settings',
+        help='Python path to settings module, e.g. "myproject.settings.main". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.')
+    parser.add_option('--pythonpath',
+        help='Lets you manually add a directory the Python path, e.g. "/home/djangoprojects/myproject".')
+    parser.add_option('--plain', action='store_true', dest='plain',
+        help='Tells Django to use plain Python, not IPython, for "shell" command.')
+    parser.add_option('--noreload', action='store_false', dest='use_reloader', default=True,
+        help='Tells Django to NOT use the auto-reloader when running the development server.')
+    options, args = parser.parse_args(argv[1:])
+
+    # Take care of options.
+    if options.settings:
+        os.environ['DJANGO_SETTINGS_MODULE'] = options.settings
+    if options.pythonpath:
+        sys.path.insert(0, options.pythonpath)
+
+    # Run the appropriate action. Unfortunately, optparse can't handle
+    # positional arguments, so this has to parse/validate them.
+    try:
+        action = args[0]
+    except IndexError:
+        parser.print_usage_and_exit()
+    if not action_mapping.has_key(action):
+        print_error("Your action, %r, was invalid." % action, argv[0])
+
+    # Switch to English, because django-admin.py creates database content
+    # like permissions, and those shouldn't contain any translations.
+    # But only do this if we should have a working settings file.
+    if action not in ('startproject', 'startapp'):
+        from django.utils import translation
+        translation.activate('en-us')
+
+    if action == 'shell':
+        action_mapping[action](options.plain is True)
+    elif action in ('syncdb', 'validate', 'diffsettings', 'dbshell'):
+        action_mapping[action]()
+    elif action == 'inspectdb':
+        try:
+            for line in action_mapping[action]():
+                print line
+        except NotImplementedError:
+            sys.stderr.write(style.ERROR("Error: %r isn't supported for the currently selected database backend.\n" % action))
+            sys.exit(1)
+    elif action == 'createcachetable':
+        try:
+            action_mapping[action](args[1])
+        except IndexError:
+            parser.print_usage_and_exit()
+    elif action in ('startapp', 'startproject'):
+        try:
+            name = args[1]
+        except IndexError:
+            parser.print_usage_and_exit()
+        action_mapping[action](name, os.getcwd())
+    elif action == 'runserver':
+        if len(args) < 2:
+            addr = ''
+            port = '8000'
+        else:
+            try:
+                addr, port = args[1].split(':')
+            except ValueError:
+                addr, port = '', args[1]
+        action_mapping[action](addr, port, options.use_reloader)
+    elif action == 'runfcgi':
+        action_mapping[action](args[1:])
+    else:
+        from django.db import models
+        try:
+            mod_list = [models.get_app(app_label) for app_label in args[1:]]
+        except ImportError, e:
+            sys.stderr.write(style.ERROR("Error: %s. Are you sure your INSTALLED_APPS setting is correct?\n" % e))
+            sys.exit(1)
+        if not mod_list:
+            parser.print_usage_and_exit()
+        if action not in NO_SQL_TRANSACTION:
+            print style.SQL_KEYWORD("BEGIN;")
+        for mod in mod_list:
+            output = action_mapping[action](mod)
+            if output:
+                print '\n'.join(output)
+        if action not in NO_SQL_TRANSACTION:
+            print style.SQL_KEYWORD("COMMIT;")
+
+def execute_manager(settings_mod, argv=None):
+    # Add this project to sys.path so that it's importable in the conventional
+    # way. For example, if this file (manage.py) lives in a directory
+    # "myproject", this code would add "/path/to/myproject" to sys.path.
+    project_directory = os.path.dirname(settings_mod.__file__)
+    project_name = os.path.basename(project_directory)
+    sys.path.append(os.path.join(project_directory, '..'))
+    project_module = __import__(project_name, '', '', [''])
+    sys.path.pop()
+
+    # Set DJANGO_SETTINGS_MODULE appropriately.
+    os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % project_name
+
+    action_mapping = DEFAULT_ACTION_MAPPING.copy()
+
+    # Remove the "startproject" command from the action_mapping, because that's
+    # a django-admin.py command, not a manage.py command.
+    del action_mapping['startproject']
+
+    # Override the startapp handler so that it always uses the
+    # project_directory, not the current working directory (which is default).
+    action_mapping['startapp'] = lambda app_name, directory: startapp(app_name, project_directory)
+    action_mapping['startapp'].__doc__ = startapp.__doc__
+    action_mapping['startapp'].help_doc = startapp.help_doc
+    action_mapping['startapp'].args = startapp.args
+
+    # Run the django-admin.py command.
+    execute_from_command_line(action_mapping, argv)

Added: vendor/django/current/django/core/paginator.py
===================================================================
--- vendor/django/current/django/core/paginator.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/paginator.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,87 @@
+from math import ceil
+
+class InvalidPage(Exception):
+    pass
+
+class ObjectPaginator(object):
+    """
+    This class makes pagination easy. Feed it a QuerySet, plus the number of
+    objects you want on each page. Then read the hits and pages properties to
+    see how many pages it involves. Call get_page with a page number (starting
+    at 0) to get back a list of objects for that page.
+
+    Finally, check if a page number has a next/prev page using
+    has_next_page(page_number) and has_previous_page(page_number).
+    """
+    def __init__(self, query_set, num_per_page):
+        self.query_set = query_set
+        self.num_per_page = num_per_page
+        self._hits, self._pages = None, None
+        self._has_next = {} # Caches page_number -> has_next_boolean
+
+    def get_page(self, page_number):
+        try:
+            page_number = int(page_number)
+        except ValueError:
+            raise InvalidPage
+        if page_number < 0:
+            raise InvalidPage
+
+        # Retrieve one extra record, and check for the existence of that extra
+        # record to determine whether there's a next page.
+        limit = self.num_per_page + 1
+        offset = page_number * self.num_per_page
+
+        object_list = list(self.query_set[offset:offset+limit])
+
+        if not object_list:
+            raise InvalidPage
+
+        self._has_next[page_number] = (len(object_list) > self.num_per_page)
+        return object_list[:self.num_per_page]
+
+    def has_next_page(self, page_number):
+        "Does page $page_number have a 'next' page?"
+        if not self._has_next.has_key(page_number):
+            if self._pages is None:
+                offset = (page_number + 1) * self.num_per_page
+                self._has_next[page_number] = len(self.query_set[offset:offset+1]) > 0
+            else:
+                self._has_next[page_number] = page_number < (self.pages - 1)
+        return self._has_next[page_number]
+
+    def has_previous_page(self, page_number):
+        return page_number > 0
+
+    def first_on_page(self, page_number):
+        """
+        Returns the 1-based index of the first object on the given page,
+        relative to total objects found (hits).
+        """
+        if page_number == 0:
+            return 1
+        return (self.num_per_page * page_number) + 1
+
+    def last_on_page(self, page_number):
+        """
+        Returns the 1-based index of the last object on the given page,
+        relative to total objects found (hits).
+        """
+        if page_number == 0 and self.num_per_page >= self._hits:
+            return self._hits
+        elif page_number == (self._pages - 1) and (page_number + 1) * self.num_per_page > self._hits:
+            return self._hits
+        return (page_number + 1) * self.num_per_page
+
+    def _get_hits(self):
+        if self._hits is None:
+            self._hits = self.query_set.count()
+        return self._hits
+
+    def _get_pages(self):
+        if self._pages is None:
+            self._pages = int(ceil(self.hits / float(self.num_per_page)))
+        return self._pages
+
+    hits = property(_get_hits)
+    pages = property(_get_pages)

Added: vendor/django/current/django/core/serializers/__init__.py
===================================================================
--- vendor/django/current/django/core/serializers/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/serializers/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,78 @@
+"""
+Interfaces for serializing Django objects.
+
+Usage::
+
+    >>> from django.core import serializers
+    >>> json = serializers.serialize("json", some_query_set)
+    >>> objects = list(serializers.deserialize("json", json))
+        
+To add your own serializers, use the SERIALIZATION_MODULES setting::
+
+    SERIALIZATION_MODULES = {
+        "csv" : "path.to.csv.serializer",
+        "txt" : "path.to.txt.serializer",
+    }
+
+"""
+
+from django.conf import settings
+
+# Built-in serializers
+BUILTIN_SERIALIZERS = {
+    "xml"    : "django.core.serializers.xml_serializer",
+    "python" : "django.core.serializers.python",
+    "json"   : "django.core.serializers.json",
+}
+
+_serializers = {}
+        
+def register_serializer(format, serializer_module):
+    """Register a new serializer by passing in a module name."""
+    module = __import__(serializer_module, '', '', [''])
+    _serializers[format] = module
+    
+def unregister_serializer(format):
+    """Unregister a given serializer"""
+    del _serializers[format]
+    
+def get_serializer(format):
+    if not _serializers:
+        _load_serializers()
+    return _serializers[format].Serializer
+    
+def get_deserializer(format):
+    if not _serializers:
+        _load_serializers()
+    return _serializers[format].Deserializer
+    
+def serialize(format, queryset, **options):
+    """
+    Serialize a queryset (or any iterator that returns database objects) using
+    a certain serializer.
+    """
+    s = get_serializer(format)()
+    s.serialize(queryset, **options)
+    return s.getvalue()
+
+def deserialize(format, stream_or_string):
+    """
+    Deserialize a stream or a string. Returns an iterator that yields ``(obj,
+    m2m_relation_dict)``, where ``obj`` is a instantiated -- but *unsaved* --
+    object, and ``m2m_relation_dict`` is a dictionary of ``{m2m_field_name :
+    list_of_related_objects}``.
+    """
+    d = get_deserializer(format)
+    return d(stream_or_string)
+
+def _load_serializers():
+    """
+    Register built-in and settings-defined serializers. This is done lazily so
+    that user code has a chance to (e.g.) set up custom settings without
+    needing to be careful of import order.
+    """
+    for format in BUILTIN_SERIALIZERS:
+        register_serializer(format, BUILTIN_SERIALIZERS[format])
+    if hasattr(settings, "SERIALIZATION_MODULES"):
+        for format in settings.SERIALIZATION_MODULES:
+            register_serializer(format, settings.SERIALIZATION_MODULES[format])
\ No newline at end of file

Added: vendor/django/current/django/core/serializers/base.py
===================================================================
--- vendor/django/current/django/core/serializers/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/serializers/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,161 @@
+"""
+Module for abstract serializer/unserializer base classes.
+"""
+
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+from django.db import models
+
+class SerializationError(Exception):
+    """Something bad happened during serialization."""
+    pass
+    
+class DeserializationError(Exception):
+    """Something bad happened during deserialization."""
+    pass
+
+class Serializer(object):
+    """
+    Abstract serializer base class.
+    """
+    
+    def serialize(self, queryset, **options):
+        """
+        Serialize a queryset.
+        """
+        self.options = options
+        
+        self.stream = options.get("stream", StringIO())
+        
+        self.start_serialization()
+        for obj in queryset:
+            self.start_object(obj)
+            for field in obj._meta.fields:
+                if field is obj._meta.pk:
+                    continue
+                elif field.rel is None:
+                    self.handle_field(obj, field)
+                else:
+                    self.handle_fk_field(obj, field)
+            for field in obj._meta.many_to_many:
+                self.handle_m2m_field(obj, field)
+            self.end_object(obj)
+        self.end_serialization()
+        return self.getvalue()
+    
+    def get_string_value(self, obj, field):
+        """
+        Convert a field's value to a string.
+        """
+        if isinstance(field, models.DateTimeField):
+            value = getattr(obj, field.name).strftime("%Y-%m-%d %H:%M:%S")
+        elif isinstance(field, models.FileField):
+            value = getattr(obj, "get_%s_url" % field.name, lambda: None)()
+        else:
+            value = field.flatten_data(follow=None, obj=obj).get(field.name, "")
+        return str(value)
+    
+    def start_serialization(self):
+        """
+        Called when serializing of the queryset starts.
+        """
+        raise NotImplementedError
+    
+    def end_serialization(self):
+        """
+        Called when serializing of the queryset ends.
+        """
+        pass
+    
+    def start_object(self, obj):
+        """
+        Called when serializing of an object starts.
+        """
+        raise NotImplementedError
+    
+    def end_object(self, obj):
+        """
+        Called when serializing of an object ends.
+        """
+        pass
+    
+    def handle_field(self, obj, field):
+        """
+        Called to handle each individual (non-relational) field on an object.
+        """
+        raise NotImplementedError
+    
+    def handle_fk_field(self, obj, field):
+        """
+        Called to handle a ForeignKey field.
+        """
+        raise NotImplementedError
+    
+    def handle_m2m_field(self, obj, field):
+        """
+        Called to handle a ManyToManyField.
+        """
+        raise NotImplementedError
+    
+    def getvalue(self):
+        """
+        Return the fully serialized queryset.
+        """
+        return self.stream.getvalue()
+
+class Deserializer(object):
+    """
+    Abstract base deserializer class.
+    """
+    
+    def __init__(self, stream_or_string, **options):
+        """
+        Init this serializer given a stream or a string
+        """
+        self.options = options
+        if isinstance(stream_or_string, basestring):
+            self.stream = StringIO(stream_or_string)
+        else:
+            self.stream = stream_or_string
+        # hack to make sure that the models have all been loaded before
+        # deserialization starts (otherwise subclass calls to get_model()
+        # and friends might fail...)
+        models.get_apps()
+    
+    def __iter__(self):
+        return self
+    
+    def next(self):
+        """Iteration iterface -- return the next item in the stream"""
+        raise NotImplementedError
+        
+class DeserializedObject(object):
+    """
+    A deserialzed model.
+    
+    Basically a container for holding the pre-saved deserialized data along
+    with the many-to-many data saved with the object.
+    
+    Call ``save()`` to save the object (with the many-to-many data) to the
+    database; call ``save(save_m2m=False)`` to save just the object fields
+    (and not touch the many-to-many stuff.)
+    """
+    
+    def __init__(self, obj, m2m_data=None):
+        self.object = obj
+        self.m2m_data = m2m_data
+        
+    def __repr__(self):
+        return "<DeserializedObject: %s>" % str(self.object)
+        
+    def save(self, save_m2m=True):
+        self.object.save()
+        if self.m2m_data and save_m2m:
+            for accessor_name, object_list in self.m2m_data.items():
+                setattr(self.object, accessor_name, object_list)
+        
+        # prevent a second (possibly accidental) call to save() from saving 
+        # the m2m data twice.
+        self.m2m_data = None

Added: vendor/django/current/django/core/serializers/json.py
===================================================================
--- vendor/django/current/django/core/serializers/json.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/serializers/json.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,51 @@
+"""
+Serialize data to/from JSON
+"""
+
+import datetime
+from django.utils import simplejson
+from django.core.serializers.python import Serializer as PythonSerializer
+from django.core.serializers.python import Deserializer as PythonDeserializer
+try:
+    from cStringIO import StringIO
+except ImportError:
+    from StringIO import StringIO
+
+class Serializer(PythonSerializer):
+    """
+    Convert a queryset to JSON.
+    """
+    def end_serialization(self):
+        simplejson.dump(self.objects, self.stream, cls=DateTimeAwareJSONEncoder)
+        
+    def getvalue(self):
+        return self.stream.getvalue()
+
+def Deserializer(stream_or_string, **options):
+    """
+    Deserialize a stream or string of JSON data.
+    """
+    if isinstance(stream_or_string, basestring):
+        stream = StringIO(stream_or_string)
+    else:
+        stream = stream_or_string
+    for obj in PythonDeserializer(simplejson.load(stream)):
+        yield obj
+        
+class DateTimeAwareJSONEncoder(simplejson.JSONEncoder):
+    """
+    JSONEncoder subclass that knows how to encode date/time types
+    """
+    
+    DATE_FORMAT = "%Y-%m-%d" 
+    TIME_FORMAT = "%H:%M:%S"
+    
+    def default(self, o):
+        if isinstance(o, datetime.date):
+            return o.strftime(self.DATE_FORMAT)
+        elif isinstance(o, datetime.time):
+            return o.strftime(self.TIME_FORMAT)
+        elif isinstance(o, datetime.datetime):
+            return o.strftime("%s %s" % (self.DATE_FORMAT, self.TIME_FORMAT))
+        else:
+            return super(self, DateTimeAwareJSONEncoder).default(o)
\ No newline at end of file

Added: vendor/django/current/django/core/serializers/python.py
===================================================================
--- vendor/django/current/django/core/serializers/python.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/serializers/python.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,101 @@
+"""
+A Python "serializer". Doesn't do much serializing per se -- just converts to
+and from basic Python data types (lists, dicts, strings, etc.). Useful as a basis for
+other serializers.
+"""
+
+from django.conf import settings
+from django.core.serializers import base
+from django.db import models
+
+class Serializer(base.Serializer):
+    """
+    Serializes a QuerySet to basic Python objects.
+    """
+    
+    def start_serialization(self):
+        self._current = None
+        self.objects = []
+        
+    def end_serialization(self):
+        pass
+        
+    def start_object(self, obj):
+        self._current = {}
+        
+    def end_object(self, obj):
+        self.objects.append({
+            "model"  : str(obj._meta),
+            "pk"     : str(obj._get_pk_val()),
+            "fields" : self._current
+        })
+        self._current = None
+        
+    def handle_field(self, obj, field):
+        self._current[field.name] = getattr(obj, field.name)
+        
+    def handle_fk_field(self, obj, field):
+        related = getattr(obj, field.name)
+        if related is not None:
+            related = related._get_pk_val()
+        self._current[field.name] = related
+    
+    def handle_m2m_field(self, obj, field):
+        self._current[field.name] = [related._get_pk_val() for related in getattr(obj, field.name).iterator()]
+    
+    def getvalue(self):
+        return self.objects
+
+def Deserializer(object_list, **options):
+    """
+    Deserialize simple Python objects back into Django ORM instances.
+    
+    It's expected that you pass the Python objects themselves (instead of a
+    stream or a string) to the constructor
+    """
+    models.get_apps()
+    for d in object_list:
+        # Look up the model and starting build a dict of data for it.
+        Model = _get_model(d["model"])
+        data = {Model._meta.pk.name : d["pk"]}
+        m2m_data = {}
+        
+        # Handle each field
+        for (field_name, field_value) in d["fields"].iteritems():
+            if isinstance(field_value, unicode):
+                field_value = field_value.encode(options.get("encoding", settings.DEFAULT_CHARSET))
+                
+            field = Model._meta.get_field(field_name)
+            
+            # Handle M2M relations (with in_bulk() for performance)
+            if field.rel and isinstance(field.rel, models.ManyToManyRel):
+                pks = []
+                for pk in field_value:
+                    if isinstance(pk, unicode):
+                        pk = pk.encode(options.get("encoding", settings.DEFAULT_CHARSET))
+                m2m_data[field.name] = field.rel.to._default_manager.in_bulk(field_value).values()
+                
+            # Handle FK fields
+            elif field.rel and isinstance(field.rel, models.ManyToOneRel):
+                try:
+                    data[field.name] = field.rel.to._default_manager.get(pk=field_value)
+                except field.rel.to.DoesNotExist:
+                    data[field.name] = None
+                    
+            # Handle all other fields
+            else:
+                data[field.name] = field.to_python(field_value)
+                
+        yield base.DeserializedObject(Model(**data), m2m_data)
+
+def _get_model(model_identifier):
+    """
+    Helper to look up a model from an "app_label.module_name" string.
+    """
+    try:
+        Model = models.get_model(*model_identifier.split("."))
+    except TypeError:
+        Model = None
+    if Model is None:
+        raise base.DeserializationError("Invalid model identifier: '%s'" % model_identifier)
+    return Model

Added: vendor/django/current/django/core/serializers/xml_serializer.py
===================================================================
--- vendor/django/current/django/core/serializers/xml_serializer.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/serializers/xml_serializer.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,217 @@
+"""
+XML serializer.
+"""
+
+from django.conf import settings
+from django.core.serializers import base
+from django.db import models
+from django.utils.xmlutils import SimplerXMLGenerator
+from xml.dom import pulldom
+
+class Serializer(base.Serializer):
+    """
+    Serializes a QuerySet to XML.
+    """
+    
+    def start_serialization(self):
+        """
+        Start serialization -- open the XML document and the root element.
+        """
+        self.xml = SimplerXMLGenerator(self.stream, self.options.get("encoding", settings.DEFAULT_CHARSET))
+        self.xml.startDocument()
+        self.xml.startElement("django-objects", {"version" : "1.0"})
+        
+    def end_serialization(self):
+        """
+        End serialization -- end the document.
+        """
+        self.xml.endElement("django-objects")
+        self.xml.endDocument()
+        
+    def start_object(self, obj):
+        """
+        Called as each object is handled.
+        """
+        if not hasattr(obj, "_meta"):
+            raise base.SerializationError("Non-model object (%s) encountered during serialization" % type(obj))
+            
+        self.xml.startElement("object", {
+            "pk"    : str(obj._get_pk_val()),
+            "model" : str(obj._meta),
+        })
+        
+    def end_object(self, obj):
+        """
+        Called after handling all fields for an object.
+        """
+        self.xml.endElement("object")
+        
+    def handle_field(self, obj, field):
+        """
+        Called to handle each field on an object (except for ForeignKeys and
+        ManyToManyFields)
+        """
+        self.xml.startElement("field", {
+            "name" : field.name,
+            "type" : field.get_internal_type()
+        })
+        
+        # Get a "string version" of the object's data (this is handled by the
+        # serializer base class).  None is handled specially.
+        value = self.get_string_value(obj, field)
+        if value is not None:
+            self.xml.characters(str(value))
+
+        self.xml.endElement("field")
+        
+    def handle_fk_field(self, obj, field):
+        """
+        Called to handle a ForeignKey (we need to treat them slightly
+        differently from regular fields).
+        """
+        self._start_relational_field(field)
+        related = getattr(obj, field.name)
+        if related is not None:
+            self.xml.characters(str(related._get_pk_val()))
+        else:
+            self.xml.addQuickElement("None")
+        self.xml.endElement("field")
+    
+    def handle_m2m_field(self, obj, field):
+        """
+        Called to handle a ManyToManyField. Related objects are only
+        serialized as references to the object's PK (i.e. the related *data*
+        is not dumped, just the relation).
+        """
+        self._start_relational_field(field)
+        for relobj in getattr(obj, field.name).iterator():
+            self.xml.addQuickElement("object", attrs={"pk" : str(relobj._get_pk_val())})
+        self.xml.endElement("field")
+        
+    def _start_relational_field(self, field):
+        """
+        Helper to output the <field> element for relational fields
+        """
+        self.xml.startElement("field", {
+            "name" : field.name,
+            "rel"  : field.rel.__class__.__name__,
+            "to"   : str(field.rel.to._meta),
+        })
+        
+class Deserializer(base.Deserializer):
+    """
+    Deserialize XML.
+    """
+    
+    def __init__(self, stream_or_string, **options):
+        super(Deserializer, self).__init__(stream_or_string, **options)
+        self.encoding = self.options.get("encoding", settings.DEFAULT_CHARSET)
+        self.event_stream = pulldom.parse(self.stream) 
+    
+    def next(self):
+        for event, node in self.event_stream:
+            if event == "START_ELEMENT" and node.nodeName == "object":
+                self.event_stream.expandNode(node)
+                return self._handle_object(node)
+        raise StopIteration
+        
+    def _handle_object(self, node):
+        """
+        Convert an <object> node to a DeserializedObject.
+        """
+        # Look up the model using the model loading mechanism. If this fails, bail.
+        Model = self._get_model_from_node(node, "model")
+        
+        # Start building a data dictionary from the object.  If the node is
+        # missing the pk attribute, bail.
+        pk = node.getAttribute("pk")
+        if not pk:
+            raise base.DeserializationError("<object> node is missing the 'pk' attribute")
+        data = {Model._meta.pk.name : pk}
+        
+        # Also start building a dict of m2m data (this is saved as
+        # {m2m_accessor_attribute : [list_of_related_objects]})
+        m2m_data = {}
+        
+        # Deseralize each field.
+        for field_node in node.getElementsByTagName("field"):
+            # If the field is missing the name attribute, bail (are you
+            # sensing a pattern here?)
+            field_name = field_node.getAttribute("name")
+            if not field_name:
+                raise base.DeserializationError("<field> node is missing the 'name' attribute")
+            
+            # Get the field from the Model. This will raise a
+            # FieldDoesNotExist if, well, the field doesn't exist, which will
+            # be propagated correctly.
+            field = Model._meta.get_field(field_name)
+            
+            # As is usually the case, relation fields get the special treatment.
+            if field.rel and isinstance(field.rel, models.ManyToManyRel):
+                m2m_data[field.name] = self._handle_m2m_field_node(field_node)
+            elif field.rel and isinstance(field.rel, models.ManyToOneRel):
+                data[field.name] = self._handle_fk_field_node(field_node)
+            else:
+                value = field.to_python(getInnerText(field_node).strip().encode(self.encoding))
+                data[field.name] = value
+        
+        # Return a DeserializedObject so that the m2m data has a place to live.
+        return base.DeserializedObject(Model(**data), m2m_data)
+        
+    def _handle_fk_field_node(self, node):
+        """
+        Handle a <field> node for a ForeignKey
+        """
+        # Try to set the foreign key by looking up the foreign related object.
+        # If it doesn't exist, set the field to None (which might trigger 
+        # validation error, but that's expected).
+        RelatedModel = self._get_model_from_node(node, "to")
+        return RelatedModel.objects.get(pk=getInnerText(node).strip().encode(self.encoding))
+        
+    def _handle_m2m_field_node(self, node):
+        """
+        Handle a <field> node for a ManyToManyField
+        """
+        # Load the related model
+        RelatedModel = self._get_model_from_node(node, "to")
+        
+        # Look up all the related objects. Using the in_bulk() lookup ensures
+        # that missing related objects don't cause an exception
+        related_ids = [c.getAttribute("pk").encode(self.encoding) for c in node.getElementsByTagName("object")]
+        return RelatedModel._default_manager.in_bulk(related_ids).values()
+    
+    def _get_model_from_node(self, node, attr):
+        """
+        Helper to look up a model from a <object model=...> or a <field
+        rel=... to=...> node.
+        """
+        model_identifier = node.getAttribute(attr)
+        if not model_identifier:
+            raise base.DeserializationError(
+                "<%s> node is missing the required '%s' attribute" \
+                    % (node.nodeName, attr))
+        try:
+            Model = models.get_model(*model_identifier.split("."))
+        except TypeError:
+            Model = None
+        if Model is None:
+            raise base.DeserializationError(
+                "<%s> node has invalid model identifier: '%s'" % \
+                    (node.nodeName, model_identifier))
+        return Model
+        
+    
+def getInnerText(node):
+    """
+    Get all the inner text of a DOM node (recursively).
+    """
+    # inspired by http://mail.python.org/pipermail/xml-sig/2005-March/011022.html
+    inner_text = []
+    for child in node.childNodes:
+        if child.nodeType == child.TEXT_NODE or child.nodeType == child.CDATA_SECTION_NODE:
+            inner_text.append(child.data)
+        elif child.nodeType == child.ELEMENT_NODE:
+            inner_text.extend(getInnerText(child))
+        else:
+           pass
+    return "".join(inner_text)
\ No newline at end of file

Added: vendor/django/current/django/core/servers/__init__.py
===================================================================

Added: vendor/django/current/django/core/servers/basehttp.py
===================================================================
--- vendor/django/current/django/core/servers/basehttp.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/servers/basehttp.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,643 @@
+"""
+BaseHTTPServer that implements the Python WSGI protocol (PEP 333, rev 1.21).
+
+Adapted from wsgiref.simple_server: http://svn.eby-sarna.com/wsgiref/
+
+This is a simple server for use in testing or debugging Django apps. It hasn't
+been reviewed for security issues. Don't use it for production use.
+"""
+
+from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
+from types import ListType, StringType
+import os, re, sys, time, urllib
+
+__version__ = "0.1"
+__all__ = ['WSGIServer','WSGIRequestHandler','demo_app']
+
+server_version = "WSGIServer/" + __version__
+sys_version = "Python/" + sys.version.split()[0]
+software_version = server_version + ' ' + sys_version
+
+class WSGIServerException(Exception):
+    pass
+
+class FileWrapper(object):
+    """Wrapper to convert file-like objects to iterables"""
+
+    def __init__(self, filelike, blksize=8192):
+        self.filelike = filelike
+        self.blksize = blksize
+        if hasattr(filelike,'close'):
+            self.close = filelike.close
+
+    def __getitem__(self,key):
+        data = self.filelike.read(self.blksize)
+        if data:
+            return data
+        raise IndexError
+
+    def __iter__(self):
+        return self
+
+    def next(self):
+        data = self.filelike.read(self.blksize)
+        if data:
+            return data
+        raise StopIteration
+
+# Regular expression that matches `special' characters in parameters, the
+# existence of which force quoting of the parameter value.
+tspecials = re.compile(r'[ \(\)<>@,;:\\"/\[\]\?=]')
+
+def _formatparam(param, value=None, quote=1):
+    """Convenience function to format and return a key=value pair.
+
+    This will quote the value if needed or if quote is true.
+    """
+    if value is not None and len(value) > 0:
+        if quote or tspecials.search(value):
+            value = value.replace('\\', '\\\\').replace('"', r'\"')
+            return '%s="%s"' % (param, value)
+        else:
+            return '%s=%s' % (param, value)
+    else:
+        return param
+
+class Headers(object):
+    """Manage a collection of HTTP response headers"""
+    def __init__(self,headers):
+        if type(headers) is not ListType:
+            raise TypeError("Headers must be a list of name/value tuples")
+        self._headers = headers
+
+    def __len__(self):
+        """Return the total number of headers, including duplicates."""
+        return len(self._headers)
+
+    def __setitem__(self, name, val):
+        """Set the value of a header."""
+        del self[name]
+        self._headers.append((name, val))
+
+    def __delitem__(self,name):
+        """Delete all occurrences of a header, if present.
+
+        Does *not* raise an exception if the header is missing.
+        """
+        name = name.lower()
+        self._headers[:] = [kv for kv in self._headers if kv[0].lower()<>name]
+
+    def __getitem__(self,name):
+        """Get the first header value for 'name'
+
+        Return None if the header is missing instead of raising an exception.
+
+        Note that if the header appeared multiple times, the first exactly which
+        occurrance gets returned is undefined.  Use getall() to get all
+        the values matching a header field name.
+        """
+        return self.get(name)
+
+    def has_key(self, name):
+        """Return true if the message contains the header."""
+        return self.get(name) is not None
+
+    __contains__ = has_key
+
+    def get_all(self, name):
+        """Return a list of all the values for the named field.
+
+        These will be sorted in the order they appeared in the original header
+        list or were added to this instance, and may contain duplicates.  Any
+        fields deleted and re-inserted are always appended to the header list.
+        If no fields exist with the given name, returns an empty list.
+        """
+        name = name.lower()
+        return [kv[1] for kv in self._headers if kv[0].lower()==name]
+
+
+    def get(self,name,default=None):
+        """Get the first header value for 'name', or return 'default'"""
+        name = name.lower()
+        for k,v in self._headers:
+            if k.lower()==name:
+                return v
+        return default
+
+    def keys(self):
+        """Return a list of all the header field names.
+
+        These will be sorted in the order they appeared in the original header
+        list, or were added to this instance, and may contain duplicates.
+        Any fields deleted and re-inserted are always appended to the header
+        list.
+        """
+        return [k for k, v in self._headers]
+
+    def values(self):
+        """Return a list of all header values.
+
+        These will be sorted in the order they appeared in the original header
+        list, or were added to this instance, and may contain duplicates.
+        Any fields deleted and re-inserted are always appended to the header
+        list.
+        """
+        return [v for k, v in self._headers]
+
+    def items(self):
+        """Get all the header fields and values.
+
+        These will be sorted in the order they were in the original header
+        list, or were added to this instance, and may contain duplicates.
+        Any fields deleted and re-inserted are always appended to the header
+        list.
+        """
+        return self._headers[:]
+
+    def __repr__(self):
+        return "Headers(%s)" % `self._headers`
+
+    def __str__(self):
+        """str() returns the formatted headers, complete with end line,
+        suitable for direct HTTP transmission."""
+        return '\r\n'.join(["%s: %s" % kv for kv in self._headers]+['',''])
+
+    def setdefault(self,name,value):
+        """Return first matching header value for 'name', or 'value'
+
+        If there is no header named 'name', add a new header with name 'name'
+        and value 'value'."""
+        result = self.get(name)
+        if result is None:
+            self._headers.append((name,value))
+            return value
+        else:
+            return result
+
+    def add_header(self, _name, _value, **_params):
+        """Extended header setting.
+
+        _name is the header field to add.  keyword arguments can be used to set
+        additional parameters for the header field, with underscores converted
+        to dashes.  Normally the parameter will be added as key="value" unless
+        value is None, in which case only the key will be added.
+
+        Example:
+
+        h.add_header('content-disposition', 'attachment', filename='bud.gif')
+
+        Note that unlike the corresponding 'email.Message' method, this does
+        *not* handle '(charset, language, value)' tuples: all values must be
+        strings or None.
+        """
+        parts = []
+        if _value is not None:
+            parts.append(_value)
+        for k, v in _params.items():
+            if v is None:
+                parts.append(k.replace('_', '-'))
+            else:
+                parts.append(_formatparam(k.replace('_', '-'), v))
+        self._headers.append((_name, "; ".join(parts)))
+
+def guess_scheme(environ):
+    """Return a guess for whether 'wsgi.url_scheme' should be 'http' or 'https'
+    """
+    if environ.get("HTTPS") in ('yes','on','1'):
+        return 'https'
+    else:
+        return 'http'
+
+_hoppish = {
+    'connection':1, 'keep-alive':1, 'proxy-authenticate':1,
+    'proxy-authorization':1, 'te':1, 'trailers':1, 'transfer-encoding':1,
+    'upgrade':1
+}.has_key
+
+def is_hop_by_hop(header_name):
+    """Return true if 'header_name' is an HTTP/1.1 "Hop-by-Hop" header"""
+    return _hoppish(header_name.lower())
+
+class ServerHandler(object):
+    """Manage the invocation of a WSGI application"""
+
+    # Configuration parameters; can override per-subclass or per-instance
+    wsgi_version = (1,0)
+    wsgi_multithread = True
+    wsgi_multiprocess = True
+    wsgi_run_once = False
+
+    origin_server = True    # We are transmitting direct to client
+    http_version  = "1.0"   # Version that should be used for response
+    server_software = software_version
+
+    # os_environ is used to supply configuration from the OS environment:
+    # by default it's a copy of 'os.environ' as of import time, but you can
+    # override this in e.g. your __init__ method.
+    os_environ = dict(os.environ.items())
+
+    # Collaborator classes
+    wsgi_file_wrapper = FileWrapper     # set to None to disable
+    headers_class = Headers             # must be a Headers-like class
+
+    # Error handling (also per-subclass or per-instance)
+    traceback_limit = None  # Print entire traceback to self.get_stderr()
+    error_status = "500 INTERNAL SERVER ERROR"
+    error_headers = [('Content-Type','text/plain')]
+
+    # State variables (don't mess with these)
+    status = result = None
+    headers_sent = False
+    headers = None
+    bytes_sent = 0
+
+    def __init__(self, stdin, stdout, stderr, environ, multithread=True,
+        multiprocess=False):
+        self.stdin = stdin
+        self.stdout = stdout
+        self.stderr = stderr
+        self.base_env = environ
+        self.wsgi_multithread = multithread
+        self.wsgi_multiprocess = multiprocess
+
+    def run(self, application):
+        """Invoke the application"""
+        # Note to self: don't move the close()!  Asynchronous servers shouldn't
+        # call close() from finish_response(), so if you close() anywhere but
+        # the double-error branch here, you'll break asynchronous servers by
+        # prematurely closing.  Async servers must return from 'run()' without
+        # closing if there might still be output to iterate over.
+        try:
+            self.setup_environ()
+            self.result = application(self.environ, self.start_response)
+            self.finish_response()
+        except:
+            try:
+                self.handle_error()
+            except:
+                # If we get an error handling an error, just give up already!
+                self.close()
+                raise   # ...and let the actual server figure it out.
+
+    def setup_environ(self):
+        """Set up the environment for one request"""
+
+        env = self.environ = self.os_environ.copy()
+        self.add_cgi_vars()
+
+        env['wsgi.input']        = self.get_stdin()
+        env['wsgi.errors']       = self.get_stderr()
+        env['wsgi.version']      = self.wsgi_version
+        env['wsgi.run_once']     = self.wsgi_run_once
+        env['wsgi.url_scheme']   = self.get_scheme()
+        env['wsgi.multithread']  = self.wsgi_multithread
+        env['wsgi.multiprocess'] = self.wsgi_multiprocess
+
+        if self.wsgi_file_wrapper is not None:
+            env['wsgi.file_wrapper'] = self.wsgi_file_wrapper
+
+        if self.origin_server and self.server_software:
+            env.setdefault('SERVER_SOFTWARE',self.server_software)
+
+    def finish_response(self):
+        """Send any iterable data, then close self and the iterable
+
+        Subclasses intended for use in asynchronous servers will
+        want to redefine this method, such that it sets up callbacks
+        in the event loop to iterate over the data, and to call
+        'self.close()' once the response is finished.
+        """
+        if not self.result_is_file() and not self.sendfile():
+            for data in self.result:
+                self.write(data)
+            self.finish_content()
+        self.close()
+
+    def get_scheme(self):
+        """Return the URL scheme being used"""
+        return guess_scheme(self.environ)
+
+    def set_content_length(self):
+        """Compute Content-Length or switch to chunked encoding if possible"""
+        try:
+            blocks = len(self.result)
+        except (TypeError,AttributeError,NotImplementedError):
+            pass
+        else:
+            if blocks==1:
+                self.headers['Content-Length'] = str(self.bytes_sent)
+                return
+        # XXX Try for chunked encoding if origin server and client is 1.1
+
+    def cleanup_headers(self):
+        """Make any necessary header changes or defaults
+
+        Subclasses can extend this to add other defaults.
+        """
+        if not self.headers.has_key('Content-Length'):
+            self.set_content_length()
+
+    def start_response(self, status, headers,exc_info=None):
+        """'start_response()' callable as specified by PEP 333"""
+
+        if exc_info:
+            try:
+                if self.headers_sent:
+                    # Re-raise original exception if headers sent
+                    raise exc_info[0], exc_info[1], exc_info[2]
+            finally:
+                exc_info = None        # avoid dangling circular ref
+        elif self.headers is not None:
+            raise AssertionError("Headers already set!")
+
+        assert type(status) is StringType,"Status must be a string"
+        assert len(status)>=4,"Status must be at least 4 characters"
+        assert int(status[:3]),"Status message must begin w/3-digit code"
+        assert status[3]==" ", "Status message must have a space after code"
+        if __debug__:
+            for name,val in headers:
+                assert type(name) is StringType,"Header names must be strings"
+                assert type(val) is StringType,"Header values must be strings"
+                assert not is_hop_by_hop(name),"Hop-by-hop headers not allowed"
+        self.status = status
+        self.headers = self.headers_class(headers)
+        return self.write
+
+    def send_preamble(self):
+        """Transmit version/status/date/server, via self._write()"""
+        if self.origin_server:
+            if self.client_is_modern():
+                self._write('HTTP/%s %s\r\n' % (self.http_version,self.status))
+                if not self.headers.has_key('Date'):
+                    self._write(
+                        'Date: %s\r\n' % time.asctime(time.gmtime(time.time()))
+                    )
+                if self.server_software and not self.headers.has_key('Server'):
+                    self._write('Server: %s\r\n' % self.server_software)
+        else:
+            self._write('Status: %s\r\n' % self.status)
+
+    def write(self, data):
+        """'write()' callable as specified by PEP 333"""
+
+        assert type(data) is StringType,"write() argument must be string"
+
+        if not self.status:
+            raise AssertionError("write() before start_response()")
+
+        elif not self.headers_sent:
+            # Before the first output, send the stored headers
+            self.bytes_sent = len(data)    # make sure we know content-length
+            self.send_headers()
+        else:
+            self.bytes_sent += len(data)
+
+        # XXX check Content-Length and truncate if too many bytes written?
+        self._write(data)
+        self._flush()
+
+    def sendfile(self):
+        """Platform-specific file transmission
+
+        Override this method in subclasses to support platform-specific
+        file transmission.  It is only called if the application's
+        return iterable ('self.result') is an instance of
+        'self.wsgi_file_wrapper'.
+
+        This method should return a true value if it was able to actually
+        transmit the wrapped file-like object using a platform-specific
+        approach.  It should return a false value if normal iteration
+        should be used instead.  An exception can be raised to indicate
+        that transmission was attempted, but failed.
+
+        NOTE: this method should call 'self.send_headers()' if
+        'self.headers_sent' is false and it is going to attempt direct
+        transmission of the file1.
+        """
+        return False   # No platform-specific transmission by default
+
+    def finish_content(self):
+        """Ensure headers and content have both been sent"""
+        if not self.headers_sent:
+            self.headers['Content-Length'] = "0"
+            self.send_headers()
+        else:
+            pass # XXX check if content-length was too short?
+
+    def close(self):
+        try:
+            self.request_handler.log_request(self.status.split(' ',1)[0], self.bytes_sent)
+        finally:
+            try:
+                if hasattr(self.result,'close'):
+                    self.result.close()
+            finally:
+                self.result = self.headers = self.status = self.environ = None
+                self.bytes_sent = 0; self.headers_sent = False
+
+    def send_headers(self):
+        """Transmit headers to the client, via self._write()"""
+        self.cleanup_headers()
+        self.headers_sent = True
+        if not self.origin_server or self.client_is_modern():
+            self.send_preamble()
+            self._write(str(self.headers))
+
+    def result_is_file(self):
+        """True if 'self.result' is an instance of 'self.wsgi_file_wrapper'"""
+        wrapper = self.wsgi_file_wrapper
+        return wrapper is not None and isinstance(self.result,wrapper)
+
+    def client_is_modern(self):
+        """True if client can accept status and headers"""
+        return self.environ['SERVER_PROTOCOL'].upper() != 'HTTP/0.9'
+
+    def log_exception(self,exc_info):
+        """Log the 'exc_info' tuple in the server log
+
+        Subclasses may override to retarget the output or change its format.
+        """
+        try:
+            from traceback import print_exception
+            stderr = self.get_stderr()
+            print_exception(
+                exc_info[0], exc_info[1], exc_info[2],
+                self.traceback_limit, stderr
+            )
+            stderr.flush()
+        finally:
+            exc_info = None
+
+    def handle_error(self):
+        """Log current error, and send error output to client if possible"""
+        self.log_exception(sys.exc_info())
+        if not self.headers_sent:
+            self.result = self.error_output(self.environ, self.start_response)
+            self.finish_response()
+        # XXX else: attempt advanced recovery techniques for HTML or text?
+
+    def error_output(self, environ, start_response):
+        import traceback
+        start_response(self.error_status, self.error_headers[:], sys.exc_info())
+        return ['\n'.join(traceback.format_exception(*sys.exc_info()))]
+
+    # Pure abstract methods; *must* be overridden in subclasses
+
+    def _write(self,data):
+        self.stdout.write(data)
+        self._write = self.stdout.write
+
+    def _flush(self):
+        self.stdout.flush()
+        self._flush = self.stdout.flush
+
+    def get_stdin(self):
+        return self.stdin
+
+    def get_stderr(self):
+        return self.stderr
+
+    def add_cgi_vars(self):
+        self.environ.update(self.base_env)
+
+class WSGIServer(HTTPServer):
+    """BaseHTTPServer that implements the Python WSGI protocol"""
+    application = None
+
+    def server_bind(self):
+        """Override server_bind to store the server name."""
+        try:
+            HTTPServer.server_bind(self)
+        except Exception, e:
+            raise WSGIServerException, e
+        self.setup_environ()
+
+    def setup_environ(self):
+        # Set up base environment
+        env = self.base_environ = {}
+        env['SERVER_NAME'] = self.server_name
+        env['GATEWAY_INTERFACE'] = 'CGI/1.1'
+        env['SERVER_PORT'] = str(self.server_port)
+        env['REMOTE_HOST']=''
+        env['CONTENT_LENGTH']=''
+        env['SCRIPT_NAME'] = ''
+
+    def get_app(self):
+        return self.application
+
+    def set_app(self,application):
+        self.application = application
+
+class WSGIRequestHandler(BaseHTTPRequestHandler):
+    server_version = "WSGIServer/" + __version__
+
+    def __init__(self, *args, **kwargs):
+        from django.conf import settings
+        self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX
+        BaseHTTPRequestHandler.__init__(self, *args, **kwargs)
+
+    def get_environ(self):
+        env = self.server.base_environ.copy()
+        env['SERVER_PROTOCOL'] = self.request_version
+        env['REQUEST_METHOD'] = self.command
+        if '?' in self.path:
+            path,query = self.path.split('?',1)
+        else:
+            path,query = self.path,''
+
+        env['PATH_INFO'] = urllib.unquote(path)
+        env['QUERY_STRING'] = query
+
+        host = self.address_string()
+        if host != self.client_address[0]:
+            env['REMOTE_HOST'] = host
+        env['REMOTE_ADDR'] = self.client_address[0]
+
+        if self.headers.typeheader is None:
+            env['CONTENT_TYPE'] = self.headers.type
+        else:
+            env['CONTENT_TYPE'] = self.headers.typeheader
+
+        length = self.headers.getheader('content-length')
+        if length:
+            env['CONTENT_LENGTH'] = length
+
+        for h in self.headers.headers:
+            k,v = h.split(':',1)
+            k=k.replace('-','_').upper(); v=v.strip()
+            if k in env:
+                continue                    # skip content length, type,etc.
+            if 'HTTP_'+k in env:
+                env['HTTP_'+k] += ','+v     # comma-separate multiple headers
+            else:
+                env['HTTP_'+k] = v
+        return env
+
+    def get_stderr(self):
+        return sys.stderr
+
+    def handle(self):
+        """Handle a single HTTP request"""
+        self.raw_requestline = self.rfile.readline()
+        if not self.parse_request(): # An error code has been sent, just exit
+            return
+        handler = ServerHandler(self.rfile, self.wfile, self.get_stderr(), self.get_environ())
+        handler.request_handler = self      # backpointer for logging
+        handler.run(self.server.get_app())
+
+    def log_message(self, format, *args):
+        # Don't bother logging requests for admin images or the favicon.
+        if self.path.startswith(self.admin_media_prefix) or self.path == '/favicon.ico':
+            return
+        sys.stderr.write("[%s] %s\n" % (self.log_date_time_string(), format % args))
+
+class AdminMediaHandler(object):
+    """
+    WSGI middleware that intercepts calls to the admin media directory, as
+    defined by the ADMIN_MEDIA_PREFIX setting, and serves those images.
+    Use this ONLY LOCALLY, for development! This hasn't been tested for
+    security and is not super efficient.
+    """
+    def __init__(self, application):
+        from django.conf import settings
+        import django
+        self.application = application
+        self.media_dir = django.__path__[0] + '/contrib/admin/media'
+        self.media_url = settings.ADMIN_MEDIA_PREFIX
+
+    def __call__(self, environ, start_response):
+        import os.path
+
+        # Ignore requests that aren't under ADMIN_MEDIA_PREFIX. Also ignore
+        # all requests if ADMIN_MEDIA_PREFIX isn't a relative URL.
+        if self.media_url.startswith('http://') or self.media_url.startswith('https://') \
+            or not environ['PATH_INFO'].startswith(self.media_url):
+            return self.application(environ, start_response)
+
+        # Find the admin file and serve it up, if it exists and is readable.
+        relative_url = environ['PATH_INFO'][len(self.media_url):]
+        file_path = os.path.join(self.media_dir, relative_url)
+        if not os.path.exists(file_path):
+            status = '404 NOT FOUND'
+            headers = {'Content-type': 'text/plain'}
+            output = ['Page not found: %s' % file_path]
+        else:
+            try:
+                fp = open(file_path, 'rb')
+            except IOError:
+                status = '401 UNAUTHORIZED'
+                headers = {'Content-type': 'text/plain'}
+                output = ['Permission denied: %s' % file_path]
+            else:
+                status = '200 OK'
+                headers = {}
+                output = [fp.read()]
+                fp.close()
+        start_response(status, headers.items())
+        return output
+
+def run(addr, port, wsgi_handler):
+    server_address = (addr, port)
+    httpd = WSGIServer(server_address, WSGIRequestHandler)
+    httpd.set_app(wsgi_handler)
+    httpd.serve_forever()

Added: vendor/django/current/django/core/servers/fastcgi.py
===================================================================
--- vendor/django/current/django/core/servers/fastcgi.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/servers/fastcgi.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,149 @@
+"""
+FastCGI server that implements the WSGI protocol.
+
+Uses the flup python package: http://www.saddi.com/software/flup/
+
+This is a adaptation of the flup package to add FastCGI server support
+to run Django apps from Web servers that support the FastCGI protocol.
+This module can be run standalone or from the django-admin / manage.py
+scripts using the "runfcgi" directive.
+
+Run with the extra option "help" for a list of additional options you can
+pass to this server.
+"""
+
+import sys, os
+
+__version__ = "0.1"
+__all__ = ["runfastcgi"]
+
+FASTCGI_HELP = r"""runfcgi:
+  Run this project as a fastcgi application. To do this, the
+  flup package from http://www.saddi.com/software/flup/ is
+  required.
+
+Usage:
+   django-admin.py runfcgi --settings=yourproject.settings [fcgi settings]
+   manage.py runfcgi [fcgi settings]
+
+Optional Fcgi settings: (setting=value)
+  host=HOSTNAME        hostname to listen on..
+  port=PORTNUM         port to listen on.
+  socket=FILE          UNIX socket to listen on.
+  method=IMPL          prefork or threaded (default prefork)
+  maxspare=NUMBER      max number of spare processes to keep running.
+  minspare=NUMBER      min number of spare processes to prefork.
+  maxchildren=NUMBER   hard limit number of processes in prefork mode.
+  daemonize=BOOL       whether to detach from terminal.
+  pidfile=FILE         write the spawned process-id to this file.
+  workdir=DIRECTORY    change to this directory when daemonizing
+
+Examples:
+  Run a "standard" fastcgi process on a file-descriptor
+  (for webservers which spawn your processes for you)
+    $ manage.py runfcgi method=threaded
+
+  Run a fastcgi server on a TCP host/port
+    $ manage.py runfcgi method=prefork host=127.0.0.1 port=8025
+
+  Run a fastcgi server on a UNIX domain socket (posix platforms only)
+    $ manage.py runfcgi method=prefork socket=/tmp/fcgi.sock
+
+  Run a fastCGI as a daemon and write the spawned PID in a file
+    $ manage.py runfcgi socket=/tmp/fcgi.sock method=prefork \
+        daemonize=true pidfile=/var/run/django-fcgi.pid
+
+"""
+
+FASTCGI_OPTIONS = {
+    'host': None,
+    'port': None,
+    'socket': None,
+    'method': 'fork',
+    'daemonize': None,
+    'workdir': '/',
+    'pidfile': None,
+    'maxspare': 5,
+    'minspare': 2,
+    'maxchildren': 50,
+}
+
+def fastcgi_help(message=None):
+    print FASTCGI_HELP
+    if message:
+        print message
+    return False
+
+def runfastcgi(argset):
+    options = FASTCGI_OPTIONS.copy()
+    for x in argset:
+        if "=" in x:
+            k, v = x.split('=', 1)
+        else:
+            k, v = x, True
+        options[k.lower()] = v
+
+    if "help" in options:
+        return fastcgi_help()
+
+    try:
+        import flup
+    except ImportError, e:
+        print >> sys.stderr, "ERROR: %s" % e
+        print >> sys.stderr, "  Unable to load the flup package.  In order to run django"
+        print >> sys.stderr, "  as a FastCGI application, you will need to get flup from"
+        print >> sys.stderr, "  http://www.saddi.com/software/flup/   If you've already"
+        print >> sys.stderr, "  installed flup, then make sure you have it in your PYTHONPATH."
+        return False
+
+    if options['method'] in ('prefork', 'fork'):
+        from flup.server.fcgi_fork import WSGIServer
+        wsgi_opts = {
+            'maxSpare': int(options["maxspare"]),
+            'minSpare': int(options["minspare"]),
+            'maxChildren': int(options["maxchildren"]),
+        }
+    elif options['method'] in ('thread', 'threaded'):
+        from flup.server.fcgi import WSGIServer
+        wsgi_opts = {}
+    else:
+        return fastcgi_help("ERROR: Implementation must be one of prefork or thread.")
+    
+    wsgi_opts['debug'] = False # Turn off flup tracebacks
+    
+    # Prep up and go
+    from django.core.handlers.wsgi import WSGIHandler
+
+    if options["host"] and options["port"] and not options["socket"]:
+        wsgi_opts['bindAddress'] = (options["host"], int(options["port"]))
+    elif options["socket"] and not options["host"] and not options["port"]:
+        wsgi_opts['bindAddress'] = options["socket"]
+    elif not options["socket"] and not options["host"] and not options["port"]:
+        wsgi_opts['bindAddress'] = None
+    else:
+        return fastcgi_help("Invalid combination of host, port, socket.")
+
+    if options["daemonize"] is None:
+        # Default to daemonizing if we're running on a socket/named pipe.
+        daemonize = (wsgi_opts['bindAddress'] is not None)
+    else:
+        if options["daemonize"].lower() in ('true', 'yes', 't'):
+            daemonize = True
+        elif options["daemonize"].lower() in ('false', 'no', 'f'):
+            daemonize = False
+        else:
+            return fastcgi_help("ERROR: Invalid option for daemonize parameter.")
+
+    if daemonize:
+        from django.utils.daemonize import become_daemon
+        become_daemon(our_home_dir=options["workdir"])
+
+    if options["pidfile"]:
+        fp = open(options["pidfile"], "w")
+        fp.write("%d\n" % os.getpid())
+        fp.close()
+
+    WSGIServer(WSGIHandler(), **wsgi_opts).run()
+
+if __name__ == '__main__':
+    runfastcgi(sys.argv[1:])

Added: vendor/django/current/django/core/signals.py
===================================================================
--- vendor/django/current/django/core/signals.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/signals.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,3 @@
+request_started = object()
+request_finished = object()
+got_request_exception = object()

Added: vendor/django/current/django/core/template_loader.py
===================================================================
--- vendor/django/current/django/core/template_loader.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/template_loader.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,7 @@
+# This module is DEPRECATED!
+#
+# You should no longer be using django.template_loader.
+#
+# Use django.template.loader instead.
+
+from django.template.loader import *

Added: vendor/django/current/django/core/urlresolvers.py
===================================================================
--- vendor/django/current/django/core/urlresolvers.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/urlresolvers.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,219 @@
+"""
+This module converts requested URLs to callback view functions.
+
+RegexURLResolver is the main class here. Its resolve() method takes a URL (as
+a string) and returns a tuple in this format:
+
+    (view_function, function_args, function_kwargs)
+"""
+
+from django.http import Http404
+from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
+import re
+
+class Resolver404(Http404):
+    pass
+
+class NoReverseMatch(Exception):
+    pass
+
+def get_mod_func(callback):
+    # Converts 'django.views.news.stories.story_detail' to
+    # ['django.views.news.stories', 'story_detail']
+    dot = callback.rindex('.')
+    return callback[:dot], callback[dot+1:]
+
+def reverse_helper(regex, *args, **kwargs):
+    """
+    Does a "reverse" lookup -- returns the URL for the given args/kwargs.
+    The args/kwargs are applied to the given compiled regular expression.
+    For example:
+
+        >>> reverse_helper(re.compile('^places/(\d+)/$'), 3)
+        'places/3/'
+        >>> reverse_helper(re.compile('^places/(?P<id>\d+)/$'), id=3)
+        'places/3/'
+        >>> reverse_helper(re.compile('^people/(?P<state>\w\w)/(\w+)/$'), 'adrian', state='il')
+        'people/il/adrian/'
+
+    Raises NoReverseMatch if the args/kwargs aren't valid for the regex.
+    """
+    # TODO: Handle nested parenthesis in the following regex.
+    result = re.sub(r'\(([^)]+)\)', MatchChecker(args, kwargs), regex.pattern)
+    return result.replace('^', '').replace('$', '')
+
+class MatchChecker(object):
+    "Class used in reverse RegexURLPattern lookup."
+    def __init__(self, args, kwargs):
+        self.args, self.kwargs = args, kwargs
+        self.current_arg = 0
+
+    def __call__(self, match_obj):
+        # match_obj.group(1) is the contents of the parenthesis.
+        # First we need to figure out whether it's a named or unnamed group.
+        #
+        grouped = match_obj.group(1)
+        m = re.search(r'^\?P<(\w+)>(.*?)$', grouped)
+        if m: # If this was a named group...
+            # m.group(1) is the name of the group
+            # m.group(2) is the regex.
+            try:
+                value = self.kwargs[m.group(1)]
+            except KeyError:
+                # It was a named group, but the arg was passed in as a
+                # positional arg or not at all.
+                try:
+                    value = self.args[self.current_arg]
+                    self.current_arg += 1
+                except IndexError:
+                    # The arg wasn't passed in.
+                    raise NoReverseMatch('Not enough positional arguments passed in')
+            test_regex = m.group(2)
+        else: # Otherwise, this was a positional (unnamed) group.
+            try:
+                value = self.args[self.current_arg]
+                self.current_arg += 1
+            except IndexError:
+                # The arg wasn't passed in.
+                raise NoReverseMatch('Not enough positional arguments passed in')
+            test_regex = grouped
+        # Note we're using re.match here on purpose because the start of
+        # to string needs to match.
+        if not re.match(test_regex + '$', str(value)): # TODO: Unicode?
+            raise NoReverseMatch("Value %r didn't match regular expression %r" % (value, test_regex))
+        return str(value) # TODO: Unicode?
+
+class RegexURLPattern(object):
+    def __init__(self, regex, callback, default_args=None):
+        # regex is a string representing a regular expression.
+        # callback is something like 'foo.views.news.stories.story_detail',
+        # which represents the path to a module and a view function name.
+        self.regex = re.compile(regex)
+        self.callback = callback
+        self.default_args = default_args or {}
+
+    def resolve(self, path):
+        match = self.regex.search(path)
+        if match:
+            # If there are any named groups, use those as kwargs, ignoring
+            # non-named groups. Otherwise, pass all non-named arguments as
+            # positional arguments.
+            kwargs = match.groupdict()
+            if kwargs:
+                args = ()
+            if not kwargs:
+                args = match.groups()
+            # In both cases, pass any extra_kwargs as **kwargs.
+            kwargs.update(self.default_args)
+
+            try: # Lazily load self.func.
+                return self.func, args, kwargs
+            except AttributeError:
+                self.func = self.get_callback()
+            return self.func, args, kwargs
+
+    def get_callback(self):
+        mod_name, func_name = get_mod_func(self.callback)
+        try:
+            return getattr(__import__(mod_name, '', '', ['']), func_name)
+        except ImportError, e:
+            raise ViewDoesNotExist, "Could not import %s. Error was: %s" % (mod_name, str(e))
+        except AttributeError, e:
+            raise ViewDoesNotExist, "Tried %s in module %s. Error was: %s" % (func_name, mod_name, str(e))
+
+    def reverse(self, viewname, *args, **kwargs):
+        if viewname != self.callback:
+            raise NoReverseMatch
+        return self.reverse_helper(*args, **kwargs)
+
+    def reverse_helper(self, *args, **kwargs):
+        return reverse_helper(self.regex, *args, **kwargs)
+
+class RegexURLResolver(object):
+    def __init__(self, regex, urlconf_name):
+        # regex is a string representing a regular expression.
+        # urlconf_name is a string representing the module containing urlconfs.
+        self.regex = re.compile(regex)
+        self.urlconf_name = urlconf_name
+        self.callback = None
+
+    def resolve(self, path):
+        tried = []
+        match = self.regex.search(path)
+        if match:
+            new_path = path[match.end():]
+            for pattern in self.urlconf_module.urlpatterns:
+                try:
+                    sub_match = pattern.resolve(new_path)
+                except Resolver404, e:
+                    tried.extend([(pattern.regex.pattern + '   ' + t) for t in e.args[0]['tried']])
+                else:
+                    if sub_match:
+                        return sub_match[0], sub_match[1], dict(match.groupdict(), **sub_match[2])
+                    tried.append(pattern.regex.pattern)
+            raise Resolver404, {'tried': tried, 'path': new_path}
+
+    def _get_urlconf_module(self):
+        try:
+            return self._urlconf_module
+        except AttributeError:
+            try:
+                self._urlconf_module = __import__(self.urlconf_name, '', '', [''])
+            except ValueError, e:
+                # Invalid urlconf_name, such as "foo.bar." (note trailing period)
+                raise ImproperlyConfigured, "Error while importing URLconf %r: %s" % (self.urlconf_name, e)
+            return self._urlconf_module
+    urlconf_module = property(_get_urlconf_module)
+
+    def _get_url_patterns(self):
+        return self.urlconf_module.urlpatterns
+    url_patterns = property(_get_url_patterns)
+
+    def _resolve_special(self, view_type):
+        callback = getattr(self.urlconf_module, 'handler%s' % view_type)
+        mod_name, func_name = get_mod_func(callback)
+        try:
+            return getattr(__import__(mod_name, '', '', ['']), func_name), {}
+        except (ImportError, AttributeError), e:
+            raise ViewDoesNotExist, "Tried %s. Error was: %s" % (callback, str(e))
+
+    def resolve404(self):
+        return self._resolve_special('404')
+
+    def resolve500(self):
+        return self._resolve_special('500')
+
+    def reverse(self, viewname, *args, **kwargs):
+        for pattern in self.urlconf_module.urlpatterns:
+            if isinstance(pattern, RegexURLResolver):
+                try:
+                    return pattern.reverse_helper(viewname, *args, **kwargs)
+                except NoReverseMatch:
+                    continue
+            elif pattern.callback == viewname:
+                try:
+                    return pattern.reverse_helper(*args, **kwargs)
+                except NoReverseMatch:
+                    continue
+        raise NoReverseMatch
+
+    def reverse_helper(self, viewname, *args, **kwargs):
+        sub_match = self.reverse(viewname, *args, **kwargs)
+        result = reverse_helper(self.regex, *args, **kwargs)
+        return result + sub_match
+
+def resolve(path, urlconf=None):
+    if urlconf is None:
+        from django.conf import settings
+        urlconf = settings.ROOT_URLCONF
+    resolver = RegexURLResolver(r'^/', urlconf)
+    return resolver.resolve(path)
+
+def reverse(viewname, urlconf=None, args=None, kwargs=None):
+    args = args or []
+    kwargs = kwargs or {}
+    if urlconf is None:
+        from django.conf import settings
+        urlconf = settings.ROOT_URLCONF
+    resolver = RegexURLResolver(r'^/', urlconf)
+    return '/' + resolver.reverse(viewname, *args, **kwargs)

Added: vendor/django/current/django/core/validators.py
===================================================================
--- vendor/django/current/django/core/validators.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/validators.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,507 @@
+"""
+A library of validators that return None and raise ValidationError when the
+provided data isn't valid.
+
+Validators may be callable classes, and they may have an 'always_test'
+attribute. If an 'always_test' attribute exists (regardless of value), the
+validator will *always* be run, regardless of whether its associated
+form field is required.
+"""
+
+from django.conf import settings
+from django.utils.translation import gettext, gettext_lazy, ngettext
+from django.utils.functional import Promise, lazy
+import re
+
+_datere = r'(19|2\d)\d{2}-((?:0?[1-9])|(?:1[0-2]))-((?:0?[1-9])|(?:[12][0-9])|(?:3[0-1]))'
+_timere = r'(?:[01]?[0-9]|2[0-3]):[0-5][0-9](?::[0-5][0-9])?'
+alnum_re = re.compile(r'^\w+$')
+alnumurl_re = re.compile(r'^[-\w/]+$')
+ansi_date_re = re.compile('^%s$' % _datere)
+ansi_time_re = re.compile('^%s$' % _timere)
+ansi_datetime_re = re.compile('^%s %s$' % (_datere, _timere))
+email_re = re.compile(
+    r"(^[-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
+    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
+    r')@(?:[A-Z0-9-]+\.)+[A-Z]{2,6}$', re.IGNORECASE)  # domain
+integer_re = re.compile(r'^-?\d+$')
+ip4_re = re.compile(r'^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$')
+phone_re = re.compile(r'^[A-PR-Y0-9]{3}-[A-PR-Y0-9]{3}-[A-PR-Y0-9]{4}$', re.IGNORECASE)
+slug_re = re.compile(r'^[-\w]+$')
+url_re = re.compile(r'^https?://\S+$')
+
+lazy_inter = lazy(lambda a,b: str(a) % b, str)
+
+class ValidationError(Exception):
+    def __init__(self, message):
+        "ValidationError can be passed a string or a list."
+        if isinstance(message, list):
+            self.messages = message
+        else:
+            assert isinstance(message, (basestring, Promise)), ("%s should be a string" % repr(message))
+            self.messages = [message]
+    def __str__(self):
+        # This is needed because, without a __str__(), printing an exception
+        # instance would result in this:
+        # AttributeError: ValidationError instance has no attribute 'args'
+        # See http://www.python.org/doc/current/tut/node10.html#handling
+        return str(self.messages)
+
+class CriticalValidationError(Exception):
+    def __init__(self, message):
+        "ValidationError can be passed a string or a list."
+        if isinstance(message, list):
+            self.messages = message
+        else:
+            assert isinstance(message, (basestring, Promise)), ("'%s' should be a string" % message)
+            self.messages = [message]
+    def __str__(self):
+        return str(self.messages)
+
+def isAlphaNumeric(field_data, all_data):
+    if not alnum_re.search(field_data):
+        raise ValidationError, gettext("This value must contain only letters, numbers and underscores.")
+
+def isAlphaNumericURL(field_data, all_data):
+    if not alnumurl_re.search(field_data):
+        raise ValidationError, gettext("This value must contain only letters, numbers, underscores, dashes or slashes.")
+
+def isSlug(field_data, all_data):
+    if not slug_re.search(field_data):
+        raise ValidationError, "This value must contain only letters, numbers, underscores or hyphens."
+
+def isLowerCase(field_data, all_data):
+    if field_data.lower() != field_data:
+        raise ValidationError, gettext("Uppercase letters are not allowed here.")
+
+def isUpperCase(field_data, all_data):
+    if field_data.upper() != field_data:
+        raise ValidationError, gettext("Lowercase letters are not allowed here.")
+
+def isCommaSeparatedIntegerList(field_data, all_data):
+    for supposed_int in field_data.split(','):
+        try:
+            int(supposed_int)
+        except ValueError:
+            raise ValidationError, gettext("Enter only digits separated by commas.")
+
+def isCommaSeparatedEmailList(field_data, all_data):
+    """
+    Checks that field_data is a string of e-mail addresses separated by commas.
+    Blank field_data values will not throw a validation error, and whitespace
+    is allowed around the commas.
+    """
+    for supposed_email in field_data.split(','):
+        try:
+            isValidEmail(supposed_email.strip(), '')
+        except ValidationError:
+            raise ValidationError, gettext("Enter valid e-mail addresses separated by commas.")
+
+def isValidIPAddress4(field_data, all_data):
+    if not ip4_re.search(field_data):
+        raise ValidationError, gettext("Please enter a valid IP address.")
+
+def isNotEmpty(field_data, all_data):
+    if field_data.strip() == '':
+        raise ValidationError, gettext("Empty values are not allowed here.")
+
+def isOnlyDigits(field_data, all_data):
+    if not field_data.isdigit():
+        raise ValidationError, gettext("Non-numeric characters aren't allowed here.")
+
+def isNotOnlyDigits(field_data, all_data):
+    if field_data.isdigit():
+        raise ValidationError, gettext("This value can't be comprised solely of digits.")
+
+def isInteger(field_data, all_data):
+    # This differs from isOnlyDigits because this accepts the negative sign
+    if not integer_re.search(field_data):
+        raise ValidationError, gettext("Enter a whole number.")
+
+def isOnlyLetters(field_data, all_data):
+    if not field_data.isalpha():
+        raise ValidationError, gettext("Only alphabetical characters are allowed here.")
+
+def isValidANSIDate(field_data, all_data):
+    if not ansi_date_re.search(field_data):
+        raise ValidationError, gettext('Enter a valid date in YYYY-MM-DD format.')
+
+def isValidANSITime(field_data, all_data):
+    if not ansi_time_re.search(field_data):
+        raise ValidationError, gettext('Enter a valid time in HH:MM format.')
+
+def isValidANSIDatetime(field_data, all_data):
+    if not ansi_datetime_re.search(field_data):
+        raise ValidationError, gettext('Enter a valid date/time in YYYY-MM-DD HH:MM format.')
+
+def isValidEmail(field_data, all_data):
+    if not email_re.search(field_data):
+        raise ValidationError, gettext('Enter a valid e-mail address.')
+
+def isValidImage(field_data, all_data):
+    """
+    Checks that the file-upload field data contains a valid image (GIF, JPG,
+    PNG, possibly others -- whatever the Python Imaging Library supports).
+    """
+    from PIL import Image
+    from cStringIO import StringIO
+    try:
+        content = field_data['content']
+    except TypeError:
+        raise ValidationError, gettext("No file was submitted. Check the encoding type on the form.")
+    try:
+        Image.open(StringIO(content))
+    except IOError: # Python Imaging Library doesn't recognize it as an image
+        raise ValidationError, gettext("Upload a valid image. The file you uploaded was either not an image or a corrupted image.")
+
+def isValidImageURL(field_data, all_data):
+    uc = URLMimeTypeCheck(('image/jpeg', 'image/gif', 'image/png'))
+    try:
+        uc(field_data, all_data)
+    except URLMimeTypeCheck.InvalidContentType:
+        raise ValidationError, gettext("The URL %s does not point to a valid image.") % field_data
+
+def isValidPhone(field_data, all_data):
+    if not phone_re.search(field_data):
+        raise ValidationError, gettext('Phone numbers must be in XXX-XXX-XXXX format. "%s" is invalid.') % field_data
+
+def isValidQuicktimeVideoURL(field_data, all_data):
+    "Checks that the given URL is a video that can be played by QuickTime (qt, mpeg)"
+    uc = URLMimeTypeCheck(('video/quicktime', 'video/mpeg',))
+    try:
+        uc(field_data, all_data)
+    except URLMimeTypeCheck.InvalidContentType:
+        raise ValidationError, gettext("The URL %s does not point to a valid QuickTime video.") % field_data
+
+def isValidURL(field_data, all_data):
+    if not url_re.search(field_data):
+        raise ValidationError, gettext("A valid URL is required.")
+
+def isValidHTML(field_data, all_data):
+    import urllib, urllib2
+    try:
+        u = urllib2.urlopen('http://validator.w3.org/check', urllib.urlencode({'fragment': field_data, 'output': 'xml'}))
+    except:
+        # Validator or Internet connection is unavailable. Fail silently.
+        return
+    html_is_valid = (u.headers.get('x-w3c-validator-status', 'Invalid') == 'Valid')
+    if html_is_valid:
+        return
+    from xml.dom.minidom import parseString
+    error_messages = [e.firstChild.wholeText for e in parseString(u.read()).getElementsByTagName('messages')[0].getElementsByTagName('msg')]
+    raise ValidationError, gettext("Valid HTML is required. Specific errors are:\n%s") % "\n".join(error_messages)
+
+def isWellFormedXml(field_data, all_data):
+    from xml.dom.minidom import parseString
+    try:
+        parseString(field_data)
+    except Exception, e: # Naked except because we're not sure what will be thrown
+        raise ValidationError, gettext("Badly formed XML: %s") % str(e)
+
+def isWellFormedXmlFragment(field_data, all_data):
+    isWellFormedXml('<root>%s</root>' % field_data, all_data)
+
+def isExistingURL(field_data, all_data):
+    import urllib2
+    try:
+        u = urllib2.urlopen(field_data)
+    except ValueError:
+        raise ValidationError, gettext("Invalid URL: %s") % field_data
+    except urllib2.HTTPError, e:
+        # 401s are valid; they just mean authorization is required.
+        if e.code not in ('401',):
+            raise ValidationError, gettext("The URL %s is a broken link.") % field_data
+    except: # urllib2.URLError, httplib.InvalidURL, etc.
+        raise ValidationError, gettext("The URL %s is a broken link.") % field_data
+
+def isValidUSState(field_data, all_data):
+    "Checks that the given string is a valid two-letter U.S. state abbreviation"
+    states = ['AA', 'AE', 'AK', 'AL', 'AP', 'AR', 'AS', 'AZ', 'CA', 'CO', 'CT', 'DC', 'DE', 'FL', 'FM', 'GA', 'GU', 'HI', 'IA', 'ID', 'IL', 'IN', 'KS', 'KY', 'LA', 'MA', 'MD', 'ME', 'MH', 'MI', 'MN', 'MO', 'MP', 'MS', 'MT', 'NC', 'ND', 'NE', 'NH', 'NJ', 'NM', 'NV', 'NY', 'OH', 'OK', 'OR', 'PA', 'PR', 'PW', 'RI', 'SC', 'SD', 'TN', 'TX', 'UT', 'VA', 'VI', 'VT', 'WA', 'WI', 'WV', 'WY']
+    if field_data.upper() not in states:
+        raise ValidationError, gettext("Enter a valid U.S. state abbreviation.")
+
+def hasNoProfanities(field_data, all_data):
+    """
+    Checks that the given string has no profanities in it. This does a simple
+    check for whether each profanity exists within the string, so 'fuck' will
+    catch 'motherfucker' as well. Raises a ValidationError such as:
+        Watch your mouth! The words "f--k" and "s--t" are not allowed here.
+    """
+    bad_words = ['asshat', 'asshead', 'asshole', 'cunt', 'fuck', 'gook', 'nigger', 'shit'] # all in lower case
+    field_data = field_data.lower() # normalize
+    words_seen = [w for w in bad_words if field_data.find(w) > -1]
+    if words_seen:
+        from django.utils.text import get_text_list
+        plural = len(words_seen) > 1
+        raise ValidationError, ngettext("Watch your mouth! The word %s is not allowed here.",
+            "Watch your mouth! The words %s are not allowed here.", plural) % \
+            get_text_list(['"%s%s%s"' % (i[0], '-'*(len(i)-2), i[-1]) for i in words_seen], 'and')
+
+class AlwaysMatchesOtherField(object):
+    def __init__(self, other_field_name, error_message=None):
+        self.other = other_field_name
+        self.error_message = error_message or lazy_inter(gettext_lazy("This field must match the '%s' field."), self.other)
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if field_data != all_data[self.other]:
+            raise ValidationError, self.error_message
+
+class ValidateIfOtherFieldEquals(object):
+    def __init__(self, other_field, other_value, validator_list):
+        self.other_field, self.other_value = other_field, other_value
+        self.validator_list = validator_list
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if all_data.has_key(self.other_field) and all_data[self.other_field] == self.other_value:
+            for v in self.validator_list:
+                v(field_data, all_data)
+
+class RequiredIfOtherFieldNotGiven(object):
+    def __init__(self, other_field_name, error_message=gettext_lazy("Please enter something for at least one field.")):
+        self.other, self.error_message = other_field_name, error_message
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if not all_data.get(self.other, False) and not field_data:
+            raise ValidationError, self.error_message
+
+class RequiredIfOtherFieldsGiven(object):
+    def __init__(self, other_field_names, error_message=gettext_lazy("Please enter both fields or leave them both empty.")):
+        self.other, self.error_message = other_field_names, error_message
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        for field in self.other:
+            if all_data.get(field, False) and not field_data:
+                raise ValidationError, self.error_message
+
+class RequiredIfOtherFieldGiven(RequiredIfOtherFieldsGiven):
+    "Like RequiredIfOtherFieldsGiven, but takes a single field name instead of a list."
+    def __init__(self, other_field_name, error_message=gettext_lazy("Please enter both fields or leave them both empty.")):
+        RequiredIfOtherFieldsGiven.__init__(self, [other_field_name], error_message)
+
+class RequiredIfOtherFieldEquals(object):
+    def __init__(self, other_field, other_value, error_message=None):
+        self.other_field = other_field
+        self.other_value = other_value
+        self.error_message = error_message or lazy_inter(gettext_lazy("This field must be given if %(field)s is %(value)s"), {
+            'field': other_field, 'value': other_value})
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if all_data.has_key(self.other_field) and all_data[self.other_field] == self.other_value and not field_data:
+            raise ValidationError(self.error_message)
+
+class RequiredIfOtherFieldDoesNotEqual(object):
+    def __init__(self, other_field, other_value, error_message=None):
+        self.other_field = other_field
+        self.other_value = other_value
+        self.error_message = error_message or lazy_inter(gettext_lazy("This field must be given if %(field)s is not %(value)s"), {
+            'field': other_field, 'value': other_value})
+        self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        if all_data.has_key(self.other_field) and all_data[self.other_field] != self.other_value and not field_data:
+            raise ValidationError(self.error_message)
+
+class IsLessThanOtherField(object):
+    def __init__(self, other_field_name, error_message):
+        self.other, self.error_message = other_field_name, error_message
+
+    def __call__(self, field_data, all_data):
+        if field_data > all_data[self.other]:
+            raise ValidationError, self.error_message
+
+class UniqueAmongstFieldsWithPrefix(object):
+    def __init__(self, field_name, prefix, error_message):
+        self.field_name, self.prefix = field_name, prefix
+        self.error_message = error_message or gettext_lazy("Duplicate values are not allowed.")
+
+    def __call__(self, field_data, all_data):
+        for field_name, value in all_data.items():
+            if field_name != self.field_name and value == field_data:
+                raise ValidationError, self.error_message
+
+class IsAPowerOf(object):
+    """
+    >>> v = IsAPowerOf(2)
+    >>> v(4, None)
+    >>> v(8, None)
+    >>> v(16, None)
+    >>> v(17, None)
+    django.core.validators.ValidationError: ['This value must be a power of 2.']
+    """
+    def __init__(self, power_of):
+        self.power_of = power_of
+
+    def __call__(self, field_data, all_data):
+        from math import log
+        val = log(int(field_data)) / log(self.power_of)
+        if val != int(val):
+            raise ValidationError, gettext("This value must be a power of %s.") % self.power_of
+
+class IsValidFloat(object):
+    def __init__(self, max_digits, decimal_places):
+        self.max_digits, self.decimal_places = max_digits, decimal_places
+
+    def __call__(self, field_data, all_data):
+        data = str(field_data)
+        try:
+            float(data)
+        except ValueError:
+            raise ValidationError, gettext("Please enter a valid decimal number.")
+        if len(data) > (self.max_digits + 1):
+            raise ValidationError, ngettext("Please enter a valid decimal number with at most %s total digit.",
+                "Please enter a valid decimal number with at most %s total digits.", self.max_digits) % self.max_digits
+        if (not '.' in data and len(data) > (self.max_digits - self.decimal_places)) or ('.' in data and len(data) > (self.max_digits - (self.decimal_places - len(data.split('.')[1])) + 1)):
+            raise ValidationError, ngettext( "Please enter a valid decimal number with a whole part of at most %s digit.",
+                "Please enter a valid decimal number with a whole part of at most %s digits.", str(self.max_digits-self.decimal_places)) % str(self.max_digits-self.decimal_places)
+        if '.' in data and len(data.split('.')[1]) > self.decimal_places:
+            raise ValidationError, ngettext("Please enter a valid decimal number with at most %s decimal place.",
+                "Please enter a valid decimal number with at most %s decimal places.", self.decimal_places) % self.decimal_places
+
+class HasAllowableSize(object):
+    """
+    Checks that the file-upload field data is a certain size. min_size and
+    max_size are measurements in bytes.
+    """
+    def __init__(self, min_size=None, max_size=None, min_error_message=None, max_error_message=None):
+        self.min_size, self.max_size = min_size, max_size
+        self.min_error_message = min_error_message or lazy_inter(gettext_lazy("Make sure your uploaded file is at least %s bytes big."), min_size)
+        self.max_error_message = max_error_message or lazy_inter(gettext_lazy("Make sure your uploaded file is at most %s bytes big."), max_size)
+
+    def __call__(self, field_data, all_data):
+        try:
+            content = field_data['content']
+        except TypeError:
+            raise ValidationError, gettext_lazy("No file was submitted. Check the encoding type on the form.")
+        if self.min_size is not None and len(content) < self.min_size:
+            raise ValidationError, self.min_error_message
+        if self.max_size is not None and len(content) > self.max_size:
+            raise ValidationError, self.max_error_message
+
+class MatchesRegularExpression(object):
+    """
+    Checks that the field matches the given regular-expression. The regex
+    should be in string format, not already compiled.
+    """
+    def __init__(self, regexp, error_message=gettext_lazy("The format for this field is wrong.")):
+        self.regexp = re.compile(regexp)
+        self.error_message = error_message
+
+    def __call__(self, field_data, all_data):
+        if not self.regexp.search(field_data):
+            raise ValidationError(self.error_message)
+
+class AnyValidator(object):
+    """
+    This validator tries all given validators. If any one of them succeeds,
+    validation passes. If none of them succeeds, the given message is thrown
+    as a validation error. The message is rather unspecific, so it's best to
+    specify one on instantiation.
+    """
+    def __init__(self, validator_list=None, error_message=gettext_lazy("This field is invalid.")):
+        if validator_list is None: validator_list = []
+        self.validator_list = validator_list
+        self.error_message = error_message
+        for v in validator_list:
+            if hasattr(v, 'always_test'):
+                self.always_test = True
+
+    def __call__(self, field_data, all_data):
+        for v in self.validator_list:
+            try:
+                v(field_data, all_data)
+                return
+            except ValidationError, e:
+                pass
+        raise ValidationError(self.error_message)
+
+class URLMimeTypeCheck(object):
+    "Checks that the provided URL points to a document with a listed mime type"
+    class CouldNotRetrieve(ValidationError):
+        pass
+    class InvalidContentType(ValidationError):
+        pass
+
+    def __init__(self, mime_type_list):
+        self.mime_type_list = mime_type_list
+
+    def __call__(self, field_data, all_data):
+        import urllib2
+        try:
+            isValidURL(field_data, all_data)
+        except ValidationError:
+            raise
+        try:
+            info = urllib2.urlopen(field_data).info()
+        except (urllib2.HTTPError, urllib2.URLError):
+            raise URLMimeTypeCheck.CouldNotRetrieve, gettext("Could not retrieve anything from %s.") % field_data
+        content_type = info['content-type']
+        if content_type not in self.mime_type_list:
+            raise URLMimeTypeCheck.InvalidContentType, gettext("The URL %(url)s returned the invalid Content-Type header '%(contenttype)s'.") % {
+                'url': field_data, 'contenttype': content_type}
+
+class RelaxNGCompact(object):
+    "Validate against a Relax NG compact schema"
+    def __init__(self, schema_path, additional_root_element=None):
+        self.schema_path = schema_path
+        self.additional_root_element = additional_root_element
+
+    def __call__(self, field_data, all_data):
+        import os, tempfile
+        if self.additional_root_element:
+            field_data = '<%(are)s>%(data)s\n</%(are)s>' % {
+                'are': self.additional_root_element,
+                'data': field_data
+            }
+        filename = tempfile.mktemp() # Insecure, but nothing else worked
+        fp = open(filename, 'w')
+        fp.write(field_data)
+        fp.close()
+        if not os.path.exists(settings.JING_PATH):
+            raise Exception, "%s not found!" % settings.JING_PATH
+        p = os.popen('%s -c %s %s' % (settings.JING_PATH, self.schema_path, filename))
+        errors = [line.strip() for line in p.readlines()]
+        p.close()
+        os.unlink(filename)
+        display_errors = []
+        lines = field_data.split('\n')
+        for error in errors:
+            ignored, line, level, message = error.split(':', 3)
+            # Scrape the Jing error messages to reword them more nicely.
+            m = re.search(r'Expected "(.*?)" to terminate element starting on line (\d+)', message)
+            if m:
+                display_errors.append(_('Please close the unclosed %(tag)s tag from line %(line)s. (Line starts with "%(start)s".)') % \
+                    {'tag':m.group(1).replace('/', ''), 'line':m.group(2), 'start':lines[int(m.group(2)) - 1][:30]})
+                continue
+            if message.strip() == 'text not allowed here':
+                display_errors.append(_('Some text starting on line %(line)s is not allowed in that context. (Line starts with "%(start)s".)') % \
+                    {'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            m = re.search(r'\s*attribute "(.*?)" not allowed at this point; ignored', message)
+            if m:
+                display_errors.append(_('"%(attr)s" on line %(line)s is an invalid attribute. (Line starts with "%(start)s".)') % \
+                    {'attr':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            m = re.search(r'\s*unknown element "(.*?)"', message)
+            if m:
+                display_errors.append(_('"<%(tag)s>" on line %(line)s is an invalid tag. (Line starts with "%(start)s".)') % \
+                    {'tag':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            if message.strip() == 'required attributes missing':
+                display_errors.append(_('A tag on line %(line)s is missing one or more required attributes. (Line starts with "%(start)s".)') % \
+                    {'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            m = re.search(r'\s*bad value for attribute "(.*?)"', message)
+            if m:
+                display_errors.append(_('The "%(attr)s" attribute on line %(line)s has an invalid value. (Line starts with "%(start)s".)') % \
+                    {'attr':m.group(1), 'line':line, 'start':lines[int(line) - 1][:30]})
+                continue
+            # Failing all those checks, use the default error message.
+            display_error = 'Line %s: %s [%s]' % (line, message, level.strip())
+            display_errors.append(display_error)
+        if len(display_errors) > 0:
+            raise ValidationError, display_errors

Added: vendor/django/current/django/core/xheaders.py
===================================================================
--- vendor/django/current/django/core/xheaders.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/core/xheaders.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,21 @@
+"""
+Pages in Django can are served up with custom HTTP headers containing useful
+information about those pages -- namely, the content type and object ID.
+
+This module contains utility functions for retrieving and doing interesting
+things with these special "X-Headers" (so called because the HTTP spec demands
+that custom headers are prefxed with "X-").
+
+Next time you're at slashdot.org, watch out for X-Fry and X-Bender. :)
+"""
+
+def populate_xheaders(request, response, model, object_id):
+    """
+    Adds the "X-Object-Type" and "X-Object-Id" headers to the given
+    HttpResponse according to the given model and object_id -- but only if the
+    given HttpRequest object has an IP address within the INTERNAL_IPS setting.
+    """
+    from django.conf import settings
+    if request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
+        response['X-Object-Type'] = "%s.%s" % (model._meta.app_label, model._meta.object_name.lower())
+        response['X-Object-Id'] = str(object_id)

Added: vendor/django/current/django/db/__init__.py
===================================================================
--- vendor/django/current/django/db/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,48 @@
+from django.conf import settings
+from django.core import signals
+from django.dispatch import dispatcher
+
+__all__ = ('backend', 'connection', 'DatabaseError')
+
+if not settings.DATABASE_ENGINE:
+    settings.DATABASE_ENGINE = 'dummy'
+
+try:
+    backend = __import__('django.db.backends.%s.base' % settings.DATABASE_ENGINE, '', '', [''])
+except ImportError, e:
+    # The database backend wasn't found. Display a helpful error message
+    # listing all possible database backends.
+    from django.core.exceptions import ImproperlyConfigured
+    import os
+    backend_dir = os.path.join(__path__[0], 'backends')
+    available_backends = [f for f in os.listdir(backend_dir) if not f.startswith('_') and not f.startswith('.') and not f.endswith('.py') and not f.endswith('.pyc')]
+    available_backends.sort()
+    if settings.DATABASE_ENGINE not in available_backends:
+        raise ImproperlyConfigured, "%r isn't an available database backend. vailable options are: %s" % \
+            (settings.DATABASE_ENGINE, ", ".join(map(repr, available_backends)))
+    else:
+        raise # If there's some other error, this must be an error in Django itself.
+
+get_introspection_module = lambda: __import__('django.db.backends.%s.introspection' % settings.DATABASE_ENGINE, '', '', [''])
+get_creation_module = lambda: __import__('django.db.backends.%s.creation' % settings.DATABASE_ENGINE, '', '', [''])
+runshell = lambda: __import__('django.db.backends.%s.client' % settings.DATABASE_ENGINE, '', '', ['']).runshell()
+
+connection = backend.DatabaseWrapper()
+DatabaseError = backend.DatabaseError
+
+# Register an event that closes the database connection
+# when a Django request is finished.
+dispatcher.connect(connection.close, signal=signals.request_finished)
+
+# Register an event that resets connection.queries
+# when a Django request is started.
+def reset_queries():
+    connection.queries = []
+dispatcher.connect(reset_queries, signal=signals.request_started)
+
+# Register an event that rolls back the connection
+# when a Django request has an exception.
+def _rollback_on_exception():
+    from django.db import transaction
+    transaction.rollback_unless_managed()
+dispatcher.connect(_rollback_on_exception, signal=signals.got_request_exception)

Added: vendor/django/current/django/db/backends/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/ado_mssql/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/ado_mssql/base.py
===================================================================
--- vendor/django/current/django/db/backends/ado_mssql/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/ado_mssql/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,150 @@
+"""
+ADO MSSQL database backend for Django.
+
+Requires adodbapi 2.0.1: http://adodbapi.sourceforge.net/
+"""
+
+from django.db.backends import util
+try:
+    import adodbapi as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured, "Error loading adodbapi module: %s" % e
+import datetime
+try:
+    import mx
+except ImportError:
+    mx = None
+
+DatabaseError = Database.DatabaseError
+
+# We need to use a special Cursor class because adodbapi expects question-mark
+# param style, but Django expects "%s". This cursor converts question marks to
+# format-string style.
+class Cursor(Database.Cursor):
+    def executeHelper(self, operation, isStoredProcedureCall, parameters=None):
+        if parameters is not None and "%s" in operation:
+            operation = operation.replace("%s", "?")
+        Database.Cursor.executeHelper(self, operation, isStoredProcedureCall, parameters)
+
+class Connection(Database.Connection):
+    def cursor(self):
+        return Cursor(self)
+Database.Connection = Connection
+
+origCVtoP = Database.convertVariantToPython
+def variantToPython(variant, adType):
+    if type(variant) == bool and adType == 11:
+        return variant  # bool not 1/0
+    res = origCVtoP(variant, adType)
+    if mx is not None and type(res) == mx.DateTime.mxDateTime.DateTimeType:
+        # Convert ms.DateTime objects to Python datetime.datetime objects.
+        tv = list(res.tuple()[:7])
+        tv[-2] = int(tv[-2])
+        return datetime.datetime(*tuple(tv))
+    if type(res) == float and str(res)[-2:] == ".0":
+        return int(res) # If float but int, then int.
+    return res
+Database.convertVariantToPython = variantToPython
+
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # Import copy of _thread_local.py from Python 2.4
+    from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+    def __init__(self):
+        self.connection = None
+        self.queries = []
+
+    def cursor(self):
+        from django.conf import settings
+        if self.connection is None:
+            if settings.DATABASE_NAME == '' or settings.DATABASE_USER == '':
+                from django.core.exceptions import ImproperlyConfigured
+                raise ImproperlyConfigured, "You need to specify both DATABASE_NAME and DATABASE_USER in your Django settings file."
+            if not settings.DATABASE_HOST:
+                settings.DATABASE_HOST = "127.0.0.1"
+            # TODO: Handle DATABASE_PORT.
+            conn_string = "PROVIDER=SQLOLEDB;DATA SOURCE=%s;UID=%s;PWD=%s;DATABASE=%s" % (settings.DATABASE_HOST, settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME)
+            self.connection = Database.connect(conn_string)
+        cursor = self.connection.cursor()
+        if settings.DEBUG:
+            return util.CursorDebugWrapper(cursor, self)
+        return cursor
+
+    def _commit(self):
+        return self.connection.commit()
+
+    def _rollback(self):
+        if self.connection:
+            return self.connection.rollback()
+
+    def close(self):
+        if self.connection is not None:
+            self.connection.close()
+            self.connection = None
+
+supports_constraints = True
+
+def quote_name(name):
+    if name.startswith('[') and name.endswith(']'):
+        return name # Quoting once is enough.
+    return '[%s]' % name
+
+dictfetchone = util.dictfetchone
+dictfetchmany = util.dictfetchmany
+dictfetchall  = util.dictfetchall
+
+def get_last_insert_id(cursor, table_name, pk_name):
+    cursor.execute("SELECT %s FROM %s WHERE %s = @@IDENTITY" % (pk_name, table_name, pk_name))
+    return cursor.fetchone()[0]
+
+def get_date_extract_sql(lookup_type, table_name):
+    # lookup_type is 'year', 'month', 'day'
+    return "DATEPART(%s, %s)" % (lookup_type, table_name)
+
+def get_date_trunc_sql(lookup_type, field_name):
+    # lookup_type is 'year', 'month', 'day'
+    if lookup_type=='year':
+        return "Convert(datetime, Convert(varchar, DATEPART(year, %s)) + '/01/01')" % field_name
+    if lookup_type=='month':
+        return "Convert(datetime, Convert(varchar, DATEPART(year, %s)) + '/' + Convert(varchar, DATEPART(month, %s)) + '/01')" % (field_name, field_name)
+    if lookup_type=='day':
+        return "Convert(datetime, Convert(varchar(12), %s))" % field_name
+
+def get_limit_offset_sql(limit, offset=None):
+    # TODO: This is a guess. Make sure this is correct.
+    sql = "LIMIT %s" % limit
+    if offset and offset != 0:
+        sql += " OFFSET %s" % offset
+    return sql
+
+def get_random_function_sql():
+    return "RAND()"
+
+def get_fulltext_search_sql(field_name):
+    raise NotImplementedError
+
+def get_drop_foreignkey_sql():
+    return "DROP CONSTRAINT"
+
+def get_pk_default_value():
+    return "DEFAULT"
+
+OPERATOR_MAPPING = {
+    'exact': '= %s',
+    'iexact': 'LIKE %s',
+    'contains': 'LIKE %s',
+    'icontains': 'LIKE %s',
+    'gt': '> %s',
+    'gte': '>= %s',
+    'lt': '< %s',
+    'lte': '<= %s',
+    'startswith': 'LIKE %s',
+    'endswith': 'LIKE %s',
+    'istartswith': 'LIKE %s',
+    'iendswith': 'LIKE %s',
+}

Added: vendor/django/current/django/db/backends/ado_mssql/client.py
===================================================================
--- vendor/django/current/django/db/backends/ado_mssql/client.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/ado_mssql/client.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2 @@
+def runshell():
+    raise NotImplementedError

Added: vendor/django/current/django/db/backends/ado_mssql/creation.py
===================================================================
--- vendor/django/current/django/db/backends/ado_mssql/creation.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/ado_mssql/creation.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,26 @@
+DATA_TYPES = {
+    'AutoField':         'int IDENTITY (1, 1)',
+    'BooleanField':      'bit',
+    'CharField':         'varchar(%(maxlength)s)',
+    'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+    'DateField':         'smalldatetime',
+    'DateTimeField':     'smalldatetime',
+    'FileField':         'varchar(100)',
+    'FilePathField':     'varchar(100)',
+    'FloatField':        'numeric(%(max_digits)s, %(decimal_places)s)',
+    'ImageField':        'varchar(100)',
+    'IntegerField':      'int',
+    'IPAddressField':    'char(15)',
+    'ManyToManyField':   None,
+    'NullBooleanField':  'bit',
+    'OneToOneField':     'int',
+    'PhoneNumberField':  'varchar(20)',
+    'PositiveIntegerField': 'int CONSTRAINT [CK_int_pos_%(column)s] CHECK ([%(column)s] > 0)',
+    'PositiveSmallIntegerField': 'smallint CONSTRAINT [CK_smallint_pos_%(column)s] CHECK ([%(column)s] > 0)',
+    'SlugField':         'varchar(%(maxlength)s)',
+    'SmallIntegerField': 'smallint',
+    'TextField':         'text',
+    'TimeField':         'time',
+    'URLField':          'varchar(200)',
+    'USStateField':      'varchar(2)',
+}

Added: vendor/django/current/django/db/backends/ado_mssql/introspection.py
===================================================================
--- vendor/django/current/django/db/backends/ado_mssql/introspection.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/ado_mssql/introspection.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,13 @@
+def get_table_list(cursor):
+    raise NotImplementedError
+
+def get_table_description(cursor, table_name):
+    raise NotImplementedError
+
+def get_relations(cursor, table_name):
+    raise NotImplementedError
+
+def get_indexes(cursor, table_name):
+    raise NotImplementedError
+
+DATA_TYPES_REVERSE = {}

Added: vendor/django/current/django/db/backends/dummy/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/dummy/base.py
===================================================================
--- vendor/django/current/django/db/backends/dummy/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/dummy/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,38 @@
+"""
+Dummy database backend for Django.
+
+Django uses this if the DATABASE_ENGINE setting is empty (None or empty string).
+
+Each of these API functions, except connection.close(), raises
+ImproperlyConfigured.
+"""
+
+from django.core.exceptions import ImproperlyConfigured
+
+def complain(*args, **kwargs):
+    raise ImproperlyConfigured, "You haven't set the DATABASE_ENGINE setting yet."
+
+class DatabaseError(Exception):
+    pass
+
+class DatabaseWrapper:
+    cursor = complain
+    _commit = complain
+    _rollback = complain
+
+    def close(self):
+        pass # close()
+
+supports_constraints = False
+quote_name = complain
+dictfetchone = complain
+dictfetchmany = complain
+dictfetchall = complain
+get_last_insert_id = complain
+get_date_extract_sql = complain
+get_date_trunc_sql = complain
+get_limit_offset_sql = complain
+get_random_function_sql = complain
+get_fulltext_search_sql = complain
+get_drop_foreignkey_sql = complain
+OPERATOR_MAPPING = {}

Added: vendor/django/current/django/db/backends/dummy/client.py
===================================================================
--- vendor/django/current/django/db/backends/dummy/client.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/dummy/client.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,3 @@
+from django.db.backends.dummy.base import complain
+
+runshell = complain

Added: vendor/django/current/django/db/backends/dummy/creation.py
===================================================================
--- vendor/django/current/django/db/backends/dummy/creation.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/dummy/creation.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+DATA_TYPES = {}

Added: vendor/django/current/django/db/backends/dummy/introspection.py
===================================================================
--- vendor/django/current/django/db/backends/dummy/introspection.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/dummy/introspection.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,8 @@
+from django.db.backends.dummy.base import complain
+
+get_table_list = complain
+get_table_description = complain
+get_relations = complain
+get_indexes = complain
+
+DATA_TYPES_REVERSE = {}

Added: vendor/django/current/django/db/backends/mysql/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/mysql/base.py
===================================================================
--- vendor/django/current/django/db/backends/mysql/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/mysql/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,177 @@
+"""
+MySQL database backend for Django.
+
+Requires MySQLdb: http://sourceforge.net/projects/mysql-python
+"""
+
+from django.db.backends import util
+try:
+    import MySQLdb as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured, "Error loading MySQLdb module: %s" % e
+from MySQLdb.converters import conversions
+from MySQLdb.constants import FIELD_TYPE
+import types
+
+DatabaseError = Database.DatabaseError
+
+django_conversions = conversions.copy()
+django_conversions.update({
+    types.BooleanType: util.rev_typecast_boolean,
+    FIELD_TYPE.DATETIME: util.typecast_timestamp,
+    FIELD_TYPE.DATE: util.typecast_date,
+    FIELD_TYPE.TIME: util.typecast_time,
+})
+
+# This is an extra debug layer over MySQL queries, to display warnings.
+# It's only used when DEBUG=True.
+class MysqlDebugWrapper:
+    def __init__(self, cursor):
+        self.cursor = cursor
+
+    def execute(self, sql, params=()):
+        try:
+            return self.cursor.execute(sql, params)
+        except Database.Warning, w:
+            self.cursor.execute("SHOW WARNINGS")
+            raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
+
+    def executemany(self, sql, param_list):
+        try:
+            return self.cursor.executemany(sql, param_list)
+        except Database.Warning, w:
+            self.cursor.execute("SHOW WARNINGS")
+            raise Database.Warning, "%s: %s" % (w, self.cursor.fetchall())
+
+    def __getattr__(self, attr):
+        if self.__dict__.has_key(attr):
+            return self.__dict__[attr]
+        else:
+            return getattr(self.cursor, attr)
+
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # Import copy of _thread_local.py from Python 2.4
+    from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+    def __init__(self):
+        self.connection = None
+        self.queries = []
+
+    def _valid_connection(self):
+        if self.connection is not None:
+            try:
+                self.connection.ping()
+                return True
+            except DatabaseError:
+                self.connection.close()
+                self.connection = None
+        return False
+
+    def cursor(self):
+        from django.conf import settings
+        if not self._valid_connection():
+            kwargs = {
+                'user': settings.DATABASE_USER,
+                'db': settings.DATABASE_NAME,
+                'passwd': settings.DATABASE_PASSWORD,
+                'conv': django_conversions,
+            }
+            if settings.DATABASE_HOST.startswith('/'):
+                kwargs['unix_socket'] = settings.DATABASE_HOST
+            else:
+                kwargs['host'] = settings.DATABASE_HOST
+            if settings.DATABASE_PORT:
+                kwargs['port'] = int(settings.DATABASE_PORT)
+            self.connection = Database.connect(**kwargs)
+        cursor = self.connection.cursor()
+        if self.connection.get_server_info() >= '4.1':
+            cursor.execute("SET NAMES 'utf8'")
+        if settings.DEBUG:
+            return util.CursorDebugWrapper(MysqlDebugWrapper(cursor), self)
+        return cursor
+
+    def _commit(self):
+        self.connection.commit()
+
+    def _rollback(self):
+        if self.connection:
+            try:
+                self.connection.rollback()
+            except Database.NotSupportedError:
+                pass
+
+    def close(self):
+        if self.connection is not None:
+            self.connection.close()
+            self.connection = None
+
+supports_constraints = True
+
+def quote_name(name):
+    if name.startswith("`") and name.endswith("`"):
+        return name # Quoting once is enough.
+    return "`%s`" % name
+
+dictfetchone = util.dictfetchone
+dictfetchmany = util.dictfetchmany
+dictfetchall  = util.dictfetchall
+
+def get_last_insert_id(cursor, table_name, pk_name):
+    return cursor.lastrowid
+
+def get_date_extract_sql(lookup_type, table_name):
+    # lookup_type is 'year', 'month', 'day'
+    # http://dev.mysql.com/doc/mysql/en/date-and-time-functions.html
+    return "EXTRACT(%s FROM %s)" % (lookup_type.upper(), table_name)
+
+def get_date_trunc_sql(lookup_type, field_name):
+    # lookup_type is 'year', 'month', 'day'
+    fields = ['year', 'month', 'day', 'hour', 'minute', 'second']
+    format = ('%%Y-', '%%m', '-%%d', ' %%H:', '%%i', ':%%s') # Use double percents to escape.
+    format_def = ('0000-', '01', '-01', ' 00:', '00', ':00')
+    try:
+        i = fields.index(lookup_type) + 1
+    except ValueError:
+        sql = field_name
+    else:
+        format_str = ''.join([f for f in format[:i]] + [f for f in format_def[i:]])
+        sql = "CAST(DATE_FORMAT(%s, '%s') AS DATETIME)" % (field_name, format_str)
+    return sql
+
+def get_limit_offset_sql(limit, offset=None):
+    sql = "LIMIT "
+    if offset and offset != 0:
+        sql += "%s," % offset
+    return sql + str(limit)
+
+def get_random_function_sql():
+    return "RAND()"
+
+def get_fulltext_search_sql(field_name):
+    return 'MATCH (%s) AGAINST (%%s IN BOOLEAN MODE)' % field_name
+
+def get_drop_foreignkey_sql():
+    return "DROP FOREIGN KEY"
+
+def get_pk_default_value():
+    return "DEFAULT"
+
+OPERATOR_MAPPING = {
+    'exact': '= %s',
+    'iexact': 'LIKE %s',
+    'contains': 'LIKE BINARY %s',
+    'icontains': 'LIKE %s',
+    'gt': '> %s',
+    'gte': '>= %s',
+    'lt': '< %s',
+    'lte': '<= %s',
+    'startswith': 'LIKE BINARY %s',
+    'endswith': 'LIKE BINARY %s',
+    'istartswith': 'LIKE %s',
+    'iendswith': 'LIKE %s',
+}

Added: vendor/django/current/django/db/backends/mysql/client.py
===================================================================
--- vendor/django/current/django/db/backends/mysql/client.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/mysql/client.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,14 @@
+from django.conf import settings
+import os
+
+def runshell():
+    args = ['']
+    args += ["--user=%s" % settings.DATABASE_USER]
+    if settings.DATABASE_PASSWORD:
+        args += ["--password=%s" % settings.DATABASE_PASSWORD]
+    if settings.DATABASE_HOST:
+        args += ["--host=%s" % settings.DATABASE_HOST]
+    if settings.DATABASE_PORT:
+        args += ["--port=%s" % settings.DATABASE_PORT]
+    args += [settings.DATABASE_NAME]
+    os.execvp('mysql', args)

Added: vendor/django/current/django/db/backends/mysql/creation.py
===================================================================
--- vendor/django/current/django/db/backends/mysql/creation.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/mysql/creation.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,30 @@
+# This dictionary maps Field objects to their associated MySQL column
+# types, as strings. Column-type strings can contain format strings; they'll
+# be interpolated against the values of Field.__dict__ before being output.
+# If a column type is set to None, it won't be included in the output.
+DATA_TYPES = {
+    'AutoField':         'integer AUTO_INCREMENT',
+    'BooleanField':      'bool',
+    'CharField':         'varchar(%(maxlength)s)',
+    'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+    'DateField':         'date',
+    'DateTimeField':     'datetime',
+    'FileField':         'varchar(100)',
+    'FilePathField':     'varchar(100)',
+    'FloatField':        'numeric(%(max_digits)s, %(decimal_places)s)',
+    'ImageField':        'varchar(100)',
+    'IntegerField':      'integer',
+    'IPAddressField':    'char(15)',
+    'ManyToManyField':   None,
+    'NullBooleanField':  'bool',
+    'OneToOneField':     'integer',
+    'PhoneNumberField':  'varchar(20)',
+    'PositiveIntegerField': 'integer UNSIGNED',
+    'PositiveSmallIntegerField': 'smallint UNSIGNED',
+    'SlugField':         'varchar(%(maxlength)s)',
+    'SmallIntegerField': 'smallint',
+    'TextField':         'longtext',
+    'TimeField':         'time',
+    'URLField':          'varchar(200)',
+    'USStateField':      'varchar(2)',
+}

Added: vendor/django/current/django/db/backends/mysql/introspection.py
===================================================================
--- vendor/django/current/django/db/backends/mysql/introspection.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/mysql/introspection.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,94 @@
+from django.db.backends.mysql.base import quote_name
+from MySQLdb import ProgrammingError, OperationalError
+from MySQLdb.constants import FIELD_TYPE
+import re
+
+foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)")
+
+def get_table_list(cursor):
+    "Returns a list of table names in the current database."
+    cursor.execute("SHOW TABLES")
+    return [row[0] for row in cursor.fetchall()]
+
+def get_table_description(cursor, table_name):
+    "Returns a description of the table, with the DB-API cursor.description interface."
+    cursor.execute("SELECT * FROM %s LIMIT 1" % quote_name(table_name))
+    return cursor.description
+
+def _name_to_index(cursor, table_name):
+    """
+    Returns a dictionary of {field_name: field_index} for the given table.
+    Indexes are 0-based.
+    """
+    return dict([(d[0], i) for i, d in enumerate(get_table_description(cursor, table_name))])
+
+def get_relations(cursor, table_name):
+    """
+    Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+    representing all relationships to the given table. Indexes are 0-based.
+    """
+    my_field_dict = _name_to_index(cursor, table_name)
+    constraints = []
+    relations = {}
+    try:
+        # This should work for MySQL 5.0.
+        cursor.execute("""
+            SELECT column_name, referenced_table_name, referenced_column_name
+            FROM information_schema.key_column_usage
+            WHERE table_name = %s
+                AND referenced_table_name IS NOT NULL
+                AND referenced_column_name IS NOT NULL""", [table_name])
+        constraints.extend(cursor.fetchall())
+    except (ProgrammingError, OperationalError):
+        # Fall back to "SHOW CREATE TABLE", for previous MySQL versions.
+        # Go through all constraints and save the equal matches.
+        cursor.execute("SHOW CREATE TABLE %s" % table_name)
+        for row in cursor.fetchall():
+            pos = 0
+            while True:
+                match = foreign_key_re.search(row[1], pos)
+                if match == None:
+                    break
+                pos = match.end()
+                constraints.append(match.groups())
+
+    for my_fieldname, other_table, other_field in constraints:
+        other_field_index = _name_to_index(cursor, other_table)[other_field]
+        my_field_index = my_field_dict[my_fieldname]
+        relations[my_field_index] = (other_field_index, other_table)
+
+    return relations
+
+def get_indexes(cursor, table_name):
+    """
+    Returns a dictionary of fieldname -> infodict for the given table,
+    where each infodict is in the format:
+        {'primary_key': boolean representing whether it's the primary key,
+         'unique': boolean representing whether it's a unique index}
+    """
+    cursor.execute("SHOW INDEX FROM %s" % quote_name(table_name))
+    indexes = {}
+    for row in cursor.fetchall():
+        indexes[row[4]] = {'primary_key': (row[2] == 'PRIMARY'), 'unique': not bool(row[1])}
+    return indexes
+
+DATA_TYPES_REVERSE = {
+    FIELD_TYPE.BLOB: 'TextField',
+    FIELD_TYPE.CHAR: 'CharField',
+    FIELD_TYPE.DECIMAL: 'FloatField',
+    FIELD_TYPE.DATE: 'DateField',
+    FIELD_TYPE.DATETIME: 'DateTimeField',
+    FIELD_TYPE.DOUBLE: 'FloatField',
+    FIELD_TYPE.FLOAT: 'FloatField',
+    FIELD_TYPE.INT24: 'IntegerField',
+    FIELD_TYPE.LONG: 'IntegerField',
+    FIELD_TYPE.LONGLONG: 'IntegerField',
+    FIELD_TYPE.SHORT: 'IntegerField',
+    FIELD_TYPE.STRING: 'TextField',
+    FIELD_TYPE.TIMESTAMP: 'DateTimeField',
+    FIELD_TYPE.TINY: 'IntegerField',
+    FIELD_TYPE.TINY_BLOB: 'TextField',
+    FIELD_TYPE.MEDIUM_BLOB: 'TextField',
+    FIELD_TYPE.LONG_BLOB: 'TextField',
+    FIELD_TYPE.VAR_STRING: 'CharField',
+}

Added: vendor/django/current/django/db/backends/oracle/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/oracle/base.py
===================================================================
--- vendor/django/current/django/db/backends/oracle/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/oracle/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,132 @@
+"""
+Oracle database backend for Django.
+
+Requires cx_Oracle: http://www.python.net/crew/atuining/cx_Oracle/
+"""
+
+from django.db.backends import util
+try:
+    import cx_Oracle as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured, "Error loading cx_Oracle module: %s" % e
+
+DatabaseError = Database.Error
+
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # Import copy of _thread_local.py from Python 2.4
+    from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+    def __init__(self):
+        self.connection = None
+        self.queries = []
+
+    def _valid_connection(self):
+        return self.connection is not None
+
+    def cursor(self):
+        from django.conf import settings
+        if not self._valid_connection():
+            if len(settings.DATABASE_HOST.strip()) == 0:
+                settings.DATABASE_HOST = 'localhost'
+            if len(settings.DATABASE_PORT.strip()) != 0:
+                dsn = Database.makedsn(settings.DATABASE_HOST, int(settings.DATABASE_PORT), settings.DATABASE_NAME)
+                self.connection = Database.connect(settings.DATABASE_USER, settings.DATABASE_PASSWORD, dsn)
+            else:
+                conn_string = "%s/%s@%s" % (settings.DATABASE_USER, settings.DATABASE_PASSWORD, settings.DATABASE_NAME)
+                self.connection = Database.connect(conn_string)
+        return FormatStylePlaceholderCursor(self.connection)
+
+    def _commit(self):
+        self.connection.commit()
+
+    def _rollback(self):
+        if self.connection:
+            try:
+                self.connection.rollback()
+            except Database.NotSupportedError:
+                pass
+
+    def close(self):
+        if self.connection is not None:
+            self.connection.close()
+            self.connection = None
+
+supports_constraints = True
+
+class FormatStylePlaceholderCursor(Database.Cursor):
+    """
+    Django uses "format" (e.g. '%s') style placeholders, but Oracle uses ":var" style.
+    This fixes it -- but note that if you want to use a literal "%s" in a query,
+    you'll need to use "%%s".
+    """
+    def execute(self, query, params=None):
+        if params is None: params = []
+        query = self.convert_arguments(query, len(params))
+        return Database.Cursor.execute(self, query, params)
+
+    def executemany(self, query, params=None):
+        if params is None: params = []
+        query = self.convert_arguments(query, len(params[0]))
+        return Database.Cursor.executemany(self, query, params)
+
+    def convert_arguments(self, query, num_params):
+        # replace occurances of "%s" with ":arg" - Oracle requires colons for parameter placeholders.
+        args = [':arg' for i in range(num_params)]
+        return query % tuple(args)
+
+def quote_name(name):
+    return name
+
+dictfetchone = util.dictfetchone
+dictfetchmany = util.dictfetchmany
+dictfetchall  = util.dictfetchall
+
+def get_last_insert_id(cursor, table_name, pk_name):
+    query = "SELECT %s_sq.currval from dual" % table_name
+    cursor.execute(query)
+    return cursor.fetchone()[0]
+
+def get_date_extract_sql(lookup_type, table_name):
+    # lookup_type is 'year', 'month', 'day'
+    # http://www.psoug.org/reference/date_func.html
+    return "EXTRACT(%s FROM %s)" % (lookup_type, table_name)
+
+def get_date_trunc_sql(lookup_type, field_name):
+    return "EXTRACT(%s FROM TRUNC(%s))" % (lookup_type, field_name)
+
+def get_limit_offset_sql(limit, offset=None):
+    # Limits and offset are too complicated to be handled here.
+    # Instead, they are handled in django/db/query.py.
+    pass
+
+def get_random_function_sql():
+    return "DBMS_RANDOM.RANDOM"
+
+def get_fulltext_search_sql(field_name):
+    raise NotImplementedError
+
+def get_drop_foreignkey_sql():
+    return "DROP FOREIGN KEY"
+
+def get_pk_default_value():
+    return "DEFAULT"
+
+OPERATOR_MAPPING = {
+    'exact': '= %s',
+    'iexact': 'LIKE %s',
+    'contains': 'LIKE %s',
+    'icontains': 'LIKE %s',
+    'gt': '> %s',
+    'gte': '>= %s',
+    'lt': '< %s',
+    'lte': '<= %s',
+    'startswith': 'LIKE %s',
+    'endswith': 'LIKE %s',
+    'istartswith': 'LIKE %s',
+    'iendswith': 'LIKE %s',
+}

Added: vendor/django/current/django/db/backends/oracle/client.py
===================================================================
--- vendor/django/current/django/db/backends/oracle/client.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/oracle/client.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+from django.conf import settings
+import os
+
+def runshell():
+    args = ''
+    args += settings.DATABASE_USER
+    if settings.DATABASE_PASSWORD:
+        args += "/%s" % settings.DATABASE_PASSWORD
+    args += "@%s" % settings.DATABASE_NAME
+    os.execvp('sqlplus', args)

Added: vendor/django/current/django/db/backends/oracle/creation.py
===================================================================
--- vendor/django/current/django/db/backends/oracle/creation.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/oracle/creation.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,26 @@
+DATA_TYPES = {
+    'AutoField':         'number(38)',
+    'BooleanField':      'number(1)',
+    'CharField':         'varchar2(%(maxlength)s)',
+    'CommaSeparatedIntegerField': 'varchar2(%(maxlength)s)',
+    'DateField':         'date',
+    'DateTimeField':     'date',
+    'FileField':         'varchar2(100)',
+    'FilePathField':     'varchar2(100)',
+    'FloatField':        'number(%(max_digits)s, %(decimal_places)s)',
+    'ImageField':        'varchar2(100)',
+    'IntegerField':      'integer',
+    'IPAddressField':    'char(15)',
+    'ManyToManyField':   None,
+    'NullBooleanField':  'integer',
+    'OneToOneField':     'integer',
+    'PhoneNumberField':  'varchar(20)',
+    'PositiveIntegerField': 'integer',
+    'PositiveSmallIntegerField': 'smallint',
+    'SlugField':         'varchar(50)',
+    'SmallIntegerField': 'smallint',
+    'TextField':         'long',
+    'TimeField':         'timestamp',
+    'URLField':          'varchar(200)',
+    'USStateField':      'varchar(2)',
+}

Added: vendor/django/current/django/db/backends/oracle/introspection.py
===================================================================
--- vendor/django/current/django/db/backends/oracle/introspection.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/oracle/introspection.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,50 @@
+import re
+
+foreign_key_re = re.compile(r"\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)")
+
+def get_table_list(cursor):
+    "Returns a list of table names in the current database."
+    cursor.execute("SELECT TABLE_NAME FROM USER_TABLES")
+    return [row[0] for row in cursor.fetchall()]
+
+def get_table_description(cursor, table_name):
+    return table_name
+
+def _name_to_index(cursor, table_name):
+    """
+    Returns a dictionary of {field_name: field_index} for the given table.
+    Indexes are 0-based.
+    """
+    return dict([(d[0], i) for i, d in enumerate(get_table_description(cursor, table_name))])
+
+def get_relations(cursor, table_name):
+    """
+    Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+    representing all relationships to the given table. Indexes are 0-based.
+    """
+    raise NotImplementedError
+
+def get_indexes(cursor, table_name):
+    """
+    Returns a dictionary of fieldname -> infodict for the given table,
+    where each infodict is in the format:
+        {'primary_key': boolean representing whether it's the primary key,
+         'unique': boolean representing whether it's a unique index}
+    """
+    raise NotImplementedError
+
+# Maps type codes to Django Field types.
+DATA_TYPES_REVERSE = {
+    16: 'BooleanField',
+    21: 'SmallIntegerField',
+    23: 'IntegerField',
+    25: 'TextField',
+    869: 'IPAddressField',
+    1043: 'CharField',
+    1082: 'DateField',
+    1083: 'TimeField',
+    1114: 'DateTimeField',
+    1184: 'DateTimeField',
+    1266: 'TimeField',
+    1700: 'FloatField',
+}

Added: vendor/django/current/django/db/backends/postgresql/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/postgresql/base.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,138 @@
+"""
+PostgreSQL database backend for Django.
+
+Requires psycopg 1: http://initd.org/projects/psycopg1
+"""
+
+from django.db.backends import util
+try:
+    import psycopg as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured, "Error loading psycopg module: %s" % e
+
+DatabaseError = Database.DatabaseError
+
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # Import copy of _thread_local.py from Python 2.4
+    from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+    def __init__(self):
+        self.connection = None
+        self.queries = []
+
+    def cursor(self):
+        from django.conf import settings
+        if self.connection is None:
+            if settings.DATABASE_NAME == '':
+                from django.core.exceptions import ImproperlyConfigured
+                raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file."
+            conn_string = "dbname=%s" % settings.DATABASE_NAME
+            if settings.DATABASE_USER:
+                conn_string = "user=%s %s" % (settings.DATABASE_USER, conn_string)
+            if settings.DATABASE_PASSWORD:
+                conn_string += " password='%s'" % settings.DATABASE_PASSWORD
+            if settings.DATABASE_HOST:
+                conn_string += " host=%s" % settings.DATABASE_HOST
+            if settings.DATABASE_PORT:
+                conn_string += " port=%s" % settings.DATABASE_PORT
+            self.connection = Database.connect(conn_string)
+            self.connection.set_isolation_level(1) # make transactions transparent to all cursors
+        cursor = self.connection.cursor()
+        cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+        if settings.DEBUG:
+            return util.CursorDebugWrapper(cursor, self)
+        return cursor
+
+    def _commit(self):
+        return self.connection.commit()
+
+    def _rollback(self):
+        if self.connection:
+            return self.connection.rollback()
+
+    def close(self):
+        if self.connection is not None:
+            self.connection.close()
+            self.connection = None
+
+supports_constraints = True
+
+def quote_name(name):
+    if name.startswith('"') and name.endswith('"'):
+        return name # Quoting once is enough.
+    return '"%s"' % name
+
+def dictfetchone(cursor):
+    "Returns a row from the cursor as a dict"
+    return cursor.dictfetchone()
+
+def dictfetchmany(cursor, number):
+    "Returns a certain number of rows from a cursor as a dict"
+    return cursor.dictfetchmany(number)
+
+def dictfetchall(cursor):
+    "Returns all rows from a cursor as a dict"
+    return cursor.dictfetchall()
+
+def get_last_insert_id(cursor, table_name, pk_name):
+    cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name, pk_name))
+    return cursor.fetchone()[0]
+
+def get_date_extract_sql(lookup_type, table_name):
+    # lookup_type is 'year', 'month', 'day'
+    # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
+    return "EXTRACT('%s' FROM %s)" % (lookup_type, table_name)
+
+def get_date_trunc_sql(lookup_type, field_name):
+    # lookup_type is 'year', 'month', 'day'
+    # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
+    return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
+
+def get_limit_offset_sql(limit, offset=None):
+    sql = "LIMIT %s" % limit
+    if offset and offset != 0:
+        sql += " OFFSET %s" % offset
+    return sql
+
+def get_random_function_sql():
+    return "RANDOM()"
+
+def get_fulltext_search_sql(field_name):
+    raise NotImplementedError
+
+def get_drop_foreignkey_sql():
+    return "DROP CONSTRAINT"
+
+def get_pk_default_value():
+    return "DEFAULT"
+
+# Register these custom typecasts, because Django expects dates/times to be
+# in Python's native (standard-library) datetime/time format, whereas psycopg
+# use mx.DateTime by default.
+try:
+    Database.register_type(Database.new_type((1082,), "DATE", util.typecast_date))
+except AttributeError:
+    raise Exception, "You appear to be using psycopg version 2, which isn't supported yet, because it's still in beta. Use psycopg version 1 instead: http://initd.org/projects/psycopg1"
+Database.register_type(Database.new_type((1083,1266), "TIME", util.typecast_time))
+Database.register_type(Database.new_type((1114,1184), "TIMESTAMP", util.typecast_timestamp))
+Database.register_type(Database.new_type((16,), "BOOLEAN", util.typecast_boolean))
+
+OPERATOR_MAPPING = {
+    'exact': '= %s',
+    'iexact': 'ILIKE %s',
+    'contains': 'LIKE %s',
+    'icontains': 'ILIKE %s',
+    'gt': '> %s',
+    'gte': '>= %s',
+    'lt': '< %s',
+    'lte': '<= %s',
+    'startswith': 'LIKE %s',
+    'endswith': 'LIKE %s',
+    'istartswith': 'ILIKE %s',
+    'iendswith': 'ILIKE %s',
+}

Added: vendor/django/current/django/db/backends/postgresql/client.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql/client.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql/client.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,15 @@
+from django.conf import settings
+import os
+
+def runshell():
+    args = ['psql']
+    if settings.DATABASE_USER:
+        args += ["-U", settings.DATABASE_USER]
+    if settings.DATABASE_PASSWORD:
+        args += ["-W"]
+    if settings.DATABASE_HOST:
+        args.extend(["-h", settings.DATABASE_HOST])
+    if settings.DATABASE_PORT:
+        args.extend(["-p", str(settings.DATABASE_PORT)])
+    args += [settings.DATABASE_NAME]
+    os.execvp('psql', args)

Added: vendor/django/current/django/db/backends/postgresql/creation.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql/creation.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql/creation.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,30 @@
+# This dictionary maps Field objects to their associated PostgreSQL column
+# types, as strings. Column-type strings can contain format strings; they'll
+# be interpolated against the values of Field.__dict__ before being output.
+# If a column type is set to None, it won't be included in the output.
+DATA_TYPES = {
+    'AutoField':         'serial',
+    'BooleanField':      'boolean',
+    'CharField':         'varchar(%(maxlength)s)',
+    'CommaSeparatedIntegerField': 'varchar(%(maxlength)s)',
+    'DateField':         'date',
+    'DateTimeField':     'timestamp with time zone',
+    'FileField':         'varchar(100)',
+    'FilePathField':     'varchar(100)',
+    'FloatField':        'numeric(%(max_digits)s, %(decimal_places)s)',
+    'ImageField':        'varchar(100)',
+    'IntegerField':      'integer',
+    'IPAddressField':    'inet',
+    'ManyToManyField':   None,
+    'NullBooleanField':  'boolean',
+    'OneToOneField':     'integer',
+    'PhoneNumberField':  'varchar(20)',
+    'PositiveIntegerField': 'integer CHECK ("%(column)s" >= 0)',
+    'PositiveSmallIntegerField': 'smallint CHECK ("%(column)s" >= 0)',
+    'SlugField':         'varchar(%(maxlength)s)',
+    'SmallIntegerField': 'smallint',
+    'TextField':         'text',
+    'TimeField':         'time',
+    'URLField':          'varchar(200)',
+    'USStateField':      'varchar(2)',
+}

Added: vendor/django/current/django/db/backends/postgresql/introspection.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql/introspection.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql/introspection.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,83 @@
+from django.db.backends.postgresql.base import quote_name
+
+def get_table_list(cursor):
+    "Returns a list of table names in the current database."
+    cursor.execute("""
+        SELECT c.relname
+        FROM pg_catalog.pg_class c
+        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+        WHERE c.relkind IN ('r', 'v', '')
+            AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
+            AND pg_catalog.pg_table_is_visible(c.oid)""")
+    return [row[0] for row in cursor.fetchall()]
+
+def get_table_description(cursor, table_name):
+    "Returns a description of the table, with the DB-API cursor.description interface."
+    cursor.execute("SELECT * FROM %s LIMIT 1" % quote_name(table_name))
+    return cursor.description
+
+def get_relations(cursor, table_name):
+    """
+    Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+    representing all relationships to the given table. Indexes are 0-based.
+    """
+    cursor.execute("""
+        SELECT con.conkey, con.confkey, c2.relname
+        FROM pg_constraint con, pg_class c1, pg_class c2
+        WHERE c1.oid = con.conrelid
+            AND c2.oid = con.confrelid
+            AND c1.relname = %s
+            AND con.contype = 'f'""", [table_name])
+    relations = {}
+    for row in cursor.fetchall():
+        try:
+            # row[0] and row[1] are like "{2}", so strip the curly braces.
+            relations[int(row[0][1:-1]) - 1] = (int(row[1][1:-1]) - 1, row[2])
+        except ValueError:
+            continue
+    return relations
+
+def get_indexes(cursor, table_name):
+    """
+    Returns a dictionary of fieldname -> infodict for the given table,
+    where each infodict is in the format:
+        {'primary_key': boolean representing whether it's the primary key,
+         'unique': boolean representing whether it's a unique index}
+    """
+    # This query retrieves each index on the given table, including the
+    # first associated field name
+    cursor.execute("""
+        SELECT attr.attname, idx.indkey, idx.indisunique, idx.indisprimary
+        FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
+            pg_catalog.pg_index idx, pg_catalog.pg_attribute attr
+        WHERE c.oid = idx.indrelid
+            AND idx.indexrelid = c2.oid
+            AND attr.attrelid = c.oid
+            AND attr.attnum = idx.indkey[0]
+            AND c.relname = %s""", [table_name])
+    indexes = {}
+    for row in cursor.fetchall():
+        # row[1] (idx.indkey) is stored in the DB as an array. It comes out as
+        # a string of space-separated integers. This designates the field
+        # indexes (1-based) of the fields that have indexes on the table.
+        # Here, we skip any indexes across multiple fields.
+        if ' ' in row[1]:
+            continue
+        indexes[row[0]] = {'primary_key': row[3], 'unique': row[2]}
+    return indexes
+
+# Maps type codes to Django Field types.
+DATA_TYPES_REVERSE = {
+    16: 'BooleanField',
+    21: 'SmallIntegerField',
+    23: 'IntegerField',
+    25: 'TextField',
+    869: 'IPAddressField',
+    1043: 'CharField',
+    1082: 'DateField',
+    1083: 'TimeField',
+    1114: 'DateTimeField',
+    1184: 'DateTimeField',
+    1266: 'TimeField',
+    1700: 'FloatField',
+}

Added: vendor/django/current/django/db/backends/postgresql_psycopg2/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/postgresql_psycopg2/base.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql_psycopg2/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql_psycopg2/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,133 @@
+"""
+PostgreSQL database backend for Django.
+
+Requires psycopg 2: http://initd.org/projects/psycopg2
+"""
+
+from django.db.backends import util
+try:
+    import psycopg2 as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured, "Error loading psycopg2 module: %s" % e
+
+DatabaseError = Database.DatabaseError
+
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # Import copy of _thread_local.py from Python 2.4
+    from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+    def __init__(self):
+        self.connection = None
+        self.queries = []
+
+    def cursor(self):
+        from django.conf import settings
+        if self.connection is None:
+            if settings.DATABASE_NAME == '':
+                from django.core.exceptions import ImproperlyConfigured
+                raise ImproperlyConfigured, "You need to specify DATABASE_NAME in your Django settings file."
+            conn_string = "dbname=%s" % settings.DATABASE_NAME
+            if settings.DATABASE_USER:
+                conn_string = "user=%s %s" % (settings.DATABASE_USER, conn_string)
+            if settings.DATABASE_PASSWORD:
+                conn_string += " password='%s'" % settings.DATABASE_PASSWORD
+            if settings.DATABASE_HOST:
+                conn_string += " host=%s" % settings.DATABASE_HOST
+            if settings.DATABASE_PORT:
+                conn_string += " port=%s" % settings.DATABASE_PORT
+            self.connection = Database.connect(conn_string)
+            self.connection.set_isolation_level(1) # make transactions transparent to all cursors
+        cursor = self.connection.cursor()
+        cursor.execute("SET TIME ZONE %s", [settings.TIME_ZONE])
+        if settings.DEBUG:
+            return util.CursorDebugWrapper(cursor, self)
+        return cursor
+
+    def _commit(self):
+        return self.connection.commit()
+
+    def _rollback(self):
+        if self.connection:
+            return self.connection.rollback()
+
+    def close(self):
+        if self.connection is not None:
+            self.connection.close()
+            self.connection = None
+
+supports_constraints = True
+
+def quote_name(name):
+    if name.startswith('"') and name.endswith('"'):
+        return name # Quoting once is enough.
+    return '"%s"' % name
+
+def dictfetchone(cursor):
+    "Returns a row from the cursor as a dict"
+    # TODO: cursor.dictfetchone() doesn't exist in psycopg2,
+    # but no Django code uses this. Safe to remove?
+    return cursor.dictfetchone()
+
+def dictfetchmany(cursor, number):
+    "Returns a certain number of rows from a cursor as a dict"
+    # TODO: cursor.dictfetchmany() doesn't exist in psycopg2,
+    # but no Django code uses this. Safe to remove?
+    return cursor.dictfetchmany(number)
+
+def dictfetchall(cursor):
+    "Returns all rows from a cursor as a dict"
+    # TODO: cursor.dictfetchall() doesn't exist in psycopg2,
+    # but no Django code uses this. Safe to remove?
+    return cursor.dictfetchall()
+
+def get_last_insert_id(cursor, table_name, pk_name):
+    cursor.execute("SELECT CURRVAL('\"%s_%s_seq\"')" % (table_name, pk_name))
+    return cursor.fetchone()[0]
+
+def get_date_extract_sql(lookup_type, table_name):
+    # lookup_type is 'year', 'month', 'day'
+    # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-EXTRACT
+    return "EXTRACT('%s' FROM %s)" % (lookup_type, table_name)
+
+def get_date_trunc_sql(lookup_type, field_name):
+    # lookup_type is 'year', 'month', 'day'
+    # http://www.postgresql.org/docs/8.0/static/functions-datetime.html#FUNCTIONS-DATETIME-TRUNC
+    return "DATE_TRUNC('%s', %s)" % (lookup_type, field_name)
+
+def get_limit_offset_sql(limit, offset=None):
+    sql = "LIMIT %s" % limit
+    if offset and offset != 0:
+        sql += " OFFSET %s" % offset
+    return sql
+
+def get_random_function_sql():
+    return "RANDOM()"
+
+def get_fulltext_search_sql(field_name):
+    raise NotImplementedError
+
+def get_drop_foreignkey_sql():
+    return "DROP CONSTRAINT"
+
+def get_pk_default_value():
+    return "DEFAULT"
+
+OPERATOR_MAPPING = {
+    'exact': '= %s',
+    'iexact': 'ILIKE %s',
+    'contains': 'LIKE %s',
+    'icontains': 'ILIKE %s',
+    'gt': '> %s',
+    'gte': '>= %s',
+    'lt': '< %s',
+    'lte': '<= %s',
+    'startswith': 'LIKE %s',
+    'endswith': 'LIKE %s',
+    'istartswith': 'ILIKE %s',
+    'iendswith': 'ILIKE %s',
+}

Added: vendor/django/current/django/db/backends/postgresql_psycopg2/client.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql_psycopg2/client.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql_psycopg2/client.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+from django.db.backends.postgresql.client import *

Added: vendor/django/current/django/db/backends/postgresql_psycopg2/creation.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql_psycopg2/creation.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql_psycopg2/creation.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+from django.db.backends.postgresql.creation import *

Added: vendor/django/current/django/db/backends/postgresql_psycopg2/introspection.py
===================================================================
--- vendor/django/current/django/db/backends/postgresql_psycopg2/introspection.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/postgresql_psycopg2/introspection.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,83 @@
+from django.db.backends.postgresql_psycopg2.base import quote_name
+
+def get_table_list(cursor):
+    "Returns a list of table names in the current database."
+    cursor.execute("""
+        SELECT c.relname
+        FROM pg_catalog.pg_class c
+        LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+        WHERE c.relkind IN ('r', 'v', '')
+            AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
+            AND pg_catalog.pg_table_is_visible(c.oid)""")
+    return [row[0] for row in cursor.fetchall()]
+
+def get_table_description(cursor, table_name):
+    "Returns a description of the table, with the DB-API cursor.description interface."
+    cursor.execute("SELECT * FROM %s LIMIT 1" % quote_name(table_name))
+    return cursor.description
+
+def get_relations(cursor, table_name):
+    """
+    Returns a dictionary of {field_index: (field_index_other_table, other_table)}
+    representing all relationships to the given table. Indexes are 0-based.
+    """
+    cursor.execute("""
+        SELECT con.conkey, con.confkey, c2.relname
+        FROM pg_constraint con, pg_class c1, pg_class c2
+        WHERE c1.oid = con.conrelid
+            AND c2.oid = con.confrelid
+            AND c1.relname = %s
+            AND con.contype = 'f'""", [table_name])
+    relations = {}
+    for row in cursor.fetchall():
+        try:
+            # row[0] and row[1] are like "{2}", so strip the curly braces.
+            relations[int(row[0][1:-1]) - 1] = (int(row[1][1:-1]) - 1, row[2])
+        except ValueError:
+            continue
+    return relations
+
+def get_indexes(cursor, table_name):
+    """
+    Returns a dictionary of fieldname -> infodict for the given table,
+    where each infodict is in the format:
+        {'primary_key': boolean representing whether it's the primary key,
+         'unique': boolean representing whether it's a unique index}
+    """
+    # This query retrieves each index on the given table, including the
+    # first associated field name
+    cursor.execute("""
+        SELECT attr.attname, idx.indkey, idx.indisunique, idx.indisprimary
+        FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
+            pg_catalog.pg_index idx, pg_catalog.pg_attribute attr
+        WHERE c.oid = idx.indrelid
+            AND idx.indexrelid = c2.oid
+            AND attr.attrelid = c.oid
+            AND attr.attnum = idx.indkey[0]
+            AND c.relname = %s""", [table_name])
+    indexes = {}
+    for row in cursor.fetchall():
+        # row[1] (idx.indkey) is stored in the DB as an array. It comes out as
+        # a string of space-separated integers. This designates the field
+        # indexes (1-based) of the fields that have indexes on the table.
+        # Here, we skip any indexes across multiple fields.
+        if ' ' in row[1]:
+            continue
+        indexes[row[0]] = {'primary_key': row[3], 'unique': row[2]}
+    return indexes
+
+# Maps type codes to Django Field types.
+DATA_TYPES_REVERSE = {
+    16: 'BooleanField',
+    21: 'SmallIntegerField',
+    23: 'IntegerField',
+    25: 'TextField',
+    869: 'IPAddressField',
+    1043: 'CharField',
+    1082: 'DateField',
+    1083: 'TimeField',
+    1114: 'DateTimeField',
+    1184: 'DateTimeField',
+    1266: 'TimeField',
+    1700: 'FloatField',
+}

Added: vendor/django/current/django/db/backends/sqlite3/__init__.py
===================================================================

Added: vendor/django/current/django/db/backends/sqlite3/base.py
===================================================================
--- vendor/django/current/django/db/backends/sqlite3/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/sqlite3/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,164 @@
+"""
+SQLite3 backend for django.  Requires pysqlite2 (http://pysqlite.org/).
+"""
+
+from django.db.backends import util
+try:
+    from pysqlite2 import dbapi2 as Database
+except ImportError, e:
+    from django.core.exceptions import ImproperlyConfigured
+    raise ImproperlyConfigured, "Error loading pysqlite2 module: %s" % e
+
+DatabaseError = Database.DatabaseError
+
+Database.register_converter("bool", lambda s: str(s) == '1')
+Database.register_converter("time", util.typecast_time)
+Database.register_converter("date", util.typecast_date)
+Database.register_converter("datetime", util.typecast_timestamp)
+Database.register_converter("timestamp", util.typecast_timestamp)
+Database.register_converter("TIMESTAMP", util.typecast_timestamp)
+
+def utf8rowFactory(cursor, row):
+    def utf8(s):
+        if type(s) == unicode:
+            return s.encode("utf-8")
+        else:
+            return s
+    return [utf8(r) for r in row]
+
+try:
+    # Only exists in Python 2.4+
+    from threading import local
+except ImportError:
+    # Import copy of _thread_local.py from Python 2.4
+    from django.utils._threading_local import local
+
+class DatabaseWrapper(local):
+    def __init__(self):
+        self.connection = None
+        self.queries = []
+
+    def cursor(self):
+        from django.conf import settings
+        if self.connection is None:
+            self.connection = Database.connect(settings.DATABASE_NAME,
+                detect_types=Database.PARSE_DECLTYPES | Database.PARSE_COLNAMES)
+
+            # Register extract and date_trunc functions.
+            self.connection.create_function("django_extract", 2, _sqlite_extract)
+            self.connection.create_function("django_date_trunc", 2, _sqlite_date_trunc)
+        cursor = self.connection.cursor(factory=SQLiteCursorWrapper)
+        cursor.row_factory = utf8rowFactory
+        if settings.DEBUG:
+            return util.CursorDebugWrapper(cursor, self)
+        else:
+            return cursor
+
+    def _commit(self):
+        self.connection.commit()
+
+    def _rollback(self):
+        if self.connection:
+            self.connection.rollback()
+
+    def close(self):
+        if self.connection is not None:
+            self.connection.close()
+            self.connection = None
+
+class SQLiteCursorWrapper(Database.Cursor):
+    """
+    Django uses "format" style placeholders, but pysqlite2 uses "qmark" style.
+    This fixes it -- but note that if you want to use a literal "%s" in a query,
+    you'll need to use "%%s".
+    """
+    def execute(self, query, params=()):
+        query = self.convert_query(query, len(params))
+        return Database.Cursor.execute(self, query, params)
+
+    def executemany(self, query, param_list):
+        query = self.convert_query(query, len(param_list[0]))
+        return Database.Cursor.executemany(self, query, param_list)
+
+    def convert_query(self, query, num_params):
+        return query % tuple("?" * num_params)
+
+supports_constraints = False
+
+def quote_name(name):
+    if name.startswith('"') and name.endswith('"'):
+        return name # Quoting once is enough.
+    return '"%s"' % name
+
+dictfetchone = util.dictfetchone
+dictfetchmany = util.dictfetchmany
+dictfetchall  = util.dictfetchall
+
+def get_last_insert_id(cursor, table_name, pk_name):
+    return cursor.lastrowid
+
+def get_date_extract_sql(lookup_type, table_name):
+    # lookup_type is 'year', 'month', 'day'
+    # sqlite doesn't support extract, so we fake it with the user-defined
+    # function _sqlite_extract that's registered in connect(), above.
+    return 'django_extract("%s", %s)' % (lookup_type.lower(), table_name)
+
+def _sqlite_extract(lookup_type, dt):
+    try:
+        dt = util.typecast_timestamp(dt)
+    except (ValueError, TypeError):
+        return None
+    return str(getattr(dt, lookup_type))
+
+def get_date_trunc_sql(lookup_type, field_name):
+    # lookup_type is 'year', 'month', 'day'
+    # sqlite doesn't support DATE_TRUNC, so we fake it as above.
+    return 'django_date_trunc("%s", %s)' % (lookup_type.lower(), field_name)
+
+def get_limit_offset_sql(limit, offset=None):
+    sql = "LIMIT %s" % limit
+    if offset and offset != 0:
+        sql += " OFFSET %s" % offset
+    return sql
+
+def get_random_function_sql():
+    return "RANDOM()"
+
+def get_fulltext_search_sql(field_name):
+    raise NotImplementedError
+
+def get_drop_foreignkey_sql():
+    return ""
+
+def get_pk_default_value():
+    return "NULL"
+
+def _sqlite_date_trunc(lookup_type, dt):
+    try:
+        dt = util.typecast_timestamp(dt)
+    except (ValueError, TypeError):
+        return None
+    if lookup_type == 'year':
+        return "%i-01-01 00:00:00" % dt.year
+    elif lookup_type == 'month':
+        return "%i-%02i-01 00:00:00" % (dt.year, dt.month)
+    elif lookup_type == 'day':
+        return "%i-%02i-%02i 00:00:00" % (dt.year, dt.month, dt.day)
+
+# SQLite requires LIKE statements to include an ESCAPE clause if the value
+# being escaped has a percent or underscore in it.
+# See http://www.sqlite.org/lang_expr.html for an explanation.
+OPERATOR_MAPPING = {
+    'exact': '= %s',
+    'iexact': "LIKE %s ESCAPE '\\'",
+    'contains': "LIKE %s ESCAPE '\\'",
+    'icontains': "LIKE %s ESCAPE '\\'",
+    'gt': '> %s',
+    'gte': '>= %s',
+    'lt': '< %s',
+    'lte': '<= %s',
+    'startswith': "LIKE %s ESCAPE '\\'",
+    'endswith': "LIKE %s ESCAPE '\\'",
+    'istartswith': "LIKE %s ESCAPE '\\'",
+    'iendswith': "LIKE %s ESCAPE '\\'",
+}

Added: vendor/django/current/django/db/backends/sqlite3/client.py
===================================================================
--- vendor/django/current/django/db/backends/sqlite3/client.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/sqlite3/client.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,6 @@
+from django.conf import settings
+import os
+
+def runshell():
+    args = ['', settings.DATABASE_NAME]
+    os.execvp('sqlite3', args)

Added: vendor/django/current/django/db/backends/sqlite3/creation.py
===================================================================
--- vendor/django/current/django/db/backends/sqlite3/creation.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/sqlite3/creation.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,29 @@
+# SQLite doesn't actually support most of these types, but it "does the right
+# thing" given more verbose field definitions, so leave them as is so that
+# schema inspection is more useful.
+DATA_TYPES = {
+    'AutoField':                    'integer',
+    'BooleanField':                 'bool',
+    'CharField':                    'varchar(%(maxlength)s)',
+    'CommaSeparatedIntegerField':   'varchar(%(maxlength)s)',
+    'DateField':                    'date',
+    'DateTimeField':                'datetime',
+    'FileField':                    'varchar(100)',
+    'FilePathField':                'varchar(100)',
+    'FloatField':                   'numeric(%(max_digits)s, %(decimal_places)s)',
+    'ImageField':                   'varchar(100)',
+    'IntegerField':                 'integer',
+    'IPAddressField':               'char(15)',
+    'ManyToManyField':              None,
+    'NullBooleanField':             'bool',
+    'OneToOneField':                'integer',
+    'PhoneNumberField':             'varchar(20)',
+    'PositiveIntegerField':         'integer unsigned',
+    'PositiveSmallIntegerField':    'smallint unsigned',
+    'SlugField':                    'varchar(%(maxlength)s)',
+    'SmallIntegerField':            'smallint',
+    'TextField':                    'text',
+    'TimeField':                    'time',
+    'URLField':                     'varchar(200)',
+    'USStateField':                 'varchar(2)',
+}

Added: vendor/django/current/django/db/backends/sqlite3/introspection.py
===================================================================
--- vendor/django/current/django/db/backends/sqlite3/introspection.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/sqlite3/introspection.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,87 @@
+from django.db.backends.sqlite3.base import quote_name
+
+def get_table_list(cursor):
+    "Returns a list of table names in the current database."
+    # Skip the sqlite_sequence system table used for autoincrement key
+    # generation.
+    cursor.execute("""
+        SELECT name FROM sqlite_master
+        WHERE type='table' AND NOT name='sqlite_sequence'
+        ORDER BY name""")
+    return [row[0] for row in cursor.fetchall()]
+
+def get_table_description(cursor, table_name):
+    "Returns a description of the table, with the DB-API cursor.description interface."
+    return [(info['name'], info['type'], None, None, None, None,
+             info['null_ok']) for info in _table_info(cursor, table_name)]
+
+def get_relations(cursor, table_name):
+    raise NotImplementedError
+
+def get_indexes(cursor, table_name):
+    """
+    Returns a dictionary of fieldname -> infodict for the given table,
+    where each infodict is in the format:
+        {'primary_key': boolean representing whether it's the primary key,
+         'unique': boolean representing whether it's a unique index}
+    """
+    indexes = {}
+    for info in _table_info(cursor, table_name):
+        indexes[info['name']] = {'primary_key': info['pk'] != 0,
+                                 'unique': False}
+    cursor.execute('PRAGMA index_list(%s)' % quote_name(table_name))
+    # seq, name, unique
+    for index, unique in [(field[1], field[2]) for field in cursor.fetchall()]:
+        if not unique:
+            continue
+        cursor.execute('PRAGMA index_info(%s)' % quote_name(index))
+        info = cursor.fetchall()
+        # Skip indexes across multiple fields
+        if len(info) != 1:
+            continue
+        name = info[0][2] # seqno, cid, name
+        indexes[name]['unique'] = True
+    return indexes
+
+def _table_info(cursor, name):
+    cursor.execute('PRAGMA table_info(%s)' % quote_name(name))
+    # cid, name, type, notnull, dflt_value, pk
+    return [{'name': field[1],
+             'type': field[2],
+             'null_ok': not field[3],
+             'pk': field[5]     # undocumented
+             } for field in cursor.fetchall()]
+
+# Maps SQL types to Django Field types. Some of the SQL types have multiple
+# entries here because SQLite allows for anything and doesn't normalize the
+# field type; it uses whatever was given.
+BASE_DATA_TYPES_REVERSE = {
+    'bool': 'BooleanField',
+    'boolean': 'BooleanField',
+    'smallint': 'SmallIntegerField',
+    'smallinteger': 'SmallIntegerField',
+    'int': 'IntegerField',
+    'integer': 'IntegerField',
+    'text': 'TextField',
+    'char': 'CharField',
+    'date': 'DateField',
+    'datetime': 'DateTimeField',
+    'time': 'TimeField',
+}
+
+# This light wrapper "fakes" a dictionary interface, because some SQLite data
+# types include variables in them -- e.g. "varchar(30)" -- and can't be matched
+# as a simple dictionary lookup.
+class FlexibleFieldLookupDict:
+    def __getitem__(self, key):
+        key = key.lower()
+        try:
+            return BASE_DATA_TYPES_REVERSE[key]
+        except KeyError:
+            import re
+            m = re.search(r'^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$', key)
+            if m:
+                return ('CharField', {'maxlength': int(m.group(1))})
+            raise KeyError
+
+DATA_TYPES_REVERSE = FlexibleFieldLookupDict()

Added: vendor/django/current/django/db/backends/util.py
===================================================================
--- vendor/django/current/django/db/backends/util.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/backends/util.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,118 @@
+import datetime
+from time import time
+
+class CursorDebugWrapper(object):
+    def __init__(self, cursor, db):
+        self.cursor = cursor
+        self.db = db
+
+    def execute(self, sql, params=()):
+        start = time()
+        try:
+            return self.cursor.execute(sql, params)
+        finally:
+            stop = time()
+            # If params was a list, convert it to a tuple, because string
+            # formatting with '%' only works with tuples or dicts.
+            if not isinstance(params, (tuple, dict)):
+                params = tuple(params)
+            self.db.queries.append({
+                'sql': sql % tuple(params),
+                'time': "%.3f" % (stop - start),
+            })
+
+    def executemany(self, sql, param_list):
+        start = time()
+        try:
+            return self.cursor.executemany(sql, param_list)
+        finally:
+            stop = time()
+            self.db.queries.append({
+                'sql': 'MANY: ' + sql + ' ' + str(tuple(param_list)),
+                'time': "%.3f" % (stop - start),
+            })
+
+    def __getattr__(self, attr):
+        if self.__dict__.has_key(attr):
+            return self.__dict__[attr]
+        else:
+            return getattr(self.cursor, attr)
+
+###############################################
+# Converters from database (string) to Python #
+###############################################
+
+def typecast_date(s):
+    return s and datetime.date(*map(int, s.split('-'))) or None # returns None if s is null
+
+def typecast_time(s): # does NOT store time zone information
+    if not s: return None
+    hour, minutes, seconds = s.split(':')
+    if '.' in seconds: # check whether seconds have a fractional part
+        seconds, microseconds = seconds.split('.')
+    else:
+        microseconds = '0'
+    return datetime.time(int(hour), int(minutes), int(seconds), int(float('.'+microseconds) * 1000000))
+
+def typecast_timestamp(s): # does NOT store time zone information
+    # "2005-07-29 15:48:00.590358-05"
+    # "2005-07-29 09:56:00-05"
+    if not s: return None
+    if not ' ' in s: return typecast_date(s)
+    d, t = s.split()
+    # Extract timezone information, if it exists. Currently we just throw
+    # it away, but in the future we may make use of it.
+    if '-' in t:
+        t, tz = t.split('-', 1)
+        tz = '-' + tz
+    elif '+' in t:
+        t, tz = t.split('+', 1)
+        tz = '+' + tz
+    else:
+        tz = ''
+    dates = d.split('-')
+    times = t.split(':')
+    seconds = times[2]
+    if '.' in seconds: # check whether seconds have a fractional part
+        seconds, microseconds = seconds.split('.')
+    else:
+        microseconds = '0'
+    return datetime.datetime(int(dates[0]), int(dates[1]), int(dates[2]),
+        int(times[0]), int(times[1]), int(seconds), int(float('.'+microseconds) * 1000000))
+
+def typecast_boolean(s):
+    if s is None: return None
+    if not s: return False
+    return str(s)[0].lower() == 't'
+
+###############################################
+# Converters from Python to database (string) #
+###############################################
+
+def rev_typecast_boolean(obj, d):
+    return obj and '1' or '0'
+
+##################################################################################
+# Helper functions for dictfetch* for databases that don't natively support them #
+##################################################################################
+
+def _dict_helper(desc, row):
+    "Returns a dictionary for the given cursor.description and result row."
+    return dict([(desc[col[0]][0], col[1]) for col in enumerate(row)])
+
+def dictfetchone(cursor):
+    "Returns a row from the cursor as a dict"
+    row = cursor.fetchone()
+    if not row:
+        return None
+    return _dict_helper(cursor.description, row)
+
+def dictfetchmany(cursor, number):
+    "Returns a certain number of rows from a cursor as a dict"
+    desc = cursor.description
+    return [_dict_helper(desc, row) for row in cursor.fetchmany(number)]
+
+def dictfetchall(cursor):
+    "Returns all rows from a cursor as a dict"
+    desc = cursor.description
+    return [_dict_helper(desc, row) for row in cursor.fetchall()]

Added: vendor/django/current/django/db/models/__init__.py
===================================================================
--- vendor/django/current/django/db/models/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,53 @@
+from django.conf import settings
+from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
+from django.core import validators
+from django.db import backend, connection
+from django.db.models.loading import get_apps, get_app, get_models, get_model, register_models
+from django.db.models.query import Q
+from django.db.models.manager import Manager
+from django.db.models.base import Model, AdminOptions
+from django.db.models.fields import *
+from django.db.models.fields.related import ForeignKey, OneToOneField, ManyToManyField, ManyToOneRel, ManyToManyRel, OneToOneRel, TABULAR, STACKED
+from django.db.models.fields.generic import GenericRelation, GenericRel, GenericForeignKey
+from django.db.models import signals
+from django.utils.functional import curry
+from django.utils.text import capfirst
+
+# Admin stages.
+ADD, CHANGE, BOTH = 1, 2, 3
+
+# Decorator. Takes a function that returns a tuple in this format:
+#     (viewname, viewargs, viewkwargs)
+# Returns a function that calls urlresolvers.reverse() on that data, to return
+# the URL for those parameters.
+def permalink(func):
+    from django.core.urlresolvers import reverse
+    def inner(*args, **kwargs):
+        bits = func(*args, **kwargs)
+        viewname = bits[0]
+        return reverse(bits[0], None, *bits[1:2])
+    return inner
+
+class LazyDate(object):
+    """
+    Use in limit_choices_to to compare the field to dates calculated at run time
+    instead of when the model is loaded.  For example::
+
+        ... limit_choices_to = {'date__gt' : models.LazyDate(days=-3)} ...
+
+    which will limit the choices to dates greater than three days ago.
+    """
+    def __init__(self, **kwargs):
+        self.delta = datetime.timedelta(**kwargs)
+
+    def __str__(self):
+        return str(self.__get_value__())
+
+    def __repr__(self):
+        return "<LazyDate: %s>" % self.delta
+
+    def __get_value__(self):
+        return datetime.datetime.now() + self.delta
+
+    def __getattr__(self, attr):
+        return getattr(self.__get_value__(), attr)

Added: vendor/django/current/django/db/models/base.py
===================================================================
--- vendor/django/current/django/db/models/base.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/base.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,430 @@
+import django.db.models.manipulators
+import django.db.models.manager
+from django.core import validators
+from django.core.exceptions import ObjectDoesNotExist
+from django.db.models.fields import AutoField, ImageField, FieldDoesNotExist
+from django.db.models.fields.related import OneToOneRel, ManyToOneRel
+from django.db.models.query import delete_objects
+from django.db.models.options import Options, AdminOptions
+from django.db import connection, backend, transaction
+from django.db.models import signals
+from django.db.models.loading import register_models, get_model
+from django.dispatch import dispatcher
+from django.utils.datastructures import SortedDict
+from django.utils.functional import curry
+from django.conf import settings
+import types
+import sys
+import os
+
+class ModelBase(type):
+    "Metaclass for all models"
+    def __new__(cls, name, bases, attrs):
+        # If this isn't a subclass of Model, don't do anything special.
+        if not bases or bases == (object,):
+            return type.__new__(cls, name, bases, attrs)
+
+        # Create the class.
+        new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')})
+        new_class.add_to_class('_meta', Options(attrs.pop('Meta', None)))
+        new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {}))
+
+        # Build complete list of parents
+        for base in bases:
+            # TODO: Checking for the presence of '_meta' is hackish.
+            if '_meta' in dir(base):
+                new_class._meta.parents.append(base)
+                new_class._meta.parents.extend(base._meta.parents)
+
+        model_module = sys.modules[new_class.__module__]
+
+        if getattr(new_class._meta, 'app_label', None) is None:
+            # Figure out the app_label by looking one level up.
+            # For 'django.contrib.sites.models', this would be 'sites'.
+            new_class._meta.app_label = model_module.__name__.split('.')[-2]
+
+        # Bail out early if we have already created this class.
+        m = get_model(new_class._meta.app_label, name)
+        if m is not None:
+            return m
+
+        # Add all attributes to the class.
+        for obj_name, obj in attrs.items():
+            new_class.add_to_class(obj_name, obj)
+
+        # Add Fields inherited from parents
+        for parent in new_class._meta.parents:
+            for field in parent._meta.fields:
+                # Only add parent fields if they aren't defined for this class.
+                try:
+                    new_class._meta.get_field(field.name)
+                except FieldDoesNotExist:
+                    field.contribute_to_class(new_class, field.name)
+
+        new_class._prepare()
+
+        register_models(new_class._meta.app_label, new_class)
+        # Because of the way imports happen (recursively), we may or may not be
+        # the first class for this model to register with the framework. There
+        # should only be one class for each model, so we must always return the
+        # registered version.
+        return get_model(new_class._meta.app_label, name)
+
+class Model(object):
+    __metaclass__ = ModelBase
+
+    def _get_pk_val(self):
+        return getattr(self, self._meta.pk.attname)
+
+    def __repr__(self):
+        return '<%s: %s>' % (self.__class__.__name__, self)
+
+    def __str__(self):
+        return '%s object' % self.__class__.__name__
+
+    def __eq__(self, other):
+        return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val()
+
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def __init__(self, *args, **kwargs):
+        dispatcher.send(signal=signals.pre_init, sender=self.__class__, args=args, kwargs=kwargs)
+        for f in self._meta.fields:
+            if isinstance(f.rel, ManyToOneRel):
+                try:
+                    # Assume object instance was passed in.
+                    rel_obj = kwargs.pop(f.name)
+                except KeyError:
+                    try:
+                        # Object instance wasn't passed in -- must be an ID.
+                        val = kwargs.pop(f.attname)
+                    except KeyError:
+                        val = f.get_default()
+                else:
+                    # Object instance was passed in.
+                    # Special case: You can pass in "None" for related objects if it's allowed.
+                    if rel_obj is None and f.null:
+                        val = None
+                    else:
+                        try:
+                            val = getattr(rel_obj, f.rel.get_related_field().attname)
+                        except AttributeError:
+                            raise TypeError, "Invalid value: %r should be a %s instance, not a %s" % (f.name, f.rel.to, type(rel_obj))
+                setattr(self, f.attname, val)
+            else:
+                val = kwargs.pop(f.attname, f.get_default())
+                setattr(self, f.attname, val)
+        for prop in kwargs.keys():
+            try:
+                if isinstance(getattr(self.__class__, prop), property):
+                    setattr(self, prop, kwargs.pop(prop))
+            except AttributeError:
+                pass
+        if kwargs:
+            raise TypeError, "'%s' is an invalid keyword argument for this function" % kwargs.keys()[0]
+        for i, arg in enumerate(args):
+            setattr(self, self._meta.fields[i].attname, arg)
+        dispatcher.send(signal=signals.post_init, sender=self.__class__, instance=self)
+
+    def add_to_class(cls, name, value):
+        if name == 'Admin':
+            assert type(value) == types.ClassType, "%r attribute of %s model must be a class, not a %s object" % (name, cls.__name__, type(value))
+            value = AdminOptions(**dict([(k, v) for k, v in value.__dict__.items() if not k.startswith('_')]))
+        if hasattr(value, 'contribute_to_class'):
+            value.contribute_to_class(cls, name)
+        else:
+            setattr(cls, name, value)
+    add_to_class = classmethod(add_to_class)
+
+    def _prepare(cls):
+        # Creates some methods once self._meta has been populated.
+        opts = cls._meta
+        opts._prepare(cls)
+
+        if opts.order_with_respect_to:
+            cls.get_next_in_order = curry(cls._get_next_or_previous_in_order, is_next=True)
+            cls.get_previous_in_order = curry(cls._get_next_or_previous_in_order, is_next=False)
+            setattr(opts.order_with_respect_to.rel.to, 'get_%s_order' % cls.__name__.lower(), curry(method_get_order, cls))
+            setattr(opts.order_with_respect_to.rel.to, 'set_%s_order' % cls.__name__.lower(), curry(method_set_order, cls))
+
+        # Give the class a docstring -- its definition.
+        if cls.__doc__ is None:
+            cls.__doc__ = "%s(%s)" % (cls.__name__, ", ".join([f.attname for f in opts.fields]))
+
+        if hasattr(cls, 'get_absolute_url'):
+            cls.get_absolute_url = curry(get_absolute_url, opts, cls.get_absolute_url)
+
+        dispatcher.send(signal=signals.class_prepared, sender=cls)
+
+    _prepare = classmethod(_prepare)
+
+    def save(self):
+        dispatcher.send(signal=signals.pre_save, sender=self.__class__, instance=self)
+
+        non_pks = [f for f in self._meta.fields if not f.primary_key]
+        cursor = connection.cursor()
+
+        # First, try an UPDATE. If that doesn't update anything, do an INSERT.
+        pk_val = self._get_pk_val()
+        pk_set = bool(pk_val)
+        record_exists = True
+        if pk_set:
+            # Determine whether a record with the primary key already exists.
+            cursor.execute("SELECT 1 FROM %s WHERE %s=%%s LIMIT 1" % \
+                (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column)), [pk_val])
+            # If it does already exist, do an UPDATE.
+            if cursor.fetchone():
+                db_values = [f.get_db_prep_save(f.pre_save(self, False)) for f in non_pks]
+                cursor.execute("UPDATE %s SET %s WHERE %s=%%s" % \
+                    (backend.quote_name(self._meta.db_table),
+                    ','.join(['%s=%%s' % backend.quote_name(f.column) for f in non_pks]),
+                    backend.quote_name(self._meta.pk.column)),
+                    db_values + [pk_val])
+            else:
+                record_exists = False
+        if not pk_set or not record_exists:
+            field_names = [backend.quote_name(f.column) for f in self._meta.fields if not isinstance(f, AutoField)]
+            db_values = [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if not isinstance(f, AutoField)]
+            # If the PK has been manually set, respect that.
+            if pk_set:
+                field_names += [f.column for f in self._meta.fields if isinstance(f, AutoField)]
+                db_values += [f.get_db_prep_save(f.pre_save(self, True)) for f in self._meta.fields if isinstance(f, AutoField)]
+            placeholders = ['%s'] * len(field_names)
+            if self._meta.order_with_respect_to:
+                field_names.append(backend.quote_name('_order'))
+                # TODO: This assumes the database supports subqueries.
+                placeholders.append('(SELECT COUNT(*) FROM %s WHERE %s = %%s)' % \
+                    (backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.order_with_respect_to.column)))
+                db_values.append(getattr(self, self._meta.order_with_respect_to.attname))
+            if db_values:
+                cursor.execute("INSERT INTO %s (%s) VALUES (%s)" % \
+                    (backend.quote_name(self._meta.db_table), ','.join(field_names),
+                    ','.join(placeholders)), db_values)
+            else:
+                # Create a new record with defaults for everything.
+                cursor.execute("INSERT INTO %s (%s) VALUES (%s)" %
+                    (backend.quote_name(self._meta.db_table),
+                     backend.quote_name(self._meta.pk.column),
+                     backend.get_pk_default_value()))
+            if self._meta.has_auto_field and not pk_set:
+                setattr(self, self._meta.pk.attname, backend.get_last_insert_id(cursor, self._meta.db_table, self._meta.pk.column))
+        transaction.commit_unless_managed()
+
+        # Run any post-save hooks.
+        dispatcher.send(signal=signals.post_save, sender=self.__class__, instance=self)
+
+    save.alters_data = True
+
+    def validate(self):
+        """
+        First coerces all fields on this instance to their proper Python types.
+        Then runs validation on every field. Returns a dictionary of
+        field_name -> error_list.
+        """
+        error_dict = {}
+        invalid_python = {}
+        for f in self._meta.fields:
+            try:
+                setattr(self, f.attname, f.to_python(getattr(self, f.attname, f.get_default())))
+            except validators.ValidationError, e:
+                error_dict[f.name] = e.messages
+                invalid_python[f.name] = 1
+        for f in self._meta.fields:
+            if f.name in invalid_python:
+                continue
+            errors = f.validate_full(getattr(self, f.attname, f.get_default()), self.__dict__)
+            if errors:
+                error_dict[f.name] = errors
+        return error_dict
+
+    def _collect_sub_objects(self, seen_objs):
+        """
+        Recursively populates seen_objs with all objects related to this object.
+        When done, seen_objs will be in the format:
+            {model_class: {pk_val: obj, pk_val: obj, ...},
+             model_class: {pk_val: obj, pk_val: obj, ...}, ...}
+        """
+        pk_val = self._get_pk_val()
+        if pk_val in seen_objs.setdefault(self.__class__, {}):
+            return
+        seen_objs.setdefault(self.__class__, {})[pk_val] = self
+
+        for related in self._meta.get_all_related_objects():
+            rel_opts_name = related.get_accessor_name()
+            if isinstance(related.field.rel, OneToOneRel):
+                try:
+                    sub_obj = getattr(self, rel_opts_name)
+                except ObjectDoesNotExist:
+                    pass
+                else:
+                    sub_obj._collect_sub_objects(seen_objs)
+            else:
+                for sub_obj in getattr(self, rel_opts_name).all():
+                    sub_obj._collect_sub_objects(seen_objs)
+
+    def delete(self):
+        assert self._get_pk_val() is not None, "%s object can't be deleted because its %s attribute is set to None." % (self._meta.object_name, self._meta.pk.attname)
+
+        # Find all the objects than need to be deleted
+        seen_objs = SortedDict()
+        self._collect_sub_objects(seen_objs)
+
+        # Actually delete the objects
+        delete_objects(seen_objs)
+
+    delete.alters_data = True
+
+    def _get_FIELD_display(self, field):
+        value = getattr(self, field.attname)
+        return dict(field.choices).get(value, value)
+
+    def _get_next_or_previous_by_FIELD(self, field, is_next, **kwargs):
+        op = is_next and '>' or '<'
+        where = '(%s %s %%s OR (%s = %%s AND %s.%s %s %%s))' % \
+            (backend.quote_name(field.column), op, backend.quote_name(field.column),
+            backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column), op)
+        param = str(getattr(self, field.attname))
+        q = self.__class__._default_manager.filter(**kwargs).order_by((not is_next and '-' or '') + field.name, (not is_next and '-' or '') + self._meta.pk.name)
+        q._where.append(where)
+        q._params.extend([param, param, getattr(self, self._meta.pk.attname)])
+        try:
+            return q[0]
+        except IndexError:
+            raise self.DoesNotExist, "%s matching query does not exist." % self.__class__._meta.object_name
+
+    def _get_next_or_previous_in_order(self, is_next):
+        cachename = "__%s_order_cache" % is_next
+        if not hasattr(self, cachename):
+            op = is_next and '>' or '<'
+            order_field = self._meta.order_with_respect_to
+            where = ['%s %s (SELECT %s FROM %s WHERE %s=%%s)' % \
+                (backend.quote_name('_order'), op, backend.quote_name('_order'),
+                backend.quote_name(self._meta.db_table), backend.quote_name(self._meta.pk.column)),
+                '%s=%%s' % backend.quote_name(order_field.column)]
+            params = [self._get_pk_val(), getattr(self, order_field.attname)]
+            obj = self._default_manager.order_by('_order').extra(where=where, params=params)[:1].get()
+            setattr(self, cachename, obj)
+        return getattr(self, cachename)
+
+    def _get_FIELD_filename(self, field):
+        if getattr(self, field.attname): # value is not blank
+            return os.path.join(settings.MEDIA_ROOT, getattr(self, field.attname))
+        return ''
+
+    def _get_FIELD_url(self, field):
+        if getattr(self, field.attname): # value is not blank
+            import urlparse
+            return urlparse.urljoin(settings.MEDIA_URL, getattr(self, field.attname)).replace('\\', '/')
+        return ''
+
+    def _get_FIELD_size(self, field):
+        return os.path.getsize(self._get_FIELD_filename(field))
+
+    def _save_FIELD_file(self, field, filename, raw_contents):
+        directory = field.get_directory_name()
+        try: # Create the date-based directory if it doesn't exist.
+            os.makedirs(os.path.join(settings.MEDIA_ROOT, directory))
+        except OSError: # Directory probably already exists.
+            pass
+        filename = field.get_filename(filename)
+
+        # If the filename already exists, keep adding an underscore to the name of
+        # the file until the filename doesn't exist.
+        while os.path.exists(os.path.join(settings.MEDIA_ROOT, filename)):
+            try:
+                dot_index = filename.rindex('.')
+            except ValueError: # filename has no dot
+                filename += '_'
+            else:
+                filename = filename[:dot_index] + '_' + filename[dot_index:]
+
+        # Write the file to disk.
+        setattr(self, field.attname, filename)
+
+        full_filename = self._get_FIELD_filename(field)
+        fp = open(full_filename, 'wb')
+        fp.write(raw_contents)
+        fp.close()
+
+        # Save the width and/or height, if applicable.
+        if isinstance(field, ImageField) and (field.width_field or field.height_field):
+            from django.utils.images import get_image_dimensions
+            width, height = get_image_dimensions(full_filename)
+            if field.width_field:
+                setattr(self, field.width_field, width)
+            if field.height_field:
+                setattr(self, field.height_field, height)
+
+        # Save the object, because it has changed.
+        self.save()
+
+    _save_FIELD_file.alters_data = True
+
+    def _get_FIELD_width(self, field):
+        return self._get_image_dimensions(field)[0]
+
+    def _get_FIELD_height(self, field):
+        return self._get_image_dimensions(field)[1]
+
+    def _get_image_dimensions(self, field):
+        cachename = "__%s_dimensions_cache" % field.name
+        if not hasattr(self, cachename):
+            from django.utils.images import get_image_dimensions
+            filename = self._get_FIELD_filename(field)
+            setattr(self, cachename, get_image_dimensions(filename))
+        return getattr(self, cachename)
+
+    # Handles setting many-to-many related objects.
+    # Example: Album.set_songs()
+    def _set_related_many_to_many(self, rel_class, rel_field, id_list):
+        id_list = map(int, id_list) # normalize to integers
+        rel = rel_field.rel.to
+        m2m_table = rel_field.m2m_db_table()
+        this_id = self._get_pk_val()
+        cursor = connection.cursor()
+        cursor.execute("DELETE FROM %s WHERE %s = %%s" % \
+            (backend.quote_name(m2m_table),
+            backend.quote_name(rel_field.m2m_column_name())), [this_id])
+        sql = "INSERT INTO %s (%s, %s) VALUES (%%s, %%s)" % \
+            (backend.quote_name(m2m_table),
+            backend.quote_name(rel_field.m2m_column_name()),
+            backend.quote_name(rel_field.m2m_reverse_name()))
+        cursor.executemany(sql, [(this_id, i) for i in id_list])
+        transaction.commit_unless_managed()
+
+############################################
+# HELPER FUNCTIONS (CURRIED MODEL METHODS) #
+############################################
+
+# ORDERING METHODS #########################
+
+def method_set_order(ordered_obj, self, id_list):
+    cursor = connection.cursor()
+    # Example: "UPDATE poll_choices SET _order = %s WHERE poll_id = %s AND id = %s"
+    sql = "UPDATE %s SET %s = %%s WHERE %s = %%s AND %s = %%s" % \
+        (backend.quote_name(ordered_obj._meta.db_table), backend.quote_name('_order'),
+        backend.quote_name(ordered_obj._meta.order_with_respect_to.column),
+        backend.quote_name(ordered_obj._meta.pk.column))
+    rel_val = getattr(self, ordered_obj._meta.order_with_respect_to.rel.field_name)
+    cursor.executemany(sql, [(i, rel_val, j) for i, j in enumerate(id_list)])
+    transaction.commit_unless_managed()
+
+def method_get_order(ordered_obj, self):
+    cursor = connection.cursor()
+    # Example: "SELECT id FROM poll_choices WHERE poll_id = %s ORDER BY _order"
+    sql = "SELECT %s FROM %s WHERE %s = %%s ORDER BY %s" % \
+        (backend.quote_name(ordered_obj._meta.pk.column),
+        backend.quote_name(ordered_obj._meta.db_table),
+        backend.quote_name(ordered_obj._meta.order_with_respect_to.column),
+        backend.quote_name('_order'))
+    rel_val = getattr(self, ordered_obj._meta.order_with_respect_to.rel.field_name)
+    cursor.execute(sql, [rel_val])
+    return [r[0] for r in cursor.fetchall()]
+
+##############################################
+# HELPER FUNCTIONS (CURRIED MODEL FUNCTIONS) #
+##############################################
+
+def get_absolute_url(opts, func, self):
+    return settings.ABSOLUTE_URL_OVERRIDES.get('%s.%s' % (opts.app_label, opts.module_name), func)(self)

Added: vendor/django/current/django/db/models/fields/__init__.py
===================================================================
--- vendor/django/current/django/db/models/fields/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/fields/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,792 @@
+from django.db.models import signals
+from django.dispatch import dispatcher
+from django.conf import settings
+from django.core import validators
+from django import forms
+from django.core.exceptions import ObjectDoesNotExist
+from django.utils.functional import curry
+from django.utils.text import capfirst
+from django.utils.translation import gettext, gettext_lazy
+import datetime, os, time
+
+class NOT_PROVIDED:
+    pass
+
+# Values for filter_interface.
+HORIZONTAL, VERTICAL = 1, 2
+
+# The values to use for "blank" in SelectFields. Will be appended to the start of most "choices" lists.
+BLANK_CHOICE_DASH = [("", "---------")]
+BLANK_CHOICE_NONE = [("", "None")]
+
+# prepares a value for use in a LIKE query
+prep_for_like_query = lambda x: str(x).replace("%", "\%").replace("_", "\_")
+
+# returns the <ul> class for a given radio_admin value
+get_ul_class = lambda x: 'radiolist%s' % ((x == HORIZONTAL) and ' inline' or '')
+
+class FieldDoesNotExist(Exception):
+    pass
+
+def manipulator_validator_unique(f, opts, self, field_data, all_data):
+    "Validates that the value is unique for this field."
+    lookup_type = f.get_validator_unique_lookup_type()
+    try:
+        old_obj = self.manager.get(**{lookup_type: field_data})
+    except ObjectDoesNotExist:
+        return
+    if getattr(self, 'original_object', None) and self.original_object._get_pk_val() == old_obj._get_pk_val():
+        return
+    raise validators.ValidationError, gettext("%(optname)s with this %(fieldname)s already exists.") % {'optname': capfirst(opts.verbose_name), 'fieldname': f.verbose_name}
+
+# A guide to Field parameters:
+#
+#   * name:      The name of the field specifed in the model.
+#   * attname:   The attribute to use on the model object. This is the same as
+#                "name", except in the case of ForeignKeys, where "_id" is
+#                appended.
+#   * db_column: The db_column specified in the model (or None).
+#   * column:    The database column for this field. This is the same as
+#                "attname", except if db_column is specified.
+#
+# Code that introspects values, or does other dynamic things, should use
+# attname. For example, this gets the primary key value of object "obj":
+#
+#     getattr(obj, opts.pk.attname)
+
+class Field(object):
+
+    # Designates whether empty strings fundamentally are allowed at the
+    # database level.
+    empty_strings_allowed = True
+
+    # Tracks each time a Field instance is created. Used to retain order.
+    creation_counter = 0
+
+    def __init__(self, verbose_name=None, name=None, primary_key=False,
+        maxlength=None, unique=False, blank=False, null=False, db_index=False,
+        core=False, rel=None, default=NOT_PROVIDED, editable=True,
+        prepopulate_from=None, unique_for_date=None, unique_for_month=None,
+        unique_for_year=None, validator_list=None, choices=None, radio_admin=None,
+        help_text='', db_column=None):
+        self.name = name
+        self.verbose_name = verbose_name
+        self.primary_key = primary_key
+        self.maxlength, self.unique = maxlength, unique
+        self.blank, self.null = blank, null
+        self.core, self.rel, self.default = core, rel, default
+        self.editable = editable
+        self.validator_list = validator_list or []
+        self.prepopulate_from = prepopulate_from
+        self.unique_for_date, self.unique_for_month = unique_for_date, unique_for_month
+        self.unique_for_year = unique_for_year
+        self.choices = choices or []
+        self.radio_admin = radio_admin
+        self.help_text = help_text
+        self.db_column = db_column
+
+        # Set db_index to True if the field has a relationship and doesn't explicitly set db_index.
+        self.db_index = db_index
+
+        # Increase the creation counter, and save our local copy.
+        self.creation_counter = Field.creation_counter
+        Field.creation_counter += 1
+
+    def __cmp__(self, other):
+        # This is needed because bisect does not take a comparison function.
+        return cmp(self.creation_counter, other.creation_counter)
+
+    def to_python(self, value):
+        """
+        Converts the input value into the expected Python data type, raising
+        validators.ValidationError if the data can't be converted. Returns the
+        converted value. Subclasses should override this.
+        """
+        return value
+
+    def validate_full(self, field_data, all_data):
+        """
+        Returns a list of errors for this field. This is the main interface,
+        as it encapsulates some basic validation logic used by all fields.
+        Subclasses should implement validate(), not validate_full().
+        """
+        if not self.blank and not field_data:
+            return [gettext_lazy('This field is required.')]
+        try:
+            self.validate(field_data, all_data)
+        except validators.ValidationError, e:
+            return e.messages
+        return []
+
+    def validate(self, field_data, all_data):
+        """
+        Raises validators.ValidationError if field_data has any errors.
+        Subclasses should override this to specify field-specific validation
+        logic. This method should assume field_data has already been converted
+        into the appropriate data type by Field.to_python().
+        """
+        pass
+
+    def set_attributes_from_name(self, name):
+        self.name = name
+        self.attname, self.column = self.get_attname_column()
+        self.verbose_name = self.verbose_name or (name and name.replace('_', ' '))
+
+    def contribute_to_class(self, cls, name):
+        self.set_attributes_from_name(name)
+        cls._meta.add_field(self)
+        if self.choices:
+            setattr(cls, 'get_%s_display' % self.name, curry(cls._get_FIELD_display, field=self))
+
+    def get_attname(self):
+        return self.name
+
+    def get_attname_column(self):
+        attname = self.get_attname()
+        column = self.db_column or attname
+        return attname, column
+
+    def get_cache_name(self):
+        return '_%s_cache' % self.name
+
+    def get_internal_type(self):
+        return self.__class__.__name__
+
+    def pre_save(self, model_instance, add):
+        "Returns field's value just before saving."
+        return getattr(model_instance, self.attname)
+
+    def get_db_prep_save(self, value):
+        "Returns field's value prepared for saving into a database."
+        return value
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        "Returns field's value prepared for database lookup."
+        if lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte', 'year', 'month', 'day', 'search'):
+            return [value]
+        elif lookup_type in ('range', 'in'):
+            return value
+        elif lookup_type in ('contains', 'icontains'):
+            return ["%%%s%%" % prep_for_like_query(value)]
+        elif lookup_type == 'iexact':
+            return [prep_for_like_query(value)]
+        elif lookup_type in ('startswith', 'istartswith'):
+            return ["%s%%" % prep_for_like_query(value)]
+        elif lookup_type in ('endswith', 'iendswith'):
+            return ["%%%s" % prep_for_like_query(value)]
+        elif lookup_type == 'isnull':
+            return []
+        raise TypeError, "Field has invalid lookup: %s" % lookup_type
+
+    def has_default(self):
+        "Returns a boolean of whether this field has a default value."
+        return self.default is not NOT_PROVIDED
+
+    def get_default(self):
+        "Returns the default value for this field."
+        if self.default is not NOT_PROVIDED:
+            if callable(self.default):
+                return self.default()
+            return self.default
+        if not self.empty_strings_allowed or self.null:
+            return None
+        return ""
+
+    def get_manipulator_field_names(self, name_prefix):
+        """
+        Returns a list of field names that this object adds to the manipulator.
+        """
+        return [name_prefix + self.name]
+
+    def prepare_field_objs_and_params(self, manipulator, name_prefix):
+        params = {'validator_list': self.validator_list[:]}
+        if self.maxlength and not self.choices: # Don't give SelectFields a maxlength parameter.
+            params['maxlength'] = self.maxlength
+
+        if self.choices:
+            if self.radio_admin:
+                field_objs = [forms.RadioSelectField]
+                params['ul_class'] = get_ul_class(self.radio_admin)
+            else:
+                field_objs = [forms.SelectField]
+
+            params['choices'] = self.get_choices_default()
+        else:
+            field_objs = self.get_manipulator_field_objs()
+        return (field_objs, params)
+
+    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
+        """
+        Returns a list of forms.FormField instances for this field. It
+        calculates the choices at runtime, not at compile time.
+
+        name_prefix is a prefix to prepend to the "field_name" argument.
+        rel is a boolean specifying whether this field is in a related context.
+        """
+        field_objs, params = self.prepare_field_objs_and_params(manipulator, name_prefix)
+
+        # Add the "unique" validator(s).
+        for field_name_list in opts.unique_together:
+            if field_name_list[0] == self.name:
+                params['validator_list'].append(getattr(manipulator, 'isUnique%s' % '_'.join(field_name_list)))
+
+        # Add the "unique for..." validator(s).
+        if self.unique_for_date:
+            params['validator_list'].append(getattr(manipulator, 'isUnique%sFor%s' % (self.name, self.unique_for_date)))
+        if self.unique_for_month:
+            params['validator_list'].append(getattr(manipulator, 'isUnique%sFor%s' % (self.name, self.unique_for_month)))
+        if self.unique_for_year:
+            params['validator_list'].append(getattr(manipulator, 'isUnique%sFor%s' % (self.name, self.unique_for_year)))
+        if self.unique or (self.primary_key and not rel):
+            params['validator_list'].append(curry(manipulator_validator_unique, self, opts, manipulator))
+
+        # Only add is_required=True if the field cannot be blank. Primary keys
+        # are a special case, and fields in a related context should set this
+        # as False, because they'll be caught by a separate validator --
+        # RequiredIfOtherFieldGiven.
+        params['is_required'] = not self.blank and not self.primary_key and not rel
+
+        # BooleanFields (CheckboxFields) are a special case. They don't take
+        # is_required.
+        if isinstance(self, BooleanField):
+            del params['is_required']
+
+        # If this field is in a related context, check whether any other fields
+        # in the related object have core=True. If so, add a validator --
+        # RequiredIfOtherFieldsGiven -- to this FormField.
+        if rel and not self.blank and not isinstance(self, AutoField) and not isinstance(self, FileField):
+            # First, get the core fields, if any.
+            core_field_names = []
+            for f in opts.fields:
+                if f.core and f != self:
+                    core_field_names.extend(f.get_manipulator_field_names(name_prefix))
+            # Now, if there are any, add the validator to this FormField.
+            if core_field_names:
+                params['validator_list'].append(validators.RequiredIfOtherFieldsGiven(core_field_names, gettext_lazy("This field is required.")))
+
+        # Finally, add the field_names.
+        field_names = self.get_manipulator_field_names(name_prefix)
+        return [man(field_name=field_names[i], **params) for i, man in enumerate(field_objs)]
+
+    def get_validator_unique_lookup_type(self):
+        return '%s__exact' % self.name
+
+    def get_manipulator_new_data(self, new_data, rel=False):
+        """
+        Given the full new_data dictionary (from the manipulator), returns this
+        field's data.
+        """
+        if rel:
+            return new_data.get(self.name, [self.get_default()])[0]
+        val = new_data.get(self.name, self.get_default())
+        if not self.empty_strings_allowed and val == '' and self.null:
+            val = None
+        return val
+
+    def get_choices(self, include_blank=True, blank_choice=BLANK_CHOICE_DASH):
+        "Returns a list of tuples used as SelectField choices for this field."
+        first_choice = include_blank and blank_choice or []
+        if self.choices:
+            return first_choice + list(self.choices)
+        rel_model = self.rel.to
+        return first_choice + [(x._get_pk_val(), str(x))
+                               for x in rel_model._default_manager.complex_filter(self.rel.limit_choices_to)]
+
+    def get_choices_default(self):
+        if self.radio_admin:
+            return self.get_choices(include_blank=self.blank, blank_choice=BLANK_CHOICE_NONE)
+        else:
+            return self.get_choices()
+
+    def _get_val_from_obj(self, obj):
+        if obj:
+            return getattr(obj, self.attname)
+        else:
+            return self.get_default()
+
+    def flatten_data(self, follow, obj=None):
+        """
+        Returns a dictionary mapping the field's manipulator field names to its
+        "flattened" string values for the admin view. obj is the instance to
+        extract the values from.
+        """
+        return {self.attname: self._get_val_from_obj(obj)}
+
+    def get_follow(self, override=None):
+        if override != None:
+            return override
+        else:
+            return self.editable
+
+    def bind(self, fieldmapping, original, bound_field_class):
+        return bound_field_class(self, fieldmapping, original)
+
+class AutoField(Field):
+    empty_strings_allowed = False
+    def __init__(self, *args, **kwargs):
+        assert kwargs.get('primary_key', False) is True, "%ss must have primary_key=True." % self.__class__.__name__
+        kwargs['blank'] = True
+        Field.__init__(self, *args, **kwargs)
+
+    def to_python(self, value):
+        if value is None:
+            return value
+        try:
+            return int(value)
+        except (TypeError, ValueError):
+            raise validators.ValidationError, gettext("This value must be an integer.")
+
+    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
+        if not rel:
+            return [] # Don't add a FormField unless it's in a related context.
+        return Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow)
+
+    def get_manipulator_field_objs(self):
+        return [forms.HiddenField]
+
+    def get_manipulator_new_data(self, new_data, rel=False):
+        # Never going to be called
+        # Not in main change pages
+        # ignored in related context
+        if not rel:
+            return None
+        return Field.get_manipulator_new_data(self, new_data, rel)
+
+    def contribute_to_class(self, cls, name):
+        assert not cls._meta.has_auto_field, "A model can't have more than one AutoField."
+        super(AutoField, self).contribute_to_class(cls, name)
+        cls._meta.has_auto_field = True
+
+class BooleanField(Field):
+    def __init__(self, *args, **kwargs):
+        kwargs['blank'] = True
+        Field.__init__(self, *args, **kwargs)
+
+    def to_python(self, value):
+        if value in (True, False): return value
+        if value in ('t', 'True'): return True
+        if value in ('f', 'False'): return False
+        raise validators.ValidationError, gettext("This value must be either True or False.")
+
+    def get_manipulator_field_objs(self):
+        return [forms.CheckboxField]
+
+class CharField(Field):
+    def get_manipulator_field_objs(self):
+        return [forms.TextField]
+
+    def to_python(self, value):
+        if isinstance(value, basestring):
+            return value
+        if value is None:
+            if self.null:
+                return value
+            else:
+                raise validators.ValidationError, gettext_lazy("This field cannot be null.")
+        return str(value)
+
+# TODO: Maybe move this into contrib, because it's specialized.
+class CommaSeparatedIntegerField(CharField):
+    def get_manipulator_field_objs(self):
+        return [forms.CommaSeparatedIntegerField]
+
+class DateField(Field):
+    empty_strings_allowed = False
+    def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
+        self.auto_now, self.auto_now_add = auto_now, auto_now_add
+        #HACKs : auto_now_add/auto_now should be done as a default or a pre_save.
+        if auto_now or auto_now_add:
+            kwargs['editable'] = False
+            kwargs['blank'] = True
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def to_python(self, value):
+        if isinstance(value, datetime.datetime):
+            return value.date()
+        if isinstance(value, datetime.date):
+            return value
+        validators.isValidANSIDate(value, None)
+        try:
+            return datetime.date(*time.strptime(value, '%Y-%m-%d')[:3])
+        except ValueError:
+            raise validators.ValidationError, gettext('Enter a valid date in YYYY-MM-DD format.')
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        if lookup_type == 'range':
+            value = [str(v) for v in value]
+        elif lookup_type in ('exact', 'gt', 'gte', 'lt', 'lte') and hasattr(value, 'strftime'):
+            value = value.strftime('%Y-%m-%d')
+        else:
+            value = str(value)
+        return Field.get_db_prep_lookup(self, lookup_type, value)
+
+    def pre_save(self, model_instance, add):
+        if self.auto_now or (self.auto_now_add and add):
+            value = datetime.datetime.now()
+            setattr(model_instance, self.attname, value)
+            return value
+        else:
+            return super(DateField, self).pre_save(model_instance, add)
+
+    def contribute_to_class(self, cls, name):
+        super(DateField,self).contribute_to_class(cls, name)
+        if not self.null:
+            setattr(cls, 'get_next_by_%s' % self.name,
+                curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=True))
+            setattr(cls, 'get_previous_by_%s' % self.name,
+                curry(cls._get_next_or_previous_by_FIELD, field=self, is_next=False))
+
+    # Needed because of horrible auto_now[_add] behaviour wrt. editable
+    def get_follow(self, override=None):
+        if override != None:
+            return override
+        else:
+            return self.editable or self.auto_now or self.auto_now_add
+
+    def get_db_prep_save(self, value):
+        # Casts dates into string format for entry into database.
+        if value is not None:
+            value = value.strftime('%Y-%m-%d')
+        return Field.get_db_prep_save(self, value)
+
+    def get_manipulator_field_objs(self):
+        return [forms.DateField]
+
+    def flatten_data(self, follow, obj = None):
+        val = self._get_val_from_obj(obj)
+        return {self.attname: (val is not None and val.strftime("%Y-%m-%d") or '')}
+
+class DateTimeField(DateField):
+    def to_python(self, value):
+        if isinstance(value, datetime.datetime):
+            return value
+        if isinstance(value, datetime.date):
+            return datetime.datetime(value.year, value.month, value.day)
+        try: # Seconds are optional, so try converting seconds first.
+            return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M:%S')[:6])
+        except ValueError:
+            try: # Try without seconds.
+                return datetime.datetime(*time.strptime(value, '%Y-%m-%d %H:%M')[:5])
+            except ValueError: # Try without hour/minutes/seconds.
+                try:
+                    return datetime.datetime(*time.strptime(value, '%Y-%m-%d')[:3])
+                except ValueError:
+                    raise validators.ValidationError, gettext('Enter a valid date/time in YYYY-MM-DD HH:MM format.')
+
+    def get_db_prep_save(self, value):
+        # Casts dates into string format for entry into database.
+        if value is not None:
+            # MySQL will throw a warning if microseconds are given, because it
+            # doesn't support microseconds.
+            if settings.DATABASE_ENGINE == 'mysql' and hasattr(value, 'microsecond'):
+                value = value.replace(microsecond=0)
+            value = str(value)
+        return Field.get_db_prep_save(self, value)
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        if lookup_type == 'range':
+            value = [str(v) for v in value]
+        else:
+            value = str(value)
+        return Field.get_db_prep_lookup(self, lookup_type, value)
+
+    def get_manipulator_field_objs(self):
+        return [forms.DateField, forms.TimeField]
+
+    def get_manipulator_field_names(self, name_prefix):
+        return [name_prefix + self.name + '_date', name_prefix + self.name + '_time']
+
+    def get_manipulator_new_data(self, new_data, rel=False):
+        date_field, time_field = self.get_manipulator_field_names('')
+        if rel:
+            d = new_data.get(date_field, [None])[0]
+            t = new_data.get(time_field, [None])[0]
+        else:
+            d = new_data.get(date_field, None)
+            t = new_data.get(time_field, None)
+        if d is not None and t is not None:
+            return datetime.datetime.combine(d, t)
+        return self.get_default()
+
+    def flatten_data(self,follow, obj = None):
+        val = self._get_val_from_obj(obj)
+        date_field, time_field = self.get_manipulator_field_names('')
+        return {date_field: (val is not None and val.strftime("%Y-%m-%d") or ''),
+                time_field: (val is not None and val.strftime("%H:%M:%S") or '')}
+
+class EmailField(CharField):
+    def __init__(self, *args, **kwargs):
+        kwargs['maxlength'] = 75
+        CharField.__init__(self, *args, **kwargs)
+
+    def get_internal_type(self):
+        return "CharField"
+
+    def get_manipulator_field_objs(self):
+        return [forms.EmailField]
+
+    def validate(self, field_data, all_data):
+        validators.isValidEmail(field_data, all_data)
+
+class FileField(Field):
+    def __init__(self, verbose_name=None, name=None, upload_to='', **kwargs):
+        self.upload_to = upload_to
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
+        field_list = Field.get_manipulator_fields(self, opts, manipulator, change, name_prefix, rel, follow)
+        if not self.blank:
+            if rel:
+                # This validator makes sure FileFields work in a related context.
+                class RequiredFileField(object):
+                    def __init__(self, other_field_names, other_file_field_name):
+                        self.other_field_names = other_field_names
+                        self.other_file_field_name = other_file_field_name
+                        self.always_test = True
+                    def __call__(self, field_data, all_data):
+                        if not all_data.get(self.other_file_field_name, False):
+                            c = validators.RequiredIfOtherFieldsGiven(self.other_field_names, gettext_lazy("This field is required."))
+                            c(field_data, all_data)
+                # First, get the core fields, if any.
+                core_field_names = []
+                for f in opts.fields:
+                    if f.core and f != self:
+                        core_field_names.extend(f.get_manipulator_field_names(name_prefix))
+                # Now, if there are any, add the validator to this FormField.
+                if core_field_names:
+                    field_list[0].validator_list.append(RequiredFileField(core_field_names, field_list[1].field_name))
+            else:
+                v = validators.RequiredIfOtherFieldNotGiven(field_list[1].field_name, gettext_lazy("This field is required."))
+                v.always_test = True
+                field_list[0].validator_list.append(v)
+                field_list[0].is_required = field_list[1].is_required = False
+
+        # If the raw path is passed in, validate it's under the MEDIA_ROOT.
+        def isWithinMediaRoot(field_data, all_data):
+            f = os.path.abspath(os.path.join(settings.MEDIA_ROOT, field_data))
+            if not f.startswith(os.path.normpath(settings.MEDIA_ROOT)):
+                raise validators.ValidationError, _("Enter a valid filename.")
+        field_list[1].validator_list.append(isWithinMediaRoot)
+        return field_list
+
+    def contribute_to_class(self, cls, name):
+        super(FileField, self).contribute_to_class(cls, name)
+        setattr(cls, 'get_%s_filename' % self.name, curry(cls._get_FIELD_filename, field=self))
+        setattr(cls, 'get_%s_url' % self.name, curry(cls._get_FIELD_url, field=self))
+        setattr(cls, 'get_%s_size' % self.name, curry(cls._get_FIELD_size, field=self))
+        setattr(cls, 'save_%s_file' % self.name, lambda instance, filename, raw_contents: instance._save_FIELD_file(self, filename, raw_contents))
+        dispatcher.connect(self.delete_file, signal=signals.post_delete, sender=cls)
+
+    def delete_file(self, instance):
+        if getattr(instance, self.attname):
+            file_name = getattr(instance, 'get_%s_filename' % self.name)()
+            # If the file exists and no other object of this type references it,
+            # delete it from the filesystem.
+            if os.path.exists(file_name) and \
+                not instance.__class__._default_manager.filter(**{'%s__exact' % self.name: getattr(instance, self.attname)}):
+                os.remove(file_name)
+
+    def get_manipulator_field_objs(self):
+        return [forms.FileUploadField, forms.HiddenField]
+
+    def get_manipulator_field_names(self, name_prefix):
+        return [name_prefix + self.name + '_file', name_prefix + self.name]
+
+    def save_file(self, new_data, new_object, original_object, change, rel):
+        upload_field_name = self.get_manipulator_field_names('')[0]
+        if new_data.get(upload_field_name, False):
+            func = getattr(new_object, 'save_%s_file' % self.name)
+            if rel:
+                func(new_data[upload_field_name][0]["filename"], new_data[upload_field_name][0]["content"])
+            else:
+                func(new_data[upload_field_name]["filename"], new_data[upload_field_name]["content"])
+
+    def get_directory_name(self):
+        return os.path.normpath(datetime.datetime.now().strftime(self.upload_to))
+
+    def get_filename(self, filename):
+        from django.utils.text import get_valid_filename
+        f = os.path.join(self.get_directory_name(), get_valid_filename(os.path.basename(filename)))
+        return os.path.normpath(f)
+
+class FilePathField(Field):
+    def __init__(self, verbose_name=None, name=None, path='', match=None, recursive=False, **kwargs):
+        self.path, self.match, self.recursive = path, match, recursive
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [curry(forms.FilePathField, path=self.path, match=self.match, recursive=self.recursive)]
+
+class FloatField(Field):
+    empty_strings_allowed = False
+    def __init__(self, verbose_name=None, name=None, max_digits=None, decimal_places=None, **kwargs):
+        self.max_digits, self.decimal_places = max_digits, decimal_places
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [curry(forms.FloatField, max_digits=self.max_digits, decimal_places=self.decimal_places)]
+
+class ImageField(FileField):
+    def __init__(self, verbose_name=None, name=None, width_field=None, height_field=None, **kwargs):
+        self.width_field, self.height_field = width_field, height_field
+        FileField.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [forms.ImageUploadField, forms.HiddenField]
+
+    def contribute_to_class(self, cls, name):
+        super(ImageField, self).contribute_to_class(cls, name)
+        # Add get_BLAH_width and get_BLAH_height methods, but only if the
+        # image field doesn't have width and height cache fields.
+        if not self.width_field:
+            setattr(cls, 'get_%s_width' % self.name, curry(cls._get_FIELD_width, field=self))
+        if not self.height_field:
+            setattr(cls, 'get_%s_height' % self.name, curry(cls._get_FIELD_height, field=self))
+
+    def save_file(self, new_data, new_object, original_object, change, rel):
+        FileField.save_file(self, new_data, new_object, original_object, change, rel)
+        # If the image has height and/or width field(s) and they haven't
+        # changed, set the width and/or height field(s) back to their original
+        # values.
+        if change and (self.width_field or self.height_field):
+            if self.width_field:
+                setattr(new_object, self.width_field, getattr(original_object, self.width_field))
+            if self.height_field:
+                setattr(new_object, self.height_field, getattr(original_object, self.height_field))
+            new_object.save()
+
+class IntegerField(Field):
+    empty_strings_allowed = False
+    def get_manipulator_field_objs(self):
+        return [forms.IntegerField]
+
+class IPAddressField(Field):
+    def __init__(self, *args, **kwargs):
+        kwargs['maxlength'] = 15
+        Field.__init__(self, *args, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [forms.IPAddressField]
+
+    def validate(self, field_data, all_data):
+        validators.isValidIPAddress4(field_data, None)
+
+class NullBooleanField(Field):
+    def __init__(self, *args, **kwargs):
+        kwargs['null'] = True
+        Field.__init__(self, *args, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [forms.NullBooleanField]
+
+class PhoneNumberField(IntegerField):
+    def get_manipulator_field_objs(self):
+        return [forms.PhoneNumberField]
+
+    def validate(self, field_data, all_data):
+        validators.isValidPhone(field_data, all_data)
+
+class PositiveIntegerField(IntegerField):
+    def get_manipulator_field_objs(self):
+        return [forms.PositiveIntegerField]
+
+class PositiveSmallIntegerField(IntegerField):
+    def get_manipulator_field_objs(self):
+        return [forms.PositiveSmallIntegerField]
+
+class SlugField(Field):
+    def __init__(self, *args, **kwargs):
+        kwargs['maxlength'] = kwargs.get('maxlength', 50)
+        kwargs.setdefault('validator_list', []).append(validators.isSlug)
+        # Set db_index=True unless it's been set manually.
+        if not kwargs.has_key('db_index'):
+            kwargs['db_index'] = True
+        Field.__init__(self, *args, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [forms.TextField]
+
+class SmallIntegerField(IntegerField):
+    def get_manipulator_field_objs(self):
+        return [forms.SmallIntegerField]
+
+class TextField(Field):
+    def get_manipulator_field_objs(self):
+        return [forms.LargeTextField]
+
+class TimeField(Field):
+    empty_strings_allowed = False
+    def __init__(self, verbose_name=None, name=None, auto_now=False, auto_now_add=False, **kwargs):
+        self.auto_now, self.auto_now_add = auto_now, auto_now_add
+        if auto_now or auto_now_add:
+            kwargs['editable'] = False
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        if lookup_type == 'range':
+            value = [str(v) for v in value]
+        else:
+            value = str(value)
+        return Field.get_db_prep_lookup(self, lookup_type, value)
+
+    def pre_save(self, model_instance, add):
+        if self.auto_now or (self.auto_now_add and add):
+            value = datetime.datetime.now().time()
+            setattr(model_instance, self.attname, value)
+            return value
+        else:
+            return super(TimeField, self).pre_save(model_instance, add)
+
+    def get_db_prep_save(self, value):
+        # Casts dates into string format for entry into database.
+        if value is not None:
+            # MySQL will throw a warning if microseconds are given, because it
+            # doesn't support microseconds.
+            if settings.DATABASE_ENGINE == 'mysql':
+                value = value.replace(microsecond=0)
+            value = str(value)
+        return Field.get_db_prep_save(self, value)
+
+    def get_manipulator_field_objs(self):
+        return [forms.TimeField]
+
+    def flatten_data(self,follow, obj = None):
+        val = self._get_val_from_obj(obj)
+        return {self.attname: (val is not None and val.strftime("%H:%M:%S") or '')}
+
+class URLField(Field):
+    def __init__(self, verbose_name=None, name=None, verify_exists=True, **kwargs):
+        if verify_exists:
+            kwargs.setdefault('validator_list', []).append(validators.isExistingURL)
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        return [forms.URLField]
+
+class USStateField(Field):
+    def get_manipulator_field_objs(self):
+        return [forms.USStateField]
+
+class XMLField(TextField):
+    def __init__(self, verbose_name=None, name=None, schema_path=None, **kwargs):
+        self.schema_path = schema_path
+        Field.__init__(self, verbose_name, name, **kwargs)
+
+    def get_internal_type(self):
+        return "TextField"
+
+    def get_manipulator_field_objs(self):
+        return [curry(forms.XMLLargeTextField, schema_path=self.schema_path)]
+
+class OrderingField(IntegerField):
+    empty_strings_allowed=False
+    def __init__(self, with_respect_to, **kwargs):
+        self.wrt = with_respect_to
+        kwargs['null'] = True
+        IntegerField.__init__(self, **kwargs )
+
+    def get_internal_type(self):
+        return "IntegerField"
+
+    def get_manipulator_fields(self, opts, manipulator, change, name_prefix='', rel=False, follow=True):
+        return [forms.HiddenField(name_prefix + self.name)]

Added: vendor/django/current/django/db/models/fields/generic.py
===================================================================
--- vendor/django/current/django/db/models/fields/generic.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/fields/generic.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,259 @@
+"""
+Classes allowing "generic" relations through ContentType and object-id fields.
+"""
+
+from django import forms
+from django.core.exceptions import ObjectDoesNotExist
+from django.db import backend
+from django.db.models import signals
+from django.db.models.fields.related import RelatedField, Field, ManyToManyRel
+from django.db.models.loading import get_model
+from django.dispatch import dispatcher
+from django.utils.functional import curry
+
+class GenericForeignKey(object):
+    """
+    Provides a generic relation to any object through content-type/object-id
+    fields.
+    """
+    
+    def __init__(self, ct_field="content_type", fk_field="object_id"):
+        self.ct_field = ct_field
+        self.fk_field = fk_field
+        
+    def contribute_to_class(self, cls, name):
+        # Make sure the fields exist (these raise FieldDoesNotExist, 
+        # which is a fine error to raise here)
+        self.name = name
+        self.model = cls
+        self.cache_attr = "_%s_cache" % name
+        
+        # For some reason I don't totally understand, using weakrefs here doesn't work.
+        dispatcher.connect(self.instance_pre_init, signal=signals.pre_init, sender=cls, weak=False)
+
+        # Connect myself as the descriptor for this field
+        setattr(cls, name, self)
+
+    def instance_pre_init(self, signal, sender, args, kwargs):
+        # Handle initalizing an object with the generic FK instaed of 
+        # content-type/object-id fields.        
+        if kwargs.has_key(self.name):
+            value = kwargs.pop(self.name)
+            kwargs[self.ct_field] = self.get_content_type(value)
+            kwargs[self.fk_field] = value._get_pk_val()
+            
+    def get_content_type(self, obj):
+        # Convenience function using get_model avoids a circular import when using this model
+        ContentType = get_model("contenttypes", "contenttype")
+        return ContentType.objects.get_for_model(obj)
+        
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.name
+
+        try:
+            return getattr(instance, self.cache_attr)
+        except AttributeError:
+            rel_obj = None
+            ct = getattr(instance, self.ct_field)
+            if ct:
+                try:
+                    rel_obj = ct.get_object_for_this_type(pk=getattr(instance, self.fk_field))
+                except ObjectDoesNotExist:
+                    pass
+            setattr(instance, self.cache_attr, rel_obj)
+            return rel_obj
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name
+
+        ct = None
+        fk = None
+        if value is not None:
+            ct = self.get_content_type(value)
+            fk = value._get_pk_val()
+
+        setattr(instance, self.ct_field, ct)
+        setattr(instance, self.fk_field, fk)
+        setattr(instance, self.cache_attr, value)
+    
+class GenericRelation(RelatedField, Field):
+    """Provides an accessor to generic related objects (i.e. comments)"""
+
+    def __init__(self, to, **kwargs):
+        kwargs['verbose_name'] = kwargs.get('verbose_name', None)
+        kwargs['rel'] = GenericRel(to, 
+                            related_name=kwargs.pop('related_name', None),
+                            limit_choices_to=kwargs.pop('limit_choices_to', None),
+                            symmetrical=kwargs.pop('symmetrical', True))
+                            
+        # Override content-type/object-id field names on the related class
+        self.object_id_field_name = kwargs.pop("object_id_field", "object_id")
+        self.content_type_field_name = kwargs.pop("content_type_field", "content_type")                
+        
+        kwargs['blank'] = True
+        kwargs['editable'] = False
+        Field.__init__(self, **kwargs)
+
+    def get_manipulator_field_objs(self):
+        choices = self.get_choices_default()
+        return [curry(forms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)]
+
+    def get_choices_default(self):
+        return Field.get_choices(self, include_blank=False)
+
+    def flatten_data(self, follow, obj = None):
+        new_data = {}
+        if obj:
+            instance_ids = [instance._get_pk_val() for instance in getattr(obj, self.name).all()]
+            new_data[self.name] = instance_ids
+        return new_data
+
+    def m2m_db_table(self):
+        return self.rel.to._meta.db_table
+
+    def m2m_column_name(self):
+        return self.object_id_field_name
+        
+    def m2m_reverse_name(self):
+        return self.model._meta.pk.attname
+
+    def contribute_to_class(self, cls, name):
+        super(GenericRelation, self).contribute_to_class(cls, name)
+
+        # Save a reference to which model this class is on for future use
+        self.model = cls
+
+        # Add the descriptor for the m2m relation
+        setattr(cls, self.name, ReverseGenericRelatedObjectsDescriptor(self))
+
+    def contribute_to_related_class(self, cls, related):
+        pass
+        
+    def set_attributes_from_rel(self):
+        pass
+
+    def get_internal_type(self):
+        return "ManyToManyField"
+        
+class ReverseGenericRelatedObjectsDescriptor(object):
+    """
+    This class provides the functionality that makes the related-object
+    managers available as attributes on a model class, for fields that have
+    multiple "remote" values and have a GenericRelation defined in their model
+    (rather than having another model pointed *at* them). In the example
+    "article.publications", the publications attribute is a
+    ReverseGenericRelatedObjectsDescriptor instance.
+    """
+    def __init__(self, field):
+        self.field = field
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        # This import is done here to avoid circular import importing this module
+        from django.contrib.contenttypes.models import ContentType
+
+        # Dynamically create a class that subclasses the related model's
+        # default manager.
+        rel_model = self.field.rel.to
+        superclass = rel_model._default_manager.__class__
+        RelatedManager = create_generic_related_manager(superclass)
+
+        manager = RelatedManager(
+            model = rel_model,
+            instance = instance,
+            symmetrical = (self.field.rel.symmetrical and instance.__class__ == rel_model),
+            join_table = backend.quote_name(self.field.m2m_db_table()),
+            source_col_name = backend.quote_name(self.field.m2m_column_name()),
+            target_col_name = backend.quote_name(self.field.m2m_reverse_name()),
+            content_type = ContentType.objects.get_for_model(self.field.model),
+            content_type_field_name = self.field.content_type_field_name,
+            object_id_field_name = self.field.object_id_field_name
+        )
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        manager = self.__get__(instance)
+        manager.clear()
+        for obj in value:
+            manager.add(obj)
+
+def create_generic_related_manager(superclass):
+    """
+    Factory function for a manager that subclasses 'superclass' (which is a
+    Manager) and adds behavior for generic related objects.
+    """
+    
+    class GenericRelatedObjectManager(superclass):
+        def __init__(self, model=None, core_filters=None, instance=None, symmetrical=None,
+                     join_table=None, source_col_name=None, target_col_name=None, content_type=None,
+                     content_type_field_name=None, object_id_field_name=None):
+            
+            super(GenericRelatedObjectManager, self).__init__()
+            self.core_filters = core_filters or {}
+            self.model = model
+            self.content_type = content_type
+            self.symmetrical = symmetrical
+            self.instance = instance
+            self.join_table = join_table
+            self.join_table = model._meta.db_table
+            self.source_col_name = source_col_name
+            self.target_col_name = target_col_name
+            self.content_type_field_name = content_type_field_name
+            self.object_id_field_name = object_id_field_name
+            self.pk_val = self.instance._get_pk_val()
+                        
+        def get_query_set(self):
+            query = {
+                '%s__pk' % self.content_type_field_name : self.content_type.id, 
+                '%s__exact' % self.object_id_field_name : self.pk_val,
+            }
+            return superclass.get_query_set(self).filter(**query)
+
+        def add(self, *objs):
+            for obj in objs:
+                setattr(obj, self.content_type_field_name, self.content_type)
+                setattr(obj, self.object_id_field_name, self.pk_val)
+                obj.save()
+        add.alters_data = True
+
+        def remove(self, *objs):
+            for obj in objs:
+                obj.delete()
+        remove.alters_data = True
+
+        def clear(self):
+            for obj in self.all():
+                obj.delete()
+        clear.alters_data = True
+
+        def create(self, **kwargs):
+            kwargs[self.content_type_field_name] = self.content_type
+            kwargs[self.object_id_field_name] = self.pk_val
+            obj = self.model(**kwargs)
+            obj.save()
+            return obj
+        create.alters_data = True
+
+    return GenericRelatedObjectManager
+
+class GenericRel(ManyToManyRel):
+    def __init__(self, to, related_name=None, limit_choices_to=None, symmetrical=True):
+        self.to = to
+        self.num_in_admin = 0
+        self.related_name = related_name
+        self.filter_interface = None
+        self.limit_choices_to = limit_choices_to or {}
+        self.edit_inline = False
+        self.raw_id_admin = False
+        self.symmetrical = symmetrical
+        self.multiple = True
+        assert not (self.raw_id_admin and self.filter_interface), \
+            "Generic relations may not use both raw_id_admin and filter_interface"

Added: vendor/django/current/django/db/models/fields/related.py
===================================================================
--- vendor/django/current/django/db/models/fields/related.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/fields/related.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,761 @@
+from django.db import backend, transaction
+from django.db.models import signals, get_model
+from django.db.models.fields import AutoField, Field, IntegerField, get_ul_class
+from django.db.models.related import RelatedObject
+from django.utils.translation import gettext_lazy, string_concat
+from django.utils.functional import curry
+from django.core import validators
+from django import forms
+from django.dispatch import dispatcher
+
+# For Python 2.3
+if not hasattr(__builtins__, 'set'):
+    from sets import Set as set
+
+# Values for Relation.edit_inline.
+TABULAR, STACKED = 1, 2
+
+RECURSIVE_RELATIONSHIP_CONSTANT = 'self'
+
+pending_lookups = {}
+
+def add_lookup(rel_cls, field):
+    name = field.rel.to
+    module = rel_cls.__module__
+    key = (module, name)
+    # Has the model already been loaded?
+    # If so, resolve the string reference right away
+    model = get_model(rel_cls._meta.app_label,field.rel.to)
+    if model:
+        field.rel.to = model
+        field.do_related_class(model, rel_cls)
+    else:
+        # Mark the related field for later lookup
+        pending_lookups.setdefault(key, []).append((rel_cls, field))
+
+def do_pending_lookups(sender):
+    other_cls = sender
+    key = (other_cls.__module__, other_cls.__name__)
+    for rel_cls, field in pending_lookups.setdefault(key, []):
+        field.rel.to = other_cls
+        field.do_related_class(other_cls, rel_cls)
+
+dispatcher.connect(do_pending_lookups, signal=signals.class_prepared)
+
+def manipulator_valid_rel_key(f, self, field_data, all_data):
+    "Validates that the value is a valid foreign key"
+    klass = f.rel.to
+    try:
+        klass._default_manager.get(**{f.rel.field_name: field_data})
+    except klass.DoesNotExist:
+        raise validators.ValidationError, _("Please enter a valid %s.") % f.verbose_name
+
+#HACK
+class RelatedField(object):
+    def contribute_to_class(self, cls, name):
+        sup = super(RelatedField, self)
+
+        # Add an accessor to allow easy determination of the related query path for this field
+        self.related_query_name = curry(self._get_related_query_name, cls._meta)
+
+        if hasattr(sup, 'contribute_to_class'):
+            sup.contribute_to_class(cls, name)
+        other = self.rel.to
+        if isinstance(other, basestring):
+            if other == RECURSIVE_RELATIONSHIP_CONSTANT:
+                self.rel.to = cls.__name__
+            add_lookup(cls, self)
+        else:
+            self.do_related_class(other, cls)
+
+    def set_attributes_from_rel(self):
+        self.name = self.name or (self.rel.to._meta.object_name.lower() + '_' + self.rel.to._meta.pk.name)
+        self.verbose_name = self.verbose_name or self.rel.to._meta.verbose_name
+        self.rel.field_name = self.rel.field_name or self.rel.to._meta.pk.name
+
+    def do_related_class(self, other, cls):
+        self.set_attributes_from_rel()
+        related = RelatedObject(other, cls, self)
+        self.contribute_to_related_class(other, related)
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        # If we are doing a lookup on a Related Field, we must be
+        # comparing object instances. The value should be the PK of value,
+        # not value itself.
+        def pk_trace(value):
+            # Value may be a primary key, or an object held in a relation.
+            # If it is an object, then we need to get the primary key value for
+            # that object. In certain conditions (especially one-to-one relations),
+            # the primary key may itself be an object - so we need to keep drilling
+            # down until we hit a value that can be used for a comparison.
+            v = value
+            try:
+                while True:
+                    v = getattr(v, v._meta.pk.name)
+            except AttributeError:
+                pass
+            return v
+
+        if lookup_type == 'exact':
+            return [pk_trace(value)]
+        if lookup_type == 'in':
+            return [pk_trace(v) for v in value]
+        elif lookup_type == 'isnull':
+            return []
+        raise TypeError, "Related Field has invalid lookup: %s" % lookup_type
+
+    def _get_related_query_name(self, opts):
+        # This method defines the name that can be used to identify this related object
+        # in a table-spanning query. It uses the lower-cased object_name by default,
+        # but this can be overridden with the "related_name" option.
+        return self.rel.related_name or opts.object_name.lower()
+
+class SingleRelatedObjectDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # a single "remote" value, on the class pointed to by a related field.
+    # In the example "place.restaurant", the restaurant attribute is a
+    # SingleRelatedObjectDescriptor instance.
+    def __init__(self, related):
+        self.related = related
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name
+
+        params = {'%s__pk' % self.related.field.name: instance._get_pk_val()}
+        rel_obj = self.related.model._default_manager.get(**params)
+        return rel_obj
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.related.opts.object_name
+        # Set the value of the related field
+        setattr(value, self.related.field.rel.get_related_field().attname, instance)
+
+        # Clear the cache, if it exists
+        try:
+            delattr(value, self.related.field.get_cache_name())
+        except AttributeError:
+            pass
+
+class ReverseSingleRelatedObjectDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # a single "remote" value, on the class that defines the related field.
+    # In the example "choice.poll", the poll attribute is a
+    # ReverseSingleRelatedObjectDescriptor instance.
+    def __init__(self, field_with_rel):
+        self.field = field_with_rel
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self.field.name
+        cache_name = self.field.get_cache_name()
+        try:
+            return getattr(instance, cache_name)
+        except AttributeError:
+            val = getattr(instance, self.field.attname)
+            if val is None:
+                # If NULL is an allowed value, return it.
+                if self.field.null:
+                    return None
+                raise self.field.rel.to.DoesNotExist
+            other_field = self.field.rel.get_related_field()
+            if other_field.rel:
+                params = {'%s__pk' % self.field.rel.field_name: val}
+            else:
+                params = {'%s__exact' % self.field.rel.field_name: val}
+            rel_obj = self.field.rel.to._default_manager.get(**params)
+            setattr(instance, cache_name, rel_obj)
+            return rel_obj
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "%s must be accessed via instance" % self._field.name
+        # Set the value of the related field
+        try:
+            val = getattr(value, self.field.rel.get_related_field().attname)
+        except AttributeError:
+            val = None
+        setattr(instance, self.field.attname, val)
+
+        # Clear the cache, if it exists
+        try:
+            delattr(instance, self.field.get_cache_name())
+        except AttributeError:
+            pass
+
+class ForeignRelatedObjectsDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # multiple "remote" values and have a ForeignKey pointed at them by
+    # some other model. In the example "poll.choice_set", the choice_set
+    # attribute is a ForeignRelatedObjectsDescriptor instance.
+    def __init__(self, related):
+        self.related = related   # RelatedObject instance
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        rel_field = self.related.field
+        rel_model = self.related.model
+
+        # Dynamically create a class that subclasses the related
+        # model's default manager.
+        superclass = self.related.model._default_manager.__class__
+
+        class RelatedManager(superclass):
+            def get_query_set(self):
+                return superclass.get_query_set(self).filter(**(self.core_filters))
+
+            def add(self, *objs):
+                for obj in objs:
+                    setattr(obj, rel_field.name, instance)
+                    obj.save()
+            add.alters_data = True
+
+            def create(self, **kwargs):
+                new_obj = self.model(**kwargs)
+                self.add(new_obj)
+                return new_obj
+            create.alters_data = True
+
+            # remove() and clear() are only provided if the ForeignKey can have a value of null.
+            if rel_field.null:
+                def remove(self, *objs):
+                    val = getattr(instance, rel_field.rel.get_related_field().attname)
+                    for obj in objs:
+                        # Is obj actually part of this descriptor set?
+                        if getattr(obj, rel_field.attname) == val:
+                            setattr(obj, rel_field.name, None)
+                            obj.save()
+                        else:
+                            raise rel_field.rel.to.DoesNotExist, "%r is not related to %r." % (obj, instance)
+                remove.alters_data = True
+
+                def clear(self):
+                    for obj in self.all():
+                        setattr(obj, rel_field.name, None)
+                        obj.save()
+                clear.alters_data = True
+
+        manager = RelatedManager()
+        manager.core_filters = {'%s__pk' % rel_field.name: getattr(instance, rel_field.rel.get_related_field().attname)}
+        manager.model = self.related.model
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        manager = self.__get__(instance)
+        # If the foreign key can support nulls, then completely clear the related set.
+        # Otherwise, just move the named objects into the set.
+        if self.related.field.null:
+            manager.clear()
+        for obj in value:
+            manager.add(obj)
+
+def create_many_related_manager(superclass):
+    """Creates a manager that subclasses 'superclass' (which is a Manager)
+    and adds behavior for many-to-many related objects."""
+    class ManyRelatedManager(superclass):
+        def __init__(self, model=None, core_filters=None, instance=None, symmetrical=None,
+                join_table=None, source_col_name=None, target_col_name=None):
+            super(ManyRelatedManager, self).__init__()
+            self.core_filters = core_filters
+            self.model = model
+            self.symmetrical = symmetrical
+            self.instance = instance
+            self.join_table = join_table
+            self.source_col_name = source_col_name
+            self.target_col_name = target_col_name
+            self._pk_val = self.instance._get_pk_val()
+            if self._pk_val is None:
+                raise ValueError("%r instance needs to have a primary key value before a many-to-many relationship can be used." % model)
+
+        def get_query_set(self):
+            return superclass.get_query_set(self).filter(**(self.core_filters))
+
+        def add(self, *objs):
+            self._add_items(self.source_col_name, self.target_col_name, *objs)
+
+            # If this is a symmetrical m2m relation to self, add the mirror entry in the m2m table
+            if self.symmetrical:
+                self._add_items(self.target_col_name, self.source_col_name, *objs)
+        add.alters_data = True
+
+        def remove(self, *objs):
+            self._remove_items(self.source_col_name, self.target_col_name, *objs)
+
+            # If this is a symmetrical m2m relation to self, remove the mirror entry in the m2m table
+            if self.symmetrical:
+                self._remove_items(self.target_col_name, self.source_col_name, *objs)
+        remove.alters_data = True
+
+        def clear(self):
+            self._clear_items(self.source_col_name)
+
+            # If this is a symmetrical m2m relation to self, clear the mirror entry in the m2m table
+            if self.symmetrical:
+                self._clear_items(self.target_col_name)
+        clear.alters_data = True
+
+        def create(self, **kwargs):
+            new_obj = self.model(**kwargs)
+            new_obj.save()
+            self.add(new_obj)
+            return new_obj
+        create.alters_data = True
+
+        def _add_items(self, source_col_name, target_col_name, *objs):
+            # join_table: name of the m2m link table
+            # source_col_name: the PK colname in join_table for the source object
+            # target_col_name: the PK colname in join_table for the target object
+            # *objs - objects to add
+            from django.db import connection
+
+            # Add the newly created or already existing objects to the join table.
+            # First find out which items are already added, to avoid adding them twice
+            new_ids = set([obj._get_pk_val() for obj in objs])
+            cursor = connection.cursor()
+            cursor.execute("SELECT %s FROM %s WHERE %s = %%s AND %s IN (%s)" % \
+                (target_col_name, self.join_table, source_col_name,
+                target_col_name, ",".join(['%s'] * len(new_ids))),
+                [self._pk_val] + list(new_ids))
+            if cursor.rowcount is not None and cursor.rowcount != 0:
+                existing_ids = set([row[0] for row in cursor.fetchmany(cursor.rowcount)])
+            else:
+                existing_ids = set()
+
+            # Add the ones that aren't there already
+            for obj_id in (new_ids - existing_ids):
+                cursor.execute("INSERT INTO %s (%s, %s) VALUES (%%s, %%s)" % \
+                    (self.join_table, source_col_name, target_col_name),
+                    [self._pk_val, obj_id])
+            transaction.commit_unless_managed()
+
+        def _remove_items(self, source_col_name, target_col_name, *objs):
+            # source_col_name: the PK colname in join_table for the source object
+            # target_col_name: the PK colname in join_table for the target object
+            # *objs - objects to remove
+            from django.db import connection
+
+            for obj in objs:
+                if not isinstance(obj, self.model):
+                    raise ValueError, "objects to remove() must be %s instances" % self.model._meta.object_name
+            # Remove the specified objects from the join table
+            cursor = connection.cursor()
+            for obj in objs:
+                cursor.execute("DELETE FROM %s WHERE %s = %%s AND %s = %%s" % \
+                    (self.join_table, source_col_name, target_col_name),
+                    [self._pk_val, obj._get_pk_val()])
+            transaction.commit_unless_managed()
+
+        def _clear_items(self, source_col_name):
+            # source_col_name: the PK colname in join_table for the source object
+            from django.db import connection
+            cursor = connection.cursor()
+            cursor.execute("DELETE FROM %s WHERE %s = %%s" % \
+                (self.join_table, source_col_name),
+                [self._pk_val])
+            transaction.commit_unless_managed()
+
+    return ManyRelatedManager
+
+class ManyRelatedObjectsDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # multiple "remote" values and have a ManyToManyField pointed at them by
+    # some other model (rather than having a ManyToManyField themselves).
+    # In the example "publication.article_set", the article_set attribute is a
+    # ManyRelatedObjectsDescriptor instance.
+    def __init__(self, related):
+        self.related = related   # RelatedObject instance
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        # Dynamically create a class that subclasses the related
+        # model's default manager.
+        rel_model = self.related.model
+        superclass = rel_model._default_manager.__class__
+        RelatedManager = create_many_related_manager(superclass)
+
+        qn = backend.quote_name
+        manager = RelatedManager(
+            model=rel_model,
+            core_filters={'%s__pk' % self.related.field.name: instance._get_pk_val()},
+            instance=instance,
+            symmetrical=False,
+            join_table=qn(self.related.field.m2m_db_table()),
+            source_col_name=qn(self.related.field.m2m_reverse_name()),
+            target_col_name=qn(self.related.field.m2m_column_name())
+        )
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        manager = self.__get__(instance)
+        manager.clear()
+        for obj in value:
+            manager.add(obj)
+
+class ReverseManyRelatedObjectsDescriptor(object):
+    # This class provides the functionality that makes the related-object
+    # managers available as attributes on a model class, for fields that have
+    # multiple "remote" values and have a ManyToManyField defined in their
+    # model (rather than having another model pointed *at* them).
+    # In the example "article.publications", the publications attribute is a
+    # ReverseManyRelatedObjectsDescriptor instance.
+    def __init__(self, m2m_field):
+        self.field = m2m_field
+
+    def __get__(self, instance, instance_type=None):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        # Dynamically create a class that subclasses the related
+        # model's default manager.
+        rel_model=self.field.rel.to
+        superclass = rel_model._default_manager.__class__
+        RelatedManager = create_many_related_manager(superclass)
+
+        qn = backend.quote_name
+        manager = RelatedManager(
+            model=rel_model,
+            core_filters={'%s__pk' % self.field.related_query_name(): instance._get_pk_val()},
+            instance=instance,
+            symmetrical=(self.field.rel.symmetrical and instance.__class__ == rel_model),
+            join_table=qn(self.field.m2m_db_table()),
+            source_col_name=qn(self.field.m2m_column_name()),
+            target_col_name=qn(self.field.m2m_reverse_name())
+        )
+
+        return manager
+
+    def __set__(self, instance, value):
+        if instance is None:
+            raise AttributeError, "Manager must be accessed via instance"
+
+        manager = self.__get__(instance)
+        manager.clear()
+        for obj in value:
+            manager.add(obj)
+
+class ForeignKey(RelatedField, Field):
+    empty_strings_allowed = False
+    def __init__(self, to, to_field=None, **kwargs):
+        try:
+            to_name = to._meta.object_name.lower()
+        except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT
+            assert isinstance(to, basestring), "ForeignKey(%r) is invalid. First parameter to ForeignKey must be either a model, a model name, or the string %r" % (to, RECURSIVE_RELATIONSHIP_CONSTANT)
+        else:
+            to_field = to_field or to._meta.pk.name
+        kwargs['verbose_name'] = kwargs.get('verbose_name', '')
+
+        if kwargs.has_key('edit_inline_type'):
+            import warnings
+            warnings.warn("edit_inline_type is deprecated. Use edit_inline instead.")
+            kwargs['edit_inline'] = kwargs.pop('edit_inline_type')
+
+        kwargs['rel'] = ManyToOneRel(to, to_field,
+            num_in_admin=kwargs.pop('num_in_admin', 3),
+            min_num_in_admin=kwargs.pop('min_num_in_admin', None),
+            max_num_in_admin=kwargs.pop('max_num_in_admin', None),
+            num_extra_on_change=kwargs.pop('num_extra_on_change', 1),
+            edit_inline=kwargs.pop('edit_inline', False),
+            related_name=kwargs.pop('related_name', None),
+            limit_choices_to=kwargs.pop('limit_choices_to', None),
+            lookup_overrides=kwargs.pop('lookup_overrides', None),
+            raw_id_admin=kwargs.pop('raw_id_admin', False))
+        Field.__init__(self, **kwargs)
+
+        self.db_index = True
+
+    def get_attname(self):
+        return '%s_id' % self.name
+
+    def get_validator_unique_lookup_type(self):
+        return '%s__%s__exact' % (self.name, self.rel.get_related_field().name)
+
+    def prepare_field_objs_and_params(self, manipulator, name_prefix):
+        params = {'validator_list': self.validator_list[:], 'member_name': name_prefix + self.attname}
+        if self.rel.raw_id_admin:
+            field_objs = self.get_manipulator_field_objs()
+            params['validator_list'].append(curry(manipulator_valid_rel_key, self, manipulator))
+        else:
+            if self.radio_admin:
+                field_objs = [forms.RadioSelectField]
+                params['ul_class'] = get_ul_class(self.radio_admin)
+            else:
+                if self.null:
+                    field_objs = [forms.NullSelectField]
+                else:
+                    field_objs = [forms.SelectField]
+            params['choices'] = self.get_choices_default()
+        return field_objs, params
+
+    def get_manipulator_field_objs(self):
+        rel_field = self.rel.get_related_field()
+        if self.rel.raw_id_admin and not isinstance(rel_field, AutoField):
+            return rel_field.get_manipulator_field_objs()
+        else:
+            return [forms.IntegerField]
+
+    def get_db_prep_save(self, value):
+        if value == '' or value == None:
+            return None
+        else:
+            return self.rel.get_related_field().get_db_prep_save(value)
+
+    def flatten_data(self, follow, obj=None):
+        if not obj:
+            # In required many-to-one fields with only one available choice,
+            # select that one available choice. Note: For SelectFields
+            # (radio_admin=False), we have to check that the length of choices
+            # is *2*, not 1, because SelectFields always have an initial
+            # "blank" value. Otherwise (radio_admin=True), we check that the
+            # length is 1.
+            if not self.blank and (not self.rel.raw_id_admin or self.choices):
+                choice_list = self.get_choices_default()
+                if self.radio_admin and len(choice_list) == 1:
+                    return {self.attname: choice_list[0][0]}
+                if not self.radio_admin and len(choice_list) == 2:
+                    return {self.attname: choice_list[1][0]}
+        return Field.flatten_data(self, follow, obj)
+
+    def contribute_to_class(self, cls, name):
+        super(ForeignKey, self).contribute_to_class(cls, name)
+        setattr(cls, self.name, ReverseSingleRelatedObjectDescriptor(self))
+
+    def contribute_to_related_class(self, cls, related):
+        setattr(cls, related.get_accessor_name(), ForeignRelatedObjectsDescriptor(related))
+
+class OneToOneField(RelatedField, IntegerField):
+    def __init__(self, to, to_field=None, **kwargs):
+        try:
+            to_name = to._meta.object_name.lower()
+        except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT
+            assert isinstance(to, basestring), "OneToOneField(%r) is invalid. First parameter to OneToOneField must be either a model, a model name, or the string %r" % (to, RECURSIVE_RELATIONSHIP_CONSTANT)
+        else:
+            to_field = to_field or to._meta.pk.name
+        kwargs['verbose_name'] = kwargs.get('verbose_name', '')
+
+        if kwargs.has_key('edit_inline_type'):
+            import warnings
+            warnings.warn("edit_inline_type is deprecated. Use edit_inline instead.")
+            kwargs['edit_inline'] = kwargs.pop('edit_inline_type')
+
+        kwargs['rel'] = OneToOneRel(to, to_field,
+            num_in_admin=kwargs.pop('num_in_admin', 0),
+            edit_inline=kwargs.pop('edit_inline', False),
+            related_name=kwargs.pop('related_name', None),
+            limit_choices_to=kwargs.pop('limit_choices_to', None),
+            lookup_overrides=kwargs.pop('lookup_overrides', None),
+            raw_id_admin=kwargs.pop('raw_id_admin', False))
+        kwargs['primary_key'] = True
+        IntegerField.__init__(self, **kwargs)
+
+        self.db_index = True
+
+    def get_attname(self):
+        return '%s_id' % self.name
+
+    def get_validator_unique_lookup_type(self):
+        return '%s__%s__exact' % (self.name, self.rel.get_related_field().name)
+
+    # TODO: Copied from ForeignKey... putting this in RelatedField adversely affects
+    # ManyToManyField. This works for now.
+    def prepare_field_objs_and_params(self, manipulator, name_prefix):
+        params = {'validator_list': self.validator_list[:], 'member_name': name_prefix + self.attname}
+        if self.rel.raw_id_admin:
+            field_objs = self.get_manipulator_field_objs()
+            params['validator_list'].append(curry(manipulator_valid_rel_key, self, manipulator))
+        else:
+            if self.radio_admin:
+                field_objs = [forms.RadioSelectField]
+                params['ul_class'] = get_ul_class(self.radio_admin)
+            else:
+                if self.null:
+                    field_objs = [forms.NullSelectField]
+                else:
+                    field_objs = [forms.SelectField]
+            params['choices'] = self.get_choices_default()
+        return field_objs, params
+
+    def contribute_to_class(self, cls, name):
+        super(OneToOneField, self).contribute_to_class(cls, name)
+        setattr(cls, self.name, ReverseSingleRelatedObjectDescriptor(self))
+
+    def contribute_to_related_class(self, cls, related):
+        setattr(cls, related.get_accessor_name(), SingleRelatedObjectDescriptor(related))
+        if not cls._meta.one_to_one_field:
+            cls._meta.one_to_one_field = self
+
+class ManyToManyField(RelatedField, Field):
+    def __init__(self, to, **kwargs):
+        kwargs['verbose_name'] = kwargs.get('verbose_name', None)
+        kwargs['rel'] = ManyToManyRel(to,
+            num_in_admin=kwargs.pop('num_in_admin', 0),
+            related_name=kwargs.pop('related_name', None),
+            filter_interface=kwargs.pop('filter_interface', None),
+            limit_choices_to=kwargs.pop('limit_choices_to', None),
+            raw_id_admin=kwargs.pop('raw_id_admin', False),
+            symmetrical=kwargs.pop('symmetrical', True))
+        if kwargs["rel"].raw_id_admin:
+            kwargs.setdefault("validator_list", []).append(self.isValidIDList)
+        Field.__init__(self, **kwargs)
+
+        if self.rel.raw_id_admin:
+            msg = gettext_lazy('Separate multiple IDs with commas.')
+        else:
+            msg = gettext_lazy('Hold down "Control", or "Command" on a Mac, to select more than one.')
+        self.help_text = string_concat(self.help_text, msg)
+
+    def get_manipulator_field_objs(self):
+        if self.rel.raw_id_admin:
+            return [forms.RawIdAdminField]
+        else:
+            choices = self.get_choices_default()
+            return [curry(forms.SelectMultipleField, size=min(max(len(choices), 5), 15), choices=choices)]
+
+    def get_choices_default(self):
+        return Field.get_choices(self, include_blank=False)
+
+    def _get_m2m_db_table(self, opts):
+        "Function that can be curried to provide the m2m table name for this relation"
+        return '%s_%s' % (opts.db_table, self.name)
+
+    def _get_m2m_column_name(self, related):
+        "Function that can be curried to provide the source column name for the m2m table"
+        # If this is an m2m relation to self, avoid the inevitable name clash
+        if related.model == related.parent_model:
+            return 'from_' + related.model._meta.object_name.lower() + '_id'
+        else:
+            return related.model._meta.object_name.lower() + '_id'
+
+    def _get_m2m_reverse_name(self, related):
+        "Function that can be curried to provide the related column name for the m2m table"
+        # If this is an m2m relation to self, avoid the inevitable name clash
+        if related.model == related.parent_model:
+            return 'to_' + related.parent_model._meta.object_name.lower() + '_id'
+        else:
+            return related.parent_model._meta.object_name.lower() + '_id'
+
+    def isValidIDList(self, field_data, all_data):
+        "Validates that the value is a valid list of foreign keys"
+        mod = self.rel.to
+        try:
+            pks = map(int, field_data.split(','))
+        except ValueError:
+            # the CommaSeparatedIntegerField validator will catch this error
+            return
+        objects = mod._default_manager.in_bulk(pks)
+        if len(objects) != len(pks):
+            badkeys = [k for k in pks if k not in objects]
+            raise validators.ValidationError, ngettext("Please enter valid %(self)s IDs. The value %(value)r is invalid.",
+                    "Please enter valid %(self)s IDs. The values %(value)r are invalid.", len(badkeys)) % {
+                'self': self.verbose_name,
+                'value': len(badkeys) == 1 and badkeys[0] or tuple(badkeys),
+            }
+
+    def flatten_data(self, follow, obj = None):
+        new_data = {}
+        if obj:
+            instance_ids = [instance._get_pk_val() for instance in getattr(obj, self.name).all()]
+            if self.rel.raw_id_admin:
+                new_data[self.name] = ",".join([str(id) for id in instance_ids])
+            else:
+                new_data[self.name] = instance_ids
+        else:
+            # In required many-to-many fields with only one available choice,
+            # select that one available choice.
+            if not self.blank and not self.rel.edit_inline and not self.rel.raw_id_admin:
+                choices_list = self.get_choices_default()
+                if len(choices_list) == 1:
+                    new_data[self.name] = [choices_list[0][0]]
+        return new_data
+
+    def contribute_to_class(self, cls, name):
+        super(ManyToManyField, self).contribute_to_class(cls, name)
+        # Add the descriptor for the m2m relation
+        setattr(cls, self.name, ReverseManyRelatedObjectsDescriptor(self))
+
+        # Set up the accessor for the m2m table name for the relation
+        self.m2m_db_table = curry(self._get_m2m_db_table, cls._meta)
+
+    def contribute_to_related_class(self, cls, related):
+        # m2m relations to self do not have a ManyRelatedObjectsDescriptor,
+        # as it would be redundant - unless the field is non-symmetrical.
+        if related.model != related.parent_model or not self.rel.symmetrical:
+            # Add the descriptor for the m2m relation
+            setattr(cls, related.get_accessor_name(), ManyRelatedObjectsDescriptor(related))
+
+        # Set up the accessors for the column names on the m2m table
+        self.m2m_column_name = curry(self._get_m2m_column_name, related)
+        self.m2m_reverse_name = curry(self._get_m2m_reverse_name, related)
+
+    def set_attributes_from_rel(self):
+        pass
+
+class ManyToOneRel(object):
+    def __init__(self, to, field_name, num_in_admin=3, min_num_in_admin=None,
+        max_num_in_admin=None, num_extra_on_change=1, edit_inline=False,
+        related_name=None, limit_choices_to=None, lookup_overrides=None, raw_id_admin=False):
+        try:
+            to._meta
+        except AttributeError: # to._meta doesn't exist, so it must be RECURSIVE_RELATIONSHIP_CONSTANT
+            assert isinstance(to, basestring), "'to' must be either a model, a model name or the string %r" % RECURSIVE_RELATIONSHIP_CONSTANT
+        self.to, self.field_name = to, field_name
+        self.num_in_admin, self.edit_inline = num_in_admin, edit_inline
+        self.min_num_in_admin, self.max_num_in_admin = min_num_in_admin, max_num_in_admin
+        self.num_extra_on_change, self.related_name = num_extra_on_change, related_name
+        if limit_choices_to is None:
+            limit_choices_to = {}
+        self.limit_choices_to = limit_choices_to
+        self.lookup_overrides = lookup_overrides or {}
+        self.raw_id_admin = raw_id_admin
+        self.multiple = True
+
+    def get_related_field(self):
+        "Returns the Field in the 'to' object to which this relationship is tied."
+        return self.to._meta.get_field(self.field_name)
+
+class OneToOneRel(ManyToOneRel):
+    def __init__(self, to, field_name, num_in_admin=0, edit_inline=False,
+        related_name=None, limit_choices_to=None, lookup_overrides=None,
+        raw_id_admin=False):
+        self.to, self.field_name = to, field_name
+        self.num_in_admin, self.edit_inline = num_in_admin, edit_inline
+        self.related_name = related_name
+        if limit_choices_to is None:
+            limit_choices_to = {}
+        self.limit_choices_to = limit_choices_to
+        self.lookup_overrides = lookup_overrides or {}
+        self.raw_id_admin = raw_id_admin
+        self.multiple = False
+
+class ManyToManyRel(object):
+    def __init__(self, to, num_in_admin=0, related_name=None,
+        filter_interface=None, limit_choices_to=None, raw_id_admin=False, symmetrical=True):
+        self.to = to
+        self.num_in_admin = num_in_admin
+        self.related_name = related_name
+        self.filter_interface = filter_interface
+        if limit_choices_to is None:
+            limit_choices_to = {}
+        self.limit_choices_to = limit_choices_to
+        self.edit_inline = False
+        self.raw_id_admin = raw_id_admin
+        self.symmetrical = symmetrical
+        self.multiple = True
+
+        assert not (self.raw_id_admin and self.filter_interface), "ManyToManyRels may not use both raw_id_admin and filter_interface"

Added: vendor/django/current/django/db/models/loading.py
===================================================================
--- vendor/django/current/django/db/models/loading.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/loading.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,112 @@
+"Utilities for loading models and the modules that contain them."
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+import sys
+import os
+
+__all__ = ('get_apps', 'get_app', 'get_models', 'get_model', 'register_models')
+
+_app_list = []   # Cache of installed apps.
+                 # Entry is not placed in app_list cache until entire app is loaded.
+_app_models = {} # Dictionary of models against app label
+                 # Each value is a dictionary of model name: model class
+                 # Applabel and Model entry exists in cache when individual model is loaded.
+_app_errors = {} # Dictionary of errors that were experienced when loading the INSTALLED_APPS
+                 # Key is the app_name of the model, value is the exception that was raised
+                 # during model loading.
+_loaded = False  # Has the contents of settings.INSTALLED_APPS been loaded?
+                 # i.e., has get_apps() been called?
+
+def get_apps():
+    "Returns a list of all installed modules that contain models."
+    global _app_list
+    global _loaded
+    if not _loaded:
+        _loaded = True
+        for app_name in settings.INSTALLED_APPS:
+            try:
+                load_app(app_name)
+            except Exception, e:
+                # Problem importing the app
+                _app_errors[app_name] = e
+    return _app_list
+
+def get_app(app_label, emptyOK = False):
+    "Returns the module containing the models for the given app_label. If the app has no models in it and 'emptyOK' is True, returns None."
+    get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish.
+    for app_name in settings.INSTALLED_APPS:
+        if app_label == app_name.split('.')[-1]:
+            mod = load_app(app_name)
+            if mod is None:
+                if emptyOK:
+                    return None
+            else:
+                return mod
+    raise ImproperlyConfigured, "App with label %s could not be found" % app_label
+
+def load_app(app_name):
+    "Loads the app with the provided fully qualified name, and returns the model module."
+    global _app_list
+    mod = __import__(app_name, '', '', ['models'])
+    if not hasattr(mod, 'models'):
+        return None
+    if mod.models not in _app_list:
+        _app_list.append(mod.models)
+    return mod.models
+
+def get_app_errors():
+    "Returns the map of known problems with the INSTALLED_APPS"
+    global _app_errors
+    get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish.
+    return _app_errors
+
+def get_models(app_mod=None):
+    """
+    Given a module containing models, returns a list of the models. Otherwise
+    returns a list of all installed models.
+    """
+    app_list = get_apps() # Run get_apps() to populate the _app_list cache. Slightly hackish.
+    if app_mod:
+        return _app_models.get(app_mod.__name__.split('.')[-2], {}).values()
+    else:
+        model_list = []
+        for app_mod in app_list:
+            model_list.extend(get_models(app_mod))
+        return model_list
+
+def get_model(app_label, model_name):
+    """
+    Returns the model matching the given app_label and case-insensitive model_name.
+    Returns None if no model is found.
+    """
+    try:
+        model_dict = _app_models[app_label]
+    except KeyError:
+        return None
+
+    try:
+        return model_dict[model_name.lower()]
+    except KeyError:
+        return None
+
+def register_models(app_label, *models):
+    """
+    Register a set of models as belonging to an app.
+    """
+    for model in models:
+        # Store as 'name: model' pair in a dictionary
+        # in the _app_models dictionary
+        model_name = model._meta.object_name.lower()
+        model_dict = _app_models.setdefault(app_label, {})
+        if model_dict.has_key(model_name):
+            # The same model may be imported via different paths (e.g.
+            # appname.models and project.appname.models). We use the source
+            # filename as a means to detect identity.
+            fname1 = os.path.abspath(sys.modules[model.__module__].__file__)
+            fname2 = os.path.abspath(sys.modules[model_dict[model_name].__module__].__file__)
+            # Since the filename extension could be .py the first time and .pyc
+            # or .pyo the second time, ignore the extension when comparing.
+            if os.path.splitext(fname1)[0] == os.path.splitext(fname2)[0]:
+                continue
+        model_dict[model_name] = model

Added: vendor/django/current/django/db/models/manager.py
===================================================================
--- vendor/django/current/django/db/models/manager.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/manager.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,111 @@
+from django.db.models.query import QuerySet
+from django.dispatch import dispatcher
+from django.db.models import signals
+from django.db.models.fields import FieldDoesNotExist
+
+# Size of each "chunk" for get_iterator calls.
+# Larger values are slightly faster at the expense of more storage space.
+GET_ITERATOR_CHUNK_SIZE = 100
+
+def ensure_default_manager(sender):
+    cls = sender
+    if not hasattr(cls, '_default_manager'):
+        # Create the default manager, if needed.
+        try:
+            cls._meta.get_field('objects')
+            raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__
+        except FieldDoesNotExist:
+            pass
+        cls.add_to_class('objects', Manager())
+
+dispatcher.connect(ensure_default_manager, signal=signals.class_prepared)
+
+class Manager(object):
+    # Tracks each time a Manager instance is created. Used to retain order.
+    creation_counter = 0
+
+    def __init__(self):
+        super(Manager, self).__init__()
+        # Increase the creation counter, and save our local copy.
+        self.creation_counter = Manager.creation_counter
+        Manager.creation_counter += 1
+        self.model = None
+
+    def contribute_to_class(self, model, name):
+        # TODO: Use weakref because of possible memory leak / circular reference.
+        self.model = model
+        setattr(model, name, ManagerDescriptor(self))
+        if not hasattr(model, '_default_manager') or self.creation_counter < model._default_manager.creation_counter:
+            model._default_manager = self
+
+    #######################
+    # PROXIES TO QUERYSET #
+    #######################
+
+    def get_query_set(self):
+        """Returns a new QuerySet object.  Subclasses can override this method
+        to easily customise the behaviour of the Manager.
+        """
+        return QuerySet(self.model)
+
+    def all(self):
+        return self.get_query_set()
+
+    def count(self):
+        return self.get_query_set().count()
+
+    def dates(self, *args, **kwargs):
+        return self.get_query_set().dates(*args, **kwargs)
+
+    def distinct(self, *args, **kwargs):
+        return self.get_query_set().distinct(*args, **kwargs)
+
+    def extra(self, *args, **kwargs):
+        return self.get_query_set().extra(*args, **kwargs)
+
+    def get(self, *args, **kwargs):
+        return self.get_query_set().get(*args, **kwargs)
+
+    def get_or_create(self, **kwargs):
+        return self.get_query_set().get_or_create(**kwargs)
+        
+    def create(self, **kwargs):
+        return self.get_query_set().create(**kwargs)
+
+    def filter(self, *args, **kwargs):
+        return self.get_query_set().filter(*args, **kwargs)
+
+    def complex_filter(self, *args, **kwargs):
+        return self.get_query_set().complex_filter(*args, **kwargs)
+
+    def exclude(self, *args, **kwargs):
+        return self.get_query_set().exclude(*args, **kwargs)
+
+    def in_bulk(self, *args, **kwargs):
+        return self.get_query_set().in_bulk(*args, **kwargs)
+
+    def iterator(self, *args, **kwargs):
+        return self.get_query_set().iterator(*args, **kwargs)
+
+    def latest(self, *args, **kwargs):
+        return self.get_query_set().latest(*args, **kwargs)
+
+    def order_by(self, *args, **kwargs):
+        return self.get_query_set().order_by(*args, **kwargs)
+
+    def select_related(self, *args, **kwargs):
+        return self.get_query_set().select_related(*args, **kwargs)
+
+    def values(self, *args, **kwargs):
+        return self.get_query_set().values(*args, **kwargs)
+
+class ManagerDescriptor(object):
+    # This class ensures managers aren't accessible via model instances.
+    # For example, Poll.objects works, but poll_obj.objects raises AttributeError.
+    def __init__(self, manager):
+        self.manager = manager
+
+    def __get__(self, instance, type=None):
+        if instance != None:
+            raise AttributeError, "Manager isn't accessible via %s instances" % type.__name__
+        return self.manager

Added: vendor/django/current/django/db/models/manipulators.py
===================================================================
--- vendor/django/current/django/db/models/manipulators.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/manipulators.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,330 @@
+from django.core.exceptions import ObjectDoesNotExist
+from django import forms
+from django.core import validators
+from django.db.models.fields import FileField, AutoField
+from django.dispatch import dispatcher
+from django.db.models import signals
+from django.utils.functional import curry
+from django.utils.datastructures import DotExpandedDict
+from django.utils.text import capfirst
+import types
+
+def add_manipulators(sender):
+    cls = sender
+    cls.add_to_class('AddManipulator', AutomaticAddManipulator)
+    cls.add_to_class('ChangeManipulator', AutomaticChangeManipulator)
+
+dispatcher.connect(add_manipulators, signal=signals.class_prepared)
+
+class ManipulatorDescriptor(object):
+    # This class provides the functionality that makes the default model
+    # manipulators (AddManipulator and ChangeManipulator) available via the
+    # model class.
+    def __init__(self, name, base):
+        self.man = None # Cache of the manipulator class.
+        self.name = name
+        self.base = base
+
+    def __get__(self, instance, model=None):
+        if instance != None:
+            raise AttributeError, "Manipulator cannot be accessed via instance"
+        else:
+            if not self.man:
+                # Create a class that inherits from the "Manipulator" class
+                # given in the model class (if specified) and the automatic
+                # manipulator.
+                bases = [self.base]
+                if hasattr(model, 'Manipulator'):
+                    bases = [model.Manipulator] + bases
+                self.man = types.ClassType(self.name, tuple(bases), {})
+                self.man._prepare(model)
+            return self.man
+
+class AutomaticManipulator(forms.Manipulator):
+    def _prepare(cls, model):
+        cls.model = model
+        cls.manager = model._default_manager
+        cls.opts = model._meta
+        for field_name_list in cls.opts.unique_together:
+            setattr(cls, 'isUnique%s' % '_'.join(field_name_list), curry(manipulator_validator_unique_together, field_name_list, cls.opts))
+        for f in cls.opts.fields:
+            if f.unique_for_date:
+                setattr(cls, 'isUnique%sFor%s' % (f.name, f.unique_for_date), curry(manipulator_validator_unique_for_date, f, cls.opts.get_field(f.unique_for_date), cls.opts, 'date'))
+            if f.unique_for_month:
+                setattr(cls, 'isUnique%sFor%s' % (f.name, f.unique_for_month), curry(manipulator_validator_unique_for_date, f, cls.opts.get_field(f.unique_for_month), cls.opts, 'month'))
+            if f.unique_for_year:
+                setattr(cls, 'isUnique%sFor%s' % (f.name, f.unique_for_year), curry(manipulator_validator_unique_for_date, f, cls.opts.get_field(f.unique_for_year), cls.opts, 'year'))
+    _prepare = classmethod(_prepare)
+
+    def contribute_to_class(cls, other_cls, name):
+        setattr(other_cls, name, ManipulatorDescriptor(name, cls))
+    contribute_to_class = classmethod(contribute_to_class)
+
+    def __init__(self, follow=None):
+        self.follow = self.opts.get_follow(follow)
+        self.fields = []
+
+        for f in self.opts.fields + self.opts.many_to_many:
+            if self.follow.get(f.name, False):
+                self.fields.extend(f.get_manipulator_fields(self.opts, self, self.change))
+
+        # Add fields for related objects.
+        for f in self.opts.get_all_related_objects():
+            if self.follow.get(f.name, False):
+                fol = self.follow[f.name]
+                self.fields.extend(f.get_manipulator_fields(self.opts, self, self.change, fol))
+
+        # Add field for ordering.
+        if self.change and self.opts.get_ordered_objects():
+            self.fields.append(forms.CommaSeparatedIntegerField(field_name="order_"))
+
+    def save(self, new_data):
+        # TODO: big cleanup when core fields go -> use recursive manipulators.
+        params = {}
+        for f in self.opts.fields:
+            # Fields with auto_now_add should keep their original value in the change stage.
+            auto_now_add = self.change and getattr(f, 'auto_now_add', False)
+            if self.follow.get(f.name, None) and not auto_now_add:
+                param = f.get_manipulator_new_data(new_data)
+            else:
+                if self.change:
+                    param = getattr(self.original_object, f.attname)
+                else:
+                    param = f.get_default()
+            params[f.attname] = param
+
+        if self.change:
+            params[self.opts.pk.attname] = self.obj_key
+
+        # First, save the basic object itself.
+        new_object = self.model(**params)
+        new_object.save()
+
+        # Now that the object's been saved, save any uploaded files.
+        for f in self.opts.fields:
+            if isinstance(f, FileField):
+                f.save_file(new_data, new_object, self.change and self.original_object or None, self.change, rel=False)
+
+        # Calculate which primary fields have changed.
+        if self.change:
+            self.fields_added, self.fields_changed, self.fields_deleted = [], [], []
+            for f in self.opts.fields:
+                if not f.primary_key and str(getattr(self.original_object, f.attname)) != str(getattr(new_object, f.attname)):
+                    self.fields_changed.append(f.verbose_name)
+
+        # Save many-to-many objects. Example: Set sites for a poll.
+        for f in self.opts.many_to_many:
+            if self.follow.get(f.name, None):
+                if not f.rel.edit_inline:
+                    if f.rel.raw_id_admin:
+                        new_vals = new_data.get(f.name, ())
+                    else:
+                        new_vals = new_data.getlist(f.name)
+                    # First, clear the existing values.
+                    rel_manager = getattr(new_object, f.name)
+                    rel_manager.clear()
+                    # Then, set the new values.
+                    for n in new_vals:
+                        rel_manager.add(f.rel.to._default_manager.get(pk=n))
+                    # TODO: Add to 'fields_changed'
+
+        expanded_data = DotExpandedDict(dict(new_data))
+        # Save many-to-one objects. Example: Add the Choice objects for a Poll.
+        for related in self.opts.get_all_related_objects():
+            # Create obj_list, which is a DotExpandedDict such as this:
+            # [('0', {'id': ['940'], 'choice': ['This is the first choice']}),
+            #  ('1', {'id': ['941'], 'choice': ['This is the second choice']}),
+            #  ('2', {'id': [''], 'choice': ['']})]
+            child_follow = self.follow.get(related.name, None)
+
+            if child_follow:
+                obj_list = expanded_data[related.var_name].items()
+                if not obj_list:
+                    continue
+
+                obj_list.sort(lambda x, y: cmp(int(x[0]), int(y[0])))
+
+                # For each related item...
+                for _, rel_new_data in obj_list:
+
+                    params = {}
+
+                    # Keep track of which core=True fields were provided.
+                    # If all core fields were given, the related object will be saved.
+                    # If none of the core fields were given, the object will be deleted.
+                    # If some, but not all, of the fields were given, the validator would
+                    # have caught that.
+                    all_cores_given, all_cores_blank = True, True
+
+                    # Get a reference to the old object. We'll use it to compare the
+                    # old to the new, to see which fields have changed.
+                    old_rel_obj = None
+                    if self.change:
+                        if rel_new_data[related.opts.pk.name][0]:
+                            try:
+                                old_rel_obj = getattr(self.original_object, related.get_accessor_name()).get(**{'%s__exact' % related.opts.pk.name: rel_new_data[related.opts.pk.attname][0]})
+                            except ObjectDoesNotExist:
+                                pass
+
+                    for f in related.opts.fields:
+                        if f.core and not isinstance(f, FileField) and f.get_manipulator_new_data(rel_new_data, rel=True) in (None, ''):
+                            all_cores_given = False
+                        elif f.core and not isinstance(f, FileField) and f.get_manipulator_new_data(rel_new_data, rel=True) not in (None, ''):
+                            all_cores_blank = False
+                        # If this field isn't editable, give it the same value it had
+                        # previously, according to the given ID. If the ID wasn't
+                        # given, use a default value. FileFields are also a special
+                        # case, because they'll be dealt with later.
+
+                        if f == related.field:
+                            param = getattr(new_object, related.field.rel.field_name)
+                        elif (not self.change) and isinstance(f, AutoField):
+                            param = None
+                        elif self.change and (isinstance(f, FileField) or not child_follow.get(f.name, None)):
+                            if old_rel_obj:
+                                param = getattr(old_rel_obj, f.column)
+                            else:
+                                param = f.get_default()
+                        else:
+                            param = f.get_manipulator_new_data(rel_new_data, rel=True)
+                        if param != None:
+                            params[f.attname] = param
+
+                    # Create the related item.
+                    new_rel_obj = related.model(**params)
+
+                    # If all the core fields were provided (non-empty), save the item.
+                    if all_cores_given:
+                        new_rel_obj.save()
+
+                        # Save any uploaded files.
+                        for f in related.opts.fields:
+                            if child_follow.get(f.name, None):
+                                if isinstance(f, FileField) and rel_new_data.get(f.name, False):
+                                    f.save_file(rel_new_data, new_rel_obj, self.change and old_rel_obj or None, old_rel_obj is not None, rel=True)
+
+                        # Calculate whether any fields have changed.
+                        if self.change:
+                            if not old_rel_obj: # This object didn't exist before.
+                                self.fields_added.append('%s "%s"' % (related.opts.verbose_name, new_rel_obj))
+                            else:
+                                for f in related.opts.fields:
+                                    if not f.primary_key and f != related.field and str(getattr(old_rel_obj, f.attname)) != str(getattr(new_rel_obj, f.attname)):
+                                        self.fields_changed.append('%s for %s "%s"' % (f.verbose_name, related.opts.verbose_name, new_rel_obj))
+
+                        # Save many-to-many objects.
+                        for f in related.opts.many_to_many:
+                            if child_follow.get(f.name, None) and not f.rel.edit_inline:
+                                was_changed = getattr(new_rel_obj, 'set_%s' % f.name)(rel_new_data[f.attname])
+                                if self.change and was_changed:
+                                    self.fields_changed.append('%s for %s "%s"' % (f.verbose_name, related.opts.verbose_name, new_rel_obj))
+
+                    # If, in the change stage, all of the core fields were blank and
+                    # the primary key (ID) was provided, delete the item.
+                    if self.change and all_cores_blank and old_rel_obj:
+                        new_rel_obj.delete()
+                        self.fields_deleted.append('%s "%s"' % (related.opts.verbose_name, old_rel_obj))
+
+        # Save the order, if applicable.
+        if self.change and self.opts.get_ordered_objects():
+            order = new_data['order_'] and map(int, new_data['order_'].split(',')) or []
+            for rel_opts in self.opts.get_ordered_objects():
+                getattr(new_object, 'set_%s_order' % rel_opts.object_name.lower())(order)
+        return new_object
+
+    def get_related_objects(self):
+        return self.opts.get_followed_related_objects(self.follow)
+
+    def flatten_data(self):
+        new_data = {}
+        obj = self.change and self.original_object or None
+        for f in self.opts.get_data_holders(self.follow):
+            fol = self.follow.get(f.name)
+            new_data.update(f.flatten_data(fol, obj))
+        return new_data
+
+class AutomaticAddManipulator(AutomaticManipulator):
+    change = False
+
+class AutomaticChangeManipulator(AutomaticManipulator):
+    change = True
+    def __init__(self, obj_key, follow=None):
+        self.obj_key = obj_key
+        try:
+            self.original_object = self.manager.get(pk=obj_key)
+        except ObjectDoesNotExist:
+            # If the object doesn't exist, this might be a manipulator for a
+            # one-to-one related object that hasn't created its subobject yet.
+            # For example, this might be a Restaurant for a Place that doesn't
+            # yet have restaurant information.
+            if self.opts.one_to_one_field:
+                # Sanity check -- Make sure the "parent" object exists.
+                # For example, make sure the Place exists for the Restaurant.
+                # Let the ObjectDoesNotExist exception propagate up.
+                limit_choices_to = self.opts.one_to_one_field.rel.limit_choices_to
+                lookup_kwargs = {'%s__exact' % self.opts.one_to_one_field.rel.field_name: obj_key}
+                self.opts.one_to_one_field.rel.to.get_model_module().complex_filter(limit_choices_to).get(**lookup_kwargs)
+                params = dict([(f.attname, f.get_default()) for f in self.opts.fields])
+                params[self.opts.pk.attname] = obj_key
+                self.original_object = self.opts.get_model_module().Klass(**params)
+            else:
+                raise
+        super(AutomaticChangeManipulator, self).__init__(follow=follow)
+
+def manipulator_validator_unique_together(field_name_list, opts, self, field_data, all_data):
+    from django.db.models.fields.related import ManyToOneRel
+    from django.utils.text import get_text_list
+    field_list = [opts.get_field(field_name) for field_name in field_name_list]
+    if isinstance(field_list[0].rel, ManyToOneRel):
+        kwargs = {'%s__%s__iexact' % (field_name_list[0], field_list[0].rel.field_name): field_data}
+    else:
+        kwargs = {'%s__iexact' % field_name_list[0]: field_data}
+    for f in field_list[1:]:
+        # This is really not going to work for fields that have different
+        # form fields, e.g. DateTime.
+        # This validation needs to occur after html2python to be effective.
+        field_val = all_data.get(f.attname, None)
+        if field_val is None:
+            # This will be caught by another validator, assuming the field
+            # doesn't have blank=True.
+            return
+        if isinstance(f.rel, ManyToOneRel):
+            kwargs['%s__pk' % f.name] = field_val
+        else:
+            kwargs['%s__iexact' % f.name] = field_val
+    try:
+        old_obj = self.manager.get(**kwargs)
+    except ObjectDoesNotExist:
+        return
+    if hasattr(self, 'original_object') and self.original_object._get_pk_val() == old_obj._get_pk_val():
+        pass
+    else:
+        raise validators.ValidationError, _("%(object)s with this %(type)s already exists for the given %(field)s.") % \
+            {'object': capfirst(opts.verbose_name), 'type': field_list[0].verbose_name, 'field': get_text_list(field_name_list[1:], 'and')}
+
+def manipulator_validator_unique_for_date(from_field, date_field, opts, lookup_type, self, field_data, all_data):
+    from django.db.models.fields.related import ManyToOneRel
+    date_str = all_data.get(date_field.get_manipulator_field_names('')[0], None)
+    date_val = forms.DateField.html2python(date_str)
+    if date_val is None:
+        return # Date was invalid. This will be caught by another validator.
+    lookup_kwargs = {'%s__year' % date_field.name: date_val.year}
+    if isinstance(from_field.rel, ManyToOneRel):
+        lookup_kwargs['%s__pk' % from_field.name] = field_data
+    else:
+        lookup_kwargs['%s__iexact' % from_field.name] = field_data
+    if lookup_type in ('month', 'date'):
+        lookup_kwargs['%s__month' % date_field.name] = date_val.month
+    if lookup_type == 'date':
+        lookup_kwargs['%s__day' % date_field.name] = date_val.day
+    try:
+        old_obj = self.manager.get(**lookup_kwargs)
+    except ObjectDoesNotExist:
+        return
+    else:
+        if hasattr(self, 'original_object') and self.original_object._get_pk_val() == old_obj._get_pk_val():
+            pass
+        else:
+            format_string = (lookup_type == 'date') and '%B %d, %Y' or '%B %Y'
+            raise validators.ValidationError, "Please enter a different %s. The one you entered is already being used for %s." % \
+                (from_field.verbose_name, date_val.strftime(format_string))

Added: vendor/django/current/django/db/models/options.py
===================================================================
--- vendor/django/current/django/db/models/options.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/options.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,273 @@
+from django.conf import settings
+from django.db.models.related import RelatedObject
+from django.db.models.fields.related import ManyToManyRel
+from django.db.models.fields import AutoField, FieldDoesNotExist
+from django.db.models.loading import get_models
+from django.db.models.query import orderlist2sql
+from django.db.models import Manager
+from bisect import bisect
+import re
+
+# Calculate the verbose_name by converting from InitialCaps to "lowercase with spaces".
+get_verbose_name = lambda class_name: re.sub('(((?<=[a-z])[A-Z])|([A-Z](?![A-Z]|$)))', ' \\1', class_name).lower().strip()
+
+DEFAULT_NAMES = ('verbose_name', 'db_table', 'ordering',
+                 'unique_together', 'permissions', 'get_latest_by',
+                 'order_with_respect_to', 'app_label')
+
+class Options(object):
+    def __init__(self, meta):
+        self.fields, self.many_to_many = [], []
+        self.module_name, self.verbose_name = None, None
+        self.verbose_name_plural = None
+        self.db_table = ''
+        self.ordering = []
+        self.unique_together =  []
+        self.permissions =  []
+        self.object_name, self.app_label = None, None
+        self.get_latest_by = None
+        self.order_with_respect_to = None
+        self.admin = None
+        self.meta = meta
+        self.pk = None
+        self.has_auto_field = False
+        self.one_to_one_field = None
+        self.parents = []
+
+    def contribute_to_class(self, cls, name):
+        cls._meta = self
+        self.installed = re.sub('\.models$', '', cls.__module__) in settings.INSTALLED_APPS
+        # First, construct the default values for these options.
+        self.object_name = cls.__name__
+        self.module_name = self.object_name.lower()
+        self.verbose_name = get_verbose_name(self.object_name)
+        # Next, apply any overridden values from 'class Meta'.
+        if self.meta:
+            meta_attrs = self.meta.__dict__
+            del meta_attrs['__module__']
+            del meta_attrs['__doc__']
+            for attr_name in DEFAULT_NAMES:
+                setattr(self, attr_name, meta_attrs.pop(attr_name, getattr(self, attr_name)))
+            # verbose_name_plural is a special case because it uses a 's'
+            # by default.
+            setattr(self, 'verbose_name_plural', meta_attrs.pop('verbose_name_plural', self.verbose_name + 's'))
+            # Any leftover attributes must be invalid.
+            if meta_attrs != {}:
+                raise TypeError, "'class Meta' got invalid attribute(s): %s" % ','.join(meta_attrs.keys())
+        else:
+            self.verbose_name_plural = self.verbose_name + 's'
+        del self.meta
+
+    def _prepare(self, model):
+        if self.order_with_respect_to:
+            self.order_with_respect_to = self.get_field(self.order_with_respect_to)
+            self.ordering = ('_order',)
+        else:
+            self.order_with_respect_to = None
+
+        if self.pk is None:
+            auto = AutoField(verbose_name='ID', primary_key=True)
+            auto.creation_counter = -1
+            model.add_to_class('id', auto)
+
+        # If the db_table wasn't provided, use the app_label + module_name.
+        if not self.db_table:
+            self.db_table = "%s_%s" % (self.app_label, self.module_name)
+
+    def add_field(self, field):
+        # Insert the given field in the order in which it was created, using
+        # the "creation_counter" attribute of the field.
+        # Move many-to-many related fields from self.fields into self.many_to_many.
+        if field.rel and isinstance(field.rel, ManyToManyRel):
+            self.many_to_many.insert(bisect(self.many_to_many, field), field)
+        else:
+            self.fields.insert(bisect(self.fields, field), field)
+            if not self.pk and field.primary_key:
+                self.pk = field
+
+    def __repr__(self):
+        return '<Options for %s>' % self.object_name
+        
+    def __str__(self):
+        return "%s.%s" % (self.app_label, self.module_name)
+        
+    def get_field(self, name, many_to_many=True):
+        "Returns the requested field by name. Raises FieldDoesNotExist on error."
+        to_search = many_to_many and (self.fields + self.many_to_many) or self.fields
+        for f in to_search:
+            if f.name == name:
+                return f
+        raise FieldDoesNotExist, '%s has no field named %r' % (self.object_name, name)
+
+    def get_order_sql(self, table_prefix=''):
+        "Returns the full 'ORDER BY' clause for this object, according to self.ordering."
+        if not self.ordering: return ''
+        pre = table_prefix and (table_prefix + '.') or ''
+        return 'ORDER BY ' + orderlist2sql(self.ordering, self, pre)
+
+    def get_add_permission(self):
+        return 'add_%s' % self.object_name.lower()
+
+    def get_change_permission(self):
+        return 'change_%s' % self.object_name.lower()
+
+    def get_delete_permission(self):
+        return 'delete_%s' % self.object_name.lower()
+
+    def get_all_related_objects(self):
+        try: # Try the cache first.
+            return self._all_related_objects
+        except AttributeError:
+            rel_objs = []
+            for klass in get_models():
+                for f in klass._meta.fields:
+                    if f.rel and self == f.rel.to._meta:
+                        rel_objs.append(RelatedObject(f.rel.to, klass, f))
+            self._all_related_objects = rel_objs
+            return rel_objs
+
+    def get_followed_related_objects(self, follow=None):
+        if follow == None:
+            follow = self.get_follow()
+        return [f for f in self.get_all_related_objects() if follow.get(f.name, None)]
+
+    def get_data_holders(self, follow=None):
+        if follow == None:
+            follow = self.get_follow()
+        return [f for f in self.fields + self.many_to_many + self.get_all_related_objects() if follow.get(f.name, None)]
+
+    def get_follow(self, override=None):
+        follow = {}
+        for f in self.fields + self.many_to_many + self.get_all_related_objects():
+            if override and override.has_key(f.name):
+                child_override = override[f.name]
+            else:
+                child_override = None
+            fol = f.get_follow(child_override)
+            if fol != None:
+                follow[f.name] = fol
+        return follow
+
+    def get_all_related_many_to_many_objects(self):
+        try: # Try the cache first.
+            return self._all_related_many_to_many_objects
+        except AttributeError:
+            rel_objs = []
+            for klass in get_models():
+                for f in klass._meta.many_to_many:
+                    if f.rel and self == f.rel.to._meta:
+                        rel_objs.append(RelatedObject(f.rel.to, klass, f))
+            self._all_related_many_to_many_objects = rel_objs
+            return rel_objs
+
+    def get_ordered_objects(self):
+        "Returns a list of Options objects that are ordered with respect to this object."
+        if not hasattr(self, '_ordered_objects'):
+            objects = []
+            # TODO
+            #for klass in get_models(get_app(self.app_label)):
+            #    opts = klass._meta
+            #    if opts.order_with_respect_to and opts.order_with_respect_to.rel \
+            #        and self == opts.order_with_respect_to.rel.to._meta:
+            #        objects.append(opts)
+            self._ordered_objects = objects
+        return self._ordered_objects
+
+    def has_field_type(self, field_type, follow=None):
+        """
+        Returns True if this object's admin form has at least one of the given
+        field_type (e.g. FileField).
+        """
+        # TODO: follow
+        if not hasattr(self, '_field_types'):
+            self._field_types = {}
+        if not self._field_types.has_key(field_type):
+            try:
+                # First check self.fields.
+                for f in self.fields:
+                    if isinstance(f, field_type):
+                        raise StopIteration
+                # Failing that, check related fields.
+                for related in self.get_followed_related_objects(follow):
+                    for f in related.opts.fields:
+                        if isinstance(f, field_type):
+                            raise StopIteration
+            except StopIteration:
+                self._field_types[field_type] = True
+            else:
+                self._field_types[field_type] = False
+        return self._field_types[field_type]
+
+class AdminOptions(object):
+    def __init__(self, fields=None, js=None, list_display=None, list_display_links=None, list_filter=None,
+        date_hierarchy=None, save_as=False, ordering=None, search_fields=None,
+        save_on_top=False, list_select_related=False, manager=None, list_per_page=100):
+        self.fields = fields
+        self.js = js or []
+        self.list_display = list_display or ['__str__']
+        self.list_display_links = list_display_links or []
+        self.list_filter = list_filter or []
+        self.date_hierarchy = date_hierarchy
+        self.save_as, self.ordering = save_as, ordering
+        self.search_fields = search_fields or []
+        self.save_on_top = save_on_top
+        self.list_select_related = list_select_related
+        self.list_per_page = list_per_page
+        self.manager = manager or Manager()
+
+    def get_field_sets(self, opts):
+        "Returns a list of AdminFieldSet objects for this AdminOptions object."
+        if self.fields is None:
+            field_struct = ((None, {'fields': [f.name for f in opts.fields + opts.many_to_many if f.editable and not isinstance(f, AutoField)]}),)
+        else:
+            field_struct = self.fields
+        new_fieldset_list = []
+        for fieldset in field_struct:
+            fs_options = fieldset[1]
+            classes = fs_options.get('classes', ())
+            description = fs_options.get('description', '')
+            new_fieldset_list.append(AdminFieldSet(fieldset[0], classes,
+                opts.get_field, fs_options['fields'], description))
+        return new_fieldset_list
+
+    def contribute_to_class(self, cls, name):
+        cls._meta.admin = self
+        # Make sure the admin manager has access to the model
+        self.manager.model = cls
+
+class AdminFieldSet(object):
+    def __init__(self, name, classes, field_locator_func, line_specs, description):
+        self.name = name
+        self.field_lines = [AdminFieldLine(field_locator_func, line_spec) for line_spec in line_specs]
+        self.classes = classes
+        self.description = description
+
+    def __repr__(self):
+        return "FieldSet: (%s, %s)" % (self.name, self.field_lines)
+
+    def bind(self, field_mapping, original, bound_field_set_class):
+        return bound_field_set_class(self, field_mapping, original)
+
+    def __iter__(self):
+        for field_line in self.field_lines:
+            yield field_line
+
+    def __len__(self):
+        return len(self.field_lines)
+
+class AdminFieldLine(object):
+    def __init__(self, field_locator_func, linespec):
+        if isinstance(linespec, basestring):
+            self.fields = [field_locator_func(linespec)]
+        else:
+            self.fields = [field_locator_func(field_name) for field_name in linespec]
+
+    def bind(self, field_mapping, original, bound_field_line_class):
+        return bound_field_line_class(self, field_mapping, original)
+
+    def __iter__(self):
+        for field in self.fields:
+            yield field
+
+    def __len__(self):
+        return len(self.fields)

Added: vendor/django/current/django/db/models/query.py
===================================================================
--- vendor/django/current/django/db/models/query.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/query.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,968 @@
+from django.db import backend, connection, transaction
+from django.db.models.fields import DateField, FieldDoesNotExist
+from django.db.models import signals
+from django.dispatch import dispatcher
+from django.utils.datastructures import SortedDict
+import operator
+import re
+
+# For Python 2.3
+if not hasattr(__builtins__, 'set'):
+    from sets import Set as set
+
+# The string constant used to separate query parts
+LOOKUP_SEPARATOR = '__'
+
+# The list of valid query types
+QUERY_TERMS = (
+    'exact', 'iexact', 'contains', 'icontains',
+    'gt', 'gte', 'lt', 'lte', 'in',
+    'startswith', 'istartswith', 'endswith', 'iendswith',
+    'range', 'year', 'month', 'day', 'isnull', 'search',
+)
+
+# Size of each "chunk" for get_iterator calls.
+# Larger values are slightly faster at the expense of more storage space.
+GET_ITERATOR_CHUNK_SIZE = 100
+
+####################
+# HELPER FUNCTIONS #
+####################
+
+# Django currently supports two forms of ordering.
+# Form 1 (deprecated) example:
+#     order_by=(('pub_date', 'DESC'), ('headline', 'ASC'), (None, 'RANDOM'))
+# Form 2 (new-style) example:
+#     order_by=('-pub_date', 'headline', '?')
+# Form 1 is deprecated and will no longer be supported for Django's first
+# official release. The following code converts from Form 1 to Form 2.
+
+LEGACY_ORDERING_MAPPING = {'ASC': '_', 'DESC': '-_', 'RANDOM': '?'}
+
+def handle_legacy_orderlist(order_list):
+    if not order_list or isinstance(order_list[0], basestring):
+        return order_list
+    else:
+        import warnings
+        new_order_list = [LEGACY_ORDERING_MAPPING[j.upper()].replace('_', str(i)) for i, j in order_list]
+        warnings.warn("%r ordering syntax is deprecated. Use %r instead." % (order_list, new_order_list), DeprecationWarning)
+        return new_order_list
+
+def orderfield2column(f, opts):
+    try:
+        return opts.get_field(f, False).column
+    except FieldDoesNotExist:
+        return f
+
+def orderlist2sql(order_list, opts, prefix=''):
+    if prefix.endswith('.'):
+        prefix = backend.quote_name(prefix[:-1]) + '.'
+    output = []
+    for f in handle_legacy_orderlist(order_list):
+        if f.startswith('-'):
+            output.append('%s%s DESC' % (prefix, backend.quote_name(orderfield2column(f[1:], opts))))
+        elif f == '?':
+            output.append(backend.get_random_function_sql())
+        else:
+            output.append('%s%s ASC' % (prefix, backend.quote_name(orderfield2column(f, opts))))
+    return ', '.join(output)
+
+def quote_only_if_word(word):
+    if re.search('\W', word): # Don't quote if there are spaces or non-word chars.
+        return word
+    else:
+        return backend.quote_name(word)
+
+class QuerySet(object):
+    "Represents a lazy database lookup for a set of objects"
+    def __init__(self, model=None):
+        self.model = model
+        self._filters = Q()
+        self._order_by = None        # Ordering, e.g. ('date', '-name'). If None, use model's ordering.
+        self._select_related = False # Whether to fill cache for related objects.
+        self._distinct = False       # Whether the query should use SELECT DISTINCT.
+        self._select = {}            # Dictionary of attname -> SQL.
+        self._where = []             # List of extra WHERE clauses to use.
+        self._params = []            # List of params to use for extra WHERE clauses.
+        self._tables = []            # List of extra tables to use.
+        self._offset = None          # OFFSET clause.
+        self._limit = None           # LIMIT clause.
+        self._result_cache = None
+
+    ########################
+    # PYTHON MAGIC METHODS #
+    ########################
+
+    def __repr__(self):
+        return repr(self._get_data())
+
+    def __len__(self):
+        return len(self._get_data())
+
+    def __iter__(self):
+        return iter(self._get_data())
+
+    def __getitem__(self, k):
+        "Retrieve an item or slice from the set of results."
+        assert (not isinstance(k, slice) and (k >= 0)) \
+            or (isinstance(k, slice) and (k.start is None or k.start >= 0) and (k.stop is None or k.stop >= 0)), \
+            "Negative indexing is not supported."
+        if self._result_cache is None:
+            if isinstance(k, slice):
+                # Offset:
+                if self._offset is None:
+                    offset = k.start
+                elif k.start is None:
+                    offset = self._offset
+                else:
+                    offset = self._offset + k.start
+                # Now adjust offset to the bounds of any existing limit:
+                if self._limit is not None and k.start is not None:
+                    limit = self._limit - k.start
+                else:
+                    limit = self._limit
+
+                # Limit:
+                if k.stop is not None and k.start is not None:
+                    if limit is None:
+                        limit = k.stop - k.start
+                    else:
+                        limit = min((k.stop - k.start), limit)
+                else:
+                    if limit is None:
+                        limit = k.stop
+                    else:
+                        if k.stop is not None:
+                            limit = min(k.stop, limit)
+
+                if k.step is None:
+                    return self._clone(_offset=offset, _limit=limit)
+                else:
+                    return list(self._clone(_offset=offset, _limit=limit))[::k.step]
+            else:
+                try:
+                    return list(self._clone(_offset=k, _limit=1))[0]
+                except self.model.DoesNotExist, e:
+                    raise IndexError, e.args
+        else:
+            return self._result_cache[k]
+
+    def __and__(self, other):
+        combined = self._combine(other)
+        combined._filters = self._filters & other._filters
+        return combined
+
+    def __or__(self, other):
+        combined = self._combine(other)
+        combined._filters = self._filters | other._filters
+        return combined
+
+    ####################################
+    # METHODS THAT DO DATABASE QUERIES #
+    ####################################
+
+    def iterator(self):
+        "Performs the SELECT database lookup of this QuerySet."
+        # self._select is a dictionary, and dictionaries' key order is
+        # undefined, so we convert it to a list of tuples.
+        extra_select = self._select.items()
+
+        cursor = connection.cursor()
+        select, sql, params = self._get_sql_clause()
+        cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
+        fill_cache = self._select_related
+        index_end = len(self.model._meta.fields)
+        while 1:
+            rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)
+            if not rows:
+                raise StopIteration
+            for row in rows:
+                if fill_cache:
+                    obj, index_end = get_cached_row(self.model, row, 0)
+                else:
+                    obj = self.model(*row[:index_end])
+                for i, k in enumerate(extra_select):
+                    setattr(obj, k[0], row[index_end+i])
+                yield obj
+
+    def count(self):
+        "Performs a SELECT COUNT() and returns the number of records as an integer."
+        counter = self._clone()
+        counter._order_by = ()
+        counter._offset = None
+        counter._limit = None
+        counter._select_related = False
+        select, sql, params = counter._get_sql_clause()
+        cursor = connection.cursor()
+        if self._distinct:
+            id_col = "%s.%s" % (backend.quote_name(self.model._meta.db_table),
+                    backend.quote_name(self.model._meta.pk.column))
+            cursor.execute("SELECT COUNT(DISTINCT(%s))" % id_col + sql, params)
+        else:
+            cursor.execute("SELECT COUNT(*)" + sql, params)
+        return cursor.fetchone()[0]
+
+    def get(self, *args, **kwargs):
+        "Performs the SELECT and returns a single object matching the given keyword arguments."
+        clone = self.filter(*args, **kwargs)
+        # clean up SQL by removing unneeded ORDER BY
+        if not clone._order_by:
+            clone._order_by = ()
+        obj_list = list(clone)
+        if len(obj_list) < 1:
+            raise self.model.DoesNotExist, "%s matching query does not exist." % self.model._meta.object_name
+        assert len(obj_list) == 1, "get() returned more than one %s -- it returned %s! Lookup parameters were %s" % (self.model._meta.object_name, len(obj_list), kwargs)
+        return obj_list[0]
+
+    def create(self, **kwargs):
+        """
+        Create a new object with the given kwargs, saving it to the database
+        and returning the created object.
+        """
+        obj = self.model(**kwargs)
+        obj.save()
+        return obj
+
+    def get_or_create(self, **kwargs):
+        """
+        Looks up an object with the given kwargs, creating one if necessary.
+        Returns a tuple of (object, created), where created is a boolean
+        specifying whether an object was created.
+        """
+        assert len(kwargs), 'get_or_create() must be passed at least one keyword argument'
+        defaults = kwargs.pop('defaults', {})
+        try:
+            return self.get(**kwargs), False
+        except self.model.DoesNotExist:
+            params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
+            params.update(defaults)
+            obj = self.model(**params)
+            obj.save()
+            return obj, True
+
+    def latest(self, field_name=None):
+        """
+        Returns the latest object, according to the model's 'get_latest_by'
+        option or optional given field_name.
+        """
+        latest_by = field_name or self.model._meta.get_latest_by
+        assert bool(latest_by), "latest() requires either a field_name parameter or 'get_latest_by' in the model"
+        assert self._limit is None and self._offset is None, \
+                "Cannot change a query once a slice has been taken."
+        return self._clone(_limit=1, _order_by=('-'+latest_by,)).get()
+
+    def in_bulk(self, id_list):
+        """
+        Returns a dictionary mapping each of the given IDs to the object with
+        that ID.
+        """
+        assert self._limit is None and self._offset is None, \
+                "Cannot use 'limit' or 'offset' with in_bulk"
+        assert isinstance(id_list, (tuple,  list)), "in_bulk() must be provided with a list of IDs."
+        id_list = list(id_list)
+        if id_list == []:
+            return {}
+        qs = self._clone()
+        qs._where.append("%s.%s IN (%s)" % (backend.quote_name(self.model._meta.db_table), backend.quote_name(self.model._meta.pk.column), ",".join(['%s'] * len(id_list))))
+        qs._params.extend(id_list)
+        return dict([(obj._get_pk_val(), obj) for obj in qs.iterator()])
+
+    def delete(self):
+        """
+        Deletes the records in the current QuerySet.
+        """
+        assert self._limit is None and self._offset is None, \
+            "Cannot use 'limit' or 'offset' with delete."
+
+        del_query = self._clone()
+
+        # disable non-supported fields
+        del_query._select_related = False
+        del_query._order_by = []
+
+        # Delete objects in chunks to prevent an the list of
+        # related objects from becoming too long
+        more_objects = True
+        while more_objects:
+            # Collect all the objects to be deleted in this chunk, and all the objects
+            # that are related to the objects that are to be deleted
+            seen_objs = SortedDict()
+            more_objects = False
+            for object in del_query[0:GET_ITERATOR_CHUNK_SIZE]:
+                more_objects = True
+                object._collect_sub_objects(seen_objs)
+
+            # If one or more objects were found, delete them.
+            # Otherwise, stop looping.
+            if more_objects:
+                delete_objects(seen_objs)
+
+        # Clear the result cache, in case this QuerySet gets reused.
+        self._result_cache = None
+    delete.alters_data = True
+
+    ##################################################
+    # PUBLIC METHODS THAT RETURN A QUERYSET SUBCLASS #
+    ##################################################
+
+    def values(self, *fields):
+        return self._clone(klass=ValuesQuerySet, _fields=fields)
+
+    def dates(self, field_name, kind, order='ASC'):
+        """
+        Returns a list of datetime objects representing all available dates
+        for the given field_name, scoped to 'kind'.
+        """
+        assert kind in ("month", "year", "day"), "'kind' must be one of 'year', 'month' or 'day'."
+        assert order in ('ASC', 'DESC'), "'order' must be either 'ASC' or 'DESC'."
+        # Let the FieldDoesNotExist exception propagate.
+        field = self.model._meta.get_field(field_name, many_to_many=False)
+        assert isinstance(field, DateField), "%r isn't a DateField." % field_name
+        return self._clone(klass=DateQuerySet, _field=field, _kind=kind, _order=order)
+
+    ##################################################################
+    # PUBLIC METHODS THAT ALTER ATTRIBUTES AND RETURN A NEW QUERYSET #
+    ##################################################################
+
+    def filter(self, *args, **kwargs):
+        "Returns a new QuerySet instance with the args ANDed to the existing set."
+        return self._filter_or_exclude(None, *args, **kwargs)
+
+    def exclude(self, *args, **kwargs):
+        "Returns a new QuerySet instance with NOT (args) ANDed to the existing set."
+        return self._filter_or_exclude(QNot, *args, **kwargs)
+
+    def _filter_or_exclude(self, mapper, *args, **kwargs):
+        # mapper is a callable used to transform Q objects,
+        # or None for identity transform
+        if mapper is None:
+            mapper = lambda x: x
+        if len(args) > 0 or len(kwargs) > 0:
+            assert self._limit is None and self._offset is None, \
+                "Cannot filter a query once a slice has been taken."
+
+        clone = self._clone()
+        if len(kwargs) > 0:
+            clone._filters = clone._filters & mapper(Q(**kwargs))
+        if len(args) > 0:
+            clone._filters = clone._filters & reduce(operator.and_, map(mapper, args))
+        return clone
+
+    def complex_filter(self, filter_obj):
+        """Returns a new QuerySet instance with filter_obj added to the filters.
+        filter_obj can be a Q object (has 'get_sql' method) or a dictionary of
+        keyword lookup arguments."""
+        # This exists to support framework features such as 'limit_choices_to',
+        # and usually it will be more natural to use other methods.
+        if hasattr(filter_obj, 'get_sql'):
+            return self._filter_or_exclude(None, filter_obj)
+        else:
+            return self._filter_or_exclude(None, **filter_obj)
+
+    def select_related(self, true_or_false=True):
+        "Returns a new QuerySet instance with '_select_related' modified."
+        return self._clone(_select_related=true_or_false)
+
+    def order_by(self, *field_names):
+        "Returns a new QuerySet instance with the ordering changed."
+        assert self._limit is None and self._offset is None, \
+                "Cannot reorder a query once a slice has been taken."
+        return self._clone(_order_by=field_names)
+
+    def distinct(self, true_or_false=True):
+        "Returns a new QuerySet instance with '_distinct' modified."
+        return self._clone(_distinct=true_or_false)
+
+    def extra(self, select=None, where=None, params=None, tables=None):
+        assert self._limit is None and self._offset is None, \
+                "Cannot change a query once a slice has been taken"
+        clone = self._clone()
+        if select: clone._select.update(select)
+        if where: clone._where.extend(where)
+        if params: clone._params.extend(params)
+        if tables: clone._tables.extend(tables)
+        return clone
+
+    ###################
+    # PRIVATE METHODS #
+    ###################
+
+    def _clone(self, klass=None, **kwargs):
+        if klass is None:
+            klass = self.__class__
+        c = klass()
+        c.model = self.model
+        c._filters = self._filters
+        c._order_by = self._order_by
+        c._select_related = self._select_related
+        c._distinct = self._distinct
+        c._select = self._select.copy()
+        c._where = self._where[:]
+        c._params = self._params[:]
+        c._tables = self._tables[:]
+        c._offset = self._offset
+        c._limit = self._limit
+        c.__dict__.update(kwargs)
+        return c
+
+    def _combine(self, other):
+        assert self._limit is None and self._offset is None \
+            and other._limit is None and other._offset is None, \
+            "Cannot combine queries once a slice has been taken."
+        assert self._distinct == other._distinct, \
+            "Cannot combine a unique query with a non-unique query"
+        #  use 'other's order by
+        #  (so that A.filter(args1) & A.filter(args2) does the same as
+        #   A.filter(args1).filter(args2)
+        combined = other._clone()
+        if self._select: combined._select.update(self._select)
+        if self._where: combined._where.extend(self._where)
+        if self._params: combined._params.extend(self._params)
+        if self._tables: combined._tables.extend(self._tables)
+        # If 'self' is ordered and 'other' isn't, propagate 'self's ordering
+        if (self._order_by is not None and len(self._order_by) > 0) and \
+           (combined._order_by is None or len(combined._order_by) == 0):
+            combined._order_by = self._order_by
+        return combined
+
+    def _get_data(self):
+        if self._result_cache is None:
+            self._result_cache = list(self.iterator())
+        return self._result_cache
+
+    def _get_sql_clause(self):
+        opts = self.model._meta
+
+        # Construct the fundamental parts of the query: SELECT X FROM Y WHERE Z.
+        select = ["%s.%s" % (backend.quote_name(opts.db_table), backend.quote_name(f.column)) for f in opts.fields]
+        tables = [quote_only_if_word(t) for t in self._tables]
+        joins = SortedDict()
+        where = self._where[:]
+        params = self._params[:]
+
+        # Convert self._filters into SQL.
+        joins2, where2, params2 = self._filters.get_sql(opts)
+        joins.update(joins2)
+        where.extend(where2)
+        params.extend(params2)
+
+        # Add additional tables and WHERE clauses based on select_related.
+        if self._select_related:
+            fill_table_cache(opts, select, tables, where, opts.db_table, [opts.db_table])
+
+        # Add any additional SELECTs.
+        if self._select:
+            select.extend(['(%s) AS %s' % (quote_only_if_word(s[1]), backend.quote_name(s[0])) for s in self._select.items()])
+
+        # Start composing the body of the SQL statement.
+        sql = [" FROM", backend.quote_name(opts.db_table)]
+
+        # Compose the join dictionary into SQL describing the joins.
+        if joins:
+            sql.append(" ".join(["%s %s AS %s ON %s" % (join_type, table, alias, condition)
+                            for (alias, (table, join_type, condition)) in joins.items()]))
+
+        # Compose the tables clause into SQL.
+        if tables:
+            sql.append(", " + ", ".join(tables))
+
+        # Compose the where clause into SQL.
+        if where:
+            sql.append(where and "WHERE " + " AND ".join(where))
+
+        # ORDER BY clause
+        order_by = []
+        if self._order_by is not None:
+            ordering_to_use = self._order_by
+        else:
+            ordering_to_use = opts.ordering
+        for f in handle_legacy_orderlist(ordering_to_use):
+            if f == '?': # Special case.
+                order_by.append(backend.get_random_function_sql())
+            else:
+                if f.startswith('-'):
+                    col_name = f[1:]
+                    order = "DESC"
+                else:
+                    col_name = f
+                    order = "ASC"
+                if "." in col_name:
+                    table_prefix, col_name = col_name.split('.', 1)
+                    table_prefix = backend.quote_name(table_prefix) + '.'
+                else:
+                    # Use the database table as a column prefix if it wasn't given,
+                    # and if the requested column isn't a custom SELECT.
+                    if "." not in col_name and col_name not in (self._select or ()):
+                        table_prefix = backend.quote_name(opts.db_table) + '.'
+                    else:
+                        table_prefix = ''
+                order_by.append('%s%s %s' % (table_prefix, backend.quote_name(orderfield2column(col_name, opts)), order))
+        if order_by:
+            sql.append("ORDER BY " + ", ".join(order_by))
+
+        # LIMIT and OFFSET clauses
+        if self._limit is not None:
+            sql.append("%s " % backend.get_limit_offset_sql(self._limit, self._offset))
+        else:
+            assert self._offset is None, "'offset' is not allowed without 'limit'"
+
+        return select, " ".join(sql), params
+
+class ValuesQuerySet(QuerySet):
+    def iterator(self):
+        # select_related and select aren't supported in values().
+        self._select_related = False
+        self._select = {}
+
+        # self._fields is a list of field names to fetch.
+        if self._fields:
+            columns = [self.model._meta.get_field(f, many_to_many=False).column for f in self._fields]
+            field_names = self._fields
+        else: # Default to all fields.
+            columns = [f.column for f in self.model._meta.fields]
+            field_names = [f.attname for f in self.model._meta.fields]
+
+        cursor = connection.cursor()
+        select, sql, params = self._get_sql_clause()
+        select = ['%s.%s' % (backend.quote_name(self.model._meta.db_table), backend.quote_name(c)) for c in columns]
+        cursor.execute("SELECT " + (self._distinct and "DISTINCT " or "") + ",".join(select) + sql, params)
+        while 1:
+            rows = cursor.fetchmany(GET_ITERATOR_CHUNK_SIZE)
+            if not rows:
+                raise StopIteration
+            for row in rows:
+                yield dict(zip(field_names, row))
+
+    def _clone(self, klass=None, **kwargs):
+        c = super(ValuesQuerySet, self)._clone(klass, **kwargs)
+        c._fields = self._fields[:]
+        return c
+
+class DateQuerySet(QuerySet):
+    def iterator(self):
+        from django.db.backends.util import typecast_timestamp
+        self._order_by = () # Clear this because it'll mess things up otherwise.
+        if self._field.null:
+            self._where.append('%s.%s IS NOT NULL' % \
+                (backend.quote_name(self.model._meta.db_table), backend.quote_name(self._field.column)))
+        select, sql, params = self._get_sql_clause()
+        sql = 'SELECT %s %s GROUP BY 1 ORDER BY 1 %s' % \
+            (backend.get_date_trunc_sql(self._kind, '%s.%s' % (backend.quote_name(self.model._meta.db_table),
+            backend.quote_name(self._field.column))), sql, self._order)
+        cursor = connection.cursor()
+        cursor.execute(sql, params)
+        # We have to manually run typecast_timestamp(str()) on the results, because
+        # MySQL doesn't automatically cast the result of date functions as datetime
+        # objects -- MySQL returns the values as strings, instead.
+        return [typecast_timestamp(str(row[0])) for row in cursor.fetchall()]
+
+    def _clone(self, klass=None, **kwargs):
+        c = super(DateQuerySet, self)._clone(klass, **kwargs)
+        c._field = self._field
+        c._kind = self._kind
+        c._order = self._order
+        return c
+
+class QOperator(object):
+    "Base class for QAnd and QOr"
+    def __init__(self, *args):
+        self.args = args
+
+    def get_sql(self, opts):
+        joins, where, params = SortedDict(), [], []
+        for val in self.args:
+            joins2, where2, params2 = val.get_sql(opts)
+            joins.update(joins2)
+            where.extend(where2)
+            params.extend(params2)
+        if where:
+            return joins, ['(%s)' % self.operator.join(where)], params
+        return joins, [], params
+
+class QAnd(QOperator):
+    "Encapsulates a combined query that uses 'AND'."
+    operator = ' AND '
+    def __or__(self, other):
+        return QOr(self, other)
+
+    def __and__(self, other):
+        if isinstance(other, QAnd):
+            return QAnd(*(self.args+other.args))
+        elif isinstance(other, (Q, QOr)):
+            return QAnd(*(self.args+(other,)))
+        else:
+            raise TypeError, other
+
+class QOr(QOperator):
+    "Encapsulates a combined query that uses 'OR'."
+    operator = ' OR '
+    def __and__(self, other):
+        return QAnd(self, other)
+
+    def __or__(self, other):
+        if isinstance(other, QOr):
+            return QOr(*(self.args+other.args))
+        elif isinstance(other, (Q, QAnd)):
+            return QOr(*(self.args+(other,)))
+        else:
+            raise TypeError, other
+
+class Q(object):
+    "Encapsulates queries as objects that can be combined logically."
+    def __init__(self, **kwargs):
+        self.kwargs = kwargs
+
+    def __and__(self, other):
+        return QAnd(self, other)
+
+    def __or__(self, other):
+        return QOr(self, other)
+
+    def get_sql(self, opts):
+        return parse_lookup(self.kwargs.items(), opts)
+
+class QNot(Q):
+    "Encapsulates NOT (...) queries as objects"
+    def __init__(self, q):
+        "Creates a negation of the q object passed in."
+        self.q = q
+
+    def get_sql(self, opts):
+        joins, where, params = self.q.get_sql(opts)
+        where2 = ['(NOT (%s))' % " AND ".join(where)]
+        return joins, where2, params
+
+def get_where_clause(lookup_type, table_prefix, field_name, value):
+    if table_prefix.endswith('.'):
+        table_prefix = backend.quote_name(table_prefix[:-1])+'.'
+    field_name = backend.quote_name(field_name)
+    try:
+        return '%s%s %s' % (table_prefix, field_name, (backend.OPERATOR_MAPPING[lookup_type] % '%s'))
+    except KeyError:
+        pass
+    if lookup_type == 'in':
+        return '%s%s IN (%s)' % (table_prefix, field_name, ','.join(['%s' for v in value]))
+    elif lookup_type == 'range':
+        return '%s%s BETWEEN %%s AND %%s' % (table_prefix, field_name)
+    elif lookup_type in ('year', 'month', 'day'):
+        return "%s = %%s" % backend.get_date_extract_sql(lookup_type, table_prefix + field_name)
+    elif lookup_type == 'isnull':
+        return "%s%s IS %sNULL" % (table_prefix, field_name, (not value and 'NOT ' or ''))
+    elif lookup_type == 'search':
+        return backend.get_fulltext_search_sql(table_prefix + field_name)
+    raise TypeError, "Got invalid lookup_type: %s" % repr(lookup_type)
+
+def get_cached_row(klass, row, index_start):
+    "Helper function that recursively returns an object with cache filled"
+    index_end = index_start + len(klass._meta.fields)
+    obj = klass(*row[index_start:index_end])
+    for f in klass._meta.fields:
+        if f.rel and not f.null:
+            rel_obj, index_end = get_cached_row(f.rel.to, row, index_end)
+            setattr(obj, f.get_cache_name(), rel_obj)
+    return obj, index_end
+
+def fill_table_cache(opts, select, tables, where, old_prefix, cache_tables_seen):
+    """
+    Helper function that recursively populates the select, tables and where (in
+    place) for select_related queries.
+    """
+    qn = backend.quote_name
+    for f in opts.fields:
+        if f.rel and not f.null:
+            db_table = f.rel.to._meta.db_table
+            if db_table not in cache_tables_seen:
+                tables.append(qn(db_table))
+            else: # The table was already seen, so give it a table alias.
+                new_prefix = '%s%s' % (db_table, len(cache_tables_seen))
+                tables.append('%s %s' % (qn(db_table), qn(new_prefix)))
+                db_table = new_prefix
+            cache_tables_seen.append(db_table)
+            where.append('%s.%s = %s.%s' % \
+                (qn(old_prefix), qn(f.column), qn(db_table), qn(f.rel.get_related_field().column)))
+            select.extend(['%s.%s' % (qn(db_table), qn(f2.column)) for f2 in f.rel.to._meta.fields])
+            fill_table_cache(f.rel.to._meta, select, tables, where, db_table, cache_tables_seen)
+
+def parse_lookup(kwarg_items, opts):
+    # Helper function that handles converting API kwargs
+    # (e.g. "name__exact": "tom") to SQL.
+    # Returns a tuple of (tables, joins, where, params).
+
+    # 'joins' is a sorted dictionary describing the tables that must be joined
+    # to complete the query. The dictionary is sorted because creation order
+    # is significant; it is a dictionary to ensure uniqueness of alias names.
+    #
+    # Each key-value pair follows the form
+    #   alias: (table, join_type, condition)
+    # where
+    #   alias is the AS alias for the joined table
+    #   table is the actual table name to be joined
+    #   join_type is the type of join (INNER JOIN, LEFT OUTER JOIN, etc)
+    #   condition is the where-like statement over which narrows the join.
+    #   alias will be derived from the lookup list name.
+    #
+    # At present, this method only every returns INNER JOINs; the option is
+    # there for others to implement custom Q()s, etc that return other join
+    # types.
+    joins, where, params = SortedDict(), [], []
+
+    for kwarg, value in kwarg_items:
+        if value is not None:
+            path = kwarg.split(LOOKUP_SEPARATOR)
+            # Extract the last elements of the kwarg.
+            # The very-last is the lookup_type (equals, like, etc).
+            # The second-last is the table column on which the lookup_type is
+            # to be performed.
+            # The exceptions to this are:
+            # 1)  "pk", which is an implicit id__exact;
+            #     if we find "pk", make the lookup_type "exact', and insert
+            #     a dummy name of None, which we will replace when
+            #     we know which table column to grab as the primary key.
+            # 2)  If there is only one part, or the last part is not a query
+            #     term, assume that the query is an __exact
+            lookup_type = path.pop()
+            if lookup_type == 'pk':
+                lookup_type = 'exact'
+                path.append(None)
+            elif len(path) == 0 or lookup_type not in QUERY_TERMS:
+                path.append(lookup_type)
+                lookup_type = 'exact'
+
+            if len(path) < 1:
+                raise TypeError, "Cannot parse keyword query %r" % kwarg
+
+            joins2, where2, params2 = lookup_inner(path, lookup_type, value, opts, opts.db_table, None)
+            joins.update(joins2)
+            where.extend(where2)
+            params.extend(params2)
+    return joins, where, params
+
+class FieldFound(Exception):
+    "Exception used to short circuit field-finding operations."
+    pass
+
+def find_field(name, field_list, related_query):
+    """
+    Finds a field with a specific name in a list of field instances.
+    Returns None if there are no matches, or several matches.
+    """
+    if related_query:
+        matches = [f for f in field_list if f.field.related_query_name() == name]
+    else:
+        matches = [f for f in field_list if f.name == name]
+    if len(matches) != 1:
+        return None
+    return matches[0]
+
+def lookup_inner(path, lookup_type, value, opts, table, column):
+    qn = backend.quote_name
+    joins, where, params = SortedDict(), [], []
+    current_opts = opts
+    current_table = table
+    current_column = column
+    intermediate_table = None
+    join_required = False
+
+    name = path.pop(0)
+    # Has the primary key been requested? If so, expand it out
+    # to be the name of the current class' primary key
+    if name is None:
+        name = current_opts.pk.name
+
+    # Try to find the name in the fields associated with the current class
+    try:
+        # Does the name belong to a defined many-to-many field?
+        field = find_field(name, current_opts.many_to_many, False)
+        if field:
+            new_table = current_table + '__' + name
+            new_opts = field.rel.to._meta
+            new_column = new_opts.pk.column
+
+            # Need to create an intermediate table join over the m2m table
+            # This process hijacks current_table/column to point to the
+            # intermediate table.
+            current_table = "m2m_" + new_table
+            intermediate_table = field.m2m_db_table()
+            join_column = field.m2m_reverse_name()
+            intermediate_column = field.m2m_column_name()
+
+            raise FieldFound
+
+        # Does the name belong to a reverse defined many-to-many field?
+        field = find_field(name, current_opts.get_all_related_many_to_many_objects(), True)
+        if field:
+            new_table = current_table + '__' + name
+            new_opts = field.opts
+            new_column = new_opts.pk.column
+
+            # Need to create an intermediate table join over the m2m table.
+            # This process hijacks current_table/column to point to the
+            # intermediate table.
+            current_table = "m2m_" + new_table
+            intermediate_table = field.field.m2m_db_table()
+            join_column = field.field.m2m_column_name()
+            intermediate_column = field.field.m2m_reverse_name()
+
+            raise FieldFound
+
+        # Does the name belong to a one-to-many field?
+        field = find_field(name, current_opts.get_all_related_objects(), True)
+        if field:
+            new_table = table + '__' + name
+            new_opts = field.opts
+            new_column = field.field.column
+            join_column = opts.pk.column
+
+            # 1-N fields MUST be joined, regardless of any other conditions.
+            join_required = True
+
+            raise FieldFound
+
+        # Does the name belong to a one-to-one, many-to-one, or regular field?
+        field = find_field(name, current_opts.fields, False)
+        if field:
+            if field.rel: # One-to-One/Many-to-one field
+                new_table = current_table + '__' + name
+                new_opts = field.rel.to._meta
+                new_column = new_opts.pk.column
+                join_column = field.column
+
+            raise FieldFound
+
+    except FieldFound: # Match found, loop has been shortcut.
+        pass
+    else: # No match found.
+        raise TypeError, "Cannot resolve keyword '%s' into field" % name
+
+    # Check whether an intermediate join is required between current_table
+    # and new_table.
+    if intermediate_table:
+        joins[qn(current_table)] = (
+            qn(intermediate_table), "LEFT OUTER JOIN",
+            "%s.%s = %s.%s" % (qn(table), qn(current_opts.pk.column), qn(current_table), qn(intermediate_column))
+        )
+
+    if path:
+        # There are elements left in the path. More joins are required.
+        if len(path) == 1 and path[0] in (new_opts.pk.name, None) \
+            and lookup_type in ('exact', 'isnull') and not join_required:
+            # If the next and final name query is for a primary key,
+            # and the search is for isnull/exact, then the current
+            # (for N-1) or intermediate (for N-N) table can be used
+            # for the search. No need to join an extra table just
+            # to check the primary key.
+            new_table = current_table
+        else:
+            # There are 1 or more name queries pending, and we have ruled out
+            # any shortcuts; therefore, a join is required.
+            joins[qn(new_table)] = (
+                qn(new_opts.db_table), "INNER JOIN",
+                "%s.%s = %s.%s" % (qn(current_table), qn(join_column), qn(new_table), qn(new_column))
+            )
+            # If we have made the join, we don't need to tell subsequent
+            # recursive calls about the column name we joined on.
+            join_column = None
+
+        # There are name queries remaining. Recurse deeper.
+        joins2, where2, params2 = lookup_inner(path, lookup_type, value, new_opts, new_table, join_column)
+
+        joins.update(joins2)
+        where.extend(where2)
+        params.extend(params2)
+    else:
+        # No elements left in path. Current element is the element on which
+        # the search is being performed.
+
+        if join_required:
+            # Last query term is a RelatedObject
+            if field.field.rel.multiple:
+                # RelatedObject is from a 1-N relation.
+                # Join is required; query operates on joined table.
+                column = new_opts.pk.name
+                joins[qn(new_table)] = (
+                    qn(new_opts.db_table), "INNER JOIN",
+                    "%s.%s = %s.%s" % (qn(current_table), qn(join_column), qn(new_table), qn(new_column))
+                )
+                current_table = new_table
+            else:
+                # RelatedObject is from a 1-1 relation,
+                # No need to join; get the pk value from the related object,
+                # and compare using that.
+                column = current_opts.pk.name
+        elif intermediate_table:
+            # Last query term is a related object from an N-N relation.
+            # Join from intermediate table is sufficient.
+            column = join_column
+        elif name == current_opts.pk.name and lookup_type in ('exact', 'isnull') and current_column:
+            # Last query term is for a primary key. If previous iterations
+            # introduced a current/intermediate table that can be used to
+            # optimize the query, then use that table and column name.
+            column = current_column
+        else:
+            # Last query term was a normal field.
+            column = field.column
+
+        where.append(get_where_clause(lookup_type, current_table + '.', column, value))
+        params.extend(field.get_db_prep_lookup(lookup_type, value))
+
+    return joins, where, params
+
+def delete_objects(seen_objs):
+    "Iterate through a list of seen classes, and remove any instances that are referred to"
+    qn = backend.quote_name
+    ordered_classes = seen_objs.keys()
+    ordered_classes.reverse()
+
+    cursor = connection.cursor()
+
+    for cls in ordered_classes:
+        seen_objs[cls] = seen_objs[cls].items()
+        seen_objs[cls].sort()
+
+        # Pre notify all instances to be deleted
+        for pk_val, instance in seen_objs[cls]:
+            dispatcher.send(signal=signals.pre_delete, sender=cls, instance=instance)
+
+        pk_list = [pk for pk,instance in seen_objs[cls]]
+        for related in cls._meta.get_all_related_many_to_many_objects():
+            for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+                cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \
+                    (qn(related.field.m2m_db_table()),
+                        qn(related.field.m2m_reverse_name()),
+                        ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])),
+                    pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE])
+        for f in cls._meta.many_to_many:
+            for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+                cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \
+                    (qn(f.m2m_db_table()), qn(f.m2m_column_name()),
+                    ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])),
+                    pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE])
+        for field in cls._meta.fields:
+            if field.rel and field.null and field.rel.to in seen_objs:
+                for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+                    cursor.execute("UPDATE %s SET %s=NULL WHERE %s IN (%s)" % \
+                        (qn(cls._meta.db_table), qn(field.column), qn(cls._meta.pk.column),
+                            ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])),
+                        pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE])
+
+    # Now delete the actual data
+    for cls in ordered_classes:
+        seen_objs[cls].reverse()
+        pk_list = [pk for pk,instance in seen_objs[cls]]
+        for offset in range(0, len(pk_list), GET_ITERATOR_CHUNK_SIZE):
+            cursor.execute("DELETE FROM %s WHERE %s IN (%s)" % \
+                (qn(cls._meta.db_table), qn(cls._meta.pk.column),
+                ','.join(['%s' for pk in pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE]])),
+                pk_list[offset:offset+GET_ITERATOR_CHUNK_SIZE])
+
+        # Last cleanup; set NULLs where there once was a reference to the object,
+        # NULL the primary key of the found objects, and perform post-notification.
+        for pk_val, instance in seen_objs[cls]:
+            for field in cls._meta.fields:
+                if field.rel and field.null and field.rel.to in seen_objs:
+                    setattr(instance, field.attname, None)
+
+            setattr(instance, cls._meta.pk.attname, None)
+            dispatcher.send(signal=signals.post_delete, sender=cls, instance=instance)
+
+    transaction.commit_unless_managed()

Added: vendor/django/current/django/db/models/related.py
===================================================================
--- vendor/django/current/django/db/models/related.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/related.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,136 @@
+class BoundRelatedObject(object):
+    def __init__(self, related_object, field_mapping, original):
+        self.relation = related_object
+        self.field_mappings = field_mapping[related_object.opts.module_name]
+
+    def template_name(self):
+        raise NotImplementedError
+
+    def __repr__(self):
+        return repr(self.__dict__)
+
+class RelatedObject(object):
+    def __init__(self, parent_model, model, field):
+        self.parent_model = parent_model
+        self.model = model
+        self.opts = model._meta
+        self.field = field
+        self.edit_inline = field.rel.edit_inline
+        self.name = self.opts.module_name
+        self.var_name = self.opts.object_name.lower()
+
+    def flatten_data(self, follow, obj=None):
+        new_data = {}
+        rel_instances = self.get_list(obj)
+        for i, rel_instance in enumerate(rel_instances):
+            instance_data = {}
+            for f in self.opts.fields + self.opts.many_to_many:
+                # TODO: Fix for recursive manipulators.
+                fol = follow.get(f.name, None)
+                if fol:
+                    field_data = f.flatten_data(fol, rel_instance)
+                    for name, value in field_data.items():
+                        instance_data['%s.%d.%s' % (self.var_name, i, name)] = value
+            new_data.update(instance_data)
+        return new_data
+
+    def extract_data(self, data):
+        """
+        Pull out the data meant for inline objects of this class,
+        i.e. anything starting with our module name.
+        """
+        return data # TODO
+
+    def get_list(self, parent_instance=None):
+        "Get the list of this type of object from an instance of the parent class."
+        if parent_instance is not None:
+            attr = getattr(parent_instance, self.get_accessor_name())
+            if self.field.rel.multiple:
+                # For many-to-many relationships, return a list of objects
+                # corresponding to the xxx_num_in_admin options of the field
+                objects = list(attr.all())
+
+                count = len(objects) + self.field.rel.num_extra_on_change
+                if self.field.rel.min_num_in_admin:
+                    count = max(count, self.field.rel.min_num_in_admin)
+                if self.field.rel.max_num_in_admin:
+                    count = min(count, self.field.rel.max_num_in_admin)
+
+                change = count - len(objects)
+                if change > 0:
+                    return objects + [None] * change
+                if change < 0:
+                    return objects[:change]
+                else: # Just right
+                    return objects
+            else:
+                # A one-to-one relationship, so just return the single related
+                # object
+                return [attr]
+        else:
+            return [None] * self.field.rel.num_in_admin
+
+    def get_db_prep_lookup(self, lookup_type, value):
+        # Defer to the actual field definition for db prep
+        return self.field.get_db_prep_lookup(lookup_type, value)
+        
+    def editable_fields(self):
+        "Get the fields in this class that should be edited inline."
+        return [f for f in self.opts.fields + self.opts.many_to_many if f.editable and f != self.field]
+
+    def get_follow(self, override=None):
+        if isinstance(override, bool):
+            if override:
+                over = {}
+            else:
+                return None
+        else:
+            if override:
+                over = override.copy()
+            elif self.edit_inline:
+                over = {}
+            else:
+                return None
+
+        over[self.field.name] = False
+        return self.opts.get_follow(over)
+
+    def get_manipulator_fields(self, opts, manipulator, change, follow):
+        if self.field.rel.multiple:
+            if change:
+                attr = getattr(manipulator.original_object, self.get_accessor_name())
+                count = attr.count()
+                count += self.field.rel.num_extra_on_change
+                if self.field.rel.min_num_in_admin:
+                    count = max(count, self.field.rel.min_num_in_admin)
+                if self.field.rel.max_num_in_admin:
+                    count = min(count, self.field.rel.max_num_in_admin)
+            else:
+                count = self.field.rel.num_in_admin
+        else:
+            count = 1
+
+        fields = []
+        for i in range(count):
+            for f in self.opts.fields + self.opts.many_to_many:
+                if follow.get(f.name, False):
+                    prefix = '%s.%d.' % (self.var_name, i)
+                    fields.extend(f.get_manipulator_fields(self.opts, manipulator, change,
+                                                           name_prefix=prefix, rel=True))
+        return fields
+
+    def __repr__(self):
+        return "<RelatedObject: %s related to %s>" % (self.name, self.field.name)
+
+    def bind(self, field_mapping, original, bound_related_object_class=BoundRelatedObject):
+        return bound_related_object_class(self, field_mapping, original)
+
+    def get_accessor_name(self):
+        # This method encapsulates the logic that decides what name to give an
+        # accessor descriptor that retrieves related many-to-one or
+        # many-to-many objects. It uses the lower-cased object_name + "_set",
+        # but this can be overridden with the "related_name" option.
+        if self.field.rel.multiple:
+            return self.field.rel.related_name or (self.opts.object_name.lower() + '_set')
+        else:
+            return self.field.rel.related_name or (self.opts.object_name.lower())

Added: vendor/django/current/django/db/models/signals.py
===================================================================
--- vendor/django/current/django/db/models/signals.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/models/signals.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,12 @@
+class_prepared = object()
+
+pre_init= object()
+post_init = object()
+
+pre_save = object()
+post_save = object()
+
+pre_delete = object()
+post_delete = object()
+
+post_syncdb = object()

Added: vendor/django/current/django/db/transaction.py
===================================================================
--- vendor/django/current/django/db/transaction.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/db/transaction.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,222 @@
+"""
+This module implements a transaction manager that can be used to define
+transaction handling in a request or view function. It is used by transaction
+control middleware and decorators.
+
+The transaction manager can be in managed or in auto state. Auto state means the
+system is using a commit-on-save strategy (actually it's more like
+commit-on-change). As soon as the .save() or .delete() (or related) methods are
+called, a commit is made.
+
+Managed transactions don't do those commits, but will need some kind of manual
+or implicit commits or rollbacks.
+"""
+
+try:
+    import thread
+except ImportError:
+    import dummy_thread as thread
+from django.db import connection
+from django.conf import settings
+
+class TransactionManagementError(Exception):
+    """
+    This exception is thrown when something bad happens with transaction
+    management.
+    """
+    pass
+
+# The state is a dictionary of lists. The key to the dict is the current
+# thread and the list is handled as a stack of values.
+state = {}
+
+# The dirty flag is set by *_unless_managed functions to denote that the
+# code under transaction management has changed things to require a
+# database commit.
+dirty = {}
+
+def enter_transaction_management():
+    """
+    Enters transaction management for a running thread. It must be balanced with
+    the appropriate leave_transaction_management call, since the actual state is
+    managed as a stack.
+
+    The state and dirty flag are carried over from the surrounding block or
+    from the settings, if there is no surrounding block (dirty is always false
+    when no current block is running).
+    """
+    thread_ident = thread.get_ident()
+    if state.has_key(thread_ident) and state[thread_ident]:
+        state[thread_ident].append(state[thread_ident][-1])
+    else:
+        state[thread_ident] = []
+        state[thread_ident].append(settings.TRANSACTIONS_MANAGED)
+    if not dirty.has_key(thread_ident):
+        dirty[thread_ident] = False
+
+def leave_transaction_management():
+    """
+    Leaves transaction management for a running thread. A dirty flag is carried
+    over to the surrounding block, as a commit will commit all changes, even
+    those from outside. (Commits are on connection level.)
+    """
+    thread_ident = thread.get_ident()
+    if state.has_key(thread_ident) and state[thread_ident]:
+        del state[thread_ident][-1]
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+    if dirty.get(thread_ident, False):
+        rollback()
+        raise TransactionManagementError("Transaction managed block ended with pending COMMIT/ROLLBACK")
+    dirty[thread_ident] = False
+
+def is_dirty():
+    """
+    Returns True if the current transaction requires a commit for changes to
+    happen.
+    """
+    return dirty.get(thread.get_ident(), False)
+
+def set_dirty():
+    """
+    Sets a dirty flag for the current thread and code streak. This can be used
+    to decide in a managed block of code to decide whether there are open
+    changes waiting for commit.
+    """
+    thread_ident = thread.get_ident()
+    if dirty.has_key(thread_ident):
+        dirty[thread_ident] = True
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+
+def set_clean():
+    """
+    Resets a dirty flag for the current thread and code streak. This can be used
+    to decide in a managed block of code to decide whether a commit or rollback
+    should happen.
+    """
+    thread_ident = thread.get_ident()
+    if dirty.has_key(thread_ident):
+        dirty[thread_ident] = False
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+
+def is_managed():
+    """
+    Checks whether the transaction manager is in manual or in auto state.
+    """
+    thread_ident = thread.get_ident()
+    if state.has_key(thread_ident):
+        if state[thread_ident]:
+            return state[thread_ident][-1]
+    return settings.TRANSACTIONS_MANAGED
+
+def managed(flag=True):
+    """
+    Puts the transaction manager into a manual state: managed transactions have
+    to be committed explicitly by the user. If you switch off transaction
+    management and there is a pending commit/rollback, the data will be
+    commited.
+    """
+    thread_ident = thread.get_ident()
+    top = state.get(thread_ident, None)
+    if top:
+        top[-1] = flag
+        if not flag and is_dirty():
+            connection._commit()
+            set_clean()
+    else:
+        raise TransactionManagementError("This code isn't under transaction management")
+
+def commit_unless_managed():
+    """
+    Commits changes if the system is not in managed transaction mode.
+    """
+    if not is_managed():
+        connection._commit()
+    else:
+        set_dirty()
+
+def rollback_unless_managed():
+    """
+    Rolls back changes if the system is not in managed transaction mode.
+    """
+    if not is_managed():
+        connection._rollback()
+    else:
+        set_dirty()
+
+def commit():
+    """
+    Does the commit itself and resets the dirty flag.
+    """
+    connection._commit()
+    set_clean()
+
+def rollback():
+    """
+    This function does the rollback itself and resets the dirty flag.
+    """
+    connection._rollback()
+    set_clean()
+
+##############
+# DECORATORS #
+##############
+
+def autocommit(func):
+    """
+    Decorator that activates commit on save. This is Django's default behavior;
+    this decorator is useful if you globally activated transaction management in
+    your settings file and want the default behavior in some view functions.
+    """
+    def _autocommit(*args, **kw):
+        try:
+            enter_transaction_management()
+            managed(False)
+            return func(*args, **kw)
+        finally:
+            leave_transaction_management()
+    return _autocommit
+
+def commit_on_success(func):
+    """
+    This decorator activates commit on response. This way, if the view function
+    runs successfully, a commit is made; if the viewfunc produces an exception,
+    a rollback is made. This is one of the most common ways to do transaction
+    control in web apps.
+    """
+    def _commit_on_success(*args, **kw):
+        try:
+            enter_transaction_management()
+            managed(True)
+            try:
+                res = func(*args, **kw)
+            except Exception, e:
+                if is_dirty():
+                    rollback()
+                raise
+            else:
+                if is_dirty():
+                    commit()
+            return res
+        finally:
+            leave_transaction_management()
+    return _commit_on_success
+
+def commit_manually(func):
+    """
+    Decorator that activates manual transaction control. It just disables
+    automatic transaction control and doesn't do any commit/rollback of its
+    own -- it's up to the user to call the commit and rollback functions
+    themselves.
+    """
+    def _commit_manually(*args, **kw):
+        try:
+            enter_transaction_management()
+            managed(True)
+            return func(*args, **kw)
+        finally:
+            leave_transaction_management()
+
+    return _commit_manually

Added: vendor/django/current/django/dispatch/__init__.py
===================================================================
--- vendor/django/current/django/dispatch/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/dispatch/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,6 @@
+"""Multi-consumer multi-producer dispatching mechanism
+"""
+__version__ = "1.0.0"
+__author__ = "Patrick K. O'Brien"
+__license__ = "BSD-style, see license.txt for details"
+

Added: vendor/django/current/django/dispatch/dispatcher.py
===================================================================
--- vendor/django/current/django/dispatch/dispatcher.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/dispatch/dispatcher.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,497 @@
+"""Multiple-producer-multiple-consumer signal-dispatching
+
+dispatcher is the core of the PyDispatcher system,
+providing the primary API and the core logic for the
+system.
+
+Module attributes of note:
+
+    Any -- Singleton used to signal either "Any Sender" or
+        "Any Signal".  See documentation of the _Any class.
+    Anonymous -- Singleton used to signal "Anonymous Sender"
+        See documentation of the _Anonymous class.
+
+Internal attributes:
+    WEAKREF_TYPES -- tuple of types/classes which represent
+        weak references to receivers, and thus must be de-
+        referenced on retrieval to retrieve the callable
+        object
+    connections -- { senderkey (id) : { signal : [receivers...]}}
+    senders -- { senderkey (id) : weakref(sender) }
+        used for cleaning up sender references on sender
+        deletion
+    sendersBack -- { receiverkey (id) : [senderkey (id)...] }
+        used for cleaning up receiver references on receiver
+        deletion, (considerably speeds up the cleanup process
+        vs. the original code.)
+"""
+from __future__ import generators
+import types, weakref
+from django.dispatch import saferef, robustapply, errors
+
+__author__ = "Patrick K. O'Brien <pobrien at orbtech.com>"
+__cvsid__ = "$Id: dispatcher.py,v 1.9 2005/09/17 04:55:57 mcfletch Exp $"
+__version__ = "$Revision: 1.9 $"[11:-2]
+
+try:
+    True
+except NameError:
+    True = 1==1
+    False = 1==0
+
+class _Parameter:
+    """Used to represent default parameter values."""
+    def __repr__(self):
+        return self.__class__.__name__
+
+class _Any(_Parameter):
+    """Singleton used to signal either "Any Sender" or "Any Signal"
+
+    The Any object can be used with connect, disconnect,
+    send, or sendExact to signal that the parameter given
+    Any should react to all senders/signals, not just
+    a particular sender/signal.
+    """
+Any = _Any()
+
+class _Anonymous(_Parameter):
+    """Singleton used to signal "Anonymous Sender"
+
+    The Anonymous object is used to signal that the sender
+    of a message is not specified (as distinct from being
+    "any sender").  Registering callbacks for Anonymous
+    will only receive messages sent without senders.  Sending
+    with anonymous will only send messages to those receivers
+    registered for Any or Anonymous.
+
+    Note:
+        The default sender for connect is Any, while the
+        default sender for send is Anonymous.  This has
+        the effect that if you do not specify any senders
+        in either function then all messages are routed
+        as though there was a single sender (Anonymous)
+        being used everywhere.
+    """
+Anonymous = _Anonymous()
+
+WEAKREF_TYPES = (weakref.ReferenceType, saferef.BoundMethodWeakref)
+
+connections = {}
+senders = {}
+sendersBack = {}
+
+
+def connect(receiver, signal=Any, sender=Any, weak=True):
+    """Connect receiver to sender for signal
+
+    receiver -- a callable Python object which is to receive
+        messages/signals/events.  Receivers must be hashable
+        objects.
+
+        if weak is True, then receiver must be weak-referencable
+        (more precisely saferef.safeRef() must be able to create
+        a reference to the receiver).
+    
+        Receivers are fairly flexible in their specification,
+        as the machinery in the robustApply module takes care
+        of most of the details regarding figuring out appropriate
+        subsets of the sent arguments to apply to a given
+        receiver.
+
+        Note:
+            if receiver is itself a weak reference (a callable),
+            it will be de-referenced by the system's machinery,
+            so *generally* weak references are not suitable as
+            receivers, though some use might be found for the
+            facility whereby a higher-level library passes in
+            pre-weakrefed receiver references.
+
+    signal -- the signal to which the receiver should respond
+    
+        if Any, receiver will receive any signal from the
+        indicated sender (which might also be Any, but is not
+        necessarily Any).
+        
+        Otherwise must be a hashable Python object other than
+        None (DispatcherError raised on None).
+        
+    sender -- the sender to which the receiver should respond
+    
+        if Any, receiver will receive the indicated signals
+        from any sender.
+        
+        if Anonymous, receiver will only receive indicated
+        signals from send/sendExact which do not specify a
+        sender, or specify Anonymous explicitly as the sender.
+
+        Otherwise can be any python object.
+        
+    weak -- whether to use weak references to the receiver
+        By default, the module will attempt to use weak
+        references to the receiver objects.  If this parameter
+        is false, then strong references will be used.
+
+    returns None, may raise DispatcherTypeError
+    """
+    if signal is None:
+        raise errors.DispatcherTypeError(
+            'Signal cannot be None (receiver=%r sender=%r)'%( receiver,sender)
+        )
+    if weak:
+        receiver = saferef.safeRef(receiver, onDelete=_removeReceiver)
+    senderkey = id(sender)
+    if connections.has_key(senderkey):
+        signals = connections[senderkey]
+    else:
+        connections[senderkey] = signals = {}
+    # Keep track of senders for cleanup.
+    # Is Anonymous something we want to clean up?
+    if sender not in (None, Anonymous, Any):
+        def remove(object, senderkey=senderkey):
+            _removeSender(senderkey=senderkey)
+        # Skip objects that can not be weakly referenced, which means
+        # they won't be automatically cleaned up, but that's too bad.
+        try:
+            weakSender = weakref.ref(sender, remove)
+            senders[senderkey] = weakSender
+        except:
+            pass
+        
+    receiverID = id(receiver)
+    # get current set, remove any current references to
+    # this receiver in the set, including back-references
+    if signals.has_key(signal):
+        receivers = signals[signal]
+        _removeOldBackRefs(senderkey, signal, receiver, receivers)
+    else:
+        receivers = signals[signal] = []
+    try:
+        current = sendersBack.get( receiverID )
+        if current is None:
+            sendersBack[ receiverID ] = current = []
+        if senderkey not in current:
+            current.append(senderkey)
+    except:
+        pass
+
+    receivers.append(receiver)
+
+
+
+def disconnect(receiver, signal=Any, sender=Any, weak=True):
+    """Disconnect receiver from sender for signal
+
+    receiver -- the registered receiver to disconnect
+    signal -- the registered signal to disconnect
+    sender -- the registered sender to disconnect
+    weak -- the weakref state to disconnect
+
+    disconnect reverses the process of connect,
+    the semantics for the individual elements are
+    logically equivalent to a tuple of
+    (receiver, signal, sender, weak) used as a key
+    to be deleted from the internal routing tables.
+    (The actual process is slightly more complex
+    but the semantics are basically the same).
+
+    Note:
+        Using disconnect is not required to cleanup
+        routing when an object is deleted, the framework
+        will remove routes for deleted objects
+        automatically.  It's only necessary to disconnect
+        if you want to stop routing to a live object.
+        
+    returns None, may raise DispatcherTypeError or
+        DispatcherKeyError
+    """
+    if signal is None:
+        raise errors.DispatcherTypeError(
+            'Signal cannot be None (receiver=%r sender=%r)'%( receiver,sender)
+        )
+    if weak: receiver = saferef.safeRef(receiver)
+    senderkey = id(sender)
+    try:
+        signals = connections[senderkey]
+        receivers = signals[signal]
+    except KeyError:
+        raise errors.DispatcherKeyError(
+            """No receivers found for signal %r from sender %r""" %(
+                signal,
+                sender
+            )
+        )
+    try:
+        # also removes from receivers
+        _removeOldBackRefs(senderkey, signal, receiver, receivers)
+    except ValueError:
+        raise errors.DispatcherKeyError(
+            """No connection to receiver %s for signal %s from sender %s""" %(
+                receiver,
+                signal,
+                sender
+            )
+        )
+    _cleanupConnections(senderkey, signal)
+
+def getReceivers( sender = Any, signal = Any ):
+    """Get list of receivers from global tables
+
+    This utility function allows you to retrieve the
+    raw list of receivers from the connections table
+    for the given sender and signal pair.
+
+    Note:
+        there is no guarantee that this is the actual list
+        stored in the connections table, so the value
+        should be treated as a simple iterable/truth value
+        rather than, for instance a list to which you
+        might append new records.
+
+    Normally you would use liveReceivers( getReceivers( ...))
+    to retrieve the actual receiver objects as an iterable
+    object.
+    """
+    try:
+        return connections[id(sender)][signal]
+    except KeyError:
+        return []
+
+def liveReceivers(receivers):
+    """Filter sequence of receivers to get resolved, live receivers
+
+    This is a generator which will iterate over
+    the passed sequence, checking for weak references
+    and resolving them, then returning all live
+    receivers.
+    """
+    for receiver in receivers:
+        if isinstance( receiver, WEAKREF_TYPES):
+            # Dereference the weak reference.
+            receiver = receiver()
+            if receiver is not None:
+                yield receiver
+        else:
+            yield receiver
+
+
+
+def getAllReceivers( sender = Any, signal = Any ):
+    """Get list of all receivers from global tables
+
+    This gets all receivers which should receive
+    the given signal from sender, each receiver should
+    be produced only once by the resulting generator
+    """
+    receivers = {}
+    for set in (
+        # Get receivers that receive *this* signal from *this* sender.
+        getReceivers( sender, signal ),
+        # Add receivers that receive *any* signal from *this* sender.
+        getReceivers( sender, Any ),
+        # Add receivers that receive *this* signal from *any* sender.
+        getReceivers( Any, signal ),
+        # Add receivers that receive *any* signal from *any* sender.
+        getReceivers( Any, Any ),
+    ):
+        for receiver in set:
+            if receiver: # filter out dead instance-method weakrefs
+                try:
+                    if not receivers.has_key( receiver ):
+                        receivers[receiver] = 1
+                        yield receiver
+                except TypeError:
+                    # dead weakrefs raise TypeError on hash...
+                    pass
+
+def send(signal=Any, sender=Anonymous, *arguments, **named):
+    """Send signal from sender to all connected receivers.
+    
+    signal -- (hashable) signal value, see connect for details
+
+    sender -- the sender of the signal
+    
+        if Any, only receivers registered for Any will receive
+        the message.
+
+        if Anonymous, only receivers registered to receive
+        messages from Anonymous or Any will receive the message
+
+        Otherwise can be any python object (normally one
+        registered with a connect if you actually want
+        something to occur).
+
+    arguments -- positional arguments which will be passed to
+        *all* receivers. Note that this may raise TypeErrors
+        if the receivers do not allow the particular arguments.
+        Note also that arguments are applied before named
+        arguments, so they should be used with care.
+
+    named -- named arguments which will be filtered according
+        to the parameters of the receivers to only provide those
+        acceptable to the receiver.
+
+    Return a list of tuple pairs [(receiver, response), ... ]
+
+    if any receiver raises an error, the error propagates back
+    through send, terminating the dispatch loop, so it is quite
+    possible to not have all receivers called if a raises an
+    error.
+    """
+    # Call each receiver with whatever arguments it can accept.
+    # Return a list of tuple pairs [(receiver, response), ... ].
+    responses = []
+    for receiver in liveReceivers(getAllReceivers(sender, signal)):
+        response = robustapply.robustApply(
+            receiver,
+            signal=signal,
+            sender=sender,
+            *arguments,
+            **named
+        )
+        responses.append((receiver, response))
+    return responses
+def sendExact( signal=Any, sender=Anonymous, *arguments, **named ):
+    """Send signal only to those receivers registered for exact message
+
+    sendExact allows for avoiding Any/Anonymous registered
+    handlers, sending only to those receivers explicitly
+    registered for a particular signal on a particular
+    sender.
+    """
+    responses = []
+    for receiver in liveReceivers(getReceivers(sender, signal)):
+        response = robustapply.robustApply(
+            receiver,
+            signal=signal,
+            sender=sender,
+            *arguments,
+            **named
+        )
+        responses.append((receiver, response))
+    return responses
+    
+
+def _removeReceiver(receiver):
+    """Remove receiver from connections."""
+    if not sendersBack:
+        # During module cleanup the mapping will be replaced with None
+        return False
+    backKey = id(receiver)
+    for senderkey in sendersBack.get(backKey,()):
+        try:
+            signals = connections[senderkey].keys()
+        except KeyError,err:
+            pass
+        else:
+            for signal in signals:
+                try:
+                    receivers = connections[senderkey][signal]
+                except KeyError:
+                    pass
+                else:
+                    try:
+                        receivers.remove( receiver )
+                    except Exception, err:
+                        pass
+                _cleanupConnections(senderkey, signal)
+    try:
+        del sendersBack[ backKey ]
+    except KeyError:
+        pass
+            
+def _cleanupConnections(senderkey, signal):
+    """Delete any empty signals for senderkey. Delete senderkey if empty."""
+    try:
+        receivers = connections[senderkey][signal]
+    except:
+        pass
+    else:
+        if not receivers:
+            # No more connected receivers. Therefore, remove the signal.
+            try:
+                signals = connections[senderkey]
+            except KeyError:
+                pass
+            else:
+                del signals[signal]
+                if not signals:
+                    # No more signal connections. Therefore, remove the sender.
+                    _removeSender(senderkey)
+
+def _removeSender(senderkey):
+    """Remove senderkey from connections."""
+    _removeBackrefs(senderkey)
+    try:
+        del connections[senderkey]
+    except KeyError:
+        pass
+    # Senderkey will only be in senders dictionary if sender 
+    # could be weakly referenced.
+    try: 
+        del senders[senderkey]
+    except: 
+        pass
+
+
+def _removeBackrefs( senderkey):
+    """Remove all back-references to this senderkey"""
+    try:
+        signals = connections[senderkey]
+    except KeyError:
+        signals = None
+    else:
+        items = signals.items()
+        def allReceivers( ):
+            for signal,set in items:
+                for item in set:
+                    yield item
+        for receiver in allReceivers():
+            _killBackref( receiver, senderkey )
+
+def _removeOldBackRefs(senderkey, signal, receiver, receivers):
+    """Kill old sendersBack references from receiver
+
+    This guards against multiple registration of the same
+    receiver for a given signal and sender leaking memory
+    as old back reference records build up.
+
+    Also removes old receiver instance from receivers
+    """
+    try:
+        index = receivers.index(receiver)
+        # need to scan back references here and remove senderkey
+    except ValueError:
+        return False
+    else:
+        oldReceiver = receivers[index]
+        del receivers[index]
+        found = 0
+        signals = connections.get(signal)
+        if signals is not None:
+            for sig,recs in connections.get(signal,{}).iteritems():
+                if sig != signal:
+                    for rec in recs:
+                        if rec is oldReceiver:
+                            found = 1
+                            break
+        if not found:
+            _killBackref( oldReceiver, senderkey )
+            return True
+        return False
+        
+        
+def _killBackref( receiver, senderkey ):
+    """Do the actual removal of back reference from receiver to senderkey"""
+    receiverkey = id(receiver)
+    set = sendersBack.get( receiverkey, () )
+    while senderkey in set:
+        try:
+            set.remove( senderkey )
+        except:
+            break
+    if not set:
+        try:
+            del sendersBack[ receiverkey ]
+        except KeyError:
+            pass
+    return True

Added: vendor/django/current/django/dispatch/errors.py
===================================================================
--- vendor/django/current/django/dispatch/errors.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/dispatch/errors.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+"""Error types for dispatcher mechanism
+"""
+
+class DispatcherError(Exception):
+    """Base class for all Dispatcher errors"""
+class DispatcherKeyError(KeyError, DispatcherError):
+    """Error raised when unknown (sender,signal) set specified"""
+class DispatcherTypeError(TypeError, DispatcherError):
+    """Error raised when inappropriate signal-type specified (None)"""
+

Added: vendor/django/current/django/dispatch/license.txt
===================================================================
--- vendor/django/current/django/dispatch/license.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/dispatch/license.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,34 @@
+PyDispatcher License
+
+    Copyright (c) 2001-2003, Patrick K. O'Brien and Contributors
+    All rights reserved.
+    
+    Redistribution and use in source and binary forms, with or without
+    modification, are permitted provided that the following conditions
+    are met:
+    
+        Redistributions of source code must retain the above copyright
+        notice, this list of conditions and the following disclaimer.
+    
+        Redistributions in binary form must reproduce the above
+        copyright notice, this list of conditions and the following
+        disclaimer in the documentation and/or other materials
+        provided with the distribution.
+    
+        The name of Patrick K. O'Brien, or the name of any Contributor,
+        may not be used to endorse or promote products derived from this 
+        software without specific prior written permission.
+    
+    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+    ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+    LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+    FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+    COPYRIGHT HOLDERS AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+    INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+    (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+    HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+    STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+    OF THE POSSIBILITY OF SUCH DAMAGE. 
+

Added: vendor/django/current/django/dispatch/robust.py
===================================================================
--- vendor/django/current/django/dispatch/robust.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/dispatch/robust.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,57 @@
+"""Module implementing error-catching version of send (sendRobust)"""
+from django.dispatch.dispatcher import Any, Anonymous, liveReceivers, getAllReceivers
+from django.dispatch.robustapply import robustApply
+
+def sendRobust(
+    signal=Any, 
+    sender=Anonymous, 
+    *arguments, **named
+):
+    """Send signal from sender to all connected receivers catching errors
+    
+    signal -- (hashable) signal value, see connect for details
+
+    sender -- the sender of the signal
+    
+        if Any, only receivers registered for Any will receive
+        the message.
+
+        if Anonymous, only receivers registered to receive
+        messages from Anonymous or Any will receive the message
+
+        Otherwise can be any python object (normally one
+        registered with a connect if you actually want
+        something to occur).
+
+    arguments -- positional arguments which will be passed to
+        *all* receivers. Note that this may raise TypeErrors
+        if the receivers do not allow the particular arguments.
+        Note also that arguments are applied before named
+        arguments, so they should be used with care.
+
+    named -- named arguments which will be filtered according
+        to the parameters of the receivers to only provide those
+        acceptable to the receiver.
+
+    Return a list of tuple pairs [(receiver, response), ... ]
+
+    if any receiver raises an error (specifically any subclass of Exception),
+    the error instance is returned as the result for that receiver.
+    """
+    # Call each receiver with whatever arguments it can accept.
+    # Return a list of tuple pairs [(receiver, response), ... ].
+    responses = []
+    for receiver in liveReceivers(getAllReceivers(sender, signal)):
+        try:
+            response = robustApply(
+                receiver,
+                signal=signal,
+                sender=sender,
+                *arguments,
+                **named
+            )
+        except Exception, err:
+            responses.append((receiver, err))
+        else:
+            responses.append((receiver, response))
+    return responses

Added: vendor/django/current/django/dispatch/robustapply.py
===================================================================
--- vendor/django/current/django/dispatch/robustapply.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/dispatch/robustapply.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,47 @@
+"""Robust apply mechanism
+
+Provides a function "call", which can sort out
+what arguments a given callable object can take,
+and subset the given arguments to match only
+those which are acceptable.
+"""
+
+def function( receiver ):
+    """Get function-like callable object for given receiver
+
+    returns (function_or_method, codeObject, fromMethod)
+
+    If fromMethod is true, then the callable already
+    has its first argument bound
+    """
+    if hasattr(receiver, '__call__'):
+        # receiver is a class instance; assume it is callable.
+        # Reassign receiver to the actual method that will be called.
+        if hasattr( receiver.__call__, 'im_func') or hasattr( receiver.__call__, 'im_code'):
+            receiver = receiver.__call__
+    if hasattr( receiver, 'im_func' ):
+        # an instance-method...
+        return receiver, receiver.im_func.func_code, 1
+    elif not hasattr( receiver, 'func_code'):
+        raise ValueError('unknown reciever type %s %s'%(receiver, type(receiver)))
+    return receiver, receiver.func_code, 0
+
+def robustApply(receiver, *arguments, **named):
+    """Call receiver with arguments and an appropriate subset of named
+    """
+    receiver, codeObject, startIndex = function( receiver )
+    acceptable = codeObject.co_varnames[startIndex+len(arguments):codeObject.co_argcount]
+    for name in codeObject.co_varnames[startIndex:startIndex+len(arguments)]:
+        if named.has_key( name ):
+            raise TypeError(
+                """Argument %r specified both positionally and as a keyword for calling %r"""% (
+                    name, receiver,
+                )
+            )
+    if not (codeObject.co_flags & 8):
+        # fc does not have a **kwds type parameter, therefore 
+        # remove unacceptable arguments.
+        for arg in named.keys():
+            if arg not in acceptable:
+                del named[arg]
+    return receiver(*arguments, **named)

Added: vendor/django/current/django/dispatch/saferef.py
===================================================================
--- vendor/django/current/django/dispatch/saferef.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/dispatch/saferef.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,165 @@
+"""Refactored "safe reference" from dispatcher.py"""
+import weakref, traceback
+
+def safeRef(target, onDelete = None):
+    """Return a *safe* weak reference to a callable target
+
+    target -- the object to be weakly referenced, if it's a
+        bound method reference, will create a BoundMethodWeakref,
+        otherwise creates a simple weakref.
+    onDelete -- if provided, will have a hard reference stored
+        to the callable to be called after the safe reference
+        goes out of scope with the reference object, (either a
+        weakref or a BoundMethodWeakref) as argument.
+    """
+    if hasattr(target, 'im_self'):
+        if target.im_self is not None:
+            # Turn a bound method into a BoundMethodWeakref instance.
+            # Keep track of these instances for lookup by disconnect().
+            assert hasattr(target, 'im_func'), """safeRef target %r has im_self, but no im_func, don't know how to create reference"""%( target,)
+            reference = BoundMethodWeakref(
+                target=target,
+                onDelete=onDelete
+            )
+            return reference
+    if callable(onDelete):
+        return weakref.ref(target, onDelete)
+    else:
+        return weakref.ref( target )
+
+class BoundMethodWeakref(object):
+    """'Safe' and reusable weak references to instance methods
+
+    BoundMethodWeakref objects provide a mechanism for
+    referencing a bound method without requiring that the
+    method object itself (which is normally a transient
+    object) is kept alive.  Instead, the BoundMethodWeakref
+    object keeps weak references to both the object and the
+    function which together define the instance method.
+
+    Attributes:
+        key -- the identity key for the reference, calculated
+            by the class's calculateKey method applied to the
+            target instance method
+        deletionMethods -- sequence of callable objects taking
+            single argument, a reference to this object which
+            will be called when *either* the target object or
+            target function is garbage collected (i.e. when
+            this object becomes invalid).  These are specified
+            as the onDelete parameters of safeRef calls.
+        weakSelf -- weak reference to the target object
+        weakFunc -- weak reference to the target function
+
+    Class Attributes:
+        _allInstances -- class attribute pointing to all live
+            BoundMethodWeakref objects indexed by the class's
+            calculateKey(target) method applied to the target
+            objects.  This weak value dictionary is used to
+            short-circuit creation so that multiple references
+            to the same (object, function) pair produce the
+            same BoundMethodWeakref instance.
+
+    """
+    _allInstances = weakref.WeakValueDictionary()
+    def __new__( cls, target, onDelete=None, *arguments,**named ):
+        """Create new instance or return current instance
+
+        Basically this method of construction allows us to
+        short-circuit creation of references to already-
+        referenced instance methods.  The key corresponding
+        to the target is calculated, and if there is already
+        an existing reference, that is returned, with its
+        deletionMethods attribute updated.  Otherwise the
+        new instance is created and registered in the table
+        of already-referenced methods.
+        """
+        key = cls.calculateKey(target)
+        current =cls._allInstances.get(key)
+        if current is not None:
+            current.deletionMethods.append( onDelete)
+            return current
+        else:
+            base = super( BoundMethodWeakref, cls).__new__( cls )
+            cls._allInstances[key] = base
+            base.__init__( target, onDelete, *arguments,**named)
+            return base
+    def __init__(self, target, onDelete=None):
+        """Return a weak-reference-like instance for a bound method
+
+        target -- the instance-method target for the weak
+            reference, must have im_self and im_func attributes
+            and be reconstructable via:
+                target.im_func.__get__( target.im_self )
+            which is true of built-in instance methods.
+        onDelete -- optional callback which will be called
+            when this weak reference ceases to be valid
+            (i.e. either the object or the function is garbage
+            collected).  Should take a single argument,
+            which will be passed a pointer to this object.
+        """
+        def remove(weak, self=self):
+            """Set self.isDead to true when method or instance is destroyed"""
+            methods = self.deletionMethods[:]
+            del self.deletionMethods[:]
+            try:
+                del self.__class__._allInstances[ self.key ]
+            except KeyError:
+                pass
+            for function in methods:
+                try:
+                    if callable( function ):
+                        function( self )
+                except Exception, e:
+                    try:
+                        traceback.print_exc()
+                    except AttributeError, err:
+                        print '''Exception during saferef %s cleanup function %s: %s'''%(
+                            self, function, e
+                        )
+        self.deletionMethods = [onDelete]
+        self.key = self.calculateKey( target )
+        self.weakSelf = weakref.ref(target.im_self, remove)
+        self.weakFunc = weakref.ref(target.im_func, remove)
+        self.selfName = str(target.im_self)
+        self.funcName = str(target.im_func.__name__)
+    def calculateKey( cls, target ):
+        """Calculate the reference key for this reference
+
+        Currently this is a two-tuple of the id()'s of the
+        target object and the target function respectively.
+        """
+        return (id(target.im_self),id(target.im_func))
+    calculateKey = classmethod( calculateKey )
+    def __str__(self):
+        """Give a friendly representation of the object"""
+        return """%s( %s.%s )"""%(
+            self.__class__.__name__,
+            self.selfName,
+            self.funcName,
+        )
+    __repr__ = __str__
+    def __nonzero__( self ):
+        """Whether we are still a valid reference"""
+        return self() is not None
+    def __cmp__( self, other ):
+        """Compare with another reference"""
+        if not isinstance (other,self.__class__):
+            return cmp( self.__class__, type(other) )
+        return cmp( self.key, other.key)
+    def __call__(self):
+        """Return a strong reference to the bound method
+
+        If the target cannot be retrieved, then will
+        return None, otherwise returns a bound instance
+        method for our object and function.
+
+        Note:
+            You may call this method any number of times,
+            as it does not invalidate the reference.
+        """
+        target = self.weakSelf()
+        if target is not None:
+            function = self.weakFunc()
+            if function is not None:
+                return function.__get__(target)
+        return None

Added: vendor/django/current/django/forms/__init__.py
===================================================================
--- vendor/django/current/django/forms/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/forms/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,995 @@
+from django.core import validators
+from django.core.exceptions import PermissionDenied
+from django.utils.html import escape
+from django.conf import settings
+from django.utils.translation import gettext, gettext_lazy, ngettext
+
+FORM_FIELD_ID_PREFIX = 'id_'
+
+class EmptyValue(Exception):
+    "This is raised when empty data is provided"
+    pass
+
+class Manipulator(object):
+    # List of permission strings. User must have at least one to manipulate.
+    # None means everybody has permission.
+    required_permission = ''
+
+    def __init__(self):
+        # List of FormField objects
+        self.fields = []
+
+    def __getitem__(self, field_name):
+        "Looks up field by field name; raises KeyError on failure"
+        for field in self.fields:
+            if field.field_name == field_name:
+                return field
+        raise KeyError, "Field %s not found\n%s" % (field_name, repr(self.fields))
+
+    def __delitem__(self, field_name):
+        "Deletes the field with the given field name; raises KeyError on failure"
+        for i, field in enumerate(self.fields):
+            if field.field_name == field_name:
+                del self.fields[i]
+                return
+        raise KeyError, "Field %s not found" % field_name
+
+    def check_permissions(self, user):
+        """Confirms user has required permissions to use this manipulator; raises
+        PermissionDenied on failure."""
+        if self.required_permission is None:
+            return
+        if user.has_perm(self.required_permission):
+            return
+        raise PermissionDenied
+
+    def prepare(self, new_data):
+        """
+        Makes any necessary preparations to new_data, in place, before data has
+        been validated.
+        """
+        for field in self.fields:
+            field.prepare(new_data)
+
+    def get_validation_errors(self, new_data):
+        "Returns dictionary mapping field_names to error-message lists"
+        errors = {}
+        for field in self.fields:
+            errors.update(field.get_validation_errors(new_data))
+            val_name = 'validate_%s' % field.field_name
+            if hasattr(self, val_name):
+                val = getattr(self, val_name)
+                try:
+                    field.run_validator(new_data, val)
+                except (validators.ValidationError, validators.CriticalValidationError), e:
+                    errors.setdefault(field.field_name, []).extend(e.messages)
+
+#            if field.is_required and not new_data.get(field.field_name, False):
+#                errors.setdefault(field.field_name, []).append(gettext_lazy('This field is required.'))
+#                continue
+#            try:
+#                validator_list = field.validator_list
+#                if hasattr(self, 'validate_%s' % field.field_name):
+#                    validator_list.append(getattr(self, 'validate_%s' % field.field_name))
+#                for validator in validator_list:
+#                    if field.is_required or new_data.get(field.field_name, False) or hasattr(validator, 'always_test'):
+#                        try:
+#                            if hasattr(field, 'requires_data_list'):
+#                                validator(new_data.getlist(field.field_name), new_data)
+#                            else:
+#                                validator(new_data.get(field.field_name, ''), new_data)
+#                        except validators.ValidationError, e:
+#                            errors.setdefault(field.field_name, []).extend(e.messages)
+#            # If a CriticalValidationError is raised, ignore any other ValidationErrors
+#            # for this particular field
+#            except validators.CriticalValidationError, e:
+#                errors.setdefault(field.field_name, []).extend(e.messages)
+        return errors
+
+    def save(self, new_data):
+        "Saves the changes and returns the new object"
+        # changes is a dictionary-like object keyed by field_name
+        raise NotImplementedError
+
+    def do_html2python(self, new_data):
+        """
+        Convert the data from HTML data types to Python datatypes, changing the
+        object in place. This happens after validation but before storage. This
+        must happen after validation because html2python functions aren't
+        expected to deal with invalid input.
+        """
+        for field in self.fields:
+            field.convert_post_data(new_data)
+
+class FormWrapper(object):
+    """
+    A wrapper linking a Manipulator to the template system.
+    This allows dictionary-style lookups of formfields. It also handles feeding
+    prepopulated data and validation error messages to the formfield objects.
+    """
+    def __init__(self, manipulator, data, error_dict, edit_inline=True):
+        self.manipulator, self.data = manipulator, data
+        self.error_dict = error_dict
+        self._inline_collections = None
+        self.edit_inline = edit_inline
+
+    def __repr__(self):
+        return repr(self.__dict__)
+
+    def __getitem__(self, key):
+        for field in self.manipulator.fields:
+            if field.field_name == key:
+                data = field.extract_data(self.data)
+                return FormFieldWrapper(field, data, self.error_dict.get(field.field_name, []))
+        if self.edit_inline:
+            self.fill_inline_collections()
+            for inline_collection in self._inline_collections:
+                if inline_collection.name == key:
+                    return inline_collection
+        raise KeyError, "Could not find Formfield or InlineObjectCollection named %r" % key
+
+    def fill_inline_collections(self):
+        if not self._inline_collections:
+            ic = []
+            related_objects = self.manipulator.get_related_objects()
+            for rel_obj in related_objects:
+                data = rel_obj.extract_data(self.data)
+                inline_collection = InlineObjectCollection(self.manipulator, rel_obj, data, self.error_dict)
+                ic.append(inline_collection)
+            self._inline_collections = ic
+
+    def has_errors(self):
+        return self.error_dict != {}
+
+    def _get_fields(self):
+        try:
+            return self._fields
+        except AttributeError:
+            self._fields = [self.__getitem__(field.field_name) for field in self.manipulator.fields]
+            return self._fields
+
+    fields = property(_get_fields)
+
+class FormFieldWrapper(object):
+    "A bridge between the template system and an individual form field. Used by FormWrapper."
+    def __init__(self, formfield, data, error_list):
+        self.formfield, self.data, self.error_list = formfield, data, error_list
+        self.field_name = self.formfield.field_name # for convenience in templates
+
+    def __str__(self):
+        "Renders the field"
+        return str(self.formfield.render(self.data))
+
+    def __repr__(self):
+        return '<FormFieldWrapper for "%s">' % self.formfield.field_name
+
+    def field_list(self):
+        """
+        Like __str__(), but returns a list. Use this when the field's render()
+        method returns a list.
+        """
+        return self.formfield.render(self.data)
+
+    def errors(self):
+        return self.error_list
+
+    def html_error_list(self):
+        if self.errors():
+            return '<ul class="errorlist"><li>%s</li></ul>' % '</li><li>'.join([escape(e) for e in self.errors()])
+        else:
+            return ''
+
+    def get_id(self):
+        return self.formfield.get_id()
+
+class FormFieldCollection(FormFieldWrapper):
+    "A utility class that gives the template access to a dict of FormFieldWrappers"
+    def __init__(self, formfield_dict):
+        self.formfield_dict = formfield_dict
+
+    def __str__(self):
+        return str(self.formfield_dict)
+
+    def __getitem__(self, template_key):
+        "Look up field by template key; raise KeyError on failure"
+        return self.formfield_dict[template_key]
+
+    def __repr__(self):
+        return "<FormFieldCollection: %s>" % self.formfield_dict
+
+    def errors(self):
+        "Returns list of all errors in this collection's formfields"
+        errors = []
+        for field in self.formfield_dict.values():
+            if hasattr(field, 'errors'):
+                errors.extend(field.errors())
+        return errors
+
+    def has_errors(self):
+        return bool(len(self.errors()))
+
+    def html_combined_error_list(self):
+        return ''.join([field.html_error_list() for field in self.formfield_dict.values() if hasattr(field, 'errors')])
+
+class InlineObjectCollection(object):
+    "An object that acts like a sparse list of form field collections."
+    def __init__(self, parent_manipulator, rel_obj, data, errors):
+        self.parent_manipulator = parent_manipulator
+        self.rel_obj = rel_obj
+        self.data = data
+        self.errors = errors
+        self._collections = None
+        self.name = rel_obj.name
+
+    def __len__(self):
+        self.fill()
+        return self._collections.__len__()
+
+    def __getitem__(self, k):
+        self.fill()
+        return self._collections.__getitem__(k)
+
+    def __setitem__(self, k, v):
+        self.fill()
+        return self._collections.__setitem__(k,v)
+
+    def __delitem__(self, k):
+        self.fill()
+        return self._collections.__delitem__(k)
+
+    def __iter__(self):
+        self.fill()
+        return iter(self._collections.values())
+
+    def items(self):
+        self.fill()
+        return self._collections.items()
+
+    def fill(self):
+        if self._collections:
+            return
+        else:
+            var_name = self.rel_obj.opts.object_name.lower()
+            collections = {}
+            orig = None
+            if hasattr(self.parent_manipulator, 'original_object'):
+                orig = self.parent_manipulator.original_object
+            orig_list = self.rel_obj.get_list(orig)
+
+            for i, instance in enumerate(orig_list):
+                collection = {'original': instance}
+                for f in self.rel_obj.editable_fields():
+                    for field_name in f.get_manipulator_field_names(''):
+                        full_field_name = '%s.%d.%s' % (var_name, i, field_name)
+                        field = self.parent_manipulator[full_field_name]
+                        data = field.extract_data(self.data)
+                        errors = self.errors.get(full_field_name, [])
+                        collection[field_name] = FormFieldWrapper(field, data, errors)
+                collections[i] = FormFieldCollection(collection)
+            self._collections = collections
+
+
+class FormField(object):
+    """Abstract class representing a form field.
+
+    Classes that extend FormField should define the following attributes:
+        field_name
+            The field's name for use by programs.
+        validator_list
+            A list of validation tests (callback functions) that the data for
+            this field must pass in order to be added or changed.
+        is_required
+            A Boolean. Is it a required field?
+    Subclasses should also implement a render(data) method, which is responsible
+    for rending the form field in XHTML.
+    """
+    def __str__(self):
+        return self.render('')
+
+    def __repr__(self):
+        return 'FormField "%s"' % self.field_name
+
+    def prepare(self, new_data):
+        "Hook for doing something to new_data (in place) before validation."
+        pass
+
+    def html2python(data):
+        "Hook for converting an HTML datatype (e.g. 'on' for checkboxes) to a Python type"
+        return data
+    html2python = staticmethod(html2python)
+
+    def render(self, data):
+        raise NotImplementedError
+
+    def get_member_name(self):
+        if hasattr(self, 'member_name'):
+            return self.member_name
+        else:
+            return self.field_name
+
+    def extract_data(self, data_dict):
+        if hasattr(self, 'requires_data_list') and hasattr(data_dict, 'getlist'):
+            data = data_dict.getlist(self.get_member_name())
+        else:
+            data = data_dict.get(self.get_member_name(), None)
+        if data is None:
+            data = ''
+        return data
+
+    def convert_post_data(self, new_data):
+        name = self.get_member_name()
+        if new_data.has_key(self.field_name):
+            d = new_data.getlist(self.field_name)
+            try:
+                converted_data = [self.__class__.html2python(data) for data in d]
+            except ValueError:
+                converted_data = d
+            new_data.setlist(name, converted_data)
+        else:
+            try:
+                #individual fields deal with None values themselves
+                new_data.setlist(name, [self.__class__.html2python(None)])
+            except EmptyValue:
+                new_data.setlist(name, [])
+
+
+    def run_validator(self, new_data, validator):
+        if self.is_required or new_data.get(self.field_name, False) or hasattr(validator, 'always_test'):
+            if hasattr(self, 'requires_data_list'):
+                validator(new_data.getlist(self.field_name), new_data)
+            else:
+                validator(new_data.get(self.field_name, ''), new_data)
+
+    def get_validation_errors(self, new_data):
+        errors = {}
+        if self.is_required and not new_data.get(self.field_name, False):
+            errors.setdefault(self.field_name, []).append(gettext_lazy('This field is required.'))
+            return errors
+        try:
+            for validator in self.validator_list:
+                try:
+                    self.run_validator(new_data, validator)
+                except validators.ValidationError, e:
+                    errors.setdefault(self.field_name, []).extend(e.messages)
+        # If a CriticalValidationError is raised, ignore any other ValidationErrors
+        # for this particular field
+        except validators.CriticalValidationError, e:
+            errors.setdefault(self.field_name, []).extend(e.messages)
+        return errors
+
+    def get_id(self):
+        "Returns the HTML 'id' attribute for this form field."
+        return FORM_FIELD_ID_PREFIX + self.field_name
+
+####################
+# GENERIC WIDGETS  #
+####################
+
+class TextField(FormField):
+    input_type = "text"
+    def __init__(self, field_name, length=30, maxlength=None, is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.length, self.maxlength = length, maxlength
+        self.is_required = is_required
+        self.validator_list = [self.isValidLength, self.hasNoNewlines] + validator_list
+        if member_name != None:
+            self.member_name = member_name
+
+    def isValidLength(self, data, form):
+        if data and self.maxlength and len(data.decode(settings.DEFAULT_CHARSET)) > self.maxlength:
+            raise validators.ValidationError, ngettext("Ensure your text is less than %s character.",
+                "Ensure your text is less than %s characters.", self.maxlength) % self.maxlength
+
+    def hasNoNewlines(self, data, form):
+        if data and '\n' in data:
+            raise validators.ValidationError, gettext("Line breaks are not allowed here.")
+
+    def render(self, data):
+        if data is None:
+            data = ''
+        maxlength = ''
+        if self.maxlength:
+            maxlength = 'maxlength="%s" ' % self.maxlength
+        if isinstance(data, unicode):
+            data = data.encode(settings.DEFAULT_CHARSET)
+        return '<input type="%s" id="%s" class="v%s%s" name="%s" size="%s" value="%s" %s/>' % \
+            (self.input_type, self.get_id(), self.__class__.__name__, self.is_required and ' required' or '',
+            self.field_name, self.length, escape(data), maxlength)
+
+    def html2python(data):
+        return data
+    html2python = staticmethod(html2python)
+
+class PasswordField(TextField):
+    input_type = "password"
+
+class LargeTextField(TextField):
+    def __init__(self, field_name, rows=10, cols=40, is_required=False, validator_list=None, maxlength=None):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.rows, self.cols, self.is_required = rows, cols, is_required
+        self.validator_list = validator_list[:]
+        if maxlength:
+            self.validator_list.append(self.isValidLength)
+            self.maxlength = maxlength
+
+    def render(self, data):
+        if data is None:
+            data = ''
+        if isinstance(data, unicode):
+            data = data.encode(settings.DEFAULT_CHARSET)
+        return '<textarea id="%s" class="v%s%s" name="%s" rows="%s" cols="%s">%s</textarea>' % \
+            (self.get_id(), self.__class__.__name__, self.is_required and ' required' or '',
+            self.field_name, self.rows, self.cols, escape(data))
+
+class HiddenField(FormField):
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        self.field_name, self.is_required = field_name, is_required
+        self.validator_list = validator_list[:]
+
+    def render(self, data):
+        return '<input type="hidden" id="%s" name="%s" value="%s" />' % \
+            (self.get_id(), self.field_name, escape(data))
+
+class CheckboxField(FormField):
+    def __init__(self, field_name, checked_by_default=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.checked_by_default = checked_by_default
+        self.is_required = False # because the validator looks for these
+        self.validator_list = validator_list[:]
+
+    def render(self, data):
+        checked_html = ''
+        if data or (data is '' and self.checked_by_default):
+            checked_html = ' checked="checked"'
+        return '<input type="checkbox" id="%s" class="v%s" name="%s"%s />' % \
+            (self.get_id(), self.__class__.__name__,
+            self.field_name, checked_html)
+
+    def html2python(data):
+        "Convert value from browser ('on' or '') to a Python boolean"
+        if data == 'on':
+            return True
+        return False
+    html2python = staticmethod(html2python)
+
+class SelectField(FormField):
+    def __init__(self, field_name, choices=None, size=1, is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        if choices is None: choices = []
+        self.field_name = field_name
+        # choices is a list of (value, human-readable key) tuples because order matters
+        self.choices, self.size, self.is_required = choices, size, is_required
+        self.validator_list = [self.isValidChoice] + validator_list
+        if member_name != None:
+            self.member_name = member_name
+
+    def render(self, data):
+        output = ['<select id="%s" class="v%s%s" name="%s" size="%s">' % \
+            (self.get_id(), self.__class__.__name__,
+             self.is_required and ' required' or '', self.field_name, self.size)]
+        str_data = str(data) # normalize to string
+        for value, display_name in self.choices:
+            selected_html = ''
+            if str(value) == str_data:
+                selected_html = ' selected="selected"'
+            output.append('    <option value="%s"%s>%s</option>' % (escape(value), selected_html, escape(display_name)))
+        output.append('  </select>')
+        return '\n'.join(output)
+
+    def isValidChoice(self, data, form):
+        str_data = str(data)
+        str_choices = [str(item[0]) for item in self.choices]
+        if str_data not in str_choices:
+            raise validators.ValidationError, gettext("Select a valid choice; '%(data)s' is not in %(choices)s.") % {'data': str_data, 'choices': str_choices}
+
+class NullSelectField(SelectField):
+    "This SelectField converts blank fields to None"
+    def html2python(data):
+        if not data:
+            return None
+        return data
+    html2python = staticmethod(html2python)
+
+class RadioSelectField(FormField):
+    def __init__(self, field_name, choices=None, ul_class='', is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        if choices is None: choices = []
+        self.field_name = field_name
+        # choices is a list of (value, human-readable key) tuples because order matters
+        self.choices, self.is_required = choices, is_required
+        self.validator_list = [self.isValidChoice] + validator_list
+        self.ul_class = ul_class
+        if member_name != None:
+            self.member_name = member_name
+
+    def render(self, data):
+        """
+        Returns a special object, RadioFieldRenderer, that is iterable *and*
+        has a default str() rendered output.
+
+        This allows for flexible use in templates. You can just use the default
+        rendering:
+
+            {{ field_name }}
+
+        ...which will output the radio buttons in an unordered list.
+        Or, you can manually traverse each radio option for special layout:
+
+            {% for option in field_name.field_list %}
+                {{ option.field }} {{ option.label }}<br />
+            {% endfor %}
+        """
+        class RadioFieldRenderer:
+            def __init__(self, datalist, ul_class):
+                self.datalist, self.ul_class = datalist, ul_class
+            def __str__(self):
+                "Default str() output for this radio field -- a <ul>"
+                output = ['<ul%s>' % (self.ul_class and ' class="%s"' % self.ul_class or '')]
+                output.extend(['<li>%s %s</li>' % (d['field'], d['label']) for d in self.datalist])
+                output.append('</ul>')
+                return ''.join(output)
+            def __iter__(self):
+                for d in self.datalist:
+                    yield d
+            def __len__(self):
+                return len(self.datalist)
+        datalist = []
+        str_data = str(data) # normalize to string
+        for i, (value, display_name) in enumerate(self.choices):
+            selected_html = ''
+            if str(value) == str_data:
+                selected_html = ' checked="checked"'
+            datalist.append({
+                'value': value,
+                'name': display_name,
+                'field': '<input type="radio" id="%s" name="%s" value="%s"%s/>' % \
+                    (self.get_id() + '_' + str(i), self.field_name, value, selected_html),
+                'label': '<label for="%s">%s</label>' % \
+                    (self.get_id() + '_' + str(i), display_name),
+            })
+        return RadioFieldRenderer(datalist, self.ul_class)
+
+    def isValidChoice(self, data, form):
+        str_data = str(data)
+        str_choices = [str(item[0]) for item in self.choices]
+        if str_data not in str_choices:
+            raise validators.ValidationError, gettext("Select a valid choice; '%(data)s' is not in %(choices)s.") % {'data':str_data, 'choices':str_choices}
+
+class NullBooleanField(SelectField):
+    "This SelectField provides 'Yes', 'No' and 'Unknown', mapping results to True, False or None"
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        SelectField.__init__(self, field_name, choices=[('1', 'Unknown'), ('2', 'Yes'), ('3', 'No')],
+            is_required=is_required, validator_list=validator_list)
+
+    def render(self, data):
+        if data is None: data = '1'
+        elif data == True: data = '2'
+        elif data == False: data = '3'
+        return SelectField.render(self, data)
+
+    def html2python(data):
+        return {None: None, '1': None, '2': True, '3': False}[data]
+    html2python = staticmethod(html2python)
+
+class SelectMultipleField(SelectField):
+    requires_data_list = True
+    def render(self, data):
+        output = ['<select id="%s" class="v%s%s" name="%s" size="%s" multiple="multiple">' % \
+            (self.get_id(), self.__class__.__name__, self.is_required and ' required' or '',
+            self.field_name, self.size)]
+        str_data_list = map(str, data) # normalize to strings
+        for value, choice in self.choices:
+            selected_html = ''
+            if str(value) in str_data_list:
+                selected_html = ' selected="selected"'
+            output.append('    <option value="%s"%s>%s</option>' % (escape(value), selected_html, escape(choice)))
+        output.append('  </select>')
+        return '\n'.join(output)
+
+    def isValidChoice(self, field_data, all_data):
+        # data is something like ['1', '2', '3']
+        str_choices = [str(item[0]) for item in self.choices]
+        for val in map(str, field_data):
+            if val not in str_choices:
+                raise validators.ValidationError, gettext("Select a valid choice; '%(data)s' is not in %(choices)s.") % {'data':val, 'choices':str_choices}
+
+    def html2python(data):
+        if data is None:
+            raise EmptyValue
+        return data
+    html2python = staticmethod(html2python)
+
+class CheckboxSelectMultipleField(SelectMultipleField):
+    """
+    This has an identical interface to SelectMultipleField, except the rendered
+    widget is different. Instead of a <select multiple>, this widget outputs a
+    <ul> of <input type="checkbox">es.
+
+    Of course, that results in multiple form elements for the same "single"
+    field, so this class's prepare() method flattens the split data elements
+    back into the single list that validators, renderers and save() expect.
+    """
+    requires_data_list = True
+    def __init__(self, field_name, choices=None, ul_class='', validator_list=None):
+        if validator_list is None: validator_list = []
+        if choices is None: choices = []
+        self.ul_class = ul_class
+        SelectMultipleField.__init__(self, field_name, choices, size=1, is_required=False, validator_list=validator_list)
+
+    def prepare(self, new_data):
+        # new_data has "split" this field into several fields, so flatten it
+        # back into a single list.
+        data_list = []
+        for value, readable_value in self.choices:
+            if new_data.get('%s%s' % (self.field_name, value), '') == 'on':
+                data_list.append(value)
+        new_data.setlist(self.field_name, data_list)
+
+    def render(self, data):
+        output = ['<ul%s>' % (self.ul_class and ' class="%s"' % self.ul_class or '')]
+        str_data_list = map(str, data) # normalize to strings
+        for value, choice in self.choices:
+            checked_html = ''
+            if str(value) in str_data_list:
+                checked_html = ' checked="checked"'
+            field_name = '%s%s' % (self.field_name, value)
+            output.append('<li><input type="checkbox" id="%s" class="v%s" name="%s"%s /> <label for="%s">%s</label></li>' % \
+                (self.get_id() + value , self.__class__.__name__, field_name, checked_html,
+                self.get_id() + value, choice))
+        output.append('</ul>')
+        return '\n'.join(output)
+
+####################
+# FILE UPLOADS     #
+####################
+
+class FileUploadField(FormField):
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        self.field_name, self.is_required = field_name, is_required
+        self.validator_list = [self.isNonEmptyFile] + validator_list
+
+    def isNonEmptyFile(self, field_data, all_data):
+        try:
+            content = field_data['content']
+        except TypeError:
+            raise validators.CriticalValidationError, gettext("No file was submitted. Check the encoding type on the form.")
+        if not content:
+            raise validators.CriticalValidationError, gettext("The submitted file is empty.")
+
+    def render(self, data):
+        return '<input type="file" id="%s" class="v%s" name="%s" />' % \
+            (self.get_id(), self.__class__.__name__, self.field_name)
+
+    def html2python(data):
+        if data is None:
+            raise EmptyValue
+        return data
+    html2python = staticmethod(html2python)
+
+class ImageUploadField(FileUploadField):
+    "A FileUploadField that raises CriticalValidationError if the uploaded file isn't an image."
+    def __init__(self, *args, **kwargs):
+        FileUploadField.__init__(self, *args, **kwargs)
+        self.validator_list.insert(0, self.isValidImage)
+
+    def isValidImage(self, field_data, all_data):
+        try:
+            validators.isValidImage(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+####################
+# INTEGERS/FLOATS  #
+####################
+
+class IntegerField(TextField):
+    def __init__(self, field_name, length=10, maxlength=None, is_required=False, validator_list=None, member_name=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isInteger] + validator_list
+        if member_name is not None:
+            self.member_name = member_name
+        TextField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+
+    def isInteger(self, field_data, all_data):
+        try:
+            validators.isInteger(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        if data == '' or data is None:
+            return None
+        return int(data)
+    html2python = staticmethod(html2python)
+
+class SmallIntegerField(IntegerField):
+    def __init__(self, field_name, length=5, maxlength=5, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isSmallInteger] + validator_list
+        IntegerField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+
+    def isSmallInteger(self, field_data, all_data):
+        if not -32768 <= int(field_data) <= 32767:
+            raise validators.CriticalValidationError, gettext("Enter a whole number between -32,768 and 32,767.")
+
+class PositiveIntegerField(IntegerField):
+    def __init__(self, field_name, length=10, maxlength=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isPositive] + validator_list
+        IntegerField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+
+    def isPositive(self, field_data, all_data):
+        if int(field_data) < 0:
+            raise validators.CriticalValidationError, gettext("Enter a positive number.")
+
+class PositiveSmallIntegerField(IntegerField):
+    def __init__(self, field_name, length=5, maxlength=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isPositiveSmall] + validator_list
+        IntegerField.__init__(self, field_name, length, maxlength, is_required, validator_list)
+
+    def isPositiveSmall(self, field_data, all_data):
+        if not 0 <= int(field_data) <= 32767:
+            raise validators.CriticalValidationError, gettext("Enter a whole number between 0 and 32,767.")
+
+class FloatField(TextField):
+    def __init__(self, field_name, max_digits, decimal_places, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        self.max_digits, self.decimal_places = max_digits, decimal_places
+        validator_list = [self.isValidFloat] + validator_list
+        TextField.__init__(self, field_name, max_digits+1, max_digits+1, is_required, validator_list)
+
+    def isValidFloat(self, field_data, all_data):
+        v = validators.IsValidFloat(self.max_digits, self.decimal_places)
+        try:
+            v(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        if data == '' or data is None:
+            return None
+        return float(data)
+    html2python = staticmethod(html2python)
+
+####################
+# DATES AND TIMES  #
+####################
+
+class DatetimeField(TextField):
+    """A FormField that automatically converts its data to a datetime.datetime object.
+    The data should be in the format YYYY-MM-DD HH:MM:SS."""
+    def __init__(self, field_name, length=30, maxlength=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        self.field_name = field_name
+        self.length, self.maxlength = length, maxlength
+        self.is_required = is_required
+        self.validator_list = [validators.isValidANSIDatetime] + validator_list
+
+    def html2python(data):
+        "Converts the field into a datetime.datetime object"
+        import datetime
+        try:
+            date, time = data.split()
+            y, m, d = date.split('-')
+            timebits = time.split(':')
+            h, mn = timebits[:2]
+            if len(timebits) > 2:
+                s = int(timebits[2])
+            else:
+                s = 0
+            return datetime.datetime(int(y), int(m), int(d), int(h), int(mn), s)
+        except ValueError:
+            return None
+    html2python = staticmethod(html2python)
+
+class DateField(TextField):
+    """A FormField that automatically converts its data to a datetime.date object.
+    The data should be in the format YYYY-MM-DD."""
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidDate] + validator_list
+        TextField.__init__(self, field_name, length=10, maxlength=10,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidDate(self, field_data, all_data):
+        try:
+            validators.isValidANSIDate(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        "Converts the field into a datetime.date object"
+        import time, datetime
+        try:
+            time_tuple = time.strptime(data, '%Y-%m-%d')
+            return datetime.date(*time_tuple[0:3])
+        except (ValueError, TypeError):
+            return None
+    html2python = staticmethod(html2python)
+
+class TimeField(TextField):
+    """A FormField that automatically converts its data to a datetime.time object.
+    The data should be in the format HH:MM:SS or HH:MM:SS.mmmmmm."""
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidTime] + validator_list
+        TextField.__init__(self, field_name, length=8, maxlength=8,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidTime(self, field_data, all_data):
+        try:
+            validators.isValidANSITime(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        "Converts the field into a datetime.time object"
+        import time, datetime
+        try:
+            part_list = data.split('.')
+            try:
+                time_tuple = time.strptime(part_list[0], '%H:%M:%S')
+            except ValueError: # seconds weren't provided
+                time_tuple = time.strptime(part_list[0], '%H:%M')
+            t = datetime.time(*time_tuple[3:6])
+            if (len(part_list) == 2):
+                t = t.replace(microsecond=int(part_list[1]))
+            return t
+        except (ValueError, TypeError, AttributeError):
+            return None
+    html2python = staticmethod(html2python)
+
+####################
+# INTERNET-RELATED #
+####################
+
+class EmailField(TextField):
+    "A convenience FormField for validating e-mail addresses"
+    def __init__(self, field_name, length=50, maxlength=75, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidEmail] + validator_list
+        TextField.__init__(self, field_name, length, maxlength=maxlength,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidEmail(self, field_data, all_data):
+        try:
+            validators.isValidEmail(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+class URLField(TextField):
+    "A convenience FormField for validating URLs"
+    def __init__(self, field_name, length=50, maxlength=200, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidURL] + validator_list
+        TextField.__init__(self, field_name, length=length, maxlength=maxlength,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidURL(self, field_data, all_data):
+        try:
+            validators.isValidURL(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+class IPAddressField(TextField):
+    def __init__(self, field_name, length=15, maxlength=15, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidIPAddress] + validator_list
+        TextField.__init__(self, field_name, length=length, maxlength=maxlength,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidIPAddress(self, field_data, all_data):
+        try:
+            validators.isValidIPAddress4(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        return data or None
+    html2python = staticmethod(html2python)
+
+####################
+# MISCELLANEOUS    #
+####################
+
+class FilePathField(SelectField):
+    "A SelectField whose choices are the files in a given directory."
+    def __init__(self, field_name, path, match=None, recursive=False, is_required=False, validator_list=None):
+        import os
+        from django.db.models import BLANK_CHOICE_DASH
+        if match is not None:
+            import re
+            match_re = re.compile(match)
+        choices = not is_required and BLANK_CHOICE_DASH[:] or []
+        if recursive:
+            for root, dirs, files in os.walk(path):
+                for f in files:
+                    if match is None or match_re.search(f):
+                        choices.append((os.path.join(root, f), f))
+        else:
+            try:
+                for f in os.listdir(path):
+                    full_file = os.path.join(path, f)
+                    if os.path.isfile(full_file) and (match is None or match_re.search(f)):
+                        choices.append((full_file, f))
+            except OSError:
+                pass
+        SelectField.__init__(self, field_name, choices, 1, is_required, validator_list)
+
+class PhoneNumberField(TextField):
+    "A convenience FormField for validating phone numbers (e.g. '630-555-1234')"
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidPhone] + validator_list
+        TextField.__init__(self, field_name, length=12, maxlength=12,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidPhone(self, field_data, all_data):
+        try:
+            validators.isValidPhone(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+class USStateField(TextField):
+    "A convenience FormField for validating U.S. states (e.g. 'IL')"
+    def __init__(self, field_name, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isValidUSState] + validator_list
+        TextField.__init__(self, field_name, length=2, maxlength=2,
+            is_required=is_required, validator_list=validator_list)
+
+    def isValidUSState(self, field_data, all_data):
+        try:
+            validators.isValidUSState(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+    def html2python(data):
+        if data:
+            return data.upper() # Should always be stored in upper case
+        else:
+            return None
+    html2python = staticmethod(html2python)
+
+class CommaSeparatedIntegerField(TextField):
+    "A convenience FormField for validating comma-separated integer fields"
+    def __init__(self, field_name, maxlength=None, is_required=False, validator_list=None):
+        if validator_list is None: validator_list = []
+        validator_list = [self.isCommaSeparatedIntegerList] + validator_list
+        TextField.__init__(self, field_name, length=20, maxlength=maxlength,
+            is_required=is_required, validator_list=validator_list)
+
+    def isCommaSeparatedIntegerList(self, field_data, all_data):
+        try:
+            validators.isCommaSeparatedIntegerList(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages
+
+class RawIdAdminField(CommaSeparatedIntegerField):
+    def html2python(data):
+        return data.split(',')
+    html2python = staticmethod(html2python)
+
+class XMLLargeTextField(LargeTextField):
+    """
+    A LargeTextField with an XML validator. The schema_path argument is the
+    full path to a Relax NG compact schema to validate against.
+    """
+    def __init__(self, field_name, schema_path, **kwargs):
+        self.schema_path = schema_path
+        kwargs.setdefault('validator_list', []).insert(0, self.isValidXML)
+        LargeTextField.__init__(self, field_name, **kwargs)
+
+    def isValidXML(self, field_data, all_data):
+        v = validators.RelaxNGCompact(self.schema_path)
+        try:
+            v(field_data, all_data)
+        except validators.ValidationError, e:
+            raise validators.CriticalValidationError, e.messages

Added: vendor/django/current/django/http/__init__.py
===================================================================
--- vendor/django/current/django/http/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/http/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,296 @@
+import os
+from Cookie import SimpleCookie
+from pprint import pformat
+from urllib import urlencode, quote
+from django.utils.datastructures import MultiValueDict
+
+RESERVED_CHARS="!*'();:@&=+$,/?%#[]"
+
+try:
+    # The mod_python version is more efficient, so try importing it first.
+    from mod_python.util import parse_qsl
+except ImportError:
+    from cgi import parse_qsl
+
+class Http404(Exception):
+    pass
+
+class HttpRequest(object):
+    "A basic HTTP request"
+    def __init__(self):
+        self.GET, self.POST, self.COOKIES, self.META, self.FILES = {}, {}, {}, {}, {}
+        self.path = ''
+        self.method = None
+
+    def __repr__(self):
+        return '<HttpRequest\nGET:%s,\nPOST:%s,\nCOOKIES:%s,\nMETA:%s>' % \
+            (pformat(self.GET), pformat(self.POST), pformat(self.COOKIES),
+            pformat(self.META))
+
+    def __getitem__(self, key):
+        for d in (self.POST, self.GET):
+            if d.has_key(key):
+                return d[key]
+        raise KeyError, "%s not found in either POST or GET" % key
+
+    def has_key(self, key):
+        return self.GET.has_key(key) or self.POST.has_key(key)
+
+    def get_full_path(self):
+        return ''
+        
+    def is_secure(self):
+        return os.environ.get("HTTPS") == "on"
+
+def parse_file_upload(header_dict, post_data):
+    "Returns a tuple of (POST MultiValueDict, FILES MultiValueDict)"
+    import email, email.Message
+    from cgi import parse_header
+    raw_message = '\r\n'.join(['%s:%s' % pair for pair in header_dict.items()])
+    raw_message += '\r\n\r\n' + post_data
+    msg = email.message_from_string(raw_message)
+    POST = MultiValueDict()
+    FILES = MultiValueDict()
+    for submessage in msg.get_payload():
+        if isinstance(submessage, email.Message.Message):
+            name_dict = parse_header(submessage['Content-Disposition'])[1]
+            # name_dict is something like {'name': 'file', 'filename': 'test.txt'} for file uploads
+            # or {'name': 'blah'} for POST fields
+            # We assume all uploaded files have a 'filename' set.
+            if name_dict.has_key('filename'):
+                assert type([]) != type(submessage.get_payload()), "Nested MIME messages are not supported"
+                if not name_dict['filename'].strip():
+                    continue
+                # IE submits the full path, so trim everything but the basename.
+                # (We can't use os.path.basename because it expects Linux paths.)
+                filename = name_dict['filename'][name_dict['filename'].rfind("\\")+1:]
+                FILES.appendlist(name_dict['name'], {
+                    'filename': filename,
+                    'content-type': (submessage.has_key('Content-Type') and submessage['Content-Type'] or None),
+                    'content': submessage.get_payload(),
+                })
+            else:
+                POST.appendlist(name_dict['name'], submessage.get_payload())
+    return POST, FILES
+
+class QueryDict(MultiValueDict):
+    """A specialized MultiValueDict that takes a query string when initialized.
+    This is immutable unless you create a copy of it."""
+    def __init__(self, query_string, mutable=False):
+        MultiValueDict.__init__(self)
+        self._mutable = True
+        for key, value in parse_qsl((query_string or ''), True): # keep_blank_values=True
+            self.appendlist(key, value)
+        self._mutable = mutable
+
+    def _assert_mutable(self):
+        if not self._mutable:
+            raise AttributeError, "This QueryDict instance is immutable"
+
+    def __setitem__(self, key, value):
+        self._assert_mutable()
+        MultiValueDict.__setitem__(self, key, value)
+
+    def __copy__(self):
+        result = self.__class__('', mutable=True)
+        for key, value in dict.items(self):
+            dict.__setitem__(result, key, value)
+        return result
+
+    def __deepcopy__(self, memo={}):
+        import copy
+        result = self.__class__('', mutable=True)
+        memo[id(self)] = result
+        for key, value in dict.items(self):
+            dict.__setitem__(result, copy.deepcopy(key, memo), copy.deepcopy(value, memo))
+        return result
+
+    def setlist(self, key, list_):
+        self._assert_mutable()
+        MultiValueDict.setlist(self, key, list_)
+
+    def appendlist(self, key, value):
+        self._assert_mutable()
+        MultiValueDict.appendlist(self, key, value)
+
+    def update(self, other_dict):
+        self._assert_mutable()
+        MultiValueDict.update(self, other_dict)
+
+    def pop(self, key):
+        self._assert_mutable()
+        return MultiValueDict.pop(self, key)
+
+    def popitem(self):
+        self._assert_mutable()
+        return MultiValueDict.popitem(self)
+
+    def clear(self):
+        self._assert_mutable()
+        MultiValueDict.clear(self)
+
+    def setdefault(self, *args):
+        self._assert_mutable()
+        return MultiValueDict.setdefault(self, *args)
+
+    def copy(self):
+        "Returns a mutable copy of this object."
+        return self.__deepcopy__()
+
+    def urlencode(self):
+        output = []
+        for k, list_ in self.lists():
+            output.extend([urlencode({k: v}) for v in list_])
+        return '&'.join(output)
+
+def parse_cookie(cookie):
+    if cookie == '':
+        return {}
+    c = SimpleCookie()
+    c.load(cookie)
+    cookiedict = {}
+    for key in c.keys():
+        cookiedict[key] = c.get(key).value
+    return cookiedict
+
+class HttpResponse(object):
+    "A basic HTTP response, with content and dictionary-accessed headers"
+    def __init__(self, content='', mimetype=None):
+        from django.conf import settings
+        self._charset = settings.DEFAULT_CHARSET
+        if not mimetype:
+            mimetype = "%s; charset=%s" % (settings.DEFAULT_CONTENT_TYPE, settings.DEFAULT_CHARSET)
+        if hasattr(content, '__iter__'):
+            self._iterator = content
+            self._is_string = False
+        else:
+            self._iterator = [content]
+            self._is_string = True
+        self.headers = {'Content-Type': mimetype}
+        self.cookies = SimpleCookie()
+        self.status_code = 200
+
+    def __str__(self):
+        "Full HTTP message, including headers"
+        return '\n'.join(['%s: %s' % (key, value)
+            for key, value in self.headers.items()]) \
+            + '\n\n' + self.content
+
+    def __setitem__(self, header, value):
+        self.headers[header] = value
+
+    def __delitem__(self, header):
+        try:
+            del self.headers[header]
+        except KeyError:
+            pass
+
+    def __getitem__(self, header):
+        return self.headers[header]
+
+    def has_header(self, header):
+        "Case-insensitive check for a header"
+        header = header.lower()
+        for key in self.headers.keys():
+            if key.lower() == header:
+                return True
+        return False
+
+    def set_cookie(self, key, value='', max_age=None, expires=None, path='/', domain=None, secure=None):
+        self.cookies[key] = value
+        for var in ('max_age', 'path', 'domain', 'secure', 'expires'):
+            val = locals()[var]
+            if val is not None:
+                self.cookies[key][var.replace('_', '-')] = val
+
+    def delete_cookie(self, key):
+        try:
+            self.cookies[key]['max_age'] = 0
+        except KeyError:
+            pass
+
+    def _get_content(self):
+        content = ''.join(self._iterator)
+        if isinstance(content, unicode):
+            content = content.encode(self._charset)
+        return content
+
+    def _set_content(self, value):
+        self._iterator = [value]
+        self._is_string = True
+
+    content = property(_get_content, _set_content)
+
+    def _get_iterator(self):
+        "Output iterator. Converts data into client charset if necessary."
+        for chunk in self._iterator:
+            if isinstance(chunk, unicode):
+                chunk = chunk.encode(self._charset)
+            yield chunk
+
+    iterator = property(_get_iterator)
+
+    # The remaining methods partially implement the file-like object interface.
+    # See http://docs.python.org/lib/bltin-file-objects.html
+    def write(self, content):
+        if not self._is_string:
+            raise Exception, "This %s instance is not writable" % self.__class__
+        self._iterator.append(content)
+
+    def flush(self):
+        pass
+
+    def tell(self):
+        if not self._is_string:
+            raise Exception, "This %s instance cannot tell its position" % self.__class__
+        return sum([len(chunk) for chunk in self._iterator])
+
+class HttpResponseRedirect(HttpResponse):
+    def __init__(self, redirect_to):
+        HttpResponse.__init__(self)
+        self['Location'] = quote(redirect_to, safe=RESERVED_CHARS)
+        self.status_code = 302
+
+class HttpResponsePermanentRedirect(HttpResponse):
+    def __init__(self, redirect_to):
+        HttpResponse.__init__(self)
+        self['Location'] = quote(redirect_to, safe=RESERVED_CHARS)
+        self.status_code = 301
+
+class HttpResponseNotModified(HttpResponse):
+    def __init__(self):
+        HttpResponse.__init__(self)
+        self.status_code = 304
+
+class HttpResponseNotFound(HttpResponse):
+    def __init__(self, *args, **kwargs):
+        HttpResponse.__init__(self, *args, **kwargs)
+        self.status_code = 404
+
+class HttpResponseForbidden(HttpResponse):
+    def __init__(self, *args, **kwargs):
+        HttpResponse.__init__(self, *args, **kwargs)
+        self.status_code = 403
+
+class HttpResponseNotAllowed(HttpResponse):
+    def __init__(self, permitted_methods):
+        HttpResponse.__init__(self)
+        self['Allow'] = ', '.join(permitted_methods)
+        self.status_code = 405
+
+class HttpResponseGone(HttpResponse):
+    def __init__(self, *args, **kwargs):
+        HttpResponse.__init__(self, *args, **kwargs)
+        self.status_code = 410
+
+class HttpResponseServerError(HttpResponse):
+    def __init__(self, *args, **kwargs):
+        HttpResponse.__init__(self, *args, **kwargs)
+        self.status_code = 500
+
+def get_host(request):
+    "Gets the HTTP host from the environment or request headers."
+    host = request.META.get('HTTP_X_FORWARDED_HOST', '')
+    if not host:
+        host = request.META.get('HTTP_HOST', '')
+    return host

Added: vendor/django/current/django/middleware/__init__.py
===================================================================

Added: vendor/django/current/django/middleware/cache.py
===================================================================
--- vendor/django/current/django/middleware/cache.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/middleware/cache.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,81 @@
+from django.conf import settings
+from django.core.cache import cache
+from django.utils.cache import get_cache_key, learn_cache_key, patch_response_headers
+
+class CacheMiddleware(object):
+    """
+    Cache middleware. If this is enabled, each Django-powered page will be
+    cached for CACHE_MIDDLEWARE_SECONDS seconds. Cache is based on URLs.
+
+    Only parameter-less GET or HEAD-requests with status code 200 are cached.
+
+    If CACHE_MIDDLEWARE_ANONYMOUS_ONLY is set to True, only anonymous requests
+    (i.e., those node made by a logged-in user) will be cached. This is a
+    simple and effective way of avoiding the caching of the Django admin (and
+    any other user-specific content).
+
+    This middleware expects that a HEAD request is answered with a response
+    exactly like the corresponding GET request.
+
+    When a hit occurs, a shallow copy of the original response object is
+    returned from process_request.
+
+    Pages will be cached based on the contents of the request headers
+    listed in the response's "Vary" header. This means that pages shouldn't
+    change their "Vary" header.
+
+    This middleware also sets ETag, Last-Modified, Expires and Cache-Control
+    headers on the response object.
+    """
+    def __init__(self, cache_timeout=None, key_prefix=None, cache_anonymous_only=None):
+        self.cache_timeout = cache_timeout
+        if cache_timeout is None:
+            self.cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+        self.key_prefix = key_prefix
+        if key_prefix is None:
+            self.key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+        if cache_anonymous_only is None:
+            self.cache_anonymous_only = getattr(settings, 'CACHE_MIDDLEWARE_ANONYMOUS_ONLY', False)
+        else:
+            self.cache_anonymous_only = cache_anonymous_only
+
+    def process_request(self, request):
+        "Checks whether the page is already cached and returns the cached version if available."
+        if not request.method in ('GET', 'HEAD') or request.GET:
+            request._cache_update_cache = False
+            return None # Don't bother checking the cache.
+
+        if self.cache_anonymous_only and request.user.is_authenticated():
+            request._cache_update_cache = False
+            return None # Don't cache requests from authenticated users.
+
+        cache_key = get_cache_key(request, self.key_prefix)
+        if cache_key is None:
+            request._cache_update_cache = True
+            return None # No cache information available, need to rebuild.
+
+        response = cache.get(cache_key, None)
+        if response is None:
+            request._cache_update_cache = True
+            return None # No cache information available, need to rebuild.
+
+        request._cache_update_cache = False
+        return response
+
+    def process_response(self, request, response):
+        "Sets the cache, if needed."
+        if not hasattr(request, '_cache_update_cache') or not request._cache_update_cache:
+            # We don't need to update the cache, just return.
+            return response
+        if request.method != 'GET':
+            # This is a stronger requirement than above. It is needed
+            # because of interactions between this middleware and the
+            # HTTPMiddleware, which throws the body of a HEAD-request
+            # away before this middleware gets a chance to cache it.
+            return response
+        if not response.status_code == 200:
+            return response
+        patch_response_headers(response, self.cache_timeout)
+        cache_key = learn_cache_key(request, response, self.cache_timeout, self.key_prefix)
+        cache.set(cache_key, response, self.cache_timeout)
+        return response

Added: vendor/django/current/django/middleware/common.py
===================================================================
--- vendor/django/current/django/middleware/common.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/middleware/common.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,89 @@
+from django.conf import settings
+from django import http
+from django.core.mail import mail_managers
+import md5
+
+class CommonMiddleware(object):
+    """
+    "Common" middleware for taking care of some basic operations:
+
+        - Forbids access to User-Agents in settings.DISALLOWED_USER_AGENTS
+
+        - URL rewriting: Based on the APPEND_SLASH and PREPEND_WWW settings,
+          this middleware appends missing slashes and/or prepends missing "www."s.
+
+        - ETags: If the USE_ETAGS setting is set, ETags will be calculated from
+          the entire page content and Not Modified responses will be returned
+          appropriately.
+    """
+
+    def process_request(self, request):
+        """
+        Check for denied User-Agents and rewrite the URL based on
+        settings.APPEND_SLASH and settings.PREPEND_WWW
+        """
+
+        # Check for denied User-Agents
+        if request.META.has_key('HTTP_USER_AGENT'):
+            for user_agent_regex in settings.DISALLOWED_USER_AGENTS:
+                if user_agent_regex.search(request.META['HTTP_USER_AGENT']):
+                    return http.HttpResponseForbidden('<h1>Forbidden</h1>')
+
+        # Check for a redirect based on settings.APPEND_SLASH and settings.PREPEND_WWW
+        host = http.get_host(request)
+        old_url = [host, request.path]
+        new_url = old_url[:]
+        if settings.PREPEND_WWW and old_url[0] and not old_url[0].startswith('www.'):
+            new_url[0] = 'www.' + old_url[0]
+        # Append a slash if append_slash is set and the URL doesn't have a
+        # trailing slash or a file extension.
+        if settings.APPEND_SLASH and (old_url[1][-1] != '/') and ('.' not in old_url[1].split('/')[-1]):
+            new_url[1] = new_url[1] + '/'
+            if settings.DEBUG and request.method == 'POST':
+                raise RuntimeError, "You called this URL via POST, but the URL doesn't end in a slash and you have APPEND_SLASH set. Django can't redirect to the slash URL while maintaining POST data. Change your form to point to %s%s (note the trailing slash), or set APPEND_SLASH=False in your Django settings." % (new_url[0], new_url[1])
+        if new_url != old_url:
+            # Redirect
+            if new_url[0]:
+                newurl = "%s://%s%s" % (request.is_secure() and 'https' or 'http', new_url[0], new_url[1])
+            else:
+                newurl = new_url[1]
+            if request.GET:
+                newurl += '?' + request.GET.urlencode()
+            return http.HttpResponsePermanentRedirect(newurl)
+
+        return None
+
+    def process_response(self, request, response):
+        "Check for a flat page (for 404s) and calculate the Etag, if needed."
+        if response.status_code == 404:
+            if settings.SEND_BROKEN_LINK_EMAILS:
+                # If the referrer was from an internal link or a non-search-engine site,
+                # send a note to the managers.
+                domain = http.get_host(request)
+                referer = request.META.get('HTTP_REFERER', None)
+                is_internal = referer and (domain in referer)
+                path = request.get_full_path()
+                if referer and not _is_ignorable_404(path) and (is_internal or '?' not in referer):
+                    mail_managers("Broken %slink on %s" % ((is_internal and 'INTERNAL ' or ''), domain),
+                        "Referrer: %s\nRequested URL: %s\n" % (referer, request.get_full_path()))
+                return response
+
+        # Use ETags, if requested.
+        if settings.USE_ETAGS:
+            etag = md5.new(response.content).hexdigest()
+            if request.META.get('HTTP_IF_NONE_MATCH') == etag:
+                response = http.HttpResponseNotModified()
+            else:
+                response['ETag'] = etag
+
+        return response
+
+def _is_ignorable_404(uri):
+    "Returns True if a 404 at the given URL *shouldn't* notify the site managers"
+    for start in settings.IGNORABLE_404_STARTS:
+        if uri.startswith(start):
+            return True
+    for end in settings.IGNORABLE_404_ENDS:
+        if uri.endswith(end):
+            return True
+    return False

Added: vendor/django/current/django/middleware/doc.py
===================================================================
--- vendor/django/current/django/middleware/doc.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/middleware/doc.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,17 @@
+from django.conf import settings
+from django import http
+
+class XViewMiddleware(object):
+    """
+    Adds an X-View header to internal HEAD requests -- used by the documentation system.
+    """
+    def process_view(self, request, view_func, view_args, view_kwargs):
+        """
+        If the request method is HEAD and the IP is internal, quickly return
+        with an x-header indicating the view function.  This is used by the
+        documentation module to lookup the view function for an arbitrary page.
+        """
+        if request.method == 'HEAD' and request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS:
+            response = http.HttpResponse()
+            response['X-View'] = "%s.%s" % (view_func.__module__, view_func.__name__)
+            return response

Added: vendor/django/current/django/middleware/gzip.py
===================================================================
--- vendor/django/current/django/middleware/gzip.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/middleware/gzip.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,24 @@
+import re
+from django.utils.text import compress_string
+from django.utils.cache import patch_vary_headers
+
+re_accepts_gzip = re.compile(r'\bgzip\b')
+
+class GZipMiddleware(object):
+    """
+    This middleware compresses content if the browser allows gzip compression.
+    It sets the Vary header accordingly, so that caches will base their storage
+    on the Accept-Encoding header.
+    """
+    def process_response(self, request, response):
+        patch_vary_headers(response, ('Accept-Encoding',))
+        if response.has_header('Content-Encoding'):
+            return response
+
+        ae = request.META.get('HTTP_ACCEPT_ENCODING', '')
+        if not re_accepts_gzip.search(ae):
+            return response
+
+        response.content = compress_string(response.content)
+        response['Content-Encoding'] = 'gzip'
+        return response

Added: vendor/django/current/django/middleware/http.py
===================================================================
--- vendor/django/current/django/middleware/http.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/middleware/http.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,37 @@
+import datetime
+
+class ConditionalGetMiddleware(object):
+    """
+    Handles conditional GET operations. If the response has a ETag or
+    Last-Modified header, and the request has If-None-Match or
+    If-Modified-Since, the response is replaced by an HttpNotModified.
+
+    Removes the content from any response to a HEAD request.
+
+    Also sets the Date and Content-Length response-headers.
+    """
+    def process_response(self, request, response):
+        now = datetime.datetime.utcnow()
+        response['Date'] = now.strftime('%a, %d %b %Y %H:%M:%S GMT')
+        if not response.has_header('Content-Length'):
+            response['Content-Length'] = str(len(response.content))
+
+        if response.has_header('ETag'):
+            if_none_match = request.META.get('HTTP_IF_NONE_MATCH', None)
+            if if_none_match == response['ETag']:
+                response.status_code = 304
+                response.content = ''
+                response['Content-Length'] = '0'
+
+        if response.has_header('Last-Modified'):
+            last_mod = response['Last-Modified']
+            if_modified_since = request.META.get('HTTP_IF_MODIFIED_SINCE', None)
+            if if_modified_since == response['Last-Modified']:
+                response.status_code = 304
+                response.content = ''
+                response['Content-Length'] = '0'
+
+        if request.method == 'HEAD':
+            response.content = ''
+
+        return response

Added: vendor/django/current/django/middleware/locale.py
===================================================================
--- vendor/django/current/django/middleware/locale.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/middleware/locale.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,24 @@
+"this is the locale selecting middleware that will look at accept headers"
+
+from django.utils.cache import patch_vary_headers
+from django.utils import translation
+
+class LocaleMiddleware(object):
+    """
+    This is a very simple middleware that parses a request
+    and decides what translation object to install in the current
+    thread context. This allows pages to be dynamically
+    translated to the language the user desires (if the language
+    is available, of course).
+    """
+
+    def process_request(self, request):
+        language = translation.get_language_from_request(request)
+        translation.activate(language)
+        request.LANGUAGE_CODE = translation.get_language()
+
+    def process_response(self, request, response):
+        patch_vary_headers(response, ('Accept-Language',))
+        response['Content-Language'] = translation.get_language()
+        translation.deactivate()
+        return response

Added: vendor/django/current/django/middleware/transaction.py
===================================================================
--- vendor/django/current/django/middleware/transaction.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/middleware/transaction.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,27 @@
+from django.db import transaction
+
+class TransactionMiddleware(object):
+    """
+    Transaction middleware. If this is enabled, each view function will be run
+    with commit_on_response activated - that way a save() doesn't do a direct
+    commit, the commit is done when a successful response is created. If an
+    exception happens, the database is rolled back.
+    """
+    def process_request(self, request):
+        """Enters transaction management"""
+        transaction.enter_transaction_management()
+        transaction.managed(True)
+
+    def process_exception(self, request, exception):
+        """Rolls back the database and leaves transaction management"""
+        if transaction.is_dirty():
+            transaction.rollback()
+        transaction.leave_transaction_management()
+
+    def process_response(self, request, response):
+        """Commits and leaves transaction management."""
+        if transaction.is_managed():
+            if transaction.is_dirty():
+                transaction.commit()
+            transaction.leave_transaction_management()
+        return response

Added: vendor/django/current/django/shortcuts/__init__.py
===================================================================
--- vendor/django/current/django/shortcuts/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/shortcuts/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,23 @@
+# This module collects helper functions and classes that "span" multiple levels
+# of MVC. In other words, these functions/classes introduce controlled coupling
+# for convenience's sake.
+
+from django.template import loader
+from django.http import HttpResponse, Http404
+
+
+def render_to_response(*args, **kwargs):
+    return HttpResponse(loader.render_to_string(*args, **kwargs))
+load_and_render = render_to_response # For backwards compatibility.
+
+def get_object_or_404(klass, *args, **kwargs):
+    try:
+        return klass._default_manager.get(*args, **kwargs)
+    except klass.DoesNotExist:
+        raise Http404
+
+def get_list_or_404(klass, *args, **kwargs):
+    obj_list = list(klass._default_manager.filter(*args, **kwargs))
+    if not obj_list:
+        raise Http404
+    return obj_list

Added: vendor/django/current/django/template/__init__.py
===================================================================
--- vendor/django/current/django/template/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,894 @@
+"""
+This is the Django template system.
+
+How it works:
+
+The Lexer.tokenize() function converts a template string (i.e., a string containing
+markup with custom template tags) to tokens, which can be either plain text
+(TOKEN_TEXT), variables (TOKEN_VAR) or block statements (TOKEN_BLOCK).
+
+The Parser() class takes a list of tokens in its constructor, and its parse()
+method returns a compiled template -- which is, under the hood, a list of
+Node objects.
+
+Each Node is responsible for creating some sort of output -- e.g. simple text
+(TextNode), variable values in a given context (VariableNode), results of basic
+logic (IfNode), results of looping (ForNode), or anything else. The core Node
+types are TextNode, VariableNode, IfNode and ForNode, but plugin modules can
+define their own custom node types.
+
+Each Node has a render() method, which takes a Context and returns a string of
+the rendered node. For example, the render() method of a Variable Node returns
+the variable's value as a string. The render() method of an IfNode returns the
+rendered output of whatever was inside the loop, recursively.
+
+The Template class is a convenient wrapper that takes care of template
+compilation and rendering.
+
+Usage:
+
+The only thing you should ever use directly in this file is the Template class.
+Create a compiled template object with a template_string, then call render()
+with a context. In the compilation stage, the TemplateSyntaxError exception
+will be raised if the template doesn't have proper syntax.
+
+Sample code:
+
+>>> import template
+>>> s = '''
+... <html>
+... {% if test %}
+...     <h1>{{ varvalue }}</h1>
+... {% endif %}
+... </html>
+... '''
+>>> t = template.Template(s)
+
+(t is now a compiled template, and its render() method can be called multiple
+times with multiple contexts)
+
+>>> c = template.Context({'test':True, 'varvalue': 'Hello'})
+>>> t.render(c)
+'\n<html>\n\n    <h1>Hello</h1>\n\n</html>\n'
+>>> c = template.Context({'test':False, 'varvalue': 'Hello'})
+>>> t.render(c)
+'\n<html>\n\n</html>\n'
+"""
+import re
+from inspect import getargspec
+from django.conf import settings
+from django.template.context import Context, RequestContext, ContextPopException
+from django.utils.functional import curry
+from django.utils.text import smart_split
+
+__all__ = ('Template', 'Context', 'RequestContext', 'compile_string')
+
+TOKEN_TEXT = 0
+TOKEN_VAR = 1
+TOKEN_BLOCK = 2
+
+# template syntax constants
+FILTER_SEPARATOR = '|'
+FILTER_ARGUMENT_SEPARATOR = ':'
+VARIABLE_ATTRIBUTE_SEPARATOR = '.'
+BLOCK_TAG_START = '{%'
+BLOCK_TAG_END = '%}'
+VARIABLE_TAG_START = '{{'
+VARIABLE_TAG_END = '}}'
+SINGLE_BRACE_START = '{'
+SINGLE_BRACE_END = '}'
+
+ALLOWED_VARIABLE_CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_.'
+
+# what to report as the origin for templates that come from non-loader sources
+# (e.g. strings)
+UNKNOWN_SOURCE="&lt;unknown source&gt;"
+
+# match a variable or block tag and capture the entire tag, including start/end delimiters
+tag_re = re.compile('(%s.*?%s|%s.*?%s)' % (re.escape(BLOCK_TAG_START), re.escape(BLOCK_TAG_END),
+                                          re.escape(VARIABLE_TAG_START), re.escape(VARIABLE_TAG_END)))
+
+# global dictionary of libraries that have been loaded using get_library
+libraries = {}
+# global list of libraries to load by default for a new parser
+builtins = []
+
+class TemplateSyntaxError(Exception):
+    def __str__(self):
+        try:
+            import cStringIO as StringIO
+        except ImportError:
+            import StringIO
+        output = StringIO.StringIO()
+        output.write(Exception.__str__(self))
+        # Check if we wrapped an exception and print that too.
+        if hasattr(self, 'exc_info'):
+            import traceback
+            output.write('\n\nOriginal ')
+            e = self.exc_info
+            traceback.print_exception(e[0], e[1], e[2], 500, output)
+        return output.getvalue()
+
+class TemplateDoesNotExist(Exception):
+    pass
+
+class VariableDoesNotExist(Exception):
+    pass
+
+class InvalidTemplateLibrary(Exception):
+    pass
+
+class Origin(object):
+    def __init__(self, name):
+        self.name = name
+
+    def reload(self):
+        raise NotImplementedError
+
+    def __str__(self):
+        return self.name
+
+class StringOrigin(Origin):
+    def __init__(self, source):
+        super(StringOrigin, self).__init__(UNKNOWN_SOURCE)
+        self.source = source
+
+    def reload(self):
+        return self.source
+
+class Template(object):
+    def __init__(self, template_string, origin=None):
+        "Compilation stage"
+        if settings.TEMPLATE_DEBUG and origin == None:
+            origin = StringOrigin(template_string)
+            # Could do some crazy stack-frame stuff to record where this string
+            # came from...
+        self.nodelist = compile_string(template_string, origin)
+
+    def __iter__(self):
+        for node in self.nodelist:
+            for subnode in node:
+                yield subnode
+
+    def render(self, context):
+        "Display stage -- can be called many times"
+        return self.nodelist.render(context)
+
+def compile_string(template_string, origin):
+    "Compiles template_string into NodeList ready for rendering"
+    lexer = lexer_factory(template_string, origin)
+    parser = parser_factory(lexer.tokenize())
+    return parser.parse()
+
+class Token(object):
+    def __init__(self, token_type, contents):
+        "The token_type must be TOKEN_TEXT, TOKEN_VAR or TOKEN_BLOCK"
+        self.token_type, self.contents = token_type, contents
+
+    def __str__(self):
+        return '<%s token: "%s...">' % \
+            ({TOKEN_TEXT: 'Text', TOKEN_VAR: 'Var', TOKEN_BLOCK: 'Block'}[self.token_type],
+            self.contents[:20].replace('\n', ''))
+
+    def split_contents(self):
+        return list(smart_split(self.contents))
+
+class Lexer(object):
+    def __init__(self, template_string, origin):
+        self.template_string = template_string
+        self.origin = origin
+
+    def tokenize(self):
+        "Return a list of tokens from a given template_string"
+        # remove all empty strings, because the regex has a tendency to add them
+        bits = filter(None, tag_re.split(self.template_string))
+        return map(self.create_token, bits)
+
+    def create_token(self,token_string):
+        "Convert the given token string into a new Token object and return it"
+        if token_string.startswith(VARIABLE_TAG_START):
+            token = Token(TOKEN_VAR, token_string[len(VARIABLE_TAG_START):-len(VARIABLE_TAG_END)].strip())
+        elif token_string.startswith(BLOCK_TAG_START):
+            token = Token(TOKEN_BLOCK, token_string[len(BLOCK_TAG_START):-len(BLOCK_TAG_END)].strip())
+        else:
+            token = Token(TOKEN_TEXT, token_string)
+        return token
+
+class DebugLexer(Lexer):
+    def __init__(self, template_string, origin):
+        super(DebugLexer, self).__init__(template_string, origin)
+
+    def tokenize(self):
+        "Return a list of tokens from a given template_string"
+        token_tups, upto = [], 0
+        for match in tag_re.finditer(self.template_string):
+            start, end = match.span()
+            if start > upto:
+                token_tups.append( (self.template_string[upto:start], (upto, start)) )
+                upto = start
+            token_tups.append( (self.template_string[start:end], (start,end)) )
+            upto = end
+        last_bit = self.template_string[upto:]
+        if last_bit:
+            token_tups.append( (last_bit, (upto, upto + len(last_bit))) )
+        return [self.create_token(tok, (self.origin, loc)) for tok, loc in token_tups]
+
+    def create_token(self, token_string, source):
+        token = super(DebugLexer, self).create_token(token_string)
+        token.source = source
+        return token
+
+class Parser(object):
+    def __init__(self, tokens):
+        self.tokens = tokens
+        self.tags = {}
+        self.filters = {}
+        for lib in builtins:
+            self.add_library(lib)
+
+    def parse(self, parse_until=None):
+        if parse_until is None: parse_until = []
+        nodelist = self.create_nodelist()
+        while self.tokens:
+            token = self.next_token()
+            if token.token_type == TOKEN_TEXT:
+                self.extend_nodelist(nodelist, TextNode(token.contents), token)
+            elif token.token_type == TOKEN_VAR:
+                if not token.contents:
+                    self.empty_variable(token)
+                filter_expression = self.compile_filter(token.contents)
+                var_node = self.create_variable_node(filter_expression)
+                self.extend_nodelist(nodelist, var_node,token)
+            elif token.token_type == TOKEN_BLOCK:
+                if token.contents in parse_until:
+                    # put token back on token list so calling code knows why it terminated
+                    self.prepend_token(token)
+                    return nodelist
+                try:
+                    command = token.contents.split()[0]
+                except IndexError:
+                    self.empty_block_tag(token)
+                # execute callback function for this tag and append resulting node
+                self.enter_command(command, token)
+                try:
+                    compile_func = self.tags[command]
+                except KeyError:
+                    self.invalid_block_tag(token, command)
+                try:
+                    compiled_result = compile_func(self, token)
+                except TemplateSyntaxError, e:
+                    if not self.compile_function_error(token, e):
+                        raise
+                self.extend_nodelist(nodelist, compiled_result, token)
+                self.exit_command()
+        if parse_until:
+            self.unclosed_block_tag(parse_until)
+        return nodelist
+
+    def skip_past(self, endtag):
+        while self.tokens:
+            token = self.next_token()
+            if token.token_type == TOKEN_BLOCK and token.contents == endtag:
+                return
+        self.unclosed_block_tag([endtag])
+
+    def create_variable_node(self, filter_expression):
+        return VariableNode(filter_expression)
+
+    def create_nodelist(self):
+        return NodeList()
+
+    def extend_nodelist(self, nodelist, node, token):
+        nodelist.append(node)
+
+    def enter_command(self, command, token):
+        pass
+
+    def exit_command(self):
+        pass
+
+    def error(self, token, msg ):
+        return TemplateSyntaxError(msg)
+
+    def empty_variable(self, token):
+        raise self.error( token, "Empty variable tag")
+
+    def empty_block_tag(self, token):
+        raise self.error( token, "Empty block tag")
+
+    def invalid_block_tag(self, token, command):
+        raise self.error( token, "Invalid block tag: '%s'" % command)
+
+    def unclosed_block_tag(self, parse_until):
+        raise self.error(None, "Unclosed tags: %s " %  ', '.join(parse_until))
+
+    def compile_function_error(self, token, e):
+        pass
+
+    def next_token(self):
+        return self.tokens.pop(0)
+
+    def prepend_token(self, token):
+        self.tokens.insert(0, token)
+
+    def delete_first_token(self):
+        del self.tokens[0]
+
+    def add_library(self, lib):
+        self.tags.update(lib.tags)
+        self.filters.update(lib.filters)
+
+    def compile_filter(self, token):
+        "Convenient wrapper for FilterExpression"
+        return FilterExpression(token, self)
+
+    def find_filter(self, filter_name):
+        if self.filters.has_key(filter_name):
+            return self.filters[filter_name]
+        else:
+            raise TemplateSyntaxError, "Invalid filter: '%s'" % filter_name
+
+class DebugParser(Parser):
+    def __init__(self, lexer):
+        super(DebugParser, self).__init__(lexer)
+        self.command_stack = []
+
+    def enter_command(self, command, token):
+        self.command_stack.append( (command, token.source) )
+
+    def exit_command(self):
+        self.command_stack.pop()
+
+    def error(self, token, msg):
+        return self.source_error(token.source, msg)
+
+    def source_error(self, source,msg):
+        e = TemplateSyntaxError(msg)
+        e.source = source
+        return e
+
+    def create_nodelist(self):
+        return DebugNodeList()
+
+    def create_variable_node(self, contents):
+        return DebugVariableNode(contents)
+
+    def extend_nodelist(self, nodelist, node, token):
+        node.source = token.source
+        super(DebugParser, self).extend_nodelist(nodelist, node, token)
+
+    def unclosed_block_tag(self, parse_until):
+        command, source = self.command_stack.pop()
+        msg = "Unclosed tag '%s'. Looking for one of: %s " % (command, ', '.join(parse_until))
+        raise self.source_error( source, msg)
+
+    def compile_function_error(self, token, e):
+        if not hasattr(e, 'source'):
+            e.source = token.source
+
+def lexer_factory(*args, **kwargs):
+    if settings.TEMPLATE_DEBUG:
+        return DebugLexer(*args, **kwargs)
+    else:
+        return Lexer(*args, **kwargs)
+
+def parser_factory(*args, **kwargs):
+    if settings.TEMPLATE_DEBUG:
+        return DebugParser(*args, **kwargs)
+    else:
+        return Parser(*args, **kwargs)
+
+class TokenParser(object):
+    """
+    Subclass this and implement the top() method to parse a template line. When
+    instantiating the parser, pass in the line from the Django template parser.
+
+    The parser's "tagname" instance-variable stores the name of the tag that
+    the filter was called with.
+    """
+    def __init__(self, subject):
+        self.subject = subject
+        self.pointer = 0
+        self.backout = []
+        self.tagname = self.tag()
+
+    def top(self):
+        "Overload this method to do the actual parsing and return the result."
+        raise NotImplemented
+
+    def more(self):
+        "Returns True if there is more stuff in the tag."
+        return self.pointer < len(self.subject)
+
+    def back(self):
+        "Undoes the last microparser. Use this for lookahead and backtracking."
+        if not len(self.backout):
+            raise TemplateSyntaxError, "back called without some previous parsing"
+        self.pointer = self.backout.pop()
+
+    def tag(self):
+        "A microparser that just returns the next tag from the line."
+        subject = self.subject
+        i = self.pointer
+        if i >= len(subject):
+            raise TemplateSyntaxError, "expected another tag, found end of string: %s" % subject
+        p = i
+        while i < len(subject) and subject[i] not in (' ', '\t'):
+            i += 1
+        s = subject[p:i]
+        while i < len(subject) and subject[i] in (' ', '\t'):
+            i += 1
+        self.backout.append(self.pointer)
+        self.pointer = i
+        return s
+
+    def value(self):
+        "A microparser that parses for a value: some string constant or variable name."
+        subject = self.subject
+        i = self.pointer
+        if i >= len(subject):
+            raise TemplateSyntaxError, "Searching for value. Expected another value but found end of string: %s" % subject
+        if subject[i] in ('"', "'"):
+            p = i
+            i += 1
+            while i < len(subject) and subject[i] != subject[p]:
+                i += 1
+            if i >= len(subject):
+                raise TemplateSyntaxError, "Searching for value. Unexpected end of string in column %d: %s" % subject
+            i += 1
+            res = subject[p:i]
+            while i < len(subject) and subject[i] in (' ', '\t'):
+                i += 1
+            self.backout.append(self.pointer)
+            self.pointer = i
+            return res
+        else:
+            p = i
+            while i < len(subject) and subject[i] not in (' ', '\t'):
+                if subject[i] in ('"', "'"):
+                    c = subject[i]
+                    i += 1
+                    while i < len(subject) and subject[i] != c:
+                        i += 1
+                    if i >= len(subject):
+                        raise TemplateSyntaxError, "Searching for value. Unexpected end of string in column %d: %s" % subject
+                i += 1
+            s = subject[p:i]
+            while i < len(subject) and subject[i] in (' ', '\t'):
+                i += 1
+            self.backout.append(self.pointer)
+            self.pointer = i
+            return s
+
+
+
+
+filter_raw_string = r"""
+^%(i18n_open)s"(?P<i18n_constant>%(str)s)"%(i18n_close)s|
+^"(?P<constant>%(str)s)"|
+^(?P<var>[%(var_chars)s]+)|
+ (?:%(filter_sep)s
+     (?P<filter_name>\w+)
+         (?:%(arg_sep)s
+             (?:
+              %(i18n_open)s"(?P<i18n_arg>%(str)s)"%(i18n_close)s|
+              "(?P<constant_arg>%(str)s)"|
+              (?P<var_arg>[%(var_chars)s]+)
+             )
+         )?
+ )""" % {
+    'str': r"""[^"\\]*(?:\\.[^"\\]*)*""",
+    'var_chars': "A-Za-z0-9\_\." ,
+    'filter_sep': re.escape(FILTER_SEPARATOR),
+    'arg_sep': re.escape(FILTER_ARGUMENT_SEPARATOR),
+    'i18n_open' : re.escape("_("),
+    'i18n_close' : re.escape(")"),
+  }
+
+filter_raw_string = filter_raw_string.replace("\n", "").replace(" ", "")
+filter_re = re.compile(filter_raw_string)
+
+class FilterExpression(object):
+    """
+    Parses a variable token and its optional filters (all as a single string),
+    and return a list of tuples of the filter name and arguments.
+    Sample:
+        >>> token = 'variable|default:"Default value"|date:"Y-m-d"'
+        >>> p = FilterParser(token)
+        >>> p.filters
+        [('default', 'Default value'), ('date', 'Y-m-d')]
+        >>> p.var
+        'variable'
+
+    This class should never be instantiated outside of the
+    get_filters_from_token helper function.
+    """
+    def __init__(self, token, parser):
+        self.token = token
+        matches = filter_re.finditer(token)
+        var = None
+        filters = []
+        upto = 0
+        for match in matches:
+            start = match.start()
+            if upto != start:
+                raise TemplateSyntaxError, "Could not parse some characters: %s|%s|%s"  % \
+                                           (token[:upto], token[upto:start], token[start:])
+            if var == None:
+                var, constant, i18n_constant = match.group("var", "constant", "i18n_constant")
+                if i18n_constant:
+                    var = '"%s"' %  _(i18n_constant)
+                elif constant:
+                    var = '"%s"' % constant
+                upto = match.end()
+                if var == None:
+                    raise TemplateSyntaxError, "Could not find variable at start of %s" % token
+                elif var.find(VARIABLE_ATTRIBUTE_SEPARATOR + '_') > -1 or var[0] == '_':
+                    raise TemplateSyntaxError, "Variables and attributes may not begin with underscores: '%s'" % var
+            else:
+                filter_name = match.group("filter_name")
+                args = []
+                constant_arg, i18n_arg, var_arg = match.group("constant_arg", "i18n_arg", "var_arg")
+                if i18n_arg:
+                    args.append((False, _(i18n_arg.replace(r'\"', '"'))))
+                elif constant_arg:
+                    args.append((False, constant_arg.replace(r'\"', '"')))
+                elif var_arg:
+                    args.append((True, var_arg))
+                filter_func = parser.find_filter(filter_name)
+                self.args_check(filter_name,filter_func, args)
+                filters.append( (filter_func,args))
+                upto = match.end()
+        if upto != len(token):
+            raise TemplateSyntaxError, "Could not parse the remainder: %s" % token[upto:]
+        self.var, self.filters = var, filters
+
+    def resolve(self, context, ignore_failures=False):
+        try:
+            obj = resolve_variable(self.var, context)
+        except VariableDoesNotExist:
+            if ignore_failures:
+                return None
+            else:
+                return settings.TEMPLATE_STRING_IF_INVALID
+        for func, args in self.filters:
+            arg_vals = []
+            for lookup, arg in args:
+                if not lookup:
+                    arg_vals.append(arg)
+                else:
+                    arg_vals.append(resolve_variable(arg, context))
+            obj = func(obj, *arg_vals)
+        return obj
+
+    def args_check(name, func, provided):
+        provided = list(provided)
+        plen = len(provided)
+        args, varargs, varkw, defaults = getargspec(func)
+        # First argument is filter input.
+        args.pop(0)
+        if defaults:
+            nondefs = args[:-len(defaults)]
+        else:
+            nondefs = args
+        # Args without defaults must be provided.
+        try:
+            for arg in nondefs:
+                provided.pop(0)
+        except IndexError:
+            # Not enough
+            raise TemplateSyntaxError, "%s requires %d arguments, %d provided" % (name, len(nondefs), plen)
+
+        # Defaults can be overridden.
+        defaults = defaults and list(defaults) or []
+        try:
+            for parg in provided:
+                defaults.pop(0)
+        except IndexError:
+            # Too many.
+            raise TemplateSyntaxError, "%s requires %d arguments, %d provided" % (name, len(nondefs), plen)
+
+        return True
+    args_check = staticmethod(args_check)
+
+    def __str__(self):
+        return self.token
+
+def resolve_variable(path, context):
+    """
+    Returns the resolved variable, which may contain attribute syntax, within
+    the given context. The variable may be a hard-coded string (if it begins
+    and ends with single or double quote marks).
+
+    >>> c = {'article': {'section':'News'}}
+    >>> resolve_variable('article.section', c)
+    'News'
+    >>> resolve_variable('article', c)
+    {'section': 'News'}
+    >>> class AClass: pass
+    >>> c = AClass()
+    >>> c.article = AClass()
+    >>> c.article.section = 'News'
+    >>> resolve_variable('article.section', c)
+    'News'
+
+    (The example assumes VARIABLE_ATTRIBUTE_SEPARATOR is '.')
+    """
+    if path == 'False':
+        current = False
+    elif path == 'True':
+        current = True
+    elif path[0].isdigit():
+        number_type = '.' in path and float or int
+        try:
+            current = number_type(path)
+        except ValueError:
+            current = settings.TEMPLATE_STRING_IF_INVALID
+    elif path[0] in ('"', "'") and path[0] == path[-1]:
+        current = path[1:-1]
+    else:
+        current = context
+        bits = path.split(VARIABLE_ATTRIBUTE_SEPARATOR)
+        while bits:
+            try: # dictionary lookup
+                current = current[bits[0]]
+            except (TypeError, AttributeError, KeyError):
+                try: # attribute lookup
+                    current = getattr(current, bits[0])
+                    if callable(current):
+                        if getattr(current, 'alters_data', False):
+                            current = settings.TEMPLATE_STRING_IF_INVALID
+                        else:
+                            try: # method call (assuming no args required)
+                                current = current()
+                            except TypeError: # arguments *were* required
+                                # GOTCHA: This will also catch any TypeError
+                                # raised in the function itself.
+                                current = settings.TEMPLATE_STRING_IF_INVALID # invalid method call
+                            except Exception, e:
+                                if getattr(e, 'silent_variable_failure', False):
+                                    current = settings.TEMPLATE_STRING_IF_INVALID
+                                else:
+                                    raise
+                except (TypeError, AttributeError):
+                    try: # list-index lookup
+                        current = current[int(bits[0])]
+                    except (IndexError, ValueError, KeyError):
+                        raise VariableDoesNotExist, "Failed lookup for key [%s] in %r" % (bits[0], current) # missing attribute
+                except Exception, e:
+                    if getattr(e, 'silent_variable_failure', False):
+                        current = settings.TEMPLATE_STRING_IF_INVALID
+                    else:
+                        raise
+            del bits[0]
+    return current
+
+class Node(object):
+    def render(self, context):
+        "Return the node rendered as a string"
+        pass
+
+    def __iter__(self):
+        yield self
+
+    def get_nodes_by_type(self, nodetype):
+        "Return a list of all nodes (within this node and its nodelist) of the given type"
+        nodes = []
+        if isinstance(self, nodetype):
+            nodes.append(self)
+        if hasattr(self, 'nodelist'):
+            nodes.extend(self.nodelist.get_nodes_by_type(nodetype))
+        return nodes
+
+class NodeList(list):
+    def render(self, context):
+        bits = []
+        for node in self:
+            if isinstance(node, Node):
+                bits.append(self.render_node(node, context))
+            else:
+                bits.append(node)
+        return ''.join(bits)
+
+    def get_nodes_by_type(self, nodetype):
+        "Return a list of all nodes of the given type"
+        nodes = []
+        for node in self:
+            nodes.extend(node.get_nodes_by_type(nodetype))
+        return nodes
+
+    def render_node(self, node, context):
+        return(node.render(context))
+
+class DebugNodeList(NodeList):
+    def render_node(self, node, context):
+        try:
+            result = node.render(context)
+        except TemplateSyntaxError, e:
+            if not hasattr(e, 'source'):
+                e.source = node.source
+            raise
+        except Exception, e:
+            from sys import exc_info
+            wrapped = TemplateSyntaxError('Caught an exception while rendering: %s' % e)
+            wrapped.source = node.source
+            wrapped.exc_info = exc_info()
+            raise wrapped
+        return result
+
+class TextNode(Node):
+    def __init__(self, s):
+        self.s = s
+
+    def __repr__(self):
+        return "<Text Node: '%s'>" % self.s[:25]
+
+    def render(self, context):
+        return self.s
+
+class VariableNode(Node):
+    def __init__(self, filter_expression):
+        self.filter_expression = filter_expression
+
+    def __repr__(self):
+        return "<Variable Node: %s>" % self.filter_expression
+
+    def encode_output(self, output):
+        # Check type so that we don't run str() on a Unicode object
+        if not isinstance(output, basestring):
+            return str(output)
+        elif isinstance(output, unicode):
+            return output.encode(settings.DEFAULT_CHARSET)
+        else:
+            return output
+
+    def render(self, context):
+        output = self.filter_expression.resolve(context)
+        return self.encode_output(output)
+
+class DebugVariableNode(VariableNode):
+    def render(self, context):
+        try:
+            output = self.filter_expression.resolve(context)
+        except TemplateSyntaxError, e:
+            if not hasattr(e, 'source'):
+                e.source = self.source
+            raise
+        return self.encode_output(output)
+
+def generic_tag_compiler(params, defaults, name, node_class, parser, token):
+    "Returns a template.Node subclass."
+    bits = token.split_contents()[1:]
+    bmax = len(params)
+    def_len = defaults and len(defaults) or 0
+    bmin = bmax - def_len
+    if(len(bits) < bmin or len(bits) > bmax):
+        if bmin == bmax:
+            message = "%s takes %s arguments" % (name, bmin)
+        else:
+            message = "%s takes between %s and %s arguments" % (name, bmin, bmax)
+        raise TemplateSyntaxError, message
+    return node_class(bits)
+
+class Library(object):
+    def __init__(self):
+        self.filters = {}
+        self.tags = {}
+
+    def tag(self, name=None, compile_function=None):
+        if name == None and compile_function == None:
+            # @register.tag()
+            return self.tag_function
+        elif name != None and compile_function == None:
+            if(callable(name)):
+                # @register.tag
+                return self.tag_function(name)
+            else:
+                # @register.tag('somename') or @register.tag(name='somename')
+                def dec(func):
+                    return self.tag(name, func)
+                return dec
+        elif name != None and compile_function != None:
+            # register.tag('somename', somefunc)
+            self.tags[name] = compile_function
+            return compile_function
+        else:
+            raise InvalidTemplateLibrary, "Unsupported arguments to Library.tag: (%r, %r)", (name, compile_function)
+
+    def tag_function(self,func):
+        self.tags[func.__name__] = func
+        return func
+
+    def filter(self, name=None, filter_func=None):
+        if name == None and filter_func == None:
+            # @register.filter()
+            return self.filter_function
+        elif filter_func == None:
+            if(callable(name)):
+                # @register.filter
+                return self.filter_function(name)
+            else:
+                # @register.filter('somename') or @register.filter(name='somename')
+                def dec(func):
+                    return self.filter(name, func)
+                return dec
+        elif name != None and filter_func != None:
+            # register.filter('somename', somefunc)
+            self.filters[name] = filter_func
+            return filter_func
+        else:
+            raise InvalidTemplateLibrary, "Unsupported arguments to Library.filter: (%r, %r)", (name, filter_func)
+
+    def filter_function(self, func):
+        self.filters[func.__name__] = func
+        return func
+
+    def simple_tag(self,func):
+        params, xx, xxx, defaults = getargspec(func)
+
+        class SimpleNode(Node):
+            def __init__(self, vars_to_resolve):
+                self.vars_to_resolve = vars_to_resolve
+
+            def render(self, context):
+                resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve]
+                return func(*resolved_vars)
+
+        compile_func = curry(generic_tag_compiler, params, defaults, func.__name__, SimpleNode)
+        compile_func.__doc__ = func.__doc__
+        self.tag(func.__name__, compile_func)
+        return func
+
+    def inclusion_tag(self, file_name, context_class=Context, takes_context=False):
+        def dec(func):
+            params, xx, xxx, defaults = getargspec(func)
+            if takes_context:
+                if params[0] == 'context':
+                    params = params[1:]
+                else:
+                    raise TemplateSyntaxError, "Any tag function decorated with takes_context=True must have a first argument of 'context'"
+
+            class InclusionNode(Node):
+                def __init__(self, vars_to_resolve):
+                    self.vars_to_resolve = vars_to_resolve
+
+                def render(self, context):
+                    resolved_vars = [resolve_variable(var, context) for var in self.vars_to_resolve]
+                    if takes_context:
+                        args = [context] + resolved_vars
+                    else:
+                        args = resolved_vars
+
+                    dict = func(*args)
+
+                    if not getattr(self, 'nodelist', False):
+                        from django.template.loader import get_template
+                        t = get_template(file_name)
+                        self.nodelist = t.nodelist
+                    return self.nodelist.render(context_class(dict))
+
+            compile_func = curry(generic_tag_compiler, params, defaults, func.__name__, InclusionNode)
+            compile_func.__doc__ = func.__doc__
+            self.tag(func.__name__, compile_func)
+            return func
+        return dec
+
+def get_library(module_name):
+    lib = libraries.get(module_name, None)
+    if not lib:
+        try:
+            mod = __import__(module_name, '', '', [''])
+        except ImportError, e:
+            raise InvalidTemplateLibrary, "Could not load template library from %s, %s" % (module_name, e)
+        try:
+            lib = mod.register
+            libraries[module_name] = lib
+        except AttributeError:
+            raise InvalidTemplateLibrary, "Template library %s does not have a variable named 'register'" % module_name
+    return lib
+
+def add_to_builtins(module_name):
+    builtins.append(get_library(module_name))
+
+add_to_builtins('django.template.defaulttags')
+add_to_builtins('django.template.defaultfilters')

Added: vendor/django/current/django/template/context.py
===================================================================
--- vendor/django/current/django/template/context.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/context.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,97 @@
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+
+_standard_context_processors = None
+
+class ContextPopException(Exception):
+    "pop() has been called more times than push()"
+    pass
+
+class Context(object):
+    "A stack container for variable context"
+    def __init__(self, dict_=None):
+        dict_ = dict_ or {}
+        self.dicts = [dict_]
+
+    def __repr__(self):
+        return repr(self.dicts)
+
+    def __iter__(self):
+        for d in self.dicts:
+            yield d
+
+    def push(self):
+        self.dicts = [{}] + self.dicts
+
+    def pop(self):
+        if len(self.dicts) == 1:
+            raise ContextPopException
+        del self.dicts[0]
+
+    def __setitem__(self, key, value):
+        "Set a variable in the current context"
+        self.dicts[0][key] = value
+
+    def __getitem__(self, key):
+        "Get a variable's value, starting at the current context and going upward"
+        for d in self.dicts:
+            if d.has_key(key):
+                return d[key]
+        raise KeyError(key)
+
+    def __delitem__(self, key):
+        "Delete a variable from the current context"
+        del self.dicts[0][key]
+
+    def has_key(self, key):
+        for d in self.dicts:
+            if d.has_key(key):
+                return True
+        return False
+
+    def get(self, key, otherwise=None):
+        for d in self.dicts:
+            if d.has_key(key):
+                return d[key]
+        return otherwise
+
+    def update(self, other_dict):
+        "Like dict.update(). Pushes an entire dictionary's keys and values onto the context."
+        self.dicts = [other_dict] + self.dicts
+
+# This is a function rather than module-level procedural code because we only
+# want it to execute if somebody uses RequestContext.
+def get_standard_processors():
+    global _standard_context_processors
+    if _standard_context_processors is None:
+        processors = []
+        for path in settings.TEMPLATE_CONTEXT_PROCESSORS:
+            i = path.rfind('.')
+            module, attr = path[:i], path[i+1:]
+            try:
+                mod = __import__(module, '', '', [attr])
+            except ImportError, e:
+                raise ImproperlyConfigured, 'Error importing request processor module %s: "%s"' % (module, e)
+            try:
+                func = getattr(mod, attr)
+            except AttributeError:
+                raise ImproperlyConfigured, 'Module "%s" does not define a "%s" callable request processor' % (module, attr)
+            processors.append(func)
+        _standard_context_processors = tuple(processors)
+    return _standard_context_processors
+
+class RequestContext(Context):
+    """
+    This subclass of template.Context automatically populates itself using
+    the processors defined in TEMPLATE_CONTEXT_PROCESSORS.
+    Additional processors can be specified as a list of callables
+    using the "processors" keyword argument.
+    """
+    def __init__(self, request, dict=None, processors=None):
+        Context.__init__(self, dict)
+        if processors is None:
+            processors = ()
+        else:
+            processors = tuple(processors)
+        for processor in get_standard_processors() + processors:
+            self.update(processor(request))

Added: vendor/django/current/django/template/defaultfilters.py
===================================================================
--- vendor/django/current/django/template/defaultfilters.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/defaultfilters.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,522 @@
+"Default variable filters"
+
+from django.template import resolve_variable, Library
+from django.conf import settings
+from django.utils.translation import gettext
+import re
+import random as random_module
+
+register = Library()
+
+###################
+# STRINGS         #
+###################
+
+
+def addslashes(value):
+    "Adds slashes - useful for passing strings to JavaScript, for example."
+    return value.replace('"', '\\"').replace("'", "\\'")
+
+def capfirst(value):
+    "Capitalizes the first character of the value"
+    value = str(value)
+    return value and value[0].upper() + value[1:]
+
+def fix_ampersands(value):
+    "Replaces ampersands with ``&amp;`` entities"
+    from django.utils.html import fix_ampersands
+    return fix_ampersands(value)
+
+def floatformat(text):
+    """
+    Displays a floating point number as 34.2 (with one decimal place) -- but
+    only if there's a point to be displayed
+    """
+    try:
+        f = float(text)
+    except ValueError:
+        return ''
+    m = f - int(f)
+    if m:
+        return '%.1f' % f
+    else:
+        return '%d' % int(f)
+
+def linenumbers(value):
+    "Displays text with line numbers"
+    from django.utils.html import escape
+    lines = value.split('\n')
+    # Find the maximum width of the line count, for use with zero padding string format command
+    width = str(len(str(len(lines))))
+    for i, line in enumerate(lines):
+        lines[i] = ("%0" + width  + "d. %s") % (i + 1, escape(line))
+    return '\n'.join(lines)
+
+def lower(value):
+    "Converts a string into all lowercase"
+    return value.lower()
+
+def make_list(value):
+    """
+    Returns the value turned into a list. For an integer, it's a list of
+    digits. For a string, it's a list of characters.
+    """
+    return list(str(value))
+
+def slugify(value):
+    "Converts to lowercase, removes non-alpha chars and converts spaces to hyphens"
+    value = re.sub('[^\w\s-]', '', value).strip().lower()
+    return re.sub('[-\s]+', '-', value)
+
+def stringformat(value, arg):
+    """
+    Formats the variable according to the argument, a string formatting specifier.
+    This specifier uses Python string formating syntax, with the exception that
+    the leading "%" is dropped.
+
+    See http://docs.python.org/lib/typesseq-strings.html for documentation
+    of Python string formatting
+    """
+    try:
+        return ("%" + arg) % value
+    except (ValueError, TypeError):
+        return ""
+
+def title(value):
+    "Converts a string into titlecase"
+    return re.sub("([a-z])'([A-Z])", lambda m: m.group(0).lower(), value.title())
+
+def truncatewords(value, arg):
+    """
+    Truncates a string after a certain number of words
+
+    Argument: Number of words to truncate after
+    """
+    from django.utils.text import truncate_words
+    try:
+        length = int(arg)
+    except ValueError: # invalid literal for int()
+        return value # Fail silently.
+    if not isinstance(value, basestring):
+        value = str(value)
+    return truncate_words(value, length)
+
+def upper(value):
+    "Converts a string into all uppercase"
+    return value.upper()
+
+def urlencode(value):
+    "Escapes a value for use in a URL"
+    import urllib
+    return urllib.quote(value)
+
+def urlize(value):
+    "Converts URLs in plain text into clickable links"
+    from django.utils.html import urlize
+    return urlize(value, nofollow=True)
+
+def urlizetrunc(value, limit):
+    """
+    Converts URLs into clickable links, truncating URLs to the given character limit,
+    and adding 'rel=nofollow' attribute to discourage spamming.
+
+    Argument: Length to truncate URLs to.
+    """
+    from django.utils.html import urlize
+    return urlize(value, trim_url_limit=int(limit), nofollow=True)
+
+def wordcount(value):
+    "Returns the number of words"
+    return len(value.split())
+
+def wordwrap(value, arg):
+    """
+    Wraps words at specified line length
+
+    Argument: number of characters to wrap the text at.
+    """
+    from django.utils.text import wrap
+    return wrap(str(value), int(arg))
+
+def ljust(value, arg):
+    """
+    Left-aligns the value in a field of a given width
+
+    Argument: field size
+    """
+    return str(value).ljust(int(arg))
+
+def rjust(value, arg):
+    """
+    Right-aligns the value in a field of a given width
+
+    Argument: field size
+    """
+    return str(value).rjust(int(arg))
+
+def center(value, arg):
+    "Centers the value in a field of a given width"
+    return str(value).center(int(arg))
+
+def cut(value, arg):
+    "Removes all values of arg from the given string"
+    return value.replace(arg, '')
+
+###################
+# HTML STRINGS    #
+###################
+
+def escape(value):
+    "Escapes a string's HTML"
+    from django.utils.html import escape
+    return escape(value)
+
+def linebreaks(value):
+    "Converts newlines into <p> and <br />s"
+    from django.utils.html import linebreaks
+    return linebreaks(value)
+
+def linebreaksbr(value):
+    "Converts newlines into <br />s"
+    return value.replace('\n', '<br />')
+
+def removetags(value, tags):
+    "Removes a space separated list of [X]HTML tags from the output"
+    tags = [re.escape(tag) for tag in tags.split()]
+    tags_re = '(%s)' % '|'.join(tags)
+    starttag_re = re.compile(r'<%s(/?>|(\s+[^>]*>))' % tags_re)
+    endtag_re = re.compile('</%s>' % tags_re)
+    value = starttag_re.sub('', value)
+    value = endtag_re.sub('', value)
+    return value
+
+def striptags(value):
+    "Strips all [X]HTML tags"
+    from django.utils.html import strip_tags
+    if not isinstance(value, basestring):
+        value = str(value)
+    return strip_tags(value)
+
+###################
+# LISTS           #
+###################
+
+def dictsort(value, arg):
+    """
+    Takes a list of dicts, returns that list sorted by the property given in
+    the argument.
+    """
+    decorated = [(resolve_variable('var.' + arg, {'var' : item}), item) for item in value]
+    decorated.sort()
+    return [item[1] for item in decorated]
+
+def dictsortreversed(value, arg):
+    """
+    Takes a list of dicts, returns that list sorted in reverse order by the
+    property given in the argument.
+    """
+    decorated = [(resolve_variable('var.' + arg, {'var' : item}), item) for item in value]
+    decorated.sort()
+    decorated.reverse()
+    return [item[1] for item in decorated]
+
+def first(value):
+    "Returns the first item in a list"
+    try:
+        return value[0]
+    except IndexError:
+        return ''
+
+def join(value, arg):
+    "Joins a list with a string, like Python's ``str.join(list)``"
+    try:
+        return arg.join(map(str, value))
+    except AttributeError: # fail silently but nicely
+        return value
+
+def length(value):
+    "Returns the length of the value - useful for lists"
+    return len(value)
+
+def length_is(value, arg):
+    "Returns a boolean of whether the value's length is the argument"
+    return len(value) == int(arg)
+
+def random(value):
+    "Returns a random item from the list"
+    return random_module.choice(value)
+
+def slice_(value, arg):
+    """
+    Returns a slice of the list.
+
+    Uses the same syntax as Python's list slicing; see
+    http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice
+    for an introduction.
+    """
+    try:
+        bits = []
+        for x in arg.split(':'):
+            if len(x) == 0:
+                bits.append(None)
+            else:
+                bits.append(int(x))
+        return value[slice(*bits)]
+
+    except (ValueError, TypeError):
+        return value # Fail silently.
+
+def unordered_list(value):
+    """
+    Recursively takes a self-nested list and returns an HTML unordered list --
+    WITHOUT opening and closing <ul> tags.
+
+    The list is assumed to be in the proper format. For example, if ``var`` contains
+    ``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``,
+    then ``{{ var|unordered_list }}`` would return::
+
+        <li>States
+        <ul>
+                <li>Kansas
+                <ul>
+                        <li>Lawrence</li>
+                        <li>Topeka</li>
+                </ul>
+                </li>
+                <li>Illinois</li>
+        </ul>
+        </li>
+    """
+    def _helper(value, tabs):
+        indent = '\t' * tabs
+        if value[1]:
+            return '%s<li>%s\n%s<ul>\n%s\n%s</ul>\n%s</li>' % (indent, value[0], indent,
+                '\n'.join([_helper(v, tabs+1) for v in value[1]]), indent, indent)
+        else:
+            return '%s<li>%s</li>' % (indent, value[0])
+    return _helper(value, 1)
+
+###################
+# INTEGERS        #
+###################
+
+def add(value, arg):
+    "Adds the arg to the value"
+    return int(value) + int(arg)
+
+def get_digit(value, arg):
+    """
+    Given a whole number, returns the requested digit of it, where 1 is the
+    right-most digit, 2 is the second-right-most digit, etc. Returns the
+    original value for invalid input (if input or argument is not an integer,
+    or if argument is less than 1). Otherwise, output is always an integer.
+    """
+    try:
+        arg = int(arg)
+        value = int(value)
+    except ValueError:
+        return value # Fail silently for an invalid argument
+    if arg < 1:
+        return value
+    try:
+        return int(str(value)[-arg])
+    except IndexError:
+        return 0
+
+###################
+# DATES           #
+###################
+
+def date(value, arg=None):
+    "Formats a date according to the given format"
+    from django.utils.dateformat import format
+    if not value:
+        return ''
+    if arg is None:
+        arg = settings.DATE_FORMAT
+    return format(value, arg)
+
+def time(value, arg=None):
+    "Formats a time according to the given format"
+    from django.utils.dateformat import time_format
+    if not value:
+        return ''
+    if arg is None:
+        arg = settings.TIME_FORMAT
+    return time_format(value, arg)
+
+def timesince(value, arg=None):
+    'Formats a date as the time since that date (i.e. "4 days, 6 hours")'
+    from django.utils.timesince import timesince
+    if not value:
+        return ''
+    if arg:
+        return timesince(arg, value)
+    return timesince(value)
+
+def timeuntil(value, arg=None):
+    'Formats a date as the time until that date (i.e. "4 days, 6 hours")'
+    from django.utils.timesince import timesince
+    from datetime import datetime
+    if not value:
+        return ''
+    if arg:
+        return timesince(arg, value)
+    return timesince(datetime.now(), value)
+
+###################
+# LOGIC           #
+###################
+
+def default(value, arg):
+    "If value is unavailable, use given default"
+    return value or arg
+
+def default_if_none(value, arg):
+    "If value is None, use given default"
+    if value is None:
+        return arg
+    return value
+
+def divisibleby(value, arg):
+    "Returns true if the value is devisible by the argument"
+    return int(value) % int(arg) == 0
+
+def yesno(value, arg=None):
+    """
+    Given a string mapping values for true, false and (optionally) None,
+    returns one of those strings accoding to the value:
+
+    ==========  ======================  ==================================
+    Value       Argument                Outputs
+    ==========  ======================  ==================================
+    ``True``    ``"yeah,no,maybe"``     ``yeah``
+    ``False``   ``"yeah,no,maybe"``     ``no``
+    ``None``    ``"yeah,no,maybe"``     ``maybe``
+    ``None``    ``"yeah,no"``           ``"no"`` (converts None to False
+                                        if no mapping for None is given.
+    ==========  ======================  ==================================
+    """
+    if arg is None:
+        arg = gettext('yes,no,maybe')
+    bits = arg.split(',')
+    if len(bits) < 2:
+        return value # Invalid arg.
+    try:
+        yes, no, maybe = bits
+    except ValueError: # unpack list of wrong size (no "maybe" value provided)
+        yes, no, maybe = bits[0], bits[1], bits[1]
+    if value is None:
+        return maybe
+    if value:
+        return yes
+    return no
+
+###################
+# MISC            #
+###################
+
+def filesizeformat(bytes):
+    """
+    Format the value like a 'human-readable' file size (i.e. 13 KB, 4.1 MB, 102
+    bytes, etc).
+    """
+    bytes = float(bytes)
+    if bytes < 1024:
+        return "%d byte%s" % (bytes, bytes != 1 and 's' or '')
+    if bytes < 1024 * 1024:
+        return "%.1f KB" % (bytes / 1024)
+    if bytes < 1024 * 1024 * 1024:
+        return "%.1f MB" % (bytes / (1024 * 1024))
+    return "%.1f GB" % (bytes / (1024 * 1024 * 1024))
+
+def pluralize(value, arg='s'):
+    """
+    Returns a plural suffix if the value is not 1, for '1 vote' vs. '2 votes'
+    By default, 's' is used as a suffix; if an argument is provided, that string
+    is used instead. If the provided argument contains a comma, the text before
+    the comma is used for the singular case.
+    """
+    if not ',' in arg: 
+        arg = ',' + arg
+    bits = arg.split(',')
+    if len(bits) > 2:
+        return ''
+    singular_suffix, plural_suffix = bits[:2]
+
+    try:
+        if int(value) != 1:
+            return plural_suffix
+    except ValueError: # invalid string that's not a number
+        pass
+    except TypeError: # value isn't a string or a number; maybe it's a list?
+        try:
+            if len(value) != 1:
+                return plural_suffix
+        except TypeError: # len() of unsized object
+            pass
+    return singular_suffix
+
+def phone2numeric(value):
+    "Takes a phone number and converts it in to its numerical equivalent"
+    from django.utils.text import phone2numeric
+    return phone2numeric(value)
+
+def pprint(value):
+    "A wrapper around pprint.pprint -- for debugging, really"
+    from pprint import pformat
+    try:
+        return pformat(value)
+    except Exception, e:
+        return "Error in formatting:%s" % e
+
+# Syntax: register.filter(name of filter, callback)
+register.filter(add)
+register.filter(addslashes)
+register.filter(capfirst)
+register.filter(center)
+register.filter(cut)
+register.filter(date)
+register.filter(default)
+register.filter(default_if_none)
+register.filter(dictsort)
+register.filter(dictsortreversed)
+register.filter(divisibleby)
+register.filter(escape)
+register.filter(filesizeformat)
+register.filter(first)
+register.filter(fix_ampersands)
+register.filter(floatformat)
+register.filter(get_digit)
+register.filter(join)
+register.filter(length)
+register.filter(length_is)
+register.filter(linebreaks)
+register.filter(linebreaksbr)
+register.filter(linenumbers)
+register.filter(ljust)
+register.filter(lower)
+register.filter(make_list)
+register.filter(phone2numeric)
+register.filter(pluralize)
+register.filter(pprint)
+register.filter(removetags)
+register.filter(random)
+register.filter(rjust)
+register.filter('slice', slice_)
+register.filter(slugify)
+register.filter(stringformat)
+register.filter(striptags)
+register.filter(time)
+register.filter(timesince)
+register.filter(timeuntil)
+register.filter(title)
+register.filter(truncatewords)
+register.filter(unordered_list)
+register.filter(upper)
+register.filter(urlencode)
+register.filter(urlize)
+register.filter(urlizetrunc)
+register.filter(wordcount)
+register.filter(wordwrap)
+register.filter(yesno)

Added: vendor/django/current/django/template/defaulttags.py
===================================================================
--- vendor/django/current/django/template/defaulttags.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/defaulttags.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,864 @@
+"Default tags used by the template system, available to all templates."
+
+from django.template import Node, NodeList, Template, Context, resolve_variable
+from django.template import TemplateSyntaxError, VariableDoesNotExist, BLOCK_TAG_START, BLOCK_TAG_END, VARIABLE_TAG_START, VARIABLE_TAG_END, SINGLE_BRACE_START, SINGLE_BRACE_END
+from django.template import get_library, Library, InvalidTemplateLibrary
+from django.conf import settings
+import sys
+
+register = Library()
+
+class CommentNode(Node):
+    def render(self, context):
+        return ''
+
+class CycleNode(Node):
+    def __init__(self, cyclevars):
+        self.cyclevars = cyclevars
+        self.cyclevars_len = len(cyclevars)
+        self.counter = -1
+
+    def render(self, context):
+        self.counter += 1
+        return self.cyclevars[self.counter % self.cyclevars_len]
+
+class DebugNode(Node):
+    def render(self, context):
+        from pprint import pformat
+        output = [pformat(val) for val in context]
+        output.append('\n\n')
+        output.append(pformat(sys.modules))
+        return ''.join(output)
+
+class FilterNode(Node):
+    def __init__(self, filter_expr, nodelist):
+        self.filter_expr, self.nodelist = filter_expr, nodelist
+
+    def render(self, context):
+        output = self.nodelist.render(context)
+        # apply filters
+        return self.filter_expr.resolve(Context({'var': output}))
+
+class FirstOfNode(Node):
+    def __init__(self, vars):
+        self.vars = vars
+
+    def render(self, context):
+        for var in self.vars:
+            try:
+                value = resolve_variable(var, context)
+            except VariableDoesNotExist:
+                continue
+            if value:
+                return str(value)
+        return ''
+
+class ForNode(Node):
+    def __init__(self, loopvar, sequence, reversed, nodelist_loop):
+        self.loopvar, self.sequence = loopvar, sequence
+        self.reversed = reversed
+        self.nodelist_loop = nodelist_loop
+
+    def __repr__(self):
+        if self.reversed:
+            reversed = ' reversed'
+        else:
+            reversed = ''
+        return "<For Node: for %s in %s, tail_len: %d%s>" % \
+            (self.loopvar, self.sequence, len(self.nodelist_loop), reversed)
+
+    def __iter__(self):
+        for node in self.nodelist_loop:
+            yield node
+
+    def get_nodes_by_type(self, nodetype):
+        nodes = []
+        if isinstance(self, nodetype):
+            nodes.append(self)
+        nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype))
+        return nodes
+
+    def render(self, context):
+        nodelist = NodeList()
+        if context.has_key('forloop'):
+            parentloop = context['forloop']
+        else:
+            parentloop = {}
+        context.push()
+        try:
+            values = self.sequence.resolve(context)
+        except VariableDoesNotExist:
+            values = []
+        if values is None:
+            values = []
+        if not hasattr(values, '__len__'):
+            values = list(values)
+        len_values = len(values)
+        if self.reversed:
+            # From http://www.python.org/doc/current/tut/node11.html
+            def reverse(data):
+                for index in range(len(data)-1, -1, -1):
+                    yield data[index]
+            values = reverse(values)
+        for i, item in enumerate(values):
+            context['forloop'] = {
+                # shortcuts for current loop iteration number
+                'counter0': i,
+                'counter': i+1,
+                # reverse counter iteration numbers
+                'revcounter': len_values - i,
+                'revcounter0': len_values - i - 1,
+                # boolean values designating first and last times through loop
+                'first': (i == 0),
+                'last': (i == len_values - 1),
+                'parentloop': parentloop,
+            }
+            context[self.loopvar] = item
+            for node in self.nodelist_loop:
+                nodelist.append(node.render(context))
+        context.pop()
+        return nodelist.render(context)
+
+class IfChangedNode(Node):
+    def __init__(self, nodelist):
+        self.nodelist = nodelist
+        self._last_seen = None
+
+    def render(self, context):
+        content = self.nodelist.render(context)
+        if content != self._last_seen:
+            firstloop = (self._last_seen == None)
+            self._last_seen = content
+            context.push()
+            context['ifchanged'] = {'firstloop': firstloop}
+            content = self.nodelist.render(context)
+            context.pop()
+            return content
+        else:
+            return ''
+
+class IfEqualNode(Node):
+    def __init__(self, var1, var2, nodelist_true, nodelist_false, negate):
+        self.var1, self.var2 = var1, var2
+        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
+        self.negate = negate
+
+    def __repr__(self):
+        return "<IfEqualNode>"
+
+    def render(self, context):
+        try:
+            val1 = resolve_variable(self.var1, context)
+        except VariableDoesNotExist:
+            val1 = None
+        try:
+            val2 = resolve_variable(self.var2, context)
+        except VariableDoesNotExist:
+            val2 = None
+        if (self.negate and val1 != val2) or (not self.negate and val1 == val2):
+            return self.nodelist_true.render(context)
+        return self.nodelist_false.render(context)
+
+class IfNode(Node):
+    def __init__(self, bool_exprs, nodelist_true, nodelist_false, link_type):
+        self.bool_exprs = bool_exprs
+        self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false
+        self.link_type = link_type
+
+    def __repr__(self):
+        return "<If node>"
+
+    def __iter__(self):
+        for node in self.nodelist_true:
+            yield node
+        for node in self.nodelist_false:
+            yield node
+
+    def get_nodes_by_type(self, nodetype):
+        nodes = []
+        if isinstance(self, nodetype):
+            nodes.append(self)
+        nodes.extend(self.nodelist_true.get_nodes_by_type(nodetype))
+        nodes.extend(self.nodelist_false.get_nodes_by_type(nodetype))
+        return nodes
+
+    def render(self, context):
+        if self.link_type == IfNode.LinkTypes.or_:
+            for ifnot, bool_expr in self.bool_exprs:
+                try:
+                    value = bool_expr.resolve(context, True)
+                except VariableDoesNotExist:
+                    value = None
+                if (value and not ifnot) or (ifnot and not value):
+                    return self.nodelist_true.render(context)
+            return self.nodelist_false.render(context)
+        else:
+            for ifnot, bool_expr in self.bool_exprs:
+                try:
+                    value = bool_expr.resolve(context, True)
+                except VariableDoesNotExist:
+                    value = None
+                if not ((value and not ifnot) or (ifnot and not value)):
+                    return self.nodelist_false.render(context)
+            return self.nodelist_true.render(context)
+
+    class LinkTypes:
+        and_ = 0,
+        or_ = 1
+
+class RegroupNode(Node):
+    def __init__(self, target, expression, var_name):
+        self.target, self.expression = target, expression
+        self.var_name = var_name
+
+    def render(self, context):
+        obj_list = self.target.resolve(context)
+        if obj_list == '': # target_var wasn't found in context; fail silently
+            context[self.var_name] = []
+            return ''
+        output = [] # list of dictionaries in the format {'grouper': 'key', 'list': [list of contents]}
+        for obj in obj_list:
+            grouper = self.expression.resolve(Context({'var': obj}))
+            # TODO: Is this a sensible way to determine equality?
+            if output and repr(output[-1]['grouper']) == repr(grouper):
+                output[-1]['list'].append(obj)
+            else:
+                output.append({'grouper': grouper, 'list': [obj]})
+        context[self.var_name] = output
+        return ''
+
+def include_is_allowed(filepath):
+    for root in settings.ALLOWED_INCLUDE_ROOTS:
+        if filepath.startswith(root):
+            return True
+    return False
+
+class SsiNode(Node):
+    def __init__(self, filepath, parsed):
+        self.filepath, self.parsed = filepath, parsed
+
+    def render(self, context):
+        if not include_is_allowed(self.filepath):
+            if settings.DEBUG:
+                return "[Didn't have permission to include file]"
+            else:
+                return '' # Fail silently for invalid includes.
+        try:
+            fp = open(self.filepath, 'r')
+            output = fp.read()
+            fp.close()
+        except IOError:
+            output = ''
+        if self.parsed:
+            try:
+                t = Template(output)
+                return t.render(context)
+            except TemplateSyntaxError, e:
+                if settings.DEBUG:
+                    return "[Included template had syntax error: %s]" % e
+                else:
+                    return '' # Fail silently for invalid included templates.
+        return output
+
+class LoadNode(Node):
+    def render(self, context):
+        return ''
+
+class NowNode(Node):
+    def __init__(self, format_string):
+        self.format_string = format_string
+
+    def render(self, context):
+        from datetime import datetime
+        from django.utils.dateformat import DateFormat
+        df = DateFormat(datetime.now())
+        return df.format(self.format_string)
+
+class SpacelessNode(Node):
+    def __init__(self, nodelist):
+        self.nodelist = nodelist
+
+    def render(self, context):
+        from django.utils.html import strip_spaces_between_tags
+        return strip_spaces_between_tags(self.nodelist.render(context).strip())
+
+class TemplateTagNode(Node):
+    mapping = {'openblock': BLOCK_TAG_START,
+               'closeblock': BLOCK_TAG_END,
+               'openvariable': VARIABLE_TAG_START,
+               'closevariable': VARIABLE_TAG_END,
+               'openbrace': SINGLE_BRACE_START,
+               'closebrace': SINGLE_BRACE_END,
+               }
+
+    def __init__(self, tagtype):
+        self.tagtype = tagtype
+
+    def render(self, context):
+        return self.mapping.get(self.tagtype, '')
+
+class WidthRatioNode(Node):
+    def __init__(self, val_expr, max_expr, max_width):
+        self.val_expr = val_expr
+        self.max_expr = max_expr
+        self.max_width = max_width
+
+    def render(self, context):
+        try:
+            value = self.val_expr.resolve(context)
+            maxvalue = self.max_expr.resolve(context)
+        except VariableDoesNotExist:
+            return ''
+        try:
+            value = float(value)
+            maxvalue = float(maxvalue)
+            ratio = (value / maxvalue) * int(self.max_width)
+        except (ValueError, ZeroDivisionError):
+            return ''
+        return str(int(round(ratio)))
+
+#@register.tag
+def comment(parser, token):
+    """
+    Ignore everything between ``{% comment %}`` and ``{% endcomment %}``
+    """
+    parser.skip_past('endcomment')
+    return CommentNode()
+comment = register.tag(comment)
+
+#@register.tag
+def cycle(parser, token):
+    """
+    Cycle among the given strings each time this tag is encountered
+
+    Within a loop, cycles among the given strings each time through
+    the loop::
+
+        {% for o in some_list %}
+            <tr class="{% cycle row1,row2 %}">
+                ...
+            </tr>
+        {% endfor %}
+
+    Outside of a loop, give the values a unique name the first time you call
+    it, then use that name each sucessive time through::
+
+            <tr class="{% cycle row1,row2,row3 as rowcolors %}">...</tr>
+            <tr class="{% cycle rowcolors %}">...</tr>
+            <tr class="{% cycle rowcolors %}">...</tr>
+
+    You can use any number of values, seperated by commas. Make sure not to
+    put spaces between the values -- only commas.
+    """
+
+    # Note: This returns the exact same node on each {% cycle name %} call; that
+    # is, the node object returned from {% cycle a,b,c as name %} and the one
+    # returned from {% cycle name %} are the exact same object.  This shouldn't
+    # cause problems (heh), but if it does, now you know.
+    #
+    # Ugly hack warning: this stuffs the named template dict into parser so
+    # that names are only unique within each template (as opposed to using
+    # a global variable, which would make cycle names have to be unique across
+    # *all* templates.
+
+    args = token.contents.split()
+    if len(args) < 2:
+        raise TemplateSyntaxError("'Cycle' statement requires at least two arguments")
+
+    elif len(args) == 2 and "," in args[1]:
+        # {% cycle a,b,c %}
+        cyclevars = [v for v in args[1].split(",") if v]    # split and kill blanks
+        return CycleNode(cyclevars)
+        # {% cycle name %}
+
+    elif len(args) == 2:
+        name = args[1]
+        if not hasattr(parser, '_namedCycleNodes'):
+            raise TemplateSyntaxError("No named cycles in template: '%s' is not defined" % name)
+        if not parser._namedCycleNodes.has_key(name):
+            raise TemplateSyntaxError("Named cycle '%s' does not exist" % name)
+        return parser._namedCycleNodes[name]
+
+    elif len(args) == 4:
+        # {% cycle a,b,c as name %}
+        if args[2] != 'as':
+            raise TemplateSyntaxError("Second 'cycle' argument must be 'as'")
+        cyclevars = [v for v in args[1].split(",") if v]    # split and kill blanks
+        name = args[3]
+        node = CycleNode(cyclevars)
+
+        if not hasattr(parser, '_namedCycleNodes'):
+            parser._namedCycleNodes = {}
+
+        parser._namedCycleNodes[name] = node
+        return node
+
+    else:
+        raise TemplateSyntaxError("Invalid arguments to 'cycle': %s" % args)
+cycle = register.tag(cycle)
+
+def debug(parser, token):
+    return DebugNode()
+debug = register.tag(debug)
+
+#@register.tag(name="filter")
+def do_filter(parser, token):
+    """
+    Filter the contents of the blog through variable filters.
+
+    Filters can also be piped through each other, and they can have
+    arguments -- just like in variable syntax.
+
+    Sample usage::
+
+        {% filter escape|lower %}
+            This text will be HTML-escaped, and will appear in lowercase.
+        {% endfilter %}
+    """
+    _, rest = token.contents.split(None, 1)
+    filter_expr = parser.compile_filter("var|%s" % (rest))
+    nodelist = parser.parse(('endfilter',))
+    parser.delete_first_token()
+    return FilterNode(filter_expr, nodelist)
+filter = register.tag("filter", do_filter)
+
+#@register.tag
+def firstof(parser, token):
+    """
+    Outputs the first variable passed that is not False.
+
+    Outputs nothing if all the passed variables are False.
+
+    Sample usage::
+
+        {% firstof var1 var2 var3 %}
+
+    This is equivalent to::
+
+        {% if var1 %}
+            {{ var1 }}
+        {% else %}{% if var2 %}
+            {{ var2 }}
+        {% else %}{% if var3 %}
+            {{ var3 }}
+        {% endif %}{% endif %}{% endif %}
+
+    but obviously much cleaner!
+    """
+    bits = token.contents.split()[1:]
+    if len(bits) < 1:
+        raise TemplateSyntaxError, "'firstof' statement requires at least one argument"
+    return FirstOfNode(bits)
+firstof = register.tag(firstof)
+
+#@register.tag(name="for")
+def do_for(parser, token):
+    """
+    Loop over each item in an array.
+
+    For example, to display a list of athletes given ``athlete_list``::
+
+        <ul>
+        {% for athlete in athlete_list %}
+            <li>{{ athlete.name }}</li>
+        {% endfor %}
+        </ul>
+
+    You can also loop over a list in reverse by using
+    ``{% for obj in list reversed %}``.
+
+    The for loop sets a number of variables available within the loop:
+
+        ==========================  ================================================
+        Variable                    Description
+        ==========================  ================================================
+        ``forloop.counter``         The current iteration of the loop (1-indexed)
+        ``forloop.counter0``        The current iteration of the loop (0-indexed)
+        ``forloop.revcounter``      The number of iterations from the end of the
+                                    loop (1-indexed)
+        ``forloop.revcounter0``     The number of iterations from the end of the
+                                    loop (0-indexed)
+        ``forloop.first``           True if this is the first time through the loop
+        ``forloop.last``            True if this is the last time through the loop
+        ``forloop.parentloop``      For nested loops, this is the loop "above" the
+                                    current one
+        ==========================  ================================================
+
+    """
+    bits = token.contents.split()
+    if len(bits) == 5 and bits[4] != 'reversed':
+        raise TemplateSyntaxError, "'for' statements with five words should end in 'reversed': %s" % token.contents
+    if len(bits) not in (4, 5):
+        raise TemplateSyntaxError, "'for' statements should have either four or five words: %s" % token.contents
+    if bits[2] != 'in':
+        raise TemplateSyntaxError, "'for' statement must contain 'in' as the second word: %s" % token.contents
+    loopvar = bits[1]
+    sequence = parser.compile_filter(bits[3])
+    reversed = (len(bits) == 5)
+    nodelist_loop = parser.parse(('endfor',))
+    parser.delete_first_token()
+    return ForNode(loopvar, sequence, reversed, nodelist_loop)
+do_for = register.tag("for", do_for)
+
+def do_ifequal(parser, token, negate):
+    """
+    Output the contents of the block if the two arguments equal/don't equal each other.
+
+    Examples::
+
+        {% ifequal user.id comment.user_id %}
+            ...
+        {% endifequal %}
+
+        {% ifnotequal user.id comment.user_id %}
+            ...
+        {% else %}
+            ...
+        {% endifnotequal %}
+    """
+    bits = list(token.split_contents())
+    if len(bits) != 3:
+        raise TemplateSyntaxError, "%r takes two arguments" % bits[0]
+    end_tag = 'end' + bits[0]
+    nodelist_true = parser.parse(('else', end_tag))
+    token = parser.next_token()
+    if token.contents == 'else':
+        nodelist_false = parser.parse((end_tag,))
+        parser.delete_first_token()
+    else:
+        nodelist_false = NodeList()
+    return IfEqualNode(bits[1], bits[2], nodelist_true, nodelist_false, negate)
+
+#@register.tag
+def ifequal(parser, token):
+    return do_ifequal(parser, token, False)
+ifequal = register.tag(ifequal)
+
+#@register.tag
+def ifnotequal(parser, token):
+    return do_ifequal(parser, token, True)
+ifnotequal = register.tag(ifnotequal)
+
+#@register.tag(name="if")
+def do_if(parser, token):
+    """
+    The ``{% if %}`` tag evaluates a variable, and if that variable is "true"
+    (i.e. exists, is not empty, and is not a false boolean value) the contents
+    of the block are output:
+
+    ::
+
+        {% if althlete_list %}
+            Number of athletes: {{ althete_list|count }}
+        {% else %}
+            No athletes.
+        {% endif %}
+
+    In the above, if ``athlete_list`` is not empty, the number of athletes will
+    be displayed by the ``{{ athlete_list|count }}`` variable.
+
+    As you can see, the ``if`` tag can take an option ``{% else %}`` clause that
+    will be displayed if the test fails.
+
+    ``if`` tags may use ``or`` or ``not`` to test a number of variables or to
+    negate a given variable::
+
+        {% if not athlete_list %}
+            There are no athletes.
+        {% endif %}
+
+        {% if athlete_list or coach_list %}
+            There are some athletes or some coaches.
+        {% endif %}
+
+        {% if not athlete_list or coach_list %}
+            There are no athletes, or there are some coaches.
+        {% endif %}
+
+    For simplicity, ``if`` tags do not allow ``and`` clauses. Use nested ``if``
+    tags instead::
+
+        {% if athlete_list %}
+            {% if coach_list %}
+                Number of athletes: {{ athlete_list|count }}.
+                Number of coaches: {{ coach_list|count }}.
+            {% endif %}
+        {% endif %}
+    """
+    bits = token.contents.split()
+    del bits[0]
+    if not bits:
+        raise TemplateSyntaxError, "'if' statement requires at least one argument"
+    # bits now looks something like this: ['a', 'or', 'not', 'b', 'or', 'c.d']
+    bitstr = ' '.join(bits)
+    boolpairs = bitstr.split(' and ')
+    boolvars = []
+    if len(boolpairs) == 1:
+        link_type = IfNode.LinkTypes.or_
+        boolpairs = bitstr.split(' or ')
+    else:
+        link_type = IfNode.LinkTypes.and_
+        if ' or ' in bitstr:
+            raise TemplateSyntaxError, "'if' tags can't mix 'and' and 'or'"
+    for boolpair in boolpairs:
+        if ' ' in boolpair:
+            try:
+                not_, boolvar = boolpair.split()
+            except ValueError:
+                raise TemplateSyntaxError, "'if' statement improperly formatted"
+            if not_ != 'not':
+                raise TemplateSyntaxError, "Expected 'not' in if statement"
+            boolvars.append((True, parser.compile_filter(boolvar)))
+        else:
+            boolvars.append((False, parser.compile_filter(boolpair)))
+    nodelist_true = parser.parse(('else', 'endif'))
+    token = parser.next_token()
+    if token.contents == 'else':
+        nodelist_false = parser.parse(('endif',))
+        parser.delete_first_token()
+    else:
+        nodelist_false = NodeList()
+    return IfNode(boolvars, nodelist_true, nodelist_false, link_type)
+do_if = register.tag("if", do_if)
+
+#@register.tag
+def ifchanged(parser, token):
+    """
+    Check if a value has changed from the last iteration of a loop.
+
+    The 'ifchanged' block tag is used within a loop. It checks its own rendered
+    contents against its previous state and only displays its content if the
+    value has changed::
+
+        <h1>Archive for {{ year }}</h1>
+
+        {% for date in days %}
+        {% ifchanged %}<h3>{{ date|date:"F" }}</h3>{% endifchanged %}
+        <a href="{{ date|date:"M/d"|lower }}/">{{ date|date:"j" }}</a>
+        {% endfor %}
+    """
+    bits = token.contents.split()
+    if len(bits) != 1:
+        raise TemplateSyntaxError, "'ifchanged' tag takes no arguments"
+    nodelist = parser.parse(('endifchanged',))
+    parser.delete_first_token()
+    return IfChangedNode(nodelist)
+ifchanged = register.tag(ifchanged)
+
+#@register.tag
+def ssi(parser, token):
+    """
+    Output the contents of a given file into the page.
+
+    Like a simple "include" tag, the ``ssi`` tag includes the contents
+    of another file -- which must be specified using an absolute page --
+    in the current page::
+
+        {% ssi /home/html/ljworld.com/includes/right_generic.html %}
+
+    If the optional "parsed" parameter is given, the contents of the included
+    file are evaluated as template code, with the current context::
+
+        {% ssi /home/html/ljworld.com/includes/right_generic.html parsed %}
+    """
+    bits = token.contents.split()
+    parsed = False
+    if len(bits) not in (2, 3):
+        raise TemplateSyntaxError, "'ssi' tag takes one argument: the path to the file to be included"
+    if len(bits) == 3:
+        if bits[2] == 'parsed':
+            parsed = True
+        else:
+            raise TemplateSyntaxError, "Second (optional) argument to %s tag must be 'parsed'" % bits[0]
+    return SsiNode(bits[1], parsed)
+ssi = register.tag(ssi)
+
+#@register.tag
+def load(parser, token):
+    """
+    Load a custom template tag set.
+
+    For example, to load the template tags in ``django/templatetags/news/photos.py``::
+
+        {% load news.photos %}
+    """
+    bits = token.contents.split()
+    for taglib in bits[1:]:
+        # add the library to the parser
+        try:
+            lib = get_library("django.templatetags.%s" % taglib.split('.')[-1])
+            parser.add_library(lib)
+        except InvalidTemplateLibrary, e:
+            raise TemplateSyntaxError, "'%s' is not a valid tag library: %s" % (taglib, e)
+    return LoadNode()
+load = register.tag(load)
+
+#@register.tag
+def now(parser, token):
+    """
+    Display the date, formatted according to the given string.
+
+    Uses the same format as PHP's ``date()`` function; see http://php.net/date
+    for all the possible values.
+
+    Sample usage::
+
+        It is {% now "jS F Y H:i" %}
+    """
+    bits = token.contents.split('"')
+    if len(bits) != 3:
+        raise TemplateSyntaxError, "'now' statement takes one argument"
+    format_string = bits[1]
+    return NowNode(format_string)
+now = register.tag(now)
+
+#@register.tag
+def regroup(parser, token):
+    """
+    Regroup a list of alike objects by a common attribute.
+
+    This complex tag is best illustrated by use of an example:  say that
+    ``people`` is a list of ``Person`` objects that have ``first_name``,
+    ``last_name``, and ``gender`` attributes, and you'd like to display a list
+    that looks like:
+
+        * Male:
+            * George Bush
+            * Bill Clinton
+        * Female:
+            * Margaret Thatcher
+            * Colendeeza Rice
+        * Unknown:
+            * Pat Smith
+
+    The following snippet of template code would accomplish this dubious task::
+
+        {% regroup people by gender as grouped %}
+        <ul>
+        {% for group in grouped %}
+            <li>{{ group.grouper }}
+            <ul>
+                {% for item in group.list %}
+                <li>{{ item }}</li>
+                {% endfor %}
+            </ul>
+        {% endfor %}
+        </ul>
+
+    As you can see, ``{% regroup %}`` populates a variable with a list of
+    objects with ``grouper`` and ``list`` attributes.  ``grouper`` contains the
+    item that was grouped by; ``list`` contains the list of objects that share
+    that ``grouper``.  In this case, ``grouper`` would be ``Male``, ``Female``
+    and ``Unknown``, and ``list`` is the list of people with those genders.
+
+    Note that `{% regroup %}`` does not work when the list to be grouped is not
+    sorted by the key you are grouping by!  This means that if your list of
+    people was not sorted by gender, you'd need to make sure it is sorted before
+    using it, i.e.::
+
+        {% regroup people|dictsort:"gender" by gender as grouped %}
+
+    """
+    firstbits = token.contents.split(None, 3)
+    if len(firstbits) != 4:
+        raise TemplateSyntaxError, "'regroup' tag takes five arguments"
+    target = parser.compile_filter(firstbits[1])
+    if firstbits[2] != 'by':
+        raise TemplateSyntaxError, "second argument to 'regroup' tag must be 'by'"
+    lastbits_reversed = firstbits[3][::-1].split(None, 2)
+    if lastbits_reversed[1][::-1] != 'as':
+        raise TemplateSyntaxError, "next-to-last argument to 'regroup' tag must be 'as'"
+
+    expression = parser.compile_filter('var.%s' % lastbits_reversed[2][::-1])
+
+    var_name = lastbits_reversed[0][::-1]
+    return RegroupNode(target, expression, var_name)
+regroup = register.tag(regroup)
+
+def spaceless(parser, token):
+    """
+    Normalize whitespace between HTML tags to a single space. This includes tab
+    characters and newlines.
+
+    Example usage::
+
+        {% spaceless %}
+            <p>
+                <a href="foo/">Foo</a>
+            </p>
+        {% endspaceless %}
+
+    This example would return this HTML::
+
+        <p> <a href="foo/">Foo</a> </p>
+
+    Only space between *tags* is normalized -- not space between tags and text. In
+    this example, the space around ``Hello`` won't be stripped::
+
+        {% spaceless %}
+            <strong>
+                Hello
+            </strong>
+        {% endspaceless %}
+    """
+    nodelist = parser.parse(('endspaceless',))
+    parser.delete_first_token()
+    return SpacelessNode(nodelist)
+spaceless = register.tag(spaceless)
+
+#@register.tag
+def templatetag(parser, token):
+    """
+    Output one of the bits used to compose template tags.
+
+    Since the template system has no concept of "escaping", to display one of
+    the bits used in template tags, you must use the ``{% templatetag %}`` tag.
+
+    The argument tells which template bit to output:
+
+        ==================  =======
+        Argument            Outputs
+        ==================  =======
+        ``openblock``       ``{%``
+        ``closeblock``      ``%}``
+        ``openvariable``    ``{{``
+        ``closevariable``   ``}}``
+        ``openbrace``       ``{``
+        ``closebrace``      ``}``
+        ==================  =======
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "'templatetag' statement takes one argument"
+    tag = bits[1]
+    if not TemplateTagNode.mapping.has_key(tag):
+        raise TemplateSyntaxError, "Invalid templatetag argument: '%s'. Must be one of: %s" % \
+            (tag, TemplateTagNode.mapping.keys())
+    return TemplateTagNode(tag)
+templatetag = register.tag(templatetag)
+
+#@register.tag
+def widthratio(parser, token):
+    """
+    For creating bar charts and such, this tag calculates the ratio of a given
+    value to a maximum value, and then applies that ratio to a constant.
+
+    For example::
+
+        <img src='bar.gif' height='10' width='{% widthratio this_value max_value 100 %}' />
+
+    Above, if ``this_value`` is 175 and ``max_value`` is 200, the the image in
+    the above example will be 88 pixels wide (because 175/200 = .875; .875 *
+    100 = 87.5 which is rounded up to 88).
+    """
+    bits = token.contents.split()
+    if len(bits) != 4:
+        raise TemplateSyntaxError("widthratio takes three arguments")
+    tag, this_value_expr, max_value_expr, max_width = bits
+    try:
+        max_width = int(max_width)
+    except ValueError:
+        raise TemplateSyntaxError("widthratio final argument must be an integer")
+    return WidthRatioNode(parser.compile_filter(this_value_expr),
+                          parser.compile_filter(max_value_expr), max_width)
+widthratio = register.tag(widthratio)

Added: vendor/django/current/django/template/loader.py
===================================================================
--- vendor/django/current/django/template/loader.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/loader.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,116 @@
+# Wrapper for loading templates from storage of some sort (e.g. filesystem, database).
+#
+# This uses the TEMPLATE_LOADERS setting, which is a list of loaders to use.
+# Each loader is expected to have this interface:
+#
+#    callable(name, dirs=[])
+#
+# name is the template name.
+# dirs is an optional list of directories to search instead of TEMPLATE_DIRS.
+#
+# The loader should return a tuple of (template_source, path). The path returned
+# might be shown to the user for debugging purposes, so it should identify where
+# the template was loaded from.
+#
+# Each loader should have an "is_usable" attribute set. This is a boolean that
+# specifies whether the loader can be used in this Python installation. Each
+# loader is responsible for setting this when it's initialized.
+#
+# For example, the eggs loader (which is capable of loading templates from
+# Python eggs) sets is_usable to False if the "pkg_resources" module isn't
+# installed, because pkg_resources is necessary to read eggs.
+
+from django.core.exceptions import ImproperlyConfigured
+from django.template import Origin, Template, Context, TemplateDoesNotExist, add_to_builtins
+from django.conf import settings
+
+template_source_loaders = None
+
+class LoaderOrigin(Origin):
+    def __init__(self, display_name, loader, name, dirs):
+        super(LoaderOrigin, self).__init__(display_name)
+        self.loader, self.loadname, self.dirs = loader, name, dirs
+
+    def reload(self):
+        return self.loader(self.loadname, self.dirs)[0]
+
+def make_origin(display_name, loader, name, dirs):
+    if settings.TEMPLATE_DEBUG:
+        return LoaderOrigin(display_name, loader, name, dirs)
+    else:
+        return None
+
+def find_template_source(name, dirs=None):
+    # Calculate template_source_loaders the first time the function is executed
+    # because putting this logic in the module-level namespace may cause
+    # circular import errors. See Django ticket #1292.
+    global template_source_loaders
+    if template_source_loaders is None:
+        template_source_loaders = []
+        for path in settings.TEMPLATE_LOADERS:
+            i = path.rfind('.')
+            module, attr = path[:i], path[i+1:]
+            try:
+                mod = __import__(module, globals(), locals(), [attr])
+            except ImportError, e:
+                raise ImproperlyConfigured, 'Error importing template source loader %s: "%s"' % (module, e)
+            try:
+                func = getattr(mod, attr)
+            except AttributeError:
+                raise ImproperlyConfigured, 'Module "%s" does not define a "%s" callable template source loader' % (module, attr)
+            if not func.is_usable:
+                import warnings
+                warnings.warn("Your TEMPLATE_LOADERS setting includes %r, but your Python installation doesn't support that type of template loading. Consider removing that line from TEMPLATE_LOADERS." % path)
+            else:
+                template_source_loaders.append(func)
+    for loader in template_source_loaders:
+        try:
+            source, display_name = loader(name, dirs)
+            return (source, make_origin(display_name, loader, name, dirs))
+        except TemplateDoesNotExist:
+            pass
+    raise TemplateDoesNotExist, name
+
+def get_template(template_name):
+    """
+    Returns a compiled Template object for the given template name,
+    handling template inheritance recursively.
+    """
+    return get_template_from_string(*find_template_source(template_name))
+
+def get_template_from_string(source, origin=None):
+    """
+    Returns a compiled Template object for the given template code,
+    handling template inheritance recursively.
+    """
+    return Template(source, origin)
+
+def render_to_string(template_name, dictionary=None, context_instance=None):
+    """
+    Loads the given template_name and renders it with the given dictionary as
+    context. The template_name may be a string to load a single template using
+    get_template, or it may be a tuple to use select_template to find one of
+    the templates in the list. Returns a string.
+    """
+    dictionary = dictionary or {}
+    if isinstance(template_name, (list, tuple)):
+        t = select_template(template_name)
+    else:
+        t = get_template(template_name)
+    if context_instance:
+        context_instance.update(dictionary)
+    else:
+        context_instance = Context(dictionary)
+    return t.render(context_instance)
+
+def select_template(template_name_list):
+    "Given a list of template names, returns the first that can be loaded."
+    for template_name in template_name_list:
+        try:
+            return get_template(template_name)
+        except TemplateDoesNotExist:
+            continue
+    # If we get here, none of the templates could be loaded
+    raise TemplateDoesNotExist, ', '.join(template_name_list)
+
+add_to_builtins('django.template.loader_tags')

Added: vendor/django/current/django/template/loader_tags.py
===================================================================
--- vendor/django/current/django/template/loader_tags.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/loader_tags.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,177 @@
+from django.template import TemplateSyntaxError, TemplateDoesNotExist, resolve_variable
+from django.template import Library, Node
+from django.template.loader import get_template, get_template_from_string, find_template_source
+from django.conf import settings
+
+register = Library()
+
+class ExtendsError(Exception):
+    pass
+
+class BlockNode(Node):
+    def __init__(self, name, nodelist, parent=None):
+        self.name, self.nodelist, self.parent = name, nodelist, parent
+
+    def __repr__(self):
+        return "<Block Node: %s. Contents: %r>" % (self.name, self.nodelist)
+
+    def render(self, context):
+        context.push()
+        # Save context in case of block.super().
+        self.context = context
+        context['block'] = self
+        result = self.nodelist.render(context)
+        context.pop()
+        return result
+
+    def super(self):
+        if self.parent:
+            return self.parent.render(self.context)
+        return ''
+
+    def add_parent(self, nodelist):
+        if self.parent:
+            self.parent.add_parent(nodelist)
+        else:
+            self.parent = BlockNode(self.name, nodelist)
+
+class ExtendsNode(Node):
+    def __init__(self, nodelist, parent_name, parent_name_expr, template_dirs=None):
+        self.nodelist = nodelist
+        self.parent_name, self.parent_name_expr = parent_name, parent_name_expr
+        self.template_dirs = template_dirs
+
+    def get_parent(self, context):
+        if self.parent_name_expr:
+            self.parent_name = self.parent_name_expr.resolve(context)
+        parent = self.parent_name
+        if not parent:
+            error_msg = "Invalid template name in 'extends' tag: %r." % parent
+            if self.parent_name_expr:
+                error_msg += " Got this from the %r variable." % self.parent_name_expr #TODO nice repr.
+            raise TemplateSyntaxError, error_msg
+        if hasattr(parent, 'render'):
+            return parent
+        try:
+            source, origin = find_template_source(parent, self.template_dirs)
+        except TemplateDoesNotExist:
+            raise TemplateSyntaxError, "Template %r cannot be extended, because it doesn't exist" % parent
+        else:
+            return get_template_from_string(source, origin)
+
+    def render(self, context):
+        compiled_parent = self.get_parent(context)
+        parent_is_child = isinstance(compiled_parent.nodelist[0], ExtendsNode)
+        parent_blocks = dict([(n.name, n) for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)])
+        for block_node in self.nodelist.get_nodes_by_type(BlockNode):
+            # Check for a BlockNode with this node's name, and replace it if found.
+            try:
+                parent_block = parent_blocks[block_node.name]
+            except KeyError:
+                # This BlockNode wasn't found in the parent template, but the
+                # parent block might be defined in the parent's *parent*, so we
+                # add this BlockNode to the parent's ExtendsNode nodelist, so
+                # it'll be checked when the parent node's render() is called.
+                if parent_is_child:
+                    compiled_parent.nodelist[0].nodelist.append(block_node)
+            else:
+                # Keep any existing parents and add a new one. Used by BlockNode.
+                parent_block.parent = block_node.parent
+                parent_block.add_parent(parent_block.nodelist)
+                parent_block.nodelist = block_node.nodelist
+        return compiled_parent.render(context)
+
+class ConstantIncludeNode(Node):
+    def __init__(self, template_path):
+        try:
+            t = get_template(template_path)
+            self.template = t
+        except:
+            if settings.TEMPLATE_DEBUG:
+                raise
+            self.template = None
+
+    def render(self, context):
+        if self.template:
+            return self.template.render(context)
+        else:
+            return ''
+
+class IncludeNode(Node):
+    def __init__(self, template_name):
+        self.template_name = template_name
+
+    def render(self, context):
+        try:
+            template_name = resolve_variable(self.template_name, context)
+            t = get_template(template_name)
+            return t.render(context)
+        except TemplateSyntaxError, e:
+            if settings.TEMPLATE_DEBUG:
+                raise
+            return ''
+        except:
+            return '' # Fail silently for invalid included templates.
+
+def do_block(parser, token):
+    """
+    Define a block that can be overridden by child templates.
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "'%s' tag takes only one argument" % bits[0]
+    block_name = bits[1]
+    # Keep track of the names of BlockNodes found in this template, so we can
+    # check for duplication.
+    try:
+        if block_name in parser.__loaded_blocks:
+            raise TemplateSyntaxError, "'%s' tag with name '%s' appears more than once" % (bits[0], block_name)
+        parser.__loaded_blocks.append(block_name)
+    except AttributeError: # parser.__loaded_blocks isn't a list yet
+        parser.__loaded_blocks = [block_name]
+    nodelist = parser.parse(('endblock',))
+    parser.delete_first_token()
+    return BlockNode(block_name, nodelist)
+
+def do_extends(parser, token):
+    """
+    Signal that this template extends a parent template.
+
+    This tag may be used in two ways: ``{% extends "base" %}`` (with quotes)
+    uses the literal value "base" as the name of the parent template to extend,
+    or ``{% extends variable %}`` uses the value of ``variable`` as either the
+    name of the parent template to extend (if it evaluates to a string,) or as
+    the parent tempate itelf (if it evaluates to a Template object).
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "'%s' takes one argument" % bits[0]
+    parent_name, parent_name_expr = None, None
+    if bits[1][0] in ('"', "'") and bits[1][-1] == bits[1][0]:
+        parent_name = bits[1][1:-1]
+    else:
+        parent_name_expr = parser.compile_filter(bits[1])
+    nodelist = parser.parse()
+    if nodelist.get_nodes_by_type(ExtendsNode):
+        raise TemplateSyntaxError, "'%s' cannot appear more than once in the same template" % bits[0]
+    return ExtendsNode(nodelist, parent_name, parent_name_expr)
+
+def do_include(parser, token):
+    """
+    Loads a template and renders it with the current context.
+
+    Example::
+
+        {% include "foo/some_include" %}
+    """
+    bits = token.contents.split()
+    if len(bits) != 2:
+        raise TemplateSyntaxError, "%r tag takes one argument: the name of the template to be included" % bits[0]
+    path = bits[1]
+    if path[0] in ('"', "'") and path[-1] == path[0]:
+        return ConstantIncludeNode(path[1:-1])
+    return IncludeNode(bits[1])
+
+register.tag('block', do_block)
+register.tag('extends', do_extends)
+register.tag('include', do_include)

Added: vendor/django/current/django/template/loaders/__init__.py
===================================================================

Added: vendor/django/current/django/template/loaders/app_directories.py
===================================================================
--- vendor/django/current/django/template/loaders/app_directories.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/loaders/app_directories.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,41 @@
+# Wrapper for loading templates from "template" directories in installed app packages.
+
+from django.conf import settings
+from django.core.exceptions import ImproperlyConfigured
+from django.template import TemplateDoesNotExist
+import os
+
+# At compile time, cache the directories to search.
+app_template_dirs = []
+for app in settings.INSTALLED_APPS:
+    i = app.rfind('.')
+    if i == -1:
+        m, a = app, None
+    else:
+        m, a = app[:i], app[i+1:]
+    try:
+        if a is None:
+            mod = __import__(m, '', '', [])
+        else:
+            mod = getattr(__import__(m, '', '', [a]), a)
+    except ImportError, e:
+        raise ImproperlyConfigured, 'ImportError %s: %s' % (app, e.args[0])
+    template_dir = os.path.join(os.path.dirname(mod.__file__), 'templates')
+    if os.path.isdir(template_dir):
+        app_template_dirs.append(template_dir)
+
+# It won't change, so convert it to a tuple to save memory.
+app_template_dirs = tuple(app_template_dirs)
+
+def get_template_sources(template_name, template_dirs=None):
+    for template_dir in app_template_dirs:
+        yield os.path.join(template_dir, template_name)
+
+def load_template_source(template_name, template_dirs=None):
+    for filepath in get_template_sources(template_name, template_dirs):
+        try:
+            return (open(filepath).read(), filepath)
+        except IOError:
+            pass
+    raise TemplateDoesNotExist, template_name
+load_template_source.is_usable = True

Added: vendor/django/current/django/template/loaders/eggs.py
===================================================================
--- vendor/django/current/django/template/loaders/eggs.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/loaders/eggs.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,25 @@
+# Wrapper for loading templates from eggs via pkg_resources.resource_string.
+
+try:
+    from pkg_resources import resource_string
+except ImportError:
+    resource_string = None
+
+from django.template import TemplateDoesNotExist
+from django.conf import settings
+
+def load_template_source(template_name, template_dirs=None):
+    """
+    Loads templates from Python eggs via pkg_resource.resource_string.
+
+    For every installed app, it tries to get the resource (app, template_name).
+    """
+    if resource_string is not None:
+        pkg_name = 'templates/' + template_name
+        for app in settings.INSTALLED_APPS:
+            try:
+                return (resource_string(app, pkg_name), 'egg:%s:%s ' % (app, pkg_name))
+            except:
+                pass
+    raise TemplateDoesNotExist, template_name
+load_template_source.is_usable = resource_string is not None

Added: vendor/django/current/django/template/loaders/filesystem.py
===================================================================
--- vendor/django/current/django/template/loaders/filesystem.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/template/loaders/filesystem.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,25 @@
+# Wrapper for loading templates from the filesystem.
+
+from django.conf import settings
+from django.template import TemplateDoesNotExist
+import os
+
+def get_template_sources(template_name, template_dirs=None):
+    if not template_dirs:
+        template_dirs = settings.TEMPLATE_DIRS
+    for template_dir in template_dirs:
+        yield os.path.join(template_dir, template_name)
+
+def load_template_source(template_name, template_dirs=None):
+    tried = []
+    for filepath in get_template_sources(template_name, template_dirs):
+        try:
+            return (open(filepath).read(), filepath)
+        except IOError:
+            tried.append(filepath)
+    if template_dirs:
+        error_msg = "Tried %s" % tried
+    else:
+        error_msg = "Your TEMPLATE_DIRS setting is empty. Change it to point to at least one template directory."
+    raise TemplateDoesNotExist, error_msg
+load_template_source.is_usable = True

Added: vendor/django/current/django/templatetags/__init__.py
===================================================================
--- vendor/django/current/django/templatetags/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/templatetags/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,7 @@
+from django.conf import settings
+
+for a in settings.INSTALLED_APPS:
+    try:
+        __path__.extend(__import__(a + '.templatetags', '', '', ['']).__path__)
+    except ImportError:
+        pass

Added: vendor/django/current/django/templatetags/i18n.py
===================================================================
--- vendor/django/current/django/templatetags/i18n.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/templatetags/i18n.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,246 @@
+from django.template import Node, resolve_variable
+from django.template import TemplateSyntaxError, TokenParser, Library
+from django.template import TOKEN_TEXT, TOKEN_VAR
+from django.utils import translation
+
+register = Library()
+
+class GetAvailableLanguagesNode(Node):
+    def __init__(self, variable):
+        self.variable = variable
+
+    def render(self, context):
+        from django.conf import settings
+        context[self.variable] = [(k, translation.gettext(v)) for k, v in settings.LANGUAGES]
+        return ''
+
+class GetCurrentLanguageNode(Node):
+    def __init__(self, variable):
+        self.variable = variable
+
+    def render(self, context):
+        context[self.variable] = translation.get_language()
+        return ''
+
+class GetCurrentLanguageBidiNode(Node):
+    def __init__(self, variable):
+        self.variable = variable
+
+    def render(self, context):
+        context[self.variable] = translation.get_language_bidi()
+        return ''
+
+class TranslateNode(Node):
+    def __init__(self, value, noop):
+        self.value = value
+        self.noop = noop
+
+    def render(self, context):
+        value = resolve_variable(self.value, context)
+        if self.noop:
+            return value
+        else:
+            return translation.gettext(value)
+
+class BlockTranslateNode(Node):
+    def __init__(self, extra_context, singular, plural=None, countervar=None, counter=None):
+        self.extra_context = extra_context
+        self.singular = singular
+        self.plural = plural
+        self.countervar = countervar
+        self.counter = counter
+
+    def render_token_list(self, tokens):
+        result = []
+        for token in tokens:
+            if token.token_type == TOKEN_TEXT:
+                result.append(token.contents)
+            elif token.token_type == TOKEN_VAR:
+                result.append('%%(%s)s' % token.contents)
+        return ''.join(result)
+
+    def render(self, context):
+        context.push()
+        for var,val in self.extra_context.items():
+            context[var] = val.resolve(context)
+        singular = self.render_token_list(self.singular)
+        if self.plural and self.countervar and self.counter:
+            count = self.counter.resolve(context)
+            context[self.countervar] = count
+            plural = self.render_token_list(self.plural)
+            result = translation.ngettext(singular, plural, count) % context
+        else:
+            result = translation.gettext(singular) % context
+        context.pop()
+        return result
+
+def do_get_available_languages(parser, token):
+    """
+    This will store a list of available languages
+    in the context.
+
+    Usage::
+
+        {% get_available_languages as languages %}
+        {% for language in languages %}
+        ...
+        {% endfor %}
+
+    This will just pull the LANGUAGES setting from
+    your setting file (or the default settings) and
+    put it into the named variable.
+    """
+    args = token.contents.split()
+    if len(args) != 3 or args[1] != 'as':
+        raise TemplateSyntaxError, "'get_available_languages' requires 'as variable' (got %r)" % args
+    return GetAvailableLanguagesNode(args[2])
+
+def do_get_current_language(parser, token):
+    """
+    This will store the current language in the context.
+
+    Usage::
+
+        {% get_current_language as language %}
+
+    This will fetch the currently active language and
+    put it's value into the ``language`` context
+    variable.
+    """
+    args = token.contents.split()
+    if len(args) != 3 or args[1] != 'as':
+        raise TemplateSyntaxError, "'get_current_language' requires 'as variable' (got %r)" % args
+    return GetCurrentLanguageNode(args[2])
+
+def do_get_current_language_bidi(parser, token):
+    """
+    This will store the current language layout in the context.
+
+    Usage::
+
+        {% get_current_language_bidi as bidi %}
+
+    This will fetch the currently active language's layout and
+    put it's value into the ``bidi`` context variable.
+    True indicates right-to-left layout, otherwise left-to-right
+    """
+    args = token.contents.split()
+    if len(args) != 3 or args[1] != 'as':
+        raise TemplateSyntaxError, "'get_current_language_bidi' requires 'as variable' (got %r)" % args
+    return GetCurrentLanguageBidiNode(args[2])
+
+def do_translate(parser, token):
+    """
+    This will mark a string for translation and will
+    translate the string for the current language.
+
+    Usage::
+
+        {% trans "this is a test" %}
+
+    This will mark the string for translation so it will
+    be pulled out by mark-messages.py into the .po files
+    and will run the string through the translation engine.
+
+    There is a second form::
+
+        {% trans "this is a test" noop %}
+
+    This will only mark for translation, but will return
+    the string unchanged. Use it when you need to store
+    values into forms that should be translated later on.
+
+    You can use variables instead of constant strings
+    to translate stuff you marked somewhere else::
+
+        {% trans variable %}
+
+    This will just try to translate the contents of
+    the variable ``variable``. Make sure that the string
+    in there is something that is in the .po file.
+    """
+    class TranslateParser(TokenParser):
+        def top(self):
+            value = self.value()
+            if self.more():
+                if self.tag() == 'noop':
+                    noop = True
+                else:
+                    raise TemplateSyntaxError, "only option for 'trans' is 'noop'"
+            else:
+                noop = False
+            return (value, noop)
+    value, noop = TranslateParser(token.contents).top()
+    return TranslateNode(value, noop)
+
+def do_block_translate(parser, token):
+    """
+    This will translate a block of text with parameters.
+
+    Usage::
+
+        {% blocktrans with foo|filter as bar and baz|filter as boo %}
+        This is {{ bar }} and {{ boo }}.
+        {% endblocktrans %}
+
+    Additionally, this supports pluralization::
+
+        {% blocktrans count var|length as count %}
+        There is {{ count }} object.
+        {% plural %}
+        There are {{ count }} objects.
+        {% endblocktrans %}
+
+    This is much like ngettext, only in template syntax.
+    """
+    class BlockTranslateParser(TokenParser):
+
+        def top(self):
+            countervar = None
+            counter = None
+            extra_context = {}
+            while self.more():
+                tag = self.tag()
+                if tag == 'with' or tag == 'and':
+                    value = self.value()
+                    if self.tag() != 'as':
+                        raise TemplateSyntaxError, "variable bindings in 'blocktrans' must be 'with value as variable'"
+                    extra_context[self.tag()] = parser.compile_filter(value)
+                elif tag == 'count':
+                    counter = parser.compile_filter(self.value())
+                    if self.tag() != 'as':
+                        raise TemplateSyntaxError, "counter specification in 'blocktrans' must be 'count value as variable'"
+                    countervar = self.tag()
+                else:
+                    raise TemplateSyntaxError, "unknown subtag %s for 'blocktrans' found" % tag
+            return (countervar, counter, extra_context)
+
+    countervar, counter, extra_context = BlockTranslateParser(token.contents).top()
+
+    singular = []
+    plural = []
+    while parser.tokens:
+        token = parser.next_token()
+        if token.token_type in (TOKEN_VAR, TOKEN_TEXT):
+            singular.append(token)
+        else:
+            break
+    if countervar and counter:
+        if token.contents.strip() != 'plural':
+            raise TemplateSyntaxError, "'blocktrans' doesn't allow other block tags inside it"
+        while parser.tokens:
+            token = parser.next_token()
+            if token.token_type in (TOKEN_VAR, TOKEN_TEXT):
+                plural.append(token)
+            else:
+                break
+    if token.contents.strip() != 'endblocktrans':
+        raise TemplateSyntaxError, "'blocktrans' doesn't allow other block tags (seen %r) inside it" % token.contents
+
+    return BlockTranslateNode(extra_context, singular, plural, countervar, counter)
+
+register.tag('get_available_languages', do_get_available_languages)
+register.tag('get_current_language', do_get_current_language)
+register.tag('get_current_language_bidi', do_get_current_language_bidi)
+register.tag('trans', do_translate)
+register.tag('blocktrans', do_block_translate)

Added: vendor/django/current/django/utils/__init__.py
===================================================================

Added: vendor/django/current/django/utils/_threading_local.py
===================================================================
--- vendor/django/current/django/utils/_threading_local.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/_threading_local.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,240 @@
+"""Thread-local objects
+
+(Note that this module provides a Python version of thread
+ threading.local class.  Depending on the version of Python you're
+ using, there may be a faster one available.  You should always import
+ the local class from threading.)
+
+Thread-local objects support the management of thread-local data.
+If you have data that you want to be local to a thread, simply create
+a thread-local object and use its attributes:
+
+  >>> mydata = local()
+  >>> mydata.number = 42
+  >>> mydata.number
+  42
+
+You can also access the local-object's dictionary:
+
+  >>> mydata.__dict__
+  {'number': 42}
+  >>> mydata.__dict__.setdefault('widgets', [])
+  []
+  >>> mydata.widgets
+  []
+
+What's important about thread-local objects is that their data are
+local to a thread. If we access the data in a different thread:
+
+  >>> log = []
+  >>> def f():
+  ...     items = mydata.__dict__.items()
+  ...     items.sort()
+  ...     log.append(items)
+  ...     mydata.number = 11
+  ...     log.append(mydata.number)
+
+  >>> import threading
+  >>> thread = threading.Thread(target=f)
+  >>> thread.start()
+  >>> thread.join()
+  >>> log
+  [[], 11]
+
+we get different data.  Furthermore, changes made in the other thread
+don't affect data seen in this thread:
+
+  >>> mydata.number
+  42
+
+Of course, values you get from a local object, including a __dict__
+attribute, are for whatever thread was current at the time the
+attribute was read.  For that reason, you generally don't want to save
+these values across threads, as they apply only to the thread they
+came from.
+
+You can create custom local objects by subclassing the local class:
+
+  >>> class MyLocal(local):
+  ...     number = 2
+  ...     initialized = False
+  ...     def __init__(self, **kw):
+  ...         if self.initialized:
+  ...             raise SystemError('__init__ called too many times')
+  ...         self.initialized = True
+  ...         self.__dict__.update(kw)
+  ...     def squared(self):
+  ...         return self.number ** 2
+
+This can be useful to support default values, methods and
+initialization.  Note that if you define an __init__ method, it will be
+called each time the local object is used in a separate thread.  This
+is necessary to initialize each thread's dictionary.
+
+Now if we create a local object:
+
+  >>> mydata = MyLocal(color='red')
+
+Now we have a default number:
+
+  >>> mydata.number
+  2
+
+an initial color:
+
+  >>> mydata.color
+  'red'
+  >>> del mydata.color
+
+And a method that operates on the data:
+
+  >>> mydata.squared()
+  4
+
+As before, we can access the data in a separate thread:
+
+  >>> log = []
+  >>> thread = threading.Thread(target=f)
+  >>> thread.start()
+  >>> thread.join()
+  >>> log
+  [[('color', 'red'), ('initialized', True)], 11]
+
+without affecting this thread's data:
+
+  >>> mydata.number
+  2
+  >>> mydata.color
+  Traceback (most recent call last):
+  ...
+  AttributeError: 'MyLocal' object has no attribute 'color'
+
+Note that subclasses can define slots, but they are not thread
+local. They are shared across threads:
+
+  >>> class MyLocal(local):
+  ...     __slots__ = 'number'
+
+  >>> mydata = MyLocal()
+  >>> mydata.number = 42
+  >>> mydata.color = 'red'
+
+So, the separate thread:
+
+  >>> thread = threading.Thread(target=f)
+  >>> thread.start()
+  >>> thread.join()
+
+affects what we see:
+
+  >>> mydata.number
+  11
+
+>>> del mydata
+"""
+
+# Threading import is at end
+
+class _localbase(object):
+    __slots__ = '_local__key', '_local__args', '_local__lock'
+
+    def __new__(cls, *args, **kw):
+        self = object.__new__(cls)
+        key = '_local__key', 'thread.local.' + str(id(self))
+        object.__setattr__(self, '_local__key', key)
+        object.__setattr__(self, '_local__args', (args, kw))
+        object.__setattr__(self, '_local__lock', RLock())
+
+        if args or kw and (cls.__init__ is object.__init__):
+            raise TypeError("Initialization arguments are not supported")
+
+        # We need to create the thread dict in anticipation of
+        # __init__ being called, to make sure we don't call it
+        # again ourselves.
+        dict = object.__getattribute__(self, '__dict__')
+        currentThread().__dict__[key] = dict
+
+        return self
+
+def _patch(self):
+    key = object.__getattribute__(self, '_local__key')
+    d = currentThread().__dict__.get(key)
+    if d is None:
+        d = {}
+        currentThread().__dict__[key] = d
+        object.__setattr__(self, '__dict__', d)
+
+        # we have a new instance dict, so call out __init__ if we have
+        # one
+        cls = type(self)
+        if cls.__init__ is not object.__init__:
+            args, kw = object.__getattribute__(self, '_local__args')
+            cls.__init__(self, *args, **kw)
+    else:
+        object.__setattr__(self, '__dict__', d)
+
+class local(_localbase):
+
+    def __getattribute__(self, name):
+        lock = object.__getattribute__(self, '_local__lock')
+        lock.acquire()
+        try:
+            _patch(self)
+            return object.__getattribute__(self, name)
+        finally:
+            lock.release()
+
+    def __setattr__(self, name, value):
+        lock = object.__getattribute__(self, '_local__lock')
+        lock.acquire()
+        try:
+            _patch(self)
+            return object.__setattr__(self, name, value)
+        finally:
+            lock.release()
+
+    def __delattr__(self, name):
+        lock = object.__getattribute__(self, '_local__lock')
+        lock.acquire()
+        try:
+            _patch(self)
+            return object.__delattr__(self, name)
+        finally:
+            lock.release()
+
+
+    def __del__():
+        threading_enumerate = enumerate
+        __getattribute__ = object.__getattribute__
+
+        def __del__(self):
+            key = __getattribute__(self, '_local__key')
+
+            try:
+                threads = list(threading_enumerate())
+            except:
+                # if enumerate fails, as it seems to do during
+                # shutdown, we'll skip cleanup under the assumption
+                # that there is nothing to clean up
+                return
+
+            for thread in threads:
+                try:
+                    __dict__ = thread.__dict__
+                except AttributeError:
+                    # Thread is dying, rest in peace
+                    continue
+
+                if key in __dict__:
+                    try:
+                        del __dict__[key]
+                    except KeyError:
+                        pass # didn't have anything in this thread
+
+        return __del__
+    __del__ = __del__()
+
+try:
+    from threading import currentThread, enumerate, RLock
+except ImportError:
+    from dummy_threading import currentThread, enumerate, RLock

Added: vendor/django/current/django/utils/autoreload.py
===================================================================
--- vendor/django/current/django/utils/autoreload.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/autoreload.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,94 @@
+# Autoreloading launcher.
+# Borrowed from Peter Hunt and the CherryPy project (http://www.cherrypy.org).
+# Some taken from Ian Bicking's Paste (http://pythonpaste.org/).
+#
+# Portions copyright (c) 2004, CherryPy Team (team at cherrypy.org)
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without modification,
+# are permitted provided that the following conditions are met:
+#
+#     * Redistributions of source code must retain the above copyright notice,
+#       this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright notice,
+#       this list of conditions and the following disclaimer in the documentation
+#       and/or other materials provided with the distribution.
+#     * Neither the name of the CherryPy Team nor the names of its contributors
+#       may be used to endorse or promote products derived from this software
+#       without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+import os, sys, time
+
+try:
+    import thread
+except ImportError:
+    import dummy_thread as thread
+
+# This import does nothing, but it's necessary to avoid some race conditions
+# in the threading module. See http://code.djangoproject.com/ticket/2330 .
+try:
+    import threading
+except ImportError:
+    pass
+
+
+RUN_RELOADER = True
+
+def reloader_thread():
+    mtimes = {}
+    win = (sys.platform == "win32")
+    while RUN_RELOADER:
+        for filename in filter(lambda v: v, map(lambda m: getattr(m, "__file__", None), sys.modules.values())):
+            if filename.endswith(".pyc") or filename.endswith("*.pyo"):
+                filename = filename[:-1]
+            if not os.path.exists(filename):
+                continue # File might be in an egg, so it can't be reloaded.
+            stat = os.stat(filename)
+            mtime = stat.st_mtime
+            if win:
+                mtime -= stat.st_ctime
+            if filename not in mtimes:
+                mtimes[filename] = mtime
+                continue
+            if mtime != mtimes[filename]:
+                sys.exit(3) # force reload
+        time.sleep(1)
+
+def restart_with_reloader():
+    while True:
+        args = [sys.executable] + sys.argv
+        if sys.platform == "win32":
+            args = ['"%s"' % arg for arg in args]
+        new_environ = os.environ.copy()
+        new_environ["RUN_MAIN"] = 'true'
+        exit_code = os.spawnve(os.P_WAIT, sys.executable, args, new_environ)
+        if exit_code != 3:
+            return exit_code
+
+def main(main_func, args=None, kwargs=None):
+    if os.environ.get("RUN_MAIN") == "true":
+        if args is None:
+            args = ()
+        if kwargs is None:
+            kwargs = {}
+        thread.start_new_thread(main_func, args, kwargs)
+        try:
+            reloader_thread()
+        except KeyboardInterrupt:
+            pass
+    else:
+        try:
+            sys.exit(restart_with_reloader())
+        except KeyboardInterrupt:
+            pass

Added: vendor/django/current/django/utils/cache.py
===================================================================
--- vendor/django/current/django/utils/cache.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/cache.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,166 @@
+"""
+This module contains helper functions for controlling caching. It does so by
+managing the "Vary" header of responses. It includes functions to patch the
+header of response objects directly and decorators that change functions to do
+that header-patching themselves.
+
+For information on the Vary header, see:
+
+    http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44
+
+Essentially, the "Vary" HTTP header defines which headers a cache should take
+into account when building its cache key. Requests with the same path but
+different header content for headers named in "Vary" need to get different
+cache keys to prevent delivery of wrong content.
+
+A example: i18n middleware would need to distinguish caches by the
+"Accept-language" header.
+"""
+
+import datetime, md5, re
+from django.conf import settings
+from django.core.cache import cache
+
+cc_delim_re = re.compile(r'\s*,\s*')
+
+def patch_cache_control(response, **kwargs):
+    """
+    This function patches the Cache-Control header by adding all
+    keyword arguments to it. The transformation is as follows:
+
+    * All keyword parameter names are turned to lowercase, and underscores
+      are converted to hyphens.
+    * If the value of a parameter is True (exactly True, not just a
+      true value), only the parameter name is added to the header.
+    * All other parameters are added with their value, after applying
+      str() to it.
+    """
+    def dictitem(s):
+        t = s.split('=',1)
+        if len(t) > 1:
+            return (t[0].lower().replace('-', '_'), t[1])
+        else:
+            return (t[0].lower().replace('-', '_'), True)
+
+    def dictvalue(t):
+        if t[1] == True:
+            return t[0]
+        else:
+            return t[0] + '=' + str(t[1])
+
+    if response.has_header('Cache-Control'):
+        cc = cc_delim_re.split(response['Cache-Control'])
+        cc = dict([dictitem(el) for el in cc])
+    else:
+        cc = {}
+    for (k,v) in kwargs.items():
+        cc[k.replace('_', '-')] = v
+    cc = ', '.join([dictvalue(el) for el in cc.items()])
+    response['Cache-Control'] = cc
+
+vary_delim_re = re.compile(r',\s*')
+
+def patch_response_headers(response, cache_timeout=None):
+    """
+    Adds some useful headers to the given HttpResponse object:
+        ETag, Last-Modified, Expires and Cache-Control
+
+    Each header is only added if it isn't already set.
+
+    cache_timeout is in seconds. The CACHE_MIDDLEWARE_SECONDS setting is used
+    by default.
+    """
+    if cache_timeout is None:
+        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+    now = datetime.datetime.utcnow()
+    if not response.has_header('ETag'):
+        response['ETag'] = md5.new(response.content).hexdigest()
+    if not response.has_header('Last-Modified'):
+        response['Last-Modified'] = now.strftime('%a, %d %b %Y %H:%M:%S GMT')
+    if not response.has_header('Expires'):
+        expires = now + datetime.timedelta(0, cache_timeout)
+        response['Expires'] = expires.strftime('%a, %d %b %Y %H:%M:%S GMT')
+    if cache_timeout < 0:
+        cache_timeout = 0 # Can't have max-age negative
+    patch_cache_control(response, max_age=cache_timeout)
+
+def add_never_cache_headers(response):
+    """
+    Add headers to a response to indicate that 
+    a page should never be cached.
+    """
+    patch_response_headers(response, cache_timeout=-1)
+
+def patch_vary_headers(response, newheaders):
+    """
+    Adds (or updates) the "Vary" header in the given HttpResponse object.
+    newheaders is a list of header names that should be in "Vary". Existing
+    headers in "Vary" aren't removed.
+    """
+    # Note that we need to keep the original order intact, because cache
+    # implementations may rely on the order of the Vary contents in, say,
+    # computing an MD5 hash.
+    vary = []
+    if response.has_header('Vary'):
+        vary = vary_delim_re.split(response['Vary'])
+    oldheaders = dict([(el.lower(), 1) for el in vary])
+    for newheader in newheaders:
+        if not newheader.lower() in oldheaders:
+            vary.append(newheader)
+    response['Vary'] = ', '.join(vary)
+
+def _generate_cache_key(request, headerlist, key_prefix):
+    "Returns a cache key from the headers given in the header list."
+    ctx = md5.new()
+    for header in headerlist:
+        value = request.META.get(header, None)
+        if value is not None:
+            ctx.update(value)
+    return 'views.decorators.cache.cache_page.%s.%s.%s' % (key_prefix, request.path, ctx.hexdigest())
+
+def get_cache_key(request, key_prefix=None):
+    """
+    Returns a cache key based on the request path. It can be used in the
+    request phase because it pulls the list of headers to take into account
+    from the global path registry and uses those to build a cache key to check
+    against.
+
+    If there is no headerlist stored, the page needs to be rebuilt, so this
+    function returns None.
+    """
+    if key_prefix is None:
+        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+    cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, request.path)
+    headerlist = cache.get(cache_key, None)
+    if headerlist is not None:
+        return _generate_cache_key(request, headerlist, key_prefix)
+    else:
+        return None
+
+def learn_cache_key(request, response, cache_timeout=None, key_prefix=None):
+    """
+    Learns what headers to take into account for some request path from the
+    response object. It stores those headers in a global path registry so that
+    later access to that path will know what headers to take into account
+    without building the response object itself. The headers are named in the
+    Vary header of the response, but we want to prevent response generation.
+
+    The list of headers to use for cache key generation is stored in the same
+    cache as the pages themselves. If the cache ages some data out of the
+    cache, this just means that we have to build the response once to get at
+    the Vary header and so at the list of headers to use for the cache key.
+    """
+    if key_prefix is None:
+        key_prefix = settings.CACHE_MIDDLEWARE_KEY_PREFIX
+    if cache_timeout is None:
+        cache_timeout = settings.CACHE_MIDDLEWARE_SECONDS
+    cache_key = 'views.decorators.cache.cache_header.%s.%s' % (key_prefix, request.path)
+    if response.has_header('Vary'):
+        headerlist = ['HTTP_'+header.upper().replace('-', '_') for header in vary_delim_re.split(response['Vary'])]
+        cache.set(cache_key, headerlist, cache_timeout)
+        return _generate_cache_key(request, headerlist, key_prefix)
+    else:
+        # if there is no Vary header, we still need a cache key
+        # for the request.path
+        cache.set(cache_key, [], cache_timeout)
+        return _generate_cache_key(request, [], key_prefix)

Added: vendor/django/current/django/utils/daemonize.py
===================================================================
--- vendor/django/current/django/utils/daemonize.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/daemonize.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,55 @@
+import os
+import sys
+
+if os.name == 'posix':
+    def become_daemon(our_home_dir='.', out_log='/dev/null', err_log='/dev/null'):
+        "Robustly turn into a UNIX daemon, running in our_home_dir."
+        # First fork
+        try:
+            if os.fork() > 0:
+                sys.exit(0)     # kill off parent
+        except OSError, e:
+            sys.stderr.write("fork #1 failed: (%d) %s\n" % (e.errno, e.strerror))
+            sys.exit(1)
+        os.setsid()
+        os.chdir(our_home_dir)
+        os.umask(0)
+
+        # Second fork
+        try:
+            if os.fork() > 0:
+                sys.exit(0)
+        except OSError, e:
+            sys.stderr.write("fork #2 failed: (%d) %s\n" % (e.errno, e.strerror))
+            sys.exit(1)
+
+        si = open('/dev/null', 'r')
+        so = open(out_log, 'a+', 0)
+        se = open(err_log, 'a+', 0)
+        os.dup2(si.fileno(), sys.stdin.fileno())
+        os.dup2(so.fileno(), sys.stdout.fileno())
+        os.dup2(se.fileno(), sys.stderr.fileno())
+else:
+    def become_daemon(our_home_dir='.', out_log=None, err_log=None):
+        """
+        If we're not running under a POSIX system, just simulate the daemon
+        mode by doing redirections and directory changing.
+        """
+        os.chdir(our_home_dir)
+        os.umask(0)
+        sys.stdin.close()
+        sys.stdout.close()
+        sys.stderr.close()
+        if err_log:
+            sys.stderr = open(err_log, 'a', 0)
+        else:
+            sys.stderr = NullDevice()
+        if out_log:
+            sys.stdout = open(out_log, 'a', 0)
+        else:
+            sys.stdout = NullDevice()
+
+    class NullDevice:
+        "A writeable object that writes to nowhere -- like /dev/null."
+        def write(self, s):
+            pass

Added: vendor/django/current/django/utils/datastructures.py
===================================================================
--- vendor/django/current/django/utils/datastructures.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/datastructures.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,235 @@
+class MergeDict(object):
+    """
+    A simple class for creating new "virtual" dictionaries that actualy look
+    up values in more than one dictionary, passed in the constructor.
+    """
+    def __init__(self, *dicts):
+        self.dicts = dicts
+
+    def __getitem__(self, key):
+        for dict in self.dicts:
+            try:
+                return dict[key]
+            except KeyError:
+                pass
+        raise KeyError
+
+    def get(self, key, default):
+        try:
+            return self[key]
+        except KeyError:
+            return default
+
+    def getlist(self, key):
+        for dict in self.dicts:
+            try:
+                return dict.getlist(key)
+            except KeyError:
+                pass
+        raise KeyError
+
+    def items(self):
+        item_list = []
+        for dict in self.dicts:
+            item_list.extend(dict.items())
+        return item_list
+
+    def has_key(self, key):
+        for dict in self.dicts:
+            if dict.has_key(key):
+                return True
+        return False
+
+class SortedDict(dict):
+    "A dictionary that keeps its keys in the order in which they're inserted."
+    def __init__(self, data=None):
+        if data is None: data = {}
+        dict.__init__(self, data)
+        self.keyOrder = data.keys()
+
+    def __setitem__(self, key, value):
+        dict.__setitem__(self, key, value)
+        if key not in self.keyOrder:
+            self.keyOrder.append(key)
+
+    def __delitem__(self, key):
+        dict.__delitem__(self, key)
+        self.keyOrder.remove(key)
+
+    def __iter__(self):
+        for k in self.keyOrder:
+            yield k
+
+    def items(self):
+        return zip(self.keyOrder, self.values())
+
+    def keys(self):
+        return self.keyOrder[:]
+
+    def values(self):
+        return [dict.__getitem__(self,k) for k in self.keyOrder]
+
+    def update(self, dict):
+        for k, v in dict.items():
+            self.__setitem__(k, v)
+
+    def setdefault(self, key, default):
+        if key not in self.keyOrder:
+            self.keyOrder.append(key)
+        return dict.setdefault(self, key, default)
+
+class MultiValueDictKeyError(KeyError):
+    pass
+
+class MultiValueDict(dict):
+    """
+    A subclass of dictionary customized to handle multiple values for the same key.
+
+    >>> d = MultiValueDict({'name': ['Adrian', 'Simon'], 'position': ['Developer']})
+    >>> d['name']
+    'Simon'
+    >>> d.getlist('name')
+    ['Adrian', 'Simon']
+    >>> d.get('lastname', 'nonexistent')
+    'nonexistent'
+    >>> d.setlist('lastname', ['Holovaty', 'Willison'])
+
+    This class exists to solve the irritating problem raised by cgi.parse_qs,
+    which returns a list for every key, even though most Web forms submit
+    single name-value pairs.
+    """
+    def __init__(self, key_to_list_mapping=()):
+        dict.__init__(self, key_to_list_mapping)
+
+    def __repr__(self):
+        return "<MultiValueDict: %s>" % dict.__repr__(self)
+
+    def __getitem__(self, key):
+        """
+        Returns the last data value for this key, or [] if it's an empty list;
+        raises KeyError if not found.
+        """
+        try:
+            list_ = dict.__getitem__(self, key)
+        except KeyError:
+            raise MultiValueDictKeyError, "Key %r not found in %r" % (key, self)
+        try:
+            return list_[-1]
+        except IndexError:
+            return []
+
+    def __setitem__(self, key, value):
+        dict.__setitem__(self, key, [value])
+
+    def __copy__(self):
+        return self.__class__(dict.items(self))
+
+    def __deepcopy__(self, memo=None):
+        import copy
+        if memo is None: memo = {}
+        result = self.__class__()
+        memo[id(self)] = result
+        for key, value in dict.items(self):
+            dict.__setitem__(result, copy.deepcopy(key, memo), copy.deepcopy(value, memo))
+        return result
+
+    def get(self, key, default=None):
+        "Returns the default value if the requested data doesn't exist"
+        try:
+            val = self[key]
+        except KeyError:
+            return default
+        if val == []:
+            return default
+        return val
+
+    def getlist(self, key):
+        "Returns an empty list if the requested data doesn't exist"
+        try:
+            return dict.__getitem__(self, key)
+        except KeyError:
+            return []
+
+    def setlist(self, key, list_):
+        dict.__setitem__(self, key, list_)
+
+    def setdefault(self, key, default=None):
+        if key not in self:
+            self[key] = default
+        return self[key]
+
+    def setlistdefault(self, key, default_list=()):
+        if key not in self:
+            self.setlist(key, default_list)
+        return self.getlist(key)
+
+    def appendlist(self, key, value):
+        "Appends an item to the internal list associated with key"
+        self.setlistdefault(key, [])
+        dict.__setitem__(self, key, self.getlist(key) + [value])
+
+    def items(self):
+        """
+        Returns a list of (key, value) pairs, where value is the last item in
+        the list associated with the key.
+        """
+        return [(key, self[key]) for key in self.keys()]
+
+    def lists(self):
+        "Returns a list of (key, list) pairs."
+        return dict.items(self)
+
+    def values(self):
+        "Returns a list of the last value on every key list."
+        return [self[key] for key in self.keys()]
+
+    def copy(self):
+        "Returns a copy of this object."
+        return self.__deepcopy__()
+
+    def update(self, other_dict):
+        "update() extends rather than replaces existing key lists."
+        if isinstance(other_dict, MultiValueDict):
+            for key, value_list in other_dict.lists():
+                self.setlistdefault(key, []).extend(value_list)
+        else:
+            try:
+                for key, value in other_dict.items():
+                    self.setlistdefault(key, []).append(value)
+            except TypeError:
+                raise ValueError, "MultiValueDict.update() takes either a MultiValueDict or dictionary"
+
+class DotExpandedDict(dict):
+    """
+    A special dictionary constructor that takes a dictionary in which the keys
+    may contain dots to specify inner dictionaries. It's confusing, but this
+    example should make sense.
+
+    >>> d = DotExpandedDict({'person.1.firstname': ['Simon'],
+            'person.1.lastname': ['Willison'],
+            'person.2.firstname': ['Adrian'],
+            'person.2.lastname': ['Holovaty']})
+    >>> d
+    {'person': {'1': {'lastname': ['Willison'], 'firstname': ['Simon']},
+    '2': {'lastname': ['Holovaty'], 'firstname': ['Adrian']}}}
+    >>> d['person']
+    {'1': {'firstname': ['Simon'], 'lastname': ['Willison'],
+    '2': {'firstname': ['Adrian'], 'lastname': ['Holovaty']}
+    >>> d['person']['1']
+    {'firstname': ['Simon'], 'lastname': ['Willison']}
+
+    # Gotcha: Results are unpredictable if the dots are "uneven":
+    >>> DotExpandedDict({'c.1': 2, 'c.2': 3, 'c': 1})
+    >>> {'c': 1}
+    """
+    def __init__(self, key_to_list_mapping):
+        for k, v in key_to_list_mapping.items():
+            current = self
+            bits = k.split('.')
+            for bit in bits[:-1]:
+                current = current.setdefault(bit, {})
+            # Now assign value to current position
+            try:
+                current[bits[-1]] = v
+            except TypeError: # Special-case if current isn't a dict.
+                current = {bits[-1] : v}

Added: vendor/django/current/django/utils/dateformat.py
===================================================================
--- vendor/django/current/django/utils/dateformat.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/dateformat.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,257 @@
+"""
+PHP date() style date formatting
+See http://www.php.net/date for format strings
+
+Usage:
+>>> import datetime
+>>> d = datetime.datetime.now()
+>>> df = DateFormat(d)
+>>> print df.format('jS F Y H:i')
+7th October 2003 11:39
+>>>
+"""
+
+from django.utils.dates import MONTHS, MONTHS_AP, WEEKDAYS
+from django.utils.tzinfo import LocalTimezone
+from calendar import isleap, monthrange
+import re, time
+
+re_formatchars = re.compile(r'(?<!\\)([aABdDfFgGhHiIjlLmMnNOPrsStTUwWyYzZ])')
+re_escaped = re.compile(r'\\(.)')
+
+class Formatter(object):
+    def format(self, formatstr):
+        pieces = []
+        for i, piece in enumerate(re_formatchars.split(formatstr)):
+            if i % 2:
+                pieces.append(str(getattr(self, piece)()))
+            elif piece:
+                pieces.append(re_escaped.sub(r'\1', piece))
+        return ''.join(pieces)
+
+class TimeFormat(Formatter):
+    def __init__(self, t):
+        self.data = t
+
+    def a(self):
+        "'a.m.' or 'p.m.'"
+        if self.data.hour > 11:
+            return 'p.m.'
+        return 'a.m.'
+
+    def A(self):
+        "'AM' or 'PM'"
+        if self.data.hour > 11:
+            return 'PM'
+        return 'AM'
+
+    def B(self):
+        "Swatch Internet time"
+        raise NotImplementedError
+
+    def f(self):
+        """
+        Time, in 12-hour hours and minutes, with minutes left off if they're zero.
+        Examples: '1', '1:30', '2:05', '2'
+        Proprietary extension.
+        """
+        if self.data.minute == 0:
+            return self.g()
+        return '%s:%s' % (self.g(), self.i())
+
+    def g(self):
+        "Hour, 12-hour format without leading zeros; i.e. '1' to '12'"
+        if self.data.hour == 0:
+            return 12
+        if self.data.hour > 12:
+            return self.data.hour - 12
+        return self.data.hour
+
+    def G(self):
+        "Hour, 24-hour format without leading zeros; i.e. '0' to '23'"
+        return self.data.hour
+
+    def h(self):
+        "Hour, 12-hour format; i.e. '01' to '12'"
+        return '%02d' % self.g()
+
+    def H(self):
+        "Hour, 24-hour format; i.e. '00' to '23'"
+        return '%02d' % self.G()
+
+    def i(self):
+        "Minutes; i.e. '00' to '59'"
+        return '%02d' % self.data.minute
+
+    def P(self):
+        """
+        Time, in 12-hour hours, minutes and 'a.m.'/'p.m.', with minutes left off
+        if they're zero and the strings 'midnight' and 'noon' if appropriate.
+        Examples: '1 a.m.', '1:30 p.m.', 'midnight', 'noon', '12:30 p.m.'
+        Proprietary extension.
+        """
+        if self.data.minute == 0 and self.data.hour == 0:
+            return 'midnight'
+        if self.data.minute == 0 and self.data.hour == 12:
+            return 'noon'
+        return '%s %s' % (self.f(), self.a())
+
+    def s(self):
+        "Seconds; i.e. '00' to '59'"
+        return '%02d' % self.data.second
+
+class DateFormat(TimeFormat):
+    year_days = [None, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
+
+    def __init__(self, dt):
+        # Accepts either a datetime or date object.
+        self.data = dt
+        self.timezone = getattr(dt, 'tzinfo', None)
+        if hasattr(self.data, 'hour') and not self.timezone:
+            self.timezone = LocalTimezone(dt)
+
+    def d(self):
+        "Day of the month, 2 digits with leading zeros; i.e. '01' to '31'"
+        return '%02d' % self.data.day
+
+    def D(self):
+        "Day of the week, textual, 3 letters; e.g. 'Fri'"
+        return WEEKDAYS[self.data.weekday()][0:3]
+
+    def F(self):
+        "Month, textual, long; e.g. 'January'"
+        return MONTHS[self.data.month]
+
+    def I(self):
+        "'1' if Daylight Savings Time, '0' otherwise."
+        if self.timezone.dst(self.data):
+            return '1'
+        else:
+            return '0'
+
+    def j(self):
+        "Day of the month without leading zeros; i.e. '1' to '31'"
+        return self.data.day
+
+    def l(self):
+        "Day of the week, textual, long; e.g. 'Friday'"
+        return WEEKDAYS[self.data.weekday()]
+
+    def L(self):
+        "Boolean for whether it is a leap year; i.e. True or False"
+        return isleap(self.data.year)
+
+    def m(self):
+        "Month; i.e. '01' to '12'"
+        return '%02d' % self.data.month
+
+    def M(self):
+        "Month, textual, 3 letters; e.g. 'Jan'"
+        return MONTHS[self.data.month][0:3]
+
+    def n(self):
+        "Month without leading zeros; i.e. '1' to '12'"
+        return self.data.month
+
+    def N(self):
+        "Month abbreviation in Associated Press style. Proprietary extension."
+        return MONTHS_AP[self.data.month]
+
+    def O(self):
+        "Difference to Greenwich time in hours; e.g. '+0200'"
+        tz = self.timezone.utcoffset(self.data)
+        return "%+03d%02d" % (tz.seconds // 3600, (tz.seconds // 60) % 60)
+
+    def r(self):
+        "RFC 822 formatted date; e.g. 'Thu, 21 Dec 2000 16:01:07 +0200'"
+        return self.format('D, j M Y H:i:s O')
+
+    def S(self):
+        "English ordinal suffix for the day of the month, 2 characters; i.e. 'st', 'nd', 'rd' or 'th'"
+        if self.data.day in (11, 12, 13): # Special case
+            return 'th'
+        last = self.data.day % 10
+        if last == 1:
+            return 'st'
+        if last == 2:
+            return 'nd'
+        if last == 3:
+            return 'rd'
+        return 'th'
+
+    def t(self):
+        "Number of days in the given month; i.e. '28' to '31'"
+        return '%02d' % monthrange(self.data.year, self.data.month)[1]
+
+    def T(self):
+        "Time zone of this machine; e.g. 'EST' or 'MDT'"
+        name = self.timezone.tzname(self.data)
+        if name is None:
+            name = self.format('O')
+        return name
+
+    def U(self):
+        "Seconds since the Unix epoch (January 1 1970 00:00:00 GMT)"
+        off = self.timezone.utcoffset(self.data)
+        return int(time.mktime(self.data.timetuple())) + off.seconds * 60
+
+    def w(self):
+        "Day of the week, numeric, i.e. '0' (Sunday) to '6' (Saturday)"
+        return (self.data.weekday() + 1) % 7
+
+    def W(self):
+        "ISO-8601 week number of year, weeks starting on Monday"
+        # Algorithm from http://www.personal.ecu.edu/mccartyr/ISOwdALG.txt
+        week_number = None
+        jan1_weekday = self.data.replace(month=1, day=1).weekday() + 1
+        weekday = self.data.weekday() + 1
+        day_of_year = self.z()
+        if day_of_year <= (8 - jan1_weekday) and jan1_weekday > 4:
+            if jan1_weekday == 5 or (jan1_weekday == 6 and isleap(self.data.year-1)):
+                week_number = 53
+            else:
+                week_number = 52
+        else:
+            if isleap(self.data.year):
+                i = 366
+            else:
+                i = 365
+            if (i - day_of_year) < (4 - weekday):
+                week_number = 1
+            else:
+                j = day_of_year + (7 - weekday) + (jan1_weekday - 1)
+                week_number = j / 7
+                if jan1_weekday > 4:
+                    week_number -= 1
+        return week_number
+
+    def y(self):
+        "Year, 2 digits; e.g. '99'"
+        return str(self.data.year)[2:]
+
+    def Y(self):
+        "Year, 4 digits; e.g. '1999'"
+        return self.data.year
+
+    def z(self):
+        "Day of the year; i.e. '0' to '365'"
+        doy = self.year_days[self.data.month] + self.data.day
+        if self.L() and self.data.month > 2:
+            doy += 1
+        return doy
+
+    def Z(self):
+        """Time zone offset in seconds (i.e. '-43200' to '43200'). The offset
+        for timezones west of UTC is always negative, and for those east of UTC
+        is always positive."""
+        return self.timezone.utcoffset(self.data).seconds
+
+def format(value, format_string):
+    "Convenience function"
+    df = DateFormat(value)
+    return df.format(format_string)
+
+def time_format(value, format_string):
+    "Convenience function"
+    tf = TimeFormat(value)
+    return tf.format(format_string)

Added: vendor/django/current/django/utils/dates.py
===================================================================
--- vendor/django/current/django/utils/dates.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/dates.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,29 @@
+"Commonly-used date structures"
+
+from django.utils.translation import gettext_lazy as _
+
+WEEKDAYS = {
+    0:_('Monday'), 1:_('Tuesday'), 2:_('Wednesday'), 3:_('Thursday'), 4:_('Friday'),
+    5:_('Saturday'), 6:_('Sunday')
+}
+WEEKDAYS_REV = {
+    'monday':0, 'tuesday':1, 'wednesday':2, 'thursday':3, 'friday':4,
+    'saturday':5, 'sunday':6
+}
+MONTHS = {
+    1:_('January'), 2:_('February'), 3:_('March'), 4:_('April'), 5:_('May'), 6:_('June'),
+    7:_('July'), 8:_('August'), 9:_('September'), 10:_('October'), 11:_('November'),
+    12:_('December')
+}
+MONTHS_3 = {
+    1:_('jan'), 2:_('feb'), 3:_('mar'), 4:_('apr'), 5:_('may'), 6:_('jun'),
+    7:_('jul'), 8:_('aug'), 9:_('sep'), 10:_('oct'), 11:_('nov'), 12:_('dec')
+}
+MONTHS_3_REV = {
+    'jan':1, 'feb':2, 'mar':3, 'apr':4, 'may':5, 'jun':6, 'jul':7, 'aug':8,
+    'sep':9, 'oct':10, 'nov':11, 'dec':12
+}
+MONTHS_AP = { # month names in Associated Press style
+    1:_('Jan.'), 2:_('Feb.'), 3:_('March'), 4:_('April'), 5:_('May'), 6:_('June'), 7:_('July'),
+    8:_('Aug.'), 9:_('Sept.'), 10:_('Oct.'), 11:_('Nov.'), 12:_('Dec.')
+}

Added: vendor/django/current/django/utils/decorators.py
===================================================================
--- vendor/django/current/django/utils/decorators.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/decorators.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,33 @@
+"Functions that help with dynamically creating decorators for views."
+
+def decorator_from_middleware(middleware_class):
+    """
+    Given a middleware class (not an instance), returns a view decorator. This
+    lets you use middleware functionality on a per-view basis.
+    """
+    def _decorator_from_middleware(view_func, *args, **kwargs):
+        middleware = middleware_class(*args, **kwargs)
+        def _wrapped_view(request, *args, **kwargs):
+            if hasattr(middleware, 'process_request'):
+                result = middleware.process_request(request)
+                if result is not None:
+                    return result
+            if hasattr(middleware, 'process_view'):
+                result = middleware.process_view(request, view_func, *args, **kwargs)
+                if result is not None:
+                    return result
+            try:
+                response = view_func(request, *args, **kwargs)
+            except Exception, e:
+                if hasattr(middleware, 'process_exception'):
+                    result = middleware.process_exception(request, e)
+                    if result is not None:
+                        return result
+                raise
+            if hasattr(middleware, 'process_response'):
+                result = middleware.process_response(request, response)
+                if result is not None:
+                    return result
+            return response
+        return _wrapped_view
+    return _decorator_from_middleware

Added: vendor/django/current/django/utils/feedgenerator.py
===================================================================
--- vendor/django/current/django/utils/feedgenerator.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/feedgenerator.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,263 @@
+"""
+Syndication feed generation library -- used for generating RSS, etc.
+
+Sample usage:
+
+>>> feed = feedgenerator.Rss201rev2Feed(
+...     title=u"Poynter E-Media Tidbits",
+...     link=u"http://www.poynter.org/column.asp?id=31",
+...     description=u"A group weblog by the sharpest minds in online media/journalism/publishing.",
+...     language=u"en",
+... )
+>>> feed.add_item(title="Hello", link=u"http://www.holovaty.com/test/", description="Testing.")
+>>> fp = open('test.rss', 'w')
+>>> feed.write(fp, 'utf-8')
+>>> fp.close()
+
+For definitions of the different versions of RSS, see:
+http://diveintomark.org/archives/2004/02/04/incompatible-rss
+"""
+
+from django.utils.xmlutils import SimplerXMLGenerator
+import datetime, re, time
+import email.Utils
+
+def rfc2822_date(date):
+    return email.Utils.formatdate(time.mktime(date.timetuple()))
+
+def rfc3339_date(date):
+    return date.strftime('%Y-%m-%dT%H:%M:%SZ')
+
+def get_tag_uri(url, date):
+    "Creates a TagURI. See http://diveintomark.org/archives/2004/05/28/howto-atom-id"
+    tag = re.sub('^http://', '', url)
+    if date is not None:
+        tag = re.sub('/', ',%s:/' % date.strftime('%Y-%m-%d'), tag, 1)
+    tag = re.sub('#', '/', tag)
+    return 'tag:' + tag
+
+class SyndicationFeed(object):
+    "Base class for all syndication feeds. Subclasses should provide write()"
+    def __init__(self, title, link, description, language=None, author_email=None,
+            author_name=None, author_link=None, subtitle=None, categories=None,
+            feed_url=None):
+        self.feed = {
+            'title': title,
+            'link': link,
+            'description': description,
+            'language': language,
+            'author_email': author_email,
+            'author_name': author_name,
+            'author_link': author_link,
+            'subtitle': subtitle,
+            'categories': categories or (),
+            'feed_url': feed_url,
+        }
+        self.items = []
+
+    def add_item(self, title, link, description, author_email=None,
+        author_name=None, author_link=None, pubdate=None, comments=None,
+        unique_id=None, enclosure=None, categories=()):
+        """
+        Adds an item to the feed. All args are expected to be Python Unicode
+        objects except pubdate, which is a datetime.datetime object, and
+        enclosure, which is an instance of the Enclosure class.
+        """
+        self.items.append({
+            'title': title,
+            'link': link,
+            'description': description,
+            'author_email': author_email,
+            'author_name': author_name,
+            'author_link': author_link,
+            'pubdate': pubdate,
+            'comments': comments,
+            'unique_id': unique_id,
+            'enclosure': enclosure,
+            'categories': categories or (),
+        })
+
+    def num_items(self):
+        return len(self.items)
+
+    def write(self, outfile, encoding):
+        """
+        Outputs the feed in the given encoding to outfile, which is a file-like
+        object. Subclasses should override this.
+        """
+        raise NotImplementedError
+
+    def writeString(self, encoding):
+        """
+        Returns the feed in the given encoding as a string.
+        """
+        from StringIO import StringIO
+        s = StringIO()
+        self.write(s, encoding)
+        return s.getvalue()
+
+    def latest_post_date(self):
+        """
+        Returns the latest item's pubdate. If none of them have a pubdate,
+        this returns the current date/time.
+        """
+        updates = [i['pubdate'] for i in self.items if i['pubdate'] is not None]
+        if len(updates) > 0:
+            updates.sort()
+            return updates[-1]
+        else:
+            return datetime.datetime.now()
+
+class Enclosure(object):
+    "Represents an RSS enclosure"
+    def __init__(self, url, length, mime_type):
+        "All args are expected to be Python Unicode objects"
+        self.url, self.length, self.mime_type = url, length, mime_type
+
+class RssFeed(SyndicationFeed):
+    mime_type = 'application/rss+xml'
+    def write(self, outfile, encoding):
+        handler = SimplerXMLGenerator(outfile, encoding)
+        handler.startDocument()
+        handler.startElement(u"rss", {u"version": self._version})
+        handler.startElement(u"channel", {})
+        handler.addQuickElement(u"title", self.feed['title'])
+        handler.addQuickElement(u"link", self.feed['link'])
+        handler.addQuickElement(u"description", self.feed['description'])
+        if self.feed['language'] is not None:
+            handler.addQuickElement(u"language", self.feed['language'])
+        for cat in self.feed['categories']:
+            handler.addQuickElement(u"category", cat)
+        self.write_items(handler)
+        self.endChannelElement(handler)
+        handler.endElement(u"rss")
+
+    def endChannelElement(self, handler):
+        handler.endElement(u"channel")
+
+class RssUserland091Feed(RssFeed):
+    _version = u"0.91"
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u"item", {})
+            handler.addQuickElement(u"title", item['title'])
+            handler.addQuickElement(u"link", item['link'])
+            if item['description'] is not None:
+                handler.addQuickElement(u"description", item['description'])
+            handler.endElement(u"item")
+
+class Rss201rev2Feed(RssFeed):
+    # Spec: http://blogs.law.harvard.edu/tech/rss
+    _version = u"2.0"
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u"item", {})
+            handler.addQuickElement(u"title", item['title'])
+            handler.addQuickElement(u"link", item['link'])
+            if item['description'] is not None:
+                handler.addQuickElement(u"description", item['description'])
+
+            # Author information.
+            if item["author_name"] and item["author_email"]:
+                handler.addQuickElement(u"author", "%s (%s)" % \
+                    (item['author_email'], item['author_name']))
+            elif item["author_email"]:
+                handler.addQuickElement(u"author", item["author_email"])
+
+            if item['pubdate'] is not None:
+                handler.addQuickElement(u"pubDate", rfc2822_date(item['pubdate']).decode('ascii'))
+            if item['comments'] is not None:
+                handler.addQuickElement(u"comments", item['comments'])
+            if item['unique_id'] is not None:
+                handler.addQuickElement(u"guid", item['unique_id'])
+
+            # Enclosure.
+            if item['enclosure'] is not None:
+                handler.addQuickElement(u"enclosure", '',
+                    {u"url": item['enclosure'].url, u"length": item['enclosure'].length,
+                        u"type": item['enclosure'].mime_type})
+
+            # Categories.
+            for cat in item['categories']:
+                handler.addQuickElement(u"category", cat)
+
+            handler.endElement(u"item")
+
+class Atom1Feed(SyndicationFeed):
+    # Spec: http://atompub.org/2005/07/11/draft-ietf-atompub-format-10.html
+    mime_type = 'application/atom+xml'
+    ns = u"http://www.w3.org/2005/Atom"
+    def write(self, outfile, encoding):
+        handler = SimplerXMLGenerator(outfile, encoding)
+        handler.startDocument()
+        if self.feed['language'] is not None:
+            handler.startElement(u"feed", {u"xmlns": self.ns, u"xml:lang": self.feed['language']})
+        else:
+            handler.startElement(u"feed", {u"xmlns": self.ns})
+        handler.addQuickElement(u"title", self.feed['title'])
+        handler.addQuickElement(u"link", "", {u"rel": u"alternate", u"href": self.feed['link']})
+        if self.feed['feed_url'] is not None:
+            handler.addQuickElement(u"link", "", {u"rel": u"self", u"href": self.feed['feed_url']})
+        handler.addQuickElement(u"id", self.feed['link'])
+        handler.addQuickElement(u"updated", rfc3339_date(self.latest_post_date()).decode('ascii'))
+        if self.feed['author_name'] is not None:
+            handler.startElement(u"author", {})
+            handler.addQuickElement(u"name", self.feed['author_name'])
+            if self.feed['author_email'] is not None:
+                handler.addQuickElement(u"email", self.feed['author_email'])
+            if self.feed['author_link'] is not None:
+                handler.addQuickElement(u"uri", self.feed['author_link'])
+            handler.endElement(u"author")
+        if self.feed['subtitle'] is not None:
+            handler.addQuickElement(u"subtitle", self.feed['subtitle'])
+        for cat in self.feed['categories']:
+            handler.addQuickElement(u"category", "", {u"term": cat})
+        self.write_items(handler)
+        handler.endElement(u"feed")
+
+    def write_items(self, handler):
+        for item in self.items:
+            handler.startElement(u"entry", {})
+            handler.addQuickElement(u"title", item['title'])
+            handler.addQuickElement(u"link", u"", {u"href": item['link'], u"rel": u"alternate"})
+            if item['pubdate'] is not None:
+                handler.addQuickElement(u"updated", rfc3339_date(item['pubdate']).decode('ascii'))
+
+            # Author information.
+            if item['author_name'] is not None:
+                handler.startElement(u"author", {})
+                handler.addQuickElement(u"name", item['author_name'])
+                if item['author_email'] is not None:
+                    handler.addQuickElement(u"email", item['author_email'])
+                if item['author_link'] is not None:
+                    handler.addQuickElement(u"uri", item['author_link'])
+                handler.endElement(u"author")
+
+            # Unique ID.
+            if item['unique_id'] is not None:
+                unique_id = item['unique_id']
+            else:
+                unique_id = get_tag_uri(item['link'], item['pubdate'])
+            handler.addQuickElement(u"id", unique_id)
+
+            # Summary.
+            if item['description'] is not None:
+                handler.addQuickElement(u"summary", item['description'], {u"type": u"html"})
+
+            # Enclosure.
+            if item['enclosure'] is not None:
+                handler.addQuickElement(u"link", '',
+                    {u"rel": u"enclosure",
+                     u"href": item['enclosure'].url,
+                     u"length": item['enclosure'].length,
+                     u"type": item['enclosure'].mime_type})
+
+            # Categories:
+            for cat in item['categories']:
+                handler.addQuickElement(u"category", u"", {u"term": cat})
+
+            handler.endElement(u"entry")
+
+# This isolates the decision of what the system default is, so calling code can
+# do "feedgenerator.DefaultFeed" instead of "feedgenerator.Rss201rev2Feed".
+DefaultFeed = Rss201rev2Feed

Added: vendor/django/current/django/utils/functional.py
===================================================================
--- vendor/django/current/django/utils/functional.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/functional.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,54 @@
+def curry(*args, **kwargs):
+    def _curried(*moreargs, **morekwargs):
+        return args[0](*(args[1:]+moreargs), **dict(kwargs.items() + morekwargs.items()))
+    return _curried
+
+class Promise:
+    """
+    This is just a base class for the proxy class created in
+    the closure of the lazy function. It can be used to recognize
+    promises in code.
+    """
+    pass
+
+def lazy(func, *resultclasses):
+    """
+    Turns any callable into a lazy evaluated callable. You need to give result
+    classes or types -- at least one is needed so that the automatic forcing of
+    the lazy evaluation code is triggered. Results are not memoized; the
+    function is evaluated on every access.
+    """
+    class __proxy__(Promise):
+        # This inner class encapsulates the code that should be evaluated
+        # lazily. On calling of one of the magic methods it will force
+        # the evaluation and store the result. Afterwards, the result
+        # is delivered directly. So the result is memoized.
+        def __init__(self, args, kw):
+            self.__func = func
+            self.__args = args
+            self.__kw = kw
+            self.__dispatch = {}
+            for resultclass in resultclasses:
+                self.__dispatch[resultclass] = {}
+                for (k, v) in resultclass.__dict__.items():
+                    setattr(self, k, self.__promise__(resultclass, k, v))
+
+        def __promise__(self, klass, funcname, func):
+            # Builds a wrapper around some magic method and registers that magic
+            # method for the given type and method name.
+            def __wrapper__(*args, **kw):
+                # Automatically triggers the evaluation of a lazy value and
+                # applies the given magic method of the result type.
+                res = self.__func(*self.__args, **self.__kw)
+                return self.__dispatch[type(res)][funcname](res, *args, **kw)
+
+            if not self.__dispatch.has_key(klass):
+                self.__dispatch[klass] = {}
+            self.__dispatch[klass][funcname] = func
+            return __wrapper__
+
+    def __wrapper__(*args, **kw):
+        # Creates the proxy object, instead of the actual value.
+        return __proxy__(args, kw)
+
+    return __wrapper__

Added: vendor/django/current/django/utils/html.py
===================================================================
--- vendor/django/current/django/utils/html.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/html.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,115 @@
+"HTML utilities suitable for global use."
+
+import re, string
+
+# Configuration for urlize() function
+LEADING_PUNCTUATION  = ['(', '<', '&lt;']
+TRAILING_PUNCTUATION = ['.', ',', ')', '>', '\n', '&gt;']
+
+# list of possible strings used for bullets in bulleted lists
+DOTS = ['&middot;', '*', '\xe2\x80\xa2', '&#149;', '&bull;', '&#8226;']
+
+unencoded_ampersands_re = re.compile(r'&(?!(\w+|#\d+);)')
+word_split_re = re.compile(r'(\s+)')
+punctuation_re = re.compile('^(?P<lead>(?:%s)*)(?P<middle>.*?)(?P<trail>(?:%s)*)$' % \
+    ('|'.join([re.escape(x) for x in LEADING_PUNCTUATION]),
+    '|'.join([re.escape(x) for x in TRAILING_PUNCTUATION])))
+simple_email_re = re.compile(r'^\S+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9._-]+$')
+link_target_attribute_re = re.compile(r'(<a [^>]*?)target=[^\s>]+')
+html_gunk_re = re.compile(r'(?:<br clear="all">|<i><\/i>|<b><\/b>|<em><\/em>|<strong><\/strong>|<\/?smallcaps>|<\/?uppercase>)', re.IGNORECASE)
+hard_coded_bullets_re = re.compile(r'((?:<p>(?:%s).*?[a-zA-Z].*?</p>\s*)+)' % '|'.join([re.escape(x) for x in DOTS]), re.DOTALL)
+trailing_empty_content_re = re.compile(r'(?:<p>(?:&nbsp;|\s|<br \/>)*?</p>\s*)+\Z')
+del x # Temporary variable
+
+def escape(html):
+    "Returns the given HTML with ampersands, quotes and carets encoded"
+    if not isinstance(html, basestring):
+        html = str(html)
+    return html.replace('&', '&amp;').replace('<', '&lt;').replace('>', '&gt;').replace('"', '&quot;').replace("'", '&#39;')
+
+def linebreaks(value):
+    "Converts newlines into <p> and <br />s"
+    value = re.sub(r'\r\n|\r|\n', '\n', value) # normalize newlines
+    paras = re.split('\n{2,}', value)
+    paras = ['<p>%s</p>' % p.strip().replace('\n', '<br />') for p in paras]
+    return '\n\n'.join(paras)
+
+def strip_tags(value):
+    "Returns the given HTML with all tags stripped"
+    return re.sub(r'<[^>]*?>', '', value)
+
+def strip_spaces_between_tags(value):
+    "Returns the given HTML with spaces between tags normalized to a single space"
+    return re.sub(r'>\s+<', '> <', value)
+
+def strip_entities(value):
+    "Returns the given HTML with all entities (&something;) stripped"
+    return re.sub(r'&(?:\w+|#\d);', '', value)
+
+def fix_ampersands(value):
+    "Returns the given HTML with all unencoded ampersands encoded correctly"
+    return unencoded_ampersands_re.sub('&amp;', value)
+
+def urlize(text, trim_url_limit=None, nofollow=False):
+    """
+    Converts any URLs in text into clickable links. Works on http://, https:// and
+    www. links. Links can have trailing punctuation (periods, commas, close-parens)
+    and leading punctuation (opening parens) and it'll still do the right thing.
+
+    If trim_url_limit is not None, the URLs in link text will be limited to
+    trim_url_limit characters.
+
+    If nofollow is True, the URLs in link text will get a rel="nofollow" attribute.
+    """
+    trim_url = lambda x, limit=trim_url_limit: limit is not None and (x[:limit] + (len(x) >=limit and '...' or ''))  or x
+    words = word_split_re.split(text)
+    nofollow_attr = nofollow and ' rel="nofollow"' or ''
+    for i, word in enumerate(words):
+        match = punctuation_re.match(word)
+        if match:
+            lead, middle, trail = match.groups()
+            if middle.startswith('www.') or ('@' not in middle and not middle.startswith('http://') and \
+                    len(middle) > 0 and middle[0] in string.letters + string.digits and \
+                    (middle.endswith('.org') or middle.endswith('.net') or middle.endswith('.com'))):
+                middle = '<a href="http://%s"%s>%s</a>' % (middle, nofollow_attr, trim_url(middle))
+            if middle.startswith('http://') or middle.startswith('https://'):
+                middle = '<a href="%s"%s>%s</a>' % (middle, nofollow_attr, trim_url(middle))
+            if '@' in middle and not middle.startswith('www.') and not ':' in middle \
+                and simple_email_re.match(middle):
+                middle = '<a href="mailto:%s">%s</a>' % (middle, middle)
+            if lead + middle + trail != word:
+                words[i] = lead + middle + trail
+    return ''.join(words)
+
+def clean_html(text):
+    """
+    Cleans the given HTML. Specifically, it does the following:
+        * Converts <b> and <i> to <strong> and <em>.
+        * Encodes all ampersands correctly.
+        * Removes all "target" attributes from <a> tags.
+        * Removes extraneous HTML, such as presentational tags that open and
+          immediately close and <br clear="all">.
+        * Converts hard-coded bullets into HTML unordered lists.
+        * Removes stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the
+          bottom of the text.
+    """
+    from django.utils.text import normalize_newlines
+    text = normalize_newlines(text)
+    text = re.sub(r'<(/?)\s*b\s*>', '<\\1strong>', text)
+    text = re.sub(r'<(/?)\s*i\s*>', '<\\1em>', text)
+    text = fix_ampersands(text)
+    # Remove all target="" attributes from <a> tags.
+    text = link_target_attribute_re.sub('\\1', text)
+    # Trim stupid HTML such as <br clear="all">.
+    text = html_gunk_re.sub('', text)
+    # Convert hard-coded bullets into HTML unordered lists.
+    def replace_p_tags(match):
+        s = match.group().replace('</p>', '</li>')
+        for d in DOTS:
+            s = s.replace('<p>%s' % d, '<li>')
+        return '<ul>\n%s\n</ul>' % s
+    text = hard_coded_bullets_re.sub(replace_p_tags, text)
+    # Remove stuff like "<p>&nbsp;&nbsp;</p>", but only if it's at the bottom of the text.
+    text = trailing_empty_content_re.sub('', text)
+    return text
+

Added: vendor/django/current/django/utils/images.py
===================================================================
--- vendor/django/current/django/utils/images.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/images.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,22 @@
+"""
+Utility functions for handling images.
+
+Requires PIL, as you might imagine.
+"""
+
+import ImageFile
+
+def get_image_dimensions(path):
+    """Returns the (width, height) of an image at a given path."""
+    p = ImageFile.Parser()
+    fp = open(path, 'rb')
+    while 1:
+        data = fp.read(1024)
+        if not data:
+            break
+        p.feed(data)
+        if p.image:
+            return p.image.size
+            break
+    fp.close()
+    return None

Added: vendor/django/current/django/utils/simplejson/LICENSE.txt
===================================================================
--- vendor/django/current/django/utils/simplejson/LICENSE.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/simplejson/LICENSE.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,20 @@
+simplejson 1.3
+Copyright (c) 2006 Bob Ippolito
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of
+this software and associated documentation files (the "Software"), to deal in
+the Software without restriction, including without limitation the rights to
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+of the Software, and to permit persons to whom the Software is furnished to do
+so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.

Added: vendor/django/current/django/utils/simplejson/__init__.py
===================================================================
--- vendor/django/current/django/utils/simplejson/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/simplejson/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,221 @@
+r"""
+A simple, fast, extensible JSON encoder and decoder
+
+JSON (JavaScript Object Notation) <http://json.org> is a subset of
+JavaScript syntax (ECMA-262 3rd edition) used as a lightweight data
+interchange format.
+
+simplejson exposes an API familiar to uses of the standard library
+marshal and pickle modules.
+
+Encoding basic Python object hierarchies::
+    
+    >>> import simplejson
+    >>> simplejson.dumps(['foo', {'bar': ('baz', None, 1.0, 2)}])
+    '["foo", {"bar": ["baz", null, 1.0, 2]}]'
+    >>> print simplejson.dumps("\"foo\bar")
+    "\"foo\bar"
+    >>> print simplejson.dumps(u'\u1234')
+    "\u1234"
+    >>> print simplejson.dumps('\\')
+    "\\"
+    >>> print simplejson.dumps({"c": 0, "b": 0, "a": 0}, sort_keys=True)
+    {"a": 0, "b": 0, "c": 0}
+    >>> from StringIO import StringIO
+    >>> io = StringIO()
+    >>> simplejson.dump(['streaming API'], io)
+    >>> io.getvalue()
+    '["streaming API"]'
+
+Decoding JSON::
+    
+    >>> import simplejson
+    >>> simplejson.loads('["foo", {"bar":["baz", null, 1.0, 2]}]')
+    [u'foo', {u'bar': [u'baz', None, 1.0, 2]}]
+    >>> simplejson.loads('"\\"foo\\bar"')
+    u'"foo\x08ar'
+    >>> from StringIO import StringIO
+    >>> io = StringIO('["streaming API"]')
+    >>> simplejson.load(io)
+    [u'streaming API']
+
+Specializing JSON object decoding::
+
+    >>> import simplejson
+    >>> def as_complex(dct):
+    ...     if '__complex__' in dct:
+    ...         return complex(dct['real'], dct['imag'])
+    ...     return dct
+    ... 
+    >>> simplejson.loads('{"__complex__": true, "real": 1, "imag": 2}',
+    ...     object_hook=as_complex)
+    (1+2j)
+
+Extending JSONEncoder::
+    
+    >>> import simplejson
+    >>> class ComplexEncoder(simplejson.JSONEncoder):
+    ...     def default(self, obj):
+    ...         if isinstance(obj, complex):
+    ...             return [obj.real, obj.imag]
+    ...         return simplejson.JSONEncoder.default(self, obj)
+    ... 
+    >>> dumps(2 + 1j, cls=ComplexEncoder)
+    '[2.0, 1.0]'
+    >>> ComplexEncoder().encode(2 + 1j)
+    '[2.0, 1.0]'
+    >>> list(ComplexEncoder().iterencode(2 + 1j))
+    ['[', '2.0', ', ', '1.0', ']']
+    
+
+Note that the JSON produced by this module is a subset of YAML,
+so it may be used as a serializer for that as well.
+"""
+__version__ = '1.3'
+__all__ = [
+    'dump', 'dumps', 'load', 'loads',
+    'JSONDecoder', 'JSONEncoder',
+]
+
+from django.utils.simplejson.decoder import JSONDecoder
+from django.utils.simplejson.encoder import JSONEncoder
+
+def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
+        allow_nan=True, cls=None, **kw):
+    """
+    Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
+    ``.write()``-supporting file-like object).
+
+    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
+    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) 
+    will be skipped instead of raising a ``TypeError``.
+
+    If ``ensure_ascii`` is ``False``, then the some chunks written to ``fp``
+    may be ``unicode`` instances, subject to normal Python ``str`` to
+    ``unicode`` coercion rules.  Unless ``fp.write()`` explicitly
+    understands ``unicode`` (as in ``codecs.getwriter()``) this is likely
+    to cause an error.
+
+    If ``check_circular`` is ``False``, then the circular reference check
+    for container types will be skipped and a circular reference will
+    result in an ``OverflowError`` (or worse).
+
+    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
+    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``)
+    in strict compliance of the JSON specification, instead of using the
+    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+
+    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
+    ``.default()`` method to serialize additional types), specify it with
+    the ``cls`` kwarg.
+    """
+    if cls is None:
+        cls = JSONEncoder
+    iterable = cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
+        check_circular=check_circular, allow_nan=allow_nan,
+        **kw).iterencode(obj)
+    # could accelerate with writelines in some versions of Python, at
+    # a debuggability cost
+    for chunk in iterable:
+        fp.write(chunk)
+
+def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
+        allow_nan=True, cls=None, **kw):
+    """
+    Serialize ``obj`` to a JSON formatted ``str``.
+
+    If ``skipkeys`` is ``True`` then ``dict`` keys that are not basic types
+    (``str``, ``unicode``, ``int``, ``long``, ``float``, ``bool``, ``None``) 
+    will be skipped instead of raising a ``TypeError``.
+
+    If ``ensure_ascii`` is ``False``, then the return value will be a
+    ``unicode`` instance subject to normal Python ``str`` to ``unicode``
+    coercion rules instead of being escaped to an ASCII ``str``.
+
+    If ``check_circular`` is ``False``, then the circular reference check
+    for container types will be skipped and a circular reference will
+    result in an ``OverflowError`` (or worse).
+
+    If ``allow_nan`` is ``False``, then it will be a ``ValueError`` to
+    serialize out of range ``float`` values (``nan``, ``inf``, ``-inf``) in
+    strict compliance of the JSON specification, instead of using the
+    JavaScript equivalents (``NaN``, ``Infinity``, ``-Infinity``).
+
+    To use a custom ``JSONEncoder`` subclass (e.g. one that overrides the
+    ``.default()`` method to serialize additional types), specify it with
+    the ``cls`` kwarg.
+    """
+    if cls is None:
+        cls = JSONEncoder
+    return cls(skipkeys=skipkeys, ensure_ascii=ensure_ascii,
+        check_circular=check_circular, allow_nan=allow_nan, **kw).encode(obj)
+
+def load(fp, encoding=None, cls=None, object_hook=None, **kw):
+    """
+    Deserialize ``fp`` (a ``.read()``-supporting file-like object containing
+    a JSON document) to a Python object.
+
+    If the contents of ``fp`` is encoded with an ASCII based encoding other
+    than utf-8 (e.g. latin-1), then an appropriate ``encoding`` name must
+    be specified.  Encodings that are not ASCII based (such as UCS-2) are
+    not allowed, and should be wrapped with
+    ``codecs.getreader(fp)(encoding)``, or simply decoded to a ``unicode``
+    object and passed to ``loads()``
+
+    ``object_hook`` is an optional function that will be called with the
+    result of any object literal decode (a ``dict``).  The return value of
+    ``object_hook`` will be used instead of the ``dict``.  This feature
+    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
+    
+    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
+    kwarg.
+    """
+    if cls is None:
+        cls = JSONDecoder
+    if object_hook is not None:
+        kw['object_hook'] = object_hook
+    return cls(encoding=encoding, **kw).decode(fp.read())
+
+def loads(s, encoding=None, cls=None, object_hook=None, **kw):
+    """
+    Deserialize ``s`` (a ``str`` or ``unicode`` instance containing a JSON
+    document) to a Python object.
+
+    If ``s`` is a ``str`` instance and is encoded with an ASCII based encoding
+    other than utf-8 (e.g. latin-1) then an appropriate ``encoding`` name
+    must be specified.  Encodings that are not ASCII based (such as UCS-2)
+    are not allowed and should be decoded to ``unicode`` first.
+
+    ``object_hook`` is an optional function that will be called with the
+    result of any object literal decode (a ``dict``).  The return value of
+    ``object_hook`` will be used instead of the ``dict``.  This feature
+    can be used to implement custom decoders (e.g. JSON-RPC class hinting).
+
+    To use a custom ``JSONDecoder`` subclass, specify it with the ``cls``
+    kwarg.
+    """
+    if cls is None:
+        cls = JSONDecoder
+    if object_hook is not None:
+        kw['object_hook'] = object_hook
+    return cls(encoding=encoding, **kw).decode(s)
+
+def read(s):
+    """
+    json-py API compatibility hook.  Use loads(s) instead.
+    """
+    import warnings
+    warnings.warn("simplejson.loads(s) should be used instead of read(s)",
+        DeprecationWarning)
+    return loads(s)
+
+def write(obj):
+    """
+    json-py API compatibility hook.  Use dumps(s) instead.
+    """
+    import warnings
+    warnings.warn("simplejson.dumps(s) should be used instead of write(s)",
+        DeprecationWarning)
+    return dumps(obj)
+
+

Added: vendor/django/current/django/utils/simplejson/decoder.py
===================================================================
--- vendor/django/current/django/utils/simplejson/decoder.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/simplejson/decoder.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,271 @@
+"""
+Implementation of JSONDecoder
+"""
+import re
+
+from django.utils.simplejson.scanner import Scanner, pattern
+
+FLAGS = re.VERBOSE | re.MULTILINE | re.DOTALL
+
+def _floatconstants():
+    import struct
+    import sys
+    _BYTES = '7FF80000000000007FF0000000000000'.decode('hex')
+    if sys.byteorder != 'big':
+        _BYTES = _BYTES[:8][::-1] + _BYTES[8:][::-1]
+    nan, inf = struct.unpack('dd', _BYTES)
+    return nan, inf, -inf
+
+NaN, PosInf, NegInf = _floatconstants()
+
+def linecol(doc, pos):
+    lineno = doc.count('\n', 0, pos) + 1
+    if lineno == 1:
+        colno = pos
+    else:
+        colno = pos - doc.rindex('\n', 0, pos)
+    return lineno, colno
+
+def errmsg(msg, doc, pos, end=None):
+    lineno, colno = linecol(doc, pos)
+    if end is None:
+        return '%s: line %d column %d (char %d)' % (msg, lineno, colno, pos)
+    endlineno, endcolno = linecol(doc, end)
+    return '%s: line %d column %d - line %d column %d (char %d - %d)' % (
+        msg, lineno, colno, endlineno, endcolno, pos, end)
+
+_CONSTANTS = {
+    '-Infinity': NegInf,
+    'Infinity': PosInf,
+    'NaN': NaN,
+    'true': True,
+    'false': False,
+    'null': None,
+}
+
+def JSONConstant(match, context, c=_CONSTANTS):
+    return c[match.group(0)], None
+pattern('(-?Infinity|NaN|true|false|null)')(JSONConstant)
+
+def JSONNumber(match, context):
+    match = JSONNumber.regex.match(match.string, *match.span())
+    integer, frac, exp = match.groups()
+    if frac or exp:
+        res = float(integer + (frac or '') + (exp or ''))
+    else:
+        res = int(integer)
+    return res, None
+pattern(r'(-?(?:0|[1-9]\d*))(\.\d+)?([eE][-+]?\d+)?')(JSONNumber)
+
+STRINGCHUNK = re.compile(r'(.*?)(["\\])', FLAGS)
+BACKSLASH = {
+    '"': u'"', '\\': u'\\', '/': u'/',
+    'b': u'\b', 'f': u'\f', 'n': u'\n', 'r': u'\r', 't': u'\t',
+}
+
+DEFAULT_ENCODING = "utf-8"
+
+def scanstring(s, end, encoding=None, _b=BACKSLASH, _m=STRINGCHUNK.match):
+    if encoding is None:
+        encoding = DEFAULT_ENCODING
+    chunks = []
+    _append = chunks.append
+    begin = end - 1
+    while 1:
+        chunk = _m(s, end)
+        if chunk is None:
+            raise ValueError(
+                errmsg("Unterminated string starting at", s, begin))
+        end = chunk.end()
+        content, terminator = chunk.groups()
+        if content:
+            if not isinstance(content, unicode):
+                content = unicode(content, encoding)
+            _append(content)
+        if terminator == '"':
+            break
+        try:
+            esc = s[end]
+        except IndexError:
+            raise ValueError(
+                errmsg("Unterminated string starting at", s, begin))
+        if esc != 'u':
+            try:
+                m = _b[esc]
+            except KeyError:
+                raise ValueError(
+                    errmsg("Invalid \\escape: %r" % (esc,), s, end))
+            end += 1
+        else:
+            esc = s[end + 1:end + 5]
+            try:
+                m = unichr(int(esc, 16))
+                if len(esc) != 4 or not esc.isalnum():
+                    raise ValueError
+            except ValueError:
+                raise ValueError(errmsg("Invalid \\uXXXX escape", s, end))
+            end += 5
+        _append(m)
+    return u''.join(chunks), end
+
+def JSONString(match, context):
+    encoding = getattr(context, 'encoding', None)
+    return scanstring(match.string, match.end(), encoding)
+pattern(r'"')(JSONString)
+
+WHITESPACE = re.compile(r'\s*', FLAGS)
+
+def JSONObject(match, context, _w=WHITESPACE.match):
+    pairs = {}
+    s = match.string
+    end = _w(s, match.end()).end()
+    nextchar = s[end:end + 1]
+    # trivial empty object
+    if nextchar == '}':
+        return pairs, end + 1
+    if nextchar != '"':
+        raise ValueError(errmsg("Expecting property name", s, end))
+    end += 1
+    encoding = getattr(context, 'encoding', None)
+    while True:
+        key, end = scanstring(s, end, encoding)
+        end = _w(s, end).end()
+        if s[end:end + 1] != ':':
+            raise ValueError(errmsg("Expecting : delimiter", s, end))
+        end = _w(s, end + 1).end()
+        try:
+            value, end = JSONScanner.iterscan(s, idx=end).next()
+        except StopIteration:
+            raise ValueError(errmsg("Expecting object", s, end))
+        pairs[key] = value
+        end = _w(s, end).end()
+        nextchar = s[end:end + 1]
+        end += 1
+        if nextchar == '}':
+            break
+        if nextchar != ',':
+            raise ValueError(errmsg("Expecting , delimiter", s, end - 1))
+        end = _w(s, end).end()
+        nextchar = s[end:end + 1]
+        end += 1
+        if nextchar != '"':
+            raise ValueError(errmsg("Expecting property name", s, end - 1))
+    object_hook = getattr(context, 'object_hook', None)
+    if object_hook is not None:
+        pairs = object_hook(pairs)
+    return pairs, end
+pattern(r'{')(JSONObject)
+            
+def JSONArray(match, context, _w=WHITESPACE.match):
+    values = []
+    s = match.string
+    end = _w(s, match.end()).end()
+    # look-ahead for trivial empty array
+    nextchar = s[end:end + 1]
+    if nextchar == ']':
+        return values, end + 1
+    while True:
+        try:
+            value, end = JSONScanner.iterscan(s, idx=end).next()
+        except StopIteration:
+            raise ValueError(errmsg("Expecting object", s, end))
+        values.append(value)
+        end = _w(s, end).end()
+        nextchar = s[end:end + 1]
+        end += 1
+        if nextchar == ']':
+            break
+        if nextchar != ',':
+            raise ValueError(errmsg("Expecting , delimiter", s, end))
+        end = _w(s, end).end()
+    return values, end
+pattern(r'\[')(JSONArray)
+ 
+ANYTHING = [
+    JSONObject,
+    JSONArray,
+    JSONString,
+    JSONConstant,
+    JSONNumber,
+]
+
+JSONScanner = Scanner(ANYTHING)
+
+class JSONDecoder(object):
+    """
+    Simple JSON <http://json.org> decoder
+
+    Performs the following translations in decoding:
+    
+    +---------------+-------------------+
+    | JSON          | Python            |
+    +===============+===================+
+    | object        | dict              |
+    +---------------+-------------------+
+    | array         | list              |
+    +---------------+-------------------+
+    | string        | unicode           |
+    +---------------+-------------------+
+    | number (int)  | int, long         |
+    +---------------+-------------------+
+    | number (real) | float             |
+    +---------------+-------------------+
+    | true          | True              |
+    +---------------+-------------------+
+    | false         | False             |
+    +---------------+-------------------+
+    | null          | None              |
+    +---------------+-------------------+
+
+    It also understands ``NaN``, ``Infinity``, and ``-Infinity`` as
+    their corresponding ``float`` values, which is outside the JSON spec.
+    """
+
+    _scanner = Scanner(ANYTHING)
+    __all__ = ['__init__', 'decode', 'raw_decode']
+
+    def __init__(self, encoding=None, object_hook=None):
+        """
+        ``encoding`` determines the encoding used to interpret any ``str``
+        objects decoded by this instance (utf-8 by default).  It has no
+        effect when decoding ``unicode`` objects.
+        
+        Note that currently only encodings that are a superset of ASCII work,
+        strings of other encodings should be passed in as ``unicode``.
+
+        ``object_hook``, if specified, will be called with the result
+        of every JSON object decoded and its return value will be used in
+        place of the given ``dict``.  This can be used to provide custom
+        deserializations (e.g. to support JSON-RPC class hinting).
+        """
+        self.encoding = encoding
+        self.object_hook = object_hook
+
+    def decode(self, s, _w=WHITESPACE.match):
+        """
+        Return the Python representation of ``s`` (a ``str`` or ``unicode``
+        instance containing a JSON document)
+        """
+        obj, end = self.raw_decode(s, idx=_w(s, 0).end())
+        end = _w(s, end).end()
+        if end != len(s):
+            raise ValueError(errmsg("Extra data", s, end, len(s)))
+        return obj
+
+    def raw_decode(self, s, **kw):
+        """
+        Decode a JSON document from ``s`` (a ``str`` or ``unicode`` beginning
+        with a JSON document) and return a 2-tuple of the Python
+        representation and the index in ``s`` where the document ended.
+
+        This can be used to decode a JSON document from a string that may
+        have extraneous data at the end.
+        """
+        kw.setdefault('context', self)
+        try:
+            obj, end = self._scanner.iterscan(s, **kw).next()
+        except StopIteration:
+            raise ValueError("No JSON object could be decoded")
+        return obj, end
+
+__all__ = ['JSONDecoder']

Added: vendor/django/current/django/utils/simplejson/encoder.py
===================================================================
--- vendor/django/current/django/utils/simplejson/encoder.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/simplejson/encoder.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,289 @@
+"""
+Implementation of JSONEncoder
+"""
+import re
+
+# this should match any kind of infinity
+INFCHARS = re.compile(r'[infINF]')
+ESCAPE = re.compile(r'[\x00-\x19\\"\b\f\n\r\t]')
+ESCAPE_ASCII = re.compile(r'([\\"]|[^\ -~])')
+ESCAPE_DCT = {
+    '\\': '\\\\',
+    '"': '\\"',
+    '\b': '\\b',
+    '\f': '\\f',
+    '\n': '\\n',
+    '\r': '\\r',
+    '\t': '\\t',
+}
+for i in range(20):
+    ESCAPE_DCT.setdefault(chr(i), '\\u%04x' % (i,))
+
+def floatstr(o, allow_nan=True):
+    s = str(o)
+    # If the first non-sign is a digit then it's not a special value
+    if (o < 0.0 and s[1].isdigit()) or s[0].isdigit():
+        return s
+    elif not allow_nan:
+        raise ValueError("Out of range float values are not JSON compliant: %r"
+            % (o,))
+    # These are the string representations on the platforms I've tried
+    if s == 'nan':
+        return 'NaN'
+    if s == 'inf':
+        return 'Infinity'
+    if s == '-inf':
+        return '-Infinity'
+    # NaN should either be inequal to itself, or equal to everything
+    if o != o or o == 0.0:
+        return 'NaN'
+    # Last ditch effort, assume inf
+    if o < 0:
+        return '-Infinity'
+    return 'Infinity'
+
+def encode_basestring(s):
+    """
+    Return a JSON representation of a Python string
+    """
+    def replace(match):
+        return ESCAPE_DCT[match.group(0)]
+    return '"' + ESCAPE.sub(replace, s) + '"'
+
+def encode_basestring_ascii(s):
+    def replace(match):
+        s = match.group(0)
+        try:
+            return ESCAPE_DCT[s]
+        except KeyError:
+            return '\\u%04x' % (ord(s),)
+    return '"' + str(ESCAPE_ASCII.sub(replace, s)) + '"'
+        
+
+class JSONEncoder(object):
+    """
+    Extensible JSON <http://json.org> encoder for Python data structures.
+
+    Supports the following objects and types by default:
+    
+    +-------------------+---------------+
+    | Python            | JSON          |
+    +===================+===============+
+    | dict              | object        |
+    +-------------------+---------------+
+    | list, tuple       | array         |
+    +-------------------+---------------+
+    | str, unicode      | string        |
+    +-------------------+---------------+
+    | int, long, float  | number        |
+    +-------------------+---------------+
+    | True              | true          |
+    +-------------------+---------------+
+    | False             | false         |
+    +-------------------+---------------+
+    | None              | null          |
+    +-------------------+---------------+
+
+    To extend this to recognize other objects, subclass and implement a
+    ``.default()`` method with another method that returns a serializable
+    object for ``o`` if possible, otherwise it should call the superclass
+    implementation (to raise ``TypeError``).
+    """
+    __all__ = ['__init__', 'default', 'encode', 'iterencode']
+    def __init__(self, skipkeys=False, ensure_ascii=True,
+            check_circular=True, allow_nan=True, sort_keys=False):
+        """
+        Constructor for JSONEncoder, with sensible defaults.
+
+        If skipkeys is False, then it is a TypeError to attempt
+        encoding of keys that are not str, int, long, float or None.  If
+        skipkeys is True, such items are simply skipped.
+
+        If ensure_ascii is True, the output is guaranteed to be str
+        objects with all incoming unicode characters escaped.  If
+        ensure_ascii is false, the output will be unicode object.
+
+        If check_circular is True, then lists, dicts, and custom encoded
+        objects will be checked for circular references during encoding to
+        prevent an infinite recursion (which would cause an OverflowError).
+        Otherwise, no such check takes place.
+
+        If allow_nan is True, then NaN, Infinity, and -Infinity will be
+        encoded as such.  This behavior is not JSON specification compliant,
+        but is consistent with most JavaScript based encoders and decoders.
+        Otherwise, it will be a ValueError to encode such floats.
+
+        If sort_keys is True, then the output of dictionaries will be
+        sorted by key; this is useful for regression tests to ensure
+        that JSON serializations can be compared on a day-to-day basis.
+        """
+
+        self.skipkeys = skipkeys
+        self.ensure_ascii = ensure_ascii
+        self.check_circular = check_circular
+        self.allow_nan = allow_nan
+        self.sort_keys = sort_keys
+
+    def _iterencode_list(self, lst, markers=None):
+        if not lst:
+            yield '[]'
+            return
+        if markers is not None:
+            markerid = id(lst)
+            if markerid in markers:
+                raise ValueError("Circular reference detected")
+            markers[markerid] = lst
+        yield '['
+        first = True
+        for value in lst:
+            if first:
+                first = False
+            else:
+                yield ', '
+            for chunk in self._iterencode(value, markers):
+                yield chunk
+        yield ']'
+        if markers is not None:
+            del markers[markerid]
+
+    def _iterencode_dict(self, dct, markers=None):
+        if not dct:
+            yield '{}'
+            return
+        if markers is not None:
+            markerid = id(dct)
+            if markerid in markers:
+                raise ValueError("Circular reference detected")
+            markers[markerid] = dct
+        yield '{'
+        first = True
+        if self.ensure_ascii:
+            encoder = encode_basestring_ascii
+        else:
+            encoder = encode_basestring
+        allow_nan = self.allow_nan
+        if self.sort_keys:
+            keys = dct.keys()
+            keys.sort()
+            items = [(k,dct[k]) for k in keys]
+        else:
+            items = dct.iteritems()
+        for key, value in items:
+            if isinstance(key, basestring):
+                pass
+            # JavaScript is weakly typed for these, so it makes sense to
+            # also allow them.  Many encoders seem to do something like this.
+            elif isinstance(key, float):
+                key = floatstr(key, allow_nan)
+            elif isinstance(key, (int, long)):
+                key = str(key)
+            elif key is True:
+                key = 'true'
+            elif key is False:
+                key = 'false'
+            elif key is None:
+                key = 'null'
+            elif self.skipkeys:
+                continue
+            else:
+                raise TypeError("key %r is not a string" % (key,))
+            if first:
+                first = False
+            else:
+                yield ', '
+            yield encoder(key)
+            yield ': '
+            for chunk in self._iterencode(value, markers):
+                yield chunk
+        yield '}'
+        if markers is not None:
+            del markers[markerid]
+
+    def _iterencode(self, o, markers=None):
+        if isinstance(o, basestring):
+            if self.ensure_ascii:
+                encoder = encode_basestring_ascii
+            else:
+                encoder = encode_basestring
+            yield encoder(o)
+        elif o is None:
+            yield 'null'
+        elif o is True:
+            yield 'true'
+        elif o is False:
+            yield 'false'
+        elif isinstance(o, (int, long)):
+            yield str(o)
+        elif isinstance(o, float):
+            yield floatstr(o, self.allow_nan)
+        elif isinstance(o, (list, tuple)):
+            for chunk in self._iterencode_list(o, markers):
+                yield chunk
+        elif isinstance(o, dict):
+            for chunk in self._iterencode_dict(o, markers):
+                yield chunk
+        else:
+            if markers is not None:
+                markerid = id(o)
+                if markerid in markers:
+                    raise ValueError("Circular reference detected")
+                markers[markerid] = o
+            for chunk in self._iterencode_default(o, markers):
+                yield chunk
+            if markers is not None:
+                del markers[markerid]
+
+    def _iterencode_default(self, o, markers=None):
+        newobj = self.default(o)
+        return self._iterencode(newobj, markers)
+
+    def default(self, o):
+        """
+        Implement this method in a subclass such that it returns
+        a serializable object for ``o``, or calls the base implementation
+        (to raise a ``TypeError``).
+
+        For example, to support arbitrary iterators, you could
+        implement default like this::
+            
+            def default(self, o):
+                try:
+                    iterable = iter(o)
+                except TypeError:
+                    pass
+                else:
+                    return list(iterable)
+                return JSONEncoder.default(self, o)
+        """
+        raise TypeError("%r is not JSON serializable" % (o,))
+
+    def encode(self, o):
+        """
+        Return a JSON string representation of a Python data structure.
+
+        >>> JSONEncoder().encode({"foo": ["bar", "baz"]})
+        '{"foo":["bar", "baz"]}'
+        """
+        # This doesn't pass the iterator directly to ''.join() because it
+        # sucks at reporting exceptions.  It's going to do this internally
+        # anyway because it uses PySequence_Fast or similar.
+        chunks = list(self.iterencode(o))
+        return ''.join(chunks)
+
+    def iterencode(self, o):
+        """
+        Encode the given object and yield each string
+        representation as available.
+        
+        For example::
+            
+            for chunk in JSONEncoder().iterencode(bigobject):
+                mysocket.write(chunk)
+        """
+        if self.check_circular:
+            markers = {}
+        else:
+            markers = None
+        return self._iterencode(o, markers)
+
+__all__ = ['JSONEncoder']

Added: vendor/django/current/django/utils/simplejson/scanner.py
===================================================================
--- vendor/django/current/django/utils/simplejson/scanner.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/simplejson/scanner.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,63 @@
+"""
+Iterator based sre token scanner
+"""
+import sre_parse, sre_compile, sre_constants
+from sre_constants import BRANCH, SUBPATTERN
+from sre import VERBOSE, MULTILINE, DOTALL
+import re
+
+__all__ = ['Scanner', 'pattern']
+
+FLAGS = (VERBOSE | MULTILINE | DOTALL)
+class Scanner(object):
+    def __init__(self, lexicon, flags=FLAGS):
+        self.actions = [None]
+        # combine phrases into a compound pattern
+        s = sre_parse.Pattern()
+        s.flags = flags
+        p = []
+        for idx, token in enumerate(lexicon):
+            phrase = token.pattern
+            try:
+                subpattern = sre_parse.SubPattern(s,
+                    [(SUBPATTERN, (idx + 1, sre_parse.parse(phrase, flags)))])
+            except sre_constants.error:
+                raise
+            p.append(subpattern)
+            self.actions.append(token)
+
+        p = sre_parse.SubPattern(s, [(BRANCH, (None, p))])
+        self.scanner = sre_compile.compile(p)
+
+
+    def iterscan(self, string, idx=0, context=None):
+        """
+        Yield match, end_idx for each match
+        """
+        match = self.scanner.scanner(string, idx).match
+        actions = self.actions
+        lastend = idx
+        end = len(string)
+        while True:
+            m = match()
+            if m is None:
+                break
+            matchbegin, matchend = m.span()
+            if lastend == matchend:
+                break
+            action = actions[m.lastindex]
+            if action is not None:
+                rval, next_pos = action(m, context)
+                if next_pos is not None and next_pos != matchend:
+                    # "fast forward" the scanner
+                    matchend = next_pos
+                    match = self.scanner.scanner(string, matchend).match
+                yield rval, matchend
+            lastend = matchend
+            
+def pattern(pattern, flags=FLAGS):
+    def decorator(fn):
+        fn.pattern = pattern
+        fn.regex = re.compile(pattern, flags)
+        return fn
+    return decorator

Added: vendor/django/current/django/utils/stopwords.py
===================================================================
--- vendor/django/current/django/utils/stopwords.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/stopwords.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,42 @@
+# Performance note: I benchmarked this code using a set instead of
+# a list for the stopwords and was surprised to find that the list
+# performed /better/ than the set - maybe because it's only a small
+# list.
+
+stopwords = '''
+i
+a
+an
+are
+as
+at
+be
+by
+for
+from
+how
+in
+is
+it
+of
+on
+or
+that
+the
+this
+to
+was
+what
+when
+where
+'''.split()
+
+def strip_stopwords(sentence):
+    "Removes stopwords - also normalizes whitespace"
+    words = sentence.split()
+    sentence = []
+    for word in words:
+        if word.lower() not in stopwords:
+            sentence.append(word)
+    return ' '.join(sentence)
+

Added: vendor/django/current/django/utils/synch.py
===================================================================
--- vendor/django/current/django/utils/synch.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/synch.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,88 @@
+"""
+Synchronization primitives:
+    
+    - reader-writer lock (preference to writers)
+
+(Contributed to Django by eugene at lazutkin.com)
+"""
+
+try:
+    import threading
+except ImportError:
+    import dummy_threading as threading
+
+class RWLock:
+    """
+    Classic implementation of reader-writer lock with preference to writers.
+    
+    Readers can access a resource simultaneously.
+    Writers get an exclusive access.
+    
+    API is self-descriptive:
+        reader_enters()
+        reader_leaves()
+        writer_enters()
+        writer_leaves()
+    """
+    
+    def __init__(self):
+        self.mutex     = threading.RLock()
+        self.can_read  = threading.Semaphore(0)
+        self.can_write = threading.Semaphore(0)
+        self.active_readers  = 0
+        self.active_writers  = 0
+        self.waiting_readers = 0
+        self.waiting_writers = 0
+        
+    def reader_enters(self):
+        self.mutex.acquire()
+        try:
+            if self.active_writers == 0 and self.waiting_writers == 0:
+                self.active_readers += 1
+                self.can_read.release()
+            else:
+                self.waiting_readers += 1
+        finally:
+            self.mutex.release()
+        self.can_read.acquire()
+        
+    def reader_leaves(self):
+        self.mutex.acquire()
+        try:
+            self.active_readers -= 1
+            if self.active_readers == 0 and self.waiting_writers != 0:
+                self.active_writers  += 1
+                self.waiting_writers -= 1
+                self.can_write.release()
+        finally:
+            self.mutex.release()
+    
+    def writer_enters(self):
+        self.mutex.acquire()
+        try:
+            if self.active_writers == 0 and self.waiting_writers == 0 and self.active_readers == 0:
+                self.active_writers += 1
+                self.can_write.release()
+            else:
+                self.waiting_writers += 1
+        finally:
+            self.mutex.release()
+        self.can_write.acquire()
+        
+    def writer_leaves(self):
+        self.mutex.acquire()
+        try:
+            self.active_writers -= 1
+            if self.waiting_writers != 0:
+                self.active_writers  += 1
+                self.waiting_writers -= 1
+                self.can_write.release()
+            elif self.waiting_readers != 0:
+                t = self.waiting_readers
+                self.waiting_readers = 0
+                self.active_readers += t
+                while t > 0:
+                    self.can_read.release()
+                    t -= 1
+        finally:
+            self.mutex.release()

Added: vendor/django/current/django/utils/termcolors.py
===================================================================
--- vendor/django/current/django/utils/termcolors.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/termcolors.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,68 @@
+"""
+termcolors.py
+"""
+
+color_names = ('black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white')
+foreground = dict([(color_names[x], '3%s' % x) for x in range(8)])
+background = dict([(color_names[x], '4%s' % x) for x in range(8)])
+del color_names
+
+RESET = '0'
+opt_dict = {'bold': '1', 'underscore': '4', 'blink': '5', 'reverse': '7', 'conceal': '8'}
+
+def colorize(text='', opts=(), **kwargs):
+    """
+    Returns your text, enclosed in ANSI graphics codes.
+
+    Depends on the keyword arguments 'fg' and 'bg', and the contents of
+    the opts tuple/list.
+
+    Returns the RESET code if no parameters are given.
+
+    Valid colors:
+        'black', 'red', 'green', 'yellow', 'blue', 'magenta', 'cyan', 'white'
+
+    Valid options:
+        'bold'
+        'underscore'
+        'blink'
+        'reverse'
+        'conceal'
+        'noreset' - string will not be auto-terminated with the RESET code
+
+    Examples:
+        colorize('hello', fg='red', bg='blue', opts=('blink',))
+        colorize()
+        colorize('goodbye', opts=('underscore',))
+        print colorize('first line', fg='red', opts=('noreset',))
+        print 'this should be red too'
+        print colorize('and so should this')
+        print 'this should not be red'
+    """
+    text = str(text)
+    code_list = []
+    if text == '' and len(opts) == 1 and opts[0] == 'reset':
+        return '\x1b[%sm' % RESET
+    for k, v in kwargs.iteritems():
+        if k == 'fg':
+            code_list.append(foreground[v])
+        elif k == 'bg':
+            code_list.append(background[v])
+    for o in opts:
+        if o in opt_dict:
+            code_list.append(opt_dict[o])
+    if 'noreset' not in opts:
+        text = text + '\x1b[%sm' % RESET
+    return ('\x1b[%sm' % ';'.join(code_list)) + text
+
+def make_style(opts=(), **kwargs):
+    """
+    Returns a function with default parameters for colorize()
+
+    Example:
+        bold_red = make_style(opts=('bold',), fg='red')
+        print bold_red('hello')
+        KEYWORD = make_style(fg='yellow')
+        COMMENT = make_style(fg='blue', opts=('bold',))
+    """
+    return lambda text: colorize(text, opts, **kwargs)

Added: vendor/django/current/django/utils/text.py
===================================================================
--- vendor/django/current/django/utils/text.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/text.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,129 @@
+import re
+
+from django.conf import settings
+
+# Capitalizes the first letter of a string.
+capfirst = lambda x: x and x[0].upper() + x[1:]
+
+def wrap(text, width):
+    """
+    A word-wrap function that preserves existing line breaks and most spaces in
+    the text. Expects that existing line breaks are posix newlines (\n).
+    See http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/148061
+    """
+    return reduce(lambda line, word, width=width: '%s%s%s' %
+                  (line,
+                   ' \n'[(len(line[line.rfind('\n')+1:])
+                         + len(word.split('\n',1)[0]
+                              ) >= width)],
+                   word),
+                  text.split(' ')
+                 )
+
+def truncate_words(s, num):
+    "Truncates a string after a certain number of words."
+    length = int(num)
+    words = s.split()
+    if len(words) > length:
+        words = words[:length]
+        if not words[-1].endswith('...'):
+            words.append('...')
+    return ' '.join(words)
+
+def get_valid_filename(s):
+    """
+    Returns the given string converted to a string that can be used for a clean
+    filename. Specifically, leading and trailing spaces are removed; other
+    spaces are converted to underscores; and all non-filename-safe characters
+    are removed.
+    >>> get_valid_filename("john's portrait in 2004.jpg")
+    'johns_portrait_in_2004.jpg'
+    """
+    s = s.strip().replace(' ', '_')
+    return re.sub(r'[^-A-Za-z0-9_.]', '', s)
+
+def get_text_list(list_, last_word='or'):
+    """
+    >>> get_text_list(['a', 'b', 'c', 'd'])
+    'a, b, c or d'
+    >>> get_text_list(['a', 'b', 'c'], 'and')
+    'a, b and c'
+    >>> get_text_list(['a', 'b'], 'and')
+    'a and b'
+    >>> get_text_list(['a'])
+    'a'
+    >>> get_text_list([])
+    ''
+    """
+    if len(list_) == 0: return ''
+    if len(list_) == 1: return list_[0]
+    return '%s %s %s' % (', '.join([str(i) for i in list_][:-1]), last_word, list_[-1])
+
+def normalize_newlines(text):
+    return re.sub(r'\r\n|\r|\n', '\n', text)
+
+def recapitalize(text):
+    "Recapitalizes text, placing caps after end-of-sentence punctuation."
+#     capwords = ()
+    text = text.lower()
+    capsRE = re.compile(r'(?:^|(?<=[\.\?\!] ))([a-z])')
+    text = capsRE.sub(lambda x: x.group(1).upper(), text)
+#     for capword in capwords:
+#         capwordRE = re.compile(r'\b%s\b' % capword, re.I)
+#         text = capwordRE.sub(capword, text)
+    return text
+
+def phone2numeric(phone):
+    "Converts a phone number with letters into its numeric equivalent."
+    letters = re.compile(r'[A-PR-Y]', re.I)
+    char2number = lambda m: {'a': '2', 'c': '2', 'b': '2', 'e': '3',
+         'd': '3', 'g': '4', 'f': '3', 'i': '4', 'h': '4', 'k': '5',
+         'j': '5', 'm': '6', 'l': '5', 'o': '6', 'n': '6', 'p': '7',
+         's': '7', 'r': '7', 'u': '8', 't': '8', 'w': '9', 'v': '8',
+         'y': '9', 'x': '9'}.get(m.group(0).lower())
+    return letters.sub(char2number, phone)
+
+# From http://www.xhaus.com/alan/python/httpcomp.html#gzip
+# Used with permission.
+def compress_string(s):
+    import cStringIO, gzip
+    zbuf = cStringIO.StringIO()
+    zfile = gzip.GzipFile(mode='wb', compresslevel=6, fileobj=zbuf)
+    zfile.write(s)
+    zfile.close()
+    return zbuf.getvalue()
+
+ustring_re = re.compile(u"([\u0080-\uffff])")
+def javascript_quote(s):
+
+    def fix(match):
+        return r"\u%04x" % ord(match.group(1))
+
+    if type(s) == str:
+        s = s.decode(settings.DEFAULT_CHARSET)
+    elif type(s) != unicode:
+        raise TypeError, s
+    s = s.replace('\\', '\\\\')
+    s = s.replace('\n', '\\n')
+    s = s.replace('\t', '\\t')
+    s = s.replace("'", "\\'")
+    return str(ustring_re.sub(fix, s))
+
+smart_split_re = re.compile('("(?:[^"\\\\]*(?:\\\\.[^"\\\\]*)*)"|\'(?:[^\'\\\\]*(?:\\\\.[^\'\\\\]*)*)\'|[^\\s]+)')
+def smart_split(text):
+    """
+    Generator that splits a string by spaces, leaving quoted phrases together.
+    Supports both single and double quotes, and supports escaping quotes with
+    backslashes. In the output, strings will keep their initial and trailing
+    quote marks.
+    >>> list(smart_split('This is "a person\'s" test.'))
+    ['This', 'is', '"a person\'s"', 'test.']
+    """
+    for bit in smart_split_re.finditer(text):
+        bit = bit.group(0)
+        if bit[0] == '"':
+            yield '"' + bit[1:-1].replace('\\"', '"').replace('\\\\', '\\') + '"'
+        elif bit[0] == "'":
+            yield "'" + bit[1:-1].replace("\\'", "'").replace("\\\\", "\\") + "'"
+        else:
+            yield bit

Added: vendor/django/current/django/utils/timesince.py
===================================================================
--- vendor/django/current/django/utils/timesince.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/timesince.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,57 @@
+import datetime, math, time
+from django.utils.tzinfo import LocalTimezone
+from django.utils.translation import ngettext
+
+def timesince(d, now=None):
+    """
+    Takes two datetime objects and returns the time between then and now
+    as a nicely formatted string, e.g "10 minutes"
+    Adapted from http://blog.natbat.co.uk/archive/2003/Jun/14/time_since
+    """
+    chunks = (
+      (60 * 60 * 24 * 365, lambda n: ngettext('year', 'years', n)),
+      (60 * 60 * 24 * 30, lambda n: ngettext('month', 'months', n)),
+      (60 * 60 * 24 * 7, lambda n : ngettext('week', 'weeks', n)),
+      (60 * 60 * 24, lambda n : ngettext('day', 'days', n)),
+      (60 * 60, lambda n: ngettext('hour', 'hours', n)),
+      (60, lambda n: ngettext('minute', 'minutes', n))
+    )
+    # Convert datetime.date to datetime.datetime for comparison
+    if d.__class__ is not datetime.datetime:
+        d = datetime.datetime(d.year, d.month, d.day)
+    if now:
+        t = now.timetuple()
+    else:
+        t = time.localtime()
+    if d.tzinfo:
+        tz = LocalTimezone(d)
+    else:
+        tz = None
+    now = datetime.datetime(t[0], t[1], t[2], t[3], t[4], t[5], tzinfo=tz)
+
+    # ignore microsecond part of 'd' since we removed it from 'now'
+    delta = now - (d - datetime.timedelta(0, 0, d.microsecond))
+    since = delta.days * 24 * 60 * 60 + delta.seconds
+    for i, (seconds, name) in enumerate(chunks):
+        count = since / seconds
+        if count != 0:
+            break
+    if count < 0:
+        return '%d milliseconds' % math.floor((now - d).microseconds / 1000)
+    s = '%d %s' % (count, name(count))
+    if i + 1 < len(chunks):
+        # Now get the second item
+        seconds2, name2 = chunks[i + 1]
+        count2 = (since - (seconds * count)) / seconds2
+        if count2 != 0:
+            s += ', %d %s' % (count2, name2(count2))
+    return s
+
+def timeuntil(d, now=None):
+    """
+    Like timesince, but returns a string measuring the time until
+    the given time.
+    """
+    if now == None:
+        now = datetime.datetime.now()
+    return timesince(now, d)

Added: vendor/django/current/django/utils/translation/__init__.py
===================================================================
--- vendor/django/current/django/utils/translation/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/translation/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,8 @@
+from django.conf import settings
+
+if settings.USE_I18N:
+    from trans_real import *
+else:
+    from trans_null import *
+
+del settings

Added: vendor/django/current/django/utils/translation/trans_null.py
===================================================================
--- vendor/django/current/django/utils/translation/trans_null.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/translation/trans_null.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,30 @@
+# These are versions of the functions in django.utils.translation.trans_real
+# that don't actually do anything. This is purely for performance, so that
+# settings.USE_I18N = False can use this module rather than trans_real.py.
+
+from django.conf import settings
+
+def ngettext(singular, plural, number):
+    if number == 1: return singular
+    return plural
+ngettext_lazy = ngettext
+
+gettext = gettext_noop = gettext_lazy = _ = lambda x: x
+string_concat = lambda *strings: ''.join([str(el) for el in strings])
+activate = lambda x: None
+deactivate = install = lambda: None
+get_language = lambda: settings.LANGUAGE_CODE
+get_language_bidi = lambda: settings.LANGUAGE_CODE in settings.LANGUAGES_BIDI
+get_date_formats = lambda: (settings.DATE_FORMAT, settings.DATETIME_FORMAT, settings.TIME_FORMAT)
+get_partial_date_formats = lambda: (settings.YEAR_MONTH_FORMAT, settings.MONTH_DAY_FORMAT)
+check_for_language = lambda x: True
+
+def to_locale(language):
+    p = language.find('-')
+    if p >= 0:
+        return language[:p].lower()+'_'+language[p+1:].upper()
+    else:
+        return language.lower()
+
+def get_language_from_request(request):
+    return settings.LANGUAGE_CODE

Added: vendor/django/current/django/utils/translation/trans_real.py
===================================================================
--- vendor/django/current/django/utils/translation/trans_real.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/translation/trans_real.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,496 @@
+"Translation helper functions"
+
+import os, re, sys
+import gettext as gettext_module
+from cStringIO import StringIO
+from django.utils.functional import lazy
+
+try:
+    import threading
+    hasThreads = True
+except ImportError:
+    hasThreads = False
+
+if hasThreads:
+    currentThread = threading.currentThread
+else:
+    def currentThread():
+        return 'no threading'
+
+# Translations are cached in a dictionary for every language+app tuple.
+# The active translations are stored by threadid to make them thread local.
+_translations = {}
+_active = {}
+
+# The default translation is based on the settings file.
+_default = None
+
+# This is a cache for accept-header to translation object mappings to prevent
+# the accept parser to run multiple times for one user.
+_accepted = {}
+
+def to_locale(language):
+    "Turns a language name (en-us) into a locale name (en_US)."
+    p = language.find('-')
+    if p >= 0:
+        return language[:p].lower()+'_'+language[p+1:].upper()
+    else:
+        return language.lower()
+
+def to_language(locale):
+    "Turns a locale name (en_US) into a language name (en-us)."
+    p = locale.find('_')
+    if p >= 0:
+        return locale[:p].lower()+'-'+locale[p+1:].lower()
+    else:
+        return locale.lower()
+
+class DjangoTranslation(gettext_module.GNUTranslations):
+    """
+    This class sets up the GNUTranslations context with regard to output
+    charset. Django uses a defined DEFAULT_CHARSET as the output charset on
+    Python 2.4. With Python 2.3, use DjangoTranslation23.
+    """
+    def __init__(self, *args, **kw):
+        from django.conf import settings
+        gettext_module.GNUTranslations.__init__(self, *args, **kw)
+        # Starting with Python 2.4, there's a function to define
+        # the output charset. Before 2.4, the output charset is
+        # identical with the translation file charset.
+        try:
+            self.set_output_charset(settings.DEFAULT_CHARSET)
+        except AttributeError:
+            pass
+        self.django_output_charset = settings.DEFAULT_CHARSET
+        self.__language = '??'
+
+    def merge(self, other):
+        self._catalog.update(other._catalog)
+
+    def set_language(self, language):
+        self.__language = language
+
+    def language(self):
+        return self.__language
+
+    def __repr__(self):
+        return "<DjangoTranslation lang:%s>" % self.__language
+
+class DjangoTranslation23(DjangoTranslation):
+    """
+    Compatibility class that is only used with Python 2.3.
+    Python 2.3 doesn't support set_output_charset on translation objects and
+    needs this wrapper class to make sure input charsets from translation files
+    are correctly translated to output charsets.
+
+    With a full switch to Python 2.4, this can be removed from the source.
+    """
+    def gettext(self, msgid):
+        res = self.ugettext(msgid)
+        return res.encode(self.django_output_charset)
+
+    def ngettext(self, msgid1, msgid2, n):
+        res = self.ungettext(msgid1, msgid2, n)
+        return res.encode(self.django_output_charset)
+
+def translation(language):
+    """
+    Returns a translation object.
+
+    This translation object will be constructed out of multiple GNUTranslations
+    objects by merging their catalogs. It will construct a object for the
+    requested language and add a fallback to the default language, if it's
+    different from the requested language.
+    """
+    global _translations
+
+    t = _translations.get(language, None)
+    if t is not None:
+        return t
+
+    from django.conf import settings
+
+    # set up the right translation class
+    klass = DjangoTranslation
+    if sys.version_info < (2, 4):
+        klass = DjangoTranslation23
+
+    globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale')
+
+    if settings.SETTINGS_MODULE is not None:
+        parts = settings.SETTINGS_MODULE.split('.')
+        project = __import__(parts[0], {}, {}, [])
+        projectpath = os.path.join(os.path.dirname(project.__file__), 'locale')
+    else:
+        projectpath = None
+
+    def _fetch(lang, fallback=None):
+
+        global _translations
+
+        loc = to_locale(lang)
+
+        res = _translations.get(lang, None)
+        if res is not None:
+            return res
+
+        def _translation(path):
+            try:
+                t = gettext_module.translation('django', path, [loc], klass)
+                t.set_language(lang)
+                return t
+            except IOError, e:
+                return None
+
+        res = _translation(globalpath)
+
+        def _merge(path):
+            t = _translation(path)
+            if t is not None:
+                if res is None:
+                    return t
+                else:
+                    res.merge(t)
+            return res
+
+        if hasattr(settings, 'LOCALE_PATHS'):
+            for localepath in settings.LOCALE_PATHS:
+                if os.path.isdir(localepath):
+                    res = _merge(localepath)
+
+        if projectpath and os.path.isdir(projectpath):
+            res = _merge(projectpath)
+
+        for appname in settings.INSTALLED_APPS:
+            p = appname.rfind('.')
+            if p >= 0:
+                app = getattr(__import__(appname[:p], {}, {}, [appname[p+1:]]), appname[p+1:])
+            else:
+                app = __import__(appname, {}, {}, [])
+
+            apppath = os.path.join(os.path.dirname(app.__file__), 'locale')
+
+            if os.path.isdir(apppath):
+                res = _merge(apppath)
+
+        if res is None:
+            if fallback is not None:
+                res = fallback
+            else:
+                return gettext_module.NullTranslations()
+        _translations[lang] = res
+        return res
+
+    default_translation = _fetch(settings.LANGUAGE_CODE)
+    current_translation = _fetch(language, fallback=default_translation)
+
+    return current_translation
+
+def activate(language):
+    """
+    Fetches the translation object for a given tuple of application name and
+    language and installs it as the current translation object for the current
+    thread.
+    """
+    _active[currentThread()] = translation(language)
+
+def deactivate():
+    """
+    Deinstalls the currently active translation object so that further _ calls
+    will resolve against the default translation object, again.
+    """
+    global _active
+    if _active.has_key(currentThread()):
+        del _active[currentThread()]
+
+def get_language():
+    "Returns the currently selected language."
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        try:
+            return to_language(t.language())
+        except AttributeError:
+            pass
+    # If we don't have a real translation object, assume it's the default language.
+    from django.conf import settings
+    return settings.LANGUAGE_CODE
+
+def get_language_bidi():
+    """
+    Returns selected language's BiDi layout.
+    False = left-to-right layout
+    True = right-to-left layout
+    """
+    from django.conf import settings
+    return get_language() in settings.LANGUAGES_BIDI
+
+def catalog():
+    """
+    This function returns the current active catalog for further processing.
+    This can be used if you need to modify the catalog or want to access the
+    whole message catalog instead of just translating one string.
+    """
+    global _default, _active
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        return t
+    if _default is None:
+        from django.conf import settings
+        _default = translation(settings.LANGUAGE_CODE)
+    return _default
+
+def gettext(message):
+    """
+    This function will be patched into the builtins module to provide the _
+    helper function. It will use the current thread as a discriminator to find
+    the translation object to use. If no current translation is activated, the
+    message will be run through the default translation object.
+    """
+    global _default, _active
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        return t.gettext(message)
+    if _default is None:
+        from django.conf import settings
+        _default = translation(settings.LANGUAGE_CODE)
+    return _default.gettext(message)
+
+def gettext_noop(message):
+    """
+    Marks strings for translation but doesn't translate them now. This can be
+    used to store strings in global variables that should stay in the base
+    language (because they might be used externally) and will be translated later.
+    """
+    return message
+
+def ngettext(singular, plural, number):
+    """
+    Returns the translation of either the singular or plural, based on the number.
+    """
+    global _default, _active
+
+    t = _active.get(currentThread(), None)
+    if t is not None:
+        return t.ngettext(singular, plural, number)
+    if _default is None:
+        from django.conf import settings
+        _default = translation(settings.LANGUAGE_CODE)
+    return _default.ngettext(singular, plural, number)
+
+gettext_lazy = lazy(gettext, str)
+ngettext_lazy = lazy(ngettext, str)
+
+def check_for_language(lang_code):
+    """
+    Checks whether there is a global language file for the given language code.
+    This is used to decide whether a user-provided language is available. This is
+    only used for language codes from either the cookies or session.
+    """
+    from django.conf import settings
+    globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale')
+    if gettext_module.find('django', globalpath, [to_locale(lang_code)]) is not None:
+        return True
+    else:
+        return False
+
+def get_language_from_request(request):
+    """
+    Analyzes the request to find what language the user wants the system to show.
+    Only languages listed in settings.LANGUAGES are taken into account. If the user
+    requests a sublanguage where we have a main language, we send out the main language.
+    """
+    global _accepted
+    from django.conf import settings
+    globalpath = os.path.join(os.path.dirname(sys.modules[settings.__module__].__file__), 'locale')
+    supported = dict(settings.LANGUAGES)
+
+    if hasattr(request, 'session'):
+        lang_code = request.session.get('django_language', None)
+        if lang_code in supported and lang_code is not None and check_for_language(lang_code):
+            return lang_code
+
+    lang_code = request.COOKIES.get('django_language', None)
+    if lang_code in supported and lang_code is not None and check_for_language(lang_code):
+        return lang_code
+
+    accept = request.META.get('HTTP_ACCEPT_LANGUAGE', None)
+    if accept is not None:
+
+        t = _accepted.get(accept, None)
+        if t is not None:
+            return t
+
+        def _parsed(el):
+            p = el.find(';q=')
+            if p >= 0:
+                lang = el[:p].strip()
+                order = int(float(el[p+3:].strip())*100)
+            else:
+                lang = el
+                order = 100
+            p = lang.find('-')
+            if p >= 0:
+                mainlang = lang[:p]
+            else:
+                mainlang = lang
+            return (lang, mainlang, order)
+
+        langs = [_parsed(el) for el in accept.split(',')]
+        langs.sort(lambda a,b: -1*cmp(a[2], b[2]))
+
+        for lang, mainlang, order in langs:
+            if lang in supported or mainlang in supported:
+                langfile = gettext_module.find('django', globalpath, [to_locale(lang)])
+                if langfile:
+                    # reconstruct the actual language from the language
+                    # filename, because otherwise we might incorrectly
+                    # report de_DE if we only have de available, but
+                    # did find de_DE because of language normalization
+                    lang = langfile[len(globalpath):].split(os.path.sep)[1]
+                    _accepted[accept] = lang
+                    return lang
+
+    return settings.LANGUAGE_CODE
+
+def get_date_formats():
+    """
+    This function checks whether translation files provide a translation for some
+    technical message ID to store date and time formats. If it doesn't contain
+    one, the formats provided in the settings will be used.
+    """
+    from django.conf import settings
+    date_format = _('DATE_FORMAT')
+    datetime_format = _('DATETIME_FORMAT')
+    time_format = _('TIME_FORMAT')
+    if date_format == 'DATE_FORMAT':
+        date_format = settings.DATE_FORMAT
+    if datetime_format == 'DATETIME_FORMAT':
+        datetime_format = settings.DATETIME_FORMAT
+    if time_format == 'TIME_FORMAT':
+        time_format = settings.TIME_FORMAT
+    return date_format, datetime_format, time_format
+
+def get_partial_date_formats():
+    """
+    This function checks whether translation files provide a translation for some
+    technical message ID to store partial date formats. If it doesn't contain
+    one, the formats provided in the settings will be used.
+    """
+    from django.conf import settings
+    year_month_format = _('YEAR_MONTH_FORMAT')
+    month_day_format = _('MONTH_DAY_FORMAT')
+    if year_month_format == 'YEAR_MONTH_FORMAT':
+        year_month_format = settings.YEAR_MONTH_FORMAT
+    if month_day_format == 'MONTH_DAY_FORMAT':
+        month_day_format = settings.MONTH_DAY_FORMAT
+    return year_month_format, month_day_format
+
+def install():
+    """
+    Installs the gettext function as the default translation function under
+    the name '_'.
+    """
+    __builtins__['_'] = gettext
+
+dot_re = re.compile(r'\S')
+def blankout(src, char):
+    """
+    Changes every non-whitespace character to the given char.
+    Used in the templatize function.
+    """
+    return dot_re.sub(char, src)
+
+inline_re = re.compile(r"""^\s*trans\s+((?:".*?")|(?:'.*?'))\s*""")
+block_re = re.compile(r"""^\s*blocktrans(?:\s+|$)""")
+endblock_re = re.compile(r"""^\s*endblocktrans$""")
+plural_re = re.compile(r"""^\s*plural$""")
+constant_re = re.compile(r"""_\(((?:".*?")|(?:'.*?'))\)""")
+def templatize(src):
+    """
+    Turns a Django template into something that is understood by xgettext. It
+    does so by translating the Django translation tags into standard gettext
+    function invocations.
+    """
+    from django.template import Lexer, TOKEN_TEXT, TOKEN_VAR, TOKEN_BLOCK
+    out = StringIO()
+    intrans = False
+    inplural = False
+    singular = []
+    plural = []
+    for t in Lexer(src, None).tokenize():
+        if intrans:
+            if t.token_type == TOKEN_BLOCK:
+                endbmatch = endblock_re.match(t.contents)
+                pluralmatch = plural_re.match(t.contents)
+                if endbmatch:
+                    if inplural:
+                        out.write(' ngettext(%r,%r,count) ' % (''.join(singular), ''.join(plural)))
+                        for part in singular:
+                            out.write(blankout(part, 'S'))
+                        for part in plural:
+                            out.write(blankout(part, 'P'))
+                    else:
+                        out.write(' gettext(%r) ' % ''.join(singular))
+                        for part in singular:
+                            out.write(blankout(part, 'S'))
+                    intrans = False
+                    inplural = False
+                    singular = []
+                    plural = []
+                elif pluralmatch:
+                    inplural = True
+                else:
+                    raise SyntaxError, "Translation blocks must not include other block tags: %s" % t.contents
+            elif t.token_type == TOKEN_VAR:
+                if inplural:
+                    plural.append('%%(%s)s' % t.contents)
+                else:
+                    singular.append('%%(%s)s' % t.contents)
+            elif t.token_type == TOKEN_TEXT:
+                if inplural:
+                    plural.append(t.contents)
+                else:
+                    singular.append(t.contents)
+        else:
+            if t.token_type == TOKEN_BLOCK:
+                imatch = inline_re.match(t.contents)
+                bmatch = block_re.match(t.contents)
+                cmatches = constant_re.findall(t.contents)
+                if imatch:
+                    g = imatch.group(1)
+                    if g[0] == '"': g = g.strip('"')
+                    elif g[0] == "'": g = g.strip("'")
+                    out.write(' gettext(%r) ' % g)
+                elif bmatch:
+                    intrans = True
+                    inplural = False
+                    singular = []
+                    plural = []
+                elif cmatches:
+                    for cmatch in cmatches:
+                        out.write(' _(%s) ' % cmatch)
+                else:
+                    out.write(blankout(t.contents, 'B'))
+            elif t.token_type == TOKEN_VAR:
+                parts = t.contents.split('|')
+                cmatch = constant_re.match(parts[0])
+                if cmatch:
+                    out.write(' _(%s) ' % cmatch.group(1))
+                for p in parts[1:]:
+                    if p.find(':_(') >= 0:
+                        out.write(' %s ' % p.split(':',1)[1])
+                    else:
+                        out.write(blankout(p, 'F'))
+            else:
+                out.write(blankout(t.contents, 'X'))
+    return out.getvalue()
+
+def string_concat(*strings):
+    """"
+    lazy variant of string concatenation, needed for translations that are
+    constructed from multiple parts. Handles lazy strings and non-strings by
+    first turning all arguments to strings, before joining them.
+    """
+    return ''.join([str(el) for el in strings])
+
+string_concat = lazy(string_concat, str)

Added: vendor/django/current/django/utils/tzinfo.py
===================================================================
--- vendor/django/current/django/utils/tzinfo.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/tzinfo.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,52 @@
+"Implementation of tzinfo classes for use with datetime.datetime."
+
+import time
+from datetime import timedelta, tzinfo
+
+class FixedOffset(tzinfo):
+    "Fixed offset in minutes east from UTC."
+    def __init__(self, offset):
+        self.__offset = timedelta(minutes=offset)
+        self.__name = "%+03d%02d" % (offset // 60, offset % 60)
+
+    def __repr__(self):
+        return self.__name
+
+    def utcoffset(self, dt):
+        return self.__offset
+
+    def tzname(self, dt):
+        return self.__name
+
+    def dst(self, dt):
+        return timedelta(0)
+
+class LocalTimezone(tzinfo):
+    "Proxy timezone information from time module."
+    def __init__(self, dt):
+        tzinfo.__init__(self, dt)
+        self._tzname = time.tzname[self._isdst(dt)]
+
+    def __repr__(self):
+        return self._tzname
+
+    def utcoffset(self, dt):
+        if self._isdst(dt):
+            return timedelta(seconds=-time.altzone)
+        else:
+            return timedelta(seconds=-time.timezone)
+
+    def dst(self, dt):
+        if self._isdst(dt):
+            return timedelta(seconds=-time.altzone) - timedelta(seconds=-time.timezone)
+        else:
+            return timedelta(0)
+
+    def tzname(self, dt):
+        return time.tzname[self._isdst(dt)]
+
+    def _isdst(self, dt):
+        tt = (dt.year, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.weekday(), 0, -1)
+        stamp = time.mktime(tt)
+        tt = time.localtime(stamp)
+        return tt.tm_isdst > 0

Added: vendor/django/current/django/utils/xmlutils.py
===================================================================
--- vendor/django/current/django/utils/xmlutils.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/utils/xmlutils.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,14 @@
+"""
+Utilities for XML generation/parsing.
+"""
+
+from xml.sax.saxutils import XMLGenerator
+
+class SimplerXMLGenerator(XMLGenerator):
+    def addQuickElement(self, name, contents=None, attrs=None):
+        "Convenience method for adding an element with no children"
+        if attrs is None: attrs = {}
+        self.startElement(name, attrs)
+        if contents is not None:
+            self.characters(contents)
+        self.endElement(name)

Added: vendor/django/current/django/views/__init__.py
===================================================================

Added: vendor/django/current/django/views/debug.py
===================================================================
--- vendor/django/current/django/views/debug.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/debug.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,661 @@
+from django.conf import settings
+from django.template import Template, Context, TemplateDoesNotExist
+from django.utils.html import escape
+from django.http import HttpResponseServerError, HttpResponseNotFound
+import os, re
+
+HIDDEN_SETTINGS = re.compile('SECRET|PASSWORD')
+
+def linebreak_iter(template_source):
+    yield 0
+    p = template_source.find('\n')
+    while p >= 0:
+        yield p+1
+        p = template_source.find('\n', p+1)
+    yield len(template_source) + 1
+
+def get_template_exception_info(exc_type, exc_value, tb):
+    origin, (start, end) = exc_value.source
+    template_source = origin.reload()
+    context_lines = 10
+    line = 0
+    upto = 0
+    source_lines = []
+    before = during = after = ""
+    for num, next in enumerate(linebreak_iter(template_source)):
+        if start >= upto and end <= next:
+            line = num
+            before = escape(template_source[upto:start])
+            during = escape(template_source[start:end])
+            after = escape(template_source[end:next])
+        source_lines.append( (num, escape(template_source[upto:next])) )
+        upto = next
+    total = len(source_lines)
+
+    top = max(1, line - context_lines)
+    bottom = min(total, line + 1 + context_lines)
+
+    template_info = {
+        'message': exc_value.args[0],
+        'source_lines': source_lines[top:bottom],
+        'before': before,
+        'during': during,
+        'after': after,
+        'top': top,
+        'bottom': bottom,
+        'total': total,
+        'line': line,
+        'name': origin.name,
+    }
+    exc_info = hasattr(exc_value, 'exc_info') and exc_value.exc_info or (exc_type, exc_value, tb)
+    return exc_info + (template_info,)
+
+def get_safe_settings():
+    "Returns a dictionary of the settings module, with sensitive settings blurred out."
+    settings_dict = {}
+    for k in dir(settings):
+        if k.isupper():
+            if HIDDEN_SETTINGS.search(k):
+                settings_dict[k] = '********************'
+            else:
+                settings_dict[k] = getattr(settings, k)
+    return settings_dict
+
+def technical_500_response(request, exc_type, exc_value, tb):
+    """
+    Create a technical server error response. The last three arguments are
+    the values returned from sys.exc_info() and friends.
+    """
+    template_info = None
+    template_does_not_exist = False
+    loader_debug_info = None
+    if issubclass(exc_type, TemplateDoesNotExist):
+        from django.template.loader import template_source_loaders
+        template_does_not_exist = True
+        loader_debug_info = []
+        for loader in template_source_loaders:
+            try:
+                source_list_func = getattr(__import__(loader.__module__, '', '', ['get_template_sources']), 'get_template_sources')
+                # NOTE: This assumes exc_value is the name of the template that
+                # the loader attempted to load.
+                template_list = [{'name': t, 'exists': os.path.exists(t)} \
+                    for t in source_list_func(str(exc_value))]
+            except (ImportError, AttributeError):
+                template_list = []
+            loader_debug_info.append({
+                'loader': loader.__module__ + '.' + loader.__name__,
+                'templates': template_list,
+            })
+    if settings.TEMPLATE_DEBUG and hasattr(exc_value, 'source'):
+        exc_type, exc_value, tb, template_info = get_template_exception_info(exc_type, exc_value, tb)
+    frames = []
+    while tb is not None:
+        filename = tb.tb_frame.f_code.co_filename
+        function = tb.tb_frame.f_code.co_name
+        lineno = tb.tb_lineno - 1
+        pre_context_lineno, pre_context, context_line, post_context = _get_lines_from_file(filename, lineno, 7)
+        if pre_context_lineno:
+            frames.append({
+                'tb': tb,
+                'filename': filename,
+                'function': function,
+                'lineno': lineno + 1,
+                'vars': tb.tb_frame.f_locals.items(),
+                'id': id(tb),
+                'pre_context': pre_context,
+                'context_line': context_line,
+                'post_context': post_context,
+                'pre_context_lineno': pre_context_lineno + 1,
+            })
+        tb = tb.tb_next
+
+    if not frames:
+        frames = [{
+            'filename': '&lt;unknown&gt;',
+            'function': '?',
+            'lineno': '?',
+        }]
+    t = Template(TECHNICAL_500_TEMPLATE)
+    c = Context({
+        'exception_type': exc_type.__name__,
+        'exception_value': exc_value,
+        'frames': frames,
+        'lastframe': frames[-1],
+        'request': request,
+        'request_protocol': request.is_secure() and "https" or "http",
+        'settings': get_safe_settings(),
+        'template_info': template_info,
+        'template_does_not_exist': template_does_not_exist,
+        'loader_debug_info': loader_debug_info,
+    })
+    return HttpResponseServerError(t.render(c), mimetype='text/html')
+
+def technical_404_response(request, exception):
+    "Create a technical 404 error response. The exception should be the Http404."
+    try:
+        tried = exception.args[0]['tried']
+    except (IndexError, TypeError):
+        tried = []
+    else:
+        if not tried:
+            # tried exists but is an empty list. The URLconf must've been empty.
+            return empty_urlconf(request)
+
+    t = Template(TECHNICAL_404_TEMPLATE)
+    c = Context({
+        'root_urlconf': settings.ROOT_URLCONF,
+        'urlpatterns': tried,
+        'reason': str(exception),
+        'request': request,
+        'request_protocol': request.is_secure() and "https" or "http",
+        'settings': get_safe_settings(),
+    })
+    return HttpResponseNotFound(t.render(c), mimetype='text/html')
+
+def empty_urlconf(request):
+    "Create an empty URLconf 404 error response."
+    t = Template(EMPTY_URLCONF_TEMPLATE)
+    c = Context({
+        'project_name': settings.SETTINGS_MODULE.split('.')[0]
+    })
+    return HttpResponseNotFound(t.render(c), mimetype='text/html')
+
+def _get_lines_from_file(filename, lineno, context_lines):
+    """
+    Returns context_lines before and after lineno from file.
+    Returns (pre_context_lineno, pre_context, context_line, post_context).
+    """
+    try:
+        source = open(filename).readlines()
+        lower_bound = max(0, lineno - context_lines)
+        upper_bound = lineno + context_lines
+
+        pre_context = [line.strip('\n') for line in source[lower_bound:lineno]]
+        context_line = source[lineno].strip('\n')
+        post_context = [line.strip('\n') for line in source[lineno+1:upper_bound]]
+
+        return lower_bound, pre_context, context_line, post_context
+    except (OSError, IOError):
+        return None, [], None, []
+
+#
+# Templates are embedded in the file so that we know the error handler will
+# always work even if the template loader is broken.
+#
+
+TECHNICAL_500_TEMPLATE = """
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <meta name="robots" content="NONE,NOARCHIVE" />
+  <title>{{ exception_type }} at {{ request.path }}</title>
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; }
+    h2 { margin-bottom:.8em; }
+    h2 span { font-size:80%; color:#666; font-weight:normal; }
+    h3 { margin:1em 0 .5em 0; }
+    h4 { margin:0 0 .5em 0; font-weight: normal; }
+    table { border:1px solid #ccc; border-collapse: collapse; width:100%; background:white; }
+    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
+    thead th { padding:1px 6px 1px 3px; background:#fefefe; text-align:left; font-weight:normal; font-size:11px; border:1px solid #ddd; }
+    tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    table.vars { margin:5px 0 2px 40px; }
+    table.vars td, table.req td { font-family:monospace; }
+    table td.code { width:100%; }
+    table td.code div { overflow:hidden; }
+    table.source th { color:#666; }
+    table.source td { font-family:monospace; white-space:pre; border-bottom:1px solid #eee; }
+    ul.traceback { list-style-type:none; }
+    ul.traceback li.frame { margin-bottom:1em; }
+    div.context { margin: 10px 0; }
+    div.context ol { padding-left:30px; margin:0 10px; list-style-position: inside; }
+    div.context ol li { font-family:monospace; white-space:pre; color:#666; cursor:pointer; }
+    div.context ol.context-line li { color:black; background-color:#ccc; }
+    div.context ol.context-line li span { float: right; }
+    div.commands { margin-left: 40px; }
+    div.commands a { color:black; text-decoration:none; }
+    #summary { background: #ffc; }
+    #summary h2 { font-weight: normal; color: #666; }
+    #explanation { background:#eee; }
+    #template, #template-not-exist { background:#f6f6f6; }
+    #template-not-exist ul { margin: 0 0 0 20px; }
+    #traceback { background:#eee; }
+    #requestinfo { background:#f6f6f6; padding-left:120px; }
+    #summary table { border:none; background:transparent; }
+    #requestinfo h2, #requestinfo h3 { position:relative; margin-left:-100px; }
+    #requestinfo h3 { margin-bottom:-1em; }
+    .error { background: #ffc; }
+    .specific { color:#cc3300; font-weight:bold; }
+  </style>
+  <script type="text/javascript">
+  //<!--
+    function getElementsByClassName(oElm, strTagName, strClassName){
+        // Written by Jonathan Snook, http://www.snook.ca/jon; Add-ons by Robert Nyman, http://www.robertnyman.com
+        var arrElements = (strTagName == "*" && document.all)? document.all :
+        oElm.getElementsByTagName(strTagName);
+        var arrReturnElements = new Array();
+        strClassName = strClassName.replace(/\-/g, "\\-");
+        var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
+        var oElement;
+        for(var i=0; i<arrElements.length; i++){
+            oElement = arrElements[i];
+            if(oRegExp.test(oElement.className)){
+                arrReturnElements.push(oElement);
+            }
+        }
+        return (arrReturnElements)
+    }
+    function hideAll(elems) {
+      for (var e = 0; e < elems.length; e++) {
+        elems[e].style.display = 'none';
+      }
+    }
+    window.onload = function() {
+      hideAll(getElementsByClassName(document, 'table', 'vars'));
+      hideAll(getElementsByClassName(document, 'ol', 'pre-context'));
+      hideAll(getElementsByClassName(document, 'ol', 'post-context'));
+      hideAll(getElementsByClassName(document, 'div', 'pastebin'));
+    }
+    function toggle() {
+      for (var i = 0; i < arguments.length; i++) {
+        var e = document.getElementById(arguments[i]);
+        if (e) {
+          e.style.display = e.style.display == 'none' ? 'block' : 'none';
+        }
+      }
+      return false;
+    }
+    function varToggle(link, id) {
+      toggle('v' + id);
+      var s = link.getElementsByTagName('span')[0];
+      var uarr = String.fromCharCode(0x25b6);
+      var darr = String.fromCharCode(0x25bc);
+      s.innerHTML = s.innerHTML == uarr ? darr : uarr;
+      return false;
+    }
+    function switchPastebinFriendly(link) {
+      s1 = "Switch to copy-and-paste view";
+      s2 = "Switch back to interactive view";
+      link.innerHTML = link.innerHTML == s1 ? s2 : s1;
+      toggle('browserTraceback', 'pastebinTraceback');
+      return false;
+    }
+    //-->
+  </script>
+</head>
+<body>
+
+<div id="summary">
+  <h1>{{ exception_type }} at {{ request.path }}</h1>
+  <h2>{{ exception_value|escape }}</h2>
+  <table class="meta">
+    <tr>
+      <th>Request Method:</th>
+      <td>{{ request.META.REQUEST_METHOD }}</td>
+    </tr>
+    <tr>
+      <th>Request URL:</th>
+      <td>{{ request_protocol }}://{{ request.META.HTTP_HOST }}{{ request.path }}</td>
+    </tr>
+    <tr>
+      <th>Exception Type:</th>
+      <td>{{ exception_type }}</td>
+    </tr>
+    <tr>
+      <th>Exception Value:</th>
+      <td>{{ exception_value }}</td>
+    </tr>
+    <tr>
+      <th>Exception Location:</th>
+      <td>{{ lastframe.filename }} in {{ lastframe.function }}, line {{ lastframe.lineno }}</td>
+    </tr>
+  </table>
+</div>
+{% if template_does_not_exist %}
+<div id="template-not-exist">
+    <h2>Template-loader postmortem</h2>
+    {% if loader_debug_info %}
+        <p>Django tried loading these templates, in this order:</p>
+        <ul>
+        {% for loader in loader_debug_info %}
+            <li>Using loader <code>{{ loader.loader }}</code>:
+                <ul>{% for t in loader.templates %}<li><code>{{ t.name }}</code> (File {% if t.exists %}exists{% else %}does not exist{% endif %})</li>{% endfor %}</ul>
+            </li>
+        {% endfor %}
+        </ul>
+    {% else %}
+        <p>Django couldn't find any templates because your <code>TEMPLATE_LOADERS</code> setting is empty!</p>
+    {% endif %}
+</div>
+{% endif %}
+{% if template_info %}
+<div id="template">
+   <h2>Template error</h2>
+   <p>In template <code>{{ template_info.name }}</code>, error at line <strong>{{ template_info.line }}</strong></p>
+   <h3>{{ template_info.message|escape }}</h3>
+   <table class="source{% if template_info.top %} cut-top{% endif %}{% ifnotequal template_info.bottom template_info.total %} cut-bottom{% endifnotequal %}">
+   {% for source_line in template_info.source_lines %}
+   {% ifequal source_line.0 template_info.line %}
+       <tr class="error"><th>{{ source_line.0 }}</th>
+       <td>{{ template_info.before }}<span class="specific">{{ template_info.during }}</span>{{ template_info.after }}</td></tr>
+   {% else %}
+      <tr><th>{{ source_line.0 }}</th>
+      <td>{{ source_line.1 }}</td></tr>
+   {% endifequal %}
+   {% endfor %}
+   </table>
+</div>
+{% endif %}
+<div id="traceback">
+  <h2>Traceback <span>(innermost last)</span></h2>
+  <div class="commands"><a href="#" onclick="return switchPastebinFriendly(this);">Switch to copy-and-paste view</a></div>
+  <br/>
+  <div id="browserTraceback">
+    <ul class="traceback">
+      {% for frame in frames %}
+        <li class="frame">
+          <code>{{ frame.filename }}</code> in <code>{{ frame.function }}</code>
+
+          {% if frame.context_line %}
+            <div class="context" id="c{{ frame.id }}">
+              {% if frame.pre_context %}
+                <ol start="{{ frame.pre_context_lineno }}" class="pre-context" id="pre{{ frame.id }}">{% for line in frame.pre_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line|escape }}</li>{% endfor %}</ol>
+              {% endif %}
+              <ol start="{{ frame.lineno }}" class="context-line"><li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ frame.context_line|escape }} <span>...</span></li></ol>
+              {% if frame.post_context %}
+                <ol start='{{ frame.lineno|add:"1" }}' class="post-context" id="post{{ frame.id }}">{% for line in frame.post_context %}<li onclick="toggle('pre{{ frame.id }}', 'post{{ frame.id }}')">{{ line|escape }}</li>{% endfor %}</ol>
+              {% endif %}
+            </div>
+          {% endif %}
+
+          {% if frame.vars %}
+            <div class="commands">
+                <a href="#" onclick="return varToggle(this, '{{ frame.id }}')"><span>&#x25b6;</span> Local vars</a>
+            </div>
+            <table class="vars" id="v{{ frame.id }}">
+              <thead>
+                <tr>
+                  <th>Variable</th>
+                  <th>Value</th>
+                </tr>
+              </thead>
+              <tbody>
+                {% for var in frame.vars|dictsort:"0" %}
+                  <tr>
+                    <td>{{ var.0 }}</td>
+                    <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+                  </tr>
+                {% endfor %}
+              </tbody>
+            </table>
+          {% endif %}
+        </li>
+      {% endfor %}
+    </ul>
+  </div>
+  <div id="pastebinTraceback" class="pastebin">
+    <table>
+      <tbody>
+        <tr>
+          <td>
+            <code>
+Traceback (most recent call last):<br/>
+{% for frame in frames %}
+  File "{{ frame.filename }}" in {{ frame.function }}<br/>
+  {% if frame.context_line %}
+    &nbsp;&nbsp;{{ frame.lineno }}. {{ frame.context_line|escape }}<br/>
+  {% endif %}
+{% endfor %}<br/>
+&nbsp;&nbsp;{{ exception_type }} at {{ request.path }}<br/>
+&nbsp;&nbsp;{{ exception_value|escape }}</code>
+          </td>
+        </tr>
+      </tbody>
+    </table>
+  </div>
+</div>
+
+<div id="requestinfo">
+  <h2>Request information</h2>
+
+  <h3 id="get-info">GET</h3>
+  {% if request.GET %}
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for var in request.GET.items %}
+          <tr>
+            <td>{{ var.0 }}</td>
+            <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+          </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+  {% else %}
+    <p>No GET data</p>
+  {% endif %}
+
+  <h3 id="post-info">POST</h3>
+  {% if request.POST %}
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for var in request.POST.items %}
+          <tr>
+            <td>{{ var.0 }}</td>
+            <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+          </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+  {% else %}
+    <p>No POST data</p>
+  {% endif %}
+
+  <h3 id="cookie-info">COOKIES</h3>
+  {% if request.COOKIES %}
+    <table class="req">
+      <thead>
+        <tr>
+          <th>Variable</th>
+          <th>Value</th>
+        </tr>
+      </thead>
+      <tbody>
+        {% for var in request.COOKIES.items %}
+          <tr>
+            <td>{{ var.0 }}</td>
+            <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+          </tr>
+        {% endfor %}
+      </tbody>
+    </table>
+  {% else %}
+    <p>No cookie data</p>
+  {% endif %}
+
+  <h3 id="meta-info">META</h3>
+  <table class="req">
+    <thead>
+      <tr>
+        <th>Variable</th>
+        <th>Value</th>
+      </tr>
+    </thead>
+    <tbody>
+      {% for var in request.META.items|dictsort:"0" %}
+        <tr>
+          <td>{{ var.0 }}</td>
+          <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+        </tr>
+      {% endfor %}
+    </tbody>
+  </table>
+
+  <h3 id="settings-info">Settings</h3>
+  <h4>Using settings module <code>{{ settings.SETTINGS_MODULE }}</code></h4>
+  <table class="req">
+    <thead>
+      <tr>
+        <th>Setting</th>
+        <th>Value</th>
+      </tr>
+    </thead>
+    <tbody>
+      {% for var in settings.items|dictsort:"0" %}
+        <tr>
+          <td>{{ var.0 }}</td>
+          <td class="code"><div>{{ var.1|pprint|escape }}</div></td>
+        </tr>
+      {% endfor %}
+    </tbody>
+  </table>
+
+</div>
+
+<div id="explanation">
+  <p>
+    You're seeing this error because you have <code>DEBUG = True</code> in your
+    Django settings file. Change that to <code>False</code>, and Django will
+    display a standard 500 page.
+  </p>
+</div>
+
+</body>
+</html>
+"""
+
+TECHNICAL_404_TEMPLATE = """
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en">
+<head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8" />
+  <title>Page not found at {{ request.path }}</title>
+  <meta name="robots" content="NONE,NOARCHIVE" />
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; background:#eee; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; margin-bottom:.4em; }
+    h1 span { font-size:60%; color:#666; font-weight:normal; }
+    table { border:none; border-collapse: collapse; width:100%; }
+    td, th { vertical-align:top; padding:2px 3px; }
+    th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    #info { background:#f6f6f6; }
+    #info ol { margin: 0.5em 4em; }
+    #info ol li { font-family: monospace; }
+    #summary { background: #ffc; }
+    #explanation { background:#eee; border-bottom: 0px none; }
+  </style>
+</head>
+<body>
+  <div id="summary">
+    <h1>Page not found <span>(404)</span></h1>
+    <table class="meta">
+      <tr>
+        <th>Request Method:</th>
+        <td>{{ request.META.REQUEST_METHOD }}</td>
+      </tr>
+      <tr>
+        <th>Request URL:</th>
+      <td>{{ request_protocol }}://{{ request.META.HTTP_HOST }}{{ request.path }}</td>
+      </tr>
+    </table>
+  </div>
+  <div id="info">
+    {% if urlpatterns %}
+      <p>
+      Using the URLconf defined in <code>{{ settings.ROOT_URLCONF }}</code>,
+      Django tried these URL patterns, in this order:
+      </p>
+      <ol>
+        {% for pattern in urlpatterns %}
+          <li>{{ pattern|escape }}</li>
+        {% endfor %}
+      </ol>
+      <p>The current URL, <code>{{ request.path }}</code>, didn't match any of these.</p>
+    {% else %}
+      <p>{{ reason|escape }}</p>
+    {% endif %}
+  </div>
+
+  <div id="explanation">
+    <p>
+      You're seeing this error because you have <code>DEBUG = True</code> in
+      your Django settings file. Change that to <code>False</code>, and Django
+      will display a standard 404 page.
+    </p>
+  </div>
+</body>
+</html>
+"""
+
+EMPTY_URLCONF_TEMPLATE = """
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
+<html lang="en"><head>
+  <meta http-equiv="content-type" content="text/html; charset=utf-8">
+  <meta name="robots" content="NONE,NOARCHIVE"><title>Welcome to Django</title>
+  <style type="text/css">
+    html * { padding:0; margin:0; }
+    body * { padding:10px 20px; }
+    body * * { padding:0; }
+    body { font:small sans-serif; }
+    body>div { border-bottom:1px solid #ddd; }
+    h1 { font-weight:normal; }
+    h2 { margin-bottom:.8em; }
+    h2 span { font-size:80%; color:#666; font-weight:normal; }
+    h3 { margin:1em 0 .5em 0; }
+    h4 { margin:0 0 .5em 0; font-weight: normal; }
+    table { border:1px solid #ccc; border-collapse: collapse; width:100%; background:white; }
+    tbody td, tbody th { vertical-align:top; padding:2px 3px; }
+    thead th { padding:1px 6px 1px 3px; background:#fefefe; text-align:left; font-weight:normal; font-size:11px; border:1px solid #ddd; }
+    tbody th { width:12em; text-align:right; color:#666; padding-right:.5em; }
+    ul { margin-left: 2em; margin-top: 1em; }
+    #summary { background: #e0ebff; }
+    #summary h2 { font-weight: normal; color: #666; }
+    #explanation { background:#eee; }
+    #instructions { background:#f6f6f6; }
+    #summary table { border:none; background:transparent; }
+  </style>
+</head>
+
+<body>
+<div id="summary">
+  <h1>It worked!</h1>
+  <h2>Congratulations on your first Django-powered page.</h2>
+</div>
+
+<div id="instructions">
+  <p>Of course, you haven't actually done any work yet. Here's what to do next:</p>
+  <ul>
+    <li>If you plan to use a database, edit the <code>DATABASE_*</code> settings in <code>{{ project_name }}/settings.py</code>.</li>
+    <li>Start your first app by running <code>python {{ project_name }}/manage.py startapp [appname]</code>.</li>
+  </ul>
+</div>
+
+<div id="explanation">
+  <p>
+    You're seeing this message because you have <code>DEBUG = True</code> in your
+    Django settings file and you haven't configured any URLs. Get to work!
+  </p>
+</div>
+</body></html>
+"""

Added: vendor/django/current/django/views/decorators/__init__.py
===================================================================

Added: vendor/django/current/django/views/decorators/cache.py
===================================================================
--- vendor/django/current/django/views/decorators/cache.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/decorators/cache.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,42 @@
+"""
+Decorator for views that tries getting the page from the cache and
+populates the cache if the page isn't in the cache yet.
+
+The cache is keyed by the URL and some data from the headers. Additionally
+there is the key prefix that is used to distinguish different cache areas
+in a multi-site setup. You could use the sites.get_current().domain, for
+example, as that is unique across a Django project.
+
+Additionally, all headers from the response's Vary header will be taken into
+account on caching -- just like the middleware does.
+"""
+
+from django.utils.decorators import decorator_from_middleware
+from django.utils.cache import patch_cache_control, add_never_cache_headers
+from django.middleware.cache import CacheMiddleware
+
+cache_page = decorator_from_middleware(CacheMiddleware)
+
+def cache_control(**kwargs):
+
+    def _cache_controller(viewfunc):
+
+        def _cache_controlled(request, *args, **kw):
+            response = viewfunc(request, *args, **kw)
+            patch_cache_control(response, **kwargs)
+            return response
+
+        return _cache_controlled
+
+    return _cache_controller
+
+def never_cache(view_func):
+    """
+    Decorator that adds headers to a response so that it will
+    never be cached.
+    """
+    def _wrapped_view_func(request, *args, **kwargs):
+        response = view_func(request, *args, **kwargs)
+        add_never_cache_headers(response)
+        return response
+    return _wrapped_view_func

Added: vendor/django/current/django/views/decorators/gzip.py
===================================================================
--- vendor/django/current/django/views/decorators/gzip.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/decorators/gzip.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,6 @@
+"Decorator for views that gzips pages if the client supports it."
+
+from django.utils.decorators import decorator_from_middleware
+from django.middleware.gzip import GZipMiddleware
+
+gzip_page = decorator_from_middleware(GZipMiddleware)

Added: vendor/django/current/django/views/decorators/http.py
===================================================================
--- vendor/django/current/django/views/decorators/http.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/decorators/http.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,34 @@
+"""
+Decorators for views based on HTTP headers.
+"""
+
+from django.utils.decorators import decorator_from_middleware
+from django.middleware.http import ConditionalGetMiddleware
+from django.http import HttpResponseNotAllowed
+
+conditional_page = decorator_from_middleware(ConditionalGetMiddleware)
+
+def require_http_methods(request_method_list):
+    """
+    Decorator to make a view only accept particular request methods.  Usage::
+
+        @require_http_methods(["GET", "POST"])
+        def my_view(request):
+            # I can assume now that only GET or POST requests make it this far
+            # ...
+
+    Note that request methods should be in uppercase.
+    """
+    def decorator(func):
+        def inner(request, *args, **kwargs):
+            if request.method not in request_method_list:
+                return HttpResponseNotAllowed(request_method_list)
+            return func(request, *args, **kwargs)
+        return inner
+    return decorator
+
+require_GET = require_http_methods(["GET"])
+require_GET.__doc__ = "Decorator to require that a view only accept the GET method."
+
+require_POST = require_http_methods(["POST"])
+require_POST.__doc__ = "Decorator to require that a view only accept the POST method."
\ No newline at end of file

Added: vendor/django/current/django/views/decorators/vary.py
===================================================================
--- vendor/django/current/django/views/decorators/vary.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/decorators/vary.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,35 @@
+from django.utils.cache import patch_vary_headers
+
+def vary_on_headers(*headers):
+    """
+    A view decorator that adds the specified headers to the Vary header of the
+    response. Usage:
+
+       @vary_on_headers('Cookie', 'Accept-language')
+       def index(request):
+           ...
+
+    Note that the header names are not case-sensitive.
+    """
+    def decorator(func):
+        def inner_func(*args, **kwargs):
+            response = func(*args, **kwargs)
+            patch_vary_headers(response, headers)
+            return response
+        return inner_func
+    return decorator
+
+def vary_on_cookie(func):
+    """
+    A view decorator that adds "Cookie" to the Vary header of a response. This
+    indicates that a page's contents depends on cookies. Usage:
+
+        @vary_on_cookie
+        def index(request):
+            ...
+    """
+    def inner_func(*args, **kwargs):
+        response = func(*args, **kwargs)
+        patch_vary_headers(response, ('Cookie',))
+        return response
+    return inner_func

Added: vendor/django/current/django/views/defaults.py
===================================================================
--- vendor/django/current/django/views/defaults.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/defaults.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,89 @@
+from django.core.exceptions import ObjectDoesNotExist
+from django.template import Context, RequestContext, loader
+from django.contrib.contenttypes.models import ContentType
+from django.contrib.sites.models import Site
+from django import http
+
+def shortcut(request, content_type_id, object_id):
+    "Redirect to an object's page based on a content-type ID and an object ID."
+    # Look up the object, making sure it's got a get_absolute_url() function.
+    try:
+        content_type = ContentType.objects.get(pk=content_type_id)
+        obj = content_type.get_object_for_this_type(pk=object_id)
+    except ObjectDoesNotExist:
+        raise http.Http404, "Content type %s object %s doesn't exist" % (content_type_id, object_id)
+    try:
+        absurl = obj.get_absolute_url()
+    except AttributeError:
+        raise http.Http404, "%s objects don't have get_absolute_url() methods" % content_type.name
+
+    # Try to figure out the object's domain, so we can do a cross-site redirect
+    # if necessary.
+
+    # If the object actually defines a domain, we're done.
+    if absurl.startswith('http://'):
+        return http.HttpResponseRedirect(absurl)
+
+    object_domain = None
+
+    # Otherwise, we need to introspect the object's relationships for a
+    # relation to the Site object
+    opts = obj._meta
+
+    # First, look for an many-to-many relationship to sites
+    for field in opts.many_to_many:
+        if field.rel.to is Site:
+            try:
+                object_domain = getattr(obj, field.name).all()[0].domain
+            except IndexError:
+                pass
+            if object_domain is not None:
+                break
+
+    # Next look for a many-to-one relationship to site
+    if object_domain is None:
+        for field in obj._meta.fields:
+            if field.rel and field.rel.to is Site:
+                try:
+                    object_domain = getattr(obj, field.name).domain
+                except Site.DoesNotExist:
+                    pass
+                if object_domain is not None:
+                    break
+
+    # Fall back to the current site (if possible)
+    if object_domain is None:
+        try:
+            object_domain = Site.objects.get_current().domain
+        except Site.DoesNotExist:
+            pass
+
+    # If all that malarkey found an object domain, use it; otherwise fall back
+    # to whatever get_absolute_url() returned.
+    if object_domain is not None:
+        return http.HttpResponseRedirect('http://%s%s' % (object_domain, absurl))
+    else:
+        return http.HttpResponseRedirect(absurl)
+
+def page_not_found(request, template_name='404.html'):
+    """
+    Default 404 handler, which looks for the requested URL in the redirects
+    table, redirects if found, and displays 404 page if not redirected.
+
+    Templates: `404.html`
+    Context:
+        request_path
+            The path of the requested URL (e.g., '/app/pages/bad_page/')
+    """
+    t = loader.get_template(template_name)
+    return http.HttpResponseNotFound(t.render(RequestContext(request, {'request_path': request.path})))
+
+def server_error(request, template_name='500.html'):
+    """
+    500 error handler.
+
+    Templates: `500.html`
+    Context: None
+    """
+    t = loader.get_template(template_name)
+    return http.HttpResponseServerError(t.render(Context({})))

Added: vendor/django/current/django/views/generic/__init__.py
===================================================================

Added: vendor/django/current/django/views/generic/create_update.py
===================================================================
--- vendor/django/current/django/views/generic/create_update.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/generic/create_update.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,199 @@
+from django.core.xheaders import populate_xheaders
+from django.template import loader
+from django import forms
+from django.db.models import FileField
+from django.contrib.auth.views import redirect_to_login
+from django.template import RequestContext
+from django.http import Http404, HttpResponse, HttpResponseRedirect
+from django.core.exceptions import ObjectDoesNotExist, ImproperlyConfigured
+
+def create_object(request, model, template_name=None,
+        template_loader=loader, extra_context=None, post_save_redirect=None,
+        login_required=False, follow=None, context_processors=None):
+    """
+    Generic object-creation function.
+
+    Templates: ``<app_label>/<model_name>_form.html``
+    Context:
+        form
+            the form wrapper for the object
+    """
+    if extra_context is None: extra_context = {}
+    if login_required and not request.user.is_authenticated():
+        return redirect_to_login(request.path)
+
+    manipulator = model.AddManipulator(follow=follow)
+    if request.POST:
+        # If data was POSTed, we're trying to create a new object
+        new_data = request.POST.copy()
+
+        if model._meta.has_field_type(FileField):
+            new_data.update(request.FILES)
+
+        # Check for errors
+        errors = manipulator.get_validation_errors(new_data)
+        manipulator.do_html2python(new_data)
+
+        if not errors:
+            # No errors -- this means we can save the data!
+            new_object = manipulator.save(new_data)
+
+            if request.user.is_authenticated():
+                request.user.message_set.create(message="The %s was created successfully." % model._meta.verbose_name)
+
+            # Redirect to the new object: first by trying post_save_redirect,
+            # then by obj.get_absolute_url; fail if neither works.
+            if post_save_redirect:
+                return HttpResponseRedirect(post_save_redirect % new_object.__dict__)
+            elif hasattr(new_object, 'get_absolute_url'):
+                return HttpResponseRedirect(new_object.get_absolute_url())
+            else:
+                raise ImproperlyConfigured("No URL to redirect to from generic create view.")
+    else:
+        # No POST, so we want a brand new form without any data or errors
+        errors = {}
+        new_data = manipulator.flatten_data()
+
+    # Create the FormWrapper, template, context, response
+    form = forms.FormWrapper(manipulator, new_data, errors)
+    if not template_name:
+        template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'form': form,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c))
+
+def update_object(request, model, object_id=None, slug=None,
+        slug_field=None, template_name=None, template_loader=loader,
+        extra_context=None, post_save_redirect=None,
+        login_required=False, follow=None, context_processors=None,
+        template_object_name='object'):
+    """
+    Generic object-update function.
+
+    Templates: ``<app_label>/<model_name>_form.html``
+    Context:
+        form
+            the form wrapper for the object
+        object
+            the original object being edited
+    """
+    if extra_context is None: extra_context = {}
+    if login_required and not request.user.is_authenticated():
+        return redirect_to_login(request.path)
+
+    # Look up the object to be edited
+    lookup_kwargs = {}
+    if object_id:
+        lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
+    elif slug and slug_field:
+        lookup_kwargs['%s__exact' % slug_field] = slug
+    else:
+        raise AttributeError("Generic edit view must be called with either an object_id or a slug/slug_field")
+    try:
+        object = model.objects.get(**lookup_kwargs)
+    except ObjectDoesNotExist:
+        raise Http404, "No %s found for %s" % (model._meta.verbose_name, lookup_kwargs)
+
+    manipulator = model.ChangeManipulator(getattr(object, object._meta.pk.name), follow=follow)
+
+    if request.POST:
+        new_data = request.POST.copy()
+        if model._meta.has_field_type(FileField):
+            new_data.update(request.FILES)
+        errors = manipulator.get_validation_errors(new_data)
+        manipulator.do_html2python(new_data)
+        if not errors:
+            object = manipulator.save(new_data)
+
+            if request.user.is_authenticated():
+                request.user.message_set.create(message="The %s was updated successfully." % model._meta.verbose_name)
+
+            # Do a post-after-redirect so that reload works, etc.
+            if post_save_redirect:
+                return HttpResponseRedirect(post_save_redirect % object.__dict__)
+            elif hasattr(object, 'get_absolute_url'):
+                return HttpResponseRedirect(object.get_absolute_url())
+            else:
+                raise ImproperlyConfigured("No URL to redirect to from generic create view.")
+    else:
+        errors = {}
+        # This makes sure the form acurate represents the fields of the place.
+        new_data = manipulator.flatten_data()
+
+    form = forms.FormWrapper(manipulator, new_data, errors)
+    if not template_name:
+        template_name = "%s/%s_form.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'form': form,
+        template_object_name: object,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    response = HttpResponse(t.render(c))
+    populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
+    return response
+
+def delete_object(request, model, post_delete_redirect,
+        object_id=None, slug=None, slug_field=None, template_name=None,
+        template_loader=loader, extra_context=None,
+        login_required=False, context_processors=None, template_object_name='object'):
+    """
+    Generic object-delete function.
+
+    The given template will be used to confirm deletetion if this view is
+    fetched using GET; for safty, deletion will only be performed if this
+    view is POSTed.
+
+    Templates: ``<app_label>/<model_name>_confirm_delete.html``
+    Context:
+        object
+            the original object being deleted
+    """
+    if extra_context is None: extra_context = {}
+    if login_required and not request.user.is_authenticated():
+        return redirect_to_login(request.path)
+
+    # Look up the object to be edited
+    lookup_kwargs = {}
+    if object_id:
+        lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
+    elif slug and slug_field:
+        lookup_kwargs['%s__exact' % slug_field] = slug
+    else:
+        raise AttributeError("Generic delete view must be called with either an object_id or a slug/slug_field")
+    try:
+        object = model._default_manager.get(**lookup_kwargs)
+    except ObjectDoesNotExist:
+        raise Http404, "No %s found for %s" % (model._meta.app_label, lookup_kwargs)
+
+    if request.method == 'POST':
+        object.delete()
+        if request.user.is_authenticated():
+            request.user.message_set.create(message="The %s was deleted." % model._meta.verbose_name)
+        return HttpResponseRedirect(post_delete_redirect)
+    else:
+        if not template_name:
+            template_name = "%s/%s_confirm_delete.html" % (model._meta.app_label, model._meta.object_name.lower())
+        t = template_loader.get_template(template_name)
+        c = RequestContext(request, {
+            template_object_name: object,
+        }, context_processors)
+        for key, value in extra_context.items():
+            if callable(value):
+                c[key] = value()
+            else:
+                c[key] = value
+        response = HttpResponse(t.render(c))
+        populate_xheaders(request, response, model, getattr(object, object._meta.pk.name))
+        return response

Added: vendor/django/current/django/views/generic/date_based.py
===================================================================
--- vendor/django/current/django/views/generic/date_based.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/generic/date_based.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,341 @@
+from django.template import loader, RequestContext
+from django.core.exceptions import ObjectDoesNotExist
+from django.core.xheaders import populate_xheaders
+from django.http import Http404, HttpResponse
+import datetime, time
+
+def archive_index(request, queryset, date_field, num_latest=15,
+        template_name=None, template_loader=loader,
+        extra_context=None, allow_empty=False, context_processors=None,
+        mimetype=None, allow_future=False):
+    """
+    Generic top-level archive of date-based objects.
+
+    Templates: ``<app_label>/<model_name>_archive.html``
+    Context:
+        date_list
+            List of years
+        latest
+            Latest N (defaults to 15) objects by date
+    """
+    if extra_context is None: extra_context = {}
+    model = queryset.model
+    if not allow_future:
+        queryset = queryset.filter(**{'%s__lte' % date_field: datetime.datetime.now()})
+    date_list = queryset.dates(date_field, 'year')[::-1]
+    if not date_list and not allow_empty:
+        raise Http404, "No %s available" % model._meta.verbose_name
+
+    if date_list and num_latest:
+        latest = queryset.order_by('-'+date_field)[:num_latest]
+    else:
+        latest = None
+
+    if not template_name:
+        template_name = "%s/%s_archive.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'date_list' : date_list,
+        'latest' : latest,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_year(request, year, queryset, date_field, template_name=None,
+        template_loader=loader, extra_context=None, allow_empty=False,
+        context_processors=None, template_object_name='object', mimetype=None,
+        make_object_list=False, allow_future=False):
+    """
+    Generic yearly archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_year.html``
+    Context:
+        date_list
+            List of months in this year with objects
+        year
+            This year
+        object_list
+            List of objects published in the given month
+            (Only available if make_object_list argument is True)
+    """
+    if extra_context is None: extra_context = {}
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    lookup_kwargs = {'%s__year' % date_field: year}
+
+    # Only bother to check current date if the year isn't in the past and future objects aren't requested.
+    if int(year) >= now.year and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    date_list = queryset.filter(**lookup_kwargs).dates(date_field, 'month')
+    if not date_list and not allow_empty:
+        raise Http404
+    if make_object_list:
+        object_list = queryset.filter(**lookup_kwargs).order_by(date_field)
+    else:
+        object_list = []
+    if not template_name:
+        template_name = "%s/%s_archive_year.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        'date_list': date_list,
+        'year': year,
+        '%s_list' % template_object_name: object_list,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_month(request, year, month, queryset, date_field,
+        month_format='%b', template_name=None, template_loader=loader,
+        extra_context=None, allow_empty=False, context_processors=None,
+        template_object_name='object', mimetype=None, allow_future=False):
+    """
+    Generic monthly archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_month.html``
+    Context:
+        month:
+            (date) this month
+        next_month:
+            (date) the first day of the next month, or None if the next month is in the future
+        previous_month:
+            (date) the first day of the previous month
+        object_list:
+            list of objects published in the given month
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+month, '%Y'+month_format)[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    # Calculate first and last day of month, for use in a date-range lookup.
+    first_day = date.replace(day=1)
+    if first_day.month == 12:
+        last_day = first_day.replace(year=first_day.year + 1, month=1)
+    else:
+        last_day = first_day.replace(month=first_day.month + 1)
+    lookup_kwargs = {'%s__range' % date_field: (first_day, last_day)}
+
+    # Only bother to check current date if the month isn't in the past and future objects are requested.
+    if last_day >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    object_list = queryset.filter(**lookup_kwargs)
+    if not object_list and not allow_empty:
+        raise Http404
+
+    # Calculate the next month, if applicable.
+    if allow_future:
+        next_month = last_day + datetime.timedelta(days=1)
+    elif last_day < datetime.date.today():
+        next_month = last_day + datetime.timedelta(days=1)
+    else:
+        next_month = None
+
+    if not template_name:
+        template_name = "%s/%s_archive_month.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        '%s_list' % template_object_name: object_list,
+        'month': date,
+        'next_month': next_month,
+        'previous_month': first_day - datetime.timedelta(days=1),
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_week(request, year, week, queryset, date_field,
+        template_name=None, template_loader=loader,
+        extra_context=None, allow_empty=True, context_processors=None,
+        template_object_name='object', mimetype=None, allow_future=False):
+    """
+    Generic weekly archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_week.html``
+    Context:
+        week:
+            (date) this week
+        object_list:
+            list of objects published in the given week
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+'-0-'+week, '%Y-%w-%U')[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    # Calculate first and last day of week, for use in a date-range lookup.
+    first_day = date
+    last_day = date + datetime.timedelta(days=7)
+    lookup_kwargs = {'%s__range' % date_field: (first_day, last_day)}
+
+    # Only bother to check current date if the week isn't in the past and future objects aren't requested.
+    if last_day >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    object_list = queryset.filter(**lookup_kwargs)
+    if not object_list and not allow_empty:
+        raise Http404
+    if not template_name:
+        template_name = "%s/%s_archive_week.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        '%s_list' % template_object_name: object_list,
+        'week': date,
+    })
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_day(request, year, month, day, queryset, date_field,
+        month_format='%b', day_format='%d', template_name=None,
+        template_loader=loader, extra_context=None, allow_empty=False,
+        context_processors=None, template_object_name='object',
+        mimetype=None, allow_future=False):
+    """
+    Generic daily archive view.
+
+    Templates: ``<app_label>/<model_name>_archive_day.html``
+    Context:
+        object_list:
+            list of objects published that day
+        day:
+            (datetime) the day
+        previous_day
+            (datetime) the previous day
+        next_day
+            (datetime) the next day, or None if the current day is today
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+month+day, '%Y'+month_format+day_format)[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    lookup_kwargs = {
+        '%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max)),
+    }
+
+    # Only bother to check current date if the date isn't in the past and future objects aren't requested.
+    if date >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    object_list = queryset.filter(**lookup_kwargs)
+    if not allow_empty and not object_list:
+        raise Http404
+
+    # Calculate the next day, if applicable.
+    if allow_future:
+        next_day = date + datetime.timedelta(days=1)
+    elif date < datetime.date.today():
+        next_day = date + datetime.timedelta(days=1)
+    else:
+        next_day = None
+
+    if not template_name:
+        template_name = "%s/%s_archive_day.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        '%s_list' % template_object_name: object_list,
+        'day': date,
+        'previous_day': date - datetime.timedelta(days=1),
+        'next_day': next_day,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def archive_today(request, **kwargs):
+    """
+    Generic daily archive view for today. Same as archive_day view.
+    """
+    today = datetime.date.today()
+    kwargs.update({
+        'year': str(today.year),
+        'month': today.strftime('%b').lower(),
+        'day': str(today.day),
+    })
+    return archive_day(request, **kwargs)
+
+def object_detail(request, year, month, day, queryset, date_field,
+        month_format='%b', day_format='%d', object_id=None, slug=None,
+        slug_field=None, template_name=None, template_name_field=None,
+        template_loader=loader, extra_context=None, context_processors=None,
+        template_object_name='object', mimetype=None, allow_future=False):
+    """
+    Generic detail view from year/month/day/slug or year/month/day/id structure.
+
+    Templates: ``<app_label>/<model_name>_detail.html``
+    Context:
+        object:
+            the object to be detailed
+    """
+    if extra_context is None: extra_context = {}
+    try:
+        date = datetime.date(*time.strptime(year+month+day, '%Y'+month_format+day_format)[:3])
+    except ValueError:
+        raise Http404
+
+    model = queryset.model
+    now = datetime.datetime.now()
+
+    lookup_kwargs = {
+        '%s__range' % date_field: (datetime.datetime.combine(date, datetime.time.min), datetime.datetime.combine(date, datetime.time.max)),
+    }
+
+    # Only bother to check current date if the date isn't in the past and future objects aren't requested.
+    if date >= now.date() and not allow_future:
+        lookup_kwargs['%s__lte' % date_field] = now
+    if object_id:
+        lookup_kwargs['%s__exact' % model._meta.pk.name] = object_id
+    elif slug and slug_field:
+        lookup_kwargs['%s__exact' % slug_field] = slug
+    else:
+        raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slugfield"
+    try:
+        obj = queryset.get(**lookup_kwargs)
+    except ObjectDoesNotExist:
+        raise Http404, "No %s found for" % model._meta.verbose_name
+    if not template_name:
+        template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
+    if template_name_field:
+        template_name_list = [getattr(obj, template_name_field), template_name]
+        t = template_loader.select_template(template_name_list)
+    else:
+        t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        template_object_name: obj,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    response = HttpResponse(t.render(c), mimetype=mimetype)
+    populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
+    return response

Added: vendor/django/current/django/views/generic/list_detail.py
===================================================================
--- vendor/django/current/django/views/generic/list_detail.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/generic/list_detail.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,123 @@
+from django.template import loader, RequestContext
+from django.http import Http404, HttpResponse
+from django.core.xheaders import populate_xheaders
+from django.core.paginator import ObjectPaginator, InvalidPage
+from django.core.exceptions import ObjectDoesNotExist
+
+def object_list(request, queryset, paginate_by=None, page=None,
+        allow_empty=False, template_name=None, template_loader=loader,
+        extra_context=None, context_processors=None, template_object_name='object',
+        mimetype=None):
+    """
+    Generic list of objects.
+
+    Templates: ``<app_label>/<model_name>_list.html``
+    Context:
+        object_list
+            list of objects
+        is_paginated
+            are the results paginated?
+        results_per_page
+            number of objects per page (if paginated)
+        has_next
+            is there a next page?
+        has_previous
+            is there a prev page?
+        page
+            the current page
+        next
+            the next page
+        previous
+            the previous page
+        pages
+            number of pages, total
+        hits
+            number of objects, total
+    """
+    if extra_context is None: extra_context = {}
+    queryset = queryset._clone()
+    if paginate_by:
+        paginator = ObjectPaginator(queryset, paginate_by)
+        if not page:
+            page = request.GET.get('page', 1)
+        try:
+            page = int(page)
+            object_list = paginator.get_page(page - 1)
+        except (InvalidPage, ValueError):
+            if page == 1 and allow_empty:
+                object_list = []
+            else:
+                raise Http404
+        c = RequestContext(request, {
+            '%s_list' % template_object_name: object_list,
+            'is_paginated': paginator.pages > 1,
+            'results_per_page': paginate_by,
+            'has_next': paginator.has_next_page(page - 1),
+            'has_previous': paginator.has_previous_page(page - 1),
+            'page': page,
+            'next': page + 1,
+            'previous': page - 1,
+            'pages': paginator.pages,
+            'hits' : paginator.hits,
+        }, context_processors)
+    else:
+        c = RequestContext(request, {
+            '%s_list' % template_object_name: queryset,
+            'is_paginated': False
+        }, context_processors)
+        if not allow_empty and len(queryset) == 0:
+            raise Http404
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    if not template_name:
+        model = queryset.model
+        template_name = "%s/%s_list.html" % (model._meta.app_label, model._meta.object_name.lower())
+    t = template_loader.get_template(template_name)
+    return HttpResponse(t.render(c), mimetype=mimetype)
+
+def object_detail(request, queryset, object_id=None, slug=None,
+        slug_field=None, template_name=None, template_name_field=None,
+        template_loader=loader, extra_context=None,
+        context_processors=None, template_object_name='object',
+        mimetype=None):
+    """
+    Generic list of objects.
+
+    Templates: ``<app_label>/<model_name>_detail.html``
+    Context:
+        object
+            the object
+    """
+    if extra_context is None: extra_context = {}
+    model = queryset.model
+    if object_id:
+        queryset = queryset.filter(pk=object_id)
+    elif slug and slug_field:
+        queryset = queryset.filter(**{slug_field: slug})
+    else:
+        raise AttributeError, "Generic detail view must be called with either an object_id or a slug/slug_field."
+    try:
+        obj = queryset.get()
+    except ObjectDoesNotExist:
+        raise Http404, "No %s found matching the query" % (model._meta.verbose_name)
+    if not template_name:
+        template_name = "%s/%s_detail.html" % (model._meta.app_label, model._meta.object_name.lower())
+    if template_name_field:
+        template_name_list = [getattr(obj, template_name_field), template_name]
+        t = template_loader.select_template(template_name_list)
+    else:
+        t = template_loader.get_template(template_name)
+    c = RequestContext(request, {
+        template_object_name: obj,
+    }, context_processors)
+    for key, value in extra_context.items():
+        if callable(value):
+            c[key] = value()
+        else:
+            c[key] = value
+    response = HttpResponse(t.render(c), mimetype=mimetype)
+    populate_xheaders(request, response, model, getattr(obj, obj._meta.pk.name))
+    return response

Added: vendor/django/current/django/views/generic/simple.py
===================================================================
--- vendor/django/current/django/views/generic/simple.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/generic/simple.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,29 @@
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.http import HttpResponse, HttpResponsePermanentRedirect, HttpResponseGone
+
+def direct_to_template(request, template, **kwargs):
+    """
+    Render a given template with any extra URL parameters in the context as
+    ``{{ params }}``.
+    """
+    return render_to_response(template, {'params' : kwargs}, context_instance=RequestContext(request))
+
+def redirect_to(request, url, **kwargs):
+    """
+    Redirect to a given URL.
+
+    The given url may contain dict-style string formatting, which will be
+    interpolated against the params in the URL.  For example, to redirect from
+    ``/foo/<id>/`` to ``/bar/<id>/``, you could use the following URLconf::
+
+        urlpatterns = patterns('',
+            ('^foo/(?p<id>\d+)/$', 'django.views.generic.simple.redirect_to', {'url' : '/bar/%(id)s/'}),
+        )
+
+    If the given url is ``None``, a HttpResponseGone (410) will be issued.
+    """
+    if url is not None:
+        return HttpResponsePermanentRedirect(url % kwargs)
+    else:
+        return HttpResponseGone()

Added: vendor/django/current/django/views/i18n.py
===================================================================
--- vendor/django/current/django/views/i18n.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/i18n.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,172 @@
+from django import http
+from django.utils.translation import check_for_language, activate, to_locale, get_language
+from django.utils.text import javascript_quote
+from django.conf import settings
+import os
+import gettext as gettext_module
+
+def set_language(request):
+    """
+    Redirect to a given url while setting the chosen language in the
+    session or cookie. The url and the language code need to be
+    specified in the GET paramters.
+    """
+    lang_code = request.GET['language']
+    next = request.GET.get('next', None)
+    if not next:
+        next = request.META.get('HTTP_REFERER', None)
+    if not next:
+        next = '/'
+    response = http.HttpResponseRedirect(next)
+    if check_for_language(lang_code):
+        if hasattr(request, 'session'):
+            request.session['django_language'] = lang_code
+        else:
+            response.set_cookie('django_language', lang_code)
+    return response
+
+NullSource = """
+/* gettext identity library */
+
+function gettext(msgid) { return msgid; }
+function ngettext(singular, plural, count) { return (count == 1) ? singular : plural; }
+function gettext_noop(msgid) { return msgid; }
+"""
+
+LibHead = """
+/* gettext library */
+
+var catalog = new Array();
+"""
+
+LibFoot = """
+
+function gettext(msgid) {
+  var value = catalog[msgid];
+  if (typeof(value) == 'undefined') {
+    return msgid;
+  } else {
+    return (typeof(value) == 'string') ? value : value[0];
+  }
+}
+
+function ngettext(singular, plural, count) {
+  value = catalog[singular];
+  if (typeof(value) == 'undefined') {
+    return (count == 1) ? singular : plural;
+  } else {
+    return value[pluralidx(count)];
+  }
+}
+
+function gettext_noop(msgid) { return msgid; }
+"""
+
+SimplePlural = """
+function pluralidx(count) { return (count == 1) ? 0 : 1; }
+"""
+
+InterPolate = r"""
+function interpolate(fmt, obj, named) {
+  if (named) {
+    return fmt.replace(/%\(\w+\)s/, function(match){return String(obj[match.slice(2,-2)])});
+  } else {
+    return fmt.replace(/%s/, function(match){return String(obj.shift())});
+  }
+}
+"""
+
+def null_javascript_catalog(request, domain=None, packages=None):
+    """
+    Returns "identity" versions of the JavaScript i18n functions -- i.e.,
+    versions that don't actually do anything.
+    """
+    return http.HttpResponse(NullSource + InterPolate, 'text/javascript')
+
+def javascript_catalog(request, domain='djangojs', packages=None):
+    """
+    Returns the selected language catalog as a javascript library.
+
+    Receives the list of packages to check for translations in the
+    packages parameter either from an infodict or as a +-delimited
+    string from the request. Default is 'django.conf'.
+
+    Additionally you can override the gettext domain for this view,
+    but usually you don't want to do that, as JavaScript messages
+    go to the djangojs domain. But this might be needed if you
+    deliver your JavaScript source from Django templates.
+    """
+    if request.GET:
+        if request.GET.has_key('language'):
+            if check_for_language(request.GET['language']):
+                activate(request.GET['language'])
+    if packages is None:
+        packages = ['django.conf']
+    if type(packages) in (str, unicode):
+        packages = packages.split('+')
+    packages = [p for p in packages if p == 'django.conf' or p in settings.INSTALLED_APPS]
+    default_locale = to_locale(settings.LANGUAGE_CODE)
+    locale = to_locale(get_language())
+    t = {}
+    paths = []
+    # first load all english languages files for defaults
+    for package in packages:
+        p = __import__(package, {}, {}, [''])
+        path = os.path.join(os.path.dirname(p.__file__), 'locale')
+        paths.append(path)
+        catalog = gettext_module.translation(domain, path, ['en'])
+        t.update(catalog._catalog)
+    # next load the settings.LANGUAGE_CODE translations if it isn't english
+    if default_locale != 'en':
+        for path in paths:
+            try:
+                catalog = gettext_module.translation(domain, path, [default_locale])
+            except IOError:
+                catalog = None
+            if catalog is not None:
+                t.update(catalog._catalog)
+    # last load the currently selected language, if it isn't identical to the default.
+    if locale != default_locale:
+        for path in paths:
+            try:
+                catalog = gettext_module.translation(domain, path, [locale])
+            except IOError:
+                catalog = None
+            if catalog is not None:
+                t.update(catalog._catalog)
+    src = [LibHead]
+    plural = None
+    if t.has_key(''):
+        for l in t[''].split('\n'):
+            if l.startswith('Plural-Forms:'):
+                plural = l.split(':',1)[1].strip()
+    if plural is not None:
+        # this should actually be a compiled function of a typical plural-form:
+        # 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;
+        plural = [el.strip() for el in plural.split(';') if el.strip().startswith('plural=')][0].split('=',1)[1]
+        src.append('function pluralidx(n) {\n    return %s;\n}\n' % plural)
+    else:
+        src.append(SimplePlural)
+    csrc = []
+    pdict = {}
+    for k, v in t.items():
+        if k == '':
+            continue
+        if type(k) in (str, unicode):
+            csrc.append("catalog['%s'] = '%s';\n" % (javascript_quote(k), javascript_quote(v)))
+        elif type(k) == tuple:
+            if not pdict.has_key(k[0]):
+                pdict[k[0]] = k[1]
+            else:
+                pdict[k[0]] = max(k[1], pdict[k[0]])
+            csrc.append("catalog['%s'][%d] = '%s';\n" % (javascript_quote(k[0]), k[1], javascript_quote(v)))
+        else:
+            raise TypeError, k
+    csrc.sort()
+    for k,v in pdict.items():
+        src.append("catalog['%s'] = [%s];\n" % (javascript_quote(k), ','.join(["''"]*(v+1))))
+    src.extend(csrc)
+    src.append(LibFoot)
+    src.append(InterPolate)
+    src = ''.join(src)
+    return http.HttpResponse(src, 'text/javascript')

Added: vendor/django/current/django/views/static.py
===================================================================
--- vendor/django/current/django/views/static.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/django/views/static.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,125 @@
+from django.template import loader
+from django.http import Http404, HttpResponse, HttpResponseRedirect, HttpResponseNotModified
+from django.template import Template, Context, TemplateDoesNotExist
+import mimetypes
+import os
+import posixpath
+import re
+import rfc822
+import stat
+import urllib
+
+def serve(request, path, document_root=None, show_indexes=False):
+    """
+    Serve static files below a given point in the directory structure.
+
+    To use, put a URL pattern such as::
+
+        (r'^(?P<path>.*)$', 'django.views.static.serve', {'document_root' : '/path/to/my/files/'})
+
+    in your URLconf. You must provide the ``document_root`` param. You may
+    also set ``show_indexes`` to ``True`` if you'd like to serve a basic index
+    of the directory.  This index view will use the template hardcoded below,
+    but if you'd like to override it, you can create a template called
+    ``static/directory_index``.
+    """
+
+    # Clean up given path to only allow serving files below document_root.
+    path = posixpath.normpath(urllib.unquote(path))
+    newpath = ''
+    for part in path.split('/'):
+        if not part:
+            # strip empty path components
+            continue
+        drive, part = os.path.splitdrive(part)
+        head, part = os.path.split(part)
+        if part in (os.curdir, os.pardir):
+            # strip '.' amd '..' in path
+            continue
+        newpath = os.path.join(newpath, part).replace('\\', '/')
+    if newpath and path != newpath:
+        return HttpResponseRedirect(newpath)
+    fullpath = os.path.join(document_root, newpath)
+    if os.path.isdir(fullpath):
+        if show_indexes:
+            return directory_index(newpath, fullpath)
+        raise Http404, "Directory indexes are not allowed here."
+    if not os.path.exists(fullpath):
+        raise Http404, '"%s" does not exist' % fullpath
+    # Respect the If-Modified-Since header.
+    statobj = os.stat(fullpath)
+    if not was_modified_since(request.META.get('HTTP_IF_MODIFIED_SINCE'),
+                              statobj[stat.ST_MTIME], statobj[stat.ST_SIZE]):
+        return HttpResponseNotModified()
+    mimetype = mimetypes.guess_type(fullpath)[0]
+    contents = open(fullpath, 'rb').read()
+    response = HttpResponse(contents, mimetype=mimetype)
+    response["Last-Modified"] = rfc822.formatdate(statobj[stat.ST_MTIME])
+    return response
+
+DEFAULT_DIRECTORY_INDEX_TEMPLATE = """
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+    <meta http-equiv="Content-Language" content="en-us" />
+    <meta name="robots" content="NONE,NOARCHIVE" />
+    <title>Index of {{ directory|escape }}</title>
+  </head>
+  <body>
+    <h1>Index of {{ directory|escape }}</h1>
+    <ul>
+      {% for f in file_list %}
+      <li><a href="{{ f|urlencode }}">{{ f|escape }}</a></li>
+      {% endfor %}
+    </ul>
+  </body>
+</html>
+"""
+
+def directory_index(path, fullpath):
+    try:
+        t = loader.get_template('static/directory_index')
+    except TemplateDoesNotExist:
+        t = Template(DEFAULT_DIRECTORY_INDEX_TEMPLATE)
+    files = []
+    for f in os.listdir(fullpath):
+        if not f.startswith('.'):
+            if os.path.isdir(os.path.join(fullpath, f)):
+                f += '/'
+            files.append(f)
+    c = Context({
+        'directory' : path + '/',
+        'file_list' : files,
+    })
+    return HttpResponse(t.render(c))
+
+def was_modified_since(header=None, mtime=0, size=0):
+    """
+    Was something modified since the user last downloaded it?
+
+    header
+      This is the value of the If-Modified-Since header.  If this is None,
+      I'll just return True.
+
+    mtime
+      This is the modification time of the item we're talking about.
+
+    size
+      This is the size of the item we're talking about.
+    """
+    try:
+        if header is None:
+            raise ValueError
+        matches = re.match(r"^([^;]+)(; length=([0-9]+))?$", header,
+                           re.IGNORECASE)
+        header_mtime = rfc822.mktime_tz(rfc822.parsedate_tz(
+            matches.group(1)))
+        header_len = matches.group(3)
+        if header_len and int(header_len) != size:
+            raise ValueError
+        if mtime > header_mtime:
+            raise ValueError
+    except (AttributeError, ValueError):
+        return True
+    return False

Added: vendor/django/current/docs/add_ons.txt
===================================================================
--- vendor/django/current/docs/add_ons.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/add_ons.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,168 @@
+=====================
+The "contrib" add-ons
+=====================
+
+Django aims to follow Python's "batteries included" philosophy. It ships with a
+variety of extra, optional tools that solve common Web-development problems.
+
+This code lives in ``django/contrib`` in the Django distribution. Here's a
+rundown of the packages in ``contrib``:
+
+admin
+=====
+
+The automatic Django administrative interface. For more information, see
+`Tutorial 2`_.
+
+.. _Tutorial 2: http://www.djangoproject.com/documentation/tutorial2/
+
+auth
+====
+
+Django's authentication framework.
+
+See the `authentication documentation`_.
+
+.. _authentication documentation: http://www.djangoproject.com/documentation/authentication/
+
+comments
+========
+
+A simple yet flexible comments system. This is not yet documented.
+
+contenttypes
+============
+
+A light framework for hooking into "types" of content, where each installed
+Django model is a separate content type. This is not yet documented.
+
+csrf
+====
+
+A middleware for preventing Cross Site Request Forgeries
+
+See the `csrf documentation`_.
+
+.. _csrf documentation: http://www.djangoproject.com/documentation/csrf/
+
+humanize
+========
+
+A set of Django template filters useful for adding a "human touch" to data.
+To activate these filters, add ``'django.contrib.humanize'`` to your
+``INSTALLED_APPS`` setting. Once you've done that, use ``{% load humanize %}``
+in a template, and you'll have access to these filters:
+
+apnumber
+--------
+
+For numbers 1-9, returns the number spelled out. Otherwise, returns the
+number. This follows Associated Press style.
+
+Examples:
+
+    * ``1`` becomes ``'one'``.
+    * ``2`` becomes ``'two'``.
+    * ``10`` becomes ``10``.
+
+You can pass in either an integer or a string representation of an integer.
+
+intcomma
+--------
+
+Converts an integer to a string containing commas every three digits.
+
+Examples:
+
+    * ``4500`` becomes ``'4,500'``.
+    * ``45000`` becomes ``'45,000'``.
+    * ``450000`` becomes ``'450,000'``.
+    * ``4500000`` becomes ``'4,500,000'``.
+
+You can pass in either an integer or a string representation of an integer.
+
+intword
+-------
+
+Converts a large integer to a friendly text representation. Works best for
+numbers over 1 million.
+
+Examples:
+
+    * ``1000000`` becomes ``'1.0 million'``.
+    * ``1200000`` becomes ``'1.2 million'``.
+    * ``1200000000`` becomes ``'1.2 billion'``.
+
+Values up to 1000000000000000 (one quadrillion) are supported.
+
+You can pass in either an integer or a string representation of an integer.
+
+ordinal
+-------
+
+Converts an integer to its ordinal as a string.
+
+Examples:
+
+    * ``1`` becomes ``'1st'``.
+    * ``2`` becomes ``'2nd'``.
+    * ``3`` becomes ``'3rd'``.
+
+You can pass in either an integer or a string representation of an integer.
+
+flatpages
+=========
+
+A framework for managing simple "flat" HTML content in a database.
+
+See the `flatpages documentation`_.
+
+.. _flatpages documentation: http://www.djangoproject.com/documentation/flatpages/
+
+markup
+======
+
+A collection of template filters that implement these common markup languages:
+
+    * Textile
+    * Markdown
+    * ReST (ReStructured Text)
+
+For documentation, read the source code in django/contrib/markup/templatetags/markup.py.
+
+redirects
+=========
+
+A framework for managing redirects.
+
+See the `redirects documentation`_.
+
+.. _redirects documentation: http://www.djangoproject.com/documentation/redirects/
+
+sites
+=====
+
+A light framework that lets you operate multiple Web sites off of the same
+database and Django installation. It gives you hooks for associating objects to
+one or more sites.
+
+See the `sites documentation`_.
+
+.. _sites documentation: http://www.djangoproject.com/documentation/sites/
+
+syndication
+===========
+
+A framework for generating syndication feeds, in RSS and Atom, quite easily.
+
+See the `syndication documentation`_.
+
+.. _syndication documentation: http://www.djangoproject.com/documentation/syndication/
+
+Other add-ons
+=============
+
+If you have an idea for functionality to include in ``contrib``, let us know!
+Code it up, and post it to the `django-users mailing list`_.
+
+.. _django-users mailing list: http://groups.google.com/group/django-users

Added: vendor/django/current/docs/admin_css.txt
===================================================================
--- vendor/django/current/docs/admin_css.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/admin_css.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,173 @@
+======================================
+Customizing the Django admin interface
+======================================
+
+Django's dynamic admin interface gives you a fully-functional admin for free
+with no hand-coding required. The dynamic admin is designed to be
+production-ready, not just a starting point, so you can use it as-is on a real
+site. While the underlying format of the admin pages is built in to Django, you
+can customize the look and feel by editing the admin stylesheet and images.
+
+Here's a quick and dirty overview some of the main styles and classes used in
+the Django admin CSS.
+
+Modules
+=======
+
+The ``.module`` class is a basic building block for grouping content in the
+admin. It's generally applied to a ``div`` or a ``fieldset``. It wraps the content
+group in a box and applies certain styles to the elements within. An ``h2``
+within a ``div.module`` will align to the top of the ``div`` as a header for the
+whole group.
+
+.. image:: http://media.djangoproject.com/img/doc/admincss/module.gif
+   :alt: Example use of module class on admin homepage
+
+Column Types
+============
+
+.. admonition:: Note
+
+    All admin pages (except the dashboard) are fluid-width. All fixed-width
+    classes from previous Django versions have been removed.
+
+The base template for each admin page has a block that defines the column
+structure for the page. This sets a class on the page content area
+(``div#content``) so everything on the page knows how wide it should be. There
+are three column types available.
+
+colM
+    This is the default column setting for all pages. The "M" stands for "main".
+    Assumes that all content on the page is in one main column
+    (``div#content-main``).
+colMS
+    This is for pages with one main column and a sidebar on the right. The "S"
+    stands for "sidebar". Assumes that main content is in ``div#content-main``
+    and sidebar content is in ``div#content-related``. This is used on the main
+    admin page.
+colSM
+    Same as above, with the sidebar on the left. The source order of the columns
+    doesn't matter.
+
+For instance, you could stick this in a template to make a two-column page with
+the sidebar on the right::
+
+    {% block coltype %}colMS{% endblock %}
+
+Text Styles
+===========
+
+Font Sizes
+----------
+
+Most HTML elements (headers, lists, etc.) have base font sizes in the stylesheet
+based on context. There are three classes are available for forcing text to a
+certain size in any context.
+
+small
+    11px
+tiny
+    10px
+mini
+    9px (use sparingly)
+
+Font Styles and Alignment
+-------------------------
+
+There are also a few styles for styling text.
+
+.quiet
+    Sets font color to light gray. Good for side notes in instructions. Combine
+    with ``.small`` or ``.tiny`` for sheer excitement.
+.help
+    This is a custom class for blocks of inline help text explaining the
+    function of form elements. It makes text smaller and gray, and when applied
+    to ``p`` elements withing ``.form-row`` elements (see Form Styles below),
+    it will offset the text to align with the form field. Use this for help
+    text, instead of ``small quiet``. It works on other elements, but try to
+    put the class on a ``p`` whenever you can.
+.align-left
+    It aligns the text left. Only works on block elements containing inline
+    elements.
+.align-right
+    Are you paying attention?
+.nowrap
+    Keeps text and inline objects from wrapping. Comes in handy for table
+    headers you want to stay on one line.
+
+Floats and Clears
+-----------------
+
+float-left
+    floats left
+float-right
+    floats right
+clear
+    clears all
+
+Object Tools
+============
+
+Certain actions which apply directly to an object are used in form and
+changelist pages. These appear in a "toolbar" row above the form or changelist,
+to the right of the page. The tools are wrapped in a ``ul`` with the class
+``object-tools``. There are two custom tool types which can be defined with an
+additional class on the ``a`` for that tool. These are ``.addlink`` and
+``.viewsitelink``.
+
+Example from a changelist page::
+
+    <ul class="object-tools">
+      <li><a href="/stories/add/" class="addlink">Add redirect</a></li>
+    </ul>
+
+.. image:: http://media.djangoproject.com/img/doc/admincss/objecttools_01.gif
+   :alt: Object tools on a changelist page
+
+and from a form page::
+
+    <ul class="object-tools">
+     <li><a href="/history/303/152383/">History</a></li>
+     <li><a href="/r/303/152383/" class="viewsitelink">View on site</a></li>
+    </ul>
+
+.. image:: http://media.djangoproject.com/img/doc/admincss/objecttools_02.gif
+   :alt: Object tools on a form page
+
+Form Styles
+===========
+
+Fieldsets
+---------
+
+Admin forms are broken up into groups by ``fieldset`` elements. Each form fieldset
+should have a class ``.module``. Each fieldset should have a header ``h2`` within the
+fieldset at the top (except the first group in the form, and in some cases where the
+group of fields doesn't have a logical label).
+
+Each fieldset can also take extra classes in addition to ``.module`` to apply
+appropriate formatting to the group of fields.
+
+.aligned
+    This will align the labels and inputs side by side on the same line.
+.wide
+    Used in combination with ``.aligned`` to widen the space available for the
+    labels.
+
+Form Rows
+---------
+
+Each row of the form (within the ``fieldset``) should be enclosed in a ``div``
+with class ``form-row``. If the field in the row is required, a class of
+``required`` should also be added to the ``div.form-row``.
+
+.. image:: http://media.djangoproject.com/img/doc/admincss/formrow.gif
+   :alt: Example use of form-row class
+
+Labels
+------
+
+Form labels should always precede the field, except in the case
+of checkboxes and radio buttons, where the ``input`` should come first. Any
+explanation or help text should follow the ``label`` in a ``p`` with class
+``.help``.
\ No newline at end of file

Added: vendor/django/current/docs/apache_auth.txt
===================================================================
--- vendor/django/current/docs/apache_auth.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/apache_auth.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,71 @@
+=========================================================
+Authenticating against Django's user database from Apache
+=========================================================
+
+Since keeping multiple authentication databases in sync is a common problem when
+dealing with Apache, you can configuring Apache to authenticate against Django's
+`authentication system`_ directly.  For example, you could:
+
+    * Serve media files directly from Apache only to authenticated users.
+
+    * Authenticate access to a Subversion_ repository against Django users with
+      a certain permission.
+
+    * Allow certain users to connect to a WebDAV share created with mod_dav_.
+
+Configuring Apache
+==================
+
+To check against Django's authorization database from a Apache configuration
+file, you'll need to use mod_python's ``PythonAuthenHandler`` directive along
+with the standard ``Auth*`` and ``Require`` directives::
+
+    <Location /example/>
+        AuthType basic
+        AuthName "example.com"
+        Require valid-user
+
+        SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+        PythonAuthenHandler django.contrib.auth.handlers.modpython
+    </Location>
+
+By default, the authentication handler will limit access to the ``/example/``
+location to users marked as staff members.  You can use a set of
+``PythonOption`` directives to modify this behavior:
+
+    ================================  =========================================
+    ``PythonOption``                  Explanation
+    ================================  =========================================
+    ``DjangoRequireStaffStatus``      If set to ``on`` only "staff" users (i.e.
+                                      those with the ``is_staff`` flag set)
+                                      will be allowed.
+
+                                      Defaults to ``on``.
+
+    ``DjangoRequireSuperuserStatus``  If set to ``on`` only superusers (i.e.
+                                      those with the ``is_superuser`` flag set)
+                                      will be allowed.
+
+                                      Defaults to ``off``.
+
+    ``DjangoPermissionName``          The name of a permission to require for
+                                      access. See `custom permissions`_ for
+                                      more information.
+
+                                      By default no specific permission will be
+                                      required.
+    ================================  =========================================
+
+Note that sometimes ``SetEnv`` doesn't play well in this mod_python
+configuration, for reasons unknown. If you're having problems getting
+mod_python to recognize your ``DJANGO_SETTINGS_MODULE``, you can set it using
+``PythonOption`` instead of ``SetEnv``. Therefore, these two Apache directives
+are equivalent::
+
+    SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+    PythonOption DJANGO_SETTINGS_MODULE mysite.settings
+
+.. _authentication system: http://www.djangoproject.com/documentation/authentication/
+.. _Subversion: http://subversion.tigris.org/
+.. _mod_dav: http://httpd.apache.org/docs/2.0/mod/mod_dav.html
+.. _custom permissions: http://www.djangoproject.com/documentation/authentication/#custom-permissions

Added: vendor/django/current/docs/api_stability.txt
===================================================================
--- vendor/django/current/docs/api_stability.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/api_stability.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,123 @@
+=============
+API stability
+=============
+
+Although Django has not reached a 1.0 release, the bulk of Django's public APIs are
+stable as of the 0.95 release. This document explains which APIs will and will not
+change before the 1.0 release.
+
+What "stable" means
+===================
+
+In this context, stable means:
+
+   - All the public APIs -- everything documented in the linked documents, and
+     all methods that don't begin with an underscore -- will not be moved or
+     renamed without providing backwards-compatible aliases.
+     
+   - If new features are added to these APIs -- which is quite possible --
+     they will not break or change the meaning of existing methods. In other
+     words, "stable" does not (necessarily) mean "complete."
+     
+   - If, for some reason, an API declared stable must be removed or replaced, it
+     will be declared deprecated but will remain in the API until at least
+     version 1.1. Warnings will be issued when the deprecated method is
+     called.
+     
+   - We'll only break backwards compatibility of these APIs if a bug or
+     security hole makes it completely unavoidable.
+
+Stable APIs
+===========
+
+These APIs are stable:
+
+   - `Caching`_.
+   
+   - `Custom template tags and libraries`_ (with the possible exception for a
+     small change in the way templates are registered and loaded).
+     
+   - `Database lookup`_ (with the exception of validation; see below).
+   
+   - `django-admin utility`_.
+   
+   - `FastCGI integration`_.
+   
+   - `Flatpages`_.
+   
+   - `Generic views`_.
+   
+   - `Internationalization`_.
+   
+   - `Legacy database integration`_.
+   
+   - `Model definition`_ (with the exception of generic relations; see below).
+   
+   - `mod_python integration`_.
+   
+   - `Redirects`_.
+   
+   - `Request/response objects`_.
+   
+   - `Sending email`_.
+   
+   - `Sessions`_.
+   
+   - `Settings`_.
+   
+   - `Syndication`_.
+   
+   - `Template language`_ (with the exception of some possible disambiguation
+     of how tag arguments are passed to tags and filters).
+   
+   - `Transactions`_.
+   
+   - `URL dispatch`_.   
+   
+You'll notice that this list comprises the bulk of Django's APIs. That's right
+-- most of the changes planned between now and Django 1.0 are either under the
+hood, feature additions, or changes to a few select bits. A good estimate is
+that 90% of Django can be considered forwards-compatible at this point.
+
+That said, these APIs should *not* be considered stable, and are likely to
+change:
+
+   - `Forms and validation`_ will most likely be compeltely rewritten to
+     deemphasize Manipulators in favor of validation-aware models.
+
+   - `Serialization`_ is under heavy development; changes are likely.
+
+   - The `authentication`_ framework is changing to be far more flexible, and
+     API changes may be necessary.
+
+   - Generic relations will most likely be moved out of core and into the
+     content-types contrib package to avoid core dependacies on optional
+     components.
+
+   - The comments framework, which is yet undocumented, will likely get a complete
+     rewrite before Django 1.0. Even if the change isn't quite that drastic,
+     there will at least be moderate changes.
+     
+.. _caching: http://www.djangoproject.com/documentation/cache/
+.. _custom template tags and libraries: http://www.djangoproject.com/documentation/templates_python/
+.. _database lookup: http://www.djangoproject.com/documentation/db_api/
+.. _django-admin utility: http://www.djangoproject.com/documentation/django_admin/
+.. _fastcgi integration: http://www.djangoproject.com/documentation/fastcgi/
+.. _flatpages: http://www.djangoproject.com/documentation/flatpages/
+.. _generic views: http://www.djangoproject.com/documentation/generic_views/
+.. _internationalization: http://www.djangoproject.com/documentation/i18n/
+.. _legacy database integration: http://www.djangoproject.com/documentation/legacy_databases/
+.. _model definition: http://www.djangoproject.com/documentation/model_api/
+.. _mod_python integration: http://www.djangoproject.com/documentation/modpython/
+.. _redirects: http://www.djangoproject.com/documentation/redirects/
+.. _request/response objects: http://www.djangoproject.com/documentation/request_response/
+.. _sending email: http://www.djangoproject.com/documentation/email/
+.. _sessions: http://www.djangoproject.com/documentation/sessions/
+.. _settings: http://www.djangoproject.com/documentation/settings/
+.. _syndication: http://www.djangoproject.com/documentation/syndication/
+.. _template language: http://www.djangoproject.com/documentation/templates/
+.. _transactions: http://www.djangoproject.com/documentation/transactions/
+.. _url dispatch: http://www.djangoproject.com/documentation/url_dispatch/
+.. _forms and validation: http://www.djangoproject.com/documentation/forms/
+.. _serialization: http://www.djangoproject.com/documentation/serialization/
+.. _authentication: http://www.djangoproject.com/documentation/authentication/

Added: vendor/django/current/docs/authentication.txt
===================================================================
--- vendor/django/current/docs/authentication.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/authentication.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,830 @@
+=============================
+User authentication in Django
+=============================
+
+Django comes with a user authentication system. It handles user accounts,
+groups, permissions and cookie-based user sessions. This document explains how
+things work.
+
+Overview
+========
+
+The auth system consists of:
+
+    * Users
+    * Permissions: Binary (yes/no) flags designating whether a user may perform
+      a certain task.
+    * Groups: A generic way of applying labels and permissions to more than one
+      user.
+    * Messages: A simple way to queue messages for given users.
+
+Installation
+============
+
+Authentication support is bundled as a Django application in
+``django.contrib.auth``. To install it, do the following:
+
+    1. Put ``'django.contrib.auth'`` in your ``INSTALLED_APPS`` setting.
+    2. Run the command ``manage.py syncdb``.
+
+Note that the default ``settings.py`` file created by
+``django-admin.py startproject`` includes ``'django.contrib.auth'`` in
+``INSTALLED_APPS`` for convenience. If your ``INSTALLED_APPS`` already contains
+``'django.contrib.auth'``, feel free to run ``manage.py syncdb`` again; you
+can run that command as many times as you'd like, and each time it'll only
+install what's needed.
+
+The ``syncdb`` command creates the necessary database tables, creates
+permission objects for all installed apps that need 'em, and prompts you to
+create a superuser account the first time you run it.
+
+Once you've taken those steps, that's it.
+
+Users
+=====
+
+Users are represented by a standard Django model, which lives in
+`django/contrib/auth/models.py`_.
+
+.. _django/contrib/auth/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py
+
+API reference
+-------------
+
+Fields
+~~~~~~
+
+``User`` objects have the following fields:
+
+    * ``username`` -- Required. 30 characters or fewer. Alphanumeric characters
+      only (letters, digits and underscores).
+    * ``first_name`` -- Optional. 30 characters or fewer.
+    * ``last_name`` -- Optional. 30 characters or fewer.
+    * ``email`` -- Optional. E-mail address.
+    * ``password`` -- Required. A hash of, and metadata about, the password.
+      (Django doesn't store the raw password.) Raw passwords can be arbitrarily
+      long and can contain any character. See the "Passwords" section below.
+    * ``is_staff`` -- Boolean. Designates whether this user can access the
+      admin site.
+    * ``is_active`` -- Boolean. Designates whether this user can log into the
+      Django admin. Set this to ``False`` instead of deleting accounts.
+    * ``is_superuser`` -- Boolean. Designates that this user has all permissions
+      without explicitly assigning them.
+    * ``last_login`` -- A datetime of the user's last login. Is set to the
+      current date/time by default.
+    * ``date_joined`` -- A datetime designating when the account was created.
+      Is set to the current date/time by default when the account is created.
+
+Methods
+~~~~~~~
+
+``User`` objects have two many-to-many fields: ``groups`` and
+``user_permissions``. ``User`` objects can access their related
+objects in the same way as any other `Django model`_::
+
+    myuser.objects.groups = [group_list]
+    myuser.objects.groups.add(group, group,...)
+    myuser.objects.groups.remove(group, group,...)
+    myuser.objects.groups.clear()
+    myuser.objects.permissions = [permission_list]
+    myuser.objects.permissions.add(permission, permission, ...)
+    myuser.objects.permissions.remove(permission, permission, ...]
+    myuser.objects.permissions.clear()
+
+In addition to those automatic API methods, ``User`` objects have the following
+custom methods:
+
+    * ``is_anonymous()`` -- Always returns ``False``. This is a way of
+      differentiating ``User`` and ``AnonymousUser`` objects. Generally, you
+      should prefer using ``is_authenticated()`` to this method.
+
+    * ``is_authenticated()`` -- Always returns ``True``. This is a way to
+      tell if the user has been authenticated.
+
+    * ``get_full_name()`` -- Returns the ``first_name`` plus the ``last_name``,
+      with a space in between.
+
+    * ``set_password(raw_password)`` -- Sets the user's password to the given
+      raw string, taking care of the password hashing. Doesn't save the
+      ``User`` object.
+
+    * ``check_password(raw_password)`` -- Returns ``True`` if the given raw
+      string is the correct password for the user. (This takes care of the
+      password hashing in making the comparison.)
+
+    * ``get_group_permissions()`` -- Returns a list of permission strings that
+      the user has, through his/her groups.
+
+    * ``get_all_permissions()`` -- Returns a list of permission strings that
+      the user has, both through group and user permissions.
+
+    * ``has_perm(perm)`` -- Returns ``True`` if the user has the specified
+      permission, where perm is in the format ``"package.codename"``.
+
+    * ``has_perms(perm_list)`` -- Returns ``True`` if the user has each of the
+      specified permissions, where each perm is in the format
+      ``"package.codename"``.
+
+    * ``has_module_perms(package_name)`` -- Returns ``True`` if the user has
+      any permissions in the given package (the Django app label).
+
+    * ``get_and_delete_messages()`` -- Returns a list of ``Message`` objects in
+      the user's queue and deletes the messages from the queue.
+
+    * ``email_user(subject, message, from_email=None)`` -- Sends an e-mail to
+      the user. If ``from_email`` is ``None``, Django uses the
+      `DEFAULT_FROM_EMAIL`_ setting.
+
+    * ``get_profile()`` -- Returns a site-specific profile for this user.
+      Raises ``django.contrib.auth.models.SiteProfileNotAvailable`` if the current site
+      doesn't allow profiles.
+
+.. _Django model: http://www.djangoproject.com/documentation/model_api/
+.. _DEFAULT_FROM_EMAIL: http://www.djangoproject.com/documentation/settings/#default-from-email
+
+Manager functions
+~~~~~~~~~~~~~~~~~
+
+The ``User`` model has a custom manager that has the following helper functions:
+
+    * ``create_user(username, email, password)`` -- Creates, saves and returns
+      a ``User``. The ``username``, ``email`` and ``password`` are set as
+      given, and the ``User`` gets ``is_active=True``.
+
+      See _`Creating users` for example usage.
+
+    * ``make_random_password(length=10, allowed_chars='abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789')``
+      Returns a random password with the given length and given string of
+      allowed characters. (Note that the default value of ``allowed_chars``
+      doesn't contain ``"I"`` or letters that look like it, to avoid user
+      confusion.
+
+Basic usage
+-----------
+
+Creating users
+~~~~~~~~~~~~~~
+
+The most basic way to create users is to use the ``create_user`` helper
+function that comes with Django::
+
+    >>> from django.contrib.auth.models import User
+    >>> user = User.objects.create_user('john', 'lennon at thebeatles.com', 'johnpassword')
+
+    # At this point, user is a User object ready to be saved
+    # to the database. You can continue to change its attributes
+    # if you want to change other fields.
+    >>> user.is_staff = True
+    >>> user.save()
+
+Changing passwords
+~~~~~~~~~~~~~~~~~~
+
+Change a password with ``set_password()``::
+
+    >>> from django.contrib.auth.models import User
+    >>> u = User.objects.get(username__exact='john')
+    >>> u.set_password('new password')
+    >>> u.save()
+
+Don't set the ``password`` attribute directly unless you know what you're
+doing. This is explained in the next section.
+
+Passwords
+---------
+
+The ``password`` attribute of a ``User`` object is a string in this format::
+
+    hashtype$salt$hash
+
+That's hashtype, salt and hash, separated by the dollar-sign character.
+
+Hashtype is either ``sha1`` (default) or ``md5`` -- the algorithm used to
+perform a one-way hash of the password. Salt is a random string used to salt
+the raw password to create the hash.
+
+For example::
+
+    sha1$a1976$a36cc8cbf81742a8fb52e221aaeab48ed7f58ab4
+
+The ``User.set_password()`` and ``User.check_password()`` functions handle
+the setting and checking of these values behind the scenes.
+
+Previous Django versions, such as 0.90, used simple MD5 hashes without password
+salts. For backwards compatibility, those are still supported; they'll be
+converted automatically to the new style the first time ``check_password()``
+works correctly for a given user.
+
+Anonymous users
+---------------
+
+``django.contrib.auth.models.AnonymousUser`` is a class that implements
+the ``django.contrib.auth.models.User`` interface, with these differences:
+
+    * ``id`` is always ``None``.
+    * ``is_anonymous()`` returns ``True`` instead of ``False``.
+    * ``is_authenticated()`` returns ``False`` instead of ``True``.
+    * ``has_perm()`` always returns ``False``.
+    * ``set_password()``, ``check_password()``, ``save()``, ``delete()``,
+      ``set_groups()`` and ``set_permissions()`` raise ``NotImplementedError``.
+
+In practice, you probably won't need to use ``AnonymousUser`` objects on your
+own, but they're used by Web requests, as explained in the next section.
+
+Creating superusers
+-------------------
+
+``manage.py syncdb`` prompts you to create a superuser the first time you run
+it after adding ``'django.contrib.auth'`` to your ``INSTALLED_APPS``. But if
+you need to create a superuser after that via the command line, you can use the
+``create_superuser.py`` utility. Just run this command::
+
+    python /path/to/django/contrib/auth/create_superuser.py
+
+Make sure to substitute ``/path/to/`` with the path to the Django codebase on
+your filesystem.
+
+Authentication in Web requests
+==============================
+
+Until now, this document has dealt with the low-level APIs for manipulating
+authentication-related objects. On a higher level, Django can hook this
+authentication framework into its system of `request objects`_.
+
+First, install the ``SessionMiddleware`` and ``AuthenticationMiddleware``
+middlewares by adding them to your ``MIDDLEWARE_CLASSES`` setting. See the
+`session documentation`_ for more information.
+
+Once you have those middlewares installed, you'll be able to access
+``request.user`` in views. ``request.user`` will give you a ``User`` object
+representing the currently logged-in user. If a user isn't currently logged in,
+``request.user`` will be set to an instance of ``AnonymousUser`` (see the
+previous section). You can tell them apart with ``is_authenticated()``, like so::
+
+    if request.user.is_authenticated():
+        # Do something for authenticated users.
+    else:
+        # Do something for anonymous users.
+
+.. _request objects: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
+.. _session documentation: http://www.djangoproject.com/documentation/sessions/
+
+How to log a user in
+--------------------
+
+Django provides two functions in ``django.contrib.auth``: ``authenticate()``
+and ``login()``.
+
+To authenticate a given username and password, use ``authenticate()``. It
+takes two keyword arguments, ``username`` and ``password``, and it returns
+a ``User`` object if the password is valid for the given username. If the
+password is invalid, ``authenticate()`` returns ``None``. Example::
+
+    from django.contrib.auth import authenticate
+    user = authenticate(username='john', password='secret')
+    if user is not None:
+        print "You provided a correct username and password!"
+    else:
+        print "Your username and password were incorrect."
+
+To log a user in, in a view, use ``login()``. It takes an ``HttpRequest``
+object and a ``User`` object. ``login()`` saves the user's ID in the session,
+using Django's session framework, so, as mentioned above, you'll need to make
+sure to have the session middleware installed.
+
+This example shows how you might use both ``authenticate()`` and ``login()``::
+
+    from django.contrib.auth import authenticate, login
+
+    def my_view(request):
+        username = request.POST['username']
+        password = request.POST['password']
+        user = authenticate(username=username, password=password)
+        if user is not None:
+            login(request, user)
+            # Redirect to a success page.
+        else:
+            # Return an error message.
+
+How to log a user out
+---------------------
+
+To log out a user who has been logged in via ``django.contrib.auth.login()``,
+use ``django.contrib.auth.logout()`` within your view. It takes an
+``HttpRequest`` object and has no return value. Example::
+
+    from django.contrib.auth import logout
+
+    def logout_view(request):
+        logout(request)
+        # Redirect to a success page.
+
+Note that ``logout()`` doesn't throw any errors if the user wasn't logged in.
+
+Limiting access to logged-in users
+----------------------------------
+
+The raw way
+~~~~~~~~~~~
+
+The simple, raw way to limit access to pages is to check
+``request.user.is_authenticated()`` and either redirect to a login page::
+
+    from django.http import HttpResponseRedirect
+
+    def my_view(request):
+        if not request.user.is_authenticated():
+            return HttpResponseRedirect('/login/?next=%s' % request.path)
+        # ...
+
+...or display an error message::
+
+    def my_view(request):
+        if not request.user.is_authenticated():
+            return render_to_response('myapp/login_error.html')
+        # ...
+
+The login_required decorator
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+As a shortcut, you can use the convenient ``login_required`` decorator::
+
+    from django.contrib.auth.decorators import login_required
+
+    def my_view(request):
+        # ...
+    my_view = login_required(my_view)
+
+Here's an equivalent example, using the more compact decorator syntax
+introduced in Python 2.4::
+
+    from django.contrib.auth.decorators import login_required
+
+    @login_required
+    def my_view(request):
+        # ...
+
+``login_required`` does the following:
+
+    * If the user isn't logged in, redirect to ``/accounts/login/``, passing
+      the current absolute URL in the query string as ``next``. For example:
+      ``/accounts/login/?next=/polls/3/``.
+    * If the user is logged in, execute the view normally. The view code is
+      free to assume the user is logged in.
+
+Note that you'll need to map the appropriate Django view to ``/accounts/login/``.
+To do this, add the following line to your URLconf::
+
+    (r'^accounts/login/$', 'django.contrib.auth.views.login'),
+
+Here's what ``django.contrib.auth.views.login`` does::
+
+    * If called via ``GET``, it displays a login form that POSTs to the same
+      URL. More on this in a bit.
+
+    * If called via ``POST``, it tries to log the user in. If login is
+      successful, the view redirects to the URL specified in ``next``. If
+      ``next`` isn't provided, it redirects to ``/accounts/profile/`` (which is
+      currently hard-coded). If login isn't successful, it redisplays the login
+      form.
+
+It's your responsibility to provide the login form in a template called
+``registration/login.html`` by default. This template gets passed three
+template context variables:
+
+    * ``form``: A ``FormWrapper`` object representing the login form. See the
+      `forms documentation`_ for more on ``FormWrapper`` objects.
+    * ``next``: The URL to redirect to after successful login. This may contain
+      a query string, too.
+    * ``site_name``: The name of the current ``Site``, according to the
+      ``SITE_ID`` setting. See the `site framework docs`_.
+
+If you'd prefer not to call the template ``registration/login.html``, you can
+pass the ``template_name`` parameter via the extra arguments to the view in
+your URLconf. For example, this URLconf line would use ``myapp/login.html``
+instead::
+
+    (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'myapp/login.html'}),
+
+Here's a sample ``registration/login.html`` template you can use as a starting
+point. It assumes you have a ``base.html`` template that defines a ``content``
+block::
+
+    {% extends "base.html" %}
+
+    {% block content %}
+
+    {% if form.has_errors %}
+    <p>Your username and password didn't match. Please try again.</p>
+    {% endif %}
+
+    <form method="post" action=".">
+    <table>
+    <tr><td><label for="id_username">Username:</label></td><td>{{ form.username }}</td></tr>
+    <tr><td><label for="id_password">Password:</label></td><td>{{ form.password }}</td></tr>
+    </table>
+
+    <input type="submit" value="login" />
+    <input type="hidden" name="next" value="{{ next }}" />
+    </form>
+
+    {% endblock %}
+
+.. _forms documentation: http://www.djangoproject.com/documentation/forms/
+.. _site framework docs: http://www.djangoproject.com/documentation/sites/
+
+Limiting access to logged-in users that pass a test
+---------------------------------------------------
+
+To limit access based on certain permissions or some other test, you'd do
+essentially the same thing as described in the previous section.
+
+The simple way is to run your test on ``request.user`` in the view directly.
+For example, this view checks to make sure the user is logged in and has the
+permission ``polls.can_vote``::
+
+    def my_view(request):
+        if not (request.user.is_authenticated() and request.user.has_perm('polls.can_vote')):
+            return HttpResponse("You can't vote in this poll.")
+        # ...
+
+As a shortcut, you can use the convenient ``user_passes_test`` decorator::
+
+    from django.contrib.auth.decorators import user_passes_test
+
+    def my_view(request):
+        # ...
+    my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'))(my_view)
+
+Here's the same thing, using Python 2.4's decorator syntax::
+
+    from django.contrib.auth.decorators import user_passes_test
+
+    @user_passes_test(lambda u: u.has_perm('polls.can_vote'))
+    def my_view(request):
+        # ...
+
+``user_passes_test`` takes a required argument: a callable that takes a
+``User`` object and returns ``True`` if the user is allowed to view the page.
+Note that ``user_passes_test`` does not automatically check that the ``User``
+is not anonymous.
+
+``user_passes_test()`` takes an optional ``login_url`` argument, which lets you
+specify the URL for your login page (``/accounts/login/`` by default).
+
+Example in Python 2.3 syntax::
+
+    from django.contrib.auth.decorators import user_passes_test
+
+    def my_view(request):
+        # ...
+    my_view = user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')(my_view)
+
+Example in Python 2.4 syntax::
+
+    from django.contrib.auth.decorators import user_passes_test
+
+    @user_passes_test(lambda u: u.has_perm('polls.can_vote'), login_url='/login/')
+    def my_view(request):
+        # ...
+
+Limiting access to generic views
+--------------------------------
+
+To limit access to a `generic view`_, write a thin wrapper around the view,
+and point your URLconf to your wrapper instead of the generic view itself.
+For example::
+
+    from django.views.generic.date_based import object_detail
+
+    @login_required
+    def limited_object_detail(*args, **kwargs):
+        return object_detail(*args, **kwargs)
+
+.. _generic view: http://www.djangoproject.com/documentation/generic_views/
+
+Permissions
+===========
+
+Django comes with a simple permissions system. It provides a way to assign
+permissions to specific users and groups of users.
+
+It's used by the Django admin site, but you're welcome to use it in your own
+code.
+
+The Django admin site uses permissions as follows:
+
+    * Access to view the "add" form and add an object is limited to users with
+      the "add" permission for that type of object.
+    * Access to view the change list, view the "change" form and change an
+      object is limited to users with the "change" permission for that type of
+      object.
+    * Access to delete an object is limited to users with the "delete"
+      permission for that type of object.
+
+Permissions are set globally per type of object, not per specific object
+instance. For example, it's possible to say "Mary may change news stories," but
+it's not currently possible to say "Mary may change news stories, but only the
+ones she created herself" or "Mary may only change news stories that have a
+certain status, publication date or ID." The latter functionality is something
+Django developers are currently discussing.
+
+Default permissions
+-------------------
+
+Three basic permissions -- add, create and delete -- are automatically created
+for each Django model that has a ``class Admin`` set. Behind the scenes, these
+permissions are added to the ``auth_permission`` database table when you run
+``manage.py syncdb``.
+
+Note that if your model doesn't have ``class Admin`` set when you run
+``syncdb``, the permissions won't be created. If you initialize your database
+and add ``class Admin`` to models after the fact, you'll need to run
+``manage.py syncdb`` again. It will create any missing permissions for
+all of your installed apps.
+
+Custom permissions
+------------------
+
+To create custom permissions for a given model object, use the ``permissions``
+`model Meta attribute`_.
+
+This example model creates three custom permissions::
+
+    class USCitizen(models.Model):
+        # ...
+        class Meta:
+            permissions = (
+                ("can_drive", "Can drive"),
+                ("can_vote", "Can vote in elections"),
+                ("can_drink", "Can drink alcohol"),
+            )
+
+The only thing this does is create those extra permissions when you run
+``syncdb``.
+
+.. _model Meta attribute: http://www.djangoproject.com/documentation/model_api/#meta-options
+
+API reference
+-------------
+
+Just like users, permissions are implemented in a Django model that lives in
+`django/contrib/auth/models.py`_.
+
+.. _django/contrib/auth/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/auth/models.py
+
+Fields
+~~~~~~
+
+``Permission`` objects have the following fields:
+
+    * ``name`` -- Required. 50 characters or fewer. Example: ``'Can vote'``.
+    * ``content_type`` -- Required. A reference to the ``django_content_type``
+      database table, which contains a record for each installed Django model.
+    * ``codename`` -- Required. 100 characters or fewer. Example: ``'can_vote'``.
+
+Methods
+~~~~~~~
+
+``Permission`` objects have the standard data-access methods like any other
+`Django model`_.
+
+Authentication data in templates
+================================
+
+The currently logged-in user and his/her permissions are made available in the
+`template context`_ when you use ``RequestContext``.
+
+.. admonition:: Technicality
+
+   Technically, these variables are only made available in the template context
+   if you use ``RequestContext`` *and* your ``TEMPLATE_CONTEXT_PROCESSORS``
+   setting contains ``"django.core.context_processors.auth"``, which is default.
+   For more, see the `RequestContext docs`_.
+
+   .. _RequestContext docs: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-requestcontext
+
+Users
+-----
+
+The currently logged-in user, either a ``User`` instance or an``AnonymousUser``
+instance, is stored in the template variable ``{{ user }}``::
+
+    {% if user.is_authenticated %}
+        <p>Welcome, {{ user.username }}. Thanks for logging in.</p>    
+    {% else %}
+        <p>Welcome, new user. Please log in.</p>
+    {% endif %}
+
+Permissions
+-----------
+
+The currently logged-in user's permissions are stored in the template variable
+``{{ perms }}``. This is an instance of ``django.core.context_processors.PermWrapper``,
+which is a template-friendly proxy of permissions.
+
+In the ``{{ perms }}`` object, single-attribute lookup is a proxy to
+``User.has_module_perms``. This example would display ``True`` if the logged-in
+user had any permissions in the ``foo`` app::
+
+    {{ perms.foo }}
+
+Two-level-attribute lookup is a proxy to ``User.has_perm``. This example would
+display ``True`` if the logged-in user had the permission ``foo.can_vote``::
+
+    {{ perms.foo.can_vote }}
+
+Thus, you can check permissions in template ``{% if %}`` statements::
+
+    {% if perms.foo %}
+        <p>You have permission to do something in the foo app.</p>
+        {% if perms.foo.can_vote %}
+            <p>You can vote!</p>
+        {% endif %}
+        {% if perms.foo.can_drive %}
+            <p>You can drive!</p>
+        {% endif %}
+    {% else %}
+        <p>You don't have permission to do anything in the foo app.</p>
+    {% endif %}
+
+.. _template context: http://www.djangoproject.com/documentation/templates_python/
+
+Groups
+======
+
+Groups are a generic way of categorizing users so you can apply permissions, or
+some other label, to those users. A user can belong to any number of groups.
+
+A user in a group automatically has the permissions granted to that group. For
+example, if the group ``Site editors`` has the permission
+``can_edit_home_page``, any user in that group will have that permission.
+
+Beyond permissions, groups are a convenient way to categorize users to give
+them some label, or extended functionality. For example, you could create a
+group ``'Special users'``, and you could write code that could, say, give them
+access to a members-only portion of your site, or send them members-only e-mail
+messages.
+
+Messages
+========
+
+The message system is a lightweight way to queue messages for given users.
+
+A message is associated with a ``User``. There's no concept of expiration or
+timestamps.
+
+Messages are used by the Django admin after successful actions. For example,
+``"The poll Foo was created successfully."`` is a message.
+
+The API is simple::
+
+    * To create a new message, use
+      ``user_obj.message_set.create(message='message_text')``.
+    * To retrieve/delete messages, use ``user_obj.get_and_delete_messages()``,
+      which returns a list of ``Message`` objects in the user's queue (if any)
+      and deletes the messages from the queue.
+
+In this example view, the system saves a message for the user after creating
+a playlist::
+
+    def create_playlist(request, songs):
+        # Create the playlist with the given songs.
+        # ...
+        request.user.message_set.create(message="Your playlist was added successfully.")
+        return render_to_response("playlists/create.html",
+            context_instance=RequestContext(request))
+
+When you use ``RequestContext``, the currently logged-in user and his/her
+messages are made available in the `template context`_ as the template variable
+``{{ messages }}``. Here's an example of template code that displays messages::
+
+    {% if messages %}
+    <ul>
+        {% for message in messages %}
+        <li>{{ message.message }}</li>
+        {% endfor %}
+    </ul>
+    {% endif %}
+
+Note that ``RequestContext`` calls ``get_and_delete_messages`` behind the
+scenes, so any messages will be deleted even if you don't display them.
+
+Finally, note that this messages framework only works with users in the user
+database. To send messages to anonymous users, use the `session framework`_.
+
+.. _session framework: http://www.djangoproject.com/documentation/sessions/
+
+Other authentication sources
+============================
+
+The authentication that comes with Django is good enough for most common cases,
+but you may have the need to hook into another authentication source -- that
+is, another source of usernames and passwords or authentication methods.
+
+For example, your company may already have an LDAP setup that stores a username
+and password for every employee. It'd be a hassle for both the network
+administrator and the users themselves if users had separate accounts in LDAP
+and the Django-based applications.
+
+So, to handle situations like this, the Django authentication system lets you
+plug in another authentication sources. You can override Django's default
+database-based scheme, or you can use the default system in tandem with other
+systems.
+
+Specifying authentication backends
+----------------------------------
+
+Behind the scenes, Django maintains a list of "authentication backends" that it
+checks for authentication. When somebody calls
+``django.contrib.auth.authenticate()`` -- as described in "How to log a user in"
+above -- Django tries authenticating across all of its authentication backends.
+If the first authentication method fails, Django tries the second one, and so
+on, until all backends have been attempted.
+
+The list of authentication backends to use is specified in the
+``AUTHENTICATION_BACKENDS`` setting. This should be a tuple of Python path
+names that point to Python classes that know how to authenticate. These classes
+can be anywhere on your Python path.
+
+By default, ``AUTHENTICATION_BACKENDS`` is set to::
+
+    ('django.contrib.auth.backends.ModelBackend',)
+
+That's the basic authentication scheme that checks the Django users database.
+
+The order of ``AUTHENTICATION_BACKENDS`` matters, so if the same username and
+password is valid in multiple backends, Django will stop processing at the
+first positive match.
+
+Writing an authentication backend
+---------------------------------
+
+An authentication backend is a class that implements two methods:
+``get_user(id)`` and ``authenticate(**credentials)``.
+
+The ``get_user`` method takes an ``id`` -- which could be a username, database
+ID or whatever -- and returns a ``User`` object.
+
+The  ``authenticate`` method takes credentials as keyword arguments. Most of
+the time, it'll just look like this::
+
+    class MyBackend:
+        def authenticate(username=None, password=None):
+            # Check the username/password and return a User.
+
+But it could also authenticate a token, like so::
+
+    class MyBackend:
+        def authenticate(token=None):
+            # Check the token and return a User.
+
+Either way, ``authenticate`` should check the credentials it gets, and it
+should return a ``User`` object that matches those credentials, if the
+credentials are valid. If they're not valid, it should return ``None``.
+
+The Django admin system is tightly coupled to the Django ``User`` object
+described at the beginning of this document. For now, the best way to deal with
+this is to create a Django ``User`` object for each user that exists for your
+backend (e.g., in your LDAP directory, your external SQL database, etc.) You
+can either write a script to do this in advance, or your ``authenticate``
+method can do it the first time a user logs in.
+
+Here's an example backend that authenticates against a username and password
+variable defined in your ``settings.py`` file and creates a Django ``User``
+object the first time a user authenticates::
+
+    from django.conf import settings
+    from django.contrib.auth.models import User, check_password
+
+    class SettingsBackend:
+        """
+        Authenticate against the settings ADMIN_LOGIN and ADMIN_PASSWORD.
+
+        Use the login name, and a hash of the password. For example:
+
+        ADMIN_LOGIN = 'admin'
+        ADMIN_PASSWORD = 'sha1$4e987$afbcf42e21bd417fb71db8c66b321e9fc33051de'
+        """
+        def authenticate(self, username=None, password=None):
+            login_valid = (settings.ADMIN_LOGIN == username)
+            pwd_valid = check_password(password, settings.ADMIN_PASSWORD)
+            if login_valid and pwd_valid:
+                try:
+                    user = User.objects.get(username=username)
+                except User.DoesNotExist:
+                    # Create a new user. Note that we can set password
+                    # to anything, because it won't be checked; the password
+                    # from settings.py will.
+                    user = User(username=username, password='get from settings.py')
+                    user.is_staff = True
+                    user.is_superuser = True
+                    user.save()
+                return user
+            return None
+
+        def get_user(self, user_id):
+            try:
+                return User.objects.get(pk=user_id)
+            except User.DoesNotExist:
+                return None

Added: vendor/django/current/docs/cache.txt
===================================================================
--- vendor/django/current/docs/cache.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/cache.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,540 @@
+========================
+Django's cache framework
+========================
+
+A fundamental tradeoff in dynamic Web sites is, well, they're dynamic. Each
+time a user requests a page, the Web server makes all sorts of calculations --
+from database queries to template rendering to business logic -- to create the
+page that your site's visitor sees. This is a lot more expensive, from a
+processing-overhead perspective, than your standard read-a-file-off-the-filesystem
+server arrangement.
+
+For most Web applications, this overhead isn't a big deal. Most Web
+applications aren't washingtonpost.com or slashdot.org; they're simply small-
+to medium-sized sites with so-so traffic. But for medium- to high-traffic
+sites, it's essential to cut as much overhead as possible.
+
+That's where caching comes in.
+
+To cache something is to save the result of an expensive calculation so that
+you don't have to perform the calculation next time. Here's some pseudocode
+explaining how this would work for a dynamically generated Web page::
+
+    given a URL, try finding that page in the cache
+    if the page is in the cache:
+        return the cached page
+    else:
+        generate the page
+        save the generated page in the cache (for next time)
+        return the generated page
+
+Django comes with a robust cache system that lets you save dynamic pages so
+they don't have to be calculated for each request. For convenience, Django
+offers different levels of cache granularity: You can cache the output of
+specific views, you can cache only the pieces that are difficult to produce, or
+you can cache your entire site.
+
+Django also works well with "upstream" caches, such as Squid
+(http://www.squid-cache.org/) and browser-based caches. These are the types of
+caches that you don't directly control but to which you can provide hints (via
+HTTP headers) about which parts of your site should be cached, and how.
+
+Setting up the cache
+====================
+
+The cache system requires a small amount of setup. Namely, you have to tell it
+where your cached data should live -- whether in a database, on the filesystem
+or directly in memory. This is an important decision that affects your cache's
+performance; yes, some cache types are faster than others.
+
+Your cache preference goes in the ``CACHE_BACKEND`` setting in your settings
+file. Here's an explanation of all available values for CACHE_BACKEND.
+
+Memcached
+---------
+
+By far the fastest, most efficient type of cache available to Django, Memcached
+is an entirely memory-based cache framework originally developed to handle high
+loads at LiveJournal.com and subsequently open-sourced by Danga Interactive.
+It's used by sites such as Slashdot and Wikipedia to reduce database access and
+dramatically increase site performance.
+
+Memcached is available for free at http://danga.com/memcached/ . It runs as a
+daemon and is allotted a specified amount of RAM. All it does is provide an
+interface -- a *super-lightning-fast* interface -- for adding, retrieving and
+deleting arbitrary data in the cache. All data is stored directly in memory,
+so there's no overhead of database or filesystem usage.
+
+After installing Memcached itself, you'll need to install the Memcached Python
+bindings. They're in a single Python module, memcache.py, available at
+ftp://ftp.tummy.com/pub/python-memcached/ . If that URL is no longer valid,
+just go to the Memcached Web site (http://www.danga.com/memcached/) and get the
+Python bindings from the "Client APIs" section.
+
+To use Memcached with Django, set ``CACHE_BACKEND`` to
+``memcached://ip:port/``, where ``ip`` is the IP address of the Memcached
+daemon and ``port`` is the port on which Memcached is running.
+
+In this example, Memcached is running on localhost (127.0.0.1) port 11211::
+
+    CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
+
+One excellent feature of Memcached is its ability to share cache over multiple
+servers. To take advantage of this feature, include all server addresses in
+``CACHE_BACKEND``, separated by semicolons. In this example, the cache is
+shared over Memcached instances running on IP address 172.19.26.240 and
+172.19.26.242, both on port 11211::
+
+    CACHE_BACKEND = 'memcached://172.19.26.240:11211;172.19.26.242:11211/'
+
+Memory-based caching has one disadvantage: Because the cached data is stored in
+memory, the data will be lost if your server crashes. Clearly, memory isn't
+intended for permanent data storage, so don't rely on memory-based caching as
+your only data storage. Actually, none of the Django caching backends should be
+used for permanent storage -- they're all intended to be solutions for caching,
+not storage -- but we point this out here because memory-based caching is
+particularly temporary.
+
+Database caching
+----------------
+
+To use a database table as your cache backend, first create a cache table in
+your database by running this command::
+
+    python manage.py createcachetable [cache_table_name]
+
+...where ``[cache_table_name]`` is the name of the database table to create.
+(This name can be whatever you want, as long as it's a valid table name that's
+not already being used in your database.) This command creates a single table
+in your database that is in the proper format that Django's database-cache
+system expects.
+
+Once you've created that database table, set your ``CACHE_BACKEND`` setting to
+``"db://tablename/"``, where ``tablename`` is the name of the database table.
+In this example, the cache table's name is ``my_cache_table``:
+
+    CACHE_BACKEND = 'db://my_cache_table'
+
+Database caching works best if you've got a fast, well-indexed database server.
+
+Filesystem caching
+------------------
+
+To store cached items on a filesystem, use the ``"file://"`` cache type for
+``CACHE_BACKEND``. For example, to store cached data in ``/var/tmp/django_cache``,
+use this setting::
+
+    CACHE_BACKEND = 'file:///var/tmp/django_cache'
+
+Note that there are three forward slashes toward the beginning of that example.
+The first two are for ``file://``, and the third is the first character of the
+directory path, ``/var/tmp/django_cache``.
+
+The directory path should be absolute -- that is, it should start at the root
+of your filesystem. It doesn't matter whether you put a slash at the end of the
+setting.
+
+Make sure the directory pointed-to by this setting exists and is readable and
+writable by the system user under which your Web server runs. Continuing the
+above example, if your server runs as the user ``apache``, make sure the
+directory ``/var/tmp/django_cache`` exists and is readable and writable by the
+user ``apache``.
+
+Local-memory caching
+--------------------
+
+If you want the speed advantages of in-memory caching but don't have the
+capability of running Memcached, consider the local-memory cache backend. This
+cache is multi-process and thread-safe. To use it, set ``CACHE_BACKEND`` to
+``"locmem:///"``. For example::
+
+    CACHE_BACKEND = 'locmem:///'
+
+Simple caching (for development)
+--------------------------------
+
+A simple, single-process memory cache is available as ``"simple:///"``. This
+merely saves cached data in-process, which means it should only be used in
+development or testing environments. For example::
+
+    CACHE_BACKEND = 'simple:///'
+
+Dummy caching (for development)
+-------------------------------
+
+Finally, Django comes with a "dummy" cache that doesn't actually cache -- it
+just implements the cache interface without doing anything.
+
+This is useful if you have a production site that uses heavy-duty caching in
+various places but a development/test environment on which you don't want to
+cache. In that case, set ``CACHE_BACKEND`` to ``"dummy:///"`` in the settings
+file for your development environment. As a result, your development
+environment won't use caching and your production environment still will.
+
+CACHE_BACKEND arguments
+-----------------------
+
+All caches may take arguments. They're given in query-string style on the
+``CACHE_BACKEND`` setting. Valid arguments are:
+
+    timeout
+        Default timeout, in seconds, to use for the cache. Defaults to 5
+        minutes (300 seconds).
+
+    max_entries
+        For the simple and database backends, the maximum number of entries
+        allowed in the cache before it is cleaned. Defaults to 300.
+
+    cull_percentage
+        The percentage of entries that are culled when max_entries is reached.
+        The actual percentage is 1/cull_percentage, so set cull_percentage=3 to
+        cull 1/3 of the entries when max_entries is reached.
+
+        A value of 0 for cull_percentage means that the entire cache will be
+        dumped when max_entries is reached. This makes culling *much* faster
+        at the expense of more cache misses.
+
+In this example, ``timeout`` is set to ``60``::
+
+    CACHE_BACKEND = "memcached://127.0.0.1:11211/?timeout=60"
+
+In this example, ``timeout`` is ``30`` and ``max_entries`` is ``400``::
+
+    CACHE_BACKEND = "memcached://127.0.0.1:11211/?timeout=30&max_entries=400"
+
+Invalid arguments are silently ignored, as are invalid values of known
+arguments.
+
+The per-site cache
+==================
+
+Once the cache is set up, the simplest way to use caching is to cache your
+entire site. Just add ``'django.middleware.cache.CacheMiddleware'`` to your
+``MIDDLEWARE_CLASSES`` setting, as in this example::
+
+    MIDDLEWARE_CLASSES = (
+        'django.middleware.cache.CacheMiddleware',
+        'django.middleware.common.CommonMiddleware',
+    )
+
+(The order of ``MIDDLEWARE_CLASSES`` matters. See "Order of MIDDLEWARE_CLASSES"
+below.)
+
+Then, add the following required settings to your Django settings file:
+
+* ``CACHE_MIDDLEWARE_SECONDS`` -- The number of seconds each page should be
+  cached.
+* ``CACHE_MIDDLEWARE_KEY_PREFIX`` -- If the cache is shared across multiple
+  sites using the same Django installation, set this to the name of the site,
+  or some other string that is unique to this Django instance, to prevent key
+  collisions. Use an empty string if you don't care.
+
+The cache middleware caches every page that doesn't have GET or POST
+parameters. Optionally, if the ``CACHE_MIDDLEWARE_ANONYMOUS_ONLY`` setting is
+``True``, only anonymous requests (i.e., not those made by a logged-in user)
+will be cached. This is a simple and effective way of disabling caching for any
+user-specific pages (include Django's admin interface).
+
+Additionally, ``CacheMiddleware`` automatically sets a few headers in each
+``HttpResponse``:
+
+* Sets the ``Last-Modified`` header to the current date/time when a fresh
+  (uncached) version of the page is requested.
+* Sets the ``Expires`` header to the current date/time plus the defined
+  ``CACHE_MIDDLEWARE_SECONDS``.
+* Sets the ``Cache-Control`` header to give a max age for the page -- again,
+  from the ``CACHE_MIDDLEWARE_SECONDS`` setting.
+
+See the `middleware documentation`_ for more on middleware.
+
+.. _`middleware documentation`: http://www.djangoproject.com/documentation/middleware/
+
+The per-view cache
+==================
+
+A more granular way to use the caching framework is by caching the output of
+individual views. ``django.views.decorators.cache`` defines a ``cache_page``
+decorator that will automatically cache the view's response for you. It's easy
+to use::
+
+    from django.views.decorators.cache import cache_page
+
+    def slashdot_this(request):
+        ...
+
+    slashdot_this = cache_page(slashdot_this, 60 * 15)
+
+Or, using Python 2.4's decorator syntax::
+
+    @cache_page(60 * 15)
+    def slashdot_this(request):
+        ...
+
+``cache_page`` takes a single argument: the cache timeout, in seconds. In the
+above example, the result of the ``slashdot_this()`` view will be cached for 15
+minutes.
+
+The low-level cache API
+=======================
+
+Sometimes, however, caching an entire rendered page doesn't gain you very much.
+For example, you may find it's only necessary to cache the result of an
+intensive database query. In cases like this, you can use the low-level cache
+API to store objects in the cache with any level of granularity you like.
+
+The cache API is simple. The cache module, ``django.core.cache``, exports a
+``cache`` object that's automatically created from the ``CACHE_BACKEND``
+setting::
+
+    >>> from django.core.cache import cache
+
+The basic interface is ``set(key, value, timeout_seconds)`` and ``get(key)``::
+
+    >>> cache.set('my_key', 'hello, world!', 30)
+    >>> cache.get('my_key')
+    'hello, world!'
+
+The ``timeout_seconds`` argument is optional and defaults to the ``timeout``
+argument in the ``CACHE_BACKEND`` setting (explained above).
+
+If the object doesn't exist in the cache, ``cache.get()`` returns ``None``::
+
+    >>> cache.get('some_other_key')
+    None
+
+    # Wait 30 seconds for 'my_key' to expire...
+
+    >>> cache.get('my_key')
+    None
+
+get() can take a ``default`` argument::
+
+    >>> cache.get('my_key', 'has expired')
+    'has expired'
+
+There's also a get_many() interface that only hits the cache once. get_many()
+returns a dictionary with all the keys you asked for that actually exist in the
+cache (and haven't expired)::
+
+    >>> cache.set('a', 1)
+    >>> cache.set('b', 2)
+    >>> cache.set('c', 3)
+    >>> cache.get_many(['a', 'b', 'c'])
+    {'a': 1, 'b': 2, 'c': 3}
+
+Finally, you can delete keys explicitly with ``delete()``. This is an easy way
+of clearing the cache for a particular object::
+
+    >>> cache.delete('a')
+
+That's it. The cache has very few restrictions: You can cache any object that
+can be pickled safely, although keys must be strings.
+
+Upstream caches
+===============
+
+So far, this document has focused on caching your *own* data. But another type
+of caching is relevant to Web development, too: caching performed by "upstream"
+caches. These are systems that cache pages for users even before the request
+reaches your Web site.
+
+Here are a few examples of upstream caches:
+
+    * Your ISP may cache certain pages, so if you requested a page from
+      somedomain.com, your ISP would send you the page without having to access
+      somedomain.com directly.
+
+    * Your Django Web site may sit behind a Squid Web proxy
+      (http://www.squid-cache.org/) that caches pages for performance. In this
+      case, each request first would be handled by Squid, and it'd only be
+      passed to your application if needed.
+
+    * Your Web browser caches pages, too. If a Web page sends out the right
+      headers, your browser will use the local (cached) copy for subsequent
+      requests to that page.
+
+Upstream caching is a nice efficiency boost, but there's a danger to it:
+Many Web pages' contents differ based on authentication and a host of other
+variables, and cache systems that blindly save pages based purely on URLs could
+expose incorrect or sensitive data to subsequent visitors to those pages.
+
+For example, say you operate a Web e-mail system, and the contents of the
+"inbox" page obviously depend on which user is logged in. If an ISP blindly
+cached your site, then the first user who logged in through that ISP would have
+his user-specific inbox page cached for subsequent visitors to the site. That's
+not cool.
+
+Fortunately, HTTP provides a solution to this problem: A set of HTTP headers
+exist to instruct caching mechanisms to differ their cache contents depending
+on designated variables, and to tell caching mechanisms not to cache particular
+pages.
+
+Using Vary headers
+==================
+
+One of these headers is ``Vary``. It defines which request headers a cache
+mechanism should take into account when building its cache key. For example, if
+the contents of a Web page depend on a user's language preference, the page is
+said to "vary on language."
+
+By default, Django's cache system creates its cache keys using the requested
+path -- e.g., ``"/stories/2005/jun/23/bank_robbed/"``. This means every request
+to that URL will use the same cached version, regardless of user-agent
+differences such as cookies or language preferences.
+
+That's where ``Vary`` comes in.
+
+If your Django-powered page outputs different content based on some difference
+in request headers -- such as a cookie, or language, or user-agent -- you'll
+need to use the ``Vary`` header to tell caching mechanisms that the page output
+depends on those things.
+
+To do this in Django, use the convenient ``vary_on_headers`` view decorator,
+like so::
+
+    from django.views.decorators.vary import vary_on_headers
+
+    # Python 2.3 syntax.
+    def my_view(request):
+        ...
+    my_view = vary_on_headers(my_view, 'User-Agent')
+
+    # Python 2.4 decorator syntax.
+    @vary_on_headers('User-Agent')
+    def my_view(request):
+        ...
+
+In this case, a caching mechanism (such as Django's own cache middleware) will
+cache a separate version of the page for each unique user-agent.
+
+The advantage to using the ``vary_on_headers`` decorator rather than manually
+setting the ``Vary`` header (using something like
+``response['Vary'] = 'user-agent'``) is that the decorator adds to the ``Vary``
+header (which may already exist) rather than setting it from scratch.
+
+You can pass multiple headers to ``vary_on_headers()``::
+
+    @vary_on_headers('User-Agent', 'Cookie')
+    def my_view(request):
+        ...
+
+Because varying on cookie is such a common case, there's a ``vary_on_cookie``
+decorator. These two views are equivalent::
+
+    @vary_on_cookie
+    def my_view(request):
+        ...
+
+    @vary_on_headers('Cookie')
+    def my_view(request):
+        ...
+
+Also note that the headers you pass to ``vary_on_headers`` are not case
+sensitive. ``"User-Agent"`` is the same thing as ``"user-agent"``.
+
+You can also use a helper function, ``django.utils.cache.patch_vary_headers``,
+directly::
+
+    from django.utils.cache import patch_vary_headers
+    def my_view(request):
+        ...
+        response = render_to_response('template_name', context)
+        patch_vary_headers(response, ['Cookie'])
+        return response
+
+``patch_vary_headers`` takes an ``HttpResponse`` instance as its first argument
+and a list/tuple of header names as its second argument.
+
+For more on Vary headers, see the `official Vary spec`_.
+
+.. _`official Vary spec`: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.44
+
+Controlling cache: Using other headers
+======================================
+
+Another problem with caching is the privacy of data and the question of where
+data should be stored in a cascade of caches.
+
+A user usually faces two kinds of caches: his own browser cache (a private
+cache) and his provider's cache (a public cache). A public cache is used by
+multiple users and controlled by someone else. This poses problems with
+sensitive data: You don't want, say, your banking-account number stored in a
+public cache. So Web applications need a way to tell caches which data is
+private and which is public.
+
+The solution is to indicate a page's cache should be "private." To do this in
+Django, use the ``cache_control`` view decorator. Example::
+
+    from django.views.decorators.cache import cache_control
+    @cache_control(private=True)
+    def my_view(request):
+        ...
+
+This decorator takes care of sending out the appropriate HTTP header behind the
+scenes.
+
+There are a few other ways to control cache parameters. For example, HTTP
+allows applications to do the following:
+
+    * Define the maximum time a page should be cached.
+    * Specify whether a cache should always check for newer versions, only
+      delivering the cached content when there are no changes. (Some caches
+      might deliver cached content even if the server page changed -- simply
+      because the cache copy isn't yet expired.)
+
+In Django, use the ``cache_control`` view decorator to specify these cache
+parameters. In this example, ``cache_control`` tells caches to revalidate the
+cache on every access and to store cached versions for, at most, 3600 seconds::
+
+    from django.views.decorators.cache import cache_control
+    @cache_control(must_revalidate=True, max_age=3600)
+    def my_view(request):
+        ...
+
+Any valid ``Cache-Control`` HTTP directive is valid in ``cache_control()``.
+Here's a full list:
+
+    * ``public=True``
+    * ``private=True``
+    * ``no_cache=True``
+    * ``no_transform=True``
+    * ``must_revalidate=True``
+    * ``proxy_revalidate=True``
+    * ``max_age=num_seconds``
+    * ``s_maxage=num_seconds``
+
+For explanation of Cache-Control HTTP directives, see the `Cache-Control spec`_.
+
+(Note that the caching middleware already sets the cache header's max-age with
+the value of the ``CACHE_MIDDLEWARE_SETTINGS`` setting. If you use a custom
+``max_age`` in a ``cache_control`` decorator, the decorator will take
+precedence, and the header values will be merged correctly.)
+
+.. _`Cache-Control spec`: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9
+
+Other optimizations
+===================
+
+Django comes with a few other pieces of middleware that can help optimize your
+apps' performance:
+
+    * ``django.middleware.http.ConditionalGetMiddleware`` adds support for
+      conditional GET. This makes use of ``ETag`` and ``Last-Modified``
+      headers.
+
+    * ``django.middleware.gzip.GZipMiddleware`` compresses content for browsers
+      that understand gzip compression (all modern browsers).
+
+Order of MIDDLEWARE_CLASSES
+===========================
+
+If you use ``CacheMiddleware``, it's important to put it in the right place
+within the ``MIDDLEWARE_CLASSES`` setting, because the cache middleware needs
+to know which headers by which to vary the cache storage. Middleware always
+adds something the ``Vary`` response header when it can.
+
+Put the ``CacheMiddleware`` after any middlewares that might add something to
+the ``Vary`` header. The following middlewares do so:
+
+    * ``SessionMiddleware`` adds ``Cookie``
+    * ``GZipMiddleware`` adds ``Accept-Encoding``

Added: vendor/django/current/docs/contributing.txt
===================================================================
--- vendor/django/current/docs/contributing.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/contributing.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,442 @@
+======================
+Contributing to Django
+======================
+
+If you think working *with* Django is fun, wait until you start working *on* it.
+We're passionate about helping Django users make the jump to contributing members
+of the community, so there are many ways you can help Django's development:
+
+    * Blog about Django.  We syndicate all the Django blogs we know about on
+      the `community page`_; contact jacob at jacobian.org if you've got a blog
+      you'd like to see on that page.
+
+    * Report bugs and request features in our `ticket tracker`_.  Please read
+      `Reporting bugs`_, below, for the details on how we like our bug reports
+      served up.
+
+    * Submit patches for new and/or fixed behavior.  Please read `Submitting
+      patches`_, below, for details on how to submit a patch.
+
+    * Join the `django-developers`_ mailing list and share your ideas for how
+      to improve Django.  We're always open to suggestions, although we're
+      likely to be skeptical of large-scale suggestions without some code to
+      back it up.
+
+That's all you need to know if you'd like to join the Django development
+community. The rest of this document describes the details of how our community
+works and how it handles bugs, mailing lists, and all the other minutiae of
+Django development.
+
+Reporting bugs
+==============
+
+Well-written bug reports are *incredibly* helpful. However, there's a certain
+amount of overhead involved in working with any bug tracking system, so your
+help in keeping our ticket tracker as useful as possible is appreciated.  In
+particular:
+
+    * **Do** read the FAQ_ to see if your issue might be a well-known question.
+
+    * **Do** `search the tracker`_ to see if your issue has already been filed.
+
+    * **Do** ask on `django-users`_ *first* if you're not sure if what you're
+      seeing is a bug.
+
+    * **Do** write complete, reproducible, specific bug reports. Include as
+      much information as you possibly can, complete with code snippets, test
+      cases, etc.  A minimal example that illustrates the bug in a nice small
+      test case is the best possible bug report.
+
+    * **Don't** use the ticket system to ask support questions.  Use the
+      `django-users`_ list, or the `#django`_ IRC channel for that.
+
+    * **Don't** use the ticket system to make large-scale feature requests.
+      We like to discuss any big changes to Django's core on the `django-developers`_
+      list before actually working on them.
+
+    * **Don't** reopen issues that have been marked "wontfix". This mark means
+      that the decision has been made that we can't or won't fix this particular
+      issue.  If you're not sure why, please ask on `django-developers`_.
+
+    * **Don't** use the ticket tracker for lengthy discussions, because they're
+      likely to get lost. If a particular ticket is controversial, please move
+      discussion to `django-developers`_.
+
+Reporting security issues
+=========================
+
+Report security issues to security at djangoproject.com. This is a private list
+only open to long-time, highly trusted Django developers, and its archives are
+not publicly readable.
+
+In the event of a confirmed vulnerability in Django itself, we will take the
+following actions:
+
+    * Acknowledge to the reporter that we've received the report and that a fix
+      is forthcoming. We'll give a rough timeline and ask the reporter to keep
+      the issue confidential until we announce it.
+
+    * Halt all other development as long as is needed to develop a fix, including
+      patches against the current and two previous releases.
+
+    * Determine a go-public date for announcing the vulnerability and the fix.
+      To try to mitigate a possible "arms race" between those applying the patch
+      and those trying to exploit the hole, we will not announce security
+      problems immediately.
+
+    * Pre-notify everyone we know to be running the affected version(s) of
+      Django. We will send these notifications through private e-mail which will
+      include documentation of the vulnerability, links to the relevant patch(es),
+      and a request to keep the vulnerability confidential until the official
+      go-public date.
+
+    * Publicly announce the vulnerability and the fix on the pre-determined
+      go-public date. This will probably mean a new release of Django, but
+      in some cases it may simply be patches against current releases.
+
+Submitting patches
+==================
+
+We're always grateful for patches to Django's code. Indeed, bug reports with
+associated patches will get fixed *far* more quickly than those without patches.
+
+Patch style
+-----------
+
+    * Make sure your code matches our `coding style`_.
+
+    * Submit patches in the format returned by the ``svn diff`` command.
+      An exception is for code changes that are described more clearly in plain
+      English than in code. Indentation is the most common example; it's hard to
+      read patches when the only difference in code is that it's indented.
+
+    * Attach patches to a ticket in the `ticket tracker`_, using the "attach file"
+      button. Please *don't* put the patch in the ticket description or comment
+      unless it's a single line patch.
+
+    * Name the patch file with a ``.diff`` extension; this will let the ticket
+      tracker apply correct syntax highlighting, which is quite helpful.
+
+    * Put the prefix "[patch] " before the title of your ticket. This will make
+      it obvious that the ticket includes a patch, and it will add the ticket
+      to the `list of tickets with patches`_.
+
+Submitting and maintaining translations
+=======================================
+
+Various parts of Django, such as the admin site and validator error messages,
+are internationalized. This means they display different text depending on a
+user's language setting.
+
+These translations are contributed by Django users worldwide. If you find an
+incorrect translation, or if you'd like to add a language that isn't yet
+translated, here's what to do:
+
+    * Join the `Django i18n mailing list`_ and introduce yourself.
+    * Create and submit translations using the methods described in the
+      `i18n documentation`_.
+
+.. _Django i18n mailing list: http://groups.google.com/group/django-i18n/
+.. _i18n documentation: http://www.djangoproject.com/documentation/i18n/
+
+Coding style
+============
+
+Please follow these coding standards when writing code for inclusion in Django:
+
+    * Unless otherwise specified, follow `PEP 8`_.
+
+    * Use four spaces for indentation.
+
+    * Use underscores, not camelCase, for variable, function and method names
+      (i.e. ``poll.get_unique_voters()``, not ``poll.getUniqueVoters``).
+
+    * Use ``InitialCaps`` for class names (or for factory functions that
+      return classes).
+
+    * Mark all strings for internationalization; see the `i18n documentation`_
+      for details.
+
+    * In Django template code, put one (and only one) space between the curly
+      brackets and the tag contents.
+
+      Do this::
+
+          {{ foo }}
+
+      Don't do this::
+
+          {{foo}}
+
+    * Please don't put your name in the code. While we appreciate all
+      contributions to Django, our policy is not to publish individual
+      developer names in code -- for instance, at the top of Python modules.
+
+Committing code
+===============
+
+Please follow these guidelines when committing code to Django's Subversion
+repository:
+
+    * For any medium-to-big changes, where "medium-to-big" is according to your
+      judgment, please bring things up on the `django-developers`_ mailing list
+      before making the change.
+
+      If you bring something up on `django-developers`_ and nobody responds,
+      please don't take that to mean your idea is great and should be
+      implemented immediately because nobody contested it. Django's lead
+      developers don't have a lot of time to read mailing-list discussions
+      immediately, so you may have to wait a couple of days before getting a
+      response.
+
+    * Write detailed commit messages in the past tense, not present tense.
+
+          * Good: "Fixed Unicode bug in RSS API."
+          * Bad: "Fixes Unicode bug in RSS API."
+          * Bad: "Fixing Unicode bug in RSS API."
+
+    * For commits to a branch, prefix the commit message with the branch name.
+      For example: "magic-removal: Added support for mind reading."
+
+    * Limit commits to the most granular change that makes sense. This means,
+      use frequent small commits rather than infrequent large commits. For
+      example, if implementing feature X requires a small change to library Y,
+      first commit the change to library Y, then commit feature X in a separate
+      commit. This goes a *long way* in helping all core Django developers
+      follow your changes.
+
+    * If your commit closes a ticket in the Django `ticket tracker`_, begin
+      your commit message with the text "Fixed #abc", where "abc" is the number
+      of the ticket your commit fixes. Example: "Fixed #123 -- Added support
+      for foo". We've rigged Subversion and Trac so that any commit message
+      in that format will automatically close the referenced ticket and post a
+      comment to it with the full commit message.
+
+      If your commit closes a ticket and is in a branch, use the branch name
+      first, then the "Fixed #abc." For example:
+      "magic-removal: Fixed #123 -- Added whizbang feature."
+
+      For the curious: We're using a `Trac post-commit hook`_ for this.
+
+      .. _Trac post-commit hook: http://trac.edgewall.org/browser/trunk/contrib/trac-post-commit-hook
+
+    * If your commit references a ticket in the Django `ticket tracker`_ but
+      does *not* close the ticket, include the phrase "Refs #abc", where "abc"
+      is the number of the ticket your commit references. We've rigged
+      Subversion and Trac so that any commit message in that format will
+      automatically post a comment to the appropriate ticket.
+
+Unit tests
+==========
+
+Django comes with a test suite of its own, in the ``tests`` directory of the
+Django tarball. It's our policy to make sure all tests pass at all times.
+
+The tests cover:
+
+    * Models and the database API (``tests/testapp/models``).
+    * The cache system (``tests/otherthests/cache.py``).
+    * The ``django.utils.dateformat`` module (``tests/othertests/dateformat.py``).
+    * Database typecasts (``tests/othertests/db_typecasts.py``).
+    * The template system (``tests/othertests/templates.py`` and
+      ``tests/othertests/defaultfilters.py``).
+    * ``QueryDict`` objects (``tests/othertests/httpwrappers.py``).
+    * Markup template tags (``tests/othertests/markup.py``).
+    * The ``django.utils.timesince`` module (``tests/othertests/timesince.py``).
+
+We appreciate any and all contributions to the test suite!
+
+Running the unit tests
+----------------------
+
+To run the tests, ``cd`` to the ``tests/`` directory and type::
+
+    ./runtests.py --settings=path.to.django.settings
+
+Yes, the unit tests need a settings module, but only for database connection
+info -- the ``DATABASE_ENGINE``, ``DATABASE_USER`` and ``DATABASE_PASSWORD``.
+
+The unit tests will not touch your database; they create a new database, called
+``django_test_db``, which is deleted when the tests are finished. This means
+your user account needs permission to execute ``CREATE DATABASE``.
+
+Requesting features
+===================
+
+We're always trying to make Django better, and your feature requests are a key
+part of that. Here are some tips on how to most effectively make a request:
+
+    * Request the feature on `django-developers`_, not in the ticket tracker;
+      it'll get read more closely if it's on the mailing list.
+
+    * Describe clearly and concisely what the missing feature is and how you'd
+      like to see it implemented. Include example code (non-functional is OK)
+      if possible.
+
+    * Explain *why* you'd like the feature. In some cases this is obvious, but
+      since Django is designed to help real developers get real work done,
+      you'll need to explain it, if it isn't obvious why the feature would be
+      useful.
+
+As with most open-source projects, code talks. If you are willing to write the
+code for the feature yourself or if (even better) you've already written it,
+it's much more likely to be accepted.  If it's a large feature that might need
+multiple developers we're always happy to give you an experimental branch in
+our repository; see below.
+
+Branch policy
+=============
+
+In general, most development is confined to the trunk, and the trunk
+is kept stable. People should be able to run production sites against the
+trunk at any time.
+
+Thus, large architectural changes -- that is, changes too large to be
+encapsulated in a single patch, or changes that need multiple eyes on them --
+will have dedicated branches. See, for example, the `i18n branch`_. If you
+have a change of this nature that you'd like to work on, ask on
+`django-developers`_ for a branch to be created for you. We'll create a branch
+for pretty much any kind of experimenting you'd like to do.
+
+We will only branch entire copies of the Django tree, even if work is only
+happening on part of that tree. This makes it painless to switch to a branch.
+
+Developers working on a branch should periodically merge changes from the trunk
+into the branch. Please merge at least once a week. Every time you merge from
+the trunk, note the merge and revision numbers in the commit message.
+
+Once the branch is stable and ready to be merged into the trunk, alert
+`django-developers`_.
+
+After a branch has been merged, it should be considered "dead"; write access to
+it will be disabled, and old branches will be periodically "trimmed." To keep
+our SVN wrangling to a minimum, we won't be merging from a given branch into the
+trunk more than once.
+
+Using branches
+--------------
+
+To test a given branch, you can simply check out the entire branch, like so::
+
+    svn co http://code.djangoproject.com/svn/django/branches/<branch>/
+
+Or, if you've got a working directory you'd like to switch to use a branch,
+you can use::
+
+    svn switch http://code.djangoproject.com/svn/django/branches/<branch>/
+
+...in the root of your Django sandbox (the directory that contains ``django``,
+``docs``, and ``tests``).
+
+The advantage of using ``svn switch`` instead of ``svn co`` is that the
+``switch`` command retains any changes you might have made to your local copy
+of the code. It attempts to merge those changes into the "switched" code.
+
+Official releases
+=================
+
+Django's release numbering works as follows:
+
+    * Versions are numbered in the form ``A.B`` or ``A.B.C``.
+
+    * ``A`` is the major version number, which is only incremented for major
+      changes to Django, and these changes are not necessarily
+      backwards-compatible. That is, code you wrote for Django 6.0 may break
+      when we release Django 7.0.
+
+    * ``B`` is the minor version number, which is incremented for large yet
+      backwards compatible changes.  Code written for Django 6.4 will continue
+      to work under Django 6.5.
+
+      A minor release may deprecate certain features in previous releases. If a
+      feature in version ``A.B`` is deprecated, it will continue to work in
+      version ``A.B+1``. In version ``A.B+2``, use of the feature will raise a
+      ``PendingDeprecationWarning`` but will continue to work.  Version
+      ``A.B+3`` will remove the feature entirely. Major point releases will
+      always remove deprecated features immediately.
+
+    * ``C`` is the micro version number which, is incremented for bug and
+      security fixes.  A new micro-release will always be 100%
+      backwards-compatible with the previous micro-release.
+
+    * In some cases, we'll make release candidate releases. These are of the
+      form ``A.BrcN``, which means the ``Nth`` candidate release of version
+      ``A.B``.
+
+An exception to this version numbering scheme is the pre-1.0 Django code.
+There's no guarantee of backwards-compatibility until the 1.0 release.
+
+In Subversion, each Django release will be tagged under `tags/releases`_.  If
+it's necessary to release a bug fix release or a security release that doesn't
+come from the trunk, we'll copy that tag to ``branches/releases`` to make the
+bug fix release.
+
+Deciding on features
+====================
+
+Once a feature's been requested and discussed, eventually we'll have a decision
+about whether to include the feature or drop it.
+
+Whenever possible, we strive for a rough consensus. To that end, we'll often
+have informal votes on `django-developers`_ about a feature. In these votes we
+follow the voting style invented by Apache and used on Python itself, where
+votes are given as +1, +0, -0, or -1.  Roughly translated, these votes mean:
+
+    * +1: "I love the idea and I'm strongly committed to it."
+
+    * +0: "Sounds OK to me."
+
+    * -0: "I'm not thrilled, but I won't stand in the way."
+
+    * -1: "I strongly disagree and would be very unhappy to see the idea turn
+      into reality."
+
+Although these votes on django-developers are informal, they'll be taken very
+seriously. After a suitable voting period, if an obvious consensus arises
+we'll follow the votes.
+
+However, consensus is not always possible.  Tough decisions will be discussed by
+all full committers and finally decided by the Benevolent Dictators for Life,
+Adrian and Jacob.
+
+Commit access
+=============
+
+Django has two types of committers:
+
+Full committers
+    These are people who have a long history of contributions to Django's
+    codebase, a solid track record of being polite and helpful on the mailing
+    lists, and a proven desire to dedicate serious time to Django's development.
+
+    The bar is very high for full commit access. It will only be granted by
+    unanimous approval of all existing full committers, and the decision will err
+    on the side of rejection.
+
+Partial committers
+    These are people who are "domain experts." They have direct check-in access
+    to the subsystems that fall under their jurisdiction, and they're given a
+    formal vote in questions that involve their subsystems. This type of access
+    is likely to be given to someone who contributes a large subframework to
+    Django and wants to continue to maintain it.
+
+    Like full committers, partial commit access is by unanimous approval of all
+    full committers (and any other partial committers in the same area).
+    However, the bar is set lower; proven expertise in the area in question is
+    likely to be sufficient.
+
+To request commit access, please contact an existing committer privately. Public
+requests for commit access are potential flame-war starters, and will be ignored.
+
+.. _community page: http://www.djangoproject.com/community/
+.. _ticket tracker: http://code.djangoproject.com/newticket
+.. _django-developers: http://groups.google.com/group/django-developers
+.. _FAQ: http://www.djangoproject.com/documentation/faq/
+.. _search the tracker: http://code.djangoproject.com/search
+.. _django-users: http://groups.google.com/group/django-users
+.. _`#django`: irc://irc.freenode.net/django
+.. _list of tickets with patches: http://code.djangoproject.com/report/12
+.. _PEP 8: http://www.python.org/peps/pep-0008.html
+.. _i18n documentation: http://www.djangoproject.com/documentation/i18n/
+.. _i18n branch: http://code.djangoproject.com/browser/django/branches/i18n
+.. _`tags/releases`: http://code.djangoproject.com/browser/django/tags/releases

Added: vendor/django/current/docs/csrf.txt
===================================================================
--- vendor/django/current/docs/csrf.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/csrf.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,68 @@
+=====================================
+Cross Site Request Forgery Protection
+=====================================
+
+The CsrfMiddleware class provides easy-to-use protection against 
+`Cross Site Request Forgeries`_.  This type of attack occurs when a malicious 
+web site creates a link or form button that is intended to perform some action
+on your web site, using the credentials of a logged-in user who is tricked
+into clicking on the link in their browser.
+
+The first defense against CSRF attacks is to ensure that GET requests
+are side-effect free.  POST requests can then be protected by adding this
+middleware into your list of installed middleware.
+
+
+.. _Cross Site Request Forgeries:  http://www.squarefree.com/securitytips/web-developers.html#CSRF
+
+How to use it
+=============
+Add the middleware ``'django.contrib.csrf.middleware.CsrfMiddleware'`` to 
+your list of middleware classes, ``MIDDLEWARE_CLASSES``. It needs to process
+the response after the SessionMiddleware, so must come before it in the
+list. It also must process the response before things like compression
+happen to the response, so it must come after GZipMiddleware in the list.
+
+How it works
+============
+CsrfMiddleware does two things:
+
+1. It modifies outgoing requests by adding a hidden form field to all 
+   'POST' forms, with the name 'csrfmiddlewaretoken' and a value which is 
+   a hash of the session ID plus a secret. If there is no session ID set, 
+   this modification of the response isn't done, so there is very little 
+   performance penalty for those requests that don't have a session.
+
+2. On all incoming POST requests that have the session cookie set, it 
+   checks that the 'csrfmiddlewaretoken' is present and correct. If it 
+   isn't, the user will get a 403 error.
+
+This ensures that only forms that have originated from your web site
+can be used to POST data back.
+
+It deliberately only targets HTTP POST requests (and the corresponding
+POST forms). GET requests ought never to have side effects (if you are
+using HTTP GET and POST correctly), and so a CSRF attack with a GET
+request will always be harmless. 
+
+POST requests that are not accompanied by a session cookie are not protected,
+but they do not need to be protected, since the 'attacking' web site
+could make these kind of requests anyway.
+
+The Content-Type is checked before modifying the response, and only 
+pages that are served as 'text/html' or 'application/xml+xhtml'
+are modified.
+
+Limitations
+===========
+CsrfMiddleware requires Django's session framework to work. If you have
+a custom authentication system that manually sets cookies and the like,
+it won't help you.
+
+If your app creates HTML pages and forms in some unusual way, (e.g. 
+it sends fragments of HTML in javascript document.write statements) 
+you might bypass the filter that adds the hidden field to the form, 
+in which case form submission will always fail.  It may still be possible
+to use the middleware, provided you can find some way to get the
+CSRF token and ensure that is included when your form is submitted.
+

Added: vendor/django/current/docs/db-api.txt
===================================================================
--- vendor/django/current/docs/db-api.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/db-api.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1702 @@
+======================
+Database API reference
+======================
+
+Once you've created your `data models`_, Django automatically gives you a
+database-abstraction API that lets you create, retrieve, update and delete
+objects. This document explains that API.
+
+.. _`data models`: http://www.djangoproject.com/documentation/model_api/
+
+Throughout this reference, we'll refer to the following models, which comprise
+a weblog application::
+
+    class Blog(models.Model):
+        name = models.CharField(maxlength=100)
+        tagline = models.TextField()
+
+        def __str__(self):
+            return self.name
+
+    class Author(models.Model):
+        name = models.CharField(maxlength=50)
+        email = models.URLField()
+
+        def __str__(self):
+            return self.name
+
+    class Entry(models.Model):
+        blog = models.ForeignKey(Blog)
+        headline = models.CharField(maxlength=255)
+        body_text = models.TextField()
+        pub_date = models.DateTimeField()
+        authors = models.ManyToManyField(Author)
+
+        def __str__(self):
+            return self.headline
+
+Creating objects
+================
+
+To represent database-table data in Python objects, Django uses an intuitive
+system: A model class represents a database table, and an instance of that
+class represents a particular record in the database table.
+
+To create an object, instantiate it using keyword arguments to the model class,
+then call ``save()`` to save it to the database.
+
+You import the model class from wherever it lives on the Python path, as you
+may expect. (We point this out here because previous Django versions required
+funky model importing.)
+
+Assuming models live in a file ``mysite/blog/models.py``, here's an example::
+
+    from mysite.blog.models import Blog
+    b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
+    b.save()
+
+This performs an ``INSERT`` SQL statement behind the scenes. Django doesn't hit
+the database until you explicitly call ``save()``.
+
+The ``save()`` method has no return value.
+
+To create an object and save it all in one step see the `create`__ method.
+
+__ `create(**kwargs)`_
+
+Auto-incrementing primary keys
+------------------------------
+
+If a model has an ``AutoField`` -- an auto-incrementing primary key -- then
+that auto-incremented value will be calculated and saved as an attribute on
+your object the first time you call ``save()``.
+
+Example::
+
+    b2 = Blog(name='Cheddar Talk', tagline='Thoughts on cheese.')
+    b2.id     # Returns None, because b doesn't have an ID yet.
+    b2.save()
+    b2.id     # Returns the ID of your new object.
+
+There's no way to tell what the value of an ID will be before you call
+``save()``, because that value is calculated by your database, not by Django.
+
+(For convenience, each model has an ``AutoField`` named ``id`` by default
+unless you explicitly specify ``primary_key=True`` on a field. See the
+`AutoField documentation`_.)
+
+.. _AutoField documentation: http://www.djangoproject.com/documentation/model_api/#autofield
+
+Explicitly specifying auto-primary-key values
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a model has an ``AutoField`` but you want to define a new object's ID
+explicitly when saving, just define it explicitly before saving, rather than
+relying on the auto-assignment of the ID.
+
+Example::
+
+    b3 = Blog(id=3, name='Cheddar Talk', tagline='Thoughts on cheese.')
+    b3.id     # Returns 3.
+    b3.save()
+    b3.id     # Returns 3.
+
+If you assign auto-primary-key values manually, make sure not to use an
+already-existing primary-key value! If you create a new object with an explicit
+primary-key value that already exists in the database, Django will assume
+you're changing the existing record rather than creating a new one.
+
+Given the above ``'Cheddar Talk'`` blog example, this example would override
+the previous record in the database::
+
+    b4 = Blog(id=3, name='Not Cheddar', tagline='Anything but cheese.')
+    b4.save()  # Overrides the previous blog with ID=3!
+
+See _`How Django knows to UPDATE vs. INSERT`, below, for the reason this
+happens.
+
+Explicitly specifying auto-primary-key values is mostly useful for bulk-saving
+objects, when you're confident you won't have primary-key collision.
+
+Saving changes to objects
+=========================
+
+To save changes to an object that's already in the database, use ``save()``.
+
+Given a ``Blog`` instance ``b5`` that has already been saved to the database,
+this example changes its name and updates its record in the database::
+
+    b5.name = 'New name'
+    b5.save()
+
+This performs an ``UPDATE`` SQL statement behind the scenes. Django doesn't hit
+the database until you explicitly call ``save()``.
+
+The ``save()`` method has no return value.
+
+How Django knows to UPDATE vs. INSERT
+-------------------------------------
+
+You may have noticed Django database objects use the same ``save()`` method
+for creating and changing objects. Django abstracts the need to use ``INSERT``
+or ``UPDATE`` SQL statements. Specifically, when you call ``save()``, Django
+follows this algorithm:
+
+    * If the object's primary key attribute is set to a value that evaluates to
+      ``False`` (such as ``None`` or the empty string), Django executes a
+      ``SELECT`` query to determine whether a record with the given primary key
+      already exists.
+    * If the record with the given primary key does already exist, Django
+      executes an ``UPDATE`` query.
+    * If the object's primary key attribute is *not* set, or if it's set but a
+      record doesn't exist, Django executes an ``INSERT``.
+
+The one gotcha here is that you should be careful not to specify a primary-key
+value explicitly when saving new objects, if you cannot guarantee the
+primary-key value is unused. For more on this nuance, see
+"Explicitly specifying auto-primary-key values" above.
+
+Retrieving objects
+==================
+
+To retrieve objects from your database, you construct a ``QuerySet`` via a
+``Manager`` on your model class.
+
+A ``QuerySet`` represents a collection of objects from your database. It can
+have zero, one or many *filters* -- criteria that narrow down the collection
+based on given parameters. In SQL terms, a ``QuerySet`` equates to a ``SELECT``
+statement, and a filter is a limiting clause such as ``WHERE`` or ``LIMIT``.
+
+You get a ``QuerySet`` by using your model's ``Manager``. Each model has at
+least one ``Manager``, and it's called ``objects`` by default. Access it
+directly via the model class, like so::
+
+    Blog.objects  # <django.db.models.manager.Manager object at ...>
+    b = Blog(name='Foo', tagline='Bar')
+    b.objects     # AttributeError: "Manager isn't accessible via Blog instances."
+
+(``Managers`` are accessible only via model classes, rather than from model
+instances, to enforce a separation between "table-level" operations and
+"record-level" operations.)
+
+The ``Manager`` is the main source of ``QuerySets`` for a model. It acts as a
+"root" ``QuerySet`` that describes all objects in the model's database table.
+For example, ``Blog.objects`` is the initial ``QuerySet`` that contains all
+``Blog`` objects in the database.
+
+Retrieving all objects
+----------------------
+
+The simplest way to retrieve objects from a table is to get all of them.
+To do this, use the ``all()`` method on a ``Manager``.
+
+Example::
+
+    all_entries = Entry.objects.all()
+
+The ``all()`` method returns a ``QuerySet`` of all the objects in the database.
+
+(If ``Entry.objects`` is a ``QuerySet``, why can't we just do ``Entry.objects``?
+That's because ``Entry.objects``, the root ``QuerySet``, is a special case
+that cannot be evaluated. The ``all()`` method returns a ``QuerySet`` that
+*can* be evaluated.)
+
+Filtering objects
+-----------------
+
+The root ``QuerySet`` provided by the ``Manager`` describes all objects in the
+database table. Usually, though, you'll need to select only a subset of the
+complete set of objects.
+
+To create such a subset, you refine the initial ``QuerySet``, adding filter
+conditions. The two most common ways to refine a ``QuerySet`` are:
+
+``filter(**kwargs)``
+    Returns a new ``QuerySet`` containing objects that match the given lookup
+    parameters.
+
+``exclude(**kwargs)``
+    Returns a new ``QuerySet`` containing objects that do *not* match the given
+    lookup parameters.
+
+The lookup parameters (``**kwargs`` in the above function definitions) should
+be in the format described in `Field lookups`_ below.
+
+For example, to get a ``QuerySet`` of blog entries from the year 2006, use
+``filter()`` like so::
+
+    Entry.objects.filter(pub_date__year=2006)
+
+(Note we don't have to add an ``all()`` -- ``Entry.objects.all().filter(...)``.
+That would still work, but you only need ``all()`` when you want all objects
+from the root ``QuerySet``.)
+
+Chaining filters
+~~~~~~~~~~~~~~~~
+
+The result of refining a ``QuerySet`` is itself a ``QuerySet``, so it's
+possible to chain refinements together. For example::
+
+    Entry.objects.filter(
+        headline__startswith='What').exclude(
+            pub_date__gte=datetime.now()).filter(
+                pub_date__gte=datetime(2005, 1, 1))
+
+...takes the initial ``QuerySet`` of all entries in the database, adds a
+filter, then an exclusion, then another filter. The final result is a
+``QuerySet`` containing all entries with a headline that starts with "What",
+that were published between January 1, 2005, and the current day.
+
+Filtered QuerySets are unique
+-----------------------------
+
+Each time you refine a ``QuerySet``, you get a brand-new ``QuerySet`` that is
+in no way bound to the previous ``QuerySet``. Each refinement creates a
+separate and distinct ``QuerySet`` that can be stored, used and reused.
+
+Example::
+
+    q1 = Entry.objects.filter(headline__startswith="What")
+    q2 = q1.exclude(pub_date__gte=datetime.now())
+    q3 = q1.filter(pub_date__gte=datetime.now())
+
+These three ``QuerySets`` are separate. The first is a base ``QuerySet``
+containing all entries that contain a headline starting with "What". The second
+is a subset of the first, with an additional criteria that excludes records
+whose ``pub_date`` is greater than now. The third is a subset of the first,
+with an additional criteria that selects only the records whose ``pub_date`` is
+greater than now. The initial ``QuerySet`` (``q1``) is unaffected by the
+refinement process.
+
+QuerySets are lazy
+------------------
+
+``QuerySets`` are lazy -- the act of creating a ``QuerySet`` doesn't involve
+any database activity. You can stack filters together all day long, and Django
+won't actually run the query until the ``QuerySet`` is *evaluated*.
+
+When QuerySets are evaluated
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+You can evaluate a ``QuerySet`` in the following ways:
+
+    * **Iteration.** A ``QuerySet`` is iterable, and it executes its database
+      query the first time you iterate over it. For example, this will print
+      the headline of all entries in the database::
+
+          for e in Entry.objects.all():
+              print e.headline
+
+    * **Slicing.** As explained in `Limiting QuerySets`_ below, a ``QuerySet``
+      can be sliced, using Python's array-slicing syntax. Usually slicing a
+      ``QuerySet`` returns another (unevaluated )``QuerySet``, but Django will
+      execute the database query if you use the "step" parameter of slice
+      syntax.
+
+    * **repr().** A ``QuerySet`` is evaluated when you call ``repr()`` on it.
+      This is for convenience in the Python interactive interpreter, so you can
+      immediately see your results when using the API interactively.
+
+    * **len().** A ``QuerySet`` is evaluated when you call ``len()`` on it.
+      This, as you might expect, returns the length of the result list.
+
+      Note: *Don't* use ``len()`` on ``QuerySet``\s if all you want to do is
+      determine the number of records in the set. It's much more efficient to
+      handle a count at the database level, using SQL's ``SELECT COUNT(*)``,
+      and Django provides a ``count()`` method for precisely this reason. See
+      ``count()`` below.
+
+    * **list().** Force evaluation of a ``QuerySet`` by calling ``list()`` on
+      it. For example::
+
+          entry_list = list(Entry.objects.all())
+
+      Be warned, though, that this could have a large memory overhead, because
+      Django will load each element of the list into memory. In contrast,
+      iterating over a ``QuerySet`` will take advantage of your database to
+      load data and instantiate objects only as you need them.
+
+Limiting QuerySets
+------------------
+
+Use Python's array-slicing syntax to limit your ``QuerySet`` to a certain
+number of results. This is the equivalent of SQL's ``LIMIT`` and ``OFFSET``
+clauses.
+
+For example, this returns the first 5 objects (``LIMIT 5``)::
+
+    Entry.objects.all()[:5]
+
+This returns the fifth through tenth objects (``OFFSET 5 LIMIT 5``)::
+
+    Entry.objects.all()[5:10]
+
+Generally, slicing a ``QuerySet`` returns a new ``QuerySet`` -- it doesn't
+evaluate the query. An exception is if you use the "step" parameter of Python
+slice syntax. For example, this would actually execute the query in order to
+return a list of every *second* object of the first 10::
+
+    Entry.objects.all()[:10:2]
+
+To retrieve a *single* object rather than a list
+(e.g. ``SELECT foo FROM bar LIMIT 1``), use a simple index instead of a
+slice. For example, this returns the first ``Entry`` in the database, after
+ordering entries alphabetically by headline::
+
+    Entry.objects.order_by('headline')[0]
+
+This is roughly equivalent to::
+
+    Entry.objects.order_by('headline')[0:1].get()
+
+Note, however, that the first of these will raise ``IndexError`` while the
+second will raise ``DoesNotExist`` if no objects match the given criteria.
+
+QuerySet methods that return new QuerySets
+------------------------------------------
+
+Django provides a range of ``QuerySet`` refinement methods that modify either
+the types of results returned by the ``QuerySet`` or the way its SQL query is
+executed.
+
+``filter(**kwargs)``
+~~~~~~~~~~~~~~~~~~~~
+
+Returns a new ``QuerySet`` containing objects that match the given lookup
+parameters.
+
+The lookup parameters (``**kwargs``) should be in the format described in
+`Field lookups`_ below. Multiple parameters are joined via ``AND`` in the
+underlying SQL statement.
+
+``exclude(**kwargs)``
+~~~~~~~~~~~~~~~~~~~~~
+
+Returns a new ``QuerySet`` containing objects that do *not* match the given
+lookup parameters.
+
+The lookup parameters (``**kwargs``) should be in the format described in
+`Field lookups`_ below. Multiple parameters are joined via ``AND`` in the
+underlying SQL statement, and the whole thing is enclosed in a ``NOT()``.
+
+This example excludes all entries whose ``pub_date`` is the current date/time
+AND whose ``headline`` is "Hello"::
+
+    Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
+
+In SQL terms, that evaluates to::
+
+    SELECT ...
+    WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
+
+This example excludes all entries whose ``pub_date`` is the current date/time
+OR whose ``headline`` is "Hello"::
+
+    Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
+
+In SQL terms, that evaluates to::
+
+    SELECT ...
+    WHERE NOT pub_date > '2005-1-3'
+    AND NOT headline = 'Hello'
+
+Note the second example is more restrictive.
+
+``order_by(*fields)``
+~~~~~~~~~~~~~~~~~~~~~
+
+By default, results returned by a ``QuerySet`` are ordered by the ordering
+tuple given by the ``ordering`` option in the model's ``Meta``. You can
+override this on a per-``QuerySet`` basis by using the ``order_by`` method.
+
+Example::
+
+    Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
+
+The result above will be ordered by ``pub_date`` descending, then by
+``headline`` ascending. The negative sign in front of ``"-pub_date"`` indicates
+*descending* order. Ascending order is implied. To order randomly, use ``"?"``,
+like so::
+
+    Entry.objects.order_by('?')
+
+To order by a field in a different table, add the other table's name and a dot,
+like so::
+
+    Entry.objects.order_by('blogs_blog.name', 'headline')
+
+There's no way to specify whether ordering should be case sensitive. With
+respect to case-sensitivity, Django will order results however your database
+backend normally orders them.
+
+``distinct()``
+~~~~~~~~~~~~~~
+
+Returns a new ``QuerySet`` that uses ``SELECT DISTINCT`` in its SQL query. This
+eliminates duplicate rows from the query results.
+
+By default, a ``QuerySet`` will not eliminate duplicate rows. In practice, this
+is rarely a problem, because simple queries such as ``Blog.objects.all()``
+don't introduce the possibility of duplicate result rows.
+
+However, if your query spans multiple tables, it's possible to get duplicate
+results when a ``QuerySet`` is evaluated. That's when you'd use ``distinct()``.
+
+``values(*fields)``
+~~~~~~~~~~~~~~~~~~~
+
+Returns a ``ValuesQuerySet`` -- a ``QuerySet`` that evaluates to a list of
+dictionaries instead of model-instance objects.
+
+Each of those dictionaries represents an object, with the keys corresponding to
+the attribute names of model objects.
+
+This example compares the dictionaries of ``values()`` with the normal model
+objects::
+
+    # This list contains a Blog object.
+    >>> Blog.objects.filter(name__startswith='Beatles')
+    [Beatles Blog]
+
+    # This list contains a dictionary.
+    >>> Blog.objects.filter(name__startswith='Beatles').values()
+    [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]
+
+``values()`` takes optional positional arguments, ``*fields``, which specify
+field names to which the ``SELECT`` should be limited. If you specify the
+fields, each dictionary will contain only the field keys/values for the fields
+you specify. If you don't specify the fields, each dictionary will contain a
+key and value for every field in the database table.
+
+Example::
+
+    >>> Blog.objects.values()
+    [{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
+    >>> Blog.objects.values('id', 'name')
+    [{'id': 1, 'name': 'Beatles Blog'}]
+
+A ``ValuesQuerySet`` is useful when you know you're only going to need values
+from a small number of the available fields and you won't need the
+functionality of a model instance object. It's more efficient to select only
+the fields you need to use.
+
+Finally, note a ``ValuesQuerySet`` is a subclass of ``QuerySet``, so it has all
+methods of ``QuerySet``. You can call ``filter()`` on it, or ``order_by()``, or
+whatever. Yes, that means these two calls are identical::
+
+    Blog.objects.values().order_by('id')
+    Blog.objects.order_by('id').values()
+
+The people who made Django prefer to put all the SQL-affecting methods first,
+followed (optionally) by any output-affecting methods (such as ``values()``),
+but it doesn't really matter. This is your chance to really flaunt your
+individualism.
+
+``dates(field, kind, order='ASC')``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Returns a ``DateQuerySet`` -- a ``QuerySet`` that evaluates to a list of
+``datetime.datetime`` objects representing all available dates of a particular
+kind within the contents of the ``QuerySet``.
+
+``field`` should be the name of a ``DateField`` or ``DateTimeField`` of your
+model.
+
+``kind`` should be either ``"year"``, ``"month"`` or ``"day"``. Each
+``datetime.datetime`` object in the result list is "truncated" to the given
+``type``.
+
+    * ``"year"`` returns a list of all distinct year values for the field.
+    * ``"month"`` returns a list of all distinct year/month values for the field.
+    * ``"day"`` returns a list of all distinct year/month/day values for the field.
+
+``order``, which defaults to ``'ASC'``, should be either ``'ASC'`` or
+``'DESC'``. This specifies how to order the results.
+
+Examples::
+
+    >>> Entry.objects.dates('pub_date', 'year')
+    [datetime.datetime(2005, 1, 1)]
+    >>> Entry.objects.dates('pub_date', 'month')
+    [datetime.datetime(2005, 2, 1), datetime.datetime(2005, 3, 1)]
+    >>> Entry.objects.dates('pub_date', 'day')
+    [datetime.datetime(2005, 2, 20), datetime.datetime(2005, 3, 20)]
+    >>> Entry.objects.dates('pub_date', 'day', order='DESC')
+    [datetime.datetime(2005, 3, 20), datetime.datetime(2005, 2, 20)]
+    >>> Entry.objects.filter(headline__contains='Lennon').dates('pub_date', 'day')
+    [datetime.datetime(2005, 3, 20)]
+
+``select_related()``
+~~~~~~~~~~~~~~~~~~~~
+
+Returns a ``QuerySet`` that will automatically "follow" foreign-key
+relationships, selecting that additional related-object data when it executes
+its query. This is a performance booster which results in (sometimes much)
+larger queries but means later use of foreign-key relationships won't require
+database queries.
+
+The following examples illustrate the difference between plain lookups and
+``select_related()`` lookups. Here's standard lookup::
+
+    # Hits the database.
+    e = Entry.objects.get(id=5)
+
+    # Hits the database again to get the related Blog object.
+    b = e.blog
+
+And here's ``select_related`` lookup::
+
+    # Hits the database.
+    e = Entry.objects.select_related().get(id=5)
+
+    # Doesn't hit the database, because e.blog has been prepopulated
+    # in the previous query.
+    b = e.blog
+
+``select_related()`` follows foreign keys as far as possible. If you have the
+following models::
+
+    class City(models.Model):
+        # ...
+
+    class Person(models.Model):
+        # ...
+        hometown = models.ForeignKey(City)
+
+    class Book(models.Model):
+        # ...
+        author = models.ForeignKey(Person)
+
+...then a call to ``Book.objects.select_related().get(id=4)`` will cache the
+related ``Person`` *and* the related ``City``::
+
+    b = Book.objects.select_related().get(id=4)
+    p = b.author         # Doesn't hit the database.
+    c = p.hometown       # Doesn't hit the database.
+
+    sv = Book.objects.get(id=4) # No select_related() in this example.
+    p = b.author         # Hits the database.
+    c = p.hometown       # Hits the database.
+
+``extra(select=None, where=None, params=None, tables=None)``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Sometimes, the Django query syntax by itself can't easily express a complex
+``WHERE`` clause. For these edge cases, Django provides the ``extra()``
+``QuerySet`` modifier -- a hook for injecting specific clauses into the SQL
+generated by a ``QuerySet``.
+
+By definition, these extra lookups may not be portable to different database
+engines (because you're explicitly writing SQL code) and violate the DRY
+principle, so you should avoid them if possible.
+
+Specify one or more of ``params``, ``select``, ``where`` or ``tables``. None
+of the arguments is required, but you should use at least one of them.
+
+``select``
+    The ``select`` argument lets you put extra fields in the ``SELECT`` clause.
+    It should be a dictionary mapping attribute names to SQL clauses to use to
+    calculate that attribute.
+
+    Example::
+
+        Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
+
+    As a result, each ``Entry`` object will have an extra attribute,
+    ``is_recent``, a boolean representing whether the entry's ``pub_date`` is
+    greater than Jan. 1, 2006.
+
+    Django inserts the given SQL snippet directly into the ``SELECT``
+    statement, so the resulting SQL of the above example would be::
+
+        SELECT blog_entry.*, (pub_date > '2006-01-01')
+        FROM blog_entry;
+
+
+    The next example is more advanced; it does a subquery to give each
+    resulting ``Blog`` object an ``entry_count`` attribute, an integer count
+    of associated ``Entry`` objects::
+
+        Blog.objects.extra(
+            select={
+                'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
+            },
+        )
+
+    (In this particular case, we're exploiting the fact that the query will
+    already contain the ``blog_blog`` table in its ``FROM`` clause.)
+
+    The resulting SQL of the above example would be::
+
+        SELECT blog_blog.*, (SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id)
+        FROM blog_blog;
+
+    Note that the parenthesis required by most database engines around
+    subqueries are not required in Django's ``select`` clauses. Also note that
+    some database backends, such as some MySQL versions, don't support
+    subqueries.
+
+``where`` / ``tables``
+    You can define explicit SQL ``WHERE`` clauses -- perhaps to perform
+    non-explicit joins -- by using ``where``. You can manually add tables to
+    the SQL ``FROM`` clause by using ``tables``.
+
+    ``where`` and ``tables`` both take a list of strings. All ``where``
+    parameters are "AND"ed to any other search criteria.
+
+    Example::
+
+        Entry.objects.extra(where=['id IN (3, 4, 5, 20)'])
+
+    ...translates (roughly) into the following SQL::
+
+        SELECT * FROM blog_entry WHERE id IN (3, 4, 5, 20);
+
+``params``
+    The ``select`` and ``where`` parameters described above may use standard
+    Python database string placeholders -- ``'%s'`` to indicate parameters the
+    database engine should automatically quote. The ``params`` argument is a
+    list of any extra parameters to be substituted.
+
+    Example::
+
+        Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
+
+    Always use ``params`` instead of embedding values directly into ``select``
+    or ``where`` because ``params`` will ensure values are quoted correctly
+    according to your particular backend. (For example, quotes will be escaped
+    correctly.)
+
+    Bad::
+
+        Entry.objects.extra(where=["headline='Lennon'"])
+
+    Good::
+
+        Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
+
+QuerySet methods that do not return QuerySets
+---------------------------------------------
+
+The following ``QuerySet`` methods evaluate the ``QuerySet`` and return
+something *other than* a ``QuerySet``.
+
+These methods do not use a cache (see _`Caching and QuerySets` below). Rather,
+they query the database each time they're called.
+
+``get(**kwargs)``
+~~~~~~~~~~~~~~~~~
+
+Returns the object matching the given lookup parameters, which should be in
+the format described in `Field lookups`_.
+
+``get()`` raises ``AssertionError`` if more than one object was found.
+
+``get()`` raises a ``DoesNotExist`` exception if an object wasn't found for the
+given parameters. The ``DoesNotExist`` exception is an attribute of the model
+class. Example::
+
+    Entry.objects.get(id='foo') # raises Entry.DoesNotExist
+
+The ``DoesNotExist`` exception inherits from
+``django.core.exceptions.ObjectDoesNotExist``, so you can target multiple
+``DoesNotExist`` exceptions. Example::
+
+    from django.core.exceptions import ObjectDoesNotExist
+    try:
+        e = Entry.objects.get(id=3)
+        b = Blog.objects.get(id=1)
+    except ObjectDoesNotExist:
+        print "Either the entry or blog doesn't exist."
+
+``create(**kwargs)``
+~~~~~~~~~~~~~~~~~~~~
+
+A convenience method for creating an object and saving it all in one step.  Thus::
+
+    p = Person.objects.create(first_name="Bruce", last_name="Springsteen")
+    
+and::
+
+    p = Person(first_name="Bruce", last_name="Springsteen")
+    p.save()
+    
+are equivalent.
+
+``get_or_create(**kwargs)``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A convenience method for looking up an object with the given kwargs, creating
+one if necessary.
+
+Returns a tuple of ``(object, created)``, where ``object`` is the retrieved or
+created object and ``created`` is a boolean specifying whether a new object was
+created.
+
+This is meant as a shortcut to boilerplatish code and is mostly useful for
+data-import scripts. For example::
+
+    try:
+        obj = Person.objects.get(first_name='John', last_name='Lennon')
+    except Person.DoesNotExist:
+        obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
+        obj.save()
+
+This pattern gets quite unwieldy as the number of fields in a model goes up.
+The above example can be rewritten using ``get_or_create()`` like so::
+
+    obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon',
+                      defaults={'birthday': date(1940, 10, 9)})
+
+Any keyword arguments passed to ``get_or_create()`` -- *except* an optional one
+called ``defaults`` -- will be used in a ``get()`` call. If an object is found,
+``get_or_create()`` returns a tuple of that object and ``False``. If an object
+is *not* found, ``get_or_create()`` will instantiate and save a new object,
+returning a tuple of the new object and ``True``. The new object will be
+created according to this algorithm::
+
+    defaults = kwargs.pop('defaults', {})
+    params = dict([(k, v) for k, v in kwargs.items() if '__' not in k])
+    params.update(defaults)
+    obj = self.model(**params)
+    obj.save()
+
+In English, that means start with any non-``'defaults'`` keyword argument that
+doesn't contain a double underscore (which would indicate a non-exact lookup).
+Then add the contents of ``defaults``, overriding any keys if necessary, and
+use the result as the keyword arguments to the model class.
+
+If you have a field named ``defaults`` and want to use it as an exact lookup in
+``get_or_create()``, just use ``'defaults__exact'``, like so::
+
+    Foo.objects.get_or_create(defaults__exact='bar', defaults={'defaults': 'baz'})
+
+Finally, a word on using ``get_or_create()`` in Django views. As mentioned
+earlier, ``get_or_create()`` is mostly useful in scripts that need to parse
+data and create new records if existing ones aren't available. But if you need
+to use ``get_or_create()`` in a view, please make sure to use it only in
+``POST`` requests unless you have a good reason not to. ``GET`` requests
+shouldn't have any effect on data; use ``POST`` whenever a request to a page
+has a side effect on your data. For more, see `Safe methods`_ in the HTTP spec.
+
+.. _Safe methods: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html#sec9.1.1
+
+``count()``
+~~~~~~~~~~~
+
+Returns an integer representing the number of objects in the database matching
+the ``QuerySet``. ``count()`` never raises exceptions.
+
+Example::
+
+    # Returns the total number of entries in the database.
+    Entry.objects.count()
+
+    # Returns the number of entries whose headline contains 'Lennon'
+    Entry.objects.filter(headline__contains='Lennon').count()
+
+``count()`` performs a ``SELECT COUNT(*)`` behind the scenes, so you should
+always use ``count()`` rather than loading all of the record into Python
+objects and calling ``len()`` on the result.
+
+Depending on which database you're using (e.g. PostgreSQL vs. MySQL),
+``count()`` may return a long integer instead of a normal Python integer. This
+is an underlying implementation quirk that shouldn't pose any real-world
+problems.
+
+``in_bulk(id_list)``
+~~~~~~~~~~~~~~~~~~~~
+
+Takes a list of primary-key values and returns a dictionary mapping each
+primary-key value to an instance of the object with the given ID.
+
+Example::
+
+    >>> Blog.objects.in_bulk([1])
+    {1: Beatles Blog}
+    >>> Blog.objects.in_bulk([1, 2])
+    {1: Beatles Blog, 2: Cheddar Talk}
+    >>> Blog.objects.in_bulk([])
+    {}
+
+If you pass ``in_bulk()`` an empty list, you'll get an empty dictionary.
+
+``latest(field_name=None)``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Returns the latest object in the table, by date, using the ``field_name``
+provided as the date field.
+
+This example returns the latest ``Entry`` in the table, according to the
+``pub_date`` field::
+
+    Entry.objects.latest('pub_date')
+
+If your model's ``Meta`` specifies ``get_latest_by``, you can leave off the
+``field_name`` argument to ``latest()``. Django will use the field specified in
+``get_latest_by`` by default.
+
+Like ``get()``, ``latest()`` raises ``DoesNotExist`` if an object doesn't
+exist with the given parameters.
+
+Note ``latest()`` exists purely for convenience and readability.
+
+Field lookups
+-------------
+
+Field lookups are how you specify the meat of an SQL ``WHERE`` clause. They're
+specified as keyword arguments to the ``QuerySet`` methods ``filter()``,
+``exclude()`` and ``get()``.
+
+Basic lookups keyword arguments take the form ``field__lookuptype=value``.
+(That's a double-underscore). For example::
+
+    Entry.objects.filter(pub_date__lte='2006-01-01')
+
+translates (roughly) into the following SQL::
+
+    SELECT * FROM blog_entry WHERE pub_date <= '2006-01-01';
+
+.. admonition:: How this is possible
+
+   Python has the ability to define functions that accept arbitrary name-value
+   arguments whose names and values are evaluated at runtime. For more
+   information, see `Keyword Arguments`_ in the official Python tutorial.
+
+   .. _`Keyword Arguments`: http://docs.python.org/tut/node6.html#SECTION006720000000000000000
+
+If you pass an invalid keyword argument, a lookup function will raise
+``TypeError``.
+
+The database API supports the following lookup types:
+
+exact
+~~~~~
+
+Exact match.
+
+Example::
+
+    Entry.objects.get(id__exact=14)
+
+SQL equivalent::
+
+    SELECT ... WHERE id = 14;
+
+iexact
+~~~~~~
+
+Case-insensitive exact match.
+
+Example::
+
+    Blog.objects.get(name__iexact='beatles blog')
+
+SQL equivalent::
+
+    SELECT ... WHERE name ILIKE 'beatles blog';
+
+Note this will match ``'Beatles Blog'``, ``'beatles blog'``,
+``'BeAtLes BLoG'``, etc.
+
+contains
+~~~~~~~~
+
+Case-sensitive containment test.
+
+Example::
+
+    Entry.objects.get(headline__contains='Lennon')
+
+SQL equivalent::
+
+    SELECT ... WHERE headline LIKE '%Lennon%';
+
+Note this will match the headline ``'Today Lennon honored'`` but not
+``'today lennon honored'``.
+
+SQLite doesn't support case-sensitive ``LIKE`` statements; ``contains`` acts
+like ``icontains`` for SQLite.
+
+icontains
+~~~~~~~~~
+
+Case-insensitive containment test.
+
+Example::
+
+    Entry.objects.get(headline__icontains='Lennon')
+
+SQL equivalent::
+
+    SELECT ... WHERE headline ILIKE '%Lennon%';
+
+gt
+~~
+
+Greater than.
+
+Example::
+
+    Entry.objects.filter(id__gt=4)
+
+SQL equivalent::
+
+    SELECT ... WHERE id > 4;
+
+gte
+~~~
+
+Greater than or equal to.
+
+lt
+~~
+
+Less than.
+
+lte
+~~~
+
+Less than or equal to.
+
+in
+~~
+
+In a given list.
+
+Example::
+
+    Entry.objects.filter(id__in=[1, 3, 4])
+
+SQL equivalent::
+
+    SELECT ... WHERE id IN (1, 3, 4);
+
+startswith
+~~~~~~~~~~
+
+Case-sensitive starts-with.
+
+Example::
+
+    Entry.objects.filter(headline__startswith='Will')
+
+SQL equivalent::
+
+    SELECT ... WHERE headline LIKE 'Will%';
+
+SQLite doesn't support case-sensitive ``LIKE`` statements; ``startswith`` acts
+like ``istartswith`` for SQLite.
+
+istartswith
+~~~~~~~~~~~
+
+Case-insensitive starts-with.
+
+Example::
+
+    Entry.objects.filter(headline__istartswith='will')
+
+SQL equivalent::
+
+    SELECT ... WHERE headline ILIKE 'Will%';
+
+endswith
+~~~~~~~~
+
+Case-sensitive ends-with.
+
+Example::
+
+    Entry.objects.filter(headline__endswith='cats')
+
+SQL equivalent::
+
+    SELECT ... WHERE headline LIKE '%cats';
+
+SQLite doesn't support case-sensitive ``LIKE`` statements; ``endswith`` acts
+like ``iendswith`` for SQLite.
+
+iendswith
+~~~~~~~~~
+
+Case-insensitive ends-with.
+
+Example::
+
+    Entry.objects.filter(headline__iendswith='will')
+
+SQL equivalent::
+
+    SELECT ... WHERE headline ILIKE '%will'
+
+range
+~~~~~
+
+Range test (inclusive).
+
+Example::
+
+    start_date = datetime.date(2005, 1, 1)
+    end_date = datetime.date(2005, 3, 31)
+    Entry.objects.filter(pub_date__range=(start_date, end_date))
+
+SQL equivalent::
+
+    SELECT ... WHERE pub_date BETWEEN '2005-01-01' and '2005-03-31';
+
+You can use ``range`` anywhere you can use ``BETWEEN`` in SQL -- for dates,
+numbers and even characters.
+
+year
+~~~~
+
+For date/datetime fields, exact year match. Takes a four-digit year.
+
+Example::
+
+    Entry.objects.filter(pub_date__year=2005)
+
+SQL equivalent::
+
+    SELECT ... WHERE EXTRACT('year' FROM pub_date) = '2005';
+
+(The exact SQL syntax varies for each database engine.)
+
+month
+~~~~~
+
+For date/datetime fields, exact month match. Takes an integer 1 (January)
+through 12 (December).
+
+Example::
+
+    Entry.objects.filter(pub_date__month=12)
+
+SQL equivalent::
+
+    SELECT ... WHERE EXTRACT('month' FROM pub_date) = '12';
+
+(The exact SQL syntax varies for each database engine.)
+
+day
+~~~
+
+For date/datetime fields, exact day match.
+
+Example::
+
+    Entry.objects.filter(pub_date__day=3)
+
+SQL equivalent::
+
+    SELECT ... WHERE EXTRACT('day' FROM pub_date) = '3';
+
+(The exact SQL syntax varies for each database engine.)
+
+Note this will match any record with a pub_date on the third day of the month,
+such as January 3, July 3, etc.
+
+isnull
+~~~~~~
+
+``NULL`` or ``IS NOT NULL`` match. Takes either ``True`` or ``False``, which
+correspond to ``IS NULL`` and ``IS NOT NULL``, respectively.
+
+Example::
+
+    Entry.objects.filter(pub_date__isnull=True)
+
+SQL equivalent::
+
+    SELECT ... WHERE pub_date IS NULL;
+
+search
+~~~~~~
+
+A boolean full-text search, taking advantage of full-text indexing. This is
+like ``contains`` but is significantly faster due to full-text indexing.
+
+Note this is only available in MySQL and requires direct manipulation of the
+database to add the full-text index.
+
+Default lookups are exact
+-------------------------
+
+If you don't provide a lookup type -- that is, if your keyword argument doesn't
+contain a double underscore -- the lookup type is assumed to be ``exact``.
+
+For example, the following two statements are equivalent::
+
+    Blog.objects.get(id__exact=14) # Explicit form
+    Blog.objects.get(id=14) # __exact is implied
+
+This is for convenience, because ``exact`` lookups are the common case.
+
+The pk lookup shortcut
+----------------------
+
+For convenience, Django provides a ``pk`` lookup type, which stands for
+"primary_key". This is shorthand for "an exact lookup on the primary-key."
+
+In the example ``Blog`` model, the primary key is the ``id`` field, so these
+three statements are equivalent::
+
+    Blog.objects.get(id__exact=14) # Explicit form
+    Blog.objects.get(id=14) # __exact is implied
+    Blog.objects.get(pk=14) # pk implies id__exact
+
+``pk`` lookups also work across joins. For example, these three statements are
+equivalent::
+
+    Entry.objects.filter(blog__id__exact=3) # Explicit form
+    Entry.objects.filter(blog__id=3) # __exact is implied
+    Entry.objects.filter(blog__pk=3) # __pk implies __id__exact
+
+Lookups that span relationships
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Django offers a powerful and intuitive way to "follow" relationships in
+lookups, taking care of the SQL ``JOIN``\s for you automatically, behind the
+scenes. To span a relationship, just use the field name of related fields
+across models, separated by double underscores, until you get to the field you
+want.
+
+This example retrieves all ``Entry`` objects with a ``Blog`` whose ``name``
+is ``'Beatles Blog'``::
+
+    Entry.objects.filter(blog__name__exact='Beatles Blog')
+
+This spanning can be as deep as you'd like.
+
+It works backwards, too. To refer to a "reverse" relationship, just use the
+lowercase name of the model.
+
+This example retrieves all ``Blog`` objects which have at least one ``Entry``
+whose ``headline`` contains ``'Lennon'``::
+
+    Blog.objects.filter(entry__headline__contains='Lennon')
+
+Escaping parenthesis and underscores in LIKE statements
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The field lookups that equate to ``LIKE`` SQL statements (``iexact``,
+``contains``, ``icontains``, ``startswith``, ``istartswith``, ``endswith``
+and ``iendswith``) will automatically escape the two special characters used in
+``LIKE`` statements -- the percent sign and the underscore. (In a ``LIKE``
+statement, the percent sign signifies a multiple-character wildcard and the
+underscore signifies a single-character wildcard.)
+
+This means things should work intuitively, so the abstraction doesn't leak.
+For example, to retrieve all the entries that contain a percent sign, just use
+the percent sign as any other character::
+
+    Entry.objects.filter(headline__contains='%')
+
+Django takes care of the quoting for you; the resulting SQL will look something
+like this::
+
+    SELECT ... WHERE headline LIKE '%\%%';
+
+Same goes for underscores. Both percentage signs and underscores are handled
+for you transparently.
+
+Caching and QuerySets
+---------------------
+
+Each ``QuerySet`` contains a cache, to minimize database access. It's important
+to understand how it works, in order to write the most efficient code.
+
+In a newly created ``QuerySet``, the cache is empty. The first time a
+``QuerySet`` is evaluated -- and, hence, a database query happens -- Django
+saves the query results in the ``QuerySet``'s cache and returns the results
+that have been explicitly requested (e.g., the next element, if the
+``QuerySet`` is being iterated over). Subsequent evaluations of the
+``QuerySet`` reuse the cached results.
+
+Keep this caching behavior in mind, because it may bite you if you don't use
+your ``QuerySet``\s correctly. For example, the following will create two
+``QuerySet``\s, evaluate them, and throw them away::
+
+    print [e.headline for e in Entry.objects.all()]
+    print [e.pub_date for e in Entry.objects.all()]
+
+That means the same database query will be executed twice, effectively doubling
+your database load. Also, there's a possibility the two lists may not include
+the same database records, because an ``Entry`` may have been added or deleted
+in the split second between the two requests.
+
+To avoid this problem, simply save the ``QuerySet`` and reuse it::
+
+    queryset = Poll.objects.all()
+    print [p.headline for p in queryset] # Evaluate the query set.
+    print [p.pub_date for p in queryset] # Re-use the cache from the evaluation.
+
+Comparing objects
+=================
+
+To compare two model instances, just use the standard Python comparison operator,
+the double equals sign: ``==``. Behind the scenes, that compares the primary
+key values of two models.
+
+Using the ``Entry`` example above, the following two statements are equivalent::
+
+    some_entry == other_entry
+    some_entry.id == other_entry.id
+
+If a model's primary key isn't called ``id``, no problem. Comparisons will
+always use the primary key, whatever it's called. For example, if a model's
+primary key field is called ``name``, these two statements are equivalent::
+
+    some_obj == other_obj
+    some_obj.name == other_obj.name
+
+Complex lookups with Q objects
+==============================
+
+Keyword argument queries -- in ``filter()``, etc. -- are "AND"ed together. If
+you need to execute more complex queries (for example, queries with ``OR``
+statements), you can use ``Q`` objects.
+
+A ``Q`` object (``django.db.models.Q``) is an object used to encapsulate a
+collection of keyword arguments. These keyword arguments are specified as in
+"Field lookups" above.
+
+For example, this ``Q`` object encapsulates a single ``LIKE`` query::
+
+    Q(question__startswith='What')
+
+``Q`` objects can be combined using the ``&`` and ``|`` operators. When an
+operator is used on two ``Q`` objects, it yields a new ``Q`` object.
+
+For example, this statement yields a single ``Q`` object that represents the
+"OR" of two ``"question__startswith"`` queries::
+
+    Q(question__startswith='Who') | Q(question__startswith='What')
+
+This is equivalent to the following SQL ``WHERE`` clause::
+
+    WHERE question LIKE 'Who%' OR question LIKE 'What%'
+
+You can compose statements of arbitrary complexity by combining ``Q`` objects
+with the ``&`` and ``|`` operators. You can also use parenthetical grouping.
+
+Each lookup function that takes keyword-arguments (e.g. ``filter()``,
+``exclude()``, ``get()``) can also be passed one or more ``Q`` objects as
+positional (not-named) arguments. If you provide multiple ``Q`` object
+arguments to a lookup function, the arguments will be "AND"ed together. For
+example::
+
+    Poll.objects.get(
+        Q(question__startswith='Who'),
+        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6))
+    )
+
+... roughly translates into the SQL::
+
+    SELECT * from polls WHERE question LIKE 'Who%'
+        AND (pub_date = '2005-05-02' OR pub_date = '2005-05-06')
+
+Lookup functions can mix the use of ``Q`` objects and keyword arguments. All
+arguments provided to a lookup function (be they keyword arguments or ``Q``
+objects) are "AND"ed together. However, if a ``Q`` object is provided, it must
+precede the definition of any keyword arguments. For example::
+
+    Poll.objects.get(
+        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)),
+        question__startswith='Who')
+
+... would be a valid query, equivalent to the previous example; but::
+
+    # INVALID QUERY
+    Poll.objects.get(
+        question__startswith='Who',
+        Q(pub_date=date(2005, 5, 2)) | Q(pub_date=date(2005, 5, 6)))
+
+... would not be valid.
+
+See the `OR lookups examples page`_ for more examples.
+
+.. _OR lookups examples page: http://www.djangoproject.com/documentation/models/or_lookups/
+
+Related objects
+===============
+
+When you define a relationship in a model (i.e., a ``ForeignKey``,
+``OneToOneField``, or ``ManyToManyField``), instances of that model will have
+a convenient API to access the related object(s).
+
+Using the models at the top of this page, for example, an ``Entry`` object ``e``
+can get its associated ``Blog`` object by accessing the ``blog`` attribute:
+``e.blog``.
+
+(Behind the scenes, this functionality is implemented by Python descriptors_.
+This shouldn't really matter to you, but we point it out here for the curious.)
+
+Django also creates API accessors for the "other" side of the relationship --
+the link from the related model to the model that defines the relationship.
+For example, a ``Blog`` object ``b`` has access to a list of all related
+``Entry`` objects via the ``entry_set`` attribute: ``b.entry_set.all()``.
+
+All examples in this section use the sample ``Blog``, ``Author`` and ``Entry``
+models defined at the top of this page.
+
+.. _descriptors: http://users.rcn.com/python/download/Descriptor.htm
+
+One-to-many relationships
+-------------------------
+
+Forward
+~~~~~~~
+
+If a model has a ``ForeignKey``, instances of that model will have access to
+the related (foreign) object via a simple attribute of the model.
+
+Example::
+
+    e = Entry.objects.get(id=2)
+    e.blog # Returns the related Blog object.
+
+You can get and set via a foreign-key attribute. As you may expect, changes to
+the foreign key aren't saved to the database until you call ``save()``.
+Example::
+
+    e = Entry.objects.get(id=2)
+    e.blog = some_blog
+    e.save()
+
+If a ``ForeignKey`` field has ``null=True`` set (i.e., it allows ``NULL``
+values), you can assign ``None`` to it. Example::
+
+    e = Entry.objects.get(id=2)
+    e.blog = None
+    e.save() # "UPDATE blog_entry SET blog_id = NULL ...;"
+
+Forward access to one-to-many relationships is cached the first time the
+related object is accessed. Subsequent accesses to the foreign key on the same
+object instance are cached. Example::
+
+    e = Entry.objects.get(id=2)
+    print e.blog  # Hits the database to retrieve the associated Blog.
+    print e.blog  # Doesn't hit the database; uses cached version.
+
+Note that the ``select_related()`` ``QuerySet`` method recursively prepopulates
+the cache of all one-to-many relationships ahead of time. Example::
+
+    e = Entry.objects.select_related().get(id=2)
+    print e.blog  # Doesn't hit the database; uses cached version.
+    print e.blog  # Doesn't hit the database; uses cached version.
+
+``select_related()`` is documented in the "QuerySet methods that return new
+QuerySets" section above.
+
+Backward
+~~~~~~~~
+
+If a model has a ``ForeignKey``, instances of the foreign-key model will have
+access to a ``Manager`` that returns all instances of the first model. By
+default, this ``Manager`` is named ``FOO_set``, where ``FOO`` is the source
+model name, lowercased. This ``Manager`` returns ``QuerySets``, which can be
+filtered and manipulated as described in the "Retrieving objects" section
+above.
+
+Example::
+
+    b = Blog.objects.get(id=1)
+    b.entry_set.all() # Returns all Entry objects related to Blog.
+
+    # b.entry_set is a Manager that returns QuerySets.
+    b.entry_set.filter(headline__contains='Lennon')
+    b.entry_set.count()
+
+You can override the ``FOO_set`` name by setting the ``related_name``
+parameter in the ``ForeignKey()`` definition. For example, if the ``Entry``
+model was altered to ``blog = ForeignKey(Blog, related_name='entries')``, the
+above example code would look like this::
+
+    b = Blog.objects.get(id=1)
+    b.entries.all() # Returns all Entry objects related to Blog.
+
+    # b.entries is a Manager that returns QuerySets.
+    b.entries.filter(headline__contains='Lennon')
+    b.entries.count()
+
+You cannot access a reverse ``ForeignKey`` ``Manager`` from the class; it must
+be accessed from an instance. Example::
+
+    Blog.entry_set # Raises AttributeError: "Manager must be accessed via instance".
+
+In addition to the ``QuerySet`` methods defined in "Retrieving objects" above,
+the ``ForeignKey`` ``Manager`` has these additional methods:
+
+    * ``add(obj1, obj2, ...)``: Adds the specified model objects to the related
+      object set.
+
+      Example::
+
+          b = Blog.objects.get(id=1)
+          e = Entry.objects.get(id=234)
+          b.entry_set.add(e) # Associates Entry e with Blog b.
+
+    * ``create(**kwargs)``: Creates a new object, saves it and puts it in the
+      related object set. Returns the newly created object.
+
+      Example::
+
+          b = Blog.objects.get(id=1)
+          e = b.entry_set.create(headline='Hello', body_text='Hi', pub_date=datetime.date(2005, 1, 1))
+          # No need to call e.save() at this point -- it's already been saved.
+
+      This is equivalent to (but much simpler than)::
+
+          b = Blog.objects.get(id=1)
+          e = Entry(blog=b, headline='Hello', body_text='Hi', pub_date=datetime.date(2005, 1, 1))
+          e.save()
+
+      Note that there's no need to specify the keyword argument of the model
+      that defines the relationship. In the above example, we don't pass the
+      parameter ``blog`` to ``create()``. Django figures out that the new
+      ``Entry`` object's ``blog`` field should be set to ``b``.
+
+    * ``remove(obj1, obj2, ...)``: Removes the specified model objects from the
+      related object set.
+
+      Example::
+
+          b = Blog.objects.get(id=1)
+          e = Entry.objects.get(id=234)
+          b.entry_set.remove(e) # Disassociates Entry e from Blog b.
+
+      In order to prevent database inconsistency, this method only exists on
+      ``ForeignKey``s where ``null=True``. If the related field can't be set to
+      ``None`` (``NULL``), then an object can't be removed from a relation
+      without being added to another. In the above example, removing ``e`` from
+      ``b.entry_set()`` is equivalent to doing ``e.blog = None``, and because
+      the ``blog`` ``ForeignKey`` doesn't have ``null=True``, this is invalid.
+
+    * ``clear()``: Removes all objects from the related object set.
+
+      Example::
+
+          b = Blog.objects.get(id=1)
+          b.entry_set.clear()
+
+      Note this doesn't delete the related objects -- it just disassociates
+      them.
+
+      Just like ``remove()``, ``clear()`` is only available on ``ForeignKey``s
+      where ``null=True``.
+
+To assign the members of a related set in one fell swoop, just assign to it
+from any iterable object. Example::
+
+    b = Blog.objects.get(id=1)
+    b.entry_set = [e1, e2]
+
+If the ``clear()`` method is available, any pre-existing objects will be
+removed from the ``entry_set`` before all objects in the iterable (in this
+case, a list) are added to the set. If the ``clear()`` method is *not*
+available, all objects in the iterable will be added without removing any
+existing elements.
+
+Each "reverse" operation described in this section has an immediate effect on
+the database. Every addition, creation and deletion is immediately and
+automatically saved to the database.
+
+Many-to-many relationships
+--------------------------
+
+Both ends of a many-to-many relationship get automatic API access to the other
+end. The API works just as a "backward" one-to-many relationship. See _Backward
+above.
+
+The only difference is in the attribute naming: The model that defines the
+``ManyToManyField`` uses the attribute name of that field itself, whereas the
+"reverse" model uses the lowercased model name of the original model, plus
+``'_set'`` (just like reverse one-to-many relationships).
+
+An example makes this easier to understand::
+
+    e = Entry.objects.get(id=3)
+    e.authors.all() # Returns all Author objects for this Entry.
+    e.authors.count()
+    e.authors.filter(name__contains='John')
+
+    a = Author.objects.get(id=5)
+    a.entry_set.all() # Returns all Entry objects for this Author.
+
+Like ``ForeignKey``, ``ManyToManyField`` can specify ``related_name``. In the
+above example, if the ``ManyToManyField`` in ``Entry`` had specified
+``related_name='entries'``, then each ``Author`` instance would have an
+``entries`` attribute instead of ``entry_set``.
+
+One-to-one relationships
+------------------------
+
+The semantics of one-to-one relationships will be changing soon, so we don't
+recommend you use them.
+
+How are the backward relationships possible?
+--------------------------------------------
+
+Other object-relational mappers require you to define relationships on both
+sides. The Django developers believe this is a violation of the DRY (Don't
+Repeat Yourself) principle, so Django only requires you to define the
+relationship on one end.
+
+But how is this possible, given that a model class doesn't know which other
+model classes are related to it until those other model classes are loaded?
+
+The answer lies in the ``INSTALLED_APPS`` setting. The first time any model is
+loaded, Django iterates over every model in ``INSTALLED_APPS`` and creates the
+backward relationships in memory as needed. Essentially, one of the functions
+of ``INSTALLED_APPS`` is to tell Django the entire model domain.
+
+Queries over related objects
+----------------------------
+
+Queries involving related objects follow the same rules as queries involving
+normal value fields. When specifying the the value for a query to match, you 
+may use either an object instance itself, or the primary key value for the 
+object.
+
+For example, if you have a Blog object ``b`` with ``id=5``, the following
+three queries would be identical::
+     
+    Entry.objects.filter(blog=b) # Query using object instance
+    Entry.objects.filter(blog=b.id) # Query using id from instance
+    Entry.objects.filter(blog=5) # Query using id directly
+
+Deleting objects
+================
+
+The delete method, conveniently, is named ``delete()``. This method immediately
+deletes the object and has no return value. Example::
+
+    e.delete()
+
+You can also delete objects in bulk. Every ``QuerySet`` has a ``delete()``
+method, which deletes all members of that ``QuerySet``.
+
+For example, this deletes all ``Entry`` objects with a ``pub_date`` year of
+2005::
+
+    Entry.objects.filter(pub_date__year=2005).delete()
+
+Note that ``delete()`` is the only ``QuerySet`` method that is not exposed on a
+``Manager`` itself. This is a safety mechanism to prevent you from accidentally
+requesting ``Entry.objects.delete()``, and deleting *all* the entries. If you
+*do* want to delete all the objects, then you have to explicitly request a
+complete query set::
+
+    Entry.objects.all().delete()
+
+Extra instance methods
+======================
+
+In addition to ``save()``, ``delete()``, a model object might get any or all
+of the following methods:
+
+get_FOO_display()
+-----------------
+
+For every field that has ``choices`` set, the object will have a
+``get_FOO_display()`` method, where ``FOO`` is the name of the field. This
+method returns the "human-readable" value of the field. For example, in the
+following model::
+
+    GENDER_CHOICES = (
+        ('M', 'Male'),
+        ('F', 'Female'),
+    )
+    class Person(models.Model):
+        name = models.CharField(maxlength=20)
+        gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+
+...each ``Person`` instance will have a ``get_gender_display()`` method. Example::
+
+    >>> p = Person(name='John', gender='M')
+    >>> p.save()
+    >>> p.gender
+    'M'
+    >>> p.get_gender_display()
+    'Male'
+
+get_next_by_FOO(\**kwargs) and get_previous_by_FOO(\**kwargs)
+-------------------------------------------------------------
+
+For every ``DateField`` and ``DateTimeField`` that does not have ``null=True``,
+the object will have ``get_next_by_FOO()`` and ``get_previous_by_FOO()``
+methods, where ``FOO`` is the name of the field. This returns the next and
+previous object with respect to the date field, raising the appropriate
+``DoesNotExist`` exception when appropriate.
+
+Both methods accept optional keyword arguments, which should be in the format
+described in `Field lookups`_ above.
+
+Note that in the case of identical date values, these methods will use the ID
+as a fallback check. This guarantees that no records are skipped or duplicated.
+For a full example, see the `lookup API sample model`_.
+
+.. _lookup API sample model: http://www.djangoproject.com/documentation/models/lookup/
+
+get_FOO_filename()
+------------------
+
+For every ``FileField``, the object will have a ``get_FOO_filename()`` method,
+where ``FOO`` is the name of the field. This returns the full filesystem path
+to the file, according to your ``MEDIA_ROOT`` setting.
+
+Note that ``ImageField`` is technically a subclass of ``FileField``, so every
+model with an ``ImageField`` will also get this method.
+
+get_FOO_url()
+-------------
+
+For every ``FileField``, the object will have a ``get_FOO_url()`` method,
+where ``FOO`` is the name of the field. This returns the full URL to the file,
+according to your ``MEDIA_URL`` setting. If the value is blank, this method
+returns an empty string.
+
+get_FOO_size()
+--------------
+
+For every ``FileField``, the object will have a ``get_FOO_size()`` method,
+where ``FOO`` is the name of the field. This returns the size of the file, in
+bytes. (Behind the scenes, it uses ``os.path.getsize``.)
+
+save_FOO_file(filename, raw_contents)
+-------------------------------------
+
+For every ``FileField``, the object will have a ``save_FOO_file()`` method,
+where ``FOO`` is the name of the field. This saves the given file to the
+filesystem, using the given filename. If a file with the given filename already
+exists, Django adds an underscore to the end of the filename (but before the
+extension) until the filename is available.
+
+get_FOO_height() and get_FOO_width()
+------------------------------------
+
+For every ``ImageField``, the object will have ``get_FOO_height()`` and
+``get_FOO_width()`` methods, where ``FOO`` is the name of the field. This
+returns the height (or width) of the image, as an integer, in pixels.
+
+Falling back to raw SQL
+=======================
+
+If you find yourself needing to write an SQL query that is too complex for
+Django's database-mapper to handle, you can fall back into raw-SQL statement
+mode.
+
+The preferred way to do this is by giving your model custom methods or custom
+manager methods that execute queries. Although there's nothing in Django that
+*requires* database queries to live in the model layer, this approach keeps all
+your data-access logic in one place, which is smart from an code-organization
+standpoint. For instructions, see `Executing custom SQL`_.
+
+Finally, it's important to note that the Django database layer is merely an
+interface to your database. You can access your database via other tools,
+programming languages or database frameworks; there's nothing Django-specific
+about your database.
+
+.. _Executing custom SQL: http://www.djangoproject.com/documentation/model_api/#executing-custom-sql

Added: vendor/django/current/docs/design_philosophies.txt
===================================================================
--- vendor/django/current/docs/design_philosophies.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/design_philosophies.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,281 @@
+===================
+Design philosophies
+===================
+
+This document explains some of the fundamental philosophies Django's developers
+have used in creating the framework. Its goal is to explain the past and guide
+the future.
+
+Overall
+=======
+
+Loose coupling
+--------------
+
+A fundamental goal of Django's stack is `loose coupling and tight cohesion`_.
+The various layers of the framework shouldn't "know" about each other unless
+absolutely necessary.
+
+For example, the template system knows nothing about Web requests, the database
+layer knows nothing about data display and the view system doesn't care which
+template system a programmer uses.
+
+Although Django comes with a full stack for convenience, the pieces of the
+stack are independent of another wherever possible.
+
+.. _`loose coupling and tight cohesion`: http://c2.com/cgi/wiki?CouplingAndCohesion
+
+Less code
+---------
+
+Django apps should use as little code as possible; they should lack boilerplate.
+Django should take full advantage of Python's dynamic capabilities, such as
+introspection.
+
+Quick development
+-----------------
+
+The point of a Web framework in the 21st century is to make the tedious aspects
+of Web development fast. Django should allow for incredibly quick Web
+development.
+
+Don't repeat yourself (DRY)
+---------------------------
+
+Every distinct concept and/or piece of data should live in one, and only one,
+place. Redundancy is bad. Normalization is good.
+
+The framework, within reason, should deduce as much as possible from as little
+as possible.
+
+Explicit is better than implicit
+--------------------------------
+
+This, a `core Python principle`_, means Django shouldn't do too much "magic."
+Magic shouldn't happen unless there's a really good reason for it. Magic is
+worth using only if it creates a huge convenience unattainable in other ways,
+and it isn't implemented in a way that confuses developers who are trying to
+learn how to use the feature.
+
+.. _`core Python principle`: http://www.python.org/doc/Humor.html#zen
+
+Consistency
+-----------
+
+The framework should be consistent at all levels. Consistency applies to
+everything from low-level (the Python coding style used) to high-level (the
+"experience" of using Django).
+
+Models
+======
+
+Explicit is better than implicit
+--------------------------------
+
+Fields shouldn't assume certain behaviors based solely on the name of the
+field. This requires too much knowledge of the system and is prone to errors.
+Instead, behaviors should be based on keyword arguments and, in some cases, on
+the type of the field.
+
+Include all relevant domain logic
+---------------------------------
+
+Models should encapsulate every aspect of an "object," following Martin
+Fowler's `Active Record`_ design pattern.
+
+This is why model-specific admin options are included in the model itself; data
+related to a model should be stored *in* the model.
+
+.. _`Active Record`: http://www.martinfowler.com/eaaCatalog/activeRecord.html
+
+Database API
+============
+
+The core goals of the database API are:
+
+SQL efficiency
+--------------
+
+It should execute SQL statements as few times as possible, and it should
+optimize statements internally.
+
+This is why developers need to call ``save()`` explicitly, rather than the
+framework saving things behind the scenes silently.
+
+This is also why the ``select_related()`` ``QuerySet`` method exists. It's an
+optional performance booster for the common case of selecting "every related
+object."
+
+Terse, powerful syntax
+----------------------
+
+The database API should allow rich, expressive statements in as little syntax
+as possible. It should not rely on importing other modules or helper objects.
+
+Joins should be performed automatically, behind the scenes, when necessary.
+
+Every object should be able to access every related object, systemwide. This
+access should work both ways.
+
+Option to drop into raw SQL easily, when needed
+-----------------------------------------------
+
+The database API should realize it's a shortcut but not necessarily an
+end-all-be-all. The framework should make it easy to write custom SQL -- entire
+statements, or just custom ``WHERE`` clauses as custom parameters to API calls.
+
+URL design
+==========
+
+Loose coupling
+--------------
+
+URLs in a Django app should not be coupled to the underlying Python code. Tying
+URLs to Python function names is a Bad And Ugly Thing.
+
+Along these lines, the Django URL system should allow URLs for the same app to
+be different in different contexts. For example, one site may put stories at
+``/stories/``, while another may use ``/news/``.
+
+Infinite flexibility
+--------------------
+
+URLs should be as flexible as possible. Any conceivable URL design should be
+allowed.
+
+Encourage best practices
+------------------------
+
+The framework should make it just as easy (or even easier) for a developer to
+design pretty URLs than ugly ones.
+
+File extensions in Web-page URLs should be avoided.
+
+Vignette-style commas in URLs deserve severe punishment.
+
+Definitive URLs
+---------------
+
+Technically, ``foo.com/bar`` and ``foo.com/bar/`` are two different URLs, and
+search-engine robots (and some Web traffic-analyzing tools) would treat them as
+separate pages. Django should make an effort to "normalize" URLs so that
+search-engine robots don't get confused.
+
+This is the reasoning behind the ``APPEND_SLASH`` setting.
+
+Template system
+===============
+
+Separate logic from presentation
+--------------------------------
+
+We see a template system as a tool that controls presentation and
+presentation-related logic -- and that's it. The template system shouldn't
+support functionality that goes beyond this basic goal.
+
+If we wanted to put everything in templates, we'd be using PHP. Been there,
+done that, wised up.
+
+Discourage redundancy
+---------------------
+
+The majority of dynamic Web sites use some sort of common sitewide design --
+a common header, footer, navigation bar, etc. The Django template system should
+make it easy to store those elements in a single place, eliminating duplicate
+code.
+
+This is the philosophy behind `template inheritance`_.
+
+.. _template inheritance: http://www.djangoproject.com/documentation/templates/#template-inheritance
+
+Be decoupled from HTML
+----------------------
+
+The template system shouldn't be designed so that it only outputs HTML. It
+should be equally good at generating other text-based formats, or just plain
+text.
+
+XML should not be used for template languages
+---------------------------------------------
+
+Using an XML engine to parse templates introduces a whole new world of human
+error in editing templates -- and incurs an unacceptable level of overhead in
+template processing.
+
+Assume designer competence
+--------------------------
+
+The template system shouldn't be designed so that templates necessarily are
+displayed nicely in WYSIWYG editors such as Dreamweaver. That is too severe of
+a limitation and wouldn't allow the syntax to be as nice as it is. Django
+expects template authors are comfortable editing HTML directly.
+
+Treat whitespace obviously
+--------------------------
+
+The template system shouldn't do magic things with whitespace. If a template
+includes whitespace, the system should treat the whitespace as it treats text
+-- just display it. Any whitespace that's not in a template tag should be
+displayed.
+
+Don't invent a programming language
+-----------------------------------
+
+The template system intentionally doesn't allow the following:
+
+    * Assignment to variables
+    * Advanced logic
+
+The goal is not to invent a programming language. The goal is to offer just
+enough programming-esque functionality, such as branching and looping, that is
+essential for making presentation-related decisions.
+
+The Django template system recognizes that templates are most often written by
+*designers*, not *programmers*, and therefore should not assume Python
+knowledge.
+
+Safety and security
+-------------------
+
+The template system, out of the box, should forbid the inclusion of malicious
+code -- such as commands that delete database records.
+
+This is another reason the template system doesn't allow arbitrary Python code.
+
+Extensibility
+-------------
+
+The template system should recognize that advanced template authors may want
+to extend its technology.
+
+This is the philosophy behind custom template tags and filters.
+
+Views
+=====
+
+Simplicity
+----------
+
+Writing a view should be as simple as writing a Python function. Developers
+shouldn't have to instantiate a class when a function will do.
+
+Use request objects
+-------------------
+
+Views should have access to a request object -- an object that stores metadata
+about the current request. The object should be passed directly to a view
+function, rather than the view function having to access the request data from
+a global variable. This makes it light, clean and easy to test views by passing
+in "fake" request objects.
+
+Loose coupling
+--------------
+
+A view shouldn't care about which template system the developer uses -- or even
+whether a template system is used at all.
+
+Differentiate between GET and POST
+----------------------------------
+
+GET and POST are distinct; developers should explicitly use one or the other.
+The framework should make it easy to distinguish between GET and POST data.

Added: vendor/django/current/docs/django-admin.txt
===================================================================
--- vendor/django/current/docs/django-admin.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/django-admin.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,373 @@
+=============================
+django-admin.py and manage.py
+=============================
+
+``django-admin.py`` is Django's command-line utility for administrative tasks.
+This document outlines all it can do.
+
+In addition, ``manage.py`` is automatically created in each Django project.
+``manage.py`` is a thin wrapper around ``django-admin.py`` that takes care of
+two things for you before delegating to ``django-admin.py``:
+
+    * It puts your project's package on ``sys.path``.
+
+    * It sets the ``DJANGO_SETTINGS_MODULE`` environment variable so that it
+      points to your project's ``settings.py`` file.
+
+The ``django-admin.py`` script should be on your system path if you installed
+Django via its ``setup.py`` utility. If it's not on your path, you can find it in
+``site-packages/django/bin`` within your Python installation. Consider
+symlinking to it from some place on your path, such as ``/usr/local/bin``.
+
+Generally, when working on a single Django project, it's easier to use
+``manage.py``. Use ``django-admin.py`` with ``DJANGO_SETTINGS_MODULE``, or the
+``--settings`` command line option, if you need to switch between multiple
+Django settings files.
+
+Usage
+=====
+
+``django-admin.py action [options]``
+
+``manage.py action [options]``
+
+``action`` should be one of the actions listed in this document. ``options``,
+which is optional, should be zero or more of the options listed in this
+document.
+
+Run ``django-admin.py --help`` to display a help message that includes a terse
+list of all available actions and options.
+
+Most actions take a list of ``appname``s. An ``appname`` is the basename of the
+package containing your models. For example, if your ``INSTALLED_APPS``
+contains the string ``'mysite.blog'``, the ``appname`` is ``blog``.
+
+Available actions
+=================
+
+adminindex [appname appname ...]
+--------------------------------
+
+Prints the admin-index template snippet for the given appnames.
+
+Use admin-index template snippets if you want to customize the look and feel of
+your admin's index page. See `Tutorial 2`_ for more information.
+
+.. _Tutorial 2: http://www.djangoproject.com/documentation/tutorial2/
+
+createcachetable [tablename]
+----------------------------
+
+Creates a cache table named ``tablename`` for use with the database cache
+backend.  See the `cache documentation`_ for more information.
+
+.. _cache documentation: http://www.djangoproject.com/documentation/cache/
+
+dbshell
+-------
+
+Runs the command-line client for the database engine specified in your
+``DATABASE_ENGINE`` setting, with the connection parameters specified in your
+``DATABASE_USER``, ``DATABASE_PASSWORD``, etc., settings.
+
+    * For PostgreSQL, this runs the ``psql`` command-line client.
+    * For MySQL, this runs the ``mysql`` command-line client.
+    * For SQLite, this runs the ``sqlite3`` command-line client.
+
+This command assumes the programs are on your ``PATH`` so that a simple call to
+the program name (``psql``, ``mysql``, ``sqlite3``) will find the program in
+the right place. There's no way to specify the location of the program
+manually.
+
+diffsettings
+------------
+
+Displays differences between the current settings file and Django's default
+settings.
+
+Settings that don't appear in the defaults are followed by ``"###"``. For
+example, the default settings don't define ``ROOT_URLCONF``, so
+``ROOT_URLCONF`` is followed by ``"###"`` in the output of ``diffsettings``.
+
+Note that Django's default settings live in ``django/conf/global_settings.py``,
+if you're ever curious to see the full list of defaults.
+
+inspectdb
+---------
+
+Introspects the database tables in the database pointed-to by the
+``DATABASE_NAME`` setting and outputs a Django model module (a ``models.py``
+file) to standard output.
+
+Use this if you have a legacy database with which you'd like to use Django.
+The script will inspect the database and create a model for each table within
+it.
+
+As you might expect, the created models will have an attribute for every field
+in the table. Note that ``inspectdb`` has a few special cases in its field-name
+output:
+
+    * If ``inspectdb`` cannot map a column's type to a model field type, it'll
+      use ``TextField`` and will insert the Python comment
+      ``'This field type is a guess.'`` next to the field in the generated
+      model.
+
+    * If the database column name is a Python reserved word (such as
+      ``'pass'``, ``'class'`` or ``'for'``), ``inspectdb`` will append
+      ``'_field'`` to the attribute name. For example, if a table has a column
+      ``'for'``, the generated model will have a field ``'for_field'``, with
+      the ``db_column`` attribute set to ``'for'``. ``inspectdb`` will insert
+      the Python comment
+      ``'Field renamed because it was a Python reserved word.'`` next to the
+      field.
+
+This feature is meant as a shortcut, not as definitive model generation. After
+you run it, you'll want to look over the generated models yourself to make
+customizations. In particular, you'll need to rearrange models' order, so that
+models that refer to other models are ordered properly.
+
+Primary keys are automatically introspected for PostgreSQL, MySQL and
+SQLite, in which case Django puts in the ``primary_key=True`` where
+needed.
+
+``inspectdb`` works with PostgreSQL, MySQL and SQLite. Foreign-key detection
+only works in PostgreSQL and with certain types of MySQL tables.
+
+install [appname appname ...]
+-----------------------------
+
+Executes the equivalent of ``sqlall`` for the given appnames.
+
+runserver [optional port number, or ipaddr:port]
+------------------------------------------------
+
+Starts a lightweight development Web server on the local machine. By default,
+the server runs on port 8000 on the IP address 127.0.0.1. You can pass in an
+IP address and port number explicitly.
+
+If you run this script as a user with normal privileges (recommended), you
+might not have access to start a port on a low port number. Low port numbers
+are reserved for the superuser (root).
+
+DO NOT USE THIS SERVER IN A PRODUCTION SETTING. It has not gone through
+security audits or performance tests. (And that's how it's gonna stay. We're in
+the business of making Web frameworks, not Web servers, so improving this
+server to be able to handle a production environment is outside the scope of
+Django.)
+
+The development server automatically reloads Python code for each request, as
+needed. You don't need to restart the server for code changes to take effect.
+
+When you start the server, and each time you change Python code while the
+server is running, the server will validate all of your installed models. (See
+the ``validate`` command below.) If the validator finds errors, it will print
+them to standard output, but it won't stop the server.
+
+You can run as many servers as you want, as long as they're on separate ports.
+Just execute ``django-admin.py runserver`` more than once.
+
+Note that the default IP address, 127.0.0.1, is not accessible from other
+machines on your network. To make your development server viewable to other
+machines on the network, use its own IP address (e.g. ``192.168.2.1``) or
+``0.0.0.0``.
+
+Examples:
+~~~~~~~~~
+
+Port 7000 on IP address 127.0.0.1::
+
+    django-admin.py runserver 7000
+
+Port 7000 on IP address 1.2.3.4::
+
+    django-admin.py runserver 1.2.3.4:7000
+
+Serving static files with the development server
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+By default, the development server doesn't serve any static files for your site
+(such as CSS files, images, things under ``MEDIA_ROOT_URL`` and so forth). If
+you want to configure Django to serve static media, read the `serving static files`_
+documentation.
+
+.. _serving static files: http://www.djangoproject.com/documentation/static_files/
+
+Turning off auto-reload
+~~~~~~~~~~~~~~~~~~~~~~~
+
+To disable auto-reloading of code while the development server is running, use the
+``--noreload`` option, like so::
+
+    django-admin.py runserver --noreload
+
+shell
+-----
+
+Starts the Python interactive interpreter.
+
+Django will use IPython_, if it's installed. If you have IPython installed and
+want to force use of the "plain" Python interpreter, use the ``--plain``
+option, like so::
+
+    django-admin.py shell --plain
+
+.. _IPython: http://ipython.scipy.org/
+
+sql [appname appname ...]
+-------------------------
+
+Prints the CREATE TABLE SQL statements for the given appnames.
+
+sqlall [appname appname ...]
+----------------------------
+
+Prints the CREATE TABLE and initial-data SQL statements for the given appnames.
+
+Refer to the description of ``sqlinitialdata`` for an explanation of how to
+specify initial data.
+
+sqlclear [appname appname ...]
+--------------------------------------
+
+Prints the DROP TABLE SQL statements for the given appnames.
+
+sqlindexes [appname appname ...]
+----------------------------------------
+
+Prints the CREATE INDEX SQL statements for the given appnames.
+
+sqlinitialdata [appname appname ...]
+--------------------------------------------
+
+Prints the initial INSERT SQL statements for the given appnames.
+
+For each model in each specified app, this command looks for the file
+``<appname>/sql/<modelname>.sql``, where ``<appname>`` is the given appname and
+``<modelname>`` is the model's name in lowercase. For example, if you have an
+app ``news`` that includes a ``Story`` model, ``sqlinitialdata`` will attempt
+to read a file ``news/sql/story.sql`` and append it to the output of this
+command.
+
+Each of the SQL files, if given, is expected to contain valid SQL. The SQL
+files are piped directly into the database after all of the models'
+table-creation statements have been executed. Use this SQL hook to populate
+tables with any necessary initial records, SQL functions or test data.
+
+sqlreset [appname appname ...]
+--------------------------------------
+
+Prints the DROP TABLE SQL, then the CREATE TABLE SQL, for the given appnames.
+
+sqlsequencereset [appname appname ...]
+----------------------------------------------
+
+Prints the SQL statements for resetting PostgreSQL sequences for the given
+appnames.
+
+See http://simon.incutio.com/archive/2004/04/21/postgres for more information.
+
+startapp [appname]
+------------------
+
+Creates a Django app directory structure for the given app name in the current
+directory.
+
+startproject [projectname]
+--------------------------
+
+Creates a Django project directory structure for the given project name in the
+current directory.
+
+syncdb
+------
+
+Creates the database tables for all apps in ``INSTALLED_APPS`` whose tables
+have not already been created.
+
+Use this command when you've added new applications to your project and want to
+install them in the database. This includes any apps shipped with Django that
+might be in ``INSTALLED_APPS`` by default. When you start a new project, run
+this command to install the default apps.
+
+If you're installing the ``django.contrib.auth`` application, ``syncdb`` will
+give you the option of creating a superuser immediately.
+
+validate
+--------
+
+Validates all installed models (according to the ``INSTALLED_APPS`` setting)
+and prints validation errors to standard output.
+
+Available options
+=================
+
+--settings
+----------
+
+Example usage::
+
+    django-admin.py syncdb --settings=mysite.settings
+
+Explicitly specifies the settings module to use. The settings module should be
+in Python package syntax, e.g. ``mysite.settings``. If this isn't provided,
+``django-admin.py`` will use the ``DJANGO_SETTINGS_MODULE`` environment
+variable.
+
+Note that this option is unnecessary in ``manage.py``, because it takes care of
+setting ``DJANGO_SETTINGS_MODULE`` for you.
+
+--pythonpath
+------------
+
+Example usage::
+
+    django-admin.py syncdb --pythonpath='/home/djangoprojects/myproject'
+
+Adds the given filesystem path to the Python `import search path`_. If this
+isn't provided, ``django-admin.py`` will use the ``PYTHONPATH`` environment
+variable.
+
+Note that this option is unnecessary in ``manage.py``, because it takes care of
+setting the Python path for you.
+
+.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html
+
+--help
+------
+
+Displays a help message that includes a terse list of all available actions and
+options.
+
+--version
+---------
+
+Displays the current Django version.
+
+Example output::
+
+    0.9.1
+    0.9.1 (SVN)
+
+Extra niceties
+==============
+
+Syntax coloring
+---------------
+
+The ``django-admin.py`` / ``manage.py`` commands that output SQL to standard
+output will use pretty color-coded output if your terminal supports
+ANSI-colored output. It won't use the color codes if you're piping the
+command's output to another program.
+
+Bash completion
+---------------
+
+If you use the Bash shell, consider installing the Django bash completion
+script, which lives in ``extras/django_bash_completion`` in the Django
+distribution. It enables tab-completion of ``django-admin.py`` and
+``manage.py`` commands, so you can, for instance...
+
+    * Type ``django-admin.py``.
+    * Press [TAB] to see all available options.
+    * Type ``sql``, then [TAB], to see all available options whose names start
+      with ``sql``.

Added: vendor/django/current/docs/email.txt
===================================================================
--- vendor/django/current/docs/email.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/email.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,176 @@
+==============
+Sending e-mail
+==============
+
+Although Python makes sending e-mail relatively easy via the `smtplib library`_,
+Django provides a couple of light wrappers over it, to make sending e-mail
+extra quick.
+
+The code lives in a single module: ``django.core.mail``.
+
+.. _smtplib library: http://www.python.org/doc/current/lib/module-smtplib.html
+
+Quick example
+=============
+
+In two lines::
+
+    from django.core.mail import send_mail
+
+    send_mail('Subject here', 'Here is the message.', 'from at example.com',
+        ['to at example.com'], fail_silently=False)
+        
+.. note::
+
+    The character set of email sent with ``django.core.mail`` will be set to
+    the value of your `DEFAULT_CHARSET setting`_.
+    
+.. _DEFAULT_CHARSET setting: ../settings/#DEFAULT_CHARSET
+
+send_mail()
+===========
+
+The simplest way to send e-mail is using the function
+``django.core.mail.send_mail()``. Here's its definition::
+
+    send_mail(subject, message, from_email, recipient_list,
+        fail_silently=False, auth_user=EMAIL_HOST_USER,
+        auth_password=EMAIL_HOST_PASSWORD)
+
+The ``subject``, ``message``, ``from_email`` and ``recipient_list`` parameters
+are required.
+
+    * ``subject``: A string.
+    * ``message``: A string.
+    * ``from_email``: A string.
+    * ``recipient_list``: A list of strings, each an e-mail address. Each
+      member of ``recipient_list`` will see the other recipients in the "To:"
+      field of the e-mail message.
+    * ``fail_silently``: A boolean. If it's ``False``, ``send_mail`` will raise
+      an ``smtplib.SMTPException``. See the `smtplib docs`_ for a list of
+      possible exceptions, all of which are subclasses of ``SMTPException``.
+    * ``auth_user``: The optional username to use to authenticate to the SMTP
+      server. If this isn't provided, Django will use the value of the
+      ``EMAIL_HOST_USER`` setting.
+    * ``auth_password``: The optional password to use to authenticate to the
+      SMTP server. If this isn't provided, Django will use the value of the
+      ``EMAIL_HOST_PASSWORD`` setting.
+
+.. _smtplib docs: http://www.python.org/doc/current/lib/module-smtplib.html
+
+send_mass_mail()
+================
+
+``django.core.mail.send_mass_mail()`` is intended to handle mass e-mailing.
+Here's the definition::
+
+    send_mass_mail(datatuple, fail_silently=False,
+        auth_user=EMAIL_HOST_USER, auth_password=EMAIL_HOST_PASSWORD):
+
+``datatuple`` is a tuple in which each element is in this format::
+
+    (subject, message, from_email, recipient_list)
+
+``fail_silently``, ``auth_user`` and ``auth_password`` have the same functions
+as in ``send_mail()``.
+
+Each separate element of ``datatuple`` results in a separate e-mail message.
+As in ``send_mail()``, recipients in the same ``recipient_list`` will all see
+the other addresses in the e-mail messages's "To:" field.
+
+send_mass_mail() vs. send_mail()
+--------------------------------
+
+The main difference between ``send_mass_mail()`` and ``send_mail()`` is that
+``send_mail()`` opens a connection to the mail server each time it's executed,
+while ``send_mass_mail()`` uses a single connection for all of its messages.
+This makes ``send_mass_mail()`` slightly more efficient.
+
+mail_admins()
+=============
+
+``django.core.mail.mail_admins()`` is a shortcut for sending an e-mail to the
+site admins, as defined in the `ADMINS setting`_. Here's the definition::
+
+    mail_admins(subject, message, fail_silently=False)
+
+``mail_admins()`` prefixes the subject with the value of the
+`EMAIL_SUBJECT_PREFIX setting`_, which is ``"[Django] "`` by default.
+
+The "From:" header of the e-mail will be the value of the `SERVER_EMAIL setting`_.
+
+This method exists for convenience and readability.
+
+.. _ADMINS setting: http://www.djangoproject.com/documentation/settings/#admins
+.. _EMAIL_SUBJECT_PREFIX setting: http://www.djangoproject.com/documentation/settings/#email-subject-prefix
+.. _SERVER_EMAIL setting: http://www.djangoproject.com/documentation/settings/#server-email
+
+mail_managers() function
+========================
+
+``django.core.mail.mail_managers()`` is just like ``mail_admins()``, except it
+sends an e-mail to the site managers, as defined in the `MANAGERS setting`_.
+Here's the definition::
+
+    mail_managers(subject, message, fail_silently=False)
+
+.. _MANAGERS setting: http://www.djangoproject.com/documentation/settings/#managers
+
+Examples
+========
+
+This sends a single e-mail to john at example.com and jane at example.com, with them
+both appearing in the "To:"::
+
+    send_mail('Subject', 'Message.', 'from at example.com',
+        ['john at example.com', 'jane at example.com'])
+
+This sends a message to john at example.com and jane at example.com, with them both
+receiving a separate e-mail::
+
+    datatuple = (
+        ('Subject', 'Message.', 'from at example.com', ['john at example.com']),
+        ('Subject', 'Message.', 'from at example.com', ['jane at example.com']),
+    )
+    send_mass_mail(datatuple)
+
+Preventing header injection
+===========================
+
+`Header injection`_ is a security exploit in which an attacker inserts extra
+e-mail headers to control the "To:" and "From:" in e-mail messages that your
+scripts generate.
+
+The Django e-mail functions outlined above all protect against header injection
+by forbidding newlines in header values. If any ``subject``, ``from_email`` or
+``recipient_list`` contains a newline (in either Unix, Windows or Mac style),
+the e-mail function (e.g. ``send_mail()``) will raise
+``django.core.mail.BadHeaderError`` (a subclass of ``ValueError``) and, hence,
+will not send the e-mail. It's your responsibility to validate all data before
+passing it to the e-mail functions.
+
+If a ``message`` contains headers at the start of the string, the headers will
+simply be printed as the first bit of the e-mail message.
+
+Here's an example view that takes a ``subject``, ``message`` and ``from_email``
+from the request's POST data, sends that to admin at example.com and redirects to
+"/contact/thanks/" when it's done::
+
+    from django.core.mail import send_mail, BadHeaderError
+
+    def send_email(request):
+        subject = request.POST.get('subject', '')
+        message = request.POST.get('message', '')
+        from_email = request.POST.get('from_email', '')
+        if subject and message and from_email:
+            try:
+                send_mail(subject, message, from_email, ['admin at example.com'])
+            except BadHeaderError:
+                return HttpResponse('Invalid header found.')
+            return HttpResponseRedirect('/contact/thanks/')
+        else:
+            # In reality we'd use a manipulator
+            # to get proper validation errors.
+            return HttpResponse('Make sure all fields are entered and valid.')
+
+.. _Header injection: http://securephp.damonkohler.com/index.php/Email_Injection

Added: vendor/django/current/docs/faq.txt
===================================================================
--- vendor/django/current/docs/faq.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/faq.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,649 @@
+==========
+Django FAQ
+==========
+
+General questions
+=================
+
+Why does this project exist?
+----------------------------
+
+Django grew from a very practical need: World Online, a newspaper Web
+operation, is responsible for building intensive Web applications on journalism
+deadlines. In the fast-paced newsroom, World Online often has only a matter of
+hours to take a complicated Web application from concept to public launch.
+
+At the same time, the World Online Web developers have consistently been
+perfectionists when it comes to following best practices of Web development.
+
+Thus, Django was designed not only to allow fast Web development, but
+*best-practice* Web development.
+
+Django would not be possible without a whole host of open-source projects --
+`Apache`_, `Python`_, and `PostgreSQL`_ to name a few -- and we're thrilled to
+be able to give something back to the open-source community.
+
+.. _Apache: http://httpd.apache.org/
+.. _Python: http://www.python.org/
+.. _PostgreSQL: http://www.postgresql.org/
+
+What does "Django" mean, and how do you pronounce it?
+-----------------------------------------------------
+
+Django is named after `Django Reinhardt`_, a gypsy jazz guitarist from the 1930s
+to early 1950s. To this day, he's considered one of the best guitarists of all time.
+
+Listen to his music. You'll like it.
+
+Django is pronounced **JANG**-oh. Rhymes with FANG-oh. The "D" is silent.
+
+.. _Django Reinhardt: http://en.wikipedia.org/wiki/Django_Reinhardt
+
+Is Django stable?
+-----------------
+
+Yes. World Online has been using Django for more than two years. Sites built on
+Django have weathered traffic spikes of over one million hits an hour and a
+number of Slashdottings. Yes, it's quite stable.
+
+Does Django scale?
+------------------
+
+Yes. Compared to development time, hardware is cheap, and so Django is
+designed to take advantage of as much hardware as you can throw at it.
+
+Django uses a "shared-nothing" architecture, which means you can add hardware
+at any level -- database servers, caching servers or Web/application servers.
+
+The framework cleanly separates components such as its database layer and
+application layer. And it ships with a simple-yet-powerful `cache framework`_.
+
+.. _`cache framework`: http://www.djangoproject.com/documentation/cache/
+
+Who's behind this?
+------------------
+
+Django was developed at `World Online`_, the Web department of a newspaper in
+Lawrence, Kansas, USA.
+
+`Adrian Holovaty`_
+    Adrian is a Web developer with a background in journalism. He was lead
+    developer at World Online for 2.5 years, during which time Django was
+    developed and implemented on World Online's sites. Now he works for
+    washingtonpost.com building rich, database-backed information sites, and
+    continues to oversee Django development. He likes playing guitar (Django
+    Reinhardt style) and hacking on side projects such as `chicagocrime.org`_.
+    He lives in Chicago.
+
+    On IRC, Adrian goes by ``adrian_h``.
+
+`Jacob Kaplan-Moss`_
+    Jacob is a whipper-snapper from California who spends equal time coding and
+    cooking. He's lead developer at World Online and actively hacks on various
+    cool side projects. He's contributed to the Python-ObjC bindings and was
+    the first guy to figure out how to write Tivo apps in Python. Lately he's
+    been messing with Python on the PSP. He lives in Lawrence, Kansas.
+
+    On IRC, Jacob goes by ``jacobkm``.
+
+`Simon Willison`_
+    Simon is a well-respected Web developer from England. He had a one-year
+    internship at World Online, during which time he and Adrian developed
+    Django from scratch. The most enthusiastic Brit you'll ever meet, he's
+    passionate about best practices in Web development and has maintained a
+    well-read Web-development blog for years at http://simon.incutio.com.
+    He works for Yahoo UK, where he managed to score the title "Hacker Liason."
+    He lives in London.
+
+    On IRC, Simon goes by ``SimonW``.
+
+`Wilson Miner`_
+    Wilson's design-fu makes us all look like rock stars. When not sneaking
+    into apartment complex swimming pools, he's the Commercial Development
+    Director for World Online, which means he makes the money that pays all our
+    paychecks. He lives in Lawrence, Kansas.
+
+    On IRC, Wilson goes by ``wilsonian``.
+
+.. _`World Online`: http://code.djangoproject.com/wiki/WorldOnline
+.. _`Adrian Holovaty`: http://www.holovaty.com/
+.. _`washingtonpost.com`: http://www.washingtonpost.com/
+.. _`chicagocrime.org`: http://www.chicagocrime.org/
+.. _`Simon Willison`: http://simon.incutio.com/
+.. _`simon.incutio.com`: http://simon.incutio.com/
+.. _`Jacob Kaplan-Moss`: http://www.jacobian.org/
+.. _`Wilson Miner`: http://www.wilsonminer.com/
+
+Which sites use Django?
+-----------------------
+
+The Django wiki features a consistently growing `list of Django-powered sites`_.
+Feel free to add your Django-powered site to the list.
+
+.. _list of Django-powered sites: http://code.djangoproject.com/wiki/DjangoPoweredSites
+
+Django appears to be a MVC framework, but you call the Controller the "view", and the View the "template". How come you don't use the standard names?
+-----------------------------------------------------------------------------------------------------------------------------------------------------
+
+Well, the standard names are debatable.
+
+In our interpretation of MVC, the "view" describes the data that gets presented
+to the user. It's not necessarily *how* the data *looks*, but *which* data is
+presented. The view describes *which data you see*, not *how you see it.* It's
+a subtle distinction.
+
+So, in our case, a "view" is the Python callback function for a particular URL,
+because that callback function describes which data is presented.
+
+Furthermore, it's sensible to separate content from presentation -- which is
+where templates come in. In Django, a "view" describes which data is presented,
+but a view normally delegates to a template, which describes *how* the data is
+presented.
+
+Where does the "controller" fit in, then? In Django's case, it's probably the
+framework itself: the machinery that sends a request to the appropriate view,
+according to the Django URL configuration.
+
+If you're hungry for acronyms, you might say that Django is a "MTV" framework
+-- that is, "model", "template", and "view." That breakdown makes much more
+sense.
+
+At the end of the day, of course, it comes down to getting stuff done. And,
+regardless of how things are named, Django gets stuff done in a way that's most
+logical to us.
+
+<Framework X> does <feature Y> -- why doesn't Django?
+-----------------------------------------------------
+
+We're well aware that there are other awesome Web frameworks out there, and
+we're not averse to borrowing ideas where appropriate. However, Django was
+developed precisely because we were unhappy with the status quo, so please be
+aware that "because <Framework X>" does it is not going to be sufficient reason
+to add a given feature to Django.
+
+Why did you write all of Django from scratch, instead of using other Python libraries?
+--------------------------------------------------------------------------------------
+
+When Django was originally written a couple of years ago, Adrian and Simon
+spent quite a bit of time exploring the various Python Web frameworks
+available.
+
+In our opinion, none of them were completely up to snuff.
+
+We're picky. You might even call us perfectionists. (With deadlines.)
+
+Over time, we stumbled across open-source libraries that did things we'd
+already implemented. It was reassuring to see other people solving similar
+problems in similar ways, but it was too late to integrate outside code: We'd
+already written, tested and implemented our own framework bits in several
+production settings -- and our own code met our needs delightfully.
+
+In most cases, however, we found that existing frameworks/tools inevitably had
+some sort of fundamental, fatal flaw that made us squeamish. No tool fit our
+philosophies 100%.
+
+Like we said: We're picky.
+
+We've documented our philosophies on the `design philosophies page`_.
+
+.. _design philosophies page: http://www.djangoproject.com/documentation/design_philosophies/
+
+Do you have any of those nifty "screencast" things?
+---------------------------------------------------
+
+You can bet your bottom they're on the way. But, since we're still hammering
+out a few points, we want to make sure they reflect the final state of things
+at Django 1.0, not some intermediary step. In other words, we don't want to
+spend a lot of energy creating screencasts yet, because Django APIs will shift.
+
+In the meantime, though, check out this `unofficial Django screencast`_.
+
+.. _unofficial Django screencast: http://www.throwingbeans.org/django_screencasts.html
+
+Is Django a content-management-system (CMS)?
+--------------------------------------------
+
+No, Django is not a CMS, or any sort of "turnkey product" in and of itself.
+It's a Web framework; it's a programming tool that lets you build Web sites.
+
+For example, it doesn't make much sense to compare Django to something like
+Drupal_, because Django is something you use to *create* things like Drupal.
+
+Of course, Django's automatic admin site is fantastic and timesaving -- but
+the admin site is one module of Django the framework. Furthermore, although
+Django has special conveniences for building "CMS-y" apps, that doesn't mean
+it's not just as appropriate for building "non-CMS-y" apps (whatever that
+means!).
+
+.. _Drupal: http://drupal.org/
+
+When will you release Django 1.0?
+---------------------------------
+
+Short answer: When we're comfortable with Django's APIs, have added all
+features that we feel are necessary to earn a "1.0" status, and are ready to
+begin maintaining backwards compatibility. This should happen in a couple of
+months or so, although it's entirely possible that it could happen earlier.
+That translates into summer 2006.
+
+The merging of Django's `magic-removal branch`_ went a long way toward Django
+1.0.
+
+Of course, you should note that `quite a few production sites`_ use Django in
+its current status. Don't let the lack of a 1.0 turn you off.
+
+.. _magic-removal branch: http://code.djangoproject.com/wiki/RemovingTheMagic
+.. _quite a few production sites: http://code.djangoproject.com/wiki/DjangoPoweredSites
+
+How can I download the Django documentation to read it offline?
+---------------------------------------------------------------
+
+The Django docs are available in the ``docs`` directory of each Django tarball
+release. These docs are in ReST (ReStructured Text) format, and each text file
+corresponds to a Web page on the official Django site.
+
+Because the documentation is `stored in revision control`_, you can browse
+documentation changes just like you can browse code changes.
+
+Technically, the docs on Django's site are generated from the latest development
+versions of those ReST documents, so the docs on the Django site may offer more
+information than the docs that come with the latest Django release.
+
+.. _stored in revision control: http://code.djangoproject.com/browser/django/trunk/docs
+
+Where can I find Django developers for hire?
+--------------------------------------------
+
+Consult our `developers for hire page`_ for a list of Django developers who
+would be happy to help you.
+
+You might also be interested in posting a job to http://www.gypsyjobs.com/ .
+
+.. _developers for hire page: http://code.djangoproject.com/wiki/DevelopersForHire
+
+Installation questions
+======================
+
+How do I get started?
+---------------------
+
+    #. `Download the code`_.
+    #. Install Django (read the `installation guide`_).
+    #. Walk through the tutorial_.
+    #. Check out the rest of the documentation_, and `ask questions`_ if you
+       run into trouble.
+
+.. _`Download the code`: http://www.djangoproject.com/download/
+.. _`installation guide`: http://www.djangoproject.com/documentation/install/
+.. _tutorial:  http://www.djangoproject.com/documentation/tutorial1/
+.. _documentation: http://www.djangoproject.com/documentation/
+.. _ask questions: http://www.djangoproject.com/community/
+
+How do I fix the "install a later version of setuptools" error?
+---------------------------------------------------------------
+
+Just run the ``ez_setup.py`` script in the Django distribution.
+
+What are Django's prerequisites?
+--------------------------------
+
+Django requires Python_ 2.3 or later. No other Python libraries are required
+for basic Django usage.
+
+For a development environment -- if you just want to experiment with Django --
+you don't need to have a separate Web server installed; Django comes with its
+own lightweight development server. For a production environment, we recommend
+`Apache 2`_ and mod_python_, although Django follows the WSGI_ spec, which
+means it can run on a variety of server platforms.
+
+If you want to use Django with a database, which is probably the case, you'll
+also need a database engine. PostgreSQL_ is recommended, because we're
+PostgreSQL fans, and MySQL_ and `SQLite 3`_ are also supported.
+
+.. _Python: http://www.python.org/
+.. _Apache 2: http://httpd.apache.org/
+.. _mod_python: http://www.modpython.org/
+.. _WSGI: http://www.python.org/peps/pep-0333.html
+.. _PostgreSQL: http://www.postgresql.org/
+.. _MySQL: http://www.mysql.com/
+.. _`SQLite 3`: http://www.sqlite.org/
+
+Do I have to use mod_python?
+----------------------------
+
+Although we recommend mod_python for production use, you don't have to use it,
+thanks to the fact that Django uses an arrangement called WSGI_. Django can
+talk to any WSGI-enabled server. The most common non-mod_python deployment
+setup is FastCGI. See `How to use Django with FastCGI`_ for full information.
+
+Also, see the `server arrangements wiki page`_ for other deployment strategies.
+
+If you just want to play around and develop things on your local computer, use
+the development Web server that comes with Django. Things should Just Work.
+
+.. _WSGI: http://www.python.org/peps/pep-0333.html
+.. _How to use Django with FastCGI: http://www.djangoproject.com/documentation/fastcgi/
+.. _server arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements
+
+How do I install mod_python on Windows?
+---------------------------------------
+
+    * For Python 2.4, grab mod_python from `win32 build of mod_python for
+      Python 2.4`_.
+    * For Python 2.4, check out this `Django on Windows howto`_.
+    * For Python 2.3, grab mod_python from http://www.modpython.org/ and read
+      `Running mod_python on Apache on Windows2000`_.
+    * Also, try this (not Windows-specific) `guide to getting mod_python
+      working`_.
+
+.. _`win32 build of mod_python for Python 2.4`: http://www.lehuen.com/nicolas/index.php/2005/02/21/39-win32-build-of-mod_python-314-for-python-24
+.. _`Django on Windows howto`: http://thinkhole.org/wp/2006/04/03/django-on-windows-howto/
+.. _`Running mod_python on Apache on Windows2000`: http://groups-beta.google.com/group/comp.lang.python/msg/139af8c83a5a9d4f
+.. _`guide to getting mod_python working`: http://www.dscpl.com.au/articles/modpython-001.html
+
+Will Django run under shared hosting (like TextDrive or Dreamhost)?
+-------------------------------------------------------------------
+
+See our `Django-friendly Web hosts`_ page.
+
+.. _`Django-friendly Web hosts`: http://code.djangoproject.com/wiki/DjangoFriendlyWebHosts
+
+Should I use the official version or development version?
+---------------------------------------------------------
+
+The Django developers improve Django every day and are pretty good about not
+checking in broken code. We use the development code (from the Subversion
+repository) directly on our servers, so we consider it stable. With that in
+mind, we recommend that you use the latest development code, because it
+generally contains more features and fewer bugs than the "official" releases.
+
+Using Django
+============
+
+Why do I get an error about importing DJANGO_SETTINGS_MODULE?
+-------------------------------------------------------------
+
+Make sure that:
+
+    * The environment variable DJANGO_SETTINGS_MODULE is set to a fully-qualified
+      Python module (i.e. "mysite.settings.main").
+
+    * Said module is on ``sys.path`` (``import mysite.settings.main`` should work).
+
+    * The module doesn't contain syntax errors (of course).
+
+    * If you're using mod_python but *not* using Django's request handler,
+      you'll need to work around a mod_python bug related to the use of
+      ``SetEnv``; before you import anything from Django you'll need to do
+      the following::
+
+            os.environ.update(req.subprocess_env)
+
+      (where ``req`` is the mod_python request object).
+
+I can't stand your template language. Do I have to use it?
+----------------------------------------------------------
+
+We happen to think our template engine is the best thing since chunky bacon,
+but we recognize that choosing a template language runs close to religion.
+There's nothing about Django that requires using the template language, so
+if you're attached to ZPT, Cheetah, or whatever, feel free to use those.
+
+Do I have to use your model/database layer?
+-------------------------------------------
+
+Nope. Just like the template system, the model/database layer is decoupled from
+the rest of the framework.
+
+The one exception is: If you use a different database library, you won't get to
+use Django's automatically-generated admin site. That app is coupled to the
+Django database layer.
+
+How do I use image and file fields?
+-----------------------------------
+
+Using a ``FileField`` or an ``ImageField`` in a model takes a few steps:
+
+    #. In your settings file, define ``MEDIA_ROOT`` as the full path to
+       a directory where you'd like Django to store uploaded files. (For
+       performance, these files are not stored in the database.) Define
+       ``MEDIA_URL`` as the base public URL of that directory. Make sure that
+       this directory is writable by the Web server's user account.
+
+    #. Add the ``FileField`` or ``ImageField`` to your model, making sure
+       to define the ``upload_to`` option to tell Django to which subdirectory
+       of ``MEDIA_ROOT`` it should upload files.
+
+    #. All that will be stored in your database is a path to the file
+       (relative to ``MEDIA_ROOT``). You'll must likely want to use the
+       convenience ``get_<fieldname>_url`` function provided by Django. For
+       example, if your ``ImageField`` is called ``mug_shot``, you can get the
+       absolute URL to your image in a template with
+       ``{{ object.get_mug_shot_url }}``.
+
+Databases and models
+====================
+
+How can I see the raw SQL queries Django is running?
+----------------------------------------------------
+
+Make sure your Django ``DEBUG`` setting is set to ``True``. Then, just do
+this::
+
+    >>> from django.db import connection
+    >>> connection.queries
+    [{'sql': 'SELECT polls_polls.id,polls_polls.question,polls_polls.pub_date FROM polls_polls',
+    'time': '0.002'}]
+
+``connection.queries`` is only available if ``DEBUG`` is ``True``. It's a list
+of dictionaries in order of query execution. Each dictionary has the following::
+
+    ``sql`` -- The raw SQL statement
+    ``time`` -- How long the statement took to execute, in seconds.
+
+``connection.queries`` includes all SQL statements -- INSERTs, UPDATES,
+SELECTs, etc. Each time your app hits the database, the query will be recorded.
+
+Can I use Django with a pre-existing database?
+----------------------------------------------
+
+Yes. See `Integrating with a legacy database`_.
+
+.. _`Integrating with a legacy database`: http://www.djangoproject.com/documentation/legacy_databases/
+
+If I make changes to a model, how do I update the database?
+-----------------------------------------------------------
+
+If you don't mind clearing data, your project's ``manage.py`` utility has an
+option to reset the SQL for a particular application::
+
+    manage.py reset appname
+
+This drops any tables associated with ``appname`` and recreates them.
+
+If you do care about deleting data, you'll have to execute the ``ALTER TABLE``
+statements manually in your database. That's the way we've always done it,
+because dealing with data is a very sensitive operation that we've wanted to
+avoid automating. That said, there's some work being done to add partially
+automated database-upgrade functionality.
+
+Do Django models support multiple-column primary keys?
+------------------------------------------------------
+
+No. Only single-column primary keys are supported.
+
+But this isn't an issue in practice, because there's nothing stopping you from
+adding other constraints (using the ``unique_together`` model option or
+creating the constraint directly in your database), and enforcing the
+uniqueness at that level. Single-column primary keys are needed for things such
+as the admin interface to work; e.g., you need a simple way of being able to
+specify an object to edit or delete.
+
+How do I add database-specific options to my CREATE TABLE statements, such as specifying MyISAM as the table type?
+------------------------------------------------------------------------------------------------------------------
+
+We try to avoid adding special cases in the Django code to accomodate all the
+database-specific options such as table type, etc. If you'd like to use any of
+these options, create an `SQL initial data file`_ that contains ``ALTER TABLE``
+statements that do what you want to do. The initial data files are executed in
+your database after the ``CREATE TABLE`` statements.
+
+For example, if you're using MySQL and want your tables to use the MyISAM table
+type, create an initial data file and put something like this in it::
+
+    ALTER TABLE myapp_mytable ENGINE=MyISAM;
+
+As explained in the `SQL initial data file`_ documentation, this SQL file can
+contain arbitrary SQL, so you can make any sorts of changes you need to make.
+
+.. _SQL initial data file: http://www.djangoproject.com/documentation/model_api/#providing-initial-sql-data
+
+Why is Django leaking memory?
+-----------------------------
+
+Django isn't known to leak memory. If you find your Django processes are
+allocating more and more memory, with no sign of releasing it, check to make
+sure your ``DEBUG`` setting is set to ``True``. If ``DEBUG`` is ``True``, then
+Django saves a copy of every SQL statement it has executed.
+
+(The queries are saved in ``django.db.connection.queries``. See
+`How can I see the raw SQL queries Django is running?`_.)
+
+To fix the problem, set ``DEBUG`` to ``False``.
+
+If you need to clear the query list manually at any point in your functions,
+just call ``reset_queries()``, like this::
+
+    from django import db
+    db.reset_queries()
+
+The admin site
+==============
+
+I can't log in. When I enter a valid username and password, it just brings up the login page again, with no error messages.
+---------------------------------------------------------------------------------------------------------------------------
+
+The login cookie isn't being set correctly, because the domain of the cookie
+sent out by Django doesn't match the domain in your browser. Try these two
+things:
+
+    * Set the ``SESSION_COOKIE_DOMAIN`` setting in your admin config file
+      to match your domain. For example, if you're going to
+      "http://www.mysite.com/admin/" in your browser, in
+      "myproject.settings" you should set ``SESSION_COOKIE_DOMAIN = 'www.mysite.com'``.
+
+    * Some browsers (Firefox?) don't like to accept cookies from domains that
+      don't have dots in them. If you're running the admin site on "localhost"
+      or another domain that doesn't have a dot in it, try going to
+      "localhost.localdomain" or "127.0.0.1". And set
+      ``SESSION_COOKIE_DOMAIN`` accordingly.
+
+I can't log in. When I enter a valid username and password, it brings up the login page again, with a "Please enter a correct username and password" error.
+-----------------------------------------------------------------------------------------------------------------------------------------------------------
+
+If you're sure your username and password are correct, make sure your user
+account has ``is_active`` and ``is_staff`` set to True. The admin site only
+allows access to users with those two fields both set to True.
+
+How can I prevent the cache middleware from caching the admin site?
+-------------------------------------------------------------------
+
+Set the ``CACHE_MIDDLEWARE_ANONYMOUS_ONLY`` setting to ``True``. See the
+`cache documentation`_ for more information.
+
+.. _cache documentation: ../cache/#the-per-site-cache
+
+How do I automatically set a field's value to the user who last edited the object in the admin?
+-----------------------------------------------------------------------------------------------
+
+At this point, Django doesn't have an official way to do this. But it's an oft-requested
+feature, so we're discussing how it can be implemented. The problem is we don't want to couple
+the model layer with the admin layer with the request layer (to get the current user). It's a
+tricky problem.
+
+One person hacked up a `solution that doesn't require patching Django`_, but note that it's an
+unofficial solution, and there's no guarantee it won't break at some point.
+
+.. _solution that doesn't require patching Django: http://lukeplant.me.uk/blog.php?id=1107301634
+
+How do I limit admin access so that objects can only be edited by the users who created them?
+---------------------------------------------------------------------------------------------
+
+See the answer to the previous question.
+
+My admin-site CSS and images showed up fine using the development server, but they're not displaying when using mod_python.
+---------------------------------------------------------------------------------------------------------------------------
+
+See `serving the admin files`_ in the "How to use Django with mod_python"
+documentation.
+
+.. _serving the admin files: http://www.djangoproject.com/documentation/modpython/#serving-the-admin-files
+
+My "list_filter" contains a ManyToManyField, but the filter doesn't display.
+----------------------------------------------------------------------------
+
+Django won't bother displaying the filter for a ``ManyToManyField`` if there
+are fewer than two related objects.
+
+For example, if your ``list_filter`` includes ``sites``, and there's only one
+site in your database, it won't display a "Site" filter. In that case,
+filtering by site would be meaningless.
+
+How can I customize the functionality of the admin interface?
+-------------------------------------------------------------
+
+You've got several options. If you want to piggyback on top of an add/change
+form that Django automatically generates, you can attach arbitrary JavaScript
+modules to the page via the model's ``class Admin`` ``js`` parameter. That
+parameter is a list of URLs, as strings, pointing to JavaScript modules that
+will be included within the admin form via a ``<script>`` tag.
+
+If you want more flexibility than simply tweaking the auto-generated forms,
+feel free to write custom views for the admin. The admin is powered by Django
+itself, and you can write custom views that hook into the authentication
+system, check permissions and do whatever else they need to do.
+
+If you want to customize the look-and-feel of the admin interface, read the
+next question.
+
+The dynamically-generated admin site is ugly! How can I change it?
+------------------------------------------------------------------
+
+We like it, but if you don't agree, you can modify the admin site's
+presentation by editing the CSS stylesheet and/or associated image files. The
+site is built using semantic HTML and plenty of CSS hooks, so any changes you'd
+like to make should be possible by editing the stylesheet. We've got a
+`guide to the CSS used in the admin`_ to get you started.
+
+.. _`guide to the CSS used in the admin`: http://www.djangoproject.com/documentation/admin_css/
+
+How do I create users without having to edit password hashes?
+-------------------------------------------------------------
+
+We don't recommend you create users via the admin interface, because at the
+moment it requires you to edit password hashes manually. (Passwords are hashed
+using one-way hash algorithms for security; there's currently no Web interface
+for changing passwords by entering the actual password rather than the hash.)
+
+To create a user, you'll have to use the Python API. See `creating users`_ for
+full info.
+
+.. _creating users: http://www.djangoproject.com/documentation/authentication/#creating-users
+
+Contributing code
+=================
+
+I submitted a bug fix in the ticket system several weeks ago. Why are you ignoring my patch?
+--------------------------------------------------------------------------------------------
+
+Don't worry: We're not ignoring you!
+
+It's important to understand there is a difference between "a ticket is being
+ignored" and "a ticket has not been attended to yet." Django's ticket system
+contains hundreds of open tickets, of various degrees of impact on end-user
+functionality, and Django's developers have to review and prioritize.
+
+Besides, if your feature request stands no chance of inclusion in Django, we
+won't ignore it -- we'll just close the ticket. So if your ticket is still
+open, it doesn't mean we're ignoring you; it just means we haven't had time to
+look at it yet.

Added: vendor/django/current/docs/fastcgi.txt
===================================================================
--- vendor/django/current/docs/fastcgi.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/fastcgi.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,306 @@
+==============================
+How to use Django with FastCGI
+==============================
+
+Although the `current preferred setup`_ for running Django is Apache_ with
+`mod_python`_, many people use shared hosting, on which FastCGI is the only
+viable option. In some setups, FastCGI also allows better security -- and,
+possibly, better performance -- than mod_python.
+
+Essentially, FastCGI is an efficient way of letting an external application
+serve pages to a Web server. The Web server delegates the incoming Web requests
+(via a socket) to FastCGI, which executes the code and passes the response back
+to the Web server, which, in turn, passes it back to the client's Web browser.
+
+Like mod_python, FastCGI allows code to stay in memory, allowing requests to be
+served with no startup time. Unlike mod_python (or `mod_perl`_), a FastCGI
+process doesn't run inside the Web server process, but in a separate,
+persistent process.
+
+.. _current preferred setup: http://www.djangoproject.com/documentation/modpython/
+.. _Apache: http://httpd.apache.org/
+.. _mod_python: http://www.modpython.org/
+.. _mod_perl: http://perl.apache.org/
+
+.. admonition:: Why run code in a separate process?
+
+    The traditional ``mod_*`` arrangements in Apache embed various scripting
+    languages (most notably PHP, Python and Perl) inside the process space of
+    your Web server. Although this lowers startup time -- because code doesn't
+    have to be read off disk for every request -- it comes at the cost of
+    memory use. For mod_python, for example, every Apache process gets its own
+    Python interpreter, which uses up a considerable amount of RAM.
+
+    Due to the nature of FastCGI, it's even possible to have processes that run
+    under a different user account than the Web server process. That's a nice
+    security benefit on shared systems, because it means you can secure your
+    code from other users.
+
+Prerequisite: flup
+==================
+
+Before you can start using FastCGI with Django, you'll need to install flup_,
+which is a Python library for dealing with FastCGI. Make sure to use the latest
+Subversion snapshot of flup, as some users have reported stalled pages with
+older flup versions.
+
+.. _flup: http://www.saddi.com/software/flup/
+
+Starting your FastCGI server
+============================
+
+FastCGI operates on a client-server model, and in most cases you'll be starting
+the FastCGI process on your own. Your Web server (be it Apache, lighttpd, or
+otherwise) only contacts your Django-FastCGI process when the server needs a
+dynamic page to be loaded. Because the daemon is already running with the code
+in memory, it's able to serve the response very quickly.
+
+.. admonition:: Note
+
+    If you're on a shared hosting system, you'll probably be forced to use
+    Web server-managed FastCGI processes. See the section below on running
+    Django with Web server-managed processes for more information.
+
+A Web server can connect to a FastCGI server in one of two ways: It can use
+either a Unix domain socket (a "named pipe" on Win32 systems), or it can use a
+TCP socket. What you choose is a manner of preference; a TCP socket is usually
+easier due to permissions issues.
+
+To start your server, first change into the directory of your project (wherever
+your ``manage.py`` is), and then run ``manage.py`` with the ``runfcgi`` option::
+
+    ./manage.py runfcgi [options]
+
+If you specify ``help`` as the only option after ``runfcgi``, it'll display a
+list of all the available options.
+
+You'll need to specify either a ``socket`` or both ``host`` and ``port``. Then,
+when you set up your Web server, you'll just need to point it at the host/port
+or socket you specified when starting the FastCGI server.
+
+Examples
+--------
+
+Running a threaded server on a TCP port::
+
+    ./manage.py runfcgi method=threaded host=127.0.0.1 port=3033
+
+Running a preforked server on a Unix domain socket::
+
+    ./manage.py runfcgi method=prefork socket=/home/user/mysite.sock pidfile=django.pid
+
+Run without daemonizing (backgrounding) the process (good for debugging)::
+
+    ./manage.py runfcgi daemonize=false socket=/tmp/mysite.sock
+
+Stopping the FastCGI daemon
+---------------------------
+
+If you have the process running in the foreground, it's easy enough to stop it:
+Simply hitting ``Ctrl-C`` will stop and quit the FastCGI server. However, when
+you're dealing with background processes, you'll need to resort to the Unix
+``kill`` command.
+
+If you specify the ``pidfile`` option to your ``manage.py runfcgi``, you can
+kill the running FastCGI daemon like this::
+
+    kill `cat $PIDFILE`
+
+...where ``$PIDFILE`` is the ``pidfile`` you specified.
+
+To easily restart your FastCGI daemon on Unix, try this small shell script::
+
+    #!/bin/bash
+
+    # Replace these three settings.
+    PROJDIR="/home/user/myproject"
+    PIDFILE="$PROJDIR/mysite.pid"
+    SOCKET="$PROJDIR/mysite.sock"
+
+    cd $PROJDIR
+    if [ -f $PIDFILE ]; then
+        kill `cat -- $PIDFILE`
+        rm -f -- $PIDFILE
+    fi
+
+    exec /usr/bin/env - \
+      PYTHONPATH="../python:.." \
+      ./manage.py runfcgi socket=$SOCKET pidfile=$PIDFILE
+
+Apache setup
+============
+
+To use Django with Apache and FastCGI, you'll need Apache installed and
+configured, with `mod_fastcgi`_ installed and enabled. Consult the Apache
+documentation for instructions.
+
+Once you've got that set up, point Apache at your Django FastCGI instance by
+editing the ``httpd.conf`` (Apache configuration) file. You'll need to do two
+things:
+
+    * Use the ``FastCGIExternalServer`` directive to specify the location of
+      your FastCGI server.
+    * Use ``mod_rewrite`` to point URLs at FastCGI as appropriate.
+
+.. _mod_fastcgi: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html
+
+Specifying the location of the FastCGI server
+---------------------------------------------
+
+The ``FastCGIExternalServer`` directive tells Apache how to find your FastCGI
+server. As the `FastCGIExternalServer docs`_ explain, you can specify either a
+``socket`` or a ``host``. Here are examples of both::
+
+    # Connect to FastCGI via a socket / named pipe.
+    FastCGIExternalServer /home/user/public_html/mysite.fcgi -socket /home/user/mysite.sock
+
+    # Connect to FastCGI via a TCP host/port.
+    FastCGIExternalServer /home/user/public_html/mysite.fcgi -host 127.0.0.1:3033
+
+In either case, the file ``/home/user/public_html/mysite.fcgi`` doesn't
+actually have to exist. It's just a URL used by the Web server internally -- a
+hook for signifying which requests at a URL should be handled by FastCGI. (More
+on this in the next section.)
+
+.. _FastCGIExternalServer docs: http://www.fastcgi.com/mod_fastcgi/docs/mod_fastcgi.html#FastCgiExternalServer
+
+Using mod_rewrite to point URLs at FastCGI
+------------------------------------------
+
+The second step is telling Apache to use FastCGI for URLs that match a certain
+pattern. To do this, use the `mod_rewrite`_ module and rewrite URLs to
+``mysite.fcgi`` (or whatever you specified in the ``FastCGIExternalServer``
+directive, as explained in the previous section).
+
+In this example, we tell Apache to use FastCGI to handle any request that
+doesn't represent a file on the filesystem and doesn't start with ``/media/``.
+This is probably the most common case, if you're using Django's admin site::
+
+    <VirtualHost 12.34.56.78>
+      ServerName example.com
+      DocumentRoot /home/user/public_html
+      Alias /media /home/user/python/django/contrib/admin/media
+      RewriteEngine On
+      RewriteRule ^/(media.*)$ /$1 [QSA,L]
+      RewriteCond %{REQUEST_FILENAME} !-f
+      RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
+    </VirtualHost>
+
+.. _mod_rewrite: http://httpd.apache.org/docs/2.0/mod/mod_rewrite.html
+
+lighttpd setup
+==============
+
+lighttpd is a lightweight Web server commonly used for serving static files. It
+supports FastCGI natively and, thus, is a good choice for serving both static
+and dynamic pages, if your site doesn't have any Apache-specific needs.
+
+Make sure ``mod_fastcgi`` is in your modules list, somewhere after
+``mod_rewrite`` and ``mod_access``, but not after ``mod_accesslog``. You'll
+probably want ``mod_alias`` as well, for serving admin media.
+
+Add the following to your lighttpd config file::
+
+    server.document-root = "/home/user/public_html"
+    fastcgi.server = (
+        "/mysite.fcgi" => (
+            "main" => (
+                # Use host / port instead of socket for TCP fastcgi
+                # "host" => "127.0.0.1",
+                # "port" => 3033,
+                "socket" => "/home/user/mysite.sock",
+                "check-local" => "disable",
+            )
+        ),
+    )
+    alias.url = (
+        "/media/" => "/home/user/django/contrib/admin/media/",
+    )
+
+    url.rewrite-once = (
+        "^(/media.*)$" => "$1",
+        "^/favicon\.ico$" => "/media/favicon.ico",
+        "^(/.*)$" => "/mysite.fcgi$1",
+    )
+
+Running multiple Django sites on one lighttpd
+---------------------------------------------
+
+lighttpd lets you use "conditional configuration" to allow configuration to be
+customized per host. To specify multiple FastCGI sites, just add a conditional
+block around your FastCGI config for each site::
+
+    # If the hostname is 'www.example1.com'...
+    $HTTP["host"] == "www.example1.com" {
+        server.document-root = "/foo/site1"
+        fastcgi.server = (
+           ...
+        )
+        ...
+    }
+
+    # If the hostname is 'www.example2.com'...
+    $HTTP["host"] == "www.example2.com" {
+        server.document-root = "/foo/site2"
+        fastcgi.server = (
+           ...
+        )
+        ...
+    }
+
+You can also run multiple Django installations on the same site simply by
+specifying multiple entries in the ``fastcgi.server`` directive. Add one
+FastCGI host for each.
+
+Running Django on a shared-hosting provider with Apache
+=======================================================
+
+Many shared-hosting providers don't allow you to run your own server daemons or
+edit the ``httpd.conf`` file. In these cases, it's still possible to run Django
+using Web server-spawned processes.
+
+.. admonition:: Note
+
+    If you're using Web server-spawned processes, as explained in this section,
+    there's no need for you to start the FastCGI server on your own. Apache
+    will spawn a number of processes, scaling as it needs to.
+
+In your Web root directory, add this to a file named ``.htaccess`` ::
+
+    AddHandler fastcgi-script .fcgi
+    RewriteEngine On
+    RewriteCond %{REQUEST_FILENAME} !-f
+    RewriteRule ^/(.*)$ /mysite.fcgi/$1 [QSA,L]
+
+Then, create a small script that tells Apache how to spawn your FastCGI
+program. Create a file ``mysite.fcgi`` and place it in your Web directory, and
+be sure to make it executable ::
+
+    #!/usr/bin/python
+    import sys, os
+
+    # Add a custom Python path.
+    sys.path.insert(0, "/home/user/python")
+
+    # Switch to the directory of your project. (Optional.)
+    # os.chdir("/home/user/myproject")
+
+    # Set the DJANGO_SETTINGS_MODULE environment variable.
+    os.environ['DJANGO_SETTINGS_MODULE'] = "myproject.settings"
+
+    from django.core.servers.fastcgi import runfastcgi
+    runfastcgi(["method=threaded", "daemonize=false"])
+
+Restarting the spawned server
+-----------------------------
+
+If you change any Python code on your site, you'll need to tell FastCGI the
+code has changed. But there's no need to restart Apache in this case. Rather,
+just reupload ``mysite.fcgi``, or edit the file, so that the timestamp on the
+file will change. When Apache sees the file has been updated, it will restart
+your Django application for you.
+
+If you have access to a command shell on a Unix system, you can accomplish this
+easily by using the ``touch`` command::
+
+    touch mysite.fcgi

Added: vendor/django/current/docs/flatpages.txt
===================================================================
--- vendor/django/current/docs/flatpages.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/flatpages.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,115 @@
+=================
+The flatpages app
+=================
+
+Django comes with an optional "flatpages" application. It lets you store simple
+"flat" HTML content in a database and handles the management for you via
+Django's admin interface and a Python API.
+
+A flatpage is a simple object with a URL, title and content. Use it for
+one-off, special-case pages, such as "About" or "Privacy Policy" pages, that
+you want to store in a database but for which you don't want to develop a
+custom Django application.
+
+A flatpage can use a custom template or a default, systemwide flatpage
+template. It can be associated with one, or multiple, sites.
+
+Here are some examples of flatpages on Django-powered sites:
+
+    * http://www.chicagocrime.org/about/
+    * http://www.lawrence.com/about/contact/
+
+Installation
+============
+
+To install the flatpages app, follow these steps:
+
+    1. Add ``'django.contrib.flatpages'`` to your INSTALLED_APPS_ setting.
+    2. Add ``'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'``
+       to your MIDDLEWARE_CLASSES_ setting.
+    3. Run the command ``manage.py syncdb``.
+
+.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps
+.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes
+
+How it works
+============
+
+``manage.py syncdb`` creates two tables in your database: ``django_flatpage``
+and ``django_flatpage_sites``. ``django_flatpage`` is a simple lookup table
+that simply maps a URL to a title and bunch of text content.
+``django_flatpage_sites`` associates a flatpage with a site.
+
+The ``FlatpageFallbackMiddleware`` does all of the work. Each time any Django
+application raises a 404 error, this middleware checks the flatpages database
+for the requested URL as a last resort. Specifically, it checks for a flatpage
+with the given URL with a site ID that corresponds to the SITE_ID_ setting.
+
+If it finds a match, it follows this algorithm:
+
+    * If the flatpage has a custom template, it loads that template. Otherwise,
+      it loads the template ``flatpages/default``.
+    * It passes that template a single context variable, ``flatpage``, which is
+      the flatpage object. It uses RequestContext_ in rendering the template.
+
+If it doesn't find a match, the request continues to be processed as usual.
+
+The middleware only gets activated for 404s -- not for 500s or responses of any
+other status code.
+
+Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put
+``FlatpageFallbackMiddleware`` at the end of the list, because it's a last
+resort.
+
+For more on middleware, read the `middleware docs`_.
+
+.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id
+.. _RequestContext: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-djangocontext
+.. _middleware docs: http://www.djangoproject.com/documentation/middleware/
+
+How to add, change and delete flatpages
+=======================================
+
+Via the admin interface
+-----------------------
+
+If you've activated the automatic Django admin interface, you should see a
+"Flatpages" section on the admin index page. Edit flatpages as you edit any
+other object in the system.
+
+Via the Python API
+------------------
+
+Flatpages are represented by a standard `Django model`_, which lives in
+`django/contrib/flatpages/models.py`_. You can access flatpage objects via the
+`Django database API`_.
+
+.. _Django model: http://www.djangoproject.com/documentation/model_api/
+.. _django/contrib/flatpages/models.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/flatpages/models.py
+.. _Django database API: http://www.djangoproject.com/documentation/db_api/
+
+Flatpage templates
+==================
+
+By default, flatpages are rendered via the template ``flatpages/default.html``,
+but you can override that for a particular flatpage.
+
+Creating the ``flatpages/default.html`` template is your responsibility; in
+your template directory, just create a ``flatpages`` directory containing a
+file ``default.html``.
+
+Flatpage templates are passed a single context variable, ``flatpage``, which is
+the flatpage object.
+
+Here's a sample ``flatpages/default.html`` template::
+
+    <!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>
+    {{ flatpage.content }}
+    </body>
+    </html>

Added: vendor/django/current/docs/forms.txt
===================================================================
--- vendor/django/current/docs/forms.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/forms.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,623 @@
+===============================
+Forms, fields, and manipulators
+===============================
+
+Once you've got a chance to play with Django's admin interface, you'll probably
+wonder if the fantastic form validation framework it uses is available to user
+code. It is, and this document explains how the framework works.
+
+    .. admonition:: A note to the lazy
+
+        If all you want to do is present forms for a user to create and/or
+        update a given object, you may be able to use `generic views`_.
+
+We'll take a top-down approach to examining Django's form validation framework,
+because much of the time you won't need to use the lower-level APIs. Throughout
+this document, we'll be working with the following model, a "place" object::
+
+    from django.db import models
+
+    PLACE_TYPES = (
+        (1, 'Bar'),
+        (2, 'Restaurant'),
+        (3, 'Movie Theater'),
+        (4, 'Secret Hideout'),
+    )
+
+    class Place(models.Model):
+        name = models.CharField(maxlength=100)
+        address = models.CharField(maxlength=100, blank=True)
+        city = models.CharField(maxlength=50, blank=True)
+        state = models.USStateField()
+        zip_code = models.CharField(maxlength=5, blank=True)
+        place_type = models.IntegerField(choices=PLACE_TYPES)
+
+        class Admin:
+            pass
+
+        def __str__(self):
+            return self.name
+
+Defining the above class is enough to create an admin interface to a ``Place``,
+but what if you want to allow public users to submit places?
+
+Manipulators
+============
+
+The highest-level interface for object creation and modification is the
+**Manipulator** framework. A manipulator is a utility class tied to a given
+model that "knows" how to create or modify instances of that model and how to
+validate data for the object. Manipulators come in two flavors:
+``AddManipulators`` and ``ChangeManipulators``. Functionally they are quite
+similar, but the former knows how to create new instances of the model, while
+the latter modifies existing instances. Both types of classes are automatically
+created when you define a new class::
+
+    >>> from mysite.myapp.models import Place
+    >>> Place.AddManipulator
+    <class 'django.models.manipulators.AddManipulator'>
+    >>> Place.ChangeManipulator
+    <class 'django.models.manipulators.ChangeManipulator'>
+
+Using the ``AddManipulator``
+----------------------------
+
+We'll start with the ``AddManipulator``.  Here's a very simple view that takes
+POSTed data from the browser and creates a new ``Place`` object::
+
+    from django.shortcuts import render_to_response
+    from django.http import Http404, HttpResponse, HttpResponseRedirect
+    from django import forms
+    from mysite.myapp.models import Place
+
+    def naive_create_place(request):
+        """A naive approach to creating places; don't actually use this!"""
+        # Create the AddManipulator.
+        manipulator = Place.AddManipulator()
+
+        # Make a copy of the POSTed data so that do_html2python can
+        # modify it in place (request.POST is immutable).
+        new_data = request.POST.copy()
+
+        # Convert the request data (which will all be strings) into the
+        # appropriate Python types for those fields.
+        manipulator.do_html2python(new_data)
+
+        # Save the new object.
+        new_place = manipulator.save(new_data)
+
+        # It worked!
+        return HttpResponse("Place created: %s" % new_place)
+
+The ``naive_create_place`` example works, but as you probably can tell, this
+view has a number of problems:
+
+    * No validation of any sort is performed. If, for example, the ``name`` field
+      isn't given in ``request.POST``, the save step will cause a database error
+      because that field is required. Ugly.
+
+    * Even if you *do* perform validation, there's still no way to give that
+      information to the user in any sort of useful way.
+
+    * You'll have to separately create a form (and view) that submits to this
+      page, which is a pain and is redundant.
+
+Let's dodge these problems momentarily to take a look at how you could create a
+view with a form that submits to this flawed creation view::
+
+    def naive_create_place_form(request):
+        """Simplistic place form view; don't actually use anything like this!"""
+        # Create a FormWrapper object that the template can use. Ignore
+        # the last two arguments to FormWrapper for now.
+        form = forms.FormWrapper(Place.AddManipulator(), {}, {})
+        return render_to_response('places/naive_create_form.html', {'form': form})
+
+(This view, as well as all the following ones, has the same imports as in the
+first example above.)
+
+The ``forms.FormWrapper`` object is a wrapper that templates can
+easily deal with to create forms. Here's the ``naive_create_form.html``
+template::
+
+    {% extends "base.html" %}
+
+    {% block content %}
+    <h1>Create a place:</h1>
+
+    <form method="post" action="../do_new/">
+    <p><label for="id_name">Name:</label> {{ form.name }}</p>
+    <p><label for="id_address">Address:</label> {{ form.address }}</p>
+    <p><label for="id_city">City:</label> {{ form.city }}</p>
+    <p><label for="id_state">State:</label> {{ form.state }}</p>
+    <p><label for="id_zip_code">Zip:</label> {{ form.zip_code }}</p>
+    <p><label for="id_place_type">Place type:</label> {{ form.place_type }}</p>
+    <input type="submit" />
+    </form>
+    {% endblock %}
+
+Before we get back to the problems with these naive set of views, let's go over
+some salient points of the above template::
+
+    * Field "widgets" are handled for you: ``{{ form.field }}`` automatically
+      creates the "right" type of widget for the form, as you can see with the
+      ``place_type`` field above.
+
+    * There isn't a way just to spit out the form. You'll still need to define
+      how the form gets laid out. This is a feature: Every form should be
+      designed differently. Django doesn't force you into any type of mold.
+      If you must use tables, use tables. If you're a semantic purist, you can
+      probably find better HTML than in the above template.
+
+    * To avoid name conflicts, the ``id``s of form elements take the form
+      "id_*fieldname*".
+
+By creating a creation form we've solved problem number 3 above, but we still
+don't have any validation. Let's revise the validation issue by writing a new
+creation view that takes validation into account::
+
+    def create_place_with_validation(request):
+        manipulator = Place.AddManipulator()
+        new_data = request.POST.copy()
+
+        # Check for validation errors
+        errors = manipulator.get_validation_errors(new_data)
+        if errors:
+            return render_to_response('places/errors.html', {'errors': errors})
+        else:
+            manipulator.do_html2python(new_data)
+            new_place = manipulator.save(new_data)
+            return HttpResponse("Place created: %s" % new_place)
+
+In this new version, errors will be found -- ``manipulator.get_validation_errors``
+handles all the validation for you -- and those errors can be nicely presented
+on an error page (templated, of course)::
+
+    {% extends "base.html" %}
+
+    {% block content %}
+
+    <h1>Please go back and correct the following error{{ errors|pluralize }}:</h1>
+    <ul>
+        {% for e in errors.items %}
+        <li>Field "{{ e.0 }}": {{ e.1|join:", " }}</li>
+        {% endfor %}
+    </ul>
+
+    {% endblock %}
+
+Still, this has its own problems:
+
+    * There's still the issue of creating a separate (redundant) view for the
+      submission form.
+
+    * Errors, though nicely presented, are on a separate page, so the user will
+      have to use the "back" button to fix errors. That's ridiculous and unusable.
+
+The best way to deal with these issues is to collapse the two views -- the form
+and the submission -- into a single view.  This view will be responsible for
+creating the form, validating POSTed data, and creating the new object (if the
+data is valid). An added bonus of this approach is that errors and the form will
+both be available on the same page, so errors with fields can be presented in
+context.
+
+.. admonition:: Philosophy:
+
+    Finally, for the HTTP purists in the audience (and the authorship), this
+    nicely matches the "true" meanings of HTTP GET and HTTP POST: GET fetches
+    the form, and POST creates the new object.
+
+Below is the finished view::
+
+    def create_place(request):
+        manipulator = Place.AddManipulator()
+
+        if request.POST:
+            # If data was POSTed, we're trying to create a new Place.
+            new_data = request.POST.copy()
+
+            # Check for errors.
+            errors = manipulator.get_validation_errors(new_data)
+
+            if not errors:
+                # No errors. This means we can save the data!
+                manipulator.do_html2python(new_data)
+                new_place = manipulator.save(new_data)
+
+                # Redirect to the object's "edit" page. Always use a redirect
+                # after POST data, so that reloads don't accidently create
+                # duplicate entires, and so users don't see the confusing
+                # "Repost POST data?" alert box in their browsers.
+                return HttpResponseRedirect("/places/edit/%i/" % new_place.id)
+        else:
+            # No POST, so we want a brand new form without any data or errors.
+            errors = new_data = {}
+
+        # Create the FormWrapper, template, context, response.
+        form = forms.FormWrapper(manipulator, new_data, errors)
+        return render_to_response('places/create_form.html', {'form': form})
+
+and here's the ``create_form`` template::
+
+    {% extends "base.html" %}
+
+    {% block content %}
+    <h1>Create a place:</h1>
+
+    {% if form.has_errors %}
+    <h2>Please correct the following error{{ form.error_dict|pluralize }}:</h2>
+    {% endif %}
+
+    <form method="post" action=".">
+    <p>
+        <label for="id_name">Name:</label> {{ form.name }}
+        {% if form.name.errors %}*** {{ form.name.errors|join:", " }}{% endif %}
+    </p>
+    <p>
+        <label for="id_address">Address:</label> {{ form.address }}
+        {% if form.address.errors %}*** {{ form.address.errors|join:", " }}{% endif %}
+    </p>
+    <p>
+        <label for="id_city">City:</label> {{ form.city }}
+        {% if form.city.errors %}*** {{ form.city.errors|join:", " }}{% endif %}
+    </p>
+    <p>
+        <label for="id_state">State:</label> {{ form.state }}
+        {% if form.state.errors %}*** {{ form.state.errors|join:", " }}{% endif %}
+    </p>
+    <p>
+        <label for="id_zip_code">Zip:</label> {{ form.zip_code }}
+        {% if form.zip_code.errors %}*** {{ form.zip_code.errors|join:", " }}{% endif %}
+    </p>
+    <p>
+        <label for="id_place_type">Place type:</label> {{ form.place_type }}
+        {% if form.place_type.errors %}*** {{ form.place_type.errors|join:", " }}{% endif %}
+    </p>
+    <input type="submit" />
+    </form>
+    {% endblock %}
+
+The second two arguments to ``FormWrapper`` (``new_data`` and ``errors``)
+deserve some mention.
+
+The first is any "default" data to be used as values for the fields. Pulling
+the data from ``request.POST``, as is done above, makes sure that if there are
+errors, the values the user put in aren't lost. If you try the above example,
+you'll see this in action.
+
+The second argument is the error list retrieved from
+``manipulator.get_validation_errors``.  When passed into the ``FormWrapper``,
+this gives each field an ``errors`` item (which is a list of error messages
+associated with the field) as well as a ``html_error_list`` item, which is a
+``<ul>`` of error messages. The above template uses these error items to
+display a simple error message next to each field. The error list is saved as
+an ``error_dict`` attribute of the ``FormWrapper`` object.
+
+Using the ``ChangeManipulator``
+-------------------------------
+
+The above has covered using the ``AddManipulator`` to create a new object. What
+about editing an existing one? It's shockingly similar to creating a new one::
+
+    def edit_place(request, place_id):
+        # Get the place in question from the database and create a
+        # ChangeManipulator at the same time.
+        try:
+            manipulator = Place.ChangeManipulator(place_id)
+        except Place.DoesNotExist:
+            raise Http404
+
+        # Grab the Place object in question for future use.
+        place = manipulator.original_object
+
+        if request.POST:
+            new_data = request.POST.copy()
+            errors = manipulator.get_validation_errors(new_data)
+            if not errors:
+                manipulator.do_html2python(new_data)
+                manipulator.save(new_data)
+
+                # Do a post-after-redirect so that reload works, etc.
+                return HttpResponseRedirect("/places/edit/%i/" % place.id)
+        else:
+            errors = {}
+            # This makes sure the form accurate represents the fields of the place.
+            new_data = place.__dict__
+
+        form = forms.FormWrapper(manipulator, new_data, errors)
+        return render_to_response('places/edit_form.html', {'form': form, 'place': place})
+
+The only real differences are:
+
+    * We create a ``ChangeManipulator`` instead of an ``AddManipulator``.
+      The argument to a ``ChangeManipulator`` is the ID of the object
+      to be changed. As you can see, the initializer will raise an
+      ``ObjectDoesNotExist`` exception if the ID is invalid.
+
+    * ``ChangeManipulator.original_object`` stores the instance of the
+      object being edited.
+
+    * We set ``new_data`` to the original object's ``__dict__``. This makes
+      sure the form fields contain the current values of the object.
+      ``FormWrapper`` does not modify ``new_data`` in any way, and templates
+      cannot, so this is perfectly safe.
+
+    * The above example uses a different template, so create and edit can be
+      "skinned" differently if needed, but the form chunk itself is completely
+      identical to the one in the create form above.
+
+The astute programmer will notice the add and create functions are nearly
+identical and could in fact be collapsed into a single view. This is left as an
+exercise for said programmer.
+
+(However, the even-more-astute programmer will take heed of the note at the top
+of this document and check out the `generic views`_ documentation if all she
+wishes to do is this type of simple create/update.)
+
+Custom forms and manipulators
+=============================
+
+All the above is fine and dandy if you just want to use the automatically
+created manipulators. But the coolness doesn't end there: You can easily create
+your own custom manipulators for handling custom forms.
+
+Custom manipulators are pretty simple. Here's a manipulator that you might use
+for a "contact" form on a website::
+
+    from django import forms
+
+    urgency_choices = (
+        (1, "Extremely urgent"),
+        (2, "Urgent"),
+        (3, "Normal"),
+        (4, "Unimportant"),
+    )
+
+    class ContactManipulator(forms.Manipulator):
+        def __init__(self):
+            self.fields = (
+                forms.EmailField(field_name="from", is_required=True),
+                forms.TextField(field_name="subject", length=30, maxlength=200, is_required=True),
+                forms.SelectField(field_name="urgency", choices=urgency_choices),
+                forms.LargeTextField(field_name="contents", is_required=True),
+            )
+
+A certain similarity to Django's models should be apparent. The only required
+method of a custom manipulator is ``__init__`` which must define the fields
+present in the manipulator.  See the ``django.forms`` module for
+all the form fields provided by Django.
+
+You use this custom manipulator exactly as you would use an auto-generated one.
+Here's a simple function that might drive the above form::
+
+    def contact_form(request):
+        manipulator = ContactManipulator()
+        if request.POST:
+            new_data = request.POST.copy()
+            errors = manipulator.get_validation_errors(new_data)
+            if not errors:
+                manipulator.do_html2python(new_data)
+
+                # Send e-mail using new_data here...
+
+                return HttpResponseRedirect("/contact/thankyou/")
+        else:
+            errors = new_data = {}
+        form = forms.FormWrapper(manipulator, new_data, errors)
+        return render_to_response('contact_form.html', {'form': form})
+        
+``FileField`` and ``ImageField`` special cases
+==============================================
+
+Dealing with ``FileField`` and ``ImageField`` objects is a little more
+complicated.
+
+First, you'll need to make sure that your ``<form>`` element correctly defines
+the ``enctype`` as ``"multipart/form-data"``, in order to upload files::
+
+  <form enctype="multipart/form-data" method="post" action="/foo/">
+
+Next, you'll need to treat the field in the template slightly differently. A
+``FileField`` or ``ImageField`` is represented by *two* HTML form elements.
+
+For example, given this field in a model::
+
+   photo = model.ImageField('/path/to/upload/location')
+
+You'd need to display two formfields in the template::
+
+   <p><label for="id_photo">Photo:</label> {{ form.photo }}{{ form.photo_file }}</p>
+
+The first bit (``{{ form.photo }}``) displays the currently-selected file,
+while the second (``{{ form.photo_file }}``) actually contains the file upload
+form field. Thus, at the validation layer you need to check the ``photo_file``
+key.
+
+Finally, in your view, make sure to access ``request.FILES``, rather than
+``request.POST``, for the uploaded files. This is necessary because
+``request.POST`` does not contain file-upload data.
+
+For example, following the ``new_data`` convention, you might do something like
+this::
+
+   new_data = request.POST.copy()
+   new_data.update(request.FILES)
+
+Validators
+==========
+
+One useful feature of manipulators is the automatic validation. Validation is
+done using a simple validation API: A validator is a callable that raises a
+``ValidationError`` if there's something wrong with the data.
+``django.core.validators`` defines a host of validator functions (see below),
+but defining your own couldn't be easier::
+
+    from django.core import validators
+    from django import forms
+
+    class ContactManipulator(forms.Manipulator):
+        def __init__(self):
+            self.fields = (
+                # ... snip fields as above ...
+                forms.EmailField(field_name="to", validator_list=[self.isValidToAddress])
+            )
+
+        def isValidToAddress(self, field_data, all_data):
+            if not field_data.endswith("@example.com"):
+                raise validators.ValidationError("You can only send messages to example.com e-mail addresses.")
+
+Above, we've added a "to" field to the contact form, but required that the "to"
+address end with "@example.com" by adding the ``isValidToAddress`` validator to
+the field's ``validator_list``.
+
+The arguments to a validator function take a little explanation.  ``field_data``
+is the value of the field in question, and ``all_data`` is a dictionary of all
+the data being validated.
+
+.. admonition:: Note::
+
+    At the point validators are called all data will still be
+    strings (as ``do_html2python`` hasn't been called yet).
+
+Also, because consistency in user interfaces is important, we strongly urge you
+to put punctuation at the end of your validation messages.
+
+Ready-made Validators
+---------------------
+
+Writing your own validator is not difficult, but there are some situations
+that come up over and over again. Django comes with a number of validators
+that can be used directly in your code. All of these functions and classes
+reside in ``django/core/validators.py``.
+
+The following validators should all be self-explanatory. Each one provides a
+check for the given property:
+
+    * isAlphaNumeric
+    * isAlphaNumericURL
+    * isSlug
+    * isLowerCase
+    * isUpperCase
+    * isCommaSeparatedIntegerList
+    * isCommaSeparatedEmailList
+    * isValidIPAddress4
+    * isNotEmpty
+    * isOnlyDigits
+    * isNotOnlyDigits
+    * isInteger
+    * isOnlyLetters
+    * isValidANSIDate
+    * isValidANSITime
+    * isValidEmail
+    * isValidImage
+    * isValidImageURL
+    * isValidPhone
+    * isValidQuicktimeVideoURL
+    * isValidURL
+    * isValidHTML
+    * isWellFormedXml
+    * isWellFormedXmlFragment
+    * isExistingURL
+    * isValidUSState
+    * hasNoProfanities
+
+There are also a group of validators that are slightly more flexible. For
+these validators, you create a validator instance, passing in the parameters
+described below. The returned object is a callable that can be used as a
+validator.
+
+For example::
+
+    from django.core import validators
+    from django import forms
+
+    power_validator = validators.IsAPowerOf(2)
+
+    class InstallationManipulator(forms.Manipulator)
+        def __init__(self):
+            self.fields = (
+                ...
+                forms.IntegerField(field_name = "size", validator_list=[power_validator])
+            )
+
+Here, ``validators.IsAPowerOf(...)`` returned something that could be used as
+a validator (in this case, a check that a number was a power of 2).
+
+Each of the standard validators that take parameters have an optional final
+argument (``error_message``) that is the message returned when validation
+fails. If no message is passed in, a default message is used.
+
+``AlwaysMatchesOtherField``
+    Takes a field name and the current field is valid if and only if its value
+    matches the contents of the other field.
+
+``ValidateIfOtherFieldEquals``
+    Takes three parameters: ``other_field``, ``other_value`` and
+    ``validator_list``, in that order. If ``other_field`` has a value of
+    ``other_vaue``, then the validators in ``validator_list`` are all run
+    against the current field.
+
+``RequiredIfOtherFieldNotGiven``
+    Takes the name of the other field and this field is only required if the
+    other field has no value.
+
+``RequiredIfOtherFieldsNotGiven``
+    Similar to ``RequiredIfOtherFieldNotGiven``, except that it takes a list
+    of field names and if any one of the supplied fields does not have a value
+    provided, the field being validated is required.
+
+``RequiredIfOtherFieldEquals`` and ``RequiredIfOtherFieldDoesNotEqual``
+    Each of these validator classes takes a field name and a value (in that
+    order). If the given field does (or does not have, in the latter case) the
+    given value, then the current field being validated is required.
+
+    Note that because validators are called before any ``do_html2python()``
+    functions, the value being compared against is a string. So
+    ``RequiredIfOtherFieldEquals('choice', '1')`` is correct, whilst
+    ``RequiredIfOtherFieldEquals('choice', 1)`` will never result in the
+    equality test succeeding.
+
+``IsLessThanOtherField``
+    Takes a field name and validates that the current field being validated
+    has a value that is less than (or equal to) the other field's value.
+    Again, comparisons are done using strings, so be cautious about using
+    this function to compare data that should be treated as another type. The
+    string "123" is less than the string "2", for example. If you don't want
+    string comparison here, you will need to write your own validator.
+
+``IsAPowerOf``
+    Takes an integer argument and when called as a validator, checks that the
+    field being validated is a power of the integer.
+
+``IsValidFloat``
+    Takes a maximum number of digits and number of decimal places (in that
+    order) and validates whether the field is a float with less than the
+    maximum number of digits and decimal place.
+
+``MatchesRegularExpression``
+    Takes a regular expression (a string) as a parameter and validates the
+    field value against it.
+
+``AnyValidator``
+    Takes a list of validators as a parameter. At validation time, if the
+    field successfully validates against any one of the validators, it passes
+    validation. The validators are tested in the order specified in the
+    original list.
+
+``URLMimeTypeCheck``
+    Used to validate URL fields. Takes a list of MIME types (such as
+    ``text/plain``) at creation time. At validation time, it verifies that the
+    field is indeed a URL and then tries to retrieve the content at the URL.
+    Validation succeeds if the content could be retrieved and it has a content
+    type from the list used to create the validator.
+
+``RelaxNGCompact``
+    Used to validate an XML document against a Relax NG compact schema. Takes
+    a file path to the location of the schema and an optional root element
+    (which is wrapped around the XML fragment before validation, if supplied).
+    At validation time, the XML fragment is validated against the schema using
+    the executable specified in the ``JING_PATH`` setting (see the settings_
+    document for more details).
+
+.. _`generic views`: http://www.djangoproject.com/documentation/generic_views/
+.. _`models API`: http://www.djangoproject.com/documentation/model_api/
+.. _settings: http://www.djangoproject.com/documentation/settings/

Added: vendor/django/current/docs/generic_views.txt
===================================================================
--- vendor/django/current/docs/generic_views.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/generic_views.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1063 @@
+=============
+Generic views
+=============
+
+Writing Web applications can be monotonous, because we repeat certain patterns
+again and again. In Django, the most common of these patterns have been
+abstracted into "generic views" that let you quickly provide common views of
+an object without actually needing to write any Python code.
+
+Django's generic views contain the following:
+
+    * A set of views for doing list/detail interfaces (for example,
+      Django's `documentation index`_ and `detail pages`_).
+
+    * A set of views for year/month/day archive pages and associated
+      detail and "latest" pages (for example, the Django weblog's year_,
+      month_, day_, detail_, and latest_ pages).
+
+    * A set of views for creating, editing, and deleting objects.
+
+.. _`documentation index`: http://www.djangoproject.com/documentation/
+.. _`detail pages`: http://www.djangoproject.com/documentation/faq/
+.. _year: http://www.djangoproject.com/weblog/2005/
+.. _month: http://www.djangoproject.com/weblog/2005/jul/
+.. _day: http://www.djangoproject.com/weblog/2005/jul/20/
+.. _detail: http://www.djangoproject.com/weblog/2005/jul/20/autoreload/
+.. _latest: http://www.djangoproject.com/weblog/
+
+All of these views are used by creating configuration dictionaries in
+your URLconf files and passing those dictionaries as the third member of the
+URLconf tuple for a given pattern. For example, here's the URLconf for the
+simple weblog app that drives the blog on djangoproject.com::
+
+    from django.conf.urls.defaults import *
+    from django_website.apps.blog.models import Entry
+
+    info_dict = {
+        'queryset': Entry.objects.all(),
+        'date_field': 'pub_date',
+    }
+
+    urlpatterns = patterns('django.views.generic.date_based',
+       (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/(?P<slug>[-\w]+)/$', 'object_detail', dict(info_dict, slug_field='slug')),
+       (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/(?P<day>\w{1,2})/$',               'archive_day',   info_dict),
+       (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$',                                'archive_month', info_dict),
+       (r'^(?P<year>\d{4})/$',                                                    'archive_year',  info_dict),
+       (r'^/?$',                                                                  'archive_index', info_dict),
+    )
+
+As you can see, this URLconf defines a few options in ``info_dict``.
+``'queryset'`` gives the generic view a ``QuerySet`` of objects to use (in this
+case, all of the ``Entry`` objects) and tells the generic view which model is
+being used.
+
+Documentation of each generic view follows, along with a list of all keyword
+arguments that a generic view expects. Remember that as in the example above,
+arguments may either come from the URL pattern (as ``month``, ``day``,
+``year``, etc. do above) or from the additional-information dictionary (as for
+``queryset``, ``date_field``, etc.).
+
+Most generic views require the ``queryset`` key, which is a ``QuerySet``
+instance; see the `database API docs`_ for more information about ``Queryset``
+objects.
+
+Most views also take an optional ``extra_context`` dictionary that you can use
+to pass any auxiliary information you wish to the view. The values in the
+``extra_context`` dictionary can be either functions (or other callables) or
+other objects. Functions are evaluated just before they are passed to the
+template. However, note that QuerySets retrieve and cache their data when they
+are first evaluated, so if you want to pass in a QuerySet via
+``extra_context`` that is always fresh you need to wrap it in a function or
+lambda that returns the QuerySet.
+
+.. _database API docs: http://www.djangoproject.com/documentation/db_api/
+
+"Simple" generic views
+======================
+
+The ``django.views.generic.simple`` module contains simple views to handle a
+couple of common cases: rendering a template when no view logic is needed,
+and issuing a redirect.
+
+``django.views.generic.simple.direct_to_template``
+--------------------------------------------------
+
+**Description:**
+
+Renders a given template, passing it a ``{{ params }}`` template variable,
+which is a dictionary of the parameters captured in the URL.
+
+**Required arguments:**
+
+    * ``template``: The full name of a template to use.
+
+**Example:**
+
+Given the following URL patterns::
+
+    urlpatterns = patterns('django.views.generic.simple',
+        (r'^foo/$',             'direct_to_template', {'template': 'foo_index.html'}),
+        (r'^foo/(?P<id>\d+)/$', 'direct_to_template', {'template': 'foo_detail.html'}),
+    )
+
+... a request to ``/foo/`` would render the template ``foo_index.html``, and a
+request to ``/foo/15/`` would render the ``foo_detail.html`` with a context
+variable ``{{ params.id }}`` that is set to ``15``.
+
+``django.views.generic.simple.redirect_to``
+-------------------------------------------
+
+**Description:**
+
+Redirects to a given URL.
+
+The given URL may contain dictionary-style string formatting, which will be
+interpolated against the parameters captured in the URL.
+
+If the given URL is ``None``, Django will return an ``HttpResponseGone`` (410).
+
+**Required arguments:**
+
+    * ``url``: The URL to redirect to, as a string. Or ``None`` to raise a 410
+      (Gone) HTTP error.
+
+**Example:**
+
+This example redirects from ``/foo/<id>/`` to ``/bar/<id>/``::
+
+    urlpatterns = patterns('django.views.generic.simple',
+        ('^foo/(?p<id>\d+)/$', 'redirect_to', {'url': '/bar/%(id)s/'}),
+    )
+
+This example returns a 410 HTTP error for requests to ``/bar/``::
+
+    urlpatterns = patterns('django.views.generic.simple',
+        ('^bar/$', 'redirect_to', {'url': None}),
+    )
+
+Date-based generic views
+========================
+
+Date-based generic views (in the module ``django.views.generic.date_based``)
+are views for displaying drilldown pages for date-based data.
+
+``django.views.generic.date_based.archive_index``
+-------------------------------------------------
+
+**Description:**
+
+A top-level index page showing the "latest" objects, by date. Objects with
+a date in the *future* are not included unless you set ``allow_future`` to
+``True``.
+
+**Required arguments:**
+
+    * ``queryset``: A ``QuerySet`` of objects for which the archive serves.
+
+    * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
+      the ``QuerySet``'s model that the date-based archive should use to
+      determine the objects on the page.
+
+**Optional arguments:**
+
+    * ``num_latest``: The number of latest objects to send to the template
+      context. By default, it's 15.
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary.
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``allow_empty``: A boolean specifying whether to display the page if no
+      objects are available. If this is ``False`` and no objects are available,
+      the view will raise a 404 instead of displaying an empty page. By
+      default, this is ``False``.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+    * ``allow_future``: A boolean specifying whether to include "future"
+      objects on this page, where "future" means objects in which the field
+      specified in ``date_field`` is greater than the current date/time. By
+      default, this is ``False``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_archive.html`` by default, where:
+
+    * ``<model_name>`` is your model's name in all lowercase. For a model
+        ``StaffMember``, that'd be ``staffmember``.
+
+    * ``<app_label>`` is the right-most part of the full Python path to
+        your model's app. For example, if your model lives in
+        ``apps/blog/models.py``, that'd be ``blog``.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``date_list``: A list of ``datetime.date`` objects representing all
+      years that have objects available according to ``queryset``. These are
+      ordered in reverse. This is equivalent to
+      ``queryset.dates(date_field, 'year')[::-1]``.
+    * ``latest``: The ``num_latest`` objects in the system, ordered descending
+      by ``date_field``. For example, if ``num_latest`` is ``10``, then
+      ``latest`` will be a list of the latest 10 objects in ``queryset``.
+
+.. _RequestContext docs: http://www.djangoproject.com/documentation/templates_python/#subclassing-context-djangocontext
+
+``django.views.generic.date_based.archive_year``
+------------------------------------------------
+
+**Description:**
+
+A yearly archive page showing all available months in a given year. Objects
+with a date in the *future* are not displayed unless you set ``allow_future``
+to ``True``.
+
+**Required arguments:**
+
+    * ``year``: The four-digit year for which the archive serves.
+
+    * ``queryset``: A ``QuerySet`` of objects for which the archive serves.
+
+    * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
+      the ``QuerySet``'s model that the date-based archive should use to
+      determine the objects on the page.
+
+**Optional arguments:**
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``allow_empty``: A boolean specifying whether to display the page if no
+      objects are available. If this is ``False`` and no objects are available,
+      the view will raise a 404 instead of displaying an empty page. By
+      default, this is ``False``.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``. The
+       view will append ``'_list'`` to the value of this parameter in
+       determining the variable's name.
+
+    * ``make_object_list``: A boolean specifying whether to retrieve the full
+      list of objects for this year and pass those to the template. If ``True``,
+      this list of objects will be made available to the template as
+      ``object_list``. (The name ``object_list`` may be different; see the docs
+      for ``object_list`` in the "Template context" section below.) By default,
+      this is ``False``.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+    * ``allow_future``: A boolean specifying whether to include "future"
+      objects on this page, where "future" means objects in which the field
+      specified in ``date_field`` is greater than the current date/time. By
+      default, this is ``False``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_archive_year.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``date_list``: A list of ``datetime.date`` objects representing all
+      months that have objects available in the given year, according to
+      ``queryset``, in ascending order.
+
+    * ``year``: The given year, as a four-character string.
+
+    * ``object_list``: If the ``make_object_list`` parameter is ``True``, this
+      will be set to a list of objects available for the given year, ordered by
+      the date field. This variable's name depends on the
+      ``template_object_name`` parameter, which is ``'object'`` by default. If
+      ``template_object_name`` is ``'foo'``, this variable's name will be
+      ``foo_list``.
+
+      If ``make_object_list`` is ``False``, ``object_list`` will be passed to
+      the template as an empty list.
+
+``django.views.generic.date_based.archive_month``
+-------------------------------------------------
+
+**Description:**
+
+A monthly archive page showing all objects in a given month. Objects with a
+date in the *future* are not displayed unless you set ``allow_future`` to
+``True``.
+
+**Required arguments:**
+
+    * ``year``: The four-digit year for which the archive serves (a string).
+
+    * ``month``: The month for which the archive serves, formatted according to
+      the ``month_format`` argument.
+
+    * ``queryset``: A ``QuerySet`` of objects for which the archive serves.
+
+    * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
+      the ``QuerySet``'s model that the date-based archive should use to
+      determine the objects on the page.
+
+**Optional arguments:**
+
+    * ``month_format``: A format string that regulates what format the
+      ``month`` parameter uses. This should be in the syntax accepted by
+      Python's ``time.strftime``. (See the `strftime docs`_.) It's set to
+      ``"%b"`` by default, which is a three-letter month abbreviation. To
+      change it to use numbers, use ``"%m"``.
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``allow_empty``: A boolean specifying whether to display the page if no
+      objects are available. If this is ``False`` and no objects are available,
+      the view will raise a 404 instead of displaying an empty page. By
+      default, this is ``False``.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``. The
+       view will append ``'_list'`` to the value of this parameter in
+       determining the variable's name.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+    * ``allow_future``: A boolean specifying whether to include "future"
+      objects on this page, where "future" means objects in which the field
+      specified in ``date_field`` is greater than the current date/time. By
+      default, this is ``False``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_archive_month.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``month``: A ``datetime.date`` object representing the given month.
+
+    * ``next_month``: A ``datetime.date`` object representing the first day of
+      the next month. If the next month is in the future, this will be
+      ``None``.
+
+    * ``previous_month``: A ``datetime.date`` object representing the first day
+      of the previous month. Unlike ``next_month``, this will never be
+      ``None``.
+
+    * ``object_list``: A list of objects available for the given month. This
+      variable's name depends on the ``template_object_name`` parameter, which
+      is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
+      this variable's name will be ``foo_list``.
+
+.. _strftime docs: http://www.python.org/doc/current/lib/module-time.html#l2h-1941
+
+``django.views.generic.date_based.archive_week``
+------------------------------------------------
+
+**Description:**
+
+A weekly archive page showing all objects in a given week. Objects with a date
+in the *future* are not displayed unless you set ``allow_future`` to ``True``.
+
+**Required arguments:**
+
+    * ``year``: The four-digit year for which the archive serves (a string).
+
+    * ``week``: The week of the year for which the archive serves (a string).
+      Weeks start with Sunday.
+
+    * ``queryset``: A ``QuerySet`` of objects for which the archive serves.
+
+    * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
+      the ``QuerySet``'s model that the date-based archive should use to
+      determine the objects on the page.
+
+**Optional arguments:**
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``allow_empty``: A boolean specifying whether to display the page if no
+      objects are available. If this is ``False`` and no objects are available,
+      the view will raise a 404 instead of displaying an empty page. By
+      default, this is ``True``.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``. The
+       view will append ``'_list'`` to the value of this parameter in
+       determining the variable's name.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+    * ``allow_future``: A boolean specifying whether to include "future"
+      objects on this page, where "future" means objects in which the field
+      specified in ``date_field`` is greater than the current date/time. By
+      default, this is ``False``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_archive_week.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``week``: A ``datetime.date`` object representing the first day of the
+      given week.
+
+    * ``object_list``: A list of objects available for the given week. This
+      variable's name depends on the ``template_object_name`` parameter, which
+      is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
+      this variable's name will be ``foo_list``.
+
+``django.views.generic.date_based.archive_day``
+-----------------------------------------------
+
+**Description:**
+
+A day archive page showing all objects in a given day. Days in the future throw
+a 404 error, regardless of whether any objects exist for future days, unless
+you set ``allow_future`` to ``True``.
+
+**Required arguments:**
+
+    * ``year``: The four-digit year for which the archive serves (a string).
+
+    * ``month``: The month for which the archive serves, formatted according to
+      the ``month_format`` argument.
+
+    * ``day``: The day for which the archive serves, formatted according to the
+      ``day_format`` argument.
+
+    * ``queryset``: A ``QuerySet`` of objects for which the archive serves.
+
+    * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
+      the ``QuerySet``'s model that the date-based archive should use to
+      determine the objects on the page.
+
+**Optional arguments:**
+
+    * ``month_format``: A format string that regulates what format the
+      ``month`` parameter uses. This should be in the syntax accepted by
+      Python's ``time.strftime``. (See the `strftime docs`_.) It's set to
+      ``"%b"`` by default, which is a three-letter month abbreviation. To
+      change it to use numbers, use ``"%m"``.
+
+    * ``day_format``: Like ``month_format``, but for the ``day`` parameter.
+      It defaults to ``"%d"`` (day of the month as a decimal number, 01-31).
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``allow_empty``: A boolean specifying whether to display the page if no
+      objects are available. If this is ``False`` and no objects are available,
+      the view will raise a 404 instead of displaying an empty page. By
+      default, this is ``False``.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``. The
+       view will append ``'_list'`` to the value of this parameter in
+       determining the variable's name.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+    * ``allow_future``: A boolean specifying whether to include "future"
+      objects on this page, where "future" means objects in which the field
+      specified in ``date_field`` is greater than the current date/time. By
+      default, this is ``False``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_archive_day.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``day``: A ``datetime.date`` object representing the given day.
+
+    * ``next_day``: A ``datetime.date`` object representing the next day. If
+      the next day is in the future, this will be ``None``.
+
+    * ``previous_day``: A ``datetime.date`` object representing the given day.
+      Unlike ``next_day``, this will never be ``None``.
+
+    * ``object_list``: A list of objects available for the given day. This
+      variable's name depends on the ``template_object_name`` parameter, which
+      is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
+      this variable's name will be ``foo_list``.
+
+``django.views.generic.date_based.archive_today``
+-------------------------------------------------
+
+**Description:**
+
+A day archive page showing all objects for *today*. This is exactly the same as
+``archive_day``, except the ``year``/``month``/``day`` arguments are not used,
+and today's date is used instead.
+
+``django.views.generic.date_based.object_detail``
+-------------------------------------------------
+
+**Description:**
+
+A page representing an individual object. If the object has a date value in the
+future, the view will throw a 404 error by default, unless you set
+``allow_future`` to ``True``.
+
+**Required arguments:**
+
+    * ``year``: The object's four-digit year (a string).
+
+    * ``month``: The object's month , formatted according to the
+      ``month_format`` argument.
+
+    * ``day``: The object's day , formatted according to the ``day_format``
+      argument.
+
+    * ``queryset``: A ``QuerySet`` that contains the object.
+
+    * ``date_field``: The name of the ``DateField`` or ``DateTimeField`` in
+      the ``QuerySet``'s model that the generic view should use to look up the
+      object according to ``year``, ``month`` and ``day``.
+
+    * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
+
+      If you provide ``object_id``, it should be the value of the primary-key
+      field for the object being displayed on this page.
+
+      Otherwise, ``slug`` should be the slug of the given object, and
+      ``slug_field`` should be the name of the slug field in the ``QuerySet``'s
+      model.
+
+**Optional arguments:**
+
+    * ``month_format``: A format string that regulates what format the
+      ``month`` parameter uses. This should be in the syntax accepted by
+      Python's ``time.strftime``. (See the `strftime docs`_.) It's set to
+      ``"%b"`` by default, which is a three-letter month abbreviation. To
+      change it to use numbers, use ``"%m"``.
+
+    * ``day_format``: Like ``month_format``, but for the ``day`` parameter.
+      It defaults to ``"%d"`` (day of the month as a decimal number, 01-31).
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_name_field``: The name of a field on the object whose value is
+      the template name to use. This lets you store template names in the data.
+      In other words, if your object has a field ``'the_template'`` that
+      contains a string ``'foo.html'``, and you set ``template_name_field`` to
+      ``'the_template'``, then the generic view for this object will use the
+      template ``'foo.html'``.
+
+      It's a bit of a brain-bender, but it's useful in some cases.
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+    * ``allow_future``: A boolean specifying whether to include "future"
+      objects on this page, where "future" means objects in which the field
+      specified in ``date_field`` is greater than the current date/time. By
+      default, this is ``False``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_detail.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``object``: The object. This variable's name depends on the
+      ``template_object_name`` parameter, which is ``'object'`` by default. If
+      ``template_object_name`` is ``'foo'``, this variable's name will be
+      ``foo``.
+
+List/detail generic views
+=========================
+
+The list-detail generic-view framework (in the
+``django.views.generic.list_detail`` module) is similar to the date-based one,
+except the former simply has two views: a list of objects and an individual
+object page.
+
+``django.views.generic.list_detail.object_list``
+------------------------------------------------
+
+**Description:**
+
+A page representing a list of objects.
+
+**Required arguments:**
+
+    * ``queryset``: A ``QuerySet`` that represents the objects.
+
+**Optional arguments:**
+
+    * ``paginate_by``: An integer specifying how many objects should be
+      displayed per page. If this is given, the view will paginate objects with
+      ``paginate_by`` objects per page. The view will expect either a ``page``
+      query string parameter (via ``GET``) containing a zero-indexed page
+      number, or a ``page`` variable specified in the URLconf. See
+      "Notes on pagination" below.
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``allow_empty``: A boolean specifying whether to display the page if no
+      objects are available. If this is ``False`` and no objects are available,
+      the view will raise a 404 instead of displaying an empty page. By
+      default, this is ``False``.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``. The
+       view will append ``'_list'`` to the value of this parameter in
+       determining the variable's name.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_list.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``object_list``: The list of objects. This variable's name depends on the
+      ``template_object_name`` parameter, which is ``'object'`` by default. If
+      ``template_object_name`` is ``'foo'``, this variable's name will be
+      ``foo_list``.
+
+    * ``is_paginated``: A boolean representing whether the results are
+      paginated. Specifically, this is set to ``False`` if the number of
+      available objects is less than or equal to ``paginate_by``.
+
+If the results are paginated, the context will contain these extra variables:
+
+    * ``results_per_page``: The number of objects per page. (Same as the
+      ``paginate_by`` parameter.)
+
+    * ``has_next``: A boolean representing whether there's a next page.
+
+    * ``has_previous``: A boolean representing whether there's a previous page.
+
+    * ``page``: The current page number, as an integer. This is 1-based.
+
+    * ``next``: The next page number, as an integer. If there's no next page,
+      this will still be an integer representing the theoretical next-page
+      number. This is 1-based.
+
+    * ``previous``: The previous page number, as an integer. This is 1-based.
+
+    * ``pages``: The total number of pages, as an integer.
+
+    * ``hits``: The total number of objects across *all* pages, not just this
+      page.
+
+Notes on pagination
+~~~~~~~~~~~~~~~~~~~
+
+If ``paginate_by`` is specified, Django will paginate the results. You can
+specify the page number in the URL in one of two ways:
+
+    * Use the ``page`` parameter in the URLconf. For example, this is what
+      your URLconf might look like::
+
+        (r'^objects/page(?P<page>[0-9]+)/$', 'object_list', dict(info_dict))
+
+    * Pass the page number via the ``page`` query-string parameter. For
+      example, a URL would look like this:
+
+        /objects/?page=3
+
+In both cases, ``page`` is 1-based, not 0-based, so the first page would be
+represented as page ``1``.
+
+``django.views.generic.list_detail.object_detail``
+--------------------------------------------------
+
+A page representing an individual object.
+
+**Description:**
+
+A page representing an individual object.
+
+**Required arguments:**
+
+    * ``queryset``: A ``QuerySet`` that contains the object.
+
+    * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
+
+      If you provide ``object_id``, it should be the value of the primary-key
+      field for the object being displayed on this page.
+
+      Otherwise, ``slug`` should be the slug of the given object, and
+      ``slug_field`` should be the name of the slug field in the ``QuerySet``'s
+      model.
+
+**Optional arguments:**
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_name_field``: The name of a field on the object whose value is
+      the template name to use. This lets you store template names in the data.
+      In other words, if your object has a field ``'the_template'`` that
+      contains a string ``'foo.html'``, and you set ``template_name_field`` to
+      ``'the_template'``, then the generic view for this object will use the
+      template ``'foo.html'``.
+
+      It's a bit of a brain-bender, but it's useful in some cases.
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``.
+
+    * ``mimetype``: The MIME type to use for the resulting document. Defaults
+      to the value of the ``DEFAULT_MIME_TYPE`` setting.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_detail.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``object``: The object. This variable's name depends on the
+      ``template_object_name`` parameter, which is ``'object'`` by default. If
+      ``template_object_name`` is ``'foo'``, this variable's name will be
+      ``foo``.
+
+Create/update/delete generic views
+==================================
+
+The ``django.views.generic.create_update`` module contains a set of functions
+for creating, editing and deleting objects.
+
+``django.views.generic.create_update.create_object``
+----------------------------------------------------
+
+**Description:**
+
+A page that displays a form for creating an object, redisplaying the form with
+validation errors (if there are any) and saving the object. This uses the
+automatic manipulators that come with Django models.
+
+**Required arguments:**
+
+    * ``model``: The Django model class of the object that the form will
+      create.
+
+**Optional arguments:**
+
+    * ``post_save_redirect``: A URL to which the view will redirect after
+      saving the object. By default, it's ``object.get_absolute_url()``.
+
+      ``post_save_redirect`` may contain dictionary string formatting, which
+      will be interpolated against the object's field attributes. For example,
+      you could use ``post_save_redirect="/polls/%(slug)s/"``.
+
+    * ``login_required``: A boolean that designates whether a user must be
+      logged in, in order to see the page and save changes. This hooks into the
+      Django `authentication system`_. By default, this is ``False``.
+
+      If this is ``True``, and a non-logged-in user attempts to visit this page
+      or save the form, Django will redirect the request to ``/accounts/login/``.
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_form.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``form``: A ``django.forms.FormWrapper`` instance representing the form
+      for editing the object. This lets you refer to form fields easily in the
+      template system.
+
+      For example, if ``model`` has two fields, ``name`` and ``address``::
+
+          <form action="" method="post">
+          <p><label for="id_name">Name:</label> {{ form.name }}</p>
+          <p><label for="id_address">Address:</label> {{ form.address }}</p>
+          </form>
+
+      See the `manipulator and formfield documentation`_ for more information
+      about using ``FormWrapper`` objects in templates.
+
+.. _authentication system: http://www.djangoproject.com/documentation/authentication/
+.. _manipulator and formfield documentation: http://www.djangoproject.com/documentation/forms/
+
+``django.views.generic.create_update.update_object``
+----------------------------------------------------
+
+**Description:**
+
+A page that displays a form for editing an existing object, redisplaying the
+form with validation errors (if there are any) and saving changes to the
+object. This uses the automatic manipulators that come with Django models.
+
+**Required arguments:**
+
+    * ``model``: The Django model class of the object that the form will
+      create.
+
+    * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
+
+      If you provide ``object_id``, it should be the value of the primary-key
+      field for the object being displayed on this page.
+
+      Otherwise, ``slug`` should be the slug of the given object, and
+      ``slug_field`` should be the name of the slug field in the ``QuerySet``'s
+      model.
+
+**Optional arguments:**
+
+    * ``post_save_redirect``: A URL to which the view will redirect after
+      saving the object. By default, it's ``object.get_absolute_url()``.
+
+      ``post_save_redirect`` may contain dictionary string formatting, which
+      will be interpolated against the object's field attributes. For example,
+      you could use ``post_save_redirect="/polls/%(slug)s/"``.
+
+    * ``login_required``: A boolean that designates whether a user must be
+      logged in, in order to see the page and save changes. This hooks into the
+      Django `authentication system`_. By default, this is ``False``.
+
+      If this is ``True``, and a non-logged-in user attempts to visit this page
+      or save the form, Django will redirect the request to ``/accounts/login/``.
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_form.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``form``: A ``django.forms.FormWrapper`` instance representing the form
+      for editing the object. This lets you refer to form fields easily in the
+      template system.
+
+      For example, if ``model`` has two fields, ``name`` and ``address``::
+
+          <form action="" method="post">
+          <p><label for="id_name">Name:</label> {{ form.name }}</p>
+          <p><label for="id_address">Address:</label> {{ form.address }}</p>
+          </form>
+
+      See the `manipulator and formfield documentation`_ for more information
+      about using ``FormWrapper`` objects in templates.
+
+    * ``object``: The original object being edited. This variable's name
+      depends on the ``template_object_name`` parameter, which is ``'object'``
+      by default. If ``template_object_name`` is ``'foo'``, this variable's
+      name will be ``foo``.
+
+``django.views.generic.create_update.delete_object``
+----------------------------------------------------
+
+**Description:**
+
+A view that displays a confirmation page and deletes an existing object. The
+given object will only be deleted if the request method is ``POST``. If this
+view is fetched via ``GET``, it will display a confirmation page that should
+contain a form that POSTs to the same URL.
+
+**Required arguments:**
+
+    * ``model``: The Django model class of the object that the form will
+      create.
+
+    * Either ``object_id`` or (``slug`` *and* ``slug_field``) is required.
+
+      If you provide ``object_id``, it should be the value of the primary-key
+      field for the object being displayed on this page.
+
+      Otherwise, ``slug`` should be the slug of the given object, and
+      ``slug_field`` should be the name of the slug field in the ``QuerySet``'s
+      model.
+
+    * ``post_delete_redirect``: A URL to which the view will redirect after
+      deleting the object.
+
+**Optional arguments:**
+
+    * ``login_required``: A boolean that designates whether a user must be
+      logged in, in order to see the page and save changes. This hooks into the
+      Django `authentication system`_. By default, this is ``False``.
+
+      If this is ``True``, and a non-logged-in user attempts to visit this page
+      or save the form, Django will redirect the request to ``/accounts/login/``.
+
+    * ``template_name``: The full name of a template to use in rendering the
+      page. This lets you override the default template name (see below).
+
+    * ``template_loader``: The template loader to use when loading the
+      template. By default, it's ``django.template.loader``.
+
+    * ``extra_context``: A dictionary of values to add to the template
+      context. By default, this is an empty dictionary. If a value in the
+      dictionary is callable, the generic view will call it
+      just before rendering the template.
+
+    * ``context_processors``: A list of template-context processors to apply to
+      the view's template. See the `RequestContext docs`_.
+
+    * ``template_object_name``:  Designates the name of the template variable
+       to use in the template context. By default, this is ``'object'``.
+
+**Template name:**
+
+If ``template_name`` isn't specified, this view will use the template
+``<app_label>/<model_name>_confirm_delete.html`` by default.
+
+**Template context:**
+
+In addition to ``extra_context``, the template's context will be:
+
+    * ``object``: The original object that's about to be deleted. This
+      variable's name depends on the ``template_object_name`` parameter, which
+      is ``'object'`` by default. If ``template_object_name`` is ``'foo'``,
+      this variable's name will be ``foo``.

Added: vendor/django/current/docs/i18n.txt
===================================================================
--- vendor/django/current/docs/i18n.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/i18n.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,753 @@
+====================
+Internationalization
+====================
+
+Django has full support for internationalization of text in code and templates.
+Here's how it works.
+
+Overview
+========
+
+The goal of internationalization is to allow a single Web application to offer
+its content and functionality in multiple languages.
+
+You, the Django developer, can accomplish this goal by adding a minimal amount
+of hooks to your Python code and templates. These hooks are called
+**translation strings**. They tell Django: "This text should be translated into
+the end user's language, if a translation for this text is available in that
+language."
+
+Django takes care of using these hooks to translate Web apps, on the fly,
+according to users' language preferences.
+
+Essentially, Django does two things:
+
+    * It lets developers and template authors specify which parts of their apps
+      should be translatable.
+    * It uses these hooks to translate Web apps for particular users according
+      to their language preferences.
+
+How to internationalize your app: in three steps
+------------------------------------------------
+
+    1. Embed translation strings in your Python code and templates.
+    2. Get translations for those strings, in whichever languages you want to
+       support.
+    3. Activate the locale middleware in your Django settings.
+
+.. admonition:: Behind the scenes
+
+    Django's translation machinery uses the standard ``gettext`` module that
+    comes with Python.
+
+If you don't need internationalization
+======================================
+
+Django's internationalization hooks are on by default, and that means there's a
+bit of i18n-related overhead in certain places of the framework. If you don't
+use internationalization, you should take the two seconds to set
+``USE_I18N = False`` in your settings file. If ``USE_I18N`` is set to
+``False``, then Django will make some optimizations so as not to load the
+internationalization machinery.
+
+See the `documentation for USE_I18N`_.
+
+.. _documentation for USE_I18N: http://www.djangoproject.com/documentation/settings/#use-i18n
+
+How to specify translation strings
+==================================
+
+Translation strings specify "This text should be translated." These strings can
+appear in your Python code and templates. It's your responsibility to mark
+translatable strings; the system can only translate strings it knows about.
+
+In Python code
+--------------
+
+Standard translation
+~~~~~~~~~~~~~~~~~~~~
+
+Specify a translation string by using the function ``_()``. (Yes, the name of
+the function is the "underscore" character.) This function is available
+globally in any Python module; you don't have to import it.
+
+In this example, the text ``"Welcome to my site."`` is marked as a translation
+string::
+
+    def my_view(request):
+        output = _("Welcome to my site.")
+        return HttpResponse(output)
+
+The function ``django.utils.translation.gettext()`` is identical to ``_()``.
+This example is identical to the previous one::
+
+    from django.utils.translation import gettext
+    def my_view(request):
+        output = gettext("Welcome to my site.")
+        return HttpResponse(output)
+
+Translation works on computed values. This example is identical to the previous
+two::
+
+    def my_view(request):
+        words = ['Welcome', 'to', 'my', 'site.']
+        output = _(' '.join(words))
+        return HttpResponse(output)
+
+Translation works on variables. Again, here's an identical example::
+
+    def my_view(request):
+        sentence = 'Welcome to my site.'
+        output = _(sentence)
+        return HttpResponse(output)
+
+(The caveat with using variables or computed values, as in the previous two
+examples, is that Django's translation-string-detecting utility,
+``make-messages.py``, won't be able to find these strings. More on
+``make-messages`` later.)
+
+The strings you pass to ``_()`` or ``gettext()`` can take placeholders,
+specified with Python's standard named-string interpolation syntax. Example::
+
+    def my_view(request, n):
+        output = _('%(name)s is my name.') % {'name': n}
+        return HttpResponse(output)
+
+This technique lets language-specific translations reorder the placeholder
+text. For example, an English translation may be ``"Adrian is my name."``,
+while a Spanish translation may be ``"Me llamo Adrian."`` -- with the
+placeholder (the name) placed after the translated text instead of before it.
+
+For this reason, you should use named-string interpolation (e.g., ``%(name)s``)
+instead of positional interpolation (e.g., ``%s`` or ``%d``). If you used
+positional interpolation, translations wouldn't be able to reorder placeholder
+text.
+
+Marking strings as no-op
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Use the function ``django.utils.translation.gettext_noop()`` to mark a string
+as a translation string without translating it. The string is later translated
+from a variable.
+
+Use this if you have constant strings that should be stored in the source
+language because they are exchanged over systems or users -- such as strings in
+a database -- but should be translated at the last possible point in time, such
+as when the string is presented to the user.
+
+Lazy translation
+~~~~~~~~~~~~~~~~
+
+Use the function ``django.utils.translation.gettext_lazy()`` to translate
+strings lazily -- when the value is accessed rather than when the
+``gettext_lazy()`` function is called.
+
+For example, to translate a model's ``help_text``, do the following::
+
+    from django.utils.translation import gettext_lazy
+
+    class MyThing(models.Model):
+        name = models.CharField(help_text=gettext_lazy('This is the help text'))
+
+In this example, ``gettext_lazy()`` stores a lazy reference to the string --
+not the actual translation. The translation itself will be done when the string
+is used in a string context, such as template rendering on the Django admin site.
+
+If you don't like the verbose name ``gettext_lazy``, you can just alias it as
+``_`` (underscore), like so::
+
+    from django.utils.translation import gettext_lazy as _
+
+    class MyThing(models.Model):
+        name = models.CharField(help_text=_('This is the help text'))
+
+Always use lazy translations in `Django models`_. And it's a good idea to add
+translations for the field names and table names, too. This means writing
+explicit ``verbose_name`` and ``verbose_name_plural`` options in the ``Meta``
+class, though::
+
+    from django.utils.translation import gettext_lazy as _
+
+    class MyThing(models.Model):
+        name = models.CharField(_('name'), help_text=_('This is the help text'))
+        class Meta:
+            verbose_name = _('my thing')
+            verbose_name_plural = _('mythings')
+
+.. _Django models: http://www.djangoproject.com/documentation/model_api/
+
+Pluralization
+~~~~~~~~~~~~~
+
+Use the function ``django.utils.translation.ngettext()`` to specify pluralized
+messages. Example::
+
+    from django.utils.translation import ngettext
+    def hello_world(request, count):
+        page = ngettext('there is %(count)d object', 'there are %(count)d objects', count) % {
+            'count': count,
+        }
+        return HttpResponse(page)
+
+``ngettext`` takes three arguments: the singular translation string, the plural
+translation string and the number of objects (which is passed to the
+translation languages as the ``count`` variable).
+
+In template code
+----------------
+
+Using translations in `Django templates`_ uses two template tags and a slightly
+different syntax than in Python code. To give your template access to these
+tags, put ``{% load i18n %}`` toward the top of your template.
+
+The ``{% trans %}`` template tag translates a constant string or a variable
+content::
+
+    <title>{% trans "This is the title." %}</title>
+
+If you only want to mark a value for translation, but translate it later from a
+variable, use the ``noop`` option::
+
+    <title>{% trans "value" noop %}</title>
+
+It's not possible to use template variables in ``{% trans %}`` -- only constant
+strings, in single or double quotes, are allowed. If your translations require
+variables (placeholders), use ``{% blocktrans %}``. Example::
+
+    {% blocktrans %}This will have {{ value }} inside.{% endblocktrans %}
+
+To translate a template expression -- say, using template filters -- you need
+to bind the expression to a local variable for use within the translation
+block::
+
+    {% blocktrans with value|filter as myvar %}
+    This will have {{ myvar }} inside.
+    {% endblocktrans %}
+
+If you need to bind more than one expression inside a ``blocktrans`` tag,
+separate the pieces with ``and``::
+
+    {% blocktrans with book|title as book_t and author|title as author_t %}
+    This is {{ book_t }} by {{ author_t }}
+    {% endblocktrans %}
+
+To pluralize, specify both the singular and plural forms with the
+``{% plural %}`` tag, which appears within ``{% blocktrans %}`` and
+``{% endblocktrans %}``. Example::
+
+    {% blocktrans count list|count as counter %}
+    There is only one {{ name }} object.
+    {% plural %}
+    There are {{ counter }} {{ name }} objects.
+    {% endblocktrans %}
+
+Internally, all block and inline translations use the appropriate
+``gettext`` / ``ngettext`` call.
+
+Each ``RequestContext`` has access to two translation-specific variables:
+
+    * ``LANGUAGES`` is a list of tuples in which the first element is the
+      language code and the second is the language name (in that language).
+    * ``LANGUAGE_CODE`` is the current user's preferred language, as a string.
+      Example: ``en-us``. (See "How language preference is discovered", below.)
+    * ``LANGUAGE_BIDI`` is the current language's direction. If True, it's a
+      right-to-left language, e.g: Hebrew, Arabic. If False it's a
+      left-to-right language, e.g: English, French, German etc.
+
+
+If you don't use the ``RequestContext`` extension, you can get those values with
+three tags::
+
+    {% get_current_language as LANGUAGE_CODE %}
+    {% get_available_languages as LANGUAGES %}
+    {% get_current_language_bidi as LANGUAGE_BIDI %}
+
+These tags also require a ``{% load i18n %}``.
+
+Translation hooks are also available within any template block tag that accepts
+constant strings. In those cases, just use ``_()`` syntax to specify a
+translation string. Example::
+
+    {% some_special_tag _("Page not found") value|yesno:_("yes,no") %}
+
+In this case, both the tag and the filter will see the already-translated
+string, so they don't need to be aware of translations.
+
+.. _Django templates: http://www.djangoproject.com/documentation/templates_python/
+
+How to create language files
+============================
+
+Once you've tagged your strings for later translation, you need to write (or
+obtain) the language translations themselves. Here's how that works.
+
+Message files
+-------------
+
+The first step is to create a **message file** for a new language. A message
+file is a plain-text file, representing a single language, that contains all
+available translation strings and how they should be represented in the given
+language. Message files have a ``.po`` file extension.
+
+Django comes with a tool, ``bin/make-messages.py``, that automates the creation
+and upkeep of these files.
+
+To create or update a message file, run this command::
+
+    bin/make-messages.py -l de
+
+...where ``de`` is the language code for the message file you want to create.
+The language code, in this case, is in locale format. For example, it's
+``pt_BR`` for Brazilian and ``de_AT`` for Austrian German.
+
+The script should be run from one of three places:
+
+    * The root ``django`` directory (not a Subversion checkout, but the one
+      that is linked-to via ``$PYTHONPATH`` or is located somewhere on that
+      path).
+    * The root directory of your Django project.
+    * The root directory of your Django app.
+
+The script runs over the entire Django source tree and pulls out all strings
+marked for translation. It creates (or updates) a message file in the directory
+``conf/locale``. In the ``de`` example, the file will be
+``conf/locale/de/LC_MESSAGES/django.po``.
+
+If run over your project source tree or your application source tree, it will
+do the same, but the location of the locale directory is ``locale/LANG/LC_MESSAGES``
+(note the missing ``conf`` prefix).
+
+.. admonition:: No gettext?
+
+    If you don't have the ``gettext`` utilities installed, ``make-messages.py``
+    will create empty files. If that's the case, either install the ``gettext``
+    utilities or just copy the English message file
+    (``conf/locale/en/LC_MESSAGES/django.po``) and use it as a starting point;
+    it's just an empty translation file.
+
+The format of ``.po`` files is straightforward. Each ``.po`` file contains a
+small bit of metadata, such as the translation maintainer's contact
+information, but the bulk of the file is a list of **messages** -- simple
+mappings between translation strings and the actual translated text for the
+particular language.
+
+For example, if your Django app contained a translation string for the text
+``"Welcome to my site."``, like so::
+
+    _("Welcome to my site.")
+
+...then ``make-messages.py`` will have created a ``.po`` file containing the
+following snippet -- a message::
+
+    #: path/to/python/module.py:23
+    msgid "Welcome to my site."
+    msgstr ""
+
+A quick explanation:
+
+    * ``msgid`` is the translation string, which appears in the source. Don't
+      change it.
+    * ``msgstr`` is where you put the language-specific translation. It starts
+      out empty, so it's your responsibility to change it. Make sure you keep
+      the quotes around your translation.
+    * As a convenience, each message includes the filename and line number
+      from which the translation string was gleaned.
+
+Long messages are a special case. There, the first string directly after the
+``msgstr`` (or ``msgid``) is an empty string. Then the content itself will be
+written over the next few lines as one string per line. Those strings are
+directly concatenated. Don't forget trailing spaces within the strings;
+otherwise, they'll be tacked together without whitespace!
+
+.. admonition:: Mind your charset
+
+    When creating a ``.po`` file with your favorite text editor, first edit
+    the charset line (search for ``"CHARSET"``) and set it to the charset
+    you'll be using to edit the content. Generally, utf-8 should work for most
+    languages, but ``gettext`` should handle any charset you throw at it.
+
+To reexamine all source code and templates for new translation strings and
+update all message files for **all** languages, run this::
+
+    make-messages.py -a
+
+Compiling message files
+-----------------------
+
+After you create your message file -- and each time you make changes to it --
+you'll need to compile it into a more efficient form, for use by ``gettext``.
+Do this with the ``bin/compile-messages.py`` utility.
+
+This tool runs over all available ``.po`` files and creates ``.mo`` files,
+which are binary files optimized for use by ``gettext``. In the same directory
+from which you ran ``make-messages.py``, run ``compile-messages.py`` like
+this::
+
+   bin/compile-messages.py
+
+That's it. Your translations are ready for use.
+
+.. admonition:: A note to translators
+
+    If you've created a translation in a language Django doesn't yet support,
+    please let us know! See `Submitting and maintaining translations`_ for
+    the steps to take.
+
+    .. _Submitting and maintaining translations: http://www.djangoproject.com/documentation/contributing/
+
+How Django discovers language preference
+========================================
+
+Once you've prepared your translations -- or, if you just want to use the
+translations that come with Django -- you'll just need to activate translation
+for your app.
+
+Behind the scenes, Django has a very flexible model of deciding which language
+should be used -- installation-wide, for a particular user, or both.
+
+To set an installation-wide language preference, set ``LANGUAGE_CODE`` in your
+`settings file`_. Django uses this language as the default translation -- the
+final attempt if no other translator finds a translation.
+
+If all you want to do is run Django with your native language, and a language
+file is available for your language, all you need to do is set
+``LANGUAGE_CODE``.
+
+If you want to let each individual user specify which language he or she
+prefers, use ``LocaleMiddleware``. ``LocaleMiddleware`` enables language
+selection based on data from the request. It customizes content for each user.
+
+To use ``LocaleMiddleware``, add ``'django.middleware.locale.LocaleMiddleware'``
+to your ``MIDDLEWARE_CLASSES`` setting. Because middleware order matters, you
+should follow these guidelines:
+
+    * Make sure it's one of the first middlewares installed.
+    * It should come after ``SessionMiddleware``, because ``LocaleMiddleware``
+      makes use of session data.
+    * If you use ``CacheMiddleware``, put ``LocaleMiddleware`` after it.
+
+For example, your ``MIDDLEWARE_CLASSES`` might look like this::
+
+    MIDDLEWARE_CLASSES = (
+       'django.contrib.sessions.middleware.SessionMiddleware',
+       'django.middleware.locale.LocaleMiddleware',
+       'django.middleware.common.CommonMiddleware',
+    )
+
+(For more on middleware, see the `middleware documentation`_.)
+
+``LocaleMiddleware`` tries to determine the user's language preference by
+following this algorithm:
+
+    * First, it looks for a ``django_language`` key in the the current user's
+      `session`_.
+    * Failing that, it looks for a cookie called ``django_language``.
+    * Failing that, it looks at the ``Accept-Language`` HTTP header. This
+      header is sent by your browser and tells the server which language(s) you
+      prefer, in order by priority. Django tries each language in the header
+      until it finds one with available translations.
+    * Failing that, it uses the global ``LANGUAGE_CODE`` setting.
+
+Notes:
+
+    * In each of these places, the language preference is expected to be in the
+      standard language format, as a string. For example, Brazilian is
+      ``pt-br``.
+    * If a base language is available but the sublanguage specified is not,
+      Django uses the base language. For example, if a user specifies ``de-at``
+      (Austrian German) but Django only has ``de`` available, Django uses
+      ``de``.
+    * Only languages listed in the `LANGUAGES setting`_ can be selected. If
+      you want to restrict the language selection to a subset of provided
+      languages (because your application doesn't provide all those languages),
+      set ``LANGUAGES`` to a list of languages. For example::
+
+          LANGUAGES = (
+            ('de', _('German')),
+            ('en', _('English')),
+          )
+
+      This example restricts languages that are available for automatic
+      selection to German and English (and any sublanguage, like de-ch or
+      en-us).
+
+      .. _LANGUAGES setting: http://www.djangoproject.com/documentation/settings/#languages
+
+    * If you define a custom ``LANGUAGES`` setting, as explained in the
+      previous bullet, it's OK to mark the languages as translation strings
+      -- but use a "dummy" ``gettext()`` function, not the one in
+      ``django.utils.translation``. You should *never* import
+      ``django.utils.translation`` from within your settings file, because that
+      module in itself depends on the settings, and that would cause a circular
+      import.
+
+      The solution is to use a "dummy" ``gettext()`` function. Here's a sample
+      settings file::
+
+          gettext = lambda s: s
+
+          LANGUAGES = (
+              ('de', gettext('German')),
+              ('en', gettext('English')),
+          )
+
+      With this arrangement, ``make-messages.py`` will still find and mark
+      these strings for translation, but the translation won't happen at
+      runtime -- so you'll have to remember to wrap the languages in the *real*
+      ``gettext()`` in any code that uses ``LANGUAGES`` at runtime.
+
+    * The ``LocaleMiddleware`` can only select languages for which there is a
+      Django-provided base translation. If you want to provide translations
+      for your application that aren't already in the set of translations
+      in Django's source tree, you'll want to provide at least basic
+      translations for that language. For example, Django uses technical
+      message IDs to translate date formats and time formats -- so you will
+      need at least those translations for the system to work correctly.
+
+      A good starting point is to copy the English ``.po`` file and to
+      translate at least the technical messages -- maybe the validator
+      messages, too.
+
+      Technical message IDs are easily recognized; they're all upper case. You
+      don't translate the message ID as with other messages, you provide the
+      correct local variant on the provided English value. For example, with
+      ``DATETIME_FORMAT`` (or ``DATE_FORMAT`` or ``TIME_FORMAT``), this would
+      be the format string that you want to use in your language. The format
+      is identical to the format strings used by the ``now`` template tag.
+
+Once ``LocaleMiddleware`` determines the user's preference, it makes this
+preference available as ``request.LANGUAGE_CODE`` for each `request object`_.
+Feel free to read this value in your view code. Here's a simple example::
+
+    def hello_world(request, count):
+        if request.LANGUAGE_CODE == 'de-at':
+            return HttpResponse("You prefer to read Austrian German.")
+        else:
+            return HttpResponse("You prefer to read another language.")
+
+Note that, with static (middleware-less) translation, the language is in
+``settings.LANGUAGE_CODE``, while with dynamic (middleware) translation, it's
+in ``request.LANGUAGE_CODE``.
+
+.. _settings file: http://www.djangoproject.com/documentation/settings/
+.. _middleware documentation: http://www.djangoproject.com/documentation/middleware/
+.. _session: http://www.djangoproject.com/documentation/sessions/
+.. _request object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
+
+The ``set_language`` redirect view
+==================================
+
+As a convenience, Django comes with a view, ``django.views.i18n.set_language``,
+that sets a user's language preference and redirects back to the previous page.
+
+Activate this view by adding the following line to your URLconf::
+
+    (r'^i18n/', include('django.conf.urls.i18n')),
+
+(Note that this example makes the view available at ``/i18n/setlang/``.)
+
+The view expects to be called via the ``GET`` method, with a ``language``
+parameter set in the query string. If session support is enabled, the view
+saves the language choice in the user's session. Otherwise, it saves the
+language choice in a ``django_language`` cookie.
+
+After setting the language choice, Django redirects the user, following this
+algorithm:
+
+    * Django looks for a ``next`` parameter in the query string.
+    * If that doesn't exist, or is empty, Django tries the URL in the
+      ``Referer`` header.
+    * If that's empty -- say, if a user's browser suppresses that header --
+      then the user will be redirected to ``/`` (the site root) as a fallback.
+
+Here's example HTML template code::
+
+    <form action="/i18n/setlang/" method="get">
+    <input name="next" type="hidden" value="/next/page/" />
+    <select name="language">
+    {% for lang in LANGUAGES %}
+    <option value="{{ lang.0 }}">{{ lang.1 }}</option>
+    {% endfor %}
+    </select>
+    <input type="submit" value="Go" />
+    </form>
+
+Using translations in your own projects
+=======================================
+
+Django looks for translations by following this algorithm:
+
+    * First, it looks for a ``locale`` directory in the application directory
+      of the view that's being called. If it finds a translation for the
+      selected language, the translation will be installed.
+    * Next, it looks for a ``locale`` directory in the project directory. If it
+      finds a translation, the translation will be installed.
+    * Finally, it checks the base translation in ``django/conf/locale``.
+
+This way, you can write applications that include their own translations, and
+you can override base translations in your project path. Or, you can just build
+a big project out of several apps and put all translations into one big project
+message file. The choice is yours.
+
+.. note::
+
+    If you're using manually configured settings, as described in the
+    `settings documentation`_, the ``locale`` directory in the project
+    directory will not be examined, since Django loses the ability to work out
+    the location of the project directory. (Django normally uses the location
+    of the settings file to determine this, and a settings file doesn't exist
+    if you're manually configuring your settings.)
+
+.. _settings documentation: http://www.djangoproject.com/documentation/settings/#using-settings-without-the-django-settings-module-environment-variable
+
+All message file repositories are structured the same way. They are:
+
+    * ``$APPPATH/locale/<language>/LC_MESSAGES/django.(po|mo)``
+    * ``$PROJECTPATH/locale/<language>/LC_MESSAGES/django.(po|mo)``
+    * All paths listed in ``LOCALE_PATHS`` in your settings file are
+      searched in that order for ``<language>/LC_MESSAGES/django.(po|mo)``
+    * ``$PYTHONPATH/django/conf/locale/<language>/LC_MESSAGES/django.(po|mo)``
+
+To create message files, you use the same ``make-messages.py`` tool as with the
+Django message files. You only need to be in the right place -- in the directory
+where either the ``conf/locale`` (in case of the source tree) or the ``locale/``
+(in case of app messages or project messages) directory are located. And you
+use the same ``compile-messages.py`` to produce the binary ``django.mo`` files that
+are used by ``gettext``.
+
+Application message files are a bit complicated to discover -- they need the
+``LocaleMiddleware``. If you don't use the middleware, only the Django message
+files and project message files will be processed.
+
+Finally, you should give some thought to the structure of your translation
+files. If your applications need to be delivered to other users and will
+be used in other projects, you might want to use app-specific translations.
+But using app-specific translations and project translations could produce
+weird problems with ``make-messages``: ``make-messages`` will traverse all
+directories below the current path and so might put message IDs into the
+project message file that are already in application message files.
+
+The easiest way out is to store applications that are not part of the project
+(and so carry their own translations) outside the project tree. That way,
+``make-messages`` on the project level will only translate strings that are
+connected to your explicit project and not strings that are distributed
+independently.
+
+Translations and JavaScript
+===========================
+
+Adding translations to JavaScript poses some problems:
+
+    * JavaScript code doesn't have access to a ``gettext`` implementation.
+
+    * JavaScript code doesn't have access to .po or .mo files; they need to be
+      delivered by the server.
+
+    * The translation catalogs for JavaScript should be kept as small as
+      possible.
+
+Django provides an integrated solution for these problems: It passes the
+translations into JavaScript, so you can call ``gettext``, etc., from within
+JavaScript.
+
+The ``javascript_catalog`` view
+-------------------------------
+
+The main solution to these problems is the ``javascript_catalog`` view, which
+sends out a JavaScript code library with functions that mimic the ``gettext``
+interface, plus an array of translation strings. Those translation strings are
+taken from the application, project or Django core, according to what you
+specify in either the {{{info_dict}}} or the URL.
+
+You hook it up like this::
+
+    js_info_dict = {
+        'packages': ('your.app.package',),
+    }
+
+    urlpatterns = patterns('',
+        (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
+    )
+
+Each string in ``packages`` should be in Python dotted-package syntax (the
+same format as the strings in ``INSTALLED_APPS``) and should refer to a package
+that contains a ``locale`` directory. If you specify multiple packages, all
+those catalogs are merged into one catalog. This is useful if you have
+JavaScript that uses strings from different applications.
+
+You can make the view dynamic by putting the packages into the URL pattern::
+
+    urlpatterns = patterns('',
+        (r'^jsi18n/(?P<packages>\S+?)/$, 'django.views.i18n.javascript_catalog'),
+    )
+
+With this, you specify the packages as a list of package names delimited by '+'
+signs in the URL. This is especially useful if your pages use code from
+different apps and this changes often and you don't want to pull in one big
+catalog file. As a security measure, these values can only be either
+``django.conf`` or any package from the ``INSTALLED_APPS`` setting.
+
+Using the JavaScript translation catalog
+----------------------------------------
+
+To use the catalog, just pull in the dynamically generated script like this::
+
+    <script type="text/javascript" src="/path/to/jsi18n/"></script>
+
+This is how the admin fetches the translation catalog from the server. When the
+catalog is loaded, your JavaScript code can use the standard ``gettext``
+interface to access it::
+
+    document.write(gettext('this is to be translated'));
+
+There even is a ``ngettext`` interface and a string interpolation function::
+
+    d = {
+        count: 10
+    };
+    s = interpolate(ngettext('this is %(count)s object', 'this are %(count)s objects', d.count), d);
+
+The ``interpolate`` function supports both positional interpolation and named
+interpolation. So the above could have been written as::
+
+    s = interpolate(ngettext('this is %s object', 'this are %s objects', 11), [11]);
+
+The interpolation syntax is borrowed from Python. You shouldn't go over the top
+with string interpolation, though: this is still JavaScript, so the code will
+have to do repeated regular-expression substitutions. This isn't as fast as
+string interpolation  in Python, so keep it to those cases where you really
+need it (for example, in conjunction with ``ngettext`` to produce proper
+pluralizations).
+
+Creating JavaScript translation catalogs
+----------------------------------------
+
+You create and update the translation catalogs the same way as the other Django
+translation catalogs -- with the {{{make-messages.py}}} tool. The only
+difference is you need to provide a ``-d djangojs`` parameter, like this::
+
+    make-messages.py -d djangojs -l de
+
+This would create or update the translation catalog for JavaScript for German.
+After updating translation catalogs, just run ``compile-messages.py`` the same
+way as you do with normal Django translation catalogs.
+
+Specialities of Django translation
+==================================
+
+If you know ``gettext``, you might note these specialities in the way Django
+does translation:
+
+    * The string domain is ``django`` or ``djangojs``. The string domain is used to
+      differentiate between different programs that store their data in a
+      common message-file library (usually ``/usr/share/locale/``). The ``django``
+      domain is used for python and template translation strings and is loaded into
+      the global translation catalogs. The ``djangojs`` domain is only used for
+      JavaScript translation catalogs to make sure that those are as small as
+      possible.
+    * Django only uses ``gettext`` and ``gettext_noop``. That's because Django
+      always uses ``DEFAULT_CHARSET`` strings internally. There isn't much use
+      in using ``ugettext``, because you'll always need to produce utf-8
+      anyway.
+    * Django doesn't use ``xgettext`` alone. It uses Python wrappers around
+      ``xgettext`` and ``msgfmt``. That's mostly for convenience.

Added: vendor/django/current/docs/install.txt
===================================================================
--- vendor/django/current/docs/install.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/install.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,112 @@
+=====================
+How to install Django
+=====================
+
+This document will get you up and running with Django.
+
+Install Python
+==============
+
+Being a Python Web framework, Django requires Python.
+
+It works with any Python version 2.3 and higher.
+
+Get Python at www.python.org. If you're running Linux or Mac OS X, you probably
+already have it installed.
+
+Install Apache and mod_python
+=============================
+
+If you just want to experiment with Django, skip this step. Django comes with
+its own Web server for development purposes.
+
+If you want to use Django on a production site, use Apache with `mod_python`_.
+mod_python is similar to mod_perl -- it embeds Python within Apache and loads
+Python code into memory when the server starts. Code stays in memory throughout
+the life of an Apache process, which leads to significant performance gains
+over other server arrangements. Make sure you have Apache installed, with the
+mod_python module activated. Django requires Apache 2.x and mod_python 3.x.
+
+See `How to use Django with mod_python`_ for information on how to configure
+mod_python once you have it installed.
+
+If you can't use mod_python for some reason, fear not: Django follows the WSGI_
+spec, which allows it to run on a variety of server platforms. See the
+`server-arrangements wiki page`_ for specific installation instructions for
+each platform.
+
+.. _Apache: http://httpd.apache.org/
+.. _mod_python: http://www.modpython.org/
+.. _WSGI: http://www.python.org/peps/pep-0333.html
+.. _How to use Django with mod_python: http://www.djangoproject.com/documentation/modpython/
+.. _server-arrangements wiki page: http://code.djangoproject.com/wiki/ServerArrangements
+
+Get your database running
+=========================
+
+If you plan to use Django's database API functionality, you'll need to
+make sure a database server is running. Django works with PostgreSQL_
+(recommended), MySQL_ and SQLite_.
+
+Additionally, you'll need to make sure your Python database bindings are
+installed.
+
+* If you're using PostgreSQL, you'll need the psycopg_ package (version 1.1 --
+  not version 1.0 or version 2, which is still in beta). If you're on Windows,
+  check out the unofficial `compiled Windows version`_.
+* If you're using MySQL, you'll need MySQLdb_.
+* If you're using SQLite, you'll need pysqlite_. Use version 2.0.3 or higher.
+
+.. _PostgreSQL: http://www.postgresql.org/
+.. _MySQL: http://www.mysql.com/
+.. _Django's ticket system: http://code.djangoproject.com/report/1
+.. _psycopg: http://initd.org/projects/psycopg1
+.. _compiled Windows version: http://stickpeople.com/projects/python/win-psycopg/
+.. _MySQLdb: http://sourceforge.net/projects/mysql-python
+.. _SQLite: http://www.sqlite.org/
+.. _pysqlite: http://initd.org/tracker/pysqlite
+
+Install the Django code
+=======================
+
+Installation instructions are slightly different depending on whether you're
+using the latest official version or the latest development version.
+
+It's easy either way.
+
+Installing the official version
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Download Django-0.95.tar.gz from our `download page`_.
+2. ``tar xzvf Django-0.95.tar.gz``
+3. ``cd Django-0.95``
+4. ``sudo python setup.py install``
+
+Note that the last command will automatically download and install setuptools_
+if you don't already have it installed. This requires a working Internet
+connection.
+
+This will install Django in your Python installation's ``site-packages``
+directory.
+
+.. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools
+
+Installing the development version
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+1. Make sure you have Subversion_ installed.
+2. ``svn co http://code.djangoproject.com/svn/django/trunk/ django_src``
+3. Symlink ``django_src/django`` so that ``django`` is within your Python
+   ``site-packages`` directory:
+
+   ``ln -s `pwd`/django_src/django /usr/lib/python2.3/site-packages/django``
+
+   (In the above line, change ``python2.3`` to match your current Python version.)
+
+You don't have to run ``python setup.py install``.
+
+When you want to update your code, just run the command ``svn update`` from
+within the ``django_src`` directory.
+
+.. _`download page`: http://www.djangoproject.com/download/
+.. _Subversion: http://subversion.tigris.org/

Added: vendor/django/current/docs/legacy_databases.txt
===================================================================
--- vendor/django/current/docs/legacy_databases.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/legacy_databases.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,71 @@
+==================================
+Integrating with a legacy database
+==================================
+
+While Django is best suited for developing new applications, it's quite
+possible to integrate it into legacy databases. Django includes a couple of
+utilities to automate as much of this process as possible.
+
+This document assumes you know the Django basics, as covered in the
+`official tutorial`_.
+
+.. _official tutorial: http://www.djangoproject.com/documentation/tutorial1/
+
+Give Django your database parameters
+====================================
+
+You'll need to tell Django what your database connection parameters are, and
+what the name of the database is. Do that by editing these settings in your
+`settings file`_:
+
+    * `DATABASE_NAME`
+    * `DATABASE_ENGINE`_
+    * `DATABASE_USER`_
+    * `DATABASE_PASSWORD`_
+    * `DATABASE_NAME`_
+    * `DATABASE_HOST`_
+    * `DATABASE_PORT`_
+
+.. _settings file: http://www.djangoproject.com/documentation/settings/
+.. _DATABASE_NAME: http://www.djangoproject.com/documentation/settings/#database-name
+.. _DATABASE_ENGINE: http://www.djangoproject.com/documentation/settings/#database-engine
+.. _DATABASE_USER: http://www.djangoproject.com/documentation/settings/#database-user
+.. _DATABASE_PASSWORD: http://www.djangoproject.com/documentation/settings/#database-password
+.. _DATABASE_NAME: http://www.djangoproject.com/documentation/settings/#database-name
+.. _DATABASE_HOST: http://www.djangoproject.com/documentation/settings/#database-host
+.. _DATABASE_PORT: http://www.djangoproject.com/documentation/settings/#database-port
+
+Auto-generate the models
+========================
+
+Django comes with a utility that can create models by introspecting an existing
+database. You can view the output by running this command::
+
+    django-admin.py inspectdb --settings=path.to.settings
+
+Save this as a file by using standard Unix output redirection::
+
+    django-admin.py inspectdb --settings=path.to.settings > models.py
+
+This feature is meant as a shortcut, not as definitive model generation. See
+the `django-admin.py documentation`_ for more information.
+
+Once you've cleaned up your models, name the file ``models.py`` and put it in
+the Python package that holds your app. Then add the app to your
+``INSTALLED_APPS`` setting.
+
+.. _django-admin.py documentation: http://www.djangoproject.com/documentation/django_admin/
+
+Install the core Django tables
+==============================
+
+Next, run the ``manage.py syncdb`` command to install any extra needed database
+records such as admin permissions and content types::
+
+    django-admin.py init --settings=path.to.settings
+
+See whether it worked
+=====================
+
+That's it. Try accessing your data via the Django database API, and try editing
+objects via Django's admin site.

Added: vendor/django/current/docs/middleware.txt
===================================================================
--- vendor/django/current/docs/middleware.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/middleware.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,214 @@
+==========
+Middleware
+==========
+
+Middleware is a framework of hooks into Django's request/response processing.
+It's a light, low-level "plugin" system for globally altering Django's input
+and/or output.
+
+Each middleware component is responsible for doing some specific function. For
+example, Django includes a middleware component, ``XViewMiddleware``, that adds
+an ``"X-View"`` HTTP header to every response to a ``HEAD`` request.
+
+This document explains all middleware components that come with Django, how to
+use them, and how to write your own middleware.
+
+Activating middleware
+=====================
+
+To activate a middleware component, add it to the ``MIDDLEWARE_CLASSES`` list
+in your Django settings. In ``MIDDLEWARE_CLASSES``, each middleware component
+is represented by a string: the full Python path to the middleware's class
+name. For example, here's the default ``MIDDLEWARE_CLASSES`` created by
+``django-admin.py startproject``::
+
+    MIDDLEWARE_CLASSES = (
+        'django.middleware.common.CommonMiddleware',
+        'django.contrib.sessions.middleware.SessionMiddleware',
+        'django.contrib.auth.middleware.AuthenticationMiddleware',
+        'django.middleware.doc.XViewMiddleware',
+    )
+
+Django applies middleware in the order it's defined in ``MIDDLEWARE_CLASSES``,
+except in the case of response and exception middleware, which is applied in
+reverse order.
+
+A Django installation doesn't require any middleware -- e.g.,
+``MIDDLEWARE_CLASSES`` can be empty, if you'd like -- but it's strongly
+suggested that you use ``CommonMiddleware``.
+
+Available middleware
+====================
+
+django.middleware.cache.CacheMiddleware
+---------------------------------------
+
+Enables site-wide cache. If this is enabled, each Django-powered page will be
+cached for as long as the ``CACHE_MIDDLEWARE_SECONDS`` setting defines. See
+the `cache documentation`_.
+
+.. _`cache documentation`: http://www.djangoproject.com/documentation/cache/#the-per-site-cache
+
+django.middleware.common.CommonMiddleware
+-----------------------------------------
+
+Adds a few conveniences for perfectionists:
+
+* Forbids access to user agents in the ``DISALLOWED_USER_AGENTS`` setting,
+  which should be a list of strings.
+
+* Performs URL rewriting based on the ``APPEND_SLASH`` and ``PREPEND_WWW``
+  settings. If ``APPEND_SLASH`` is ``True``, URLs that lack a trailing
+  slash will be redirected to the same URL with a trailing slash, unless the
+  last component in the path contains a period. So ``foo.com/bar`` is
+  redirected to ``foo.com/bar/``, but ``foo.com/bar/file.txt`` is passed
+  through unchanged.
+  
+  If ``PREPEND_WWW`` is ``True``, URLs that lack a leading "www." will be
+  redirected to the same URL with a leading "www."
+
+  Both of these options are meant to normalize URLs. The philosophy is that
+  each URL should exist in one, and only one, place. Technically a URL
+  ``foo.com/bar`` is distinct from ``foo.com/bar/`` -- a search-engine
+  indexer would treat them as separate URLs -- so it's best practice to
+  normalize URLs.
+
+* Handles ETags based on the ``USE_ETAGS`` setting. If ``USE_ETAGS`` is set
+  to ``True``, Django will calculate an ETag for each request by
+  MD5-hashing the page content, and it'll take care of sending
+  ``Not Modified`` responses, if appropriate.
+
+django.middleware.doc.XViewMiddleware
+-------------------------------------
+
+Sends custom ``X-View`` HTTP headers to HEAD requests that come from IP
+addresses defined in the ``INTERNAL_IPS`` setting. This is used by Django's
+automatic documentation system.
+
+django.middleware.gzip.GZipMiddleware
+-------------------------------------
+
+Compresses content for browsers that understand gzip compression (all modern
+browsers).
+
+django.middleware.http.ConditionalGetMiddleware
+-----------------------------------------------
+
+Handles conditional GET operations. If the response has a ``ETag`` or
+``Last-Modified`` header, and the request has ``If-None-Match`` or
+``If-Modified-Since``, the response is replaced by an HttpNotModified.
+
+Also removes the content from any response to a HEAD request and sets the
+``Date`` and ``Content-Length`` response-headers.
+
+django.contrib.sessions.middleware.SessionMiddleware
+----------------------------------------------------
+
+Enables session support. See the `session documentation`_.
+
+.. _`session documentation`: http://www.djangoproject.com/documentation/sessions/
+
+django.contrib.auth.middleware.AuthenticationMiddleware
+-------------------------------------------------------
+
+Adds the ``user`` attribute, representing the currently-logged-in user, to
+every incoming ``HttpRequest`` object. See `Authentication in Web requests`_.
+
+.. _Authentication in Web requests: http://www.djangoproject.com/documentation/authentication/#authentication-in-web-requests
+
+django.middleware.transaction.TransactionMiddleware
+---------------------------------------------------
+
+Binds commit and rollback to the request/response phase. If a view function runs
+successfully, a commit is done. If it fails with an exception, a rollback is
+done.
+
+The order of this middleware in the stack is important: middleware modules
+running outside of it run with commit-on-save - the default Django behavior.
+Middleware modules running inside it (coming later in the stack) will be under
+the same transaction control as the view functions.
+
+See the `transaction management documentation`_.
+
+.. _`transaction management documentation`: http://www.djangoproject.com/documentation/transactions/
+
+Writing your own middleware
+===========================
+
+Writing your own middleware is easy. Each middleware component is a single
+Python class that defines one or more of the following methods:
+
+process_request
+---------------
+
+Interface: ``process_request(self, request)``
+
+``request`` is an ``HttpRequest`` object. This method is called on each
+request, before Django decides which view to execute.
+
+``process_request()`` should return either ``None`` or an ``HttpResponse``
+object. If it returns ``None``, Django will continue processing this request,
+executing any other middleware and, then, the appropriate view. If it returns
+an ``HttpResponse`` object, Django won't bother calling ANY other middleware or
+the appropriate view; it'll return that ``HttpResponse``.
+
+process_view
+------------
+
+Interface: ``process_view(self, request, view_func, view_args, view_kwargs)``
+
+``request`` is an ``HttpRequest`` object. ``view_func`` is the Python function
+that Django is about to use. (It's the actual function object, not the name of
+the function as a string.) ``view_args`` is a list of positional arguments that
+will be passed to the view, and ``view_kwargs`` is a dictionary of keyword
+arguments that will be passed to the view. Neither ``view_args`` nor
+``view_kwargs`` include the first view argument (``request``).
+
+``process_view()`` is called just before Django calls the view. It should
+return either ``None`` or an ``HttpResponse`` object. If it returns ``None``,
+Django will continue processing this request, executing any other
+``process_view()`` middleware and, then, the appropriate view. If it returns an
+``HttpResponse`` object, Django won't bother calling ANY other middleware or
+the appropriate view; it'll return that ``HttpResponse``.
+
+process_response
+----------------
+
+Interface: ``process_response(self, request, response)``
+
+``request`` is an ``HttpRequest`` object. ``response`` is the ``HttpResponse``
+object returned by a Django view.
+
+``process_response()`` should return an ``HttpResponse`` object. It could alter
+the given ``response``, or it could create and return a brand-new
+``HttpResponse``.
+
+process_exception
+-----------------
+
+Interface: ``process_exception(self, request, exception)``
+
+``request`` is an ``HttpRequest`` object. ``exception`` is an ``Exception``
+object raised by the view function.
+
+Django calls ``process_exception()`` when a view raises an exception.
+``process_exception()`` should return either ``None`` or an ``HttpResponse``
+object. If it returns an ``HttpResponse`` object, the response will be returned
+to the browser. Otherwise, default exception handling kicks in.
+
+Guidelines
+----------
+
+    * Middleware classes don't have to subclass anything.
+
+    * The middleware class can live anywhere on your Python path. All Django
+      cares about is that the ``MIDDLEWARE_CLASSES`` setting includes the path
+      to it.
+
+    * Feel free to look at Django's available middleware for examples. The
+      core Django middleware classes are in ``django/middleware/`` in the
+      Django distribution. The session middleware is in ``django/contrib/sessions``.
+
+    * If you write a middleware component that you think would be useful to
+      other people, contribute to the community! Let us know, and we'll
+      consider adding it to Django.

Added: vendor/django/current/docs/model-api.txt
===================================================================
--- vendor/django/current/docs/model-api.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/model-api.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1781 @@
+===============
+Model reference
+===============
+
+A model is the single, definitive source of data about your data. It contains
+the essential fields and behaviors of the data you're storing. Generally, each
+model maps to a single database table.
+
+The basics:
+
+    * Each model is a Python class that subclasses ``django.db.models.Model``.
+    * Each attribute of the model represents a database field.
+    * Model metadata (non-field information) goes in an inner class named
+      ``Meta``.
+    * Metadata used for Django's admin site goes into an inner class named
+      ``Admin``.
+    * With all of this, Django gives you an automatically-generated
+      database-access API, which is explained in the `Database API reference`_.
+
+A companion to this document is the `official repository of model examples`_.
+(In the Django source distribution, these examples are in the
+``tests/modeltests`` directory.)
+
+.. _Database API reference: http://www.djangoproject.com/documentation/db_api/
+.. _official repository of model examples: http://www.djangoproject.com/documentation/models/
+
+Quick example
+=============
+
+This example model defines a ``Person``, which has a ``first_name`` and
+``last_name``::
+
+    from django.db import models
+
+    class Person(models.Model):
+        first_name = models.CharField(maxlength=30)
+        last_name = models.CharField(maxlength=30)
+
+``first_name`` and ``last_name`` are *fields* of the model. Each field is
+specified as a class attribute, and each attribute maps to a database column.
+
+The above ``Person`` model would create a database table like this::
+
+    CREATE TABLE myapp_person (
+        "id" serial NOT NULL PRIMARY KEY,
+        "first_name" varchar(30) NOT NULL,
+        "last_name" varchar(30) NOT NULL
+    );
+
+Some technical notes:
+
+    * The name of the table, ``myapp_person``, is automatically derived from
+      some model metadata but can be overridden. See _`Table names` below.
+    * An ``id`` field is added automatically, but this behavior can be
+      overriden. See `Automatic primary key fields`_ below.
+    * The ``CREATE TABLE`` SQL in this example is formatted using PostgreSQL
+      syntax, but it's worth noting Django uses SQL tailored to the database
+      backend specified in your `settings file`_.
+
+.. _settings file: http://www.djangoproject.com/documentation/settings/
+
+Fields
+======
+
+The most important part of a model -- and the only required part of a model --
+is the list of database fields it defines. Fields are specified by class
+attributes.
+
+Example::
+
+    class Musician(models.Model):
+        first_name = models.CharField(maxlength=50)
+        last_name = models.CharField(maxlength=50)
+        instrument = models.CharField(maxlength=100)
+
+    class Album(models.Model):
+        artist = models.ForeignKey(Musician)
+        name = models.CharField(maxlength=100)
+        release_date = models.DateField()
+        num_stars = models.IntegerField()
+
+Field name restrictions
+-----------------------
+
+Django places only two restrictions on model field names:
+
+    1. A field name cannot be a Python reserved word, because that would result
+       in a Python syntax error. For example::
+
+           class Example(models.Model):
+               pass = models.IntegerField() # 'pass' is a reserved word!
+
+    2. A field name cannot contain more than one underscore in a row, due to
+       the way Django's query lookup syntax works. For example::
+
+           class Example(models.Model):
+               foo__bar = models.IntegerField() 'foo__bar' has two underscores!
+
+These limitations can be worked around, though, because your field name doesn't
+necessarily have to match your database column name. See `db_column`_ below.
+
+SQL reserved words, such as ``join``, ``where`` or ``select``, *are* allowed as
+model field names, because Django escapes all database table names and column
+names in every underlying SQL query. It uses the quoting syntax of your
+particular database engine.
+
+Field types
+-----------
+
+Each field in your model should be an instance of the appropriate ``Field``
+class. Django uses the field class types to determine a few things:
+
+    * The database column type (e.g. ``INTEGER``, ``VARCHAR``).
+    * The widget to use in Django's admin interface, if you care to use it
+      (e.g. ``<input type="text">``, ``<select>``).
+    * The minimal validation requirements, used in Django's admin and in
+      manipulators.
+
+Here are all available field types:
+
+``AutoField``
+~~~~~~~~~~~~~
+
+An ``IntegerField`` that automatically increments according to available IDs.
+You usually won't need to use this directly; a primary key field will
+automatically be added to your model if you don't specify otherwise. See
+`Automatic primary key fields`_.
+
+``BooleanField``
+~~~~~~~~~~~~~~~~
+
+A true/false field.
+
+The admin represents this as a checkbox.
+
+``CharField``
+~~~~~~~~~~~~~
+
+A string field, for small- to large-sized strings.
+
+For large amounts of text, use ``TextField``.
+
+The admin represents this as an ``<input type="text">`` (a single-line input).
+
+``CharField`` has an extra required argument, ``maxlength``, the maximum length
+(in characters) of the field. The maxlength is enforced at the database level
+and in Django's validation.
+
+``CommaSeparatedIntegerField``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A field of integers separated by commas. As in ``CharField``, the ``maxlength``
+argument is required.
+
+``DateField``
+~~~~~~~~~~~~~
+
+A date field. Has a few extra optional arguments:
+
+    ======================  ===================================================
+    Argument                Description
+    ======================  ===================================================
+    ``auto_now``            Automatically set the field to now every time the
+                            object is saved. Useful for "last-modified"
+                            timestamps. Note that the current date is *always*
+                            used; it's not just a default value that you can
+                            override.
+
+    ``auto_now_add``        Automatically set the field to now when the object
+                            is first created. Useful for creation of
+                            timestamps. Note that the current date is *always*
+                            used; it's not just a default value that you can
+                            override.
+    ======================  ===================================================
+
+The admin represents this as an ``<input type="text">`` with a JavaScript
+calendar and a shortcut for "Today."
+
+``DateTimeField``
+~~~~~~~~~~~~~~~~~
+
+A date and time field. Takes the same extra options as ``DateField``.
+
+The admin represents this as two ``<input type="text">`` fields, with
+JavaScript shortcuts.
+
+``EmailField``
+~~~~~~~~~~~~~~
+
+A ``CharField`` that checks that the value is a valid e-mail address.
+This doesn't accept ``maxlength``.
+
+``FileField``
+~~~~~~~~~~~~~
+
+A file-upload field.
+
+Has an extra required argument, ``upload_to``, a local filesystem path to
+which files should be upload. This path may contain `strftime formatting`_,
+which will be replaced by the date/time of the file upload (so that
+uploaded files don't fill up the given directory).
+
+The admin represents this as an ``<input type="file">`` (a file-upload widget).
+
+Using a ``FileField`` or an ``ImageField`` (see below) in a model takes a few
+steps:
+
+    1. In your settings file, you'll need to define ``MEDIA_ROOT`` as the
+       full path to a directory where you'd like Django to store uploaded
+       files. (For performance, these files are not stored in the database.)
+       Define ``MEDIA_URL`` as the base public URL of that directory. Make
+       sure that this directory is writable by the Web server's user
+       account.
+
+    2. Add the ``FileField`` or ``ImageField`` to your model, making sure
+       to define the ``upload_to`` option to tell Django to which
+       subdirectory of ``MEDIA_ROOT`` it should upload files.
+
+    3. All that will be stored in your database is a path to the file
+       (relative to ``MEDIA_ROOT``). You'll must likely want to use the
+       convenience ``get_<fieldname>_url`` function provided by Django. For
+       example, if your ``ImageField`` is called ``mug_shot``, you can get
+       the absolute URL to your image in a template with ``{{
+       object.get_mug_shot_url }}``.
+
+.. _`strftime formatting`: http://docs.python.org/lib/module-time.html#l2h-1941
+
+``FilePathField``
+~~~~~~~~~~~~~~~~~
+
+A field whose choices are limited to the filenames in a certain directory
+on the filesystem. Has three special arguments, of which the first is
+required:
+
+    ======================  ===================================================
+    Argument                Description
+    ======================  ===================================================
+    ``path``                Required. The absolute filesystem path to a
+                            directory from which this ``FilePathField`` should
+                            get its choices. Example: ``"/home/images"``.
+
+    ``match``               Optional. A regular expression, as a string, that
+                            ``FilePathField`` will use to filter filenames.
+                            Note that the regex will be applied to the
+                            base filename, not the full path. Example:
+                            ``"foo.*\.txt^"``, which will match a file called
+                            ``foo23.txt`` but not ``bar.txt`` or ``foo23.gif``.
+
+    ``recursive``           Optional. Either ``True`` or ``False``. Default is
+                            ``False``. Specifies whether all subdirectories of
+                            ``path`` should be included.
+    ======================  ===================================================
+
+Of course, these arguments can be used together.
+
+The one potential gotcha is that ``match`` applies to the base filename,
+not the full path. So, this example::
+
+    FilePathField(path="/home/images", match="foo.*", recursive=True)
+
+...will match ``/home/images/foo.gif`` but not ``/home/images/foo/bar.gif``
+because the ``match`` applies to the base filename (``foo.gif`` and
+``bar.gif``).
+
+``FloatField``
+~~~~~~~~~~~~~~
+
+A floating-point number. Has two **required** arguments:
+
+    ======================  ===================================================
+    Argument                Description
+    ======================  ===================================================
+    ``max_digits``          The maximum number of digits allowed in the number.
+
+    ``decimal_places``      The number of decimal places to store with the
+                            number.
+    ======================  ===================================================
+
+For example, to store numbers up to 999 with a resolution of 2 decimal places,
+you'd use::
+
+    models.FloatField(..., max_digits=5, decimal_places=2)
+
+And to store numbers up to approximately one billion with a resolution of 10
+decimal places::
+
+    models.FloatField(..., max_digits=19, decimal_places=10)
+
+The admin represents this as an ``<input type="text">`` (a single-line input).
+
+``ImageField``
+~~~~~~~~~~~~~~
+
+Like ``FileField``, but validates that the uploaded object is a valid
+image. Has two extra optional arguments, ``height_field`` and
+``width_field``, which, if set, will be auto-populated with the height and
+width of the image each time a model instance is saved.
+
+Requires the `Python Imaging Library`_.
+
+.. _Python Imaging Library: http://www.pythonware.com/products/pil/
+
+``IntegerField``
+~~~~~~~~~~~~~~~~
+
+An integer.
+
+The admin represents this as an ``<input type="text">`` (a single-line input).
+
+``IPAddressField``
+~~~~~~~~~~~~~~~~~~
+
+An IP address, in string format (i.e. "24.124.1.30").
+
+The admin represents this as an ``<input type="text">`` (a single-line input).
+
+``NullBooleanField``
+~~~~~~~~~~~~~~~~~~~~
+
+Like a ``BooleanField``, but allows ``NULL`` as one of the options.  Use this
+instead of a ``BooleanField`` with ``null=True``.
+
+The admin represents this as a ``<select>`` box with "Unknown", "Yes" and "No" choices.
+
+``PhoneNumberField``
+~~~~~~~~~~~~~~~~~~~~
+
+A ``CharField`` that checks that the value is a valid U.S.A.-style phone
+number (in the format ``XXX-XXX-XXXX``).
+
+``PositiveIntegerField``
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Like an ``IntegerField``, but must be positive.
+
+``PositiveSmallIntegerField``
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Like a ``PositiveIntegerField``, but only allows values under a certain
+(database-dependent) point.
+
+``SlugField``
+~~~~~~~~~~~~~
+
+"Slug" is a newspaper term. A slug is a short label for something,
+containing only letters, numbers, underscores or hyphens. They're generally
+used in URLs.
+
+In the Django development version, you can specify ``maxlength``. If
+``maxlength`` is not specified, Django will use a default length of 50. In
+previous Django versions, there's no way to override the length of 50.
+
+Implies ``db_index=True``.
+
+Accepts an extra option, ``prepopulate_from``, which is a list of fields
+from which to auto-populate the slug, via JavaScript, in the object's admin
+form::
+
+    models.SlugField(prepopulate_from=("pre_name", "name"))
+
+``prepopulate_from`` doesn't accept DateTimeFields.
+
+The admin represents ``SlugField`` as an ``<input type="text">`` (a
+single-line input).
+
+``SmallIntegerField``
+~~~~~~~~~~~~~~~~~~~~~
+
+Like an ``IntegerField``, but only allows values under a certain
+(database-dependent) point.
+
+``TextField``
+~~~~~~~~~~~~~
+
+A large text field.
+
+The admin represents this as a ``<textarea>`` (a multi-line input).
+
+``TimeField``
+~~~~~~~~~~~~~
+
+A time. Accepts the same auto-population options as ``DateField`` and
+``DateTimeField``.
+
+The admin represents this as an ``<input type="text">`` with some
+JavaScript shortcuts.
+
+``URLField``
+~~~~~~~~~~~~
+
+A field for a URL. If the ``verify_exists`` option is ``True`` (default),
+the URL given will be checked for existence (i.e., the URL actually loads
+and doesn't give a 404 response).
+
+The admin represents this as an ``<input type="text">`` (a single-line input).
+
+``USStateField``
+~~~~~~~~~~~~~~~~
+
+A two-letter U.S. state abbreviation.
+
+The admin represents this as an ``<input type="text">`` (a single-line input).
+
+``XMLField``
+~~~~~~~~~~~~
+
+A ``TextField`` that checks that the value is valid XML that matches a
+given schema. Takes one required argument, ``schema_path``, which is the
+filesystem path to a RelaxNG_ schema against which to validate the field.
+
+.. _RelaxNG: http://www.relaxng.org/
+
+Field options
+-------------
+
+The following arguments are available to all field types. All are optional.
+
+``null``
+~~~~~~~~
+
+If ``True``, Django will store empty values as ``NULL`` in the database.
+Default is ``False``.
+
+Note that empty string values will always get stored as empty strings, not
+as ``NULL`` -- so use ``null=True`` for non-string fields such as integers,
+booleans and dates.
+
+Avoid using ``null`` on string-based fields such as ``CharField`` and
+``TextField`` unless you have an excellent reason. If a string-based field
+has ``null=True``, that means it has two possible values for "no data":
+``NULL``, and the empty string. In most cases, it's redundant to have two
+possible values for "no data;" Django convention is to use the empty
+string, not ``NULL``.
+
+``blank``
+~~~~~~~~~
+
+If ``True``, the field is allowed to be blank.
+
+Note that this is different than ``null``. ``null`` is purely
+database-related, whereas ``blank`` is validation-related. If a field has
+``blank=True``, validation on Django's admin site will allow entry of an
+empty value. If a field has ``blank=False``, the field will be required.
+
+``choices``
+~~~~~~~~~~~
+
+An iterable (e.g., a list or tuple) of 2-tuples to use as choices for this
+field.
+
+If this is given, Django's admin will use a select box instead of the
+standard text field and will limit choices to the choices given.
+
+A choices list looks like this::
+
+    YEAR_IN_SCHOOL_CHOICES = (
+        ('FR', 'Freshman'),
+        ('SO', 'Sophomore'),
+        ('JR', 'Junior'),
+        ('SR', 'Senior'),
+        ('GR', 'Graduate'),
+    )
+
+The first element in each tuple is the actual value to be stored. The
+second element is the human-readable name for the option.
+
+The choices list can be defined either as part of your model class::
+
+    class Foo(models.Model):
+        GENDER_CHOICES = (
+            ('M', 'Male'),
+            ('F', 'Female'),
+        )
+        gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+
+or outside your model class altogether::
+
+    GENDER_CHOICES = (
+        ('M', 'Male'),
+        ('F', 'Female'),
+    )
+    class Foo(models.Model):
+        gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+
+Finally, note that choices can be any iterable object -- not necessarily a
+list or tuple. This lets you construct choices dynamically. But if you find
+yourself hacking ``choices`` to be dynamic, you're probably better off using
+a proper database table with a ``ForeignKey``. ``choices`` is meant for static
+data that doesn't change much, if ever.
+
+``core``
+~~~~~~~~
+
+For objects that are edited inline to a related object.
+
+In the Django admin, if all "core" fields in an inline-edited object are
+cleared, the object will be deleted.
+
+It is an error to have an inline-editable relation without at least one
+``core=True`` field.
+
+Please note that each field marked "core" is treated as a required field by the
+Django admin site. Essentially, this means you should put ``core=True`` on all
+required fields in your related object that is being edited inline.
+
+``db_column``
+~~~~~~~~~~~~~
+
+The name of the database column to use for this field. If this isn't given,
+Django will use the field's name.
+
+If your database column name is an SQL reserved word, or contains
+characters that aren't allowed in Python variable names -- notably, the
+hyphen -- that's OK. Django quotes column and table names behind the
+scenes.
+
+``db_index``
+~~~~~~~~~~~~
+
+If ``True``, ``django-admin.py sqlindexes`` will output a ``CREATE INDEX``
+statement for this field.
+
+``default``
+~~~~~~~~~~~
+
+The default value for the field.
+
+``editable``
+~~~~~~~~~~~~
+
+If ``False``, the field will not be editable in the admin. Default is  ``True``.
+
+``help_text``
+~~~~~~~~~~~~~
+
+Extra "help" text to be displayed under the field on the object's admin
+form. It's useful for documentation even if your object doesn't have an
+admin form.
+
+``primary_key``
+~~~~~~~~~~~~~~~
+
+If ``True``, this field is the primary key for the model.
+
+If you don't specify ``primary_key=True`` for any fields in your model,
+Django will automatically add this field::
+
+    id = models.AutoField('ID', primary_key=True)
+
+Thus, you don't need to set ``primary_key=True`` on any of your fields
+unless you want to override the default primary-key behavior.
+
+``primary_key=True`` implies ``blank=False``, ``null=False`` and
+``unique=True``. Only one primary key is allowed on an object.
+
+``radio_admin``
+~~~~~~~~~~~~~~~
+
+By default, Django's admin uses a select-box interface (<select>) for
+fields that are ``ForeignKey`` or have ``choices`` set. If ``radio_admin``
+is set to ``True``, Django will use a radio-button interface instead.
+
+Don't use this for a field unless it's a ``ForeignKey`` or has ``choices``
+set.
+
+``unique``
+~~~~~~~~~~
+
+If ``True``, this field must be unique throughout the table.
+
+This is enforced at the database level and at the Django admin-form level.
+
+``unique_for_date``
+~~~~~~~~~~~~~~~~~~~
+
+Set this to the name of a ``DateField`` or ``DateTimeField`` to require
+that this field be unique for the value of the date field.
+
+For example, if you have a field ``title`` that has
+``unique_for_date="pub_date"``, then Django wouldn't allow the entry of
+two records with the same ``title`` and ``pub_date``.
+
+This is enforced at the Django admin-form level but not at the database level.
+
+``unique_for_month``
+~~~~~~~~~~~~~~~~~~~~
+
+Like ``unique_for_date``, but requires the field to be unique with respect
+to the month.
+
+``unique_for_year``
+~~~~~~~~~~~~~~~~~~~
+
+Like ``unique_for_date`` and ``unique_for_month``.
+
+``validator_list``
+~~~~~~~~~~~~~~~~~~
+
+A list of extra validators to apply to the field. Each should be a callable
+that takes the parameters ``field_data, all_data`` and raises
+``django.core.validators.ValidationError`` for errors. (See the
+`validator docs`_.)
+
+Django comes with quite a few validators. They're in ``django.core.validators``.
+
+.. _validator docs: http://www.djangoproject.com/documentation/forms/#validators
+
+Verbose field names
+-------------------
+
+Each field type, except for ``ForeignKey``, ``ManyToManyField`` and
+``OneToOneField``, takes an optional first positional argument -- a
+verbose name. If the verbose name isn't given, Django will automatically create
+it using the field's attribute name, converting underscores to spaces.
+
+In this example, the verbose name is ``"Person's first name"``::
+
+    first_name = models.CharField("Person's first name", maxlength=30)
+
+In this example, the verbose name is ``"first name"``::
+
+    first_name = models.CharField(maxlength=30)
+
+``ForeignKey``, ``ManyToManyField`` and ``OneToOneField`` require the first
+argument to be a model class, so use the ``verbose_name`` keyword argument::
+
+    poll = models.ForeignKey(Poll, verbose_name="the related poll")
+    sites = models.ManyToManyField(Site, verbose_name="list of sites")
+    place = models.OneToOneField(Place, verbose_name="related place")
+
+Convention is not to capitalize the first letter of the ``verbose_name``.
+Django will automatically capitalize the first letter where it needs to.
+
+Relationships
+-------------
+
+Clearly, the power of relational databases lies in relating tables to each
+other. Django offers ways to define the three most common types of database
+relationships: Many-to-one, many-to-many and one-to-one.
+
+Many-to-one relationships
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To define a many-to-one relationship, use ``ForeignKey``. You use it just like
+any other ``Field`` type: by including it as a class attribute of your model.
+
+``ForeignKey`` requires a positional argument: The class to which the model is
+related.
+
+For example, if a ``Car`` model has a ``Manufacturer`` -- that is, a
+``Manufacturer`` makes multiple cars but each ``Car`` only has one
+``Manufacturer`` -- use the following definitions::
+
+    class Manufacturer(models.Model):
+        # ...
+
+    class Car(models.Model):
+        manufacturer = models.ForeignKey(Manufacturer)
+        # ...
+
+To create a recursive relationship -- an object that has a many-to-one
+relationship with itself -- use ``models.ForeignKey('self')``.
+
+If you need to create a relationship on a model that has not yet been defined,
+you can use the name of the model, rather than the model object itself::
+
+    class Car(models.Model):
+        manufacturer = models.ForeignKey('Manufacturer')
+        # ...
+
+    class Manufacturer(models.Model):
+        # ...
+
+Note, however, that support for strings around model names in ``ForeignKey`` is
+quite new, and it can be buggy in some cases.
+
+Behind the scenes, Django appends ``"_id"`` to the field name to create its
+database column name. In the above example, the database table for the ``Car``
+model will have a ``manufacturer_id`` column. (You can change this explicitly
+by specifying ``db_column``; see ``db_column`` below.)  However, your code
+should never have to deal with the database column name, unless you write
+custom SQL. You'll always deal with the field names of your model object.
+
+It's suggested, but not required, that the name of a ``ForeignKey`` field
+(``manufacturer`` in the example above) be the name of the model, lowercase.
+You can, of course, call the field whatever you want. For example::
+
+    class Car(models.Model):
+        company_that_makes_it = models.ForeignKey(Manufacturer)
+        # ...
+
+See the `Many-to-one relationship model example`_ for a full example.
+
+.. _Many-to-one relationship model example: http://www.djangoproject.com/documentation/models/many_to_one/
+
+``ForeignKey`` fields take a number of extra arguments for defining how the
+relationship should work. All are optional:
+
+    =======================  ============================================================
+    Argument                 Description
+    =======================  ============================================================
+    ``edit_inline``          If not ``False``, this related object is edited
+                             "inline" on the related object's page. This means
+                             that the object will not have its own admin
+                             interface. Use either ``models.TABULAR`` or ``models.STACKED``,
+                             which, respectively, designate whether the inline-editable
+                             objects are displayed as a table or as a "stack" of
+                             fieldsets.
+
+    ``limit_choices_to``     A dictionary of lookup arguments and values (see
+                             the `Database API reference`_) that limit the
+                             available admin choices for this object. Use this
+                             with ``models.LazyDate`` to limit choices of objects
+                             by date. For example::
+
+                                limit_choices_to = {'pub_date__lte': models.LazyDate()}
+
+                             only allows the choice of related objects with a
+                             ``pub_date`` before the current date/time to be
+                             chosen.
+
+                             Instead of a dictionary this can also be a ``Q`` object
+                             (an object with a ``get_sql()`` method) for more complex
+                             queries.
+
+                             Not compatible with ``edit_inline``.
+
+    ``max_num_in_admin``     For inline-edited objects, this is the maximum
+                             number of related objects to display in the admin.
+                             Thus, if a pizza could only have up to 10
+                             toppings, ``max_num_in_admin=10`` would ensure
+                             that a user never enters more than 10 toppings.
+
+                             Note that this doesn't ensure more than 10 related
+                             toppings ever get created. It simply controls the
+                             admin interface; it doesn't enforce things at the
+                             Python API level or database level.
+
+    ``min_num_in_admin``     The minimum number of related objects displayed in
+                             the admin. Normally, at the creation stage,
+                             ``num_in_admin`` inline objects are shown, and at
+                             the edit stage ``num_extra_on_change`` blank
+                             objects are shown in addition to all pre-existing
+                             related objects.  However, no fewer than
+                             ``min_num_in_admin`` related objects will ever be
+                             displayed.
+
+    ``num_extra_on_change``  The number of extra blank related-object fields to
+                             show at the change stage.
+
+    ``num_in_admin``         The default number of inline objects to display
+                             on the object page at the add stage.
+
+    ``raw_id_admin``         Only display a field for the integer to be entered
+                             instead of a drop-down menu. This is useful when
+                             related to an object type that will have too many
+                             rows to make a select box practical.
+
+                             Not used with ``edit_inline``.
+
+    ``related_name``         The name to use for the relation from the related
+                             object back to this one. See the
+                             `related objects documentation`_ for a full
+                             explanation and example.
+
+    ``to_field``             The field on the related object that the relation
+                             is to. By default, Django uses the primary key of
+                             the related object.
+    =======================  ============================================================
+
+.. _`Database API reference`: http://www.djangoproject.com/documentation/db_api/
+.. _related objects documentation: http://www.djangoproject.com/documentation/db_api/#related-objects
+
+Many-to-many relationships
+~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+To define a many-to-many relationship, use ``ManyToManyField``. You use it just
+like any other ``Field`` type: by including it as a class attribute of your
+model.
+
+``ManyToManyField`` requires a positional argument: The class to which the
+model is related.
+
+For example, if a ``Pizza`` has multiple ``Topping`` objects -- that is, a
+``Topping`` can be on multiple pizzas and each ``Pizza`` has multiple toppings --
+here's how you'd represent that::
+
+    class Topping(models.Model):
+        # ...
+
+    class Pizza(models.Model):
+        # ...
+        toppings = models.ManyToManyField(Topping)
+
+As with ``ForeignKey``, a relationship to self can be defined by using the
+string ``'self'`` instead of the model name, and you can refer to as-yet
+undefined models by using a string containing the model name.
+
+It's suggested, but not required, that the name of a ``ManyToManyField``
+(``toppings`` in the example above) be a plural describing the set of related
+model objects.
+
+Behind the scenes, Django creates an intermediary join table to represent the
+many-to-many relationship.
+
+It doesn't matter which model gets the ``ManyToManyField``, but you only need
+it in one of the models -- not in both.
+
+Generally, ``ManyToManyField`` instances should go in the object that's going
+to be edited in the admin interface, if you're using Django's admin. In the
+above example, ``toppings`` is in ``Pizza`` (rather than ``Topping`` having a
+``pizzas`` ``ManyToManyField`` ) because it's more natural to think about a
+``Pizza`` having toppings than a topping being on multiple pizzas. The way it's
+set up above, the ``Pizza`` admin form would let users select the toppings.
+
+See the `Many-to-many relationship model example`_ for a full example.
+
+.. _Many-to-many relationship model example: http://www.djangoproject.com/documentation/models/many_to_many/
+
+``ManyToManyField`` objects take a number of extra arguments for defining how
+the relationship should work. All are optional:
+
+    =======================  ============================================================
+    Argument                 Description
+    =======================  ============================================================
+    ``related_name``         See the description under ``ForeignKey`` above.
+
+    ``filter_interface``     Use a nifty unobtrusive Javascript "filter" interface
+                             instead of the usability-challenged ``<select multiple>``
+                             in the admin form for this object. The value should be
+                             ``models.HORIZONTAL`` or ``models.VERTICAL`` (i.e.
+                             should the interface be stacked horizontally or
+                             vertically).
+
+    ``limit_choices_to``     See the description under ``ForeignKey`` above.
+
+    ``symmetrical``          Only used in the definition of ManyToManyFields on self.
+                             Consider the following model:
+
+                             class Person(models.Model):
+                                 friends = models.ManyToManyField("self")
+
+                             When Django processes this model, it identifies that it has
+                             a ``ManyToManyField`` on itself, and as a result, it
+                             doesn't add a ``person_set`` attribute to the ``Person``
+                             class. Instead, the ``ManyToManyField`` is assumed to be
+                             symmetrical -- that is, if I am your friend, then you are
+                             my friend.
+
+                             If you do not want symmetry in ``ManyToMany`` relationships
+                             with ``self``, set ``symmetrical`` to ``False``. This will
+                             force Django to add the descriptor for the reverse
+                             relationship, allowing ``ManyToMany`` relationships to be
+                             non-symmetrical.
+
+    =======================  ============================================================
+
+One-to-one relationships
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+The semantics of one-to-one relationships will be changing soon, so we don't
+recommend you use them. If that doesn't scare you away, keep reading.
+
+To define a one-to-one relationship, use ``OneToOneField``. You use it just
+like any other ``Field`` type: by including it as a class attribute of your
+model.
+
+This is most useful on the primary key of an object when that object "extends"
+another object in some way.
+
+``OneToOneField`` requires a positional argument: The class to which the
+model is related.
+
+For example, if you're building a database of "places", you would build pretty
+standard stuff such as address, phone number, etc. in the database. Then, if you
+wanted to build a database of restaurants on top of the places, instead of
+repeating yourself and replicating those fields in the ``Restaurant`` model, you
+could make ``Restaurant`` have a ``OneToOneField`` to ``Place`` (because a
+restaurant "is-a" place).
+
+As with ``ForeignKey``, a relationship to self can be defined by using the
+string ``"self"`` instead of the model name; references to as-yet undefined
+models can be made by using a string containing the model name.
+
+This ``OneToOneField`` will actually replace the primary key ``id`` field
+(since one-to-one relations share the same primary key), and will be displayed
+as a read-only field when you edit an object in the admin interface:
+
+See the `One-to-one relationship model example`_ for a full example.
+
+.. _One-to-one relationship model example: http://www.djangoproject.com/documentation/models/one_to_one/
+
+Meta options
+============
+
+Give your model metadata by using an inner ``class Meta``, like so::
+
+    class Foo(models.Model):
+        bar = models.CharField(maxlength=30)
+
+        class Meta:
+            # ...
+
+Model metadata is "anything that's not a field", such as ordering options, etc.
+
+Here's a list of all possible ``Meta`` options. No options are required. Adding
+``class Meta`` to a model is completely optional.
+
+``db_table``
+------------
+
+The name of the database table to use for the model::
+
+    db_table = 'music_album'
+
+If this isn't given, Django will use ``app_label + '_' + model_class_name``.
+See "Table names" below for more.
+
+If your database table name is an SQL reserved word, or contains characters
+that aren't allowed in Python variable names -- notably, the hyphen --
+that's OK. Django quotes column and table names behind the scenes.
+
+``get_latest_by``
+-----------------
+
+The name of a ``DateField`` or ``DateTimeField`` in the model. This specifies
+the default field to use in your model ``Manager``'s ``latest()`` method.
+
+Example::
+
+    get_latest_by = "order_date"
+
+See the `docs for latest()`_ for more.
+
+.. _docs for latest(): http://www.djangoproject.com/documentation/db_api/#latest-field-name-none
+
+``order_with_respect_to``
+-------------------------
+
+Marks this object as "orderable" with respect to the given field. This is
+almost always used with related objects to allow them to be ordered with
+respect to a parent object. For example, if an ``Answer`` relates to a
+``Question`` object, and a question has more than one answer, and the order
+of answers matters, you'd do this::
+
+    class Answer(models.Model):
+        question = models.ForeignKey(Question)
+        # ...
+
+        class Meta:
+            order_with_respect_to = 'question'
+
+``ordering``
+------------
+
+The default ordering for the object, for use when obtaining lists of objects::
+
+    ordering = ['-order_date']
+
+This is a tuple or list of strings. Each string is a field name with an
+optional "-" prefix, which indicates descending order. Fields without a
+leading "-" will be ordered ascending. Use the string "?" to order randomly.
+
+For example, to order by a ``pub_date`` field ascending, use this::
+
+    ordering = ['pub_date']
+
+To order by ``pub_date`` descending, use this::
+
+    ordering = ['-pub_date']
+
+To order by ``pub_date`` descending, then by ``author`` ascending, use this::
+
+    ordering = ['-pub_date', 'author']
+
+See `Specifying ordering`_ for more examples.
+
+Note that, regardless of how many fields are in ``ordering``, the admin
+site uses only the first field.
+
+.. _Specifying ordering: http://www.djangoproject.com/documentation/models/ordering/
+
+``permissions``
+---------------
+
+Extra permissions to enter into the permissions table when creating this
+object. Add, delete and change permissions are automatically created for
+each object that has ``admin`` set. This example specifies an extra
+permission, ``can_deliver_pizzas``::
+
+    permissions = (("can_deliver_pizzas", "Can deliver pizzas"),)
+
+This is a list or tuple of 2-tuples in the format
+``(permission_code, human_readable_permission_name)``.
+
+``unique_together``
+-------------------
+
+Sets of field names that, taken together, must be unique::
+
+    unique_together = (("driver", "restaurant"),)
+
+This is a list of lists of fields that must be unique when considered
+together. It's used in the Django admin and is enforced at the database
+level (i.e., the appropriate ``UNIQUE`` statements are included in the
+``CREATE TABLE`` statement).
+
+``verbose_name``
+----------------
+
+A human-readable name for the object, singular::
+
+    verbose_name = "pizza"
+
+If this isn't given, Django will use a munged version of the class name:
+``CamelCase`` becomes ``camel case``.
+
+``verbose_name_plural``
+-----------------------
+
+The plural name for the object::
+
+    verbose_name_plural = "stories"
+
+If this isn't given, Django will use ``verbose_name + "s"``.
+
+Table names
+===========
+
+To save you time, Django automatically derives the name of the database table
+from the name of your model class and the app that contains it. A model's
+database table name is constructed by joining the model's "app label" -- the
+name you used in ``manage.py startapp`` -- to the model's class name, with an
+underscore between them.
+
+For example, if you have an app ``bookstore`` (as created by
+``manage.py startapp bookstore``), a model defined as ``class Book`` will have
+a database table named ``bookstore_book``.
+
+To override the database table name, use the ``db_table`` parameter in
+``class Meta``.
+
+Automatic primary key fields
+============================
+
+By default, Django gives each model the following field::
+
+    id = models.AutoField(primary_key=True)
+
+This is an auto-incrementing primary key.
+
+If you'd like to specify a custom primary key, just specify ``primary_key=True``
+on one of your fields. If Django sees you've explicitly set ``primary_key``, it
+won't add the automatic ``id`` column.
+
+Each model requires exactly one field to have ``primary_key=True``.
+
+Admin options
+=============
+
+If you want your model to be visible to Django's admin site, give your model an
+inner ``"class Admin"``, like so::
+
+    class Person(models.Model):
+        first_name = models.CharField(maxlength=30)
+        last_name = models.CharField(maxlength=30)
+
+        class Admin:
+            # Admin options go here
+            pass
+
+The ``Admin`` class tells Django how to display the model in the admin site.
+
+Here's a list of all possible ``Admin`` options. None of these options are
+required. To use an admin interface without specifying any options, use
+``pass``, like so::
+
+    class Admin:
+        pass
+
+Adding ``class Admin`` to a model is completely optional.
+
+``date_hierarchy``
+------------------
+
+Set ``date_hierarchy`` to the name of a ``DateField`` or ``DateTimeField`` in
+your model, and the change list page will include a date-based drilldown
+navigation by that field.
+
+Example::
+
+    date_hierarchy = 'pub_date'
+
+``fields``
+----------
+
+Set ``fields`` to control the layout of admin "add" and "change" pages.
+
+``fields`` is a list of two-tuples, in which each two-tuple represents a
+``<fieldset>`` on the admin form page. (A ``<fieldset>`` is a "section" of the
+form.)
+
+The two-tuples are in the format ``(name, field_options)``, where ``name`` is a
+string representing the title of the fieldset and ``field_options`` is a
+dictionary of information about the fieldset, including a list of fields to be
+displayed in it.
+
+A full example, taken from the ``django.contrib.flatpages.FlatPage`` model::
+
+    class Admin:
+        fields = (
+            (None, {
+                'fields': ('url', 'title', 'content', 'sites')
+            }),
+            ('Advanced options', {
+                'classes': 'collapse',
+                'fields' : ('enable_comments', 'registration_required', 'template_name')
+            }),
+        )
+
+This results in an admin page that looks like:
+
+    .. image:: http://media.djangoproject.com/img/doc/flatfiles_admin.png
+
+If ``fields`` isn't given, Django will default to displaying each field that
+isn't an ``AutoField`` and has ``editable=True``, in a single fieldset, in
+the same order as the fields are defined in the model.
+
+The ``field_options`` dictionary can have the following keys:
+
+``fields``
+~~~~~~~~~~
+
+A tuple of field names to display in this fieldset. This key is required.
+
+Example::
+
+    {
+    'fields': ('first_name', 'last_name', 'address', 'city', 'state'),
+    }
+
+To display multiple fields on the same line, wrap those fields in their own
+tuple. In this example, the ``first_name`` and ``last_name`` fields will
+display on the same line::
+
+    {
+    'fields': (('first_name', 'last_name'), 'address', 'city', 'state'),
+    }
+
+``classes``
+~~~~~~~~~~~
+
+A string containing extra CSS classes to apply to the fieldset.
+
+Example::
+
+    {
+    'classes': 'wide',
+    }
+
+Apply multiple classes by separating them with spaces. Example::
+
+    {
+    'classes': 'wide extrapretty',
+    }
+
+Two useful classes defined by the default admin-site stylesheet are
+``collapse`` and ``wide``. Fieldsets with the ``collapse`` style will be
+initially collapsed in the admin and replaced with a small "click to expand"
+link. Fieldsets with the ``wide`` style will be given extra horizontal space.
+
+``description``
+~~~~~~~~~~~~~~~
+
+A string of optional extra text to be displayed at the top of each fieldset,
+under the heading of the fieldset. It's used verbatim, so you can use any HTML
+and you must escape any special HTML characters (such as ampersands) yourself.
+
+``js``
+------
+
+A list of strings representing URLs of JavaScript files to link into the admin
+screen via ``<script src="">`` tags. This can be used to tweak a given type of
+admin page in JavaScript or to provide "quick links" to fill in default values
+for certain fields.
+
+``list_display``
+----------------
+
+Set ``list_display`` to control which fields are displayed on the change list
+page of the admin.
+
+Example::
+
+    list_display = ('first_name', 'last_name')
+
+If you don't set ``list_display``, the admin site will display a single column
+that displays the ``__str__()`` representation of each object.
+
+A few special cases to note about ``list_display``:
+
+    * If the field is a ``ForeignKey``, Django will display the ``__str__()``
+      of the related object.
+
+    * ``ManyToManyField`` fields aren't supported, because that would entail
+        executing a separate SQL statement for each row in the table.
+
+    * If the field is a ``BooleanField``, Django will display a pretty "on" or
+      "off" icon instead of ``True`` or ``False``.
+
+    * If the string given is a method of the model, Django will call it and
+      display the output. This method should have a ``short_description``
+      function attribute, for use as the header for the field.
+
+      Here's a full example model::
+
+          class Person(models.Model):
+              name = models.CharField(maxlength=50)
+              birthday = models.DateField()
+
+              class Admin:
+                  list_display = ('name', 'decade_born_in')
+
+              def decade_born_in(self):
+                  return self.birthday.strftime('%Y')[:3] + "0's"
+              decade_born_in.short_description = 'Birth decade'
+
+    * If the string given is a method of the model, Django will HTML-escape the
+      output by default. If you'd rather not escape the output of the method,
+      give the method an ``allow_tags`` attribute whose value is ``True``.
+
+      Here's a full example model::
+
+          class Person(models.Model):
+              first_name = models.CharField(maxlength=50)
+              last_name = models.CharField(maxlength=50)
+              color_code = models.CharField(maxlength=6)
+
+              class Admin:
+                  list_display = ('first_name', 'last_name', 'colored_name')
+
+              def colored_name(self):
+                  return '<span style="color: #%s;">%s %s</span>' % (self.color_code, self.first_name, self.last_name)
+              colored_name.allow_tags = True
+
+``list_display_links``
+----------------------
+
+Set ``list_display_links`` to control which fields in ``list_display`` should
+be linked to the "change" page for an object.
+
+By default, the change list page will link the first column -- the first field
+specified in ``list_display`` -- to the change page for each item. But
+``list_display_links`` lets you change which columns are linked. Set
+``list_display_links`` to a list or tuple of field names (in the same format as
+``list_display``) to link.
+
+``list_display_links`` can specify one or many field names. As long as the
+field names appear in ``list_display``, Django doesn't care how many (or how
+few) fields are linked. The only requirement is: If you want to use
+``list_display_links``, you must define ``list_display``.
+
+In this example, the ``first_name`` and ``last_name`` fields will be linked on
+the change list page::
+
+    class Admin:
+        list_display = ('first_name', 'last_name', 'birthday')
+        list_display_links = ('first_name', 'last_name')
+
+Finally, note that in order to use ``list_display_links``, you must define
+``list_display``, too.
+
+``list_filter``
+---------------
+
+Set ``list_filter`` to activate filters in the right sidebar of the change list
+page of the admin. This should be a list of field names, and each specified
+field should be either a ``BooleanField``, ``DateField``, ``DateTimeField``
+or ``ForeignKey``.
+
+This example, taken from the ``django.contrib.auth.models.User`` model, shows
+how both ``list_display`` and ``list_filter`` work::
+
+    class Admin:
+        list_display = ('username', 'email', 'first_name', 'last_name', 'is_staff')
+        list_filter = ('is_staff', 'is_superuser')
+
+The above code results in an admin change list page that looks like this:
+
+    .. image:: http://media.djangoproject.com/img/doc/users_changelist.png
+
+(This example also has ``search_fields`` defined. See below.)
+
+``list_per_page``
+-----------------
+
+Set ``list_per_page`` to control how many items appear on each paginated admin
+change list page. By default, this is set to ``100``.
+
+``list_select_related``
+-----------------------
+
+Set ``list_select_related`` to tell Django to use ``select_related()`` in
+retrieving the list of objects on the admin change list page. This can save you
+a bunch of database queries.
+
+The value should be either ``True`` or ``False``. Default is ``False``.
+
+Note that Django will use ``select_related()``, regardless of this setting,
+if one of the ``list_display`` fields is a ``ForeignKey``.
+
+For more on ``select_related()``, see `the select_related() docs`_.
+
+.. _the select_related() docs: http://www.djangoproject.com/documentation/db_api/#select-related
+
+``ordering``
+------------
+
+Set ``ordering`` to specify how objects on the admin change list page should be
+ordered. This should be a list or tuple in the same format as a model's
+``ordering`` parameter.
+
+If this isn't provided, the Django admin will use the model's default ordering.
+
+``save_as``
+-----------
+
+Set ``save_as`` to enable a "save as" feature on admin change forms.
+
+Normally, objects have three save options: "Save", "Save and continue editing"
+and "Save and add another". If ``save_as`` is ``True``, "Save and add another"
+will be replaced by a "Save as" button.
+
+"Save as" means the object will be saved as a new object (with a new ID),
+rather than the old object.
+
+By default, ``save_as`` is set to ``False``.
+
+``save_on_top``
+---------------
+
+Set ``save_on_top`` to add save buttons across the top of your admin change
+forms.
+
+Normally, the save buttons appear only at the bottom of the forms. If you set
+``save_on_top``, the buttons will appear both on the top and the bottom.
+
+By default, ``save_on_top`` is set to ``False``.
+
+``search_fields``
+-----------------
+
+Set ``search_fields`` to enable a search box on the admin change list page.
+This should be set to a list of field names that will be searched whenever
+somebody submits a search query in that text box.
+
+These fields should be some kind of text field, such as ``CharField`` or
+``TextField``.
+
+When somebody does a search in the admin search box, Django splits the search
+query into words and returns all objects that contain each of the words, case
+insensitive, where each word must be in at least one of ``search_fields``. For
+example, if ``search_fields`` is set to ``['first_name', 'last_name']`` and a
+user searches for ``john lennon``, Django will do the equivalent of this SQL
+``WHERE`` clause::
+
+    WHERE (first_name ILIKE '%john%' OR last_name ILIKE '%john%')
+    AND (first_name ILIKE '%lennon%' OR last_name ILIKE '%lennon%')
+
+Managers
+========
+
+A ``Manager`` is the interface through which database query operations are
+provided to Django models. At least one ``Manager`` exists for every model in
+a Django application.
+
+The way ``Manager`` classes work is documented in the `Retrieving objects`_
+section of the database API docs, but this section specifically touches on
+model options that customize ``Manager`` behavior.
+
+.. _Retrieving objects: http://www.djangoproject.com/documentation/db_api/#retrieving-objects
+
+Manager names
+-------------
+
+By default, Django adds a ``Manager`` with the name ``objects`` to every Django
+model class. However, if you want to use ``objects`` as a field name, or if you
+want to use a name other than ``objects`` for the ``Manager``, you can rename
+it on a per-model basis. To rename the ``Manager`` for a given class, define a
+class attribute of type ``models.Manager()`` on that model. For example::
+
+    from django.db import models
+
+    class Person(models.Model):
+        #...
+        people = models.Manager()
+
+Using this example model, ``Person.objects`` will generate an
+``AttributeError`` exception, but ``Person.people.all()`` will provide a list
+of all ``Person`` objects.
+
+Custom Managers
+---------------
+
+You can use a custom ``Manager`` in a particular model by extending the base
+``Manager`` class and instantiating your custom ``Manager`` in your model.
+
+There are two reasons you might want to customize a ``Manager``: to add extra
+``Manager`` methods, and/or to modify the initial ``QuerySet`` the ``Manager``
+returns.
+
+Adding extra Manager methods
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Adding extra ``Manager`` methods is the preferred way to add "table-level"
+functionality to your models. (For "row-level" functionality -- i.e., functions
+that act on a single instance of a model object -- use _`Model methods`, not
+custom ``Manager`` methods.)
+
+A custom ``Manager`` method can return anything you want. It doesn't have to
+return a ``QuerySet``.
+
+For example, this custom ``Manager`` offers a method ``with_counts()``, which
+returns a list of all ``OpinionPoll`` objects, each with an extra
+``num_responses`` attribute that is the result of an aggregate query::
+
+    class PollManager(models.Manager):
+        def with_counts(self):
+            from django.db import connection
+            cursor = connection.cursor()
+            cursor.execute("""
+                SELECT p.id, p.question, p.poll_date, COUNT(*)
+                FROM polls_opinionpoll p, polls_response r
+                WHERE p.id = r.poll_id
+                GROUP BY 1, 2, 3
+                ORDER BY 3 DESC""")
+            result_list = []
+            for row in cursor.fetchall():
+                p = self.model(id=row[0], question=row[1], poll_date=row[2])
+                p.num_responses = row[3]
+                result_list.append(p)
+            return result_list
+
+    class OpinionPoll(models.Model):
+        question = models.CharField(maxlength=200)
+        poll_date = models.DateField()
+        objects = PollManager()
+
+    class Response(models.Model):
+        poll = models.ForeignKey(Poll)
+        person_name = models.CharField(maxlength=50)
+        response = models.TextField()
+
+With this example, you'd use ``OpinionPoll.objects.with_counts()`` to return
+that list of ``OpinionPoll`` objects with ``num_responses`` attributes.
+
+Another thing to note about this example is that ``Manager`` methods can
+access ``self.model`` to get the model class to which they're attached.
+
+Modifying initial Manager QuerySets
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+A ``Manager``'s base ``QuerySet`` returns all objects in the system. For
+example, using this model::
+
+    class Book(models.Model):
+        title = models.CharField(maxlength=100)
+        author = models.CharField(maxlength=50)
+
+...the statement ``Book.objects.all()`` will return all books in the database.
+
+You can override a ``Manager``\'s base ``QuerySet`` by overriding the
+``Manager.get_query_set()`` method. ``get_query_set()`` should return a
+``QuerySet`` with the properties you require.
+
+For example, the following model has *two* ``Manager``\s -- one that returns
+all objects, and one that returns only the books by Roald Dahl::
+
+    # First, define the Manager subclass.
+    class DahlBookManager(models.Manager):
+        def get_query_set(self):
+            return super(DahlBookManager, self).get_query_set().filter(author='Roald Dahl')
+
+    # Then hook it into the Book model explicitly.
+    class Book(models.Model):
+        title = models.CharField(maxlength=100)
+        author = models.CharField(maxlength=50)
+
+        objects = models.Manager() # The default manager.
+        dahl_objects = DahlBookManager() # The Dahl-specific manager.
+
+With this sample model, ``Book.objects.all()`` will return all books in the
+database, but ``Book.dahl_objects.all()`` will only return the ones written by
+Roald Dahl.
+
+Of course, because ``get_query_set()`` returns a ``QuerySet`` object, you can
+use ``filter()``, ``exclude()`` and all the other ``QuerySet`` methods on it.
+So these statements are all legal::
+
+    Book.dahl_objects.all()
+    Book.dahl_objects.filter(title='Matilda')
+    Book.dahl_objects.count()
+
+This example also pointed out another interesting technique: using multiple
+managers on the same model. You can attach as many ``Manager()`` instances to
+a model as you'd like. This is an easy way to define common "filters" for your
+models.
+
+For example::
+
+    class MaleManager(models.Manager):
+        def get_query_set(self):
+            return super(MaleManager, self).get_query_set().filter(sex='M')
+
+    class FemaleManager(models.Manager):
+        def get_query_set(self):
+            return super(FemaleManager, self).get_query_set().filter(sex='F')
+
+    class Person(models.Model):
+        first_name = models.CharField(maxlength=50)
+        last_name = models.CharField(maxlength=50)
+        sex = models.CharField(maxlength=1, choices=(('M', 'Male'), ('F', 'Female')))
+        people = models.Manager()
+        men = MaleManager()
+        women = FemaleManager()
+
+This example allows you to request ``Person.men.all()``, ``Person.women.all()``,
+and ``Person.people.all()``, yielding predictable results.
+
+If you use custom ``Manager`` objects, take note that the first ``Manager``
+Django encounters (in order by which they're defined in the model) has a
+special status. Django interprets the first ``Manager`` defined in a class as
+the "default" ``Manager``. Certain operations -- such as Django's admin site --
+use the default ``Manager`` to obtain lists of objects, so it's generally a
+good idea for the first ``Manager`` to be relatively unfiltered. In the last
+example, the ``people`` ``Manager`` is defined first -- so it's the default
+``Manager``.
+
+Model methods
+=============
+
+Define custom methods on a model to add custom "row-level" functionality to
+your objects. Whereas ``Manager`` methods are intended to do "table-wide"
+things, model methods should act on a particular model instance.
+
+This is a valuable technique for keeping business logic in one place -- the
+model.
+
+For example, this model has a few custom methods::
+
+    class Person(models.Model):
+        first_name = models.CharField(maxlength=50)
+        last_name = models.CharField(maxlength=50)
+        birth_date = models.DateField()
+        address = models.CharField(maxlength=100)
+        city = models.CharField(maxlength=50)
+        state = models.USStateField() # Yes, this is America-centric...
+
+        def baby_boomer_status(self):
+            "Returns the person's baby-boomer status."
+            import datetime
+            if datetime.date(1945, 8, 1) <= self.birth_date <= datetime.date(1964, 12, 31):
+                return "Baby boomer"
+            if self.birth_date < datetime.date(1945, 8, 1):
+                return "Pre-boomer"
+            return "Post-boomer"
+
+        def is_midwestern(self):
+            "Returns True if this person is from the Midwest."
+            return self.state in ('IL', 'WI', 'MI', 'IN', 'OH', 'IA', 'MO')
+
+        def _get_full_name(self):
+            "Returns the person's full name."
+            return '%s %s' % (self.first_name, self.last_name)
+        full_name = property(_get_full_name)
+
+The last method in this example is a *property*. `Read more about properties`_.
+
+.. _Read more about properties: http://www.python.org/download/releases/2.2/descrintro/#property
+
+A few object methods have special meaning:
+
+``__str__``
+-----------
+
+``__str__()`` is a Python "magic method" that defines what should be returned
+if you call ``str()`` on the object. Django uses ``str(obj)`` in a number of
+places, most notably as the value displayed to render an object in the Django
+admin site and as the value inserted into a template when it displays an
+object. Thus, you should always return a nice, human-readable string for the
+object's ``__str__``. Although this isn't required, it's strongly encouraged.
+
+For example::
+
+    class Person(models.Model):
+        first_name = models.CharField(maxlength=50)
+        last_name = models.CharField(maxlength=50)
+
+        def __str__(self):
+            return '%s %s' % (self.first_name, self.last_name)
+
+``get_absolute_url``
+--------------------
+
+Define a ``get_absolute_url()`` method to tell Django how to calculate the
+URL for an object. For example::
+
+    def get_absolute_url(self):
+        return "/people/%i/" % self.id
+
+Django uses this in its admin interface. If an object defines
+``get_absolute_url()``, the object-editing page will have a "View on site"
+link that will jump you directly to the object's public view, according to
+``get_absolute_url()``.
+
+Also, a couple of other bits of Django, such as the syndication-feed framework,
+use ``get_absolute_url()`` as a convenience to reward people who've defined the
+method.
+
+It's good practice to use ``get_absolute_url()`` in templates, instead of
+hard-coding your objects' URLs. For example, this template code is bad::
+
+    <a href="/people/{{ object.id }}/">{{ object.name }}</a>
+
+But this template code is good::
+
+    <a href="{{ object.get_absolute_url }}">{{ object.name }}</a>
+
+(Yes, we know ``get_absolute_url()`` couples URLs to models, which violates the
+DRY principle, because URLs are defined both in a URLconf and in the model.
+This is a rare case in which we've intentionally violated that principle for
+the sake of convenience. With that said, we're working on an even cleaner way
+of specifying URLs in a more DRY fashion.)
+
+Executing custom SQL
+--------------------
+
+Feel free to write custom SQL statements in custom model methods and
+module-level methods. The object ``django.db.connection`` represents the
+current database connection. To use it, call ``connection.cursor()`` to get a
+cursor object. Then, call ``cursor.execute(sql, [params])`` to execute the SQL
+and ``cursor.fetchone()`` or ``cursor.fetchall()`` to return the resulting
+rows. Example::
+
+    def my_custom_sql(self):
+        from django.db import connection
+        cursor = connection.cursor()
+        cursor.execute("SELECT foo FROM bar WHERE baz = %s", [self.baz])
+        row = cursor.fetchone()
+        return row
+
+``connection`` and ``cursor`` simply use the standard `Python DB-API`_. If
+you're not familiar with the Python DB-API, note that the SQL statement in
+``cursor.execute()`` uses placeholders, ``"%s"``, rather than adding parameters
+directly within the SQL. If you use this technique, the underlying database
+library will automatically add quotes and escaping to your parameter(s) as
+necessary. (Also note that Django expects the ``"%s"`` placeholder, *not* the
+``"?"`` placeholder, which is used by the SQLite Python bindings. This is for
+the sake of consistency and sanity.)
+
+A final note: If all you want to do is a custom ``WHERE`` clause, you can just
+just the ``where``, ``tables`` and ``params`` arguments to the standard lookup
+API. See `Other lookup options`_.
+
+.. _Python DB-API: http://www.python.org/peps/pep-0249.html
+.. _Other lookup options: http://www.djangoproject.com/documentation/db_api/#extra-params-select-where-tables
+
+Overriding default model methods
+--------------------------------
+
+As explained in the `database API docs`_, each model gets a few methods
+automatically -- most notably, ``save()`` and ``delete()``. You can override
+these methods to alter behavior.
+
+A classic use-case for overriding the built-in methods is if you want something
+to happen whenever you save an object. For example::
+
+    class Blog(models.Model):
+        name = models.CharField(maxlength=100)
+        tagline = models.TextField()
+
+        def save(self):
+            do_something()
+            super(Blog, self).save() # Call the "real" save() method.
+            do_something_else()
+
+You can also prevent saving::
+
+    class Blog(models.Model):
+        name = models.CharField(maxlength=100)
+        tagline = models.TextField()
+
+        def save(self):
+            if self.name == "Yoko Ono's blog":
+                return # Yoko shall never have her own blog!
+            else:
+                super(Blog, self).save() # Call the "real" save() method.
+
+.. _database API docs: http://www.djangoproject.com/documentation/db_api/
+
+Models across files
+===================
+
+It's perfectly OK to relate a model to one from another app. To do this, just
+import the related model at the top of the model that holds your model. Then,
+just refer to the other model class wherever needed. For example::
+
+    from mysite.geography.models import ZipCode
+
+    class Restaurant(models.Model):
+        # ...
+        zip_code = models.ForeignKey(ZipCode)
+
+Using models
+============
+
+Once you have created your models, the final step is to tell Django you're
+going to *use* those models.
+
+Do this by editing your settings file and changing the ``INSTALLED_APPS``
+setting to add the name of the module that contains your ``models.py``.
+
+For example, if the models for your application live in the module
+``mysite.myapp.models`` (the package structure that is created for an
+application by the ``manage.py startapp`` script), ``INSTALLED_APPS`` should
+read, in part::
+
+    INSTALLED_APPS = (
+        #...
+        'mysite.myapp',
+        #...
+    )
+
+Providing initial SQL data
+==========================
+
+Django provides a hook for passing the database arbitrary SQL that's executed
+just after the CREATE TABLE statements. Use this hook, for example, if you want
+to populate default records, or create SQL functions, automatically.
+
+The hook is simple: Django just looks for a file called
+``<appname>/sql/<modelname>.sql``, where ``<appname>`` is your app directory and
+``<modelname>`` is the model's name in lowercase.
+
+In the ``Person`` example model at the top of this document, assuming it lives
+in an app called ``myapp``, you could add arbitrary SQL to the file
+``myapp/sql/person.sql``. Here's an example of what the file might contain::
+
+    INSERT INTO myapp_person (first_name, last_name) VALUES ('John', 'Lennon');
+    INSERT INTO myapp_person (first_name, last_name) VALUES ('Paul', 'McCartney');
+
+Each SQL file, if given, is expected to contain valid SQL. The SQL files are
+piped directly into the database after all of the models' table-creation
+statements have been executed.
+
+The SQL files are read by the ``sqlinitialdata``, ``sqlreset``, ``sqlall`` and
+``reset`` commands in ``manage.py``. Refer to the `manage.py documentation`_
+for more information.
+
+Note that if you have multiple SQL data files, there's no guarantee of the
+order in which they're executed. The only thing you can assume is that, by the
+time your custom data files are executed, all the database tables already will
+have been created.
+
+.. _`manage.py documentation`: http://www.djangoproject.com/documentation/django_admin/#sqlinitialdata-appname-appname
+
+Database-backend-specific SQL data
+----------------------------------
+
+There's also a hook for backend-specific SQL data. For example, you can have
+separate initial-data files for PostgreSQL and MySQL. For each app, Django
+looks for a file called ``<appname>/sql/<modelname>.<backend>.sql``, where
+``<appname>`` is your app directory, ``<modelname>`` is the model's name in
+lowercase and ``<backend>`` is the value of ``DATABASE_ENGINE`` in your
+settings file (e.g., ``postgresql``, ``mysql``).
+
+Backend-specific SQL data is executed before non-backend-specific SQL data. For
+example, if your app contains the files ``sql/person.sql`` and
+``sql/person.postgresql.sql`` and you're installing the app on PostgreSQL,
+Django will execute the contents of ``sql/person.postgresql.sql`` first, then
+``sql/person.sql``.

Added: vendor/django/current/docs/modpython.txt
===================================================================
--- vendor/django/current/docs/modpython.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/modpython.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,239 @@
+=================================
+How to use Django with mod_python
+=================================
+
+Apache_ with `mod_python`_ currently is the preferred setup for using Django
+on a production server.
+
+mod_python is similar to `mod_perl`_ : It embeds Python within Apache and loads
+Python code into memory when the server starts. Code stays in memory throughout
+the life of an Apache process, which leads to significant performance gains over
+other server arrangements.
+
+Django requires Apache 2.x and mod_python 3.x, and you should use Apache's
+`prefork MPM`_, as opposed to the `worker MPM`_.
+
+You may also be interested in `How to use Django with FastCGI`_.
+
+.. _Apache: http://httpd.apache.org/
+.. _mod_python: http://www.modpython.org/
+.. _mod_perl: http://perl.apache.org/
+.. _prefork MPM: http://httpd.apache.org/docs/2.2/mod/prefork.html
+.. _worker MPM: http://httpd.apache.org/docs/2.2/mod/worker.html
+.. _How to use Django with FastCGI: http://www.djangoproject.com/documentation/fastcgi/
+
+Basic configuration
+===================
+
+To configure Django with mod_python, first make sure you have Apache installed,
+with the mod_python module activated.
+
+Then edit your ``httpd.conf`` file and add the following::
+
+    <Location "/mysite/">
+        SetHandler python-program
+        PythonHandler django.core.handlers.modpython
+        SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+        PythonDebug On
+    </Location>
+
+...and replace ``mysite.settings`` with the Python path to your settings file.
+
+This tells Apache: "Use mod_python for any URL at or under '/mysite/', using the
+Django mod_python handler." It passes the value of ``DJANGO_SETTINGS_MODULE``
+so mod_python knows which settings to use.
+
+Also, if you've manually altered your ``PYTHONPATH`` to put your Django project
+on it, you'll need to tell mod_python::
+
+    PythonPath "['/path/to/project'] + sys.path"
+
+You can also add directives such as ``PythonAutoReload Off`` for performance.
+See the `mod_python documentation`_ for a full list of options.
+
+Note that you should set ``PythonDebug Off`` on a production server. If you
+leave ``PythonDebug On``, your users would see ugly (and revealing) Python
+tracebacks if something goes wrong within mod_python.
+
+Restart Apache, and any request to /mysite/ or below will be served by Django.
+Note that Django's URLconfs won't trim the "/mysite/" -- they get passed the
+full URL.
+
+When deploying Django sites on mod_python, you'll need to restart Apache each
+time you make changes to your Python code.
+
+Multiple Django installations on the same Apache
+================================================
+
+It's entirely possible to run multiple Django installations on the same Apache
+instance. Just use ``VirtualHost`` for that, like so::
+
+    NameVirtualHost *
+
+    <VirtualHost *>
+        ServerName www.example.com
+        # ...
+        SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+    </VirtualHost>
+
+    <VirtualHost *>
+        ServerName www2.example.com
+        # ...
+        SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings
+    </VirtualHost>
+
+If you need to put two Django installations within the same ``VirtualHost``,
+you'll need to take a special precaution to ensure mod_python's cache doesn't
+mess things up. Use the ``PythonInterpreter`` directive to give different
+``<Location>`` directives separate interpreters::
+
+    <VirtualHost *>
+        ServerName www.example.com
+        # ...
+        <Location "/something">
+            SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+            PythonInterpreter mysite
+        </Location>
+
+        <Location "/otherthing">
+            SetEnv DJANGO_SETTINGS_MODULE mysite.other_settings
+            PythonInterpreter mysite_other
+        </Location>
+    </VirtualHost>
+
+The values of ``PythonInterpreter`` don't really matter, as long as they're
+different between the two ``Location`` blocks.
+
+Running a development server with mod_python
+============================================
+
+If you use mod_python for your development server, you can avoid the hassle of
+having to restart the server each time you make code changes. Just set
+``MaxRequestsPerChild 1`` in your ``httpd.conf`` file to force Apache to reload
+everything for each request. But don't do that on a production server, or we'll
+revoke your Django privileges.
+
+If you're the type of programmer who debugs using scattered ``print``
+statements, note that ``print`` statements have no effect in mod_python; they
+don't appear in the Apache log, as one might expect. If you have the need to
+print debugging information in a mod_python setup, either do this::
+
+    assert False, the_value_i_want_to_see
+
+Or add the debugging information to the template of your page.
+
+.. _mod_python documentation: http://modpython.org/live/current/doc-html/directives.html
+
+Serving media files
+===================
+
+Django doesn't serve media files itself; it leaves that job to whichever Web
+server you choose.
+
+We recommend using a separate Web server -- i.e., one that's not also running
+Django -- for serving media. Here are some good choices:
+
+* lighttpd_
+* TUX_
+* A stripped-down version of Apache_
+
+If, however, you have no option but to serve media files on the same Apache
+``VirtualHost`` as Django, here's how you can turn off mod_python for a
+particular part of the site::
+
+    <Location "/media/">
+        SetHandler None
+    </Location>
+
+Just change ``Location`` to the root URL of your media files. You can also use
+``<LocationMatch>`` to match a regular expression.
+
+This example sets up Django at the site root but explicitly disables Django for
+the ``media`` subdirectory and any URL that ends with ``.jpg``, ``.gif`` or
+``.png``::
+
+    <Location "/">
+        SetHandler python-program
+        PythonHandler django.core.handlers.modpython
+        SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+    </Location>
+
+    <Location "media">
+        SetHandler None
+    </Location>
+
+    <LocationMatch "\.(jpg|gif|png)$">
+        SetHandler None
+    </LocationMatch>
+
+
+.. _lighttpd: http://www.lighttpd.net/
+.. _TUX: http://en.wikipedia.org/wiki/TUX_web_server
+.. _Apache: http://httpd.apache.org/
+
+Serving the admin files
+=======================
+
+Note that the Django development server automagically serves admin media files,
+but this is not the case when you use any other server arrangement. You're
+responsible for setting up Apache, or whichever media server you're using, to
+serve the admin files.
+
+The admin files live in (``django/contrib/admin/media``) of the Django
+distribution.
+
+Here are two recommended approaches:
+
+    1. Create a symbolic link to the admin media files from within your
+       document root. This way, all of your Django-related files -- code
+       **and** templates -- stay in one place, and you'll still be able to
+       ``svn update`` your code to get the latest admin templates, if they
+       change.
+    2. Or, copy the admin media files so that they live within your Apache
+       document root.
+
+Error handling
+==============
+
+When you use Apache/mod_python, errors will be caught by Django -- in other
+words, they won't propagate to the Apache level and won't appear in the Apache
+``error_log``.
+
+The exception for this is if something is really wonky in your Django setup. In
+that case, you'll see an "Internal Server Error" page in your browser and the
+full Python traceback in your Apache ``error_log`` file. The ``error_log``
+traceback is spread over multiple lines. (Yes, this is ugly and rather hard to
+read, but it's how mod_python does things.)
+
+If you get a segmentation fault
+===============================
+
+If Apache causes a segmentation fault, there are two probable causes, neither
+of which has to do with Django itself.
+
+    1. It may be because your Python code is importing the "pyexpat" module,
+       which may conflict with the version embedded in Apache. For full
+       information, see `Expat Causing Apache Crash`_.
+    2. It may be because you're running mod_python and mod_php in the same
+       Apache instance, with MySQL as your database backend. In some cases,
+       this causes a known mod_python issue due to version conflicts in PHP and
+       the Python MySQL backend. There's full information in the
+       `mod_python FAQ entry`_.
+
+If you continue to have problems setting up mod_python, a good thing to do is
+get a barebones mod_python site working, without the Django framework. This is
+an easy way to isolate mod_python-specific problems. `Getting mod_python Working`_
+details this procedure.
+
+The next step should be to edit your test code and add an import of any
+Django-specific code you're using -- your views, your models, your URLconf,
+your RSS configuration, etc. Put these imports in your test handler function
+and access your test URL in a browser. If this causes a crash, you've confirmed
+it's the importing of Django code that causes the problem. Gradually reduce the
+set of imports until it stops crashing, so as to find the specific module that
+causes the problem. Drop down further into modules and look into their imports,
+as necessary.
+
+.. _Expat Causing Apache Crash: http://www.dscpl.com.au/articles/modpython-006.html
+.. _mod_python FAQ entry: http://modpython.org/FAQ/faqw.py?req=show&file=faq02.013.htp
+.. _Getting mod_python Working: http://www.dscpl.com.au/articles/modpython-001.html

Added: vendor/django/current/docs/outputting_csv.txt
===================================================================
--- vendor/django/current/docs/outputting_csv.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/outputting_csv.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,119 @@
+==========================
+Outputting CSV with Django
+==========================
+
+This document explains how to output CSV (Comma Separated Values) dynamically
+using Django views.
+
+To do this, you can either use the `Python CSV library`_ or the Django template
+system.
+
+.. _Python CSV library: http://www.python.org/doc/current/lib/module-csv.html
+
+Using the Python CSV library
+============================
+
+Python comes with a CSV library, ``csv``. The key to using it with Django is
+that the ``csv`` module's CSV-creation capability acts on file-like objects,
+and Django's ``HttpResponse`` objects are file-like objects.
+
+.. admonition:: Note
+
+    For more information on ``HttpResponse`` objects, see
+    `Request and response objects`_.
+
+    For more information on the CSV library, see the `CSV library docs`_.
+
+    .. _Request and response objects: http://www.djangoproject.com/documentation/request_response/
+    .. _CSV library docs: http://www.python.org/doc/current/lib/module-csv.html
+
+Here's an example::
+
+    import csv
+    from django.http import HttpResponse
+
+    def some_view(request):
+        # Create the HttpResponse object with the appropriate CSV header.
+        response = HttpResponse(mimetype='text/csv')
+        response['Content-Disposition'] = 'attachment; filename=somefilename.csv'
+
+        writer = csv.writer(response)
+        writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
+        writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])
+
+        return response
+
+The code and comments should be self-explanatory, but a few things deserve a
+mention:
+
+    * The response gets a special mimetype, ``text/csv``. This tells
+      browsers that the document is a CSV file, rather than an HTML file. If
+      you leave this off, browsers will probably interpret the output as HTML,
+      which will result in ugly, scary gobbledygook in the browser window.
+
+    * The response gets an additional ``Content-Disposition`` header, which
+      contains the name of the CSV file. This filename is arbitrary; call it
+      whatever you want. It'll be used by browsers in the "Save as..."
+      dialogue, etc.
+
+    * Hooking into the CSV-generation API is easy: Just pass ``response`` as
+      the first argument to ``csv.writer``. The ``csv.writer`` function expects
+      a file-like object, and ``HttpResponse`` objects fit the bill.
+
+    * For each row in your CSV file, call ``writer.writerow``, passing it an
+      iterable object such as a list or tuple.
+
+    * The CSV module takes care of quoting for you, so you don't have to worry
+      about escaping strings with quotes or commas in them. Just pass
+      ``writerow()`` your raw strings, and it'll do the right thing.
+
+Using the template system
+=========================
+
+Alternatively, you can use the `Django template system`_ to generate CSV. This
+is lower-level than using the convenient CSV, but the solution is presented
+here for completeness.
+
+The idea here is to pass a list of items to your template, and have the
+template output the commas in a ``{% for %}`` loop.
+
+Here's an example, which generates the same CSV file as above::
+
+    from django.http import HttpResponse
+    from django.template import loader, Context
+
+    def some_view(request):
+        # Create the HttpResponse object with the appropriate CSV header.
+        response = HttpResponse(mimetype='text/csv')
+        response['Content-Disposition'] = 'attachment; filename=somefilename.csv'
+
+        # The data is hard-coded here, but you could load it from a database or
+        # some other source.
+        csv_data = (
+            ('First row', 'Foo', 'Bar', 'Baz'),
+            ('Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"),
+        )
+
+        t = loader.get_template('my_template_name.txt')
+        c = Context({
+            'data': csv_data,
+        })
+        response.write(t.render(c))
+        return response
+
+The only difference between this example and the previous example is that this
+one uses template loading instead of the CSV module. The rest of the code --
+such as the ``mimetype='text/csv'`` -- is the same.
+
+Then, create the template ``my_template_name.txt``, with this template code::
+
+    {% for row in data %}"{{ row.0|addslashes }}", "{{ row.1|addslashes }}", "{{ row.2|addslashes }}", "{{ row.3|addslashes }}", "{{ row.4|addslashes }}"
+    {% endfor %}
+
+This template is quite basic. It just iterates over the given data and displays
+a line of CSV for each row. It uses the `addslashes template filter`_ to ensure
+there aren't any problems with quotes. If you can be certain your data doesn't
+have single or double quotes in it, you can remove the ``addslashes`` filters.
+
+.. _Django template system: http://www.djangoproject.com/documentation/templates/
+.. _addslashes template filter: http://www.djangoproject.com/documentation/templates/#addslashes

Added: vendor/django/current/docs/outputting_pdf.txt
===================================================================
--- vendor/django/current/docs/outputting_pdf.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/outputting_pdf.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,153 @@
+===========================
+Outputting PDFs with Django
+===========================
+
+This document explains how to output PDF files dynamically using Django views.
+This is made possible by the excellent, open-source ReportLab_ Python PDF
+library.
+
+The advantage of generating PDF files dynamically is that you can create
+customized PDFs for different purposes -- say, for different users or different
+pieces of content.
+
+For example, Django was used at kusports.com_ to generate customized,
+printer-friendly NCAA tournament brackets, as PDF files, for people
+participating in a March Madness contest.
+
+.. _ReportLab: http://www.reportlab.org/rl_toolkit.html
+.. _kusports.com: http://www.kusports.com/
+
+Install ReportLab
+=================
+
+Download and install the ReportLab library from http://www.reportlab.org/downloads.html.
+The `user guide`_ (not coincidentally, a PDF file) explains how to install it.
+
+Test your installation by importing it in the Python interactive interpreter::
+
+    >>> import reportlab
+
+If that command doesn't raise any errors, the installation worked.
+
+.. _user guide: http://www.reportlab.org/rsrc/userguide.pdf
+
+Write your view
+===============
+
+The key to generating PDFs dynamically with Django is that the ReportLab API
+acts on file-like objects, and Django's ``HttpResponse`` objects are file-like
+objects.
+
+.. admonition:: Note
+
+    For more information on ``HttpResponse`` objects, see
+    `Request and response objects`_.
+
+    .. _Request and response objects: http://www.djangoproject.com/documentation/request_response/
+
+Here's a "Hello World" example::
+
+    from reportlab.pdfgen import canvas
+    from django.http import HttpResponse
+
+    def some_view(request):
+        # Create the HttpResponse object with the appropriate PDF headers.
+        response = HttpResponse(mimetype='application/pdf')
+        response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
+
+        # Create the PDF object, using the response object as its "file."
+        p = canvas.Canvas(response)
+
+        # Draw things on the PDF. Here's where the PDF generation happens.
+        # See the ReportLab documentation for the full list of functionality.
+        p.drawString(100, 100, "Hello world.")
+
+        # Close the PDF object cleanly, and we're done.
+        p.showPage()
+        p.save()
+        return response
+
+The code and comments should be self-explanatory, but a few things deserve a
+mention:
+
+    * The response gets a special mimetype, ``application/pdf``. This tells
+      browsers that the document is a PDF file, rather than an HTML file. If
+      you leave this off, browsers will probably interpret the output as HTML,
+      which would result in ugly, scary gobbledygook in the browser window.
+
+    * The response gets an additional ``Content-Disposition`` header, which
+      contains the name of the PDF file. This filename is arbitrary: Call it
+      whatever you want. It'll be used by browsers in the "Save as..."
+      dialogue, etc.
+
+    * The ``Content-Disposition`` header starts with ``'attachment; '`` in this
+      example. This forces Web browsers to pop-up a dialog box
+      prompting/confirming how to handle the document even if a default is set
+      on the machine. If you leave off ``'attachment;'``, browsers will handle
+      the PDF using whatever program/plugin they've been configured to use for
+      PDFs. Here's what that code would look like::
+
+          response['Content-Disposition'] = 'filename=somefilename.pdf'
+
+    * Hooking into the ReportLab API is easy: Just pass ``response`` as the
+      first argument to ``canvas.Canvas``. The ``Canvas`` class expects a
+      file-like object, and ``HttpResponse`` objects fit the bill.
+
+    * Note that all subsequent PDF-generation methods are called on the PDF
+      object (in this case, ``p``) -- not on ``response``.
+
+    * Finally, it's important to call ``showPage()`` and ``save()`` on the PDF
+      file.
+
+Complex PDFs
+============
+
+If you're creating a complex PDF document with ReportLab, consider using the
+cStringIO_ library as a temporary holding place for your PDF file. The
+cStringIO library provides a file-like object interface that is particularly
+efficient. Here's the above "Hello World" example rewritten to use
+``cStringIO``::
+
+    from cStringIO import StringIO
+    from reportlab.pdfgen import canvas
+    from django.http import HttpResponse
+
+    def some_view(request):
+        # Create the HttpResponse object with the appropriate PDF headers.
+        response = HttpResponse(mimetype='application/pdf')
+        response['Content-Disposition'] = 'attachment; filename=somefilename.pdf'
+
+        buffer = StringIO()
+
+        # Create the PDF object, using the StringIO object as its "file."
+        p = canvas.Canvas(buffer)
+
+        # Draw things on the PDF. Here's where the PDF generation happens.
+        # See the ReportLab documentation for the full list of functionality.
+        p.drawString(100, 100, "Hello world.")
+
+        # Close the PDF object cleanly.
+        p.showPage()
+        p.save()
+
+        # Get the value of the StringIO buffer and write it to the response.
+        pdf = buffer.getvalue()
+        buffer.close()
+        response.write(pdf)
+        return response
+
+.. _cStringIO: http://www.python.org/doc/current/lib/module-cStringIO.html
+
+Further resources
+=================
+
+    * PDFlib_ is another PDF-generation library that has Python bindings. To
+      use it with Django, just use the same concepts explained in this article.
+    * HTMLdoc_ is a command-line script that can convert HTML to PDF. It
+      doesn't have a Python interface, but you can escape out to the shell
+      using ``system`` or ``popen`` and retrieve the output in Python.
+    * `forge_fdf in Python`_ is a library that fills in PDF forms.
+
+.. _PDFlib: http://www.pdflib.org/
+.. _HTMLdoc: http://www.htmldoc.org/
+.. _forge_fdf in Python: http://www.accesspdf.com/article.php/20050421092951834

Added: vendor/django/current/docs/overview.txt
===================================================================
--- vendor/django/current/docs/overview.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/overview.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,301 @@
+==================
+Django at a glance
+==================
+
+Because Django was developed in a fast-paced newsroom environment, it was
+designed to make common Web-development tasks fast and easy. Here's an informal
+overview of how to write a database-driven Web app with Django.
+
+The goal of this document is to give you enough technical specifics to
+understand how Django works, but this isn't intended to be a tutorial or
+reference. Please see our more-detailed Django documentation_ when you're ready
+to start a project.
+
+.. _documentation: http://www.djangoproject.com/documentation/
+
+Design your model
+=================
+
+Although you can use Django without a database, it comes with an
+object-relational mapper in which you describe your database layout in Python
+code.
+
+The data-model syntax offers many rich ways of representing your models -- so
+far, it's been solving two years' worth of database-schema problems. Here's a
+quick example::
+
+    class Reporter(models.Model):
+        full_name = models.CharField(maxlength=70)
+
+        def __str__(self):
+            return self.full_name
+
+    class Article(models.Model):
+        pub_date = models.DateTimeField()
+        headline = models.CharField(maxlength=200)
+        article = models.TextField()
+        reporter = models.ForeignKey(Reporter)
+
+        def __str__(self):
+            return self.headline
+
+Install it
+==========
+
+Next, run the Django command-line utility to create the database tables
+automatically::
+
+    manage.py syncdb
+
+The ``syncdb`` command looks at all your available models and creates tables
+in your database for whichever tables don't already exist.
+
+Enjoy the free API
+==================
+
+With that, you've got a free, and rich, Python API to access your data. The API
+is created on the fly: No code generation necessary::
+
+    >>> from mysite.models import Reporter, Article
+
+    # No reporters are in the system yet.
+    >>> Reporter.objects.all()
+    []
+
+    # Create a new Reporter.
+    >>> r = Reporter(full_name='John Smith')
+
+    # Save the object into the database. You have to call save() explicitly.
+    >>> r.save()
+
+    # Now it has an ID.
+    >>> r.id
+    1
+
+    # Now the new reporter is in the database.
+    >>> Reporter.objects.all()
+    [John Smith]
+
+    # Fields are represented as attributes on the Python object.
+    >>> r.full_name
+    'John Smith'
+
+    # Django provides a rich database lookup API.
+    >>> Reporter.objects.get(id=1)
+    John Smith
+    >>> Reporter.objects.get(full_name__startswith='John')
+    John Smith
+    >>> Reporter.objects.get(full_name__contains='mith')
+    John Smith
+    >>> Reporter.objects.get(id=2)
+    Traceback (most recent call last):
+        ...
+    DoesNotExist: Reporter does not exist for {'id__exact': 2}
+
+    # Create an article.
+    >>> from datetime import datetime
+    >>> a = Article(pub_date=datetime.now(), headline='Django is cool',
+    ...     article='Yeah.', reporter=r)
+    >>> a.save()
+
+    # Now the article is in the database.
+    >>> Article.objects.all()
+    [Django is cool]
+
+    # Article objects get API access to related Reporter objects.
+    >>> r = a.reporter
+    >>> r.full_name
+    'John Smith'
+
+    # And vice versa: Reporter objects get API access to Article objects.
+    >>> r.article_set.all()
+    [Django is cool]
+
+    # The API follows relationships as far as you need, performing efficient
+    # JOINs for you behind the scenes.
+    # This finds all articles by a reporter whose name starts with "John".
+    >>> Article.objects.filter(reporter__full_name__startswith="John")
+    [Django is cool]
+
+    # Change an object by altering its attributes and calling save().
+    >>> r.full_name = 'Billy Goat'
+    >>> r.save()
+
+    # Delete an object with delete().
+    >>> r.delete()
+
+A dynamic admin interface: It's not just scaffolding -- it's the whole house
+============================================================================
+
+Once your models are defined, Django can automatically create a professional,
+production ready administrative interface -- a Web site that lets authenticated
+users add, change and delete objects. It's as easy as adding a line of code to
+your model classes::
+
+    class Article(models.Model):
+        pub_date = models.DateTimeField()
+        headline = models.CharField(maxlength=200)
+        article = models.TextField()
+        reporter = models.ForeignKey(Reporter)
+        class Admin: pass
+
+The philosophy here is that your site is edited by a staff, or a client, or
+maybe just you -- and you don't want to have to deal with creating backend
+interfaces just to manage content.
+
+One typical workflow in creating Django apps is to create models and get the
+admin sites up and running as fast as possible, so your staff (or clients) can
+start populating data. Then, develop the way data is presented to the public.
+
+Design your URLs
+================
+
+A clean, elegant URL scheme is an important detail in a high-quality Web
+application. Django encourages beautiful URL design and doesn't put any cruft
+in URLs, like ``.php`` or ``.asp``.
+
+To design URLs for an app, you create a Python module called a URLconf. A table
+of contents for your app, it contains a simple mapping between URL patterns and
+Python callback functions. URLconfs also serve to decouple URLs from Python
+code.
+
+Here's what a URLconf might look like for the above ``Reporter``/``Article``
+example above::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('',
+        (r'^/articles/(\d{4})/$', 'mysite.views.year_archive'),
+        (r'^/articles/(\d{4})/(\d{2})/$', 'mysite.views.month_archive'),
+        (r'^/articles/(\d{4})/(\d{2})/(\d+)/$', 'mysite.views.article_detail'),
+    )
+
+The code above maps URLs, as simple regular expressions, to the location of
+Python callback functions ("views"). The regular expressions use parenthesis to
+"capture" values from the URLs. When a user requests a page, Django runs
+through each pattern, in order, and stops at the first one that matches the
+requested URL. (If none of them matches, Django calls a special-case 404 view.)
+This is blazingly fast, because the regular expressions are compiled at load
+time.
+
+Once one of the regexes matches, Django imports and calls the given view, which
+is a simple Python function. Each view gets passed a request object --
+which contains request metadata -- and the values captured in the regex.
+
+For example, if a user requested the URL "/articles/2005/05/39323/", Django
+would call the function ``mysite.views.article_detail(request,
+'2005', '05', '39323')``.
+
+Write your views
+================
+
+Each view is responsible for doing one of two things: Returning an
+``HttpResponse`` object containing the content for the requested page, or
+raising an exception such as ``Http404``. The rest is up to you.
+
+Generally, a view retrieves data according to the parameters, loads a template
+and renders the template with the retrieved data. Here's an example view for
+``year_archive`` from above::
+
+    def year_archive(request, year):
+        a_list = Article.objects.filter(pub_date__year=year)
+        return render_to_response('news/year_archive.html', {'year': year, 'article_list': a_list})
+
+This example uses Django's template system, which has several powerful
+features but strives to stay simple enough for non-programmers to use.
+
+Design your templates
+=====================
+
+The code above loads the ``news/year_archive.html`` template.
+
+Django has a template search path, which allows you to minimize redundancy among
+templates. In your Django settings, you specify a list of directories to check
+for templates. If a template doesn't exist in the first directory, it checks the
+second, and so on.
+
+Let's say the ``news/article_detail.html`` template was found. Here's what that
+might look like::
+
+    {% extends "base.html" %}
+
+    {% block title %}Articles for {{ year }}{% endblock %}
+
+    {% block content %}
+    <h1>Articles for {{ year }}</h1>
+
+    {% for article in article_list %}
+    <p>{{ article.headline }}</p>
+    <p>By {{ article.reporter.full_name }}</p>
+    <p>Published {{ article.pub_date|date:"F j, Y" }}</p>
+    {% endfor %}
+    {% endblock %}
+
+Variables are surrounded by double-curly braces. ``{{ article.headline }}``
+means "Output the value of the article's headline attribute." But dots aren't
+used only for attribute lookup: They also can do dictionary-key lookup, index
+lookup and function calls.
+
+Note ``{{ article.pub_date|date:"F j, Y" }}`` uses a Unix-style "pipe" (the "|"
+character). This is called a template filter, and it's a way to filter the value
+of a variable. In this case, the date filter formats a Python datetime object in
+the given format (as found in PHP's date function; yes, there is one good idea
+in PHP).
+
+You can chain together as many filters as you'd like. You can write custom
+filters. You can write custom template tags, which run custom Python code behind
+the scenes.
+
+Finally, Django uses the concept of "template inheritance": That's what the
+``{% extends "base.html" %}`` does. It means "First load the template called
+'base', which has defined a bunch of blocks, and fill the blocks with the
+following blocks." In short, that lets you dramatically cut down on redundancy
+in templates: Each template has to define only what's unique to that template.
+
+Here's what the "base.html" template might look like::
+
+    <html>
+    <head>
+        <title>{% block title %}{% endblock %}</title>
+    </head>
+    <body>
+        <img src="sitelogo.gif" alt="Logo" />
+        {% block content %}{% endblock %}
+    </body>
+    </html>
+
+Simplistically, it defines the look-and-feel of the site (with the site's logo),
+and provides "holes" for child templates to fill. This makes a site redesign as
+easy as changing a single file -- the base template.
+
+It also lets you create multiple versions of a site, with different base
+templates, while reusing child templates. Django's creators have used this
+technique to create strikingly different cell-phone editions of sites -- simply
+by creating a new base template.
+
+Note that you don't have to use Django's template system if you prefer another
+system. While Django's template system is particularly well-integrated with
+Django's model layer, nothing forces you to use it. For that matter, you don't
+have to use Django's database API, either. You can use another database
+abstraction layer, you can read XML files, you can read files off disk, or
+anything you want. Each piece of Django -- models, views, templates -- is
+decoupled from the next.
+
+This is just the surface
+========================
+
+This has been only a quick overview of Django's functionality. Some more useful
+features:
+
+    * A caching framework that integrates with memcached or other backends.
+    * A syndication framework that makes creating RSS and Atom feeds as easy as
+      writing a small Python class.
+    * More sexy automatically-generated admin features -- this overview barely
+      scratched the surface.
+
+The next obvious steps are for you to `download Django`_, read `the tutorial`_
+and join `the community`_. Thanks for your interest!
+
+.. _download Django: http://www.djangoproject.com/download/
+.. _the tutorial: http://www.djangoproject.com/documentation/tutorial1/
+.. _the community: http://www.djangoproject.com/community/

Added: vendor/django/current/docs/redirects.txt
===================================================================
--- vendor/django/current/docs/redirects.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/redirects.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,71 @@
+=================
+The redirects app
+=================
+
+Django comes with an optional redirects application. It lets you store simple
+redirects in a database and handles the redirecting for you.
+
+Installation
+============
+
+To install the redirects app, follow these steps:
+
+    1. Add ``'django.contrib.redirects'`` to your INSTALLED_APPS_ setting.
+    2. Add ``'django.contrib.redirects.middleware.RedirectFallbackMiddleware'``
+       to your MIDDLEWARE_CLASSES_ setting.
+    3. Run the command ``manage.py syncdb``.
+
+.. _INSTALLED_APPS: http://www.djangoproject.com/documentation/settings/#installed-apps
+.. _MIDDLEWARE_CLASSES: http://www.djangoproject.com/documentation/settings/#middleware-classes
+
+How it works
+============
+
+``manage.py syncdb`` creates a ``django_redirect`` table in your database. This
+is a simple lookup table with ``site_id``, ``old_path`` and ``new_path`` fields.
+
+The ``RedirectFallbackMiddleware`` does all of the work. Each time any Django
+application raises a 404 error, this middleware checks the redirects database
+for the requested URL as a last resort. Specifically, it checks for a redirect
+with the given ``old_path`` with a site ID that corresponds to the SITE_ID_
+setting.
+
+    * If it finds a match, and ``new_path`` is not empty, it redirects to
+      ``new_path``.
+    * If it finds a match, and ``new_path`` is empty, it sends a 410 ("Gone")
+      HTTP header and empty (content-less) response.
+    * If it doesn't find a match, the request continues to be processed as
+      usual.
+
+The middleware only gets activated for 404s -- not for 500s or responses of any
+other status code.
+
+Note that the order of ``MIDDLEWARE_CLASSES`` matters. Generally, you can put
+``RedirectFallbackMiddleware`` at the end of the list, because it's a last
+resort.
+
+For more on middleware, read the `middleware docs`_.
+
+.. _SITE_ID: http://www.djangoproject.com/documentation/settings/#site-id
+.. _middleware docs: http://www.djangoproject.com/documentation/middleware/
+
+How to add, change and delete redirects
+=======================================
+
+Via the admin interface
+-----------------------
+
+If you've activated the automatic Django admin interface, you should see a
+"Redirects" section on the admin index page. Edit redirects as you edit any
+other object in the system.
+
+Via the Python API
+------------------
+
+Redirects are represented by a standard `Django model`_, which lives in
+`django/contrib/redirects/models/redirects.py`_. You can access redirect
+objects via the `Django database API`_.
+
+.. _Django model: http://www.djangoproject.com/documentation/model_api/
+.. _django/contrib/redirects/models/redirects.py: http://code.djangoproject.com/browser/django/trunk/django/contrib/redirects/models/redirects.py
+.. _Django database API: http://www.djangoproject.com/documentation/db_api/

Added: vendor/django/current/docs/release_notes_0.95.txt
===================================================================
--- vendor/django/current/docs/release_notes_0.95.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/release_notes_0.95.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,143 @@
+===================================
+Django version 0.95.1 release notes
+===================================
+
+
+Welcome to the Django 0.95.1 release.
+
+This represents a significant advance in Django development since the 0.91
+release in January 2006. The details of every change in this release would be
+too extensive to list in full, but a summary is presented below.
+
+Suitability and API stability
+=============================
+
+This release is intended to provide a stable reference point for developers
+wanting to work on production-level applications that use Django.
+
+However, it's not the 1.0 release, and we'll be introducing further changes
+before 1.0. For a clear look at which areas of the framework will change (and
+which ones will *not* change) before 1.0, see the api-stability.txt file, which
+lives in the docs/ directory of the distribution.
+
+You may have a need to use some of the features that are marked as
+"subject to API change" in that document, but that's OK with us as long as it's
+OK with you, and as long as you understand APIs may change in the future.
+
+Fortunately, most of Django's core APIs won't be changing before version 1.0.
+There likely won't be as big of a change between 0.95 and 1.0 versions as there
+was between 0.91 and 0.95.
+
+Changes and new features
+========================
+
+The major changes in this release (for developers currently using the 0.91
+release) are a result of merging the 'magic-removal' branch of development.
+This branch removed a number of constraints in the way Django code had to be
+written that were a consequence of decisions made in the early days of Django,
+prior to its open-source release. It's now possible to write more natural,
+Pythonic code that works as expected, and there's less "black magic" happening
+behind the scenes.
+
+Aside from that, another main theme of this release is a dramatic increase in
+usability. We've made countless improvements in error messages, documentation,
+etc., to improve developers' quality of life.
+
+The new features and changes introduced in 0.95 include:
+
+    * Django now uses a more consistent and natural filtering interface for
+      retrieving objects from the database.
+
+    * User-defined models, functions and constants now appear in the module
+      namespace they were defined in. (Previously everything was magically
+      transferred to the django.models.* namespace.)
+
+    * Some optional applications, such as the FlatPage, Sites and Redirects
+      apps, have been decoupled and moved into django.contrib. If you don't
+      want to use these applications, you no longer have to install their
+      database tables.
+
+    * Django now has support for managing database transactions.
+
+    * We've added the ability to write custom authentication and authorization
+      backends for authenticating users against alternate systems, such as
+      LDAP.
+
+    * We've made it easier to add custom table-level functions to models,
+      through a new "Manager" API.
+
+    * It's now possible to use Django without a database.
+
+    * It's now more explicit and natural to override save() and delete()
+      methods on models, rather than needing to hook into the pre_save() and
+      post_save() method hooks.
+
+    * Individual pieces of the framework now can be configured without
+      requiring the setting of an environment variable. This permits use of,
+      for example, the Django templating system inside other applications.
+
+    * More and more parts of the framework have been internationalized, as
+      we've expanded internationalization (i18n) support. The Django
+      codebase, including code and templates, has now been translated, at least
+      in part, into 31 languages. From Arabic to Chinese to Hungarian to Welsh,
+      it is now possible to use Django's admin site in your native language.
+
+The number of changes required to port from 0.91-compatible code to the 0.95
+code base are significant in some cases. However, they are, for the most part,
+reasonably routine and only need to be done once. A list of the necessary
+changes is described in the 'Removing The Magic`_ wiki page. There is also an
+easy checklist_ for reference when undertaking the porting operation.
+
+.. _Removing The Magic: http://code.djangoproject.com/wiki/RemovingTheMagic
+.. _checklist: http://code.djangoproject.com/wiki/MagicRemovalCheatSheet1
+
+Changes since the 0.95 release
+==============================
+
+This release contains fixes for several bugs discovered after the
+initial release of Django 0.95; these include:
+
+    * A patch for a small security vulnerability in the script
+      Django's internationalization system uses to compile translation
+      files.
+
+    * A fix for a bug in Django's authentication middleware which
+      could cause apparent "caching" of a logged-in user.
+
+    * A patch which disables debugging mode in the flup FastCGI
+      package Django uses to launch its FastCGI server, which prevents
+      tracebacks from bubbling up during production use.
+
+Because these problems weren't discovered and fixed until after the
+0.95 release, it's recommended that you use this release rather than
+the original 0.95.
+
+Problem reports and getting help
+================================
+
+Need help resolving a problem with Django? The documentation in the
+distribution is also available online_ at the `Django website`_. The FAQ_
+document is especially recommended, as it contains a number of issues that
+come up time and again.
+
+For more personalized help, the `django-users` mailing list is a very active
+list, with more than 2,000 subscribers who can help you solve any sort of
+Django problem. We recommend you search the archives first, though, because
+many common questions appear with some regularity, and any particular problem
+may already have been answered.
+
+Finally, for those who prefer the more immediate feedback offered by IRC,
+there's a #django channel or irc.freenode.net that is regularly populated by
+Django users and developers from around the world. Friendly people are usually
+available at any hour of the day -- to help, or just to chat.
+
+.. _online: http://www.djangoproject.com/documentation/
+.. _Django website: http://www.djangoproject.com/
+.. _FAQ: http://www.djangoproject.com/documentation/faq/
+.. _django-users: http://groups.google.com/group/django-users
+
+Thanks for using Django!
+
+The Django Team
+January 2007
+

Added: vendor/django/current/docs/request_response.txt
===================================================================
--- vendor/django/current/docs/request_response.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/request_response.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,430 @@
+============================
+Request and response objects
+============================
+
+Quick overview
+==============
+
+Django uses request and response objects to pass state through the system.
+
+When a page is requested, Django creates an ``HttpRequest`` object that
+contains metadata about the request. Then Django loads the appropriate view,
+passing the ``HttpRequest`` as the first argument to the view function. Each
+view is responsible for returning an ``HttpResponse`` object.
+
+This document explains the APIs for ``HttpRequest`` and ``HttpResponse``
+objects.
+
+HttpRequest objects
+===================
+
+Attributes
+----------
+
+All attributes except ``session`` should be considered read-only.
+
+``path``
+    A string representing the full path to the requested page, not including
+    the domain.
+
+    Example: ``"/music/bands/the_beatles/"``
+
+``method``
+    A string representing the HTTP method used in the request. This is
+    guaranteed to be uppercase. Example::
+
+        if request.method == 'GET':
+            do_something()
+        elif request.method == 'POST':
+            do_something_else()
+
+``GET``
+    A dictionary-like object containing all given HTTP GET parameters. See the
+    ``QueryDict`` documentation below.
+
+``POST``
+    A dictionary-like object containing all given HTTP POST parameters. See the
+    ``QueryDict`` documentation below.
+
+    It's possible that a request can come in via POST with an empty ``POST``
+    dictionary -- if, say, a form is requested via the POST HTTP method but
+    does not include form data. Therefore, you shouldn't use ``if request.POST``
+    to check for use of the POST method; instead, use ``if request.method ==
+    "POST"`` (see above).
+
+    Note: ``POST`` does *not* include file-upload information. See ``FILES``.
+
+``REQUEST``
+    For convenience, a dictionary-like object that searches ``POST`` first,
+    then ``GET``. Inspired by PHP's ``$_REQUEST``.
+
+    For example, if ``GET = {"name": "john"}`` and ``POST = {"age": '34'}``,
+    ``REQUEST["name"]`` would be ``"john"``, and ``REQUEST["age"]`` would be
+    ``"34"``.
+
+    It's strongly suggested that you use ``GET`` and ``POST`` instead of
+    ``REQUEST``, because the former are more explicit.
+
+``COOKIES``
+    A standard Python dictionary containing all cookies. Keys and values are
+    strings.
+
+``FILES``
+    A dictionary-like object containing all uploaded files. Each key in
+    ``FILES`` is the ``name`` from the ``<input type="file" name="" />``. Each
+    value in ``FILES`` is a standard Python dictionary with the following three
+    keys:
+
+        * ``filename`` -- The name of the uploaded file, as a Python string.
+        * ``content-type`` -- The content type of the uploaded file.
+        * ``content`` -- The raw content of the uploaded file.
+
+    Note that ``FILES`` will only contain data if the request method was POST
+    and the ``<form>`` that posted to the request had
+    ``enctype="multipart/form-data"``. Otherwise, ``FILES`` will be a blank
+    dictionary-like object.
+
+``META``
+    A standard Python dictionary containing all available HTTP headers.
+    Available headers depend on the client and server, but here are some
+    examples:
+
+        * ``CONTENT_LENGTH``
+        * ``CONTENT_TYPE``
+        * ``HTTP_ACCEPT_ENCODING``
+        * ``HTTP_ACCEPT_LANGUAGE``
+        * ``HTTP_REFERER`` -- The referring page, if any.
+        * ``HTTP_USER_AGENT`` -- The client's user-agent string.
+        * ``QUERY_STRING`` -- The query string, as a single (unparsed) string.
+        * ``REMOTE_ADDR`` -- The IP address of the client.
+        * ``REMOTE_HOST`` -- The hostname of the client.
+        * ``REQUEST_METHOD`` -- A string such as ``"GET"`` or ``"POST"``.
+        * ``SERVER_NAME`` -- The hostname of the server.
+        * ``SERVER_PORT`` -- The port of the server.
+
+``user``
+    A ``django.contrib.auth.models.User`` object representing the currently
+    logged-in user. If the user isn't currently logged in, ``user`` will be set
+    to an instance of ``django.contrib.auth.models.AnonymousUser``. You
+    can tell them apart with ``is_authenticated()``, like so::
+
+        if request.user.is_authenticated():
+            # Do something for logged-in users.
+        else:
+            # Do something for anonymous users.
+
+    ``user`` is only available if your Django installation has the
+    ``AuthenticationMiddleware`` activated. For more, see
+    `Authentication in Web requests`_.
+
+    .. _Authentication in Web requests: http://www.djangoproject.com/documentation/authentication/#authentication-in-web-requests
+
+``session``
+    A readable-and-writable, dictionary-like object that represents the current
+    session. This is only available if your Django installation has session
+    support activated. See the `session documentation`_ for full details.
+
+    .. _`session documentation`: http://www.djangoproject.com/documentation/sessions/
+
+``raw_post_data``
+    The raw HTTP POST data. This is only useful for advanced processing. Use
+    ``POST`` instead.
+
+Methods
+-------
+
+``__getitem__(key)``
+   Returns the GET/POST value for the given key, checking POST first, then
+   GET. Raises ``KeyError`` if the key doesn't exist.
+
+   This lets you use dictionary-accessing syntax on an ``HttpRequest``
+   instance. Example: ``request["foo"]`` would return ``True`` if either
+   ``request.POST`` or ``request.GET`` had a ``"foo"`` key.
+
+``has_key()``
+   Returns ``True`` or ``False``, designating whether ``request.GET`` or
+   ``request.POST`` has the given key.
+
+``get_full_path()``
+   Returns the ``path``, plus an appended query string, if applicable.
+
+   Example: ``"/music/bands/the_beatles/?print=true"``
+    
+``is_secure()``
+   Returns ``True`` if the request is secure; that is, if it was made with
+   HTTPS.
+
+QueryDict objects
+-----------------
+
+In an ``HttpRequest`` object, the ``GET`` and ``POST`` attributes are instances
+of ``django.http.QueryDict``. ``QueryDict`` is a dictionary-like
+class customized to deal with multiple values for the same key. This is
+necessary because some HTML form elements, notably
+``<select multiple="multiple">``, pass multiple values for the same key.
+
+``QueryDict`` instances are immutable, unless you create a ``copy()`` of them.
+That means you can't change attributes of ``request.POST`` and ``request.GET``
+directly.
+
+``QueryDict`` implements the all standard dictionary methods, because it's a
+subclass of dictionary. Exceptions are outlined here:
+
+    * ``__getitem__(key)`` -- Returns the value for the given key. If the key
+      has more than one value, ``__getitem__()`` returns the last value.
+
+    * ``__setitem__(key, value)`` -- Sets the given key to ``[value]``
+      (a Python list whose single element is ``value``). Note that this, as
+      other dictionary functions that have side effects, can only be called on
+      a mutable ``QueryDict`` (one that was created via ``copy()``).
+
+    * ``__contains__(key)`` -- Returns ``True`` if the given key is set. This
+      lets you do, e.g., ``if "foo" in request.GET``.
+
+    * ``get(key, default)`` -- Uses the same logic as ``__getitem__()`` above,
+      with a hook for returning a default value if the key doesn't exist.
+
+    * ``has_key(key)``
+
+    * ``setdefault(key, default)`` -- Just like the standard dictionary
+      ``setdefault()`` method, except it uses ``__setitem__`` internally.
+
+    * ``update(other_dict)`` -- Takes either a ``QueryDict`` or standard
+      dictionary. Just like the standard dictionary ``update()`` method, except
+      it *appends* to the current dictionary items rather than replacing them.
+      For example::
+
+          >>> q = QueryDict('a=1')
+          >>> q = q.copy() # to make it mutable
+          >>> q.update({'a': '2'})
+          >>> q.getlist('a')
+          ['1', '2']
+          >>> q['a'] # returns the last
+          ['2']
+
+    * ``items()`` -- Just like the standard dictionary ``items()`` method,
+      except this uses the same last-value logic as ``__getitem()__``. For
+      example::
+
+           >>> q = QueryDict('a=1&a=2&a=3')
+           >>> q.items()
+           [('a', '3')]
+
+    * ``values()`` -- Just like the standard dictionary ``values()`` method,
+      except this uses the same last-value logic as ``__getitem()__``. For
+      example::
+
+           >>> q = QueryDict('a=1&a=2&a=3')
+           >>> q.values()
+           ['3']
+
+In addition, ``QueryDict`` has the following methods:
+
+    * ``copy()`` -- Returns a copy of the object, using ``copy.deepcopy()``
+      from the Python standard library. The copy will be mutable -- that is,
+      you can change its values.
+
+    * ``getlist(key)`` -- Returns the data with the requested key, as a Python
+      list. Returns an empty list if the key doesn't exist. It's guaranteed to
+      return a list of some sort.
+
+    * ``setlist(key, list_)`` -- Sets the given key to ``list_`` (unlike
+      ``__setitem__()``).
+
+    * ``appendlist(key, item)`` -- Appends an item to the internal list
+      associated with key.
+
+    * ``setlistdefault(key, default_list)`` -- Just like ``setdefault``, except
+      it takes a list of values instead of a single value.
+
+    * ``lists()`` -- Like ``items()``, except it includes all values, as a list,
+      for each member of the dictionary. For example::
+
+           >>> q = QueryDict('a=1&a=2&a=3')
+           >>> q.lists()
+           [('a', ['1', '2', '3'])]
+
+    * ``urlencode()`` -- Returns a string of the data in query-string format.
+      Example: ``"a=2&b=3&b=5"``.
+
+Examples
+--------
+
+Here's an example HTML form and how Django would treat the input::
+
+    <form action="/foo/bar/" method="post">
+    <input type="text" name="your_name" />
+    <select multiple="multiple" name="bands">
+        <option value="beatles">The Beatles</option>
+        <option value="who">The Who</option>
+        <option value="zombies">The Zombies</option>
+    </select>
+    <input type="submit" />
+    </form>
+
+If the user enters ``"John Smith"`` in the ``your_name`` field and selects both
+"The Beatles" and "The Zombies" in the multiple select box, here's what
+Django's request object would have::
+
+    >>> request.GET
+    {}
+    >>> request.POST
+    {'your_name': ['John Smith'], 'bands': ['beatles', 'zombies']}
+    >>> request.POST['your_name']
+    'John Smith'
+    >>> request.POST['bands']
+    'zombies'
+    >>> request.POST.getlist('bands')
+    ['beatles', 'zombies']
+    >>> request.POST.get('your_name', 'Adrian')
+    'John Smith'
+    >>> request.POST.get('nonexistent_field', 'Nowhere Man')
+    'Nowhere Man'
+
+Implementation notes
+--------------------
+
+The ``GET``, ``POST``, ``COOKIES``, ``FILES``, ``META``, ``REQUEST``,
+``raw_post_data`` and ``user`` attributes are all lazily loaded. That means
+Django doesn't spend resources calculating the values of those attributes until
+your code requests them.
+
+HttpResponse objects
+====================
+
+In contrast to ``HttpRequest`` objects, which are created automatically by
+Django, ``HttpResponse`` objects are your responsibility. Each view you write
+is responsible for instantiating, populating and returning an ``HttpResponse``.
+
+The ``HttpResponse`` class lives at ``django.http.HttpResponse``.
+
+Usage
+-----
+
+Passing strings
+~~~~~~~~~~~~~~~
+
+Typical usage is to pass the contents of the page, as a string, to the
+``HttpResponse`` constructor::
+
+    >>> response = HttpResponse("Here's the text of the Web page.")
+    >>> response = HttpResponse("Text only, please.", mimetype="text/plain")
+
+But if you want to add content incrementally, you can use ``response`` as a
+file-like object::
+
+    >>> response = HttpResponse()
+    >>> response.write("<p>Here's the text of the Web page.</p>")
+    >>> response.write("<p>Here's another paragraph.</p>")
+
+You can add and delete headers using dictionary syntax::
+
+    >>> response = HttpResponse()
+    >>> response['X-DJANGO'] = "It's the best."
+    >>> del response['X-PHP']
+    >>> response['X-DJANGO']
+    "It's the best."
+
+Note that ``del`` doesn't raise ``KeyError`` if the header doesn't exist.
+
+Passing iterators
+~~~~~~~~~~~~~~~~~
+
+Finally, you can pass ``HttpResponse`` an iterator rather than passing it
+hard-coded strings. If you use this technique, follow these guidelines:
+
+    * The iterator should return strings.
+    * If an ``HttpResponse`` has been initialized with an iterator as its
+      content, you can't use the ``HttpResponse`` instance as a file-like
+      object. Doing so will raise ``Exception``.
+
+Methods
+-------
+
+``__init__(content='', mimetype=DEFAULT_MIME_TYPE)``
+    Instantiates an ``HttpResponse`` object with the given page content (a
+    string) and MIME type. The ``DEFAULT_MIME_TYPE`` is ``'text/html'``.
+
+    ``content`` can be an iterator or a string. If it's an iterator, it should
+    return strings, and those strings will be joined together to form the
+    content of the response.
+
+``__setitem__(header, value)``
+    Sets the given header name to the given value. Both ``header`` and
+    ``value`` should be strings.
+
+``__delitem__(header)``
+    Deletes the header with the given name. Fails silently if the header
+    doesn't exist. Case-sensitive.
+
+``__getitem__(header)``
+    Returns the value for the given header name. Case-sensitive.
+
+``has_header(header)``
+    Returns ``True`` or ``False`` based on a case-insensitive check for a
+    header with the given name.
+
+``set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None)``
+    Sets a cookie. The parameters are the same as in the `cookie Morsel`_
+    object in the Python standard library.
+
+        * ``max_age`` should be a number of seconds, or ``None`` (default) if
+          the cookie should last only as long as the client's browser session.
+        * ``expires`` should be a string in the format
+          ``"Wdy, DD-Mon-YY HH:MM:SS GMT"``.
+        * Use ``domain`` if you want to set a cross-domain cookie. For example,
+          ``domain=".lawrence.com"`` will set a cookie that is readable by
+          the domains www.lawrence.com, blogs.lawrence.com and
+          calendars.lawrence.com. Otherwise, a cookie will only be readable by
+          the domain that set it.
+
+    .. _`cookie Morsel`: http://www.python.org/doc/current/lib/morsel-objects.html
+
+``delete_cookie(key)``
+    Deletes the cookie with the given key. Fails silently if the key doesn't
+    exist.
+
+``content``
+    Returns the content as a Python string, encoding it from a Unicode object
+    if necessary. Note this is a property, not a method, so use ``r.content``
+    instead of ``r.content()``.
+
+``write(content)``, ``flush()`` and ``tell()``
+    These methods make an ``HttpResponse`` instance a file-like object.
+
+HttpResponse subclasses
+-----------------------
+
+Django includes a number of ``HttpResponse`` subclasses that handle different
+types of HTTP responses. Like ``HttpResponse``, these subclasses live in
+``django.http``.
+
+``HttpResponseRedirect``
+    The constructor takes a single argument -- the path to redirect to. This
+    can be a fully qualified URL (e.g. ``'http://www.yahoo.com/search/'``) or an
+    absolute URL with no domain (e.g. ``'/search/'``). Note that this returns
+    an HTTP status code 302.
+
+``HttpResponsePermanentRedirect``
+    Like ``HttpResponseRedirect``, but it returns a permanent redirect (HTTP
+    status code 301) instead of a "found" redirect (status code 302).
+
+``HttpResponseNotModified``
+    The constructor doesn't take any arguments. Use this to designate that a
+    page hasn't been modified since the user's last request.
+
+``HttpResponseNotFound``
+    Acts just like ``HttpResponse`` but uses a 404 status code.
+
+``HttpResponseForbidden``
+    Acts just like ``HttpResponse`` but uses a 403 status code.
+
+``HttpResponseNotAllowed``
+    Like ``HttpResponse``, but uses a 405 status code. Takes a single,
+    required argument: a list of permitted methods (e.g. ``['GET', 'POST']``).
+
+``HttpResponseGone``
+    Acts just like ``HttpResponse`` but uses a 410 status code.
+
+``HttpResponseServerError``
+    Acts just like ``HttpResponse`` but uses a 500 status code.

Added: vendor/django/current/docs/serialization.txt
===================================================================
--- vendor/django/current/docs/serialization.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/serialization.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,102 @@
+==========================
+Serializing Django objects
+==========================
+
+.. note::
+    
+    This API is currently under heavy development and may change --
+    perhaps drastically -- in the future.
+    
+    You have been warned.
+    
+Django's serialization framework provides a mechanism for "translating" Django
+objects into other formats. Usually these other formats will be text-based and
+used for sending Django objects over a wire, but it's possible for a
+serializer to handle any format (text-based or not).
+
+Serializing data
+----------------
+
+At the highest level, serializing data is a very simple operation::
+
+    from django.core import serializers
+    data = serializers.serialize("xml", SomeModel.objects.all())
+    
+The arguments to the ``serialize`` function are the format to serialize the
+data to (see `Serialization formats`_) and a QuerySet_ to serialize.
+(Actually, the second argument can be any iterator that yields Django objects,
+but it'll almost always be a QuerySet).
+
+.. _QuerySet: ../db_api/#retrieving-objects
+
+You can also use a serializer object directly::
+
+    xml_serializer = serializers.get_serializer("xml")
+    xml_serializer.serialize(queryset)
+    data = xml_serializer.getvalue()
+    
+This is useful if you want to serialize data directly to a file-like object
+(which includes a HTTPResponse_)::
+
+    out = open("file.xml", "w")
+    xml_serializer.serialize(SomeModel.objects.all(), stream=out)
+
+.. _HTTPResponse: ../request_response/#httpresponse-objects
+
+Deserializing data
+------------------
+
+Deserializing data is also a fairly simple operation::
+
+    for obj in serializers.deserialize("xml", data):
+        do_something_with(obj)
+    
+As you can see, the ``deserialize`` function takes the same format argument as
+``serialize``, a string or stream of data, and returns an iterator.
+
+However, here it gets slightly complicated. The objects returned by the
+``deserialize`` iterator *aren't* simple Django objects. Instead, they are
+special ``DeserializedObject`` instances that wrap a created -- but unsaved --
+object and any associated relationship data.
+
+Calling ``DeserializedObject.save()`` saves the object to the database.
+
+This ensures that deserializing is a non-destructive operation even if the
+data in your serialized representation doesn't match what's currently in the
+database. Usually, working with these ``DeserializedObject`` instances looks
+something like::
+
+    for deserialized_object in serializers.deserialize("xml", data):
+        if object_should_be_saved(deserialized_object):
+            obj.save()
+            
+In other words, the usual use is to examine the deserialized objects to make
+sure that they are "appropriate" for saving before doing so.  Of course, if you trust your data source you could just save the object and move on.
+
+The Django object itself can be inspected as ``deserialized_object.object``.
+
+Serialization formats
+---------------------
+
+Django "ships" with a few included serializers:
+
+    ==========  ==============================================================
+    Identifier  Information
+    ==========  ==============================================================
+    ``xml``     Serializes to and from a simple XML dialect.
+
+    ``json``    Serializes to and from JSON_ (using a version of simplejson_
+                bundled with Django).
+
+    ``python``  Translates to and from "simple" Python objects (lists, dicts,
+                strings, etc.).  Not really all that useful on its own, but 
+                used as a base for other serializers.
+    ==========  ==============================================================
+
+.. _json: http://json.org/
+.. _simplejson: http://undefined.org/python/#simplejson
+
+Writing custom serializers
+``````````````````````````
+
+XXX ...

Added: vendor/django/current/docs/sessions.txt
===================================================================
--- vendor/django/current/docs/sessions.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/sessions.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,287 @@
+===================
+How to use sessions
+===================
+
+Django provides full support for anonymous sessions. The session framework lets
+you store and retrieve arbitrary data on a per-site-visitor basis. It stores
+data on the server side and abstracts the sending and receiving of cookies.
+Cookies contain a session ID -- not the data itself.
+
+Enabling sessions
+=================
+
+Sessions are implemented via a piece of middleware_ and a Django model.
+
+To enable session functionality, do these two things:
+
+    * Edit the ``MIDDLEWARE_CLASSES`` setting and make sure
+      ``MIDDLEWARE_CLASSES`` contains ``'django.contrib.sessions.middleware.SessionMiddleware'``.
+      The default ``settings.py`` created by ``django-admin.py startproject`` has
+      ``SessionMiddleware`` activated.
+
+    * Add ``'django.contrib.sessions'`` to your ``INSTALLED_APPS`` setting, and
+      run ``manage.py syncdb`` to install the single database table that stores
+      session data.
+
+If you don't want to use sessions, you might as well remove the
+``SessionMiddleware`` line from ``MIDDLEWARE_CLASSES`` and ``'django.contrib.sessions'``
+from your ``INSTALLED_APPS``. It'll save you a small bit of overhead.
+
+.. _middleware: http://www.djangoproject.com/documentation/middleware/
+
+Using sessions in views
+=======================
+
+When ``SessionMiddleware`` is activated, each ``HttpRequest`` object -- the
+first argument to any Django view function -- will have a ``session``
+attribute, which is a dictionary-like object. You can read it and write to it.
+
+It implements the following standard dictionary methods:
+
+    * ``__getitem__(key)``
+      Example: ``fav_color = request.session['fav_color']``
+
+    * ``__setitem__(key, value)``
+      Example: ``request.session['fav_color'] = 'blue'``
+
+    * ``__delitem__(key)``
+      Example: ``del request.session['fav_color']``. This raises ``KeyError``
+      if the given ``key`` isn't already in the session.
+
+    * ``__contains__(key)``
+      Example: ``'fav_color' in request.session``
+
+    * ``get(key, default=None)``
+      Example: ``fav_color = request.session.get('fav_color', 'red')``
+
+    * ``keys()``
+
+    * ``items()``
+
+It also has these three methods:
+
+    * ``set_test_cookie()``
+      Sets a test cookie to determine whether the user's browser supports
+      cookies. Due to the way cookies work, you won't be able to test this
+      until the user's next page request. See "Setting test cookies" below for
+      more information.
+
+    * ``test_cookie_worked()``
+      Returns either ``True`` or ``False``, depending on whether the user's
+      browser accepted the test cookie. Due to the way cookies work, you'll
+      have to call ``set_test_cookie()`` on a previous, separate page request.
+      See "Setting test cookies" below for more information.
+
+    * ``delete_test_cookie()``
+      Deletes the test cookie. Use this to clean up after yourself.
+
+You can edit ``request.session`` at any point in your view. You can edit it
+multiple times.
+
+Session object guidelines
+-------------------------
+
+    * Use normal Python strings as dictionary keys on ``request.session``. This
+      is more of a convention than a hard-and-fast rule.
+
+    * Session dictionary keys that begin with an underscore are reserved for
+      internal use by Django.
+
+    * Don't override ``request.session`` with a new object, and don't access or
+      set its attributes. Use it like a Python dictionary.
+
+Examples
+--------
+
+This simplistic view sets a ``has_commented`` variable to ``True`` after a user
+posts a comment. It doesn't let a user post a comment more than once::
+
+    def post_comment(request, new_comment):
+        if request.session.get('has_commented', False):
+            return HttpResponse("You've already commented.")
+        c = comments.Comment(comment=new_comment)
+        c.save()
+        request.session['has_commented'] = True
+        return HttpResponse('Thanks for your comment!')
+
+This simplistic view logs in a "member" of the site::
+
+    def login(request):
+        m = members.get_object(username__exact=request.POST['username'])
+        if m.password == request.POST['password']:
+            request.session['member_id'] = m.id
+            return HttpResponse("You're logged in.")
+        else:
+            return HttpResponse("Your username and password didn't match.")
+
+...And this one logs a member out, according to ``login()`` above::
+
+    def logout(request):
+        try:
+            del request.session['member_id']
+        except KeyError:
+            pass
+        return HttpResponse("You're logged out.")
+
+Setting test cookies
+====================
+
+As a convenience, Django provides an easy way to test whether the user's
+browser accepts cookies. Just call ``request.session.set_test_cookie()`` in a
+view, and call ``request.session.test_cookie_worked()`` in a subsequent view --
+not in the same view call.
+
+This awkward split between ``set_test_cookie()`` and ``test_cookie_worked()``
+is necessary due to the way cookies work. When you set a cookie, you can't
+actually tell whether a browser accepted it until the browser's next request.
+
+It's good practice to use ``delete_test_cookie()`` to clean up after yourself.
+Do this after you've verified that the test cookie worked.
+
+Here's a typical usage example::
+
+    def login(request):
+        if request.POST:
+            if request.session.test_cookie_worked():
+                request.session.delete_test_cookie()
+                return HttpResponse("You're logged in.")
+            else:
+                return HttpResponse("Please enable cookies and try again.")
+        request.session.set_test_cookie()
+        return render_to_response('foo/login_form.html')
+
+Using sessions out of views
+===========================
+
+Internally, each session is just a normal Django model. The ``Session`` model
+is defined in ``django/contrib/sessions/models.py``. Because it's a normal
+model, you can access sessions using the normal Django database API::
+
+    >>> from django.contrib.sessions.models import Session
+    >>> s = Session.objects.get_object(pk='2b1189a188b44ad18c35e113ac6ceead')
+    >>> s.expire_date
+    datetime.datetime(2005, 8, 20, 13, 35, 12)
+
+Note that you'll need to call ``get_decoded()`` to get the session dictionary.
+This is necessary because the dictionary is stored in an encoded format::
+
+    >>> s.session_data
+    'KGRwMQpTJ19hdXRoX3VzZXJfaWQnCnAyCkkxCnMuMTExY2ZjODI2Yj...'
+    >>> s.get_decoded()
+    {'user_id': 42}
+
+When sessions are saved
+=======================
+
+By default, Django only saves to the session database when the session has been
+modified -- that is if any of its dictionary values have been assigned or
+deleted::
+
+    # Session is modified.
+    request.session['foo'] = 'bar'
+
+    # Session is modified.
+    del request.session['foo']
+
+    # Session is modified.
+    request.session['foo'] = {}
+
+    # Gotcha: Session is NOT modified, because this alters
+    # request.session['foo'] instead of request.session.
+    request.session['foo']['bar'] = 'baz'
+
+To change this default behavior, set the ``SESSION_SAVE_EVERY_REQUEST`` setting
+to ``True``. If ``SESSION_SAVE_EVERY_REQUEST`` is ``True``, Django will save
+the session to the database on every single request.
+
+Note that the session cookie is only sent when a session has been created or
+modified. If ``SESSION_SAVE_EVERY_REQUEST`` is ``True``, the session cookie
+will be sent on every request.
+
+Similarly, the ``expires`` part of a session cookie is updated each time the
+session cookie is sent.
+
+Browser-length sessions vs. persistent sessions
+===============================================
+
+You can control whether the session framework uses browser-length sessions vs.
+persistent sessions with the ``SESSION_EXPIRE_AT_BROWSER_CLOSE`` setting.
+
+By default, ``SESSION_EXPIRE_AT_BROWSER_CLOSE`` is set to ``False``, which
+means session cookies will be stored in users' browsers for as long as
+``SESSION_COOKIE_AGE``. Use this if you don't want people to have to log in
+every time they open a browser.
+
+If ``SESSION_EXPIRE_AT_BROWSER_CLOSE`` is set to ``True``, Django will use
+browser-length cookies -- cookies that expire as soon as the user closes his or
+her browser. Use this if you want people to have to log in every time they open
+a browser.
+
+Settings
+========
+
+A few `Django settings`_ give you control over session behavior:
+
+SESSION_COOKIE_AGE
+------------------
+
+Default: ``1209600`` (2 weeks, in seconds)
+
+The age of session cookies, in seconds.
+
+SESSION_COOKIE_DOMAIN
+---------------------
+
+Default: ``None``
+
+The domain to use for session cookies. Set this to a string such as
+``".lawrence.com"`` for cross-domain cookies, or use ``None`` for a standard
+domain cookie.
+
+SESSION_COOKIE_NAME
+-------------------
+
+Default: ``'sessionid'``
+
+The name of the cookie to use for sessions. This can be whatever you want.
+
+SESSION_EXPIRE_AT_BROWSER_CLOSE
+-------------------------------
+
+Default: ``False``
+
+Whether to expire the session when the user closes his or her browser. See
+"Browser-length sessions vs. persistent sessions" above.
+
+SESSION_SAVE_EVERY_REQUEST
+--------------------------
+
+Default: ``False``
+
+Whether to save the session data on every request. If this is ``False``
+(default), then the session data will only be saved if it has been modified --
+that is, if any of its dictionary values have been assigned or deleted.
+
+.. _Django settings: http://www.djangoproject.com/documentation/settings/
+
+Technical details
+=================
+
+    * The session dictionary should accept any pickleable Python object. See
+      `the pickle module`_ for more information.
+
+    * Session data is stored in a database table named ``django_session`` .
+
+    * Django only sends a cookie if it needs to. If you don't set any session
+      data, it won't send a session cookie.
+
+.. _`the pickle module`: http://www.python.org/doc/current/lib/module-pickle.html
+
+Session IDs in URLs
+===================
+
+The Django sessions framework is entirely, and solely, cookie-based. It does
+not fall back to putting session IDs in URLs as a last resort, as PHP does.
+This is an intentional design decision. Not only does that behavior make URLs
+ugly, it makes your site vulnerable to session-ID theft via the "Referer"
+header.

Added: vendor/django/current/docs/settings.txt
===================================================================
--- vendor/django/current/docs/settings.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/settings.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,904 @@
+===============
+Django settings
+===============
+
+A Django settings file contains all the configuration of your Django
+installation. This document explains how settings work and which settings are
+available.
+
+The basics
+==========
+
+A settings file is just a Python module with module-level variables.
+
+Here are a couple of example settings::
+
+    DEBUG = False
+    DEFAULT_FROM_EMAIL = 'webmaster at example.com'
+    TEMPLATE_DIRS = ('/home/templates/mike', '/home/templates/john')
+
+Because a settings file is a Python module, the following apply:
+
+    * It doesn't allow for Python syntax errors.
+    * It can assign settings dynamically using normal Python syntax.
+      For example::
+
+          MY_SETTING = [str(i) for i in range(30)]
+
+    * It can import values from other settings files.
+
+Designating the settings
+========================
+
+When you use Django, you have to tell it which settings you're using. Do this
+by using an environment variable, ``DJANGO_SETTINGS_MODULE``.
+
+The value of ``DJANGO_SETTINGS_MODULE`` should be in Python path syntax, e.g.
+``mysite.settings``. Note that the settings module should be on the
+Python `import search path`_.
+
+.. _import search path: http://diveintopython.org/getting_to_know_python/everything_is_an_object.html
+
+The django-admin.py utility
+---------------------------
+
+When using `django-admin.py`_, you can either set the environment variable
+once, or explicitly pass in the settings module each time you run the utility.
+
+Example (Unix Bash shell)::
+
+    export DJANGO_SETTINGS_MODULE=mysite.settings
+    django-admin.py runserver
+
+Example (Windows shell)::
+
+    set DJANGO_SETTINGS_MODULE=mysite.settings
+    django-admin.py runserver
+
+Use the ``--settings`` command-line argument to specify the settings manually::
+
+    django-admin.py runserver --settings=mysite.settings
+
+.. _django-admin.py: http://www.djangoproject.com/documentation/django_admin/
+
+On the server (mod_python)
+--------------------------
+
+In your live server environment, you'll need to tell Apache/mod_python which
+settings file to use. Do that with ``SetEnv``::
+
+    <Location "/mysite/">
+        SetHandler python-program
+        PythonHandler django.core.handlers.modpython
+        SetEnv DJANGO_SETTINGS_MODULE mysite.settings
+    </Location>
+
+Read the `Django mod_python documentation`_ for more information.
+
+.. _Django mod_python documentation: http://www.djangoproject.com/documentation/modpython/
+
+Default settings
+================
+
+A Django settings file doesn't have to define any settings if it doesn't need
+to. Each setting has a sensible default value. These defaults live in the file
+``django/conf/global_settings.py``.
+
+Here's the algorithm Django uses in compiling settings:
+
+    * Load settings from ``global_settings.py``.
+    * Load settings from the specified settings file, overriding the global
+      settings as necessary.
+
+Note that a settings file should *not* import from ``global_settings``, because
+that's redundant.
+
+Seeing which settings you've changed
+------------------------------------
+
+There's an easy way to view which of your settings deviate from the default
+settings. The command ``python manage.py diffsettings`` displays differences
+between the current settings file and Django's default settings.
+
+For more, see the `diffsettings documentation`_.
+
+.. _diffsettings documentation: http://www.djangoproject.com/documentation/django_admin/#diffsettings
+
+Using settings in Python code
+=============================
+
+In your Django apps, use settings by importing the object
+``django.conf.settings``. Example::
+
+    from django.conf import settings
+
+    if settings.DEBUG:
+        # Do something
+
+Note that ``django.conf.settings`` isn't a module -- it's an object. So
+importing individual settings is not possible::
+
+    from django.conf.settings import DEBUG  # This won't work.
+
+Also note that your code should *not* import from either ``global_settings`` or
+your own settings file. ``django.conf.settings`` abstracts the concepts of
+default settings and site-specific settings; it presents a single interface.
+It also decouples the code that uses settings from the location of your
+settings.
+
+Altering settings at runtime
+============================
+
+You shouldn't alter settings in your applications at runtime. For example,
+don't do this in a view::
+
+    from django.conf import settings
+
+    settings.DEBUG = True   # Don't do this!
+
+The only place you should assign to settings is in a settings file.
+
+Security
+========
+
+Because a settings file contains sensitive information, such as the database
+password, you should make every attempt to limit access to it. For example,
+change its file permissions so that only you and your Web server's user can
+read it. This is especially important in a shared-hosting environment.
+
+Available settings
+==================
+
+Here's a full list of all available settings, in alphabetical order, and their
+default values.
+
+ABSOLUTE_URL_OVERRIDES
+----------------------
+
+Default: ``{}`` (Empty dictionary)
+
+A dictionary mapping ``"app_label.module_name"`` strings to functions that take
+a model object and return its URL. This is a way of overriding
+``get_absolute_url()`` methods on a per-installation basis. Example::
+
+    ABSOLUTE_URL_OVERRIDES = {
+        'blogs.blogs': lambda o: "/blogs/%s/" % o.slug,
+        'news.stories': lambda o: "/stories/%s/%s/" % (o.pub_year, o.slug),
+    }
+
+ADMIN_FOR
+---------
+
+Default: ``()`` (Empty list)
+
+Used for admin-site settings modules, this should be a tuple of settings
+modules (in the format ``'foo.bar.baz'``) for which this site is an admin.
+
+The admin site uses this in its automatically-introspected documentation of
+models, views and template tags.
+
+ADMIN_MEDIA_PREFIX
+------------------
+
+Default: ``'/media/'``
+
+The URL prefix for admin media -- CSS, JavaScript and images. Make sure to use
+a trailing slash.
+
+ADMINS
+------
+
+Default: ``()`` (Empty tuple)
+
+A tuple that lists people who get code error notifications. When
+``DEBUG=False`` and a view raises an exception, Django will e-mail these people
+with the full exception information. Each member of the tuple should be a tuple
+of (Full name, e-mail address). Example::
+
+    (('John', 'john at example.com'), ('Mary', 'mary at example.com'))
+
+ALLOWED_INCLUDE_ROOTS
+---------------------
+
+Default: ``()`` (Empty tuple)
+
+A tuple of strings representing allowed prefixes for the ``{% ssi %}`` template
+tag. This is a security measure, so that template authors can't access files
+that they shouldn't be accessing.
+
+For example, if ``ALLOWED_INCLUDE_ROOTS`` is ``('/home/html', '/var/www')``,
+then ``{% ssi /home/html/foo.txt %}`` would work, but ``{% ssi /etc/passwd %}``
+wouldn't.
+
+APPEND_SLASH
+------------
+
+Default: ``True``
+
+Whether to append trailing slashes to URLs. This is only used if
+``CommonMiddleware`` is installed (see the `middleware docs`_). See also
+``PREPEND_WWW``.
+
+CACHE_BACKEND
+-------------
+
+Default: ``'simple://'``
+
+The cache backend to use. See the `cache docs`_.
+
+CACHE_MIDDLEWARE_KEY_PREFIX
+
+Default: ``''`` (Empty string)
+
+The cache key prefix that the cache middleware should use. See the
+`cache docs`_.
+
+DATABASE_ENGINE
+---------------
+
+Default: ``'postgresql'``
+
+Which database backend to use. Either ``'postgresql'``, ``'mysql'``,
+``'sqlite3'`` or ``'ado_mssql'``.
+
+DATABASE_HOST
+-------------
+
+Default: ``''`` (Empty string)
+
+Which host to use when connecting to the database. An empty string means
+localhost. Not used with SQLite.
+
+If this value starts with a forward slash (``'/'``) and you're using MySQL,
+MySQL will connect via a Unix socket to the specified socket. For example::
+
+    DATABASE_HOST = '/var/run/mysql'
+
+If you're using MySQL and this value *doesn't* start with a forward slash, then
+this value is assumed to be the host.
+
+DATABASE_NAME
+-------------
+
+Default: ``''`` (Empty string)
+
+The name of the database to use. For SQLite, it's the full path to the database
+file.
+
+DATABASE_PASSWORD
+-----------------
+
+Default: ``''`` (Empty string)
+
+The password to use when connecting to the database. Not used with SQLite.
+
+DATABASE_PORT
+-------------
+
+Default: ``''`` (Empty string)
+
+The port to use when connecting to the database. An empty string means the
+default port. Not used with SQLite.
+
+DATABASE_USER
+-------------
+
+Default: ``''`` (Empty string)
+
+The username to use when connecting to the database. Not used with SQLite.
+
+DATE_FORMAT
+-----------
+
+Default: ``'N j, Y'`` (e.g. ``Feb. 4, 2003``)
+
+The default formatting to use for date fields on Django admin change-list
+pages -- and, possibly, by other parts of the system. See
+`allowed date format strings`_.
+
+See also DATETIME_FORMAT, TIME_FORMAT, YEAR_MONTH_FORMAT and MONTH_DAY_FORMAT.
+
+.. _allowed date format strings: http://www.djangoproject.com/documentation/templates/#now
+
+DATETIME_FORMAT
+---------------
+
+Default: ``'N j, Y, P'`` (e.g. ``Feb. 4, 2003, 4 p.m.``)
+
+The default formatting to use for datetime fields on Django admin change-list
+pages -- and, possibly, by other parts of the system. See
+`allowed date format strings`_.
+
+See also DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, YEAR_MONTH_FORMAT and MONTH_DAY_FORMAT.
+
+.. _allowed date format strings: http://www.djangoproject.com/documentation/templates/#now
+
+DEBUG
+-----
+
+Default: ``False``
+
+A boolean that turns on/off debug mode.
+
+DEFAULT_CHARSET
+---------------
+
+Default: ``'utf-8'``
+
+Default charset to use for all ``HttpResponse`` objects, if a MIME type isn't
+manually specified. Used with ``DEFAULT_CONTENT_TYPE`` to construct the
+``Content-Type`` header.
+
+DEFAULT_CONTENT_TYPE
+--------------------
+
+Default: ``'text/html'``
+
+Default content type to use for all ``HttpResponse`` objects, if a MIME type
+isn't manually specified. Used with ``DEFAULT_CHARSET`` to construct the
+``Content-Type`` header.
+
+DEFAULT_FROM_EMAIL
+------------------
+
+Default: ``'webmaster at localhost'``
+
+Default e-mail address to use for various automated correspondence from the
+site manager(s).
+
+DISALLOWED_USER_AGENTS
+----------------------
+
+Default: ``()`` (Empty tuple)
+
+List of compiled regular expression objects representing User-Agent strings
+that are not allowed to visit any page, systemwide. Use this for bad
+robots/crawlers.  This is only used if ``CommonMiddleware`` is installed (see
+the `middleware docs`_).
+
+EMAIL_HOST
+----------
+
+Default: ``'localhost'``
+
+The host to use for sending e-mail.
+
+See also ``EMAIL_PORT``.
+
+EMAIL_HOST_PASSWORD
+-------------------
+
+Default: ``''`` (Empty string)
+
+Username to use for the SMTP server defined in ``EMAIL_HOST``. If empty,
+Django won't attempt authentication.
+
+See also ``EMAIL_HOST_USER``.
+
+EMAIL_HOST_USER
+---------------
+
+Default: ``''`` (Empty string)
+
+Username to use for the SMTP server defined in ``EMAIL_HOST``. If empty,
+Django won't attempt authentication.
+
+See also ``EMAIL_HOST_PASSWORD``.
+
+EMAIL_PORT
+----------
+
+Default: ``25``
+
+Port to use for the SMTP server defined in ``EMAIL_HOST``.
+
+EMAIL_SUBJECT_PREFIX
+--------------------
+
+Default: ``'[Django] '``
+
+Subject-line prefix for e-mail messages sent with ``django.core.mail.mail_admins``
+or ``django.core.mail.mail_managers``. You'll probably want to include the
+trailing space.
+
+ENABLE_PSYCO
+------------
+
+Default: ``False``
+
+Whether to enable Psyco, which optimizes Python code. Requires Psyco_.
+
+.. _Psyco: http://psyco.sourceforge.net/
+
+IGNORABLE_404_ENDS
+------------------
+
+Default: ``('mail.pl', 'mailform.pl', 'mail.cgi', 'mailform.cgi', 'favicon.ico', '.php')``
+
+See also ``IGNORABLE_404_STARTS``.
+
+IGNORABLE_404_STARTS
+--------------------
+
+Default: ``('/cgi-bin/', '/_vti_bin', '/_vti_inf')``
+
+A tuple of strings that specify beginnings of URLs that should be ignored by
+the 404 e-mailer. See ``SEND_BROKEN_LINK_EMAILS`` and ``IGNORABLE_404_ENDS``.
+
+INSTALLED_APPS
+--------------
+
+Default: ``()`` (Empty tuple)
+
+A tuple of strings designating all applications that are enabled in this Django
+installation. Each string should be a full Python path to a Python package that
+contains a Django application, as created by `django-admin.py startapp`_.
+
+.. _django-admin.py startapp: http://www.djangoproject.com/documentation/django_admin/#startapp-appname
+
+INTERNAL_IPS
+------------
+
+Default: ``()`` (Empty tuple)
+
+A tuple of IP addresses, as strings, that:
+
+    * See debug comments, when ``DEBUG`` is ``True``
+    * Receive X headers if the ``XViewMiddleware`` is installed (see the
+      `middleware docs`_)
+
+JING_PATH
+---------
+
+Default: ``'/usr/bin/jing'``
+
+Path to the "Jing" executable. Jing is a RELAX NG validator, and Django uses it
+to validate each ``XMLField`` in your models.
+See http://www.thaiopensource.com/relaxng/jing.html .
+
+LANGUAGE_CODE
+-------------
+
+Default: ``'en-us'``
+
+A string representing the language code for this installation. This should be
+in standard language format. For example, U.S. English is ``"en-us"``. See the
+`internationalization docs`_.
+
+.. _internationalization docs: http://www.djangoproject.com/documentation/i18n/
+
+LANGUAGES
+---------
+
+Default: A tuple of all available languages. Currently, this is::
+
+    LANGUAGES = (
+        ('bn', _('Bengali')),
+        ('cs', _('Czech')),
+        ('cy', _('Welsh')),
+        ('da', _('Danish')),
+        ('de', _('German')),
+        ('en', _('English')),
+        ('es', _('Spanish')),
+        ('fr', _('French')),
+        ('gl', _('Galician')),
+        ('is', _('Icelandic')),
+        ('it', _('Italian')),
+        ('no', _('Norwegian')),
+        ('pt-br', _('Brazilian')),
+        ('ro', _('Romanian')),
+        ('ru', _('Russian')),
+        ('sk', _('Slovak')),
+        ('sr', _('Serbian')),
+        ('sv', _('Swedish')),
+        ('zh-cn', _('Simplified Chinese')),
+    )
+
+A tuple of two-tuples in the format (language code, language name). This
+specifies which languages are available for language selection. See the
+`internationalization docs`_ for details.
+
+Generally, the default value should suffice. Only set this setting if you want
+to restrict language selection to a subset of the Django-provided languages.
+
+If you define a custom ``LANGUAGES`` setting, it's OK to mark the languages as
+translation strings (as in the default value displayed above) -- but use a
+"dummy" ``gettext()`` function, not the one in ``django.utils.translation``.
+You should *never* import ``django.utils.translation`` from within your
+settings file, because that module in itself depends on the settings, and that
+would cause a circular import.
+
+The solution is to use a "dummy" ``gettext()`` function. Here's a sample
+settings file::
+
+    gettext = lambda s: s
+
+    LANGUAGES = (
+        ('de', gettext('German')),
+        ('en', gettext('English')),
+    )
+
+With this arrangement, ``make-messages.py`` will still find and mark these
+strings for translation, but the translation won't happen at runtime -- so
+you'll have to remember to wrap the languages in the *real* ``gettext()`` in
+any code that uses ``LANGUAGES`` at runtime.
+
+MANAGERS
+--------
+
+Default: ``ADMINS`` (Whatever ``ADMINS`` is set to)
+
+A tuple in the same format as ``ADMINS`` that specifies who should get
+broken-link notifications when ``SEND_BROKEN_LINK_EMAILS=True``.
+
+MEDIA_ROOT
+----------
+
+Default: ``''`` (Empty string)
+
+Absolute path to the directory that holds media for this installation.
+Example: ``"/home/media/media.lawrence.com/"`` See also ``MEDIA_URL``.
+
+MEDIA_URL
+---------
+
+Default: ``''`` (Empty string)
+
+URL that handles the media served from ``MEDIA_ROOT``.
+Example: ``"http://media.lawrence.com"``
+
+MIDDLEWARE_CLASSES
+------------------
+
+Default::
+
+    ("django.contrib.sessions.middleware.SessionMiddleware",
+     "django.contrib.auth.middleware.AuthenticationMiddleware",
+     "django.middleware.common.CommonMiddleware",
+     "django.middleware.doc.XViewMiddleware")
+
+A tuple of middleware classes to use. See the `middleware docs`_.
+
+MONTH_DAY_FORMAT
+----------------
+
+Default: ``'F j'``
+
+The default formatting to use for date fields on Django admin change-list
+pages -- and, possibly, by other parts of the system -- in cases when only the
+month and day are displayed.
+
+For example, when a Django admin change-list page is being filtered by a date
+drilldown, the header for a given day displays the day and month. Different
+locales have different formats. For example, U.S. English would say
+"January 1," whereas Spanish might say "1 Enero."
+
+See `allowed date format strings`_. See also DATE_FORMAT, DATETIME_FORMAT,
+TIME_FORMAT and YEAR_MONTH_FORMAT.
+
+PREPEND_WWW
+-----------
+
+Default: ``False``
+
+Whether to prepend the "www." subdomain to URLs that don't have it. This is
+only used if ``CommonMiddleware`` is installed (see the `middleware docs`_).
+See also ``APPEND_SLASH``.
+
+ROOT_URLCONF
+------------
+
+Default: Not defined
+
+A string representing the full Python import path to your root URLconf. For example:
+``"mydjangoapps.urls"``. See `How Django processes a request`_.
+
+.. _How Django processes a request: http://www.djangoproject.com/documentation/url_dispatch/#how-django-processes-a-request
+
+SECRET_KEY
+----------
+
+Default: ``''`` (Empty string)
+
+A secret key for this particular Django installation. Used to provide a seed in
+secret-key hashing algorithms. Set this to a random string -- the longer, the
+better. ``django-admin.py startproject`` creates one automatically.
+
+SEND_BROKEN_LINK_EMAILS
+-----------------------
+
+Default: ``False``
+
+Whether to send an e-mail to the ``MANAGERS`` each time somebody visits a
+Django-powered page that is 404ed with a non-empty referer (i.e., a broken
+link). This is only used if ``CommonMiddleware`` is installed (see the
+`middleware docs`_). See also ``IGNORABLE_404_STARTS`` and
+``IGNORABLE_404_ENDS``.
+
+SERVER_EMAIL
+------------
+
+Default: ``'root at localhost'``
+
+The e-mail address that error messages come from, such as those sent to
+``ADMINS`` and ``MANAGERS``.
+
+SESSION_COOKIE_AGE
+------------------
+
+Default: ``1209600`` (2 weeks, in seconds)
+
+The age of session cookies, in seconds. See the `session docs`_.
+
+SESSION_COOKIE_DOMAIN
+---------------------
+
+Default: ``None``
+
+The domain to use for session cookies. Set this to a string such as
+``".lawrence.com"`` for cross-domain cookies, or use ``None`` for a standard
+domain cookie. See the `session docs`_.
+
+SESSION_COOKIE_NAME
+-------------------
+
+Default: ``'sessionid'``
+
+The name of the cookie to use for sessions. This can be whatever you want.
+See the `session docs`_.
+
+SESSION_EXPIRE_AT_BROWSER_CLOSE
+-------------------------------
+
+Default: ``False``
+
+Whether to expire the session when the user closes his or her browser.
+See the `session docs`_.
+
+SESSION_SAVE_EVERY_REQUEST
+--------------------------
+
+Default: ``False``
+
+Whether to save the session data on every request. See the `session docs`_.
+
+SITE_ID
+-------
+
+Default: Not defined
+
+The ID, as an integer, of the current site in the ``django_site`` database
+table. This is used so that application data can hook into specific site(s)
+and a single database can manage content for multiple sites.
+
+See the `site framework docs`_.
+
+.. _site framework docs: http://www.djangoproject.com/documentation/sites/
+
+TEMPLATE_CONTEXT_PROCESSORS
+---------------------------
+
+Default::
+
+    ("django.core.context_processors.auth",
+    "django.core.context_processors.debug",
+    "django.core.context_processors.i18n")
+
+A tuple of callables that are used to populate the context in ``RequestContext``.
+These callables take a request object as their argument and return a dictionary
+of items to be merged into the context.
+
+TEMPLATE_DEBUG
+--------------
+
+Default: ``False``
+
+A boolean that turns on/off template debug mode. If this is ``True``, the fancy
+error page will display a detailed report for any ``TemplateSyntaxError``. This
+report contains the relevant snippet of the template, with the appropriate line
+highlighted.
+
+Note that Django only displays fancy error pages if ``DEBUG`` is ``True``, so
+you'll want to set that to take advantage of this setting.
+
+See also DEBUG.
+
+TEMPLATE_DIRS
+-------------
+
+Default: ``()`` (Empty tuple)
+
+List of locations of the template source files, in search order. Note that
+these paths should use Unix-style forward slashes, even on Windows.
+
+See the `template documentation`_.
+
+TEMPLATE_LOADERS
+----------------
+
+Default: ``('django.template.loaders.filesystem.load_template_source',)``
+
+A tuple of callables (as strings) that know how to import templates from
+various sources. See the `template documentation`_.
+
+TEMPLATE_STRING_IF_INVALID
+--------------------------
+
+Default: ``''`` (Empty string)
+
+Output, as a string, that the template system should use for invalid (e.g.
+misspelled) variables. See `How invalid variables are handled`_.
+
+.. _How invalid variables are handled: http://www.djangoproject.com/documentation/templates_python/#how-invalid-variables-are-handled
+
+TIME_FORMAT
+-----------
+
+Default: ``'P'`` (e.g. ``4 p.m.``)
+
+The default formatting to use for time fields on Django admin change-list
+pages -- and, possibly, by other parts of the system. See
+`allowed date format strings`_.
+
+See also DATE_FORMAT, DATETIME_FORMAT, TIME_FORMAT, YEAR_MONTH_FORMAT and
+MONTH_DAY_FORMAT.
+
+.. _allowed date format strings: http://www.djangoproject.com/documentation/templates/#now
+
+TIME_ZONE
+---------
+
+Default: ``'America/Chicago'``
+
+A string representing the time zone for this installation. `See available choices`_.
+(Note that list of available choices lists more than one on the same line;
+you'll want to use just one of the choices for a given time zone. For instance,
+one line says ``'Europe/London GB GB-Eire'``, but you should use the first bit
+of that -- ``'Europe/London'`` -- as your ``TIME_ZONE`` setting.)
+
+Note that this is the time zone to which Django will convert all dates/times --
+not necessarily the timezone of the server. For example, one server may serve
+multiple Django-powered sites, each with a separate time-zone setting.
+
+Normally, Django sets the ``os.environ['TZ']`` variable to the time zone you
+specify in the  ``TIME_ZONE`` setting. Thus, all your views and models will
+automatically operate in the correct time zone. However, if you're using the
+manual configuration option (see below), Django will *not* touch the ``TZ``
+environment variable, and it'll be up to you to ensure your processes are
+running in the correct environment.
+
+USE_ETAGS
+---------
+
+Default: ``False``
+
+A boolean that specifies whether to output the "Etag" header. This saves
+bandwidth but slows down performance. This is only used if ``CommonMiddleware``
+is installed (see the `middleware docs`_).
+
+USE_I18N
+--------
+
+Default: ``True``
+
+A boolean that specifies whether Django's internationalization system should be
+enabled. This provides an easy way to turn it off, for performance. If this is
+set to ``False``, Django will make some optimizations so as not to load the
+internationalization machinery.
+
+YEAR_MONTH_FORMAT
+-----------------
+
+Default: ``'F Y'``
+
+The default formatting to use for date fields on Django admin change-list
+pages -- and, possibly, by other parts of the system -- in cases when only the
+year and month are displayed.
+
+For example, when a Django admin change-list page is being filtered by a date
+drilldown, the header for a given month displays the month and the year.
+Different locales have different formats. For example, U.S. English would say
+"January 2006," whereas another locale might say "2006/January."
+
+See `allowed date format strings`_. See also DATE_FORMAT, DATETIME_FORMAT,
+TIME_FORMAT and MONTH_DAY_FORMAT.
+
+.. _cache docs: http://www.djangoproject.com/documentation/cache/
+.. _middleware docs: http://www.djangoproject.com/documentation/middleware/
+.. _session docs: http://www.djangoproject.com/documentation/sessions/
+.. _See available choices: http://www.postgresql.org/docs/current/static/datetime-keywords.html#DATETIME-TIMEZONE-SET-TABLE
+.. _template documentation: http://www.djangoproject.com/documentation/templates_python/
+
+Creating your own settings
+==========================
+
+There's nothing stopping you from creating your own settings, for your own
+Django apps. Just follow these conventions:
+
+    * Setting names are in all uppercase.
+    * For settings that are sequences, use tuples instead of lists. This is
+      purely for performance.
+    * Don't reinvent an already-existing setting.
+
+Using settings without setting DJANGO_SETTINGS_MODULE
+=====================================================
+
+In some cases, you might want to bypass the ``DJANGO_SETTINGS_MODULE``
+environment variable. For example, if you're using the template system by
+itself, you likely don't want to have to set up an environment variable
+pointing to a settings module.
+
+In these cases, you can configure Django's settings manually. Do this by
+calling ``django.conf.settings.configure()``.
+
+Example::
+
+    from django.conf import settings
+
+    settings.configure(DEBUG=True, TEMPLATE_DEBUG=True,
+        TEMPLATE_DIRS=('/home/web-apps/myapp', '/home/web-apps/base'))
+
+Pass ``configure()`` as many keyword arguments as you'd like, with each keyword
+argument representing a setting and its value. Each argument name should be all
+uppercase, with the same name as the settings described above. If a particular
+setting is not passed to ``configure()`` and is needed at some later point,
+Django will use the default setting value.
+
+Configuring Django in this fashion is mostly necessary -- and, indeed,
+recommended -- when you're using a piece of the framework inside a larger
+application.
+
+Consequently, when configured via ``settings.configure()``, Django will not
+make any modifications to the process environment variables. (See the
+explanation of ``TIME_ZONE``, above, for why this would normally occur.) It's
+assumed that you're already in full control of your environment in these cases.
+
+Custom default settings
+-----------------------
+
+If you'd like default values to come from somewhere other than
+``django.conf.global_settings``, you can pass in a module or class that
+provides the default settings as the ``default_settings`` argument (or as the
+first positional argument) in the call to ``configure()``.
+
+In this example, default settings are taken from ``myapp_defaults``, and the
+``DEBUG`` setting is set to ``True``, regardless of its value in
+``myapp_defaults``::
+
+    from django.conf import settings
+    from myapp import myapp_defaults
+
+    settings.configure(default_settings=myapp_defaults, DEBUG=True)
+
+The following example, which uses ``myapp_defaults`` as a positional argument,
+is equivalent::
+
+    settings.configure(myapp_defaults, DEBUG = True)
+
+Normally, you will not need to override the defaults in this fashion. The
+Django defaults are sufficiently tame that you can safely use them. Be aware
+that if you do pass in a new default module, it entirely *replaces* the Django
+defaults, so you must specify a value for every possible setting that might be
+used in that code you are importing. Check in
+``django.conf.settings.global_settings`` for the full list.
+
+Either configure() or DJANGO_SETTINGS_MODULE is required
+--------------------------------------------------------
+
+If you're not setting the ``DJANGO_SETTINGS_MODULE`` environment variable, you
+*must* call ``configure()`` at some point before using any code that reads
+settings.
+
+If you don't set ``DJANGO_SETTINGS_MODULE`` and don't call ``configure()``,
+Django will raise an ``EnvironmentError`` exception the first time a setting
+is accessed.
+
+If you set ``DJANGO_SETTINGS_MODULE``, access settings values somehow, *then*
+call ``configure()``, Django will raise an ``EnvironmentError`` saying settings
+have already been configured.
+
+Also, it's an error to call ``configure()`` more than once, or to call
+``configure()`` after any setting has been accessed.
+
+It boils down to this: Use exactly one of either ``configure()`` or
+``DJANGO_SETTINGS_MODULE``. Not both, and not neither.

Added: vendor/django/current/docs/sites.txt
===================================================================
--- vendor/django/current/docs/sites.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/sites.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,311 @@
+=====================
+The "sites" framework
+=====================
+
+Django comes with an optional "sites" framework. It's a hook for associating
+objects and functionality to particular Web sites, and it's a holding place for
+the domain names and "verbose" names of your Django-powered sites.
+
+Use it if your single Django installation powers more than one site and you
+need to differentiate between those sites in some way.
+
+The whole sites framework is based on two simple concepts:
+
+    * The ``Site`` model, found in ``django.contrib.sites``, has ``domain`` and
+      ``name`` fields.
+    * The ``SITE_ID`` setting specifies the database ID of the ``Site`` object
+      associated with that particular settings file.
+
+How you use this is up to you, but Django uses it in a couple of ways
+automatically via simple conventions.
+
+Example usage
+=============
+
+Why would you use sites? It's best explained through examples.
+
+Associating content with multiple sites
+---------------------------------------
+
+The Django-powered sites LJWorld.com_ and Lawrence.com_ are operated by the
+same news organization -- the Lawrence Journal-World newspaper in Lawrence,
+Kansas. LJWorld.com focuses on news, while Lawrence.com focuses on local
+entertainment. But sometimes editors want to publish an article on *both*
+sites.
+
+The brain-dead way of solving the problem would be to require site producers to
+publish the same story twice: once for LJWorld.com and again for Lawrence.com.
+But that's inefficient for site producers, and it's redundant to store
+multiple copies of the same story in the database.
+
+The better solution is simple: Both sites use the same article database, and an
+article is associated with one or more sites. In Django model terminology,
+that's represented by a ``ManyToManyField`` in the ``Article`` model::
+
+    from django.db import models
+    from django.contrib.sites.models import Site
+
+    class Article(models.Model):
+        headline = models.CharField(maxlength=200)
+        # ...
+        sites = models.ManyToManyField(Site)
+
+This accomplishes several things quite nicely:
+
+    * It lets the site producers edit all content -- on both sites -- in a
+      single interface (the Django admin).
+
+    * It means the same story doesn't have to be published twice in the
+      database; it only has a single record in the database.
+
+    * It lets the site developers use the same Django view code for both sites.
+      The view code that displays a given story just checks to make sure the
+      requested story is on the current site. It looks something like this::
+
+          from django.conf import settings
+
+          def article_detail(request, article_id):
+              try:
+                  a = Article.objects.get(id=article_id, sites__id__exact=settings.SITE_ID)
+              except Article.DoesNotExist:
+                  raise Http404
+              # ...
+
+.. _ljworld.com: http://www.ljworld.com/
+.. _lawrence.com: http://www.lawrence.com/
+
+Associating content with a single site
+--------------------------------------
+
+Similarly, you can associate a model to the ``Site`` model in a many-to-one
+relationship, using ``ForeignKey``.
+
+For example, if an article is only allowed on a single site, you'd use a model
+like this::
+
+    from django.db import models
+    from django.contrib.sites.models import Site
+
+    class Article(models.Model):
+        headline = models.CharField(maxlength=200)
+        # ...
+        site = models.ForeignKey(Site)
+
+This has the same benefits as described in the last section.
+
+Hooking into the current site from views
+----------------------------------------
+
+On a lower level, you can use the sites framework in your Django views to do
+particular things based on what site in which the view is being called.
+For example::
+
+    from django.conf import settings
+
+    def my_view(request):
+        if settings.SITE_ID == 3:
+            # Do something.
+        else:
+            # Do something else.
+
+Of course, it's ugly to hard-code the site IDs like that. This sort of
+hard-coding is best for hackish fixes that you need done quickly. A slightly
+cleaner way of accomplishing the same thing is to check the current site's
+domain::
+
+    from django.conf import settings
+    from django.contrib.sites.models import Site
+
+    def my_view(request):
+        current_site = Site.objects.get(id=settings.SITE_ID)
+        if current_site.domain == 'foo.com':
+            # Do something
+        else:
+            # Do something else.
+
+The idiom of retrieving the ``Site`` object for the value of
+``settings.SITE_ID`` is quite common, so the ``Site`` model's manager has a
+``get_current()`` method. This example is equivalent to the previous one::
+
+    from django.contrib.sites.models import Site
+
+    def my_view(request):
+        current_site = Site.objects.get_current()
+        if current_site.domain == 'foo.com':
+            # Do something
+        else:
+            # Do something else.
+
+Getting the current domain for display
+--------------------------------------
+
+LJWorld.com and Lawrence.com both have e-mail alert functionality, which lets
+readers sign up to get notifications when news happens. It's pretty basic: A
+reader signs up on a Web form, and he immediately gets an e-mail saying,
+"Thanks for your subscription."
+
+It'd be inefficient and redundant to implement this signup-processing code
+twice, so the sites use the same code behind the scenes. But the "thank you for
+signing up" notice needs to be different for each site. By using ``Site``
+objects, we can abstract the "thank you" notice to use the values of the
+current site's ``name`` and ``domain``.
+
+Here's an example of what the form-handling view looks like::
+
+    from django.contrib.sites.models import Site
+    from django.core.mail import send_mail
+
+    def register_for_newsletter(request):
+        # Check form values, etc., and subscribe the user.
+        # ...
+
+        current_site = Site.objects.get_current()
+        send_mail('Thanks for subscribing to %s alerts' % current_site.name,
+            'Thanks for your subscription. We appreciate it.\n\n-The %s team.' % current_site.name,
+            'editor@%s' % current_site.domain,
+            [user.email])
+
+        # ...
+
+On Lawrence.com, this e-mail has the subject line "Thanks for subscribing to
+lawrence.com alerts." On LJWorld.com, the e-mail has the subject "Thanks for
+subscribing to LJWorld.com alerts." Same goes for the e-mail's message body.
+
+Note that an even more flexible (but more heavyweight) way of doing this would
+be to use Django's template system. Assuming Lawrence.com and LJWorld.com have
+different template directories (``TEMPLATE_DIRS``), you could simply farm out
+to the template system like so::
+
+    from django.core.mail import send_mail
+    from django.template import loader, Context
+
+    def register_for_newsletter(request):
+        # Check form values, etc., and subscribe the user.
+        # ...
+
+        subject = loader.get_template('alerts/subject.txt').render(Context({}))
+        message = loader.get_template('alerts/message.txt').render(Context({}))
+        send_mail(subject, message, 'editor at ljworld.com', [user.email])
+
+        # ...
+
+In this case, you'd have to create ``subject.txt`` and ``message.txt`` template
+files for both the LJWorld.com and Lawrence.com template directories. That
+gives you more flexibility, but it's also more complex.
+
+It's a good idea to exploit the ``Site`` objects as much as possible, to remove
+unneeded complexity and redundancy.
+
+Getting the current domain for full URLs
+----------------------------------------
+
+Django's ``get_absolute_url()`` convention is nice for getting your objects'
+URL without the domain name, but in some cases you might want to display the
+full URL -- with ``http://`` and the domain and everything -- for an object.
+To do this, you can use the sites framework. A simple example::
+
+    >>> from django.contrib.sites.models import Site
+    >>> obj = MyModel.objects.get(id=3)
+    >>> obj.get_absolute_url()
+    '/mymodel/objects/3/'
+    >>> Site.objects.get_current().domain
+    'example.com'
+    >>> 'http://%s%s' % (Site.objects.get_current().domain, obj.get_absolute_url())
+    'http://example.com/mymodel/objects/3/'
+
+The ``CurrentSiteManager``
+==========================
+
+If ``Site``\s play a key role in your application, consider using the helpful
+``CurrentSiteManager`` in your model(s). It's a model manager_ that
+automatically filters its queries to include only objects associated with the
+current ``Site``.
+
+Use ``CurrentSiteManager`` by adding it to your model explicitly. For example::
+
+    from django.db import models
+    from django.contrib.sites.models import Site
+    from django.contrib.sites.managers import CurrentSiteManager
+
+    class Photo(models.Model):
+        photo = models.FileField(upload_to='/home/photos')
+        photographer_name = models.CharField(maxlength=100)
+        pub_date = models.DateField()
+        site = models.ForeignKey(Site)
+        objects = models.Manager()
+        on_site = CurrentSiteManager()
+
+With this model, ``Photo.objects.all()`` will return all ``Photo`` objects in
+the database, but ``Photo.on_site.all()`` will return only the ``Photo``
+objects associated with the current site, according to the ``SITE_ID`` setting.
+
+Put another way, these two statements are equivalent::
+
+    Photo.objects.filter(site=settings.SITE_ID)
+    Photo.on_site.all()
+
+How did ``CurrentSiteManager`` know which field of ``Photo`` was the ``Site``?
+It defaults to looking for a field called ``site``. If your model has a
+``ForeignKey`` or ``ManyToManyField`` called something *other* than ``site``,
+you need to explicitly pass that as the parameter to ``CurrentSiteManager``.
+The following model, which has a field called ``publish_on``, demonstrates
+this::
+
+    from django.db import models
+    from django.contrib.sites.models import Site
+    from django.contrib.sites.managers import CurrentSiteManager
+
+    class Photo(models.Model):
+        photo = models.FileField(upload_to='/home/photos')
+        photographer_name = models.CharField(maxlength=100)
+        pub_date = models.DateField()
+        publish_on = models.ForeignKey(Site)
+        objects = models.Manager()
+        on_site = CurrentSiteManager('publish_on')
+
+If you attempt to use ``CurrentSiteManager`` and pass a field name that doesn't
+exist, Django will raise a ``ValueError``.
+
+.. _manager: http://www.djangoproject.com/documentation/model_api/#managers
+
+How Django uses the sites framework
+===================================
+
+Although it's not required that you use the sites framework, it's strongly
+encouraged, because Django takes advantage of it in a few places. Even if your
+Django installation is powering only a single site, you should take the two
+seconds to create the site object with your ``domain`` and ``name``, and point
+to its ID in your ``SITE_ID`` setting.
+
+Here's how Django uses the sites framework:
+
+    * In the `redirects framework`_, each redirect object is associated with a
+      particular site. When Django searches for a redirect, it takes into
+      account the current ``SITE_ID``.
+
+    * In the comments framework, each comment is associated with a particular
+      site. When a comment is posted, its ``site`` is set to the current
+      ``SITE_ID``, and when comments are listed via the appropriate template
+      tag, only the comments for the current site are displayed.
+
+    * In the `flatpages framework`_, each flatpage is associated with a
+      particular site. When a flatpage is created, you specify its ``site``,
+      and the ``FlatpageFallbackMiddleware`` checks the current ``SITE_ID`` in
+      retrieving flatpages to display.
+
+    * In the `syndication framework`_, the templates for ``title`` and
+      ``description`` automatically have access to a variable ``{{{ site }}}``,
+      which is the ``Site`` object representing the current site. Also, the
+      hook for providing item URLs will use the ``domain`` from the current
+      ``Site`` object if you don't specify a fully-qualified domain.
+
+    * In the `authentication framework`_, the ``django.contrib.auth.views.login``
+      view passes the current ``Site`` name to the template as ``{{{ site_name }}}``.
+
+    * The shortcut view (``django.views.defaults.shortcut``) uses the domain of
+      the current ``Site`` object when calculating an object's URL.
+
+.. _redirects framework: http://www.djangoproject.com/documentation/redirects/
+.. _flatpages framework: http://www.djangoproject.com/documentation/flatpages/
+.. _syndication framework: http://www.djangoproject.com/documentation/syndication/
+.. _authentication framework: http://www.djangoproject.com/documentation/authentication/

Added: vendor/django/current/docs/static_files.txt
===================================================================
--- vendor/django/current/docs/static_files.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/static_files.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,125 @@
+=========================
+How to serve static files
+=========================
+
+Django itself doesn't serve static (media) files, such as images, style sheets,
+or video. It leaves that job to whichever Web server you choose.
+
+The reasoning here is that standard Web servers, such as Apache_ and lighttpd_,
+are much more fine-tuned at serving static files than a Web application
+framework.
+
+With that said, Django does support static files **during development**. Use
+the view ``django.views.static.serve`` to serve media files.
+
+.. _Apache: http://httpd.apache.org/
+.. _lighttpd: http://www.lighttpd.net/
+
+The big, fat disclaimer
+=======================
+
+Using this method is **inefficient** and **insecure**. Do not use this in a
+production setting. Use this only for development.
+
+For information on serving static files in an Apache production environment,
+see the `Django mod_python documentation`_.
+
+.. _Django mod_python documentation: http://www.djangoproject.com/documentation/modpython/#serving-media-files
+
+How to do it
+============
+
+Just put this in your URLconf_::
+
+    (r'^site_media/(.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}),
+
+...where ``site_media`` is the URL where your media will be rooted, and
+``/path/to/media`` is the filesystem root for your media.
+
+You must pass a ``document_root`` parameter to indicate the filesystem root.
+
+Examples:
+
+    * The file ``/path/to/media/foo.jpg`` will be made available at the URL
+      ``/site_media/foo.jpg``.
+
+    * The file ``/path/to/media/css/mystyles.css`` will be made available
+      at the URL ``/site_media/css/mystyles.css``.
+
+    * The file ``/path/bar.jpg`` will not be accessible, because it doesn't
+      fall under the document root.
+
+.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+
+Directory listings
+==================
+
+Optionally, you can pass a ``show_indexes`` parameter to the ``static.serve``
+view. This is ``False`` by default. If it's ``True``, Django will display file
+listings for directories.
+
+Example::
+
+    (r'^site_media/(.*)$', 'django.views.static.serve', {'document_root': '/path/to/media', 'show_indexes': True}),
+
+You can customize the index view by creating a template called
+``static/directory_index``. That template gets two objects in its context:
+
+    * ``directory`` -- the directory name (a string)
+    * ``file_list`` -- a list of file names (as strings) in the directory
+
+Here's the default ``static/directory_index`` template::
+
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+        <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
+        <meta http-equiv="Content-Language" content="en-us" />
+        <meta name="robots" content="NONE,NOARCHIVE" />
+        <title>Index of {{ directory }}</title>
+    </head>
+    <body>
+        <h1>Index of {{ directory }}</h1>
+        <ul>
+        {% for f in file_list %}
+        <li><a href="{{ f }}">{{ f }}</a></li>
+        {% endfor %}
+        </ul>
+    </body>
+    </html>
+
+Limiting use to DEBUG=True
+==========================
+
+Because URLconfs are just plain Python modules, you can use Python logic to
+make the static-media view available only in development mode. This is a handy
+trick to make sure the static-serving view doesn't slip into a production
+setting by mistake.
+
+Do this by wrapping an ``if DEBUG`` statement around the
+``django.views.static.serve`` inclusion. Here's a full example URLconf::
+
+    from django.conf.urls.defaults import *
+    from django.conf import settings
+
+    urlpatterns = patterns('',
+        (r'^/articles/2003/$', 'news.views.special_case_2003'),
+        (r'^/articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
+        (r'^/articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
+        (r'^/articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
+    )
+
+    if settings.DEBUG:
+        urlpatterns += patterns('',
+            (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': '/path/to/media'}),
+        )
+
+This code is straightforward. It imports the settings and checks the value of
+the ``DEBUG`` setting. If it evaluates to ``True``, then ``site_media`` will be
+associated with the ``django.views.static.serve`` view. If not
+(``DEBUG == False``), then the view won't be made available.
+
+Of course, the catch here is that you'll have to remember to set ``DEBUG=False``
+in your production settings file. But you should be doing that anyway.
+
+.. _DEBUG setting: http://www.djangoproject.com/documentation/settings/#debug

Added: vendor/django/current/docs/syndication_feeds.txt
===================================================================
--- vendor/django/current/docs/syndication_feeds.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/syndication_feeds.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,724 @@
+==============================
+The syndication feed framework
+==============================
+
+Django comes with a high-level syndication-feed-generating framework that makes
+creating RSS_ and Atom_ feeds easy.
+
+To create any syndication feed, all you have to do is write a short Python
+class. You can create as many feeds as you want.
+
+Django also comes with a lower-level feed-generating API. Use this if you want
+to generate feeds outside of a Web context, or in some other lower-level way.
+
+.. _RSS: http://www.whatisrss.com/
+.. _Atom: http://www.atomenabled.org/
+
+The high-level framework
+========================
+
+Overview
+--------
+
+The high-level feed-generating framework is a view that's hooked to ``/feeds/``
+by default. Django uses the remainder of the URL (everything after ``/feeds/``)
+to determine which feed to output.
+
+To create a feed, just write a ``Feed`` class and point to it in your URLconf_.
+
+.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+
+Initialization
+--------------
+
+To activate syndication feeds on your Django site, add this line to your
+URLconf_::
+
+    (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}),
+
+This tells Django to use the RSS framework to handle all URLs starting with
+``"feeds/"``. (You can change that ``"feeds/"`` prefix to fit your own needs.)
+
+This URLconf line has an extra argument: ``{'feed_dict': feeds}``. Use this
+extra argument to pass the syndication framework the feeds that should be
+published under that URL.
+
+Specifically, ``feed_dict`` should be a dictionary that maps a feed's slug
+(short URL label) to its ``Feed`` class.
+
+You can define the ``feed_dict`` in the URLconf itself. Here's a full example
+URLconf::
+
+    from django.conf.urls.defaults import *
+    from myproject.feeds import LatestEntries, LatestEntriesByCategory
+
+    feeds = {
+        'latest': LatestEntries,
+        'categories': LatestEntriesByCategory,
+    }
+
+    urlpatterns = patterns('',
+        # ...
+        (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',
+            {'feed_dict': feeds}),
+        # ...
+    )
+
+The above example registers two feeds:
+
+    * The feed represented by ``LatestEntries`` will live at ``feeds/latest/``.
+    * The feed represented by ``LatestEntriesByCategory`` will live at
+      ``feeds/categories/``.
+
+Once that's set up, you just need to define the ``Feed`` classes themselves.
+
+.. _URLconf: http://www.djangoproject.com/documentation/url_dispatch/
+.. _settings file: http://www.djangoproject.com/documentation/settings/
+
+Feed classes
+------------
+
+A ``Feed`` class is a simple Python class that represents a syndication feed.
+A feed can be simple (e.g., a "site news" feed, or a basic feed displaying
+the latest entries of a blog) or more complex (e.g., a feed displaying all the
+blog entries in a particular category, where the category is variable).
+
+``Feed`` classes must subclass ``django.contrib.syndication.feeds.Feed``. They
+can live anywhere in your codebase.
+
+A simple example
+----------------
+
+This simple example, taken from `chicagocrime.org`_, describes a feed of the
+latest five news items::
+
+    from django.contrib.syndication.feeds import Feed
+    from chicagocrime.models import NewsItem
+
+    class SiteNewsFeed(Feed):
+        title = "Chicagocrime.org site news"
+        link = "/sitenews/"
+        description = "Updates on changes and additions to chicagocrime.org."
+
+        def items(self):
+            return NewsItem.objects.order_by('-pub_date')[:5]
+
+Note:
+
+    * The class subclasses ``django.contrib.syndication.feeds.Feed``.
+    * ``title``, ``link`` and ``description`` correspond to the standard
+      RSS ``<title>``, ``<link>`` and ``<description>`` elements, respectively.
+    * ``items()`` is, simply, a method that returns a list of objects that
+      should be included in the feed as ``<item>`` elements. Although this
+      example returns ``NewsItem`` objects using Django's
+      `object-relational mapper`_, ``items()`` doesn't have to return model
+      instances. Although you get a few bits of functionality "for free" by
+      using Django models, ``items()`` can return any type of object you want.
+
+One thing's left to do. In an RSS feed, each ``<item>`` has a ``<title>``,
+``<link>`` and ``<description>``. We need to tell the framework what data to
+put into those elements.
+
+    * To specify the contents of ``<title>`` and ``<description>``, create
+      `Django templates`_ called ``feeds/sitenews_title.html`` and
+      ``feeds/sitenews_description.html``, where ``sitenews`` is the ``slug``
+      specified in the URLconf for the given feed. Note the ``.html`` extension
+      is required. The RSS system renders that template for each item, passing
+      it two template context variables:
+
+          * ``{{ obj }}`` -- The current object (one of whichever objects you
+            returned in ``items()``).
+          * ``{{ site }}`` -- A ``django.models.core.sites.Site`` object
+            representing the current site. This is useful for
+            ``{{ site.domain }}`` or ``{{ site.name }}``.
+
+      If you don't create a template for either the title or description, the
+      framework will use the template ``"{{ obj }}"`` by default -- that is,
+      the normal string representation of the object. You can also change the
+      names of these two templates by specifying ``title_template`` and
+      ``description_template`` as attributes of your ``Feed`` class.
+    * To specify the contents of ``<link>``, you have two options. For each
+      item in ``items()``, Django first tries executing a
+      ``get_absolute_url()`` method on that object. If that method doesn't
+      exist, it tries calling a method ``item_link()`` in the ``Feed`` class,
+      passing it a single parameter, ``item``, which is the object itself.
+      Both ``get_absolute_url()`` and ``item_link()`` should return the item's
+      URL as a normal Python string.
+
+.. _chicagocrime.org: http://www.chicagocrime.org/
+.. _object-relational mapper: http://www.djangoproject.com/documentation/db_api/
+.. _Django templates: http://www.djangoproject.com/documentation/templates/
+
+A complex example
+-----------------
+
+The framework also supports more complex feeds, via parameters.
+
+For example, `chicagocrime.org`_ offers an RSS feed of recent crimes for every
+police beat in Chicago. It'd be silly to create a separate ``Feed`` class for
+each police beat; that would violate the `DRY principle`_ and would couple data
+to programming logic. Instead, the syndication framework lets you make generic
+feeds that output items based on information in the feed's URL.
+
+On chicagocrime.org, the police-beat feeds are accessible via URLs like this:
+
+    * ``/rss/beats/0613/`` -- Returns recent crimes for beat 0613.
+    * ``/rss/beats/1424/`` -- Returns recent crimes for beat 1424.
+
+The slug here is ``"beats"``. The syndication framework sees the extra URL bits
+after the slug -- ``0613`` and ``1424`` -- and gives you a hook to tell it what
+those URL bits mean, and how they should influence which items get published in
+the feed.
+
+An example makes this clear. Here's the code for these beat-specific feeds::
+
+    class BeatFeed(Feed):
+        def get_object(self, bits):
+            # In case of "/rss/beats/0613/foo/bar/baz/", or other such clutter,
+            # check that bits has only one member.
+            if len(bits) != 1:
+                raise ObjectDoesNotExist
+            return Beat.objects.get(beat__exact=bits[0])
+
+        def title(self, obj):
+            return "Chicagocrime.org: Crimes for beat %s" % obj.beat
+
+        def link(self, obj):
+            return obj.get_absolute_url()
+
+        def description(self, obj):
+            return "Crimes recently reported in police beat %s" % obj.beat
+
+        def items(self, obj):
+            return Crime.objects.filter(beat__id__exact=obj.id).order_by('-crime_date')[:30]
+
+Here's the basic algorithm the RSS framework follows, given this class and a
+request to the URL ``/rss/beats/0613/``:
+
+    * The framework gets the URL ``/rss/beats/0613/`` and notices there's
+      an extra bit of URL after the slug. It splits that remaining string by
+      the slash character (``"/"``) and calls the ``Feed`` class'
+      ``get_object()`` method, passing it the bits. In this case, bits is
+      ``['0613']``. For a request to ``/rss/beats/0613/foo/bar/``, bits would
+      be ``['0613', 'foo', 'bar']``.
+    * ``get_object()`` is responsible for retrieving the given beat, from the
+      given ``bits``. In this case, it uses the Django database API to retrieve
+      the beat. Note that ``get_object()`` should raise
+      ``django.core.exceptions.ObjectDoesNotExist`` if given invalid
+      parameters. There's no ``try``/``except`` around the
+      ``Beat.objects.get()`` call, because it's not necessary; that function
+      raises ``Beat.DoesNotExist`` on failure, and ``Beat.DoesNotExist`` is a
+      subclass of ``ObjectDoesNotExist``. Raising ``ObjectDoesNotExist`` in
+      ``get_object()`` tells Django to produce a 404 error for that request.
+    * To generate the feed's ``<title>``, ``<link>`` and ``<description>``,
+      Django uses the ``title()``, ``link()`` and ``description()`` methods. In
+      the previous example, they were simple string class attributes, but this
+      example illustrates that they can be either strings *or* methods. For
+      each of ``title``, ``link`` and ``description``, Django follows this
+      algorithm:
+
+          * First, it tries to call a method, passing the ``obj`` argument, where
+            ``obj`` is the object returned by ``get_object()``.
+          * Failing that, it tries to call a method with no arguments.
+          * Failing that, it uses the class attribute.
+
+    * Finally, note that ``items()`` in this example also takes the ``obj``
+      argument. The algorithm for ``items`` is the same as described in the
+      previous step -- first, it tries ``items(obj)``, then ``items()``, then
+      finally an ``items`` class attribute (which should be a list).
+
+The ``ExampleFeed`` class below gives full documentation on methods and
+attributes of ``Feed`` classes.
+
+.. _DRY principle: http://c2.com/cgi/wiki?DontRepeatYourself
+
+Specifying the type of feed
+---------------------------
+
+By default, feeds produced in this framework use RSS 2.0.
+
+To change that, add a ``feed_type`` attribute to your ``Feed`` class, like so::
+
+    from django.utils.feedgenerator import Atom1Feed
+
+    class MyFeed(Feed):
+        feed_type = Atom1Feed
+
+Note that you set ``feed_type`` to a class object, not an instance.
+
+Currently available feed types are:
+
+    * ``django.utils.feedgenerator.Rss201rev2Feed`` (RSS 2.01. Default.)
+    * ``django.utils.feedgenerator.RssUserland091Feed`` (RSS 0.91.)
+    * ``django.utils.feedgenerator.Atom1Feed`` (Atom 1.0.)
+
+Enclosures
+----------
+
+To specify enclosures, such as those used in creating podcast feeds, use the
+``item_enclosure_url``, ``item_enclosure_length`` and
+``item_enclosure_mime_type`` hooks. See the ``ExampleFeed`` class below for
+usage examples.
+
+Language
+--------
+
+Feeds created by the syndication framework automatically include the
+appropriate ``<language>`` tag (RSS 2.0) or ``xml:lang`` attribute (Atom). This
+comes directly from your `LANGUAGE_CODE setting`_.
+
+.. _LANGUAGE_CODE setting: http://www.djangoproject.com/documentation/settings/#language-code
+
+URLs
+----
+
+The ``link`` method/attribute can return either an absolute URL (e.g.
+``"/blog/"``) or a URL with the fully-qualified domain and protocol (e.g.
+``"http://www.example.com/blog/"``). If ``link`` doesn't return the domain,
+the syndication framework will insert the domain of the current site, according
+to your `SITE_ID setting`_.
+
+Atom feeds require a ``<link rel="self">`` that defines the feed's current
+location. The syndication framework populates this automatically, using the
+domain of the current site according to the SITE_ID setting.
+
+.. _SITE_ID setting: http://www.djangoproject.com/documentation/settings/#site-id
+
+Publishing Atom and RSS feeds in tandem
+---------------------------------------
+
+Some developers like to make available both Atom *and* RSS versions of their
+feeds. That's easy to do with Django: Just create a subclass of your ``feed``
+class and set the ``feed_type`` to something different. Then update your
+URLconf to add the extra versions.
+
+Here's a full example::
+
+    from django.contrib.syndication.feeds import Feed
+    from chicagocrime.models import NewsItem
+    from django.utils.feedgenerator import Atom1Feed
+
+    class RssSiteNewsFeed(Feed):
+        title = "Chicagocrime.org site news"
+        link = "/sitenews/"
+        description = "Updates on changes and additions to chicagocrime.org."
+
+        def items(self):
+            return NewsItem.objects.order_by('-pub_date')[:5]
+
+    class AtomSiteNewsFeed(RssSiteNewsFeed):
+        feed_type = Atom1Feed
+
+And the accompanying URLconf::
+
+    from django.conf.urls.defaults import *
+    from myproject.feeds import RssSiteNewsFeed, AtomSiteNewsFeed
+
+    feeds = {
+        'rss': RssSiteNewsFeed,
+        'atom': AtomSiteNewsFeed,
+    }
+
+    urlpatterns = patterns('',
+        # ...
+        (r'^feeds/(?P<url>.*)/$', 'django.contrib.syndication.views.feed',
+            {'feed_dict': feeds}),
+        # ...
+    )
+
+Feed class reference
+--------------------
+
+This example illustrates all possible attributes and methods for a ``Feed`` class::
+
+    from django.contrib.syndication.feeds import Feed
+    from django.utils import feedgenerator
+
+    class ExampleFeed(Feed):
+
+        # FEED TYPE -- Optional. This should be a class that subclasses
+        # django.utils.feedgenerator.SyndicationFeed. This designates which
+        # type of feed this should be: RSS 2.0, Atom 1.0, etc.
+        # If you don't specify feed_type, your feed will be RSS 2.0.
+        # This should be a class, not an instance of the class.
+
+        feed_type = feedgenerator.Rss201rev2Feed
+
+        # TEMPLATE NAMES -- Optional. These should be strings representing
+        # names of Django templates that the system should use in rendering the
+        # title and description of your feed items. Both are optional.
+        # If you don't specify one, or either, Django will use the template
+        # 'feeds/SLUG_title.html' and 'feeds/SLUG_description.html', where SLUG
+        # is the slug you specify in the URL.
+
+        title_template = None
+        description_template = None
+
+        # TITLE -- One of the following three is required. The framework looks
+        # for them in this order.
+
+        def title(self, obj):
+            """
+            Takes the object returned by get_object() and returns the feed's
+            title as a normal Python string.
+            """
+
+        def title(self):
+            """
+            Returns the feed's title as a normal Python string.
+            """
+
+        title = 'foo' # Hard-coded title.
+
+        # LINK -- One of the following three is required. The framework looks
+        # for them in this order.
+
+        def link(self, obj):
+            """
+            Takes the object returned by get_object() and returns the feed's
+            link as a normal Python string.
+            """
+
+        def link(self):
+            """
+            Returns the feed's link as a normal Python string.
+            """
+
+        link = '/foo/bar/' # Hard-coded link.
+
+        # DESCRIPTION -- One of the following three is required. The framework
+        # looks for them in this order.
+
+        def description(self, obj):
+            """
+            Takes the object returned by get_object() and returns the feed's
+            description as a normal Python string.
+            """
+
+        def description(self):
+            """
+            Returns the feed's description as a normal Python string.
+            """
+
+        description = 'Foo bar baz.' # Hard-coded description.
+
+        # AUTHOR NAME --One of the following three is optional. The framework
+        # looks for them in this order.
+
+        def author_name(self, obj):
+            """
+            Takes the object returned by get_object() and returns the feed's
+            author's name as a normal Python string.
+            """
+
+        def author_name(self):
+            """
+            Returns the feed's author's name as a normal Python string.
+            """
+
+        author_name = 'Sally Smith' # Hard-coded author name.
+
+        # AUTHOR E-MAIL --One of the following three is optional. The framework
+        # looks for them in this order.
+
+        def author_email(self, obj):
+            """
+            Takes the object returned by get_object() and returns the feed's
+            author's e-mail as a normal Python string.
+            """
+
+        def author_email(self):
+            """
+            Returns the feed's author's e-mail as a normal Python string.
+            """
+
+        author_email = 'test at example.com' # Hard-coded author e-mail.
+
+        # AUTHOR LINK --One of the following three is optional. The framework
+        # looks for them in this order. In each case, the URL should include
+        # the "http://" and domain name.
+
+        def author_link(self, obj):
+            """
+            Takes the object returned by get_object() and returns the feed's
+            author's URL as a normal Python string.
+            """
+
+        def author_link(self):
+            """
+            Returns the feed's author's URL as a normal Python string.
+            """
+
+        author_link = 'http://www.example.com/' # Hard-coded author URL.
+
+        # CATEGORIES -- One of the following three is optional. The framework
+        # looks for them in this order. In each case, the method/attribute
+        # should return an iterable object that returns strings.
+
+        def categories(self, obj):
+            """
+            Takes the object returned by get_object() and returns the feed's
+            categories as iterable over strings.
+            """
+
+        def categories(self):
+            """
+            Returns the feed's categories as iterable over strings.
+            """
+
+        categories = ("python", "django") # Hard-coded list of categories.
+
+        # ITEMS -- One of the following three is required. The framework looks
+        # for them in this order.
+
+        def items(self, obj):
+            """
+            Takes the object returned by get_object() and returns a list of
+            items to publish in this feed.
+            """
+
+        def items(self):
+            """
+            Returns a list of items to publish in this feed.
+            """
+
+        items = ('Item 1', 'Item 2') # Hard-coded items.
+
+        # GET_OBJECT -- This is required for feeds that publish different data
+        # for different URL parameters. (See "A complex example" above.)
+
+        def get_object(self, bits):
+            """
+            Takes a list of strings gleaned from the URL and returns an object
+            represented by this feed. Raises
+            django.core.exceptions.ObjectDoesNotExist on error.
+            """
+
+        # ITEM LINK -- One of these three is required. The framework looks for
+        # them in this order.
+
+        # First, the framework tries the get_absolute_url() method on each item
+        # returned by items(). Failing that, it tries these two methods:
+
+        def item_link(self, item):
+            """
+            Takes an item, as returned by items(), and returns the item's URL.
+            """
+
+        def item_link(self):
+            """
+            Returns the URL for every item in the feed.
+            """
+
+        # ITEM AUTHOR NAME --One of the following three is optional. The
+        # framework looks for them in this order.
+
+        def item_author_name(self, item):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            author's name as a normal Python string.
+            """
+
+        def item_author_name(self):
+            """
+            Returns the author name for every item in the feed.
+            """
+
+        item_author_name = 'Sally Smith' # Hard-coded author name.
+
+        # ITEM AUTHOR E-MAIL --One of the following three is optional. The
+        # framework looks for them in this order.
+        #
+        # If you specify this, you must specify item_author_name.
+
+        def item_author_email(self, obj):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            author's e-mail as a normal Python string.
+            """
+
+        def item_author_email(self):
+            """
+            Returns the author e-mail for every item in the feed.
+            """
+
+        item_author_email = 'test at example.com' # Hard-coded author e-mail.
+
+        # ITEM AUTHOR LINK --One of the following three is optional. The
+        # framework looks for them in this order. In each case, the URL should
+        # include the "http://" and domain name.
+        #
+        # If you specify this, you must specify item_author_name.
+
+        def item_author_link(self, obj):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            author's URL as a normal Python string.
+            """
+
+        def item_author_link(self):
+            """
+            Returns the author URL for every item in the feed.
+            """
+
+        item_author_link = 'http://www.example.com/' # Hard-coded author URL.
+
+        # ITEM ENCLOSURE URL -- One of these three is required if you're
+        # publishing enclosures. The framework looks for them in this order.
+
+        def item_enclosure_url(self, item):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            enclosure URL.
+            """
+
+        def item_enclosure_url(self):
+            """
+            Returns the enclosure URL for every item in the feed.
+            """
+
+        item_enclosure_url = "/foo/bar.mp3" # Hard-coded enclosure link.
+
+        # ITEM ENCLOSURE LENGTH -- One of these three is required if you're
+        # publishing enclosures. The framework looks for them in this order.
+        # In each case, the returned value should be either an integer, or a
+        # string representation of the integer, in bytes.
+
+        def item_enclosure_length(self, item):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            enclosure length.
+            """
+
+        def item_enclosure_length(self):
+            """
+            Returns the enclosure length for every item in the feed.
+            """
+
+        item_enclosure_length = 32000 # Hard-coded enclosure length.
+
+        # ITEM ENCLOSURE MIME TYPE -- One of these three is required if you're
+        # publishing enclosures. The framework looks for them in this order.
+
+        def item_enclosure_mime_type(self, item):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            enclosure mime type.
+            """
+
+        def item_enclosure_mime_type(self):
+            """
+            Returns the enclosure length, in bytes, for every item in the feed.
+            """
+
+        item_enclosure_mime_type = "audio/mpeg" # Hard-coded enclosure mime-type.
+
+        # ITEM PUBDATE -- It's optional to use one of these three. This is a
+        # hook that specifies how to get the pubdate for a given item.
+        # In each case, the method/attribute should return a Python
+        # datetime.datetime object.
+
+        def item_pubdate(self, item):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            pubdate.
+            """
+
+        def item_pubdate(self):
+            """
+            Returns the pubdate for every item in the feed.
+            """
+
+        item_pubdate = datetime.datetime(2005, 5, 3) # Hard-coded pubdate.
+
+        # ITEM CATEGORIES -- It's optional to use one of these three. This is
+        # a hook that specifies how to get the list of categories for a given
+        # item. In each case, the method/attribute should return an iterable
+        # object that returns strings.
+
+        def item_categories(self, item):
+            """
+            Takes an item, as returned by items(), and returns the item's
+            categories.
+            """
+
+        def item_categories(self):
+            """
+            Returns the categories for every item in the feed.
+            """
+
+        item_categories = ("python", "django") # Hard-coded categories.
+
+
+The low-level framework
+=======================
+
+Behind the scenes, the high-level RSS framework uses a lower-level framework
+for generating feeds' XML. This framework lives in a single module:
+`django/utils/feedgenerator.py`_.
+
+Feel free to use this framework on your own, for lower-level tasks.
+
+The ``feedgenerator`` module contains a base class ``SyndicationFeed`` and
+several subclasses:
+
+    * ``RssUserland091Feed``
+    * ``Rss201rev2Feed``
+    * ``Atom1Feed``
+
+Each of these three classes knows how to render a certain type of feed as XML.
+They share this interface:
+
+``__init__(title, link, description, language=None, author_email=None,``
+``author_name=None, author_link=None, subtitle=None, categories=None,``
+``feed_url=None)``
+
+Initializes the feed with the given metadata, which applies to the entire feed
+(i.e., not just to a specific item in the feed).
+
+All parameters, if given, should be Unicode objects, except ``categories``,
+which should be a sequence of Unicode objects.
+
+``add_item(title, link, description, author_email=None, author_name=None,``
+``pubdate=None, comments=None, unique_id=None, enclosure=None, categories=())``
+
+Add an item to the feed with the given parameters. All parameters, if given,
+should be Unicode objects, except:
+
+    * ``pubdate`` should be a `Python datetime object`_.
+    * ``enclosure`` should be an instance of ``feedgenerator.Enclosure``.
+    * ``categories`` should be a sequence of Unicode objects.
+
+``write(outfile, encoding)``
+
+Outputs the feed in the given encoding to outfile, which is a file-like object.
+
+``writeString(encoding)``
+
+Returns the feed as a string in the given encoding.
+
+Example usage
+-------------
+
+This example creates an Atom 1.0 feed and prints it to standard output::
+
+    >>> from django.utils import feedgenerator
+    >>> f = feedgenerator.Atom1Feed(
+    ...     title=u"My Weblog",
+    ...     link=u"http://www.example.com/",
+    ...     description=u"In which I write about what I ate today.",
+    ...     language=u"en"),
+    >>> f.add_item(title=u"Hot dog today",
+    ...     link=u"http://www.example.com/entries/1/",
+    ...     description=u"<p>Today I had a Vienna Beef hot dog. It was pink, plump and perfect.</p>")
+    >>> print f.writeString('utf8')
+    <?xml version="1.0" encoding="utf8"?>
+    <feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title>My Weblog</title>
+    <link href="http://www.example.com/"></link><id>http://www.example.com/</id>
+    <updated>Sat, 12 Nov 2005 00:28:43 -0000</updated><entry><title>Hot dog today</title>
+    <link>http://www.example.com/entries/1/</link><id>tag:www.example.com/entries/1/</id>
+    <summary type="html">&lt;p&gt;Today I had a Vienna Beef hot dog. It was pink, plump and perfect.&lt;/p&gt;</summary>
+    </entry></feed>
+
+.. _django/utils/feedgenerator.py: http://code.djangoproject.com/browser/django/trunk/django/utils/feedgenerator.py
+.. _Python datetime object: http://www.python.org/doc/current/lib/module-datetime.html

Added: vendor/django/current/docs/templates.txt
===================================================================
--- vendor/django/current/docs/templates.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/templates.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1173 @@
+==================================================
+The Django template language: For template authors
+==================================================
+
+Django's template language is designed to strike a balance between power and
+ease. It's designed to feel comfortable to those used to working with HTML. If
+you have any exposure to other text-based template languages, such as Smarty_
+or CheetahTemplate_, you should feel right at home with Django's templates.
+
+.. _Smarty: http://smarty.php.net/
+.. _CheetahTemplate: http://www.cheetahtemplate.org/
+
+Templates
+=========
+
+A template is simply a text file. It can generate any text-based format (HTML,
+XML, CSV, etc.).
+
+A template contains **variables**, which get replaced with values when the
+template is evaluated, and **tags**, which control the logic of the template.
+
+Below is a minimal template that illustrates a few basics. Each element will be
+explained later in this document.::
+
+    {% extends "base_generic.html" %}
+
+    {% block title %}{{ section.title }}{% endblock %}
+
+    {% block content %}
+    <h1>{{ section.title }}</h1>
+
+    {% for story in story_list %}
+    <h2>
+      <a href="{{ story.get_absolute_url }}">
+        {{ story.headline|upper }}
+      </a>
+    </h2>
+    <p>{{ story.tease|truncatewords:"100" }}</p>
+    {% endfor %}
+    {% endblock %}
+
+.. admonition:: Philosophy
+
+    Why use a text-based template instead of an XML-based one (like Zope's
+    TAL)? We wanted Django's template language to be usable for more than
+    just XML/HTML templates. At World Online, we use it for e-mails,
+    JavaScript and CSV. You can use the template language for any text-based
+    format.
+
+    Oh, and one more thing: Making humans edit XML is sadistic!
+
+Variables
+=========
+
+Variables look like this: ``{{ variable }}``. When the template engine
+encounters a variable, it evaluates that variable and replaces it with the
+result.
+
+Use a dot (``.``) to access attributes of a variable.
+
+.. admonition:: Behind the scenes
+
+    Technically, when the template system encounters a dot, it tries the
+    following lookups, in this order:
+
+        * Dictionary lookup
+        * Attribute lookup
+        * Method call
+        * List-index lookup
+
+In the above example, ``{{ section.title }}`` will be replaced with the
+``title`` attribute of the ``section`` object.
+
+If you use a variable that doesn't exist, the template system will insert
+the value of the ``TEMPLATE_STRING_IF_INVALID`` setting, which is set to ``''``
+(the empty string) by default.
+
+See `Using the built-in reference`_, below, for help on finding what variables
+are available in a given template.
+
+Filters
+=======
+
+You can modify variables for display by using **filters**.
+
+Filters look like this: ``{{ name|lower }}``. This displays the value of the
+``{{ name }}`` variable after being filtered through the ``lower`` filter,
+which converts text to lowercase. Use a pipe (``|``) to apply a filter.
+
+Filters can be "chained." The output of one filter is applied to the next.
+``{{ text|escape|linebreaks }}`` is a common idiom for escaping text contents,
+then converting line breaks to ``<p>`` tags.
+
+Some filters take arguments. A filter argument looks like this:
+``{{ bio|truncatewords:"30" }}``. This will display the first 30 words of the
+``bio`` variable. Filter arguments always are in double quotes.
+
+The `Built-in filter reference`_ below describes all the built-in filters.
+
+Tags
+====
+
+Tags look like this: ``{% tag %}``. Tags are more complex than variables: Some
+create text in the output, some control flow by performing loops or logic, and
+some load external information into the template to be used by later variables.
+
+Some tags require beginning and ending tags (i.e.
+``{% tag %} ... tag contents ... {% endtag %}``). The `Built-in tag reference`_
+below describes all the built-in tags. You can create your own tags, if you
+know how to write Python code.
+
+Template inheritance
+====================
+
+The most powerful -- and thus the most complex -- part of Django's template
+engine is template inheritance. Template inheritance allows you to build a base
+"skeleton" template that contains all the common elements of your site and
+defines **blocks** that child templates can override.
+
+It's easiest to understand template inheritance by starting with an example::
+
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+        <link rel="stylesheet" href="style.css" />
+        <title>{% block title %}My amazing site{% endblock %}</title>
+    </head>
+
+    <body>
+        <div id="sidebar">
+            {% block sidebar %}
+            <ul>
+                <li><a href="/">Home</a></li>
+                <li><a href="/blog/">Blog</a></li>
+            </ul>
+            {% endblock %}
+        </div>
+
+        <div id="content">
+            {% block content %}{% endblock %}
+        </div>
+    </body>
+
+This template, which we'll call ``base.html``, defines a simple HTML skeleton
+document that you might use for a simple two-column page. It's the job of
+"child" templates to fill the empty blocks with content.
+
+In this example, the ``{% block %}`` tag defines three blocks that child
+templates can fill in. All the ``block`` tag does is to tell the template
+engine that a child template may override those portions of the template.
+
+A child template might look like this::
+
+    {% extends "base.html" %}
+
+    {% block title %}My amazing blog{% endblock %}
+
+    {% block content %}
+    {% for entry in blog_entries %}
+        <h2>{{ entry.title }}</h2>
+        <p>{{ entry.body }}</p>
+    {% endfor %}
+    {% endblock %}
+
+The ``{% extends %}`` tag is the key here. It tells the template engine that
+this template "extends" another template. When the template system evaluates
+this template, first it locates the parent -- in this case, "base.html".
+
+At that point, the template engine will notice the three ``{% block %}`` tags
+in ``base.html`` and replace those blocks with the contents of the child
+template. Depending on the value of ``blog_entries``, the output might look
+like::
+
+    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
+        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+    <head>
+        <link rel="stylesheet" href="style.css" />
+        <title>My amazing blog</title>
+    </head>
+
+    <body>
+        <div id="sidebar">
+            <ul>
+                <li><a href="/">Home</a></li>
+                <li><a href="/blog/">Blog</a></li>
+            </ul>
+        </div>
+
+        <div id="content">
+            <h2>Entry one</h2>
+            <p>This is my first entry.</p>
+
+            <h2>Entry two</h2>
+            <p>This is my second entry.</p>
+        </div>
+    </body>
+
+Note that since the child template didn't define the ``sidebar`` block, the
+value from the parent template is used instead. Content within a ``{% block %}``
+tag in a parent template is always used as a fallback.
+
+You can use as many levels of inheritance as needed. One common way of using
+inheritance is the following three-level approach:
+
+    * Create a ``base.html`` template that holds the main look-and-feel of your
+      site.
+    * Create a ``base_SECTIONNAME.html`` template for each "section" of your
+      site. For example, ``base_news.html``, ``base_sports.html``. These
+      templates all extend ``base.html`` and include section-specific
+      styles/design.
+    * Create individual templates for each type of page, such as a news
+      article or blog entry. These templates extend the appropriate section
+      template.
+
+This approach maximizes code reuse and makes it easy to add items to shared
+content areas, such as section-wide navigation.
+
+Here are some tips for working with inheritance:
+
+    * If you use ``{% extends %}`` in a template, it must be the first template
+      tag in that template. Template inheritance won't work, otherwise.
+
+    * More ``{% block %}`` tags in your base templates are better. Remember,
+      child templates don't have to define all parent blocks, so you can fill
+      in reasonable defaults in a number of blocks, then only define the ones
+      you need later. It's better to have more hooks than fewer hooks.
+
+    * If you find yourself duplicating content in a number of templates, it
+      probably means you should move that content to a ``{% block %}`` in a
+      parent template.
+
+    * If you need to get the content of the block from the parent template,
+      the ``{{ block.super }}`` variable will do the trick. This is useful
+      if you want to add to the contents of a parent block instead of
+      completely overriding it.
+
+Finally, note that you can't define multiple ``{% block %}`` tags with the same
+name in the same template. This limitation exists because a block tag works in
+"both" directions. That is, a block tag doesn't just provide a hole to fill --
+it also defines the content that fills the hole in the *parent*. If there were
+two similarly-named ``{% block %}`` tags in a template, that template's parent
+wouldn't know which one of the blocks' content to use.
+
+Using the built-in reference
+============================
+
+Django's admin interface includes a complete reference of all template tags and
+filters available for a given site. To see it, go to your admin interface and
+click the "Documentation" link in the upper right of the page.
+
+The reference is divided into 4 sections: tags, filters, models, and views.
+
+The **tags** and **filters** sections describe all the built-in tags (in fact,
+the tag and filter references below come directly from those pages) as well as
+any custom tag or filter libraries available.
+
+The **views** page is the most valuable. Each URL in your site has a separate
+entry here, and clicking on a URL will show you:
+
+    * The name of the view function that generates that view.
+    * A short description of what the view does.
+    * The **context**, or a list of variables available in the view's template.
+    * The name of the template or templates that are used for that view.
+
+Each view documentation page also has a bookmarklet that you can use to jump
+from any page to the documentation page for that view.
+
+Because Django-powered sites usually use database objects, the **models**
+section of the documentation page describes each type of object in the system
+along with all the fields available on that object.
+
+Taken together, the documentation pages should tell you every tag, filter,
+variable and object available to you in a given template.
+
+Custom tag and filter libraries
+===============================
+
+Certain applications provide custom tag and filter libraries. To access them in
+a template, use the ``{% load %}`` tag::
+
+    {% load comments %}
+
+    {% comment_form for blogs.entries entry.id with is_public yes %}
+
+In the above, the ``load`` tag loads the ``comments`` tag library, which then
+makes the ``comment_form`` tag available for use. Consult the documentation
+area in your admin to find the list of custom libraries in your installation.
+
+The ``{% load %}`` tag can take multiple library names, separated by spaces.
+Example::
+
+    {% load comments i18n %}
+
+Custom libraries and template inheritance
+-----------------------------------------
+
+When you load a custom tag or filter library, the tags/filters are only made
+available to the current template -- not any parent or child templates along
+the template-inheritance path.
+
+For example, if a template ``foo.html`` has ``{% load comments %}``, a child
+template (e.g., one that has ``{% extends "foo.html" %}``) will *not* have
+access to the comments template tags and filters. The child template is
+responsible for its own ``{% load comments %}``.
+
+This is a feature for the sake of maintainability and sanity.
+
+Built-in tag and filter reference
+=================================
+
+For those without an admin site available, reference for the stock tags and
+filters follows. Because Django is highly customizable, the reference in your
+admin should be considered the final word on what tags and filters are
+available, and what they do.
+
+Built-in tag reference
+----------------------
+
+block
+~~~~~
+
+Define a block that can be overridden by child templates. See
+`Template inheritance`_ for more information.
+
+comment
+~~~~~~~
+
+Ignore everything between ``{% comment %}`` and ``{% endcomment %}``
+
+cycle
+~~~~~
+
+Cycle among the given strings each time this tag is encountered.
+
+Within a loop, cycles among the given strings each time through the loop::
+
+    {% for o in some_list %}
+        <tr class="{% cycle row1,row2 %}">
+            ...
+        </tr>
+    {% endfor %}
+
+Outside of a loop, give the values a unique name the first time you call it,
+then use that name each successive time through::
+
+        <tr class="{% cycle row1,row2,row3 as rowcolors %}">...</tr>
+        <tr class="{% cycle rowcolors %}">...</tr>
+        <tr class="{% cycle rowcolors %}">...</tr>
+
+You can use any number of values, separated by commas. Make sure not to put
+spaces between the values -- only commas.
+
+debug
+~~~~~
+
+Output a whole load of debugging information, including the current context and
+imported modules.
+
+extends
+~~~~~~~
+
+Signal that this template extends a parent template.
+
+This tag can be used in two ways: 
+
+   * ``{% extends "base.html" %}`` (with quotes) uses the literal value
+     ``"base.html"`` as the name of the parent template to extend.
+
+   * ``{% extends variable %}`` uses the value of ``variable``. If the variable
+     evaluates to a string, Django will use that string as the name of the
+     parent template. If the variable evaluates to a ``Template`` object,
+     Django will use that object as the parent template.
+
+See `Template inheritance`_ for more information.
+
+filter
+~~~~~~
+
+Filter the contents of the variable through variable filters.
+
+Filters can also be piped through each other, and they can have arguments --
+just like in variable syntax.
+
+Sample usage::
+
+    {% filter escape|lower %}
+        This text will be HTML-escaped, and will appear in all lowercase.
+    {% endfilter %}
+
+firstof
+~~~~~~~
+
+Outputs the first variable passed that is not False.  Outputs nothing if all the
+passed variables are False.
+
+Sample usage::
+
+    {% firstof var1 var2 var3 %}
+
+This is equivalent to::
+
+    {% if var1 %}
+        {{ var1 }}
+    {% else %}{% if var2 %}
+        {{ var2 }}
+    {% else %}{% if var3 %}
+        {{ var3 }}
+    {% endif %}{% endif %}{% endif %}
+
+for
+~~~
+
+Loop over each item in an array.  For example, to display a list of athletes
+given ``athlete_list``::
+
+    <ul>
+    {% for athlete in athlete_list %}
+        <li>{{ athlete.name }}</li>
+    {% endfor %}
+    </ul>
+
+You can also loop over a list in reverse by using ``{% for obj in list reversed %}``.
+
+The for loop sets a number of variables available within the loop:
+
+    ==========================  ================================================
+    Variable                    Description
+    ==========================  ================================================
+    ``forloop.counter``         The current iteration of the loop (1-indexed)
+    ``forloop.counter0``        The current iteration of the loop (0-indexed)
+    ``forloop.revcounter``      The number of iterations from the end of the
+                                loop (1-indexed)
+    ``forloop.revcounter0``     The number of iterations from the end of the
+                                loop (0-indexed)
+    ``forloop.first``           True if this is the first time through the loop
+    ``forloop.last``            True if this is the last time through the loop
+    ``forloop.parentloop``      For nested loops, this is the loop "above" the
+                                current one
+    ==========================  ================================================
+
+if
+~~
+
+The ``{% if %}`` tag evaluates a variable, and if that variable is "true" (i.e.
+exists, is not empty, and is not a false boolean value) the contents of the
+block are output::
+
+    {% if athlete_list %}
+        Number of athletes: {{ athlete_list|length }}
+    {% else %}
+        No athletes.
+    {% endif %}
+
+In the above, if ``athlete_list`` is not empty, the number of athletes will be
+displayed by the ``{{ athlete_list|length }}`` variable.
+
+As you can see, the ``if`` tag can take an option ``{% else %}`` clause that
+will be displayed if the test fails.
+
+``if`` tags may use ``and``, ``or`` or ``not`` to test a number of variables or
+to negate a given variable::
+
+    {% if athlete_list and coach_list %}
+        Both athletes and coaches are available.
+    {% endif %}
+
+    {% if not athlete_list %}
+        There are no athletes.
+    {% endif %}
+
+    {% if athlete_list or coach_list %}
+        There are some athletes or some coaches.
+    {% endif %}
+
+    {% if not athlete_list or coach_list %}
+        There are no athletes or there are some coaches (OK, so
+        writing English translations of boolean logic sounds
+        stupid; it's not our fault).
+    {% endif %}
+
+    {% if athlete_list and not coach_list %}
+        There are some athletes and absolutely no coaches.
+    {% endif %}
+
+``if`` tags don't allow ``and`` and ``or`` clauses within the same tag, because
+the order of logic would be ambiguous. For example, this is invalid::
+
+    {% if athlete_list and coach_list or cheerleader_list %}
+
+If you need to combine ``and`` and ``or`` to do advanced logic, just use nested
+``if`` tags. For example::
+
+    {% if athlete_list %}
+        {% if coach_list or cheerleader_list %}
+            We have athletes, and either coaches or cheerleaders!
+        {% endif %}
+    {% endif %}
+
+Multiple uses of the same logical operator are fine, as long as you use the
+same operator. For example, this is valid::
+
+    {% if athlete_list or coach_list or parent_list or teacher_list %}
+
+ifchanged
+~~~~~~~~~
+
+Check if a value has changed from the last iteration of a loop.
+
+The ``ifchanged`` block tag is used within a loop. It checks its own rendered
+contents against its previous state and only displays its content if the value
+has changed::
+
+    <h1>Archive for {{ year }}</h1>
+
+    {% for day in days %}
+    {% ifchanged %}<h3>{{ day|date:"F" }}</h3>{% endifchanged %}
+    <a href="{{ day|date:"M/d"|lower }}/">{{ day|date:"j" }}</a>
+    {% endfor %}
+
+ifequal
+~~~~~~~
+
+Output the contents of the block if the two arguments equal each other.
+
+Example::
+
+    {% ifequal user.id comment.user_id %}
+        ...
+    {% endifequal %}
+
+As in the ``{% if %}`` tag, an ``{% else %}`` clause is optional.
+
+The arguments can be hard-coded strings, so the following is valid::
+
+    {% ifequal user.username "adrian" %}
+        ...
+    {% endifequal %}
+
+ifnotequal
+~~~~~~~~~~
+
+Just like ``ifequal``, except it tests that the two arguments are not equal.
+
+include
+~~~~~~~
+
+Loads a template and renders it with the current context. This is a way of
+"including" other templates within a template.
+
+The template name can either be a variable or a hard-coded (quoted) string,
+in either single or double quotes.
+
+This example includes the contents of the template ``"foo/bar.html"``::
+
+    {% include "foo/bar.html" %}
+
+This example includes the contents of the template whose name is contained in
+the variable ``template_name``::
+
+    {% include template_name %}
+
+An included template is rendered with the context of the template that's
+including it. This example produces the output ``"Hello, John"``:
+
+    * Context: variable ``person`` is set to ``"john"``.
+    * Template::
+
+        {% include "name_snippet.html" %}
+
+    * The ``name_snippet.html`` template::
+
+        Hello, {{ person }}
+
+See also: ``{% ssi %}``.
+
+load
+~~~~
+
+Load a custom template tag set.
+
+See `Custom tag and filter libraries`_ for more information.
+
+now
+~~~
+
+Display the date, formatted according to the given string.
+
+Uses the same format as PHP's ``date()`` function (http://php.net/date)
+with some custom extensions.
+
+Available format strings:
+
+    ================  ========================================  =====================
+    Format character  Description                               Example output
+    ================  ========================================  =====================
+    a                 ``'a.m.'`` or ``'p.m.'`` (Note that       ``'a.m.'``
+                      this is slightly different than PHP's
+                      output, because this includes periods
+                      to match Associated Press style.)
+    A                 ``'AM'`` or ``'PM'``.                     ``'AM'``
+    B                 Not implemented.
+    d                 Day of the month, 2 digits with           ``'01'`` to ``'31'``
+                      leading zeros.
+    D                 Day of the week, textual, 3 letters.      ``'Fri'``
+    f                 Time, in 12-hour hours and minutes,       ``'1'``, ``'1:30'``
+                      with minutes left off if they're zero.
+                      Proprietary extension.
+    F                 Month, textual, long.                     ``'January'``
+    g                 Hour, 12-hour format without leading      ``'1'`` to ``'12'``
+                      zeros.
+    G                 Hour, 24-hour format without leading      ``'0'`` to ``'23'``
+                      zeros.
+    h                 Hour, 12-hour format.                     ``'01'`` to ``'12'``
+    H                 Hour, 24-hour format.                     ``'00'`` to ``'23'``
+    i                 Minutes.                                  ``'00'`` to ``'59'``
+    I                 Not implemented.
+    j                 Day of the month without leading          ``'1'`` to ``'31'``
+                      zeros.
+    l                 Day of the week, textual, long.           ``'Friday'``
+    L                 Boolean for whether it's a leap year.     ``True`` or ``False``
+    m                 Month, 2 digits with leading zeros.       ``'01'`` to ``'12'``
+    M                 Month, textual, 3 letters.                ``'Jan'``
+    n                 Month without leading zeros.              ``'1'`` to ``'12'``
+    N                 Month abbreviation in Associated Press    ``'Jan.'``, ``'Feb.'``, ``'March'``, ``'May'``
+                      style. Proprietary extension.
+    O                 Difference to Greenwich time in hours.    ``'+0200'``
+    P                 Time, in 12-hour hours, minutes and       ``'1 a.m.'``, ``'1:30 p.m.'``, ``'midnight'``, ``'noon'``, ``'12:30 p.m.'``
+                      'a.m.'/'p.m.', with minutes left off
+                      if they're zero and the special-case
+                      strings 'midnight' and 'noon' if
+                      appropriate. Proprietary extension.
+    r                 RFC 822 formatted date.                   ``'Thu, 21 Dec 2000 16:01:07 +0200'``
+    s                 Seconds, 2 digits with leading zeros.     ``'00'`` to ``'59'``
+    S                 English ordinal suffix for day of the     ``'st'``, ``'nd'``, ``'rd'`` or ``'th'``
+                      month, 2 characters.
+    t                 Number of days in the given month.        ``28`` to ``31``
+    T                 Time zone of this machine.                ``'EST'``, ``'MDT'``
+    U                 Not implemented.
+    w                 Day of the week, digits without           ``'0'`` (Sunday) to ``'6'`` (Saturday)
+                      leading zeros.
+    W                 ISO-8601 week number of year, with        ``1``, ``23``
+                      weeks starting on Monday.
+    y                 Year, 2 digits.                           ``'99'``
+    Y                 Year, 4 digits.                           ``'1999'``
+    z                 Day of the year.                          ``0`` to ``365``
+    Z                 Time zone offset in seconds. The          ``-43200`` to ``43200``
+                      offset for timezones west of UTC is
+                      always negative, and for those east of
+                      UTC is always positive.
+    ================  ========================================  =====================
+
+Example::
+
+    It is {% now "jS F Y H:i" %}
+
+Note that you can backslash-escape a format string if you want to use the
+"raw" value. In this example, "f" is backslash-escaped, because otherwise
+"f" is a format string that displays the time. The "o" doesn't need to be
+escaped, because it's not a format character.::
+
+    It is the {% now "jS o\f F" %}
+
+(Displays "It is the 4th of September" %}
+
+regroup
+~~~~~~~
+
+Regroup a list of alike objects by a common attribute.
+
+This complex tag is best illustrated by use of an example:  say that ``people``
+is a list of ``Person`` objects that have ``first_name``, ``last_name``, and
+``gender`` attributes, and you'd like to display a list that looks like:
+
+    * Male:
+        * George Bush
+        * Bill Clinton
+    * Female:
+        * Margaret Thatcher
+        * Condoleezza Rice
+    * Unknown:
+        * Pat Smith
+
+The following snippet of template code would accomplish this dubious task::
+
+    {% regroup people by gender as grouped %}
+    <ul>
+    {% for group in grouped %}
+        <li>{{ group.grouper }}
+        <ul>
+            {% for item in group.list %}
+            <li>{{ item }}</li>
+            {% endfor %}
+        </ul>
+    {% endfor %}
+    </ul>
+
+As you can see, ``{% regroup %}`` populates a variable with a list of objects
+with ``grouper`` and ``list`` attributes.  ``grouper`` contains the item that
+was grouped by; ``list`` contains the list of objects that share that
+``grouper``.  In this case, ``grouper`` would be ``Male``, ``Female`` and
+``Unknown``, and ``list`` is the list of people with those genders.
+
+Note that ``{% regroup %}`` does not work when the list to be grouped is not
+sorted by the key you are grouping by!  This means that if your list of people
+was not sorted by gender, you'd need to make sure it is sorted before using it,
+i.e.::
+
+    {% regroup people|dictsort:"gender" by gender as grouped %}
+
+spaceless
+~~~~~~~~~
+
+Normalizes whitespace between HTML tags to a single space. This includes tab
+characters and newlines.
+
+Example usage::
+
+    {% spaceless %}
+        <p>
+            <a href="foo/">Foo</a>
+        </p>
+    {% endspaceless %}
+
+This example would return this HTML::
+
+    <p> <a href="foo/">Foo</a> </p>
+
+Only space between *tags* is normalized -- not space between tags and text. In
+this example, the space around ``Hello`` won't be stripped::
+
+    {% spaceless %}
+        <strong>
+            Hello
+        </strong>
+    {% endspaceless %}
+
+ssi
+~~~
+
+Output the contents of a given file into the page.
+
+Like a simple "include" tag, ``{% ssi %}`` includes the contents of another
+file -- which must be specified using an absolute path -- in the current
+page::
+
+    {% ssi /home/html/ljworld.com/includes/right_generic.html %}
+
+If the optional "parsed" parameter is given, the contents of the included
+file are evaluated as template code, within the current context::
+
+    {% ssi /home/html/ljworld.com/includes/right_generic.html parsed %}
+
+Note that if you use ``{% ssi %}``, you'll need to define
+`ALLOWED_INCLUDE_ROOTS`_ in your Django settings, as a security measure.
+
+See also: ``{% include %}``.
+
+.. _ALLOWED_INCLUDE_ROOTS: http://www.djangoproject.com/documentation/settings/#allowed-include-roots
+
+templatetag
+~~~~~~~~~~~
+
+Output one of the syntax characters used to compose template tags.
+
+Since the template system has no concept of "escaping", to display one of the
+bits used in template tags, you must use the ``{% templatetag %}`` tag.
+
+The argument tells which template bit to output:
+
+    ==================  =======
+    Argument            Outputs
+    ==================  =======
+    ``openblock``       ``{%``
+    ``closeblock``      ``%}``
+    ``openvariable``    ``{{``
+    ``closevariable``   ``}}``
+    ``openbrace``       ``{``
+    ``closebrace``      ``}``
+    ==================  =======
+
+widthratio
+~~~~~~~~~~
+
+For creating bar charts and such, this tag calculates the ratio of a given value
+to a maximum value, and then applies that ratio to a constant.
+
+For example::
+
+    <img src="bar.gif" height="10" width="{% widthratio this_value max_value 100 %}" />
+
+Above, if ``this_value`` is 175 and ``max_value`` is 200, the the image in the
+above example will be 88 pixels wide (because 175/200 = .875; .875 * 100 = 87.5
+which is rounded up to 88).
+
+Built-in filter reference
+-------------------------
+
+add
+~~~
+
+Adds the arg to the value.
+
+addslashes
+~~~~~~~~~~
+
+Adds slashes. Useful for passing strings to JavaScript, for example.
+
+
+capfirst
+~~~~~~~~
+
+Capitalizes the first character of the value.
+
+center
+~~~~~~
+
+Centers the value in a field of a given width.
+
+cut
+~~~
+
+Removes all values of arg from the given string.
+
+date
+~~~~
+
+Formats a date according to the given format (same as the ``now`` tag).
+
+default
+~~~~~~~
+
+If value is unavailable, use given default.
+
+default_if_none
+~~~~~~~~~~~~~~~
+
+If value is ``None``, use given default.
+
+dictsort
+~~~~~~~~
+
+Takes a list of dicts, returns that list sorted by the property given in the
+argument.
+
+dictsortreversed
+~~~~~~~~~~~~~~~~
+
+Takes a list of dicts, returns that list sorted in reverse order by the
+property given in the argument.
+
+divisibleby
+~~~~~~~~~~~
+
+Returns true if the value is divisible by the argument.
+
+escape
+~~~~~~
+
+Escapes a string's HTML. Specifically, it makes these replacements:
+
+    * ``"&"`` to ``"&amp;"``
+    * ``<`` to ``"&lt;"``
+    * ``>`` to ``"&gt;"``
+    * ``'"'`` (double quote) to ``'&quot;'``
+    * ``"'"`` (single quote) to ``'&#39;'``
+
+filesizeformat
+~~~~~~~~~~~~~~
+
+Format the value like a 'human-readable' file size (i.e. ``'13 KB'``,
+``'4.1 MB'``, ``'102 bytes'``, etc).
+
+first
+~~~~~
+
+Returns the first item in a list.
+
+fix_ampersands
+~~~~~~~~~~~~~~
+
+Replaces ampersands with ``&amp;`` entities.
+
+floatformat
+~~~~~~~~~~~
+
+Rounds a floating-point number to one decimal place -- but only if there's a
+decimal part to be displayed. For example:
+
+    * ``36.123`` gets converted to ``36.1``
+    * ``36.15`` gets converted to ``36.2``
+    * ``36`` gets converted to ``36``
+
+get_digit
+~~~~~~~~~
+
+Given a whole number, returns the requested digit of it, where 1 is the
+right-most digit, 2 is the second-right-most digit, etc. Returns the original
+value for invalid input (if input or argument is not an integer, or if argument
+is less than 1). Otherwise, output is always an integer.
+
+join
+~~~~
+
+Joins a list with a string, like Python's ``str.join(list)``.
+
+length
+~~~~~~
+
+Returns the length of the value. Useful for lists.
+
+length_is
+~~~~~~~~~
+
+Returns a boolean of whether the value's length is the argument.
+
+linebreaks
+~~~~~~~~~~
+
+Converts newlines into ``<p>`` and ``<br />`` tags.
+
+linebreaksbr
+~~~~~~~~~~~~
+
+Converts newlines into ``<br />`` tags.
+
+linenumbers
+~~~~~~~~~~~
+
+Displays text with line numbers.
+
+ljust
+~~~~~
+
+Left-aligns the value in a field of a given width.
+
+**Argument:** field size
+
+lower
+~~~~~
+
+Converts a string into all lowercase.
+
+make_list
+~~~~~~~~~
+
+Returns the value turned into a list. For an integer, it's a list of
+digits. For a string, it's a list of characters.
+
+phone2numeric
+~~~~~~~~~~~~~
+
+Converts a phone number (possibly containing letters) to its numerical
+equivalent. For example, ``'800-COLLECT'`` will be converted to
+``'800-2655328'``.
+
+The input doesn't have to be a valid phone number. This will happily convert
+any string.
+
+pluralize
+~~~~~~~~~
+
+Returns a plural suffix if the value is not 1. By default, this suffix is ``'s'``. 
+
+Example::
+
+    You have {{ num_messages }} message{{ num_messages|pluralize }}.
+
+For words that require a suffix other than ``'s'``, you can provide an alternate 
+suffix as a parameter to the filter.
+
+Example::
+
+    You have {{ num_walruses }} walrus{{ num_walrus|pluralize:"es" }}.
+
+For words that don't pluralize by simple suffix, you can specify both a
+singular and plural suffix, separated by a comma.
+
+Example::
+
+    You have {{ num_cherries }} cherr{{ num_cherries|pluralize:"y,ies" }}.
+
+pprint
+~~~~~~
+
+A wrapper around pprint.pprint -- for debugging, really.
+
+random
+~~~~~~
+
+Returns a random item from the list.
+
+removetags
+~~~~~~~~~~
+
+Removes a space separated list of [X]HTML tags from the output.
+
+rjust
+~~~~~
+
+Right-aligns the value in a field of a given width.
+
+**Argument:** field size
+
+slice
+~~~~~
+
+Returns a slice of the list.
+
+Uses the same syntax as Python's list slicing. See
+http://diveintopython.org/native_data_types/lists.html#odbchelper.list.slice
+for an introduction.
+
+Example: ``{{ some_list|slice:":2" }}``
+
+slugify
+~~~~~~~
+
+Converts to lowercase, removes non-word characters (alphanumerics and
+underscores) and converts spaces to hyphens. Also strips leading and trailing
+whitespace.
+
+stringformat
+~~~~~~~~~~~~
+
+Formats the variable according to the argument, a string formatting specifier.
+This specifier uses Python string formating syntax, with the exception that
+the leading "%" is dropped.
+
+See http://docs.python.org/lib/typesseq-strings.html for documentation of
+Python string formatting
+
+striptags
+~~~~~~~~~
+
+Strips all [X]HTML tags.
+
+time
+~~~~
+
+Formats a time according to the given format (same as the ``now`` tag).
+
+timesince
+~~~~~~~~~
+
+Formats a date as the time since that date (i.e. "4 days, 6 hours").
+
+Takes an optional argument that is a variable containing the date to use as
+the comparison point (without the argument, the comparison point is *now*).
+For example, if ``blog_date`` is a date instance representing midnight on 1
+June 2006, and ``comment_date`` is a date instanace for 08:00 on 1 June 2006,
+then ``{{ comment_date|timesince:blog_date }}`` would return "8 hours".
+
+timeuntil
+~~~~~~~~~
+
+Similar to ``timesince``, except that it measures the time from now until the
+given date or datetime. For example, if today is 1 June 2006 and
+``conference_date`` is a date instance holding 29 June 2006, then
+``{{ conference_date|timeuntil }}`` will return "28 days".
+
+Takes an optional argument that is a variable containing the date to use as
+the comparison point (instead of *now*). If ``from_date`` contains 22 June
+2006, then ``{{ conference_date|timeuntil:from_date }}`` will return "7 days".
+
+title
+~~~~~
+
+Converts a string into titlecase.
+
+truncatewords
+~~~~~~~~~~~~~
+
+Truncates a string after a certain number of words.
+
+**Argument:** Number of words to truncate after
+
+unordered_list
+~~~~~~~~~~~~~~
+
+Recursively takes a self-nested list and returns an HTML unordered list --
+WITHOUT opening and closing <ul> tags.
+
+The list is assumed to be in the proper format. For example, if ``var`` contains
+``['States', [['Kansas', [['Lawrence', []], ['Topeka', []]]], ['Illinois', []]]]``,
+then ``{{ var|unordered_list }}`` would return::
+
+    <li>States
+    <ul>
+            <li>Kansas
+            <ul>
+                    <li>Lawrence</li>
+                    <li>Topeka</li>
+            </ul>
+            </li>
+            <li>Illinois</li>
+    </ul>
+    </li>
+
+upper
+~~~~~
+
+Converts a string into all uppercase.
+
+urlencode
+~~~~~~~~~
+
+Escapes a value for use in a URL.
+
+urlize
+~~~~~~
+
+Converts URLs in plain text into clickable links.
+
+urlizetrunc
+~~~~~~~~~~~
+
+Converts URLs into clickable links, truncating URLs to the given character limit.
+
+**Argument:** Length to truncate URLs to
+
+wordcount
+~~~~~~~~~
+
+Returns the number of words.
+
+wordwrap
+~~~~~~~~
+
+Wraps words at specified line length.
+
+**Argument:** number of characters at which to wrap the text
+
+yesno
+~~~~~
+
+Given a string mapping values for true, false and (optionally) None,
+returns one of those strings according to the value:
+
+==========  ======================  ==================================
+Value       Argument                Outputs
+==========  ======================  ==================================
+``True``    ``"yeah,no,maybe"``     ``yeah``
+``False``   ``"yeah,no,maybe"``     ``no``
+``None``    ``"yeah,no,maybe"``     ``maybe``
+``None``    ``"yeah,no"``           ``"no"`` (converts None to False
+                                    if no mapping for None is given)
+==========  ======================  ==================================
+
+Other tags and filter libraries
+===============================
+
+Django comes with a couple of other template-tag libraries that you have to
+enable explicitly in your ``INSTALLED_APPS`` setting and enable in your
+template with the ``{% load %}`` tag.
+
+django.contrib.humanize
+-----------------------
+
+A set of Django template filters useful for adding a "human touch" to data. See
+the `humanize documentation`_.
+
+.. _humanize documentation: http://www.djangoproject.com/documentation/add_ons/#humanize
+
+django.contrib.markup
+---------------------
+
+A collection of template filters that implement these common markup languages:
+
+    * Textile
+    * Markdown
+    * ReST (ReStructured Text)

Added: vendor/django/current/docs/templates_python.txt
===================================================================
--- vendor/django/current/docs/templates_python.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/templates_python.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,1053 @@
+====================================================
+The Django template language: For Python programmers
+====================================================
+
+This document explains the Django template system from a technical
+perspective -- how it works and how to extend it. If you're just looking for
+reference on the language syntax, see
+`The Django template language: For template authors`_.
+
+If you're looking to use the Django template system as part of another
+application -- i.e., without the rest of the framework -- make sure to read
+the `configuration`_ section later in this document.
+
+.. _`The Django template language: For template authors`: http://www.djangoproject.com/documentation/templates/
+
+Basics
+======
+
+A **template** is a text document, or a normal Python string, that is marked-up
+using the Django template language. A template can contain **block tags** or
+**variables**.
+
+A **block tag** is a symbol within a template that does something.
+
+This definition is deliberately vague. For example, a block tag can output
+content, serve as a control structure (an "if" statement or "for" loop), grab
+content from a database or enable access to other template tags.
+
+Block tags are surrounded by ``"{%"`` and ``"%}"``.
+
+Example template with block tags::
+
+    {% if is_logged_in %}Thanks for logging in!{% else %}Please log in.{% endif %}
+
+A **variable** is a symbol within a template that outputs a value.
+
+Variable tags are surrounded by ``"{{"`` and ``"}}"``.
+
+Example template with variables::
+
+    My first name is {{ first_name }}. My last name is {{ last_name }}.
+
+A **context** is a "variable name" -> "variable value" mapping that is passed
+to a template.
+
+A template **renders** a context by replacing the variable "holes" with values
+from the context and executing all block tags.
+
+Using the template system
+=========================
+
+Using the template system in Python is a two-step process:
+
+    * First, you compile the raw template code into a ``Template`` object.
+    * Then, you call the ``render()`` method of the ``Template`` object with a
+      given context.
+
+Compiling a string
+------------------
+
+The easiest way to create a ``Template`` object is by instantiating it
+directly. The class lives at ``django.template.Template``. The constructor
+takes one argument -- the raw template code::
+
+    >>> from django.template import Template
+    >>> t = Template("My name is {{ my_name }}.")
+    >>> print t
+    <django.template.Template instance>
+
+.. admonition:: Behind the scenes
+
+    The system only parses your raw template code once -- when you create the
+    ``Template`` object. From then on, it's stored internally as a "node"
+    structure for performance.
+
+    Even the parsing itself is quite fast. Most of the parsing happens via a
+    single call to a single, short, regular expression.
+
+Rendering a context
+-------------------
+
+Once you have a compiled ``Template`` object, you can render a context -- or
+multiple contexts -- with it. The ``Context`` class lives at
+``django.template.Context``, and the constructor takes one (optional)
+argument: a dictionary mapping variable names to variable values. Call the
+``Template`` object's ``render()`` method with the context to "fill" the
+template::
+
+    >>> from django.template import Context, Template
+    >>> t = Template("My name is {{ my_name }}.")
+
+    >>> c = Context({"my_name": "Adrian"})
+    >>> t.render(c)
+    "My name is Adrian."
+
+    >>> c = Context({"my_name": "Dolores"})
+    >>> t.render(c)
+    "My name is Dolores."
+
+Variable names must consist of any letter (A-Z), any digit (0-9), an underscore
+or a dot.
+
+Dots have a special meaning in template rendering. A dot in a variable name
+signifies **lookup**. Specifically, when the template system encounters a dot
+in a variable name, it tries the following lookups, in this order:
+
+    * Dictionary lookup. Example: ``foo["bar"]``
+    * Attribute lookup. Example: ``foo.bar``
+    * Method call. Example: ``foo.bar()``
+    * List-index lookup. Example: ``foo[bar]``
+
+The template system uses the first lookup type that works. It's short-circuit
+logic.
+
+Here are a few examples::
+
+    >>> from django.template import Context, Template
+    >>> t = Template("My name is {{ person.first_name }}.")
+    >>> d = {"person": {"first_name": "Joe", "last_name": "Johnson"}}
+    >>> t.render(Context(d))
+    "My name is Joe."
+
+    >>> class PersonClass: pass
+    >>> p = PersonClass()
+    >>> p.first_name = "Ron"
+    >>> p.last_name = "Nasty"
+    >>> t.render(Context({"person": p}))
+    "My name is Ron."
+
+    >>> class PersonClass2:
+    ...     def first_name(self):
+    ...         return "Samantha"
+    >>> p = PersonClass2()
+    >>> t.render(Context({"person": p}))
+    "My name is Samantha."
+
+    >>> t = Template("The first stooge in the list is {{ stooges.0 }}.")
+    >>> c = Context({"stooges": ["Larry", "Curly", "Moe"]})
+    >>> t.render(c)
+    "The first stooge in the list is Larry."
+
+Method lookups are slightly more complex than the other lookup types. Here are
+some things to keep in mind:
+
+    * If, during the method lookup, a method raises an exception, the exception
+      will be propagated, unless the exception has an attribute
+      ``silent_variable_failure`` whose value is ``True``. If the exception
+      *does* have a ``silent_variable_failure`` attribute, the variable will
+      render as an empty string. Example::
+
+        >>> t = Template("My name is {{ person.first_name }}.")
+        >>> class PersonClass3:
+        ...     def first_name(self):
+        ...         raise AssertionError, "foo"
+        >>> p = PersonClass3()
+        >>> t.render(Context({"person": p}))
+        Traceback (most recent call last):
+        ...
+        AssertionError: foo
+
+        >>> class SilentAssertionError(Exception):
+        ...     silent_variable_failure = True
+        >>> class PersonClass4:
+        ...     def first_name(self):
+        ...         raise SilentAssertionError
+        >>> p = PersonClass4()
+        >>> t.render(Context({"person": p}))
+        "My name is ."
+
+      Note that ``django.core.exceptions.ObjectDoesNotExist``, which is the
+      base class for all Django database API ``DoesNotExist`` exceptions, has
+      ``silent_variable_failure = True``. So if you're using Django templates
+      with Django model objects, any ``DoesNotExist`` exception will fail
+      silently.
+
+    * A method call will only work if the method has no required arguments.
+      Otherwise, the system will move to the next lookup type (list-index
+      lookup).
+
+    * Obviously, some methods have side effects, and it'd be either foolish or
+      a security hole to allow the template system to access them.
+
+      A good example is the ``delete()`` method on each Django model object.
+      The template system shouldn't be allowed to do something like this::
+
+        I will now delete this valuable data. {{ data.delete }}
+
+      To prevent this, set a function attribute ``alters_data`` on the method.
+      The template system won't execute a method if the method has
+      ``alters_data=True`` set. The dynamically-generated ``delete()`` and
+      ``save()`` methods on Django model objects get ``alters_data=True``
+      automatically. Example::
+
+        def sensitive_function(self):
+            self.database_record.delete()
+        sensitive_function.alters_data = True
+
+How invalid variables are handled
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If a variable doesn't exist, the template system inserts the value of the
+``TEMPLATE_STRING_IF_INVALID`` setting, which is set to ``''`` (the empty
+string) by default.
+
+Playing with Context objects
+----------------------------
+
+Most of the time, you'll instantiate ``Context`` objects by passing in a
+fully-populated dictionary to ``Context()``. But you can add and delete items
+from a ``Context`` object once it's been instantiated, too, using standard
+dictionary syntax::
+
+    >>> c = Context({"foo": "bar"})
+    >>> c['foo']
+    'bar'
+    >>> del c['foo']
+    >>> c['foo']
+    ''
+    >>> c['newvariable'] = 'hello'
+    >>> c['newvariable']
+    'hello'
+
+A ``Context`` object is a stack. That is, you can ``push()`` and ``pop()`` it.
+If you ``pop()`` too much, it'll raise
+``django.template.ContextPopException``::
+
+    >>> c = Context()
+    >>> c['foo'] = 'first level'
+    >>> c.push()
+    >>> c['foo'] = 'second level'
+    >>> c['foo']
+    'second level'
+    >>> c.pop()
+    >>> c['foo']
+    'first level'
+    >>> c['foo'] = 'overwritten'
+    >>> c['foo']
+    'overwritten'
+    >>> c.pop()
+    Traceback (most recent call last):
+    ...
+    django.template.ContextPopException
+
+Using a ``Context`` as a stack comes in handy in some custom template tags, as
+you'll see below.
+
+Subclassing Context: RequestContext
+-----------------------------------
+
+Django comes with a special ``Context`` class,
+``django.template.RequestContext``, that acts slightly differently than
+the normal ``django.template.Context``. The first difference is that takes
+an `HttpRequest object`_ as its first argument. For example::
+
+    c = RequestContext(request, {
+        'foo': 'bar',
+    }
+
+The second difference is that it automatically populates the context with a few
+variables, according to your `TEMPLATE_CONTEXT_PROCESSORS setting`_.
+
+The ``TEMPLATE_CONTEXT_PROCESSORS`` setting is a tuple of callables that take a
+request object as their argument and return a dictionary of items to be merged
+into the context. By default, ``TEMPLATE_CONTEXT_PROCESSORS`` is set to::
+
+    ("django.core.context_processors.auth",
+    "django.core.context_processors.debug",
+    "django.core.context_processors.i18n")
+
+Each processor is applied in order. That means, if one processor adds a
+variable to the context and a second processor adds a variable with the same
+name, the second will override the first. The default processors are explained
+below.
+
+Also, you can give ``RequestContext`` a list of additional processors, using the
+optional, third positional argument, ``processors``. In this example, the
+``RequestContext`` instance gets a ``ip_address`` variable::
+
+    def ip_address_processor(request):
+        return {'ip_address': request.META['REMOTE_ADDR']}
+
+    def some_view(request):
+        # ...
+        return RequestContext(request, {
+            'foo': 'bar',
+        }, [ip_address_processor])
+
+Here's what each of the default processors does:
+
+.. _HttpRequest object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
+.. _TEMPLATE_CONTEXT_PROCESSORS setting: http://www.djangoproject.com/documentation/settings/#template-context-processors
+
+django.core.context_processors.auth
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
+``RequestContext`` will contain these three variables:
+
+    * ``user`` -- An ``auth.User`` instance representing the currently
+      logged-in user (or an ``AnonymousUser`` instance, if the client isn't
+      logged in). See the `user authentication docs`.
+    * ``messages`` -- A list of ``auth.Message`` objects for the currently
+      logged-in user.
+    * ``perms`` -- An instance of ``django.core.context_processors.PermWrapper``,
+      representing the permissions that the currently logged-in user has. See
+      the `permissions docs`_.
+
+.. _user authentication docs: http://www.djangoproject.com/documentation/authentication/#users
+.. _permissions docs: http://www.djangoproject.com/documentation/authentication/#permissions
+
+django.core.context_processors.debug
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
+``RequestContext`` will contain these two variables -- but only if your
+``DEBUG`` setting is set to ``True`` and the request's IP address
+(``request.META['REMOTE_ADDR']``) is in the ``INTERNAL_IPS`` setting:
+
+    * ``debug`` -- ``True``. You can use this in templates to test whether
+      you're in ``DEBUG`` mode.
+    * ``sql_queries`` -- A list of ``{'sql': ..., 'time': ...}`` dictionaries,
+      representing every SQL query that has happened so far during the request
+      and how long it took. The list is in order by query.
+
+django.core.context_processors.i18n
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
+``RequestContext`` will contain these two variables:
+
+    * ``LANGUAGES`` -- The value of the `LANGUAGES setting`_.
+    * ``LANGUAGE_CODE`` -- ``request.LANGUAGE_CODE``, if it exists. Otherwise,
+      the value of the `LANGUAGE_CODE setting`_.
+
+See the `internationalization docs`_ for more.
+
+.. _LANGUAGES setting: http://www.djangoproject.com/documentation/settings/#languages
+.. _LANGUAGE_CODE setting: http://www.djangoproject.com/documentation/settings/#language-code
+.. _internationalization docs: http://www.djangoproject.com/documentation/i18n/
+
+django.core.context_processors.request
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+If ``TEMPLATE_CONTEXT_PROCESSORS`` contains this processor, every
+``RequestContext`` will contain a variable ``request``, which is the current
+`HttpRequest object`_. Note that this processor is not enabled by default;
+you'll have to activate it.
+
+Loading templates
+-----------------
+
+Generally, you'll store templates in files on your filesystem rather than using
+the low-level ``Template`` API yourself. Save templates in a directory
+specified as a **template directory**.
+
+Django searches for template directories in a number of places, depending on
+your template-loader settings (see "Loader types" below), but the most basic
+way of specifying template directories is by using the ``TEMPLATE_DIRS``
+setting.
+
+The TEMPLATE_DIRS setting
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Tell Django what your template directories are by using the ``TEMPLATE_DIRS``
+setting in your settings file. This should be set to a list or tuple of strings
+that contain full paths to your template directory(ies). Example::
+
+    TEMPLATE_DIRS = (
+        "/home/html/templates/lawrence.com",
+        "/home/html/templates/default",
+    )
+
+Your templates can go anywhere you want, as long as the directories and
+templates are readable by the Web server. They can have any extension you want,
+such as ``.html`` or ``.txt``, or they can have no extension at all.
+
+Note that these paths should use Unix-style forward slashes, even on Windows.
+
+The Python API
+~~~~~~~~~~~~~~
+
+Django has two ways to load templates from files:
+
+``django.template.loader.get_template(template_name)``
+    ``get_template`` returns the compiled template (a ``Template`` object) for
+    the template with the given name. If the template doesn't exist, it raises
+    ``django.template.TemplateDoesNotExist``.
+
+``django.template.loader.select_template(template_name_list)``
+    ``select_template`` is just like ``get_template``, except it takes a list
+    of template names. Of the list, it returns the first template that exists.
+
+For example, if you call ``get_template('story_detail.html')`` and have the
+above ``TEMPLATE_DIRS`` setting, here are the files Django will look for, in
+order:
+
+    * ``/home/html/templates/lawrence.com/story_detail.html``
+    * ``/home/html/templates/default/story_detail.html``
+
+If you call ``select_template(['story_253_detail.html', 'story_detail.html'])``,
+here's what Django will look for:
+
+    * ``/home/html/templates/lawrence.com/story_253_detail.html``
+    * ``/home/html/templates/default/story_253_detail.html``
+    * ``/home/html/templates/lawrence.com/story_detail.html``
+    * ``/home/html/templates/default/story_detail.html``
+
+When Django finds a template that exists, it stops looking.
+
+.. admonition:: Tip
+
+    You can use ``select_template()`` for super-flexible "templatability." For
+    example, if you've written a news story and want some stories to have
+    custom templates, use something like
+    ``select_template(['story_%s_detail.html' % story.id, 'story_detail.html'])``.
+    That'll allow you to use a custom template for an individual story, with a
+    fallback template for stories that don't have custom templates.
+
+Using subdirectories
+~~~~~~~~~~~~~~~~~~~~
+
+It's possible -- and preferable -- to organize templates in subdirectories of
+the template directory. The convention is to make a subdirectory for each
+Django app, with subdirectories within those subdirectories as needed.
+
+Do this for your own sanity. Storing all templates in the root level of a
+single directory gets messy.
+
+To load a template that's within a subdirectory, just use a slash, like so::
+
+    get_template('news/story_detail.html')
+
+Using the same ``TEMPLATE_DIRS`` setting from above, this example
+``get_template()`` call will attempt to load the following templates:
+
+    * ``/home/html/templates/lawrence.com/news/story_detail.html``
+    * ``/home/html/templates/default/news/story_detail.html``
+
+Loader types
+~~~~~~~~~~~~
+
+By default, Django uses a filesystem-based template loader, but Django comes
+with a few other template loaders, which know how to load templates from other
+sources.
+
+These other loaders are disabled by default, but you can activate them by
+editing your ``TEMPLATE_LOADERS`` setting. ``TEMPLATE_LOADERS`` should be a
+tuple of strings, where each string represents a template loader. Here are the
+template loaders that come with Django:
+
+``django.template.loaders.filesystem.load_template_source``
+    Loads templates from the filesystem, according to ``TEMPLATE_DIRS``.
+
+``django.template.loaders.app_directories.load_template_source``
+    Loads templates from Django apps on the filesystem. For each app in
+    ``INSTALLED_APPS``, the loader looks for a ``templates`` subdirectory. If
+    the directory exists, Django looks for templates in there.
+
+    This means you can store templates with your individual apps. This also
+    makes it easy to distribute Django apps with default templates.
+
+    For example, for this setting::
+
+        INSTALLED_APPS = ('myproject.polls', 'myproject.music')
+
+    ...then ``get_template('foo.html')`` will look for templates in these
+    directories, in this order:
+
+        * ``/path/to/myproject/polls/templates/foo.html``
+        * ``/path/to/myproject/music/templates/foo.html``
+
+    Note that the loader performs an optimization when it is first imported:
+    It caches a list of which ``INSTALLED_APPS`` packages have a ``templates``
+    subdirectory.
+
+``django.template.loaders.eggs.load_template_source``
+    Just like ``app_directories`` above, but it loads templates from Python
+    eggs rather than from the filesystem.
+
+Django uses the template loaders in order according to the ``TEMPLATE_LOADERS``
+setting. It uses each loader until a loader finds a match.
+
+Extending the template system
+=============================
+
+Although the Django template language comes with several default tags and
+filters, you might want to write your own. It's easy to do.
+
+First, create a ``templatetags`` package in the appropriate Django app's
+package. It should be on the same level as ``models.py``, ``views.py``, etc. For
+example::
+
+    polls/
+        models.py
+        templatetags/
+        views.py
+
+Add two files to the ``templatetags`` package: an ``__init__.py`` file and a
+file that will contain your custom tag/filter definitions. The name of the
+latter file is the name you'll use to load the tags later. For example, if your
+custom tags/filters are in a file called ``poll_extras.py``, you'd do the
+following in a template::
+
+    {% load poll_extras %}
+
+The ``{% load %}`` tag looks at your ``INSTALLED_APPS`` setting and only allows
+the loading of template libraries within installed Django apps. This is a
+security feature: It allows you to host Python code for many template libraries
+on a single computer without enabling access to all of them for every Django
+installation.
+
+If you write a template library that isn't tied to any particular models/views,
+it's perfectly OK to have a Django app package that only contains a
+``templatetags`` package.
+
+There's no limit on how many modules you put in the ``templatetags`` package.
+Just keep in mind that a ``{% load %}`` statement will load tags/filters for
+the given Python module name, not the name of the app.
+
+Once you've created that Python module, you'll just have to write a bit of
+Python code, depending on whether you're writing filters or tags.
+
+To be a valid tag library, the module contain a module-level variable named
+``register`` that is a ``template.Library`` instance, in which all the tags and
+filters are registered. So, near the top of your module, put the following::
+
+    from django import template
+
+    register = template.Library()
+
+.. admonition:: Behind the scenes
+
+    For a ton of examples, read the source code for Django's default filters
+    and tags. They're in ``django/template/defaultfilters.py`` and
+    ``django/template/defaulttags.py``, respectively.
+
+Writing custom template filters
+-------------------------------
+
+Custom filters are just Python functions that take one or two arguments:
+
+    * The value of the variable (input) -- not necessarily a string.
+    * The value of the argument -- this can have a default value, or be left
+      out altogether.
+
+For example, in the filter ``{{ var|foo:"bar" }}``, the filter ``foo`` would be
+passed the variable ``var`` and the argument ``"bar"``.
+
+Filter functions should always return something. They shouldn't raise
+exceptions. They should fail silently. In case of error, they should return
+either the original input or an empty string -- whichever makes more sense.
+
+Here's an example filter definition::
+
+    def cut(value, arg):
+        "Removes all values of arg from the given string"
+        return value.replace(arg, '')
+
+And here's an example of how that filter would be used::
+
+    {{ somevariable|cut:"0" }}
+
+Most filters don't take arguments. In this case, just leave the argument out of
+your function. Example::
+
+    def lower(value): # Only one argument.
+        "Converts a string into all lowercase"
+        return value.lower()
+
+When you've written your filter definition, you need to register it with
+your ``Library`` instance, to make it available to Django's template language::
+
+    register.filter('cut', cut)
+    register.filter('lower', lower)
+
+The ``Library.filter()`` method takes two arguments:
+
+    1. The name of the filter -- a string.
+    2. The compilation function -- a Python function (not the name of the
+       function as a string).
+
+If you're using Python 2.4 or above, you can use ``register.filter()`` as a
+decorator instead::
+
+    @register.filter(name='cut')
+    def cut(value, arg):
+        return value.replace(arg, '')
+
+    @register.filter
+    def lower(value):
+        return value.lower()
+
+If you leave off the ``name`` argument, as in the second example above, Django
+will use the function's name as the filter name.
+
+Writing custom template tags
+----------------------------
+
+Tags are more complex than filters, because tags can do anything.
+
+A quick overview
+~~~~~~~~~~~~~~~~
+
+Above, this document explained that the template system works in a two-step
+process: compiling and rendering. To define a custom template tag, you specify
+how the compilation works and how the rendering works.
+
+When Django compiles a template, it splits the raw template text into
+''nodes''. Each node is an instance of ``django.template.Node`` and has
+a ``render()`` method. A compiled template is, simply, a list of ``Node``
+objects. When you call ``render()`` on a compiled template object, the template
+calls ``render()`` on each ``Node`` in its node list, with the given context.
+The results are all concatenated together to form the output of the template.
+
+Thus, to define a custom template tag, you specify how the raw template tag is
+converted into a ``Node`` (the compilation function), and what the node's
+``render()`` method does.
+
+Writing the compilation function
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+For each template tag the template parser encounters, it calls a Python
+function with the tag contents and the parser object itself. This function is
+responsible for returning a ``Node`` instance based on the contents of the tag.
+
+For example, let's write a template tag, ``{% current_time %}``, that displays
+the current date/time, formatted according to a parameter given in the tag, in
+`strftime syntax`_. It's a good idea to decide the tag syntax before anything
+else. In our case, let's say the tag should be used like this::
+
+    <p>The time is {% current_time "%Y-%m-%d %I:%M %p" %}.</p>
+
+.. _`strftime syntax`: http://www.python.org/doc/current/lib/module-time.html#l2h-1941
+
+The parser for this function should grab the parameter and create a ``Node``
+object::
+
+    from django import template
+    def do_current_time(parser, token):
+        try:
+            # split_contents() knows not to split quoted strings.
+            tag_name, format_string = token.split_contents()
+        except ValueError:
+            raise template.TemplateSyntaxError, "%r tag requires a single argument" % token.contents[0]
+        if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")):
+            raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name
+        return CurrentTimeNode(format_string[1:-1])
+
+Notes:
+
+    * ``parser`` is the template parser object. We don't need it in this
+      example.
+
+    * ``token.contents`` is a string of the raw contents of the tag. In our
+      example, it's ``'current_time "%Y-%m-%d %I:%M %p"'``.
+
+    * The ``token.split_contents()`` method separates the arguments on spaces
+      while keeping quoted strings together. The more straightforward
+      ``token.contents.split()`` wouldn't be as robust, as it would naively
+      split on *all* spaces, including those within quoted strings. It's a good
+      idea to always use ``token.split_contents()``.
+
+    * This function is responsible for raising
+      ``django.template.TemplateSyntaxError``, with helpful messages, for
+      any syntax error.
+
+    * The ``TemplateSyntaxError`` exceptions use the ``tag_name`` variable.
+      Don't hard-code the tag's name in your error messages, because that
+      couples the tag's name to your function. ``token.contents.split()[0]``
+      will ''always'' be the name of your tag -- even when the tag has no
+      arguments.
+
+    * The function returns a ``CurrentTimeNode`` with everything the node needs
+      to know about this tag. In this case, it just passes the argument --
+      ``"%Y-%m-%d %I:%M %p"``. The leading and trailing quotes from the
+      template tag are removed in ``format_string[1:-1]``.
+
+    * The parsing is very low-level. The Django developers have experimented
+      with writing small frameworks on top of this parsing system, using
+      techniques such as EBNF grammars, but those experiments made the template
+      engine too slow. It's low-level because that's fastest.
+
+Writing the renderer
+~~~~~~~~~~~~~~~~~~~~
+
+The second step in writing custom tags is to define a ``Node`` subclass that
+has a ``render()`` method.
+
+Continuing the above example, we need to define ``CurrentTimeNode``::
+
+    from django import template
+    import datetime
+    class CurrentTimeNode(template.Node):
+        def __init__(self, format_string):
+            self.format_string = format_string
+        def render(self, context):
+            return datetime.datetime.now().strftime(self.format_string)
+
+Notes:
+
+    * ``__init__()`` gets the ``format_string`` from ``do_current_time()``.
+      Always pass any options/parameters/arguments to a ``Node`` via its
+      ``__init__()``.
+
+    * The ``render()`` method is where the work actually happens.
+
+    * ``render()`` should never raise ``TemplateSyntaxError`` or any other
+      exception. It should fail silently, just as template filters should.
+
+Ultimately, this decoupling of compilation and rendering results in an
+efficient template system, because a template can render multiple context
+without having to be parsed multiple times.
+
+Registering the tag
+~~~~~~~~~~~~~~~~~~~
+
+Finally, register the tag with your module's ``Library`` instance, as explained
+in "Writing custom template filters" above. Example::
+
+    register.tag('current_time', do_current_time)
+
+The ``tag()`` method takes two arguments:
+
+    1. The name of the template tag -- a string. If this is left out, the
+       name of the compilation function will be used.
+    2. The compilation function -- a Python function (not the name of the
+       function as a string).
+
+As with filter registration, it is also possible to use this as a decorator, in
+Python 2.4 and above::
+
+    @register.tag(name="current_time")
+    def do_current_time(parser, token):
+        # ...
+
+    @register.tag
+    def shout(parser, token):
+        # ...
+
+If you leave off the ``name`` argument, as in the second example above, Django
+will use the function's name as the tag name.
+
+Shortcut for simple tags
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Many template tags take a single argument -- a string or a template variable
+reference -- and return a string after doing some processing based solely on
+the input argument and some external information. For example, the
+``current_time`` tag we wrote above is of this variety: we give it a format
+string, it returns the time as a string.
+
+To ease the creation of the types of tags, Django provides a helper function,
+``simple_tag``. This function, which is a method of
+``django.template.Library``, takes a function that accepts one argument, wraps
+it in a ``render`` function and the other necessary bits mentioned above and
+registers it with the template system.
+
+Our earlier ``current_time`` function could thus be written like this::
+
+    def current_time(format_string):
+        return datetime.datetime.now().strftime(format_string)
+
+    register.simple_tag(current_time)
+
+In Python 2.4, the decorator syntax also works::
+
+    @register.simple_tag
+    def current_time(token):
+        ...
+
+A couple of things to note about the ``simple_tag`` helper function:
+    * Only the (single) argument is passed into our function.
+    * Checking for the required number of arguments, etc, has already been
+      done by the time our function is called, so we don't need to do that.
+    * The quotes around the argument (if any) have already been stripped away,
+      so we just receive a plain string.
+
+Inclusion tags
+~~~~~~~~~~~~~~
+
+Another common type of template tag is the type that displays some data by
+rendering *another* template. For example, Django's admin interface uses custom
+template tags to display the buttons along the botton of the "add/change" form
+pages. Those buttons always look the same, but the link targets change depending
+on the object being edited -- so they're a perfect case for using a small
+template that is filled with details from the current object. (In the admin's
+case, this is the ``submit_row`` tag.)
+
+These sorts of tags are called `inclusion tags`.
+
+Writing inclusion tags is probably best demonstrated by example. Let's write a
+tag that outputs a list of choices for a given ``Poll`` object, such as was
+created in the tutorials_. We'll use the tag like this::
+
+    {% show_results poll %}
+
+...and the output will be something like this::
+
+    <ul>
+      <li>First choice</li>
+      <li>Second choice</li>
+      <li>Third choice</li>
+    </ul>
+
+First, define the function that takes the argument and produces a dictionary of
+data for the result. The important point here is we only need to return a
+dictionary, not anything more complex. This will be used as a template context
+for the template fragment. Example::
+
+    def show_results(poll):
+        choices = poll.choice_set.all()
+        return {'choices': choices}
+
+Next, create the template used to render the tag's output. This template is a
+fixed feature of the tag: the tag writer specifies it, not the template
+designer. Following our example, the template is very simple::
+
+    <ul>
+    {% for choice in choices %}
+        <li> {{ choice }} </li>
+    {% endfor %}
+    </ul>
+
+Now, create and register the inclusion tag by calling the ``inclusion_tag()``
+method on a ``Library`` object. Following our example, if the above template is
+in a file called ``results.html`` in a directory that's searched by the template
+loader, we'd register the tag like this::
+
+    # Here, register is a django.template.Library instance, as before
+    register.inclusion_tag('results.html')(show_results)
+
+As always, Python 2.4 decorator syntax works as well, so we could have
+written::
+
+    @register.inclusion_tag('results.html')
+    def show_results(poll):
+        ...
+
+...when first creating the function.
+
+Sometimes, your inclusion tags might require a large number of arguments,
+making it a pain for template authors to pass in all the arguments and remember
+their order. To solve this, Django provides a ``takes_context`` option for
+inclusion tags. If you specify ``takes_context`` in creating a template tag,
+the tag will have no required arguments, and the underlying Python function
+will have one argument -- the template context as of when the tag was called.
+
+For example, say you're writing an inclusion tag that will always be used in a
+context that contains ``home_link`` and ``home_title`` variables that point
+back to the main page. Here's what the Python function would look like::
+
+    # The first argument *must* be called "context" here.
+    def jump_link(context):
+        return {
+            'link': context['home_link'],
+            'title': context['home_title'],
+        }
+    # Register the custom tag as an inclusion tag with takes_context=True.
+    register.inclusion_tag('link.html', takes_context=True)(jump_link)
+
+(Note that the first parameter to the function *must* be called ``context``.)
+
+In that ``register.inclusion_tag()`` line, we specified ``takes_context=True``
+and the name of the template. Here's what the template ``link.html`` might look
+like::
+
+    Jump directly to <a href="{{ link }}">{{ title }}</a>.
+
+Then, any time you want to use that custom tag, load its library and call it
+without any arguments, like so::
+
+    {% jump_link %}
+
+Note that when you're using ``takes_context=True``, there's no need to pass
+arguments to the template tag. It automatically gets access to the context.
+
+The ``takes_context`` parameter defaults to ``False``. When it's set to *True*,
+the tag is passed the context object, as in this example. That's the only
+difference between this case and the previous ``inclusion_tag`` example.
+
+.. _tutorials: http://www.djangoproject.com/documentation/tutorial1/#creating-models
+
+Setting a variable in the context
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+The above example simply output a value. Generally, it's more flexible if your
+template tags set template variables instead of outputting values. That way,
+template authors can reuse the values that your template tags create.
+
+To set a variable in the context, just use dictionary assignment on the context
+object in the ``render()`` method. Here's an updated version of
+``CurrentTimeNode`` that sets a template variable ``current_time`` instead of
+outputting it::
+
+    class CurrentTimeNode2(template.Node):
+        def __init__(self, format_string):
+            self.format_string = format_string
+        def render(self, context):
+            context['current_time'] = datetime.datetime.now().strftime(self.format_string)
+            return ''
+
+Note that ``render()`` returns the empty string. ``render()`` should always
+return string output. If all the template tag does is set a variable,
+``render()`` should return the empty string.
+
+Here's how you'd use this new version of the tag::
+
+    {% current_time "%Y-%M-%d %I:%M %p" %}<p>The time is {{ current_time }}.</p>
+
+But, there's a problem with ``CurrentTimeNode2``: The variable name
+``current_time`` is hard-coded. This means you'll need to make sure your
+template doesn't use ``{{ current_time }}`` anywhere else, because the
+``{% current_time %}`` will blindly overwrite that variable's value. A cleaner
+solution is to make the template tag specify the name of the output variable,
+like so::
+
+    {% get_current_time "%Y-%M-%d %I:%M %p" as my_current_time %}
+    <p>The current time is {{ my_current_time }}.</p>
+
+To do that, you'll need to refactor both the compilation function and ``Node``
+class, like so::
+
+    class CurrentTimeNode3(template.Node):
+        def __init__(self, format_string, var_name):
+            self.format_string = format_string
+            self.var_name = var_name
+        def render(self, context):
+            context[self.var_name] = datetime.datetime.now().strftime(self.format_string)
+            return ''
+
+    import re
+    def do_current_time(parser, token):
+        # This version uses a regular expression to parse tag contents.
+        try:
+            # Splitting by None == splitting by spaces.
+            tag_name, arg = token.contents.split(None, 1)
+        except ValueError:
+            raise template.TemplateSyntaxError, "%r tag requires arguments" % token.contents[0]
+        m = re.search(r'(.*?) as (\w+)', arg)
+        if not m:
+            raise template.TemplateSyntaxError, "%r tag had invalid arguments" % tag_name
+        format_string, var_name = m.groups()
+        if not (format_string[0] == format_string[-1] and format_string[0] in ('"', "'")):
+            raise template.TemplateSyntaxError, "%r tag's argument should be in quotes" % tag_name
+        return CurrentTimeNode3(format_string[1:-1], var_name)
+
+The difference here is that ``do_current_time()`` grabs the format string and
+the variable name, passing both to ``CurrentTimeNode3``.
+
+Parsing until another block tag
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Template tags can work in tandem. For instance, the standard ``{% comment %}``
+tag hides everything until ``{% endcomment %}``. To create a template tag such
+as this, use ``parser.parse()`` in your compilation function.
+
+Here's how the standard ``{% comment %}`` tag is implemented::
+
+    def do_comment(parser, token):
+        nodelist = parser.parse(('endcomment',))
+        parser.delete_first_token()
+        return CommentNode()
+
+    class CommentNode(template.Node):
+        def render(self, context):
+            return ''
+
+``parser.parse()`` takes a tuple of names of block tags ''to parse until''. It
+returns an instance of ``django.template.NodeList``, which is a list of
+all ``Node`` objects that the parser encountered ''before'' it encountered
+any of the tags named in the tuple.
+
+In ``"nodelist = parser.parse(('endcomment',))"`` in the above example,
+``nodelist`` is a list of all nodes between the ``{% comment %}`` and
+``{% endcomment %}``, not counting ``{% comment %}`` and ``{% endcomment %}``
+themselves.
+
+After ``parser.parse()`` is called, the parser hasn't yet "consumed" the
+``{% endcomment %}`` tag, so the code needs to explicitly call
+``parser.delete_first_token()``.
+
+``CommentNode.render()`` simply returns an empty string. Anything between
+``{% comment %}`` and ``{% endcomment %}`` is ignored.
+
+Parsing until another block tag, and saving contents
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+In the previous example, ``do_comment()`` discarded everything between
+``{% comment %}`` and ``{% endcomment %}``. Instead of doing that, it's
+possible to do something with the code between block tags.
+
+For example, here's a custom template tag, ``{% upper %}``, that capitalizes
+everything between itself and ``{% endupper %}``.
+
+Usage::
+
+    {% upper %}This will appear in uppercase, {{ your_name }}.{% endupper %}
+
+As in the previous example, we'll use ``parser.parse()``. But this time, we
+pass the resulting ``nodelist`` to the ``Node``::
+
+    def do_upper(parser, token):
+        nodelist = parser.parse(('endupper',))
+        parser.delete_first_token()
+        return UpperNode(nodelist)
+
+    class UpperNode(template.Node):
+        def __init__(self, nodelist):
+            self.nodelist = nodelist
+        def render(self, context):
+            output = self.nodelist.render(context)
+            return output.upper()
+
+The only new concept here is the ``self.nodelist.render(context)`` in
+``UpperNode.render()``.
+
+For more examples of complex rendering, see the source code for ``{% if %}``,
+``{% for %}``, ``{% ifequal %}`` and ``{% ifchanged %}``. They live in
+``django/template/defaulttags.py``.
+
+.. _configuration:
+
+Configuring the template system in standalone mode
+==================================================
+
+.. note::
+
+    This section is only of interest to people trying to use the template
+    system as an output component in another application. If you are using the
+    template system as part of a Django application, nothing here applies to
+    you.
+
+Normally, Django will load all the configuration information it needs from its
+own default configuration file, combined with the settings in the module given
+in the ``DJANGO_SETTINGS_MODULE`` environment variable. But if you're using the
+template system independently of the rest of Django, the environment variable
+approach isn't very convenient, because you probably want to configure the
+template system in line with the rest of your application rather than dealing
+with settings files and pointing to them via environment variables.
+
+To solve this problem, you need to use the manual configuration option
+described in the `settings file`_ documentation. Simply import the appropriate
+pieces of the templating system and then, *before* you call any of the
+templating functions, call ``django.conf.settings.configure()`` with any
+settings you wish to specify. You might want to consider setting at least
+``TEMPLATE_DIRS`` (if you are going to use template loaders),
+``DEFAULT_CHARSET`` (although the default of ``utf-8`` is probably fine) and
+``TEMPLATE_DEBUG``. All available settings are described in the
+`settings documentation`_, and any setting starting with *TEMPLATE_*
+is of obvious interest.
+
+.. _settings file: http://www.djangoproject.com/documentation/settings/#using-settings-without-the-django-settings-module-environment-variable
+.. _settings documentation: http://www.djangoproject.com/documentation/settings/

Added: vendor/django/current/docs/transactions.txt
===================================================================
--- vendor/django/current/docs/transactions.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/transactions.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,163 @@
+==============================
+Managing database transactions
+==============================
+
+Django gives you a few ways to control how database transactions are managed,
+if you're using a database that supports transactions.
+
+Django's default transaction behavior
+=====================================
+
+Django's default behavior is to commit automatically when any built-in,
+data-altering model function is called. For example, if you call
+``model.save()`` or ``model.delete()``, the change will be committed
+immediately.
+
+This is much like the auto-commit setting for most databases. As soon as you
+perform an action that needs to write to the database, Django produces the
+``INSERT``/``UPDATE``/``DELETE`` statements and then does the ``COMMIT``.
+There's no implicit ``ROLLBACK``.
+
+Tying transactions to HTTP requests
+===================================
+
+The recommended way to handle transactions in Web requests is to tie them to
+the request and response phases via Django's ``TransactionMiddleware``.
+
+It works like this: When a request starts, Django starts a transaction. If the
+response is produced without problems, Django commits any pending transactions.
+If the view function produces an exception, Django rolls back any pending
+transactions.
+
+To activate this feature, just add the ``TransactionMiddleware`` middleware to
+your ``MIDDLEWARE_CLASSES`` setting::
+
+    MIDDLEWARE_CLASSES = (
+        'django.contrib.sessions.middleware.SessionMiddleware',
+        'django.middleware.common.CommonMiddleware',
+        'django.middleware.cache.CacheMiddleware',
+        'django.middleware.transaction.TransactionMiddleware',
+    )
+
+The order is quite important. The transaction middleware applies not only to
+view functions, but also for all middleware modules that come after it. So if
+you use the session middleware after the transaction middleware, session
+creation will be part of the transaction.
+
+An exception is ``CacheMiddleware``, which is never affected. The cache
+middleware uses its own database cursor (which is mapped to its own database
+connection internally).
+
+Controlling transaction management in views
+===========================================
+
+For most people, implicit request-based transactions work wonderfully. However,
+if you need more fine-grained control over how transactions are managed, you
+can use Python decorators to change the way transactions are handled by a
+particular view function.
+
+.. note::
+
+    Although the examples below use view functions as examples, these
+    decorators can be applied to non-view functions as well.
+
+``django.db.transaction.autocommit``
+------------------------------------
+
+Use the ``autocommit`` decorator to switch a view function to Django's default
+commit behavior, regardless of the global transaction setting.
+
+Example::
+
+    from django.db import transaction
+
+    @transaction.autocommit
+    def viewfunc(request):
+        ....
+
+Within ``viewfunc()``, transactions will be committed as soon as you call
+``model.save()``, ``model.delete()``, or any other function that writes to the
+database.
+
+``django.db.transaction.commit_on_success``
+-------------------------------------------
+
+Use the ``commit_on_success`` decorator to use a single transaction for
+all the work done in a function::
+
+    from django.db import transaction
+
+    @transaction.commit_on_success
+    def viewfunc(request):
+        ....
+
+If the function returns successfully, then Django will commit all work done
+within the function at that point. If the function raises an exception, though,
+Django will roll back the transaction.
+
+``django.db.transaction.commit_manually``
+-----------------------------------------
+
+Use the ``commit_manually`` decorator if you need full control over
+transactions. It tells Django you'll be managing the transaction on your own.
+
+If your view changes data and doesn't ``commit()`` or ``rollback()``, Django
+will raise a ``TransactionManagementError`` exception.
+
+Manual transaction management looks like this::
+
+    from django.db import transaction
+
+    @transaction.commit_manually
+    def viewfunc(request):
+        ...
+        # You can commit/rollback however and whenever you want
+        transaction.commit()
+        ...
+
+        # But you've got to remember to do it yourself!
+        try:
+            ...
+        except:
+            transaction.rollback()
+        else:
+            transaction.commit()
+
+.. admonition:: An important note to users of earlier Django releases:
+
+    The database ``connection.commit()`` and ``connection.rollback()`` methods
+    (called ``db.commit()`` and ``db.rollback()`` in 0.91 and earlier) no longer
+    exist. They've been replaced by ``transaction.commit()`` and
+    ``transaction.rollback()``.
+
+How to globally deactivate transaction management
+=================================================
+
+Control freaks can totally disable all transaction management by setting
+``DISABLE_TRANSACTION_MANAGEMENT`` to ``True`` in the Django settings file.
+
+If you do this, Django won't provide any automatic transaction management
+whatsoever. Middleware will no longer implicitly commit transactions, and
+you'll need to roll management yourself. This even requires you to commit
+changes done by middleware somewhere else.
+
+Thus, this is best used in situations where you want to run your own
+transaction-controlling middleware or do something really strange. In almost
+all situations, you'll be better off using the default behavior, or the
+transaction middleware, and only modify selected functions as needed.
+
+Transactions in MySQL
+=====================
+
+If you're using MySQL, your tables may or may not support transactions; it
+depends on your MySQL version and the table types you're using. (By
+"table types," we mean something like "InnoDB" or "MyISAM".) MySQL transaction
+peculiarities are outside the scope of this article, but the MySQL site has
+`information on MySQL transactions`_.
+
+If your MySQL setup does *not* support transactions, then Django will function
+in auto-commit mode: Statements will be executed and committed as soon as
+they're called. If your MySQL setup *does* support transactions, Django will
+handle transactions as explained in this document.
+
+.. _information on MySQL transactions: http://dev.mysql.com/books/mysqlpress/mysql-tutorial/ch10.html

Added: vendor/django/current/docs/tutorial01.txt
===================================================================
--- vendor/django/current/docs/tutorial01.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/tutorial01.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,559 @@
+=====================================
+Writing your first Django app, part 1
+=====================================
+
+Let's learn by example.
+
+Throughout this tutorial, we'll walk you through the creation of a basic
+poll application.
+
+It'll consist of two parts:
+
+    * A public site that lets people view polls and vote in them.
+    * An admin site that lets you add, change and delete poll.
+
+We'll assume you have `Django installed`_ already. You can tell Django is
+installed by running the Python interactive interpreter and typing
+``import django``. If that command runs successfully, with no errors, Django is
+installed.
+
+.. _`Django installed`: http://www.djangoproject.com/documentation/install/
+
+Creating a project
+==================
+
+If this is your first time using Django, you'll have to take care of some
+initial setup. Namely, you'll need to auto-generate some code that establishes
+a Django *project* -- a collection of settings for an instance of Django,
+including database configuration, Django-specific options and
+application-specific settings.
+
+From the command line, ``cd`` into a directory where you'd like to store your
+code, then run the command ``django-admin.py startproject mysite``. This
+will create a ``mysite`` directory in your current directory.
+
+(``django-admin.py`` should be on your system path if you installed Django via
+``python setup.py``. If it's not on your path, you can find it in
+``site-packages/django/bin``, where ``site-packages`` is a directory within
+your Python installation. Consider symlinking to ``django-admin.py`` from some
+place on your path, such as ``/usr/local/bin``.)
+
+.. admonition:: Where should this code live?
+
+    If your background is in PHP, you're probably used to putting code under the
+    Web server's document root (in a place such as ``/var/www``). With Django,
+    you don't do that. It's not a good idea to put any of this Python code within
+    your Web server's document root, because it risks the possibility that
+    people may be able to view your code over the Web. That's not good for
+    security.
+
+    Put your code in some directory **outside** of the document root, such as
+    ``/home/mycode``.
+
+Let's look at what ``startproject`` created::
+
+    mysite/
+        __init__.py
+        manage.py
+        settings.py
+        urls.py
+
+These files are:
+
+    * ``__init__.py``: An empty file that tells Python that this directory
+      should be considered a Python package. (Read `more about packages`_ in the
+      official Python docs if you're a Python beginner.)
+    * ``manage.py``: A command-line utility that lets you interact with this
+      Django project in various ways.
+    * ``settings.py``: Settings/configuration for this Django project.
+    * ``urls.py``: The URL declarations for this Django project; a "table of
+      contents" of your Django-powered site.
+
+.. _more about packages: http://docs.python.org/tut/node8.html#packages
+
+The development server
+----------------------
+
+Let's verify this worked. Change into the ``mysite`` directory, if you
+haven't already, and run the command ``python manage.py runserver``. You'll see
+the following output on the command line::
+
+    Validating models...
+    0 errors found.
+
+    Django version 0.95, using settings 'mysite.settings'
+    Development server is running at http://127.0.0.1:8000/
+    Quit the server with CONTROL-C (Unix) or CTRL-BREAK (Windows).
+
+You've started the Django development server, a lightweight Web server written
+purely in Python. We've included this with Django so you can develop things
+rapidly, without having to deal with configuring a production server -- such as
+Apache -- until you're ready for production.
+
+Now's a good time to note: DON'T use this server in anything resembling a
+production environment. It's intended only for use while developing. (We're in
+the business of making Web frameworks, not Web servers.)
+
+Now that the server's running, visit http://127.0.0.1:8000/ with your Web
+browser. You'll see a "Welcome to Django" page, in pleasant, light-blue pastel.
+It worked!
+
+.. admonition:: Changing the port
+
+    By default, the ``runserver`` command starts the development server on port
+    8000. If you want to change the server's port, pass it as a command-line
+    argument. For instance, this command starts the server on port 8080::
+
+        python manage.py runserver 8080
+
+    Full docs for the development server are at `django-admin documentation`_.
+
+.. _django-admin documentation: http://www.djangoproject.com/documentation/django_admin/
+
+Database setup
+--------------
+
+Now, edit ``settings.py``. It's a normal Python module with module-level
+variables representing Django settings. Change these settings to match your
+database's connection parameters:
+
+    * ``DATABASE_ENGINE`` -- Either 'postgresql', 'mysql' or 'sqlite3'.
+      More coming soon.
+    * ``DATABASE_NAME`` -- The name of your database, or the full (absolute)
+      path to the database file if you're using SQLite.
+    * ``DATABASE_USER`` -- Your database username (not used for SQLite).
+    * ``DATABASE_PASSWORD`` -- Your database password (not used for SQLite).
+    * ``DATABASE_HOST`` -- The host your database is on. Leave this as an
+      empty string if your database server is on the same physical machine
+      (not used for SQLite).
+
+.. admonition:: Note
+
+    If you're using PostgreSQL or MySQL, make sure you've created a database by
+    this point. Do that with "``CREATE DATABASE database_name;``" within your
+    database's interactive prompt.
+
+While you're editing ``settings.py``, take note of the ``INSTALLED_APPS``
+setting towards the bottom of the file. That variable holds the names of all
+Django applications that are activated in this Django instance. Apps can be
+used in multiple projects, and you can package and distribute them for use
+by others in their projects.
+
+By default, ``INSTALLED_APPS`` contains the following apps, all of which come
+with Django:
+
+    * ``django.contrib.auth`` -- An authentication system.
+    * ``django.contrib.contenttypes`` -- A framework for content types.
+    * ``django.contrib.sessions`` -- A session framework.
+    * ``django.contrib.sites`` -- A framework for managing multiple sites
+      with one Django installation.
+
+These applications are included by default as a convenience for the common
+case.
+
+Each of these applications makes use of at least one database table, though,
+so we need to create the tables in the database before we can use them. To do
+that, run the following command::
+
+    python manage.py syncdb
+
+The ``syncdb`` command looks at the ``INSTALLED_APPS`` setting and creates any
+necessary database tables according to the database settings in your
+``settings.py`` file. You'll see a message for each database table it creates,
+and you'll get a prompt asking you if you'd like to create a superuser account
+for the authentication system. Go ahead and do that.
+
+If you're interested, run the command-line client for your database and type
+``\dt`` (PostgreSQL), ``SHOW TABLES;`` (MySQL), or ``.schema`` (SQLite) to
+display the tables Django created.
+
+.. admonition:: For the minimalists
+
+    Like we said above, the default applications are included for the common
+    case, but not everybody needs them. If you don't need any or all of them,
+    feel free to comment-out or delete the appropriate line(s) from
+    ``INSTALLED_APPS`` before running ``syncdb``. The ``syncdb`` command will
+    only create tables for apps in ``INSTALLED_APPS``.
+
+Creating models
+===============
+
+Now that your environment -- a "project" -- is set up, you're set to start
+doing work.
+
+Each application you write in Django consists of a Python package, somewhere
+on your `Python path`_, that follows a certain convention. Django comes with a
+utility that automatically generates the basic directory structure of an app,
+so you can focus on writing code rather than creating directories.
+
+.. admonition:: Projects vs. apps
+
+    What's the difference between a project and an app? An app is a Web
+    application that does something -- e.g., a weblog system, a database of
+    public records or a simple poll app. A project is a collection of
+    configuration and apps for a particular Web site. A project can contain
+    multiple apps. An app can be in multiple projects.
+
+In this tutorial, we'll create our poll app in the ``mysite`` directory,
+for simplicity. As a consequence, the app will be coupled to the project --
+that is, Python code within the poll app will refer to ``mysite.polls``.
+Later in this tutorial, we'll discuss decoupling your apps for distribution.
+
+To create your app, make sure you're in the ``mysite`` directory and type
+this command::
+
+    python manage.py startapp polls
+
+That'll create a directory ``polls``, which is laid out like this::
+
+    polls/
+        __init__.py
+        models.py
+        views.py
+
+This directory structure will house the poll application.
+
+The first step in writing a database Web app in Django is to define your models
+-- essentially, your database layout, with additional metadata.
+
+.. admonition:: Philosophy
+
+   A model is the single, definitive source of data about your
+   data. It contains the essential fields and behaviors of the data you're
+   storing. Django follows the `DRY Principle`_. The goal is to define your
+   data model in one place and automatically derive things from it.
+
+In our simple poll app, we'll create two models: polls and choices. A poll has
+a question and a publication date. A choice has two fields: the text of the
+choice and a vote tally. Each choice is associated with a poll.
+
+These concepts are represented by simple Python classes. Edit the
+``polls/models.py`` file so it looks like this::
+
+    from django.db import models
+
+    class Poll(models.Model):
+        question = models.CharField(maxlength=200)
+        pub_date = models.DateTimeField('date published')
+
+    class Choice(models.Model):
+        poll = models.ForeignKey(Poll)
+        choice = models.CharField(maxlength=200)
+        votes = models.IntegerField()
+
+The code is straightforward. Each model is represented by a class that
+subclasses ``django.db.models.Model``. Each model has a number of class
+variables, each of which represents a database field in the model.
+
+Each field is represented by an instance of a ``models.*Field`` class -- e.g.,
+``models.CharField`` for character fields and ``models.DateTimeField`` for
+datetimes. This tells Django what type of data each field holds.
+
+The name of each ``models.*Field`` instance (e.g. ``question`` or ``pub_date`` )
+is the field's name, in machine-friendly format. You'll use this value in your
+Python code, and your database will use it as the column name.
+
+You can use an optional first positional argument to a ``Field`` to designate a
+human-readable name. That's used in a couple of introspective parts of Django,
+and it doubles as documentation. If this field isn't provided, Django will use
+the machine-readable name. In this example, we've only defined a human-readable
+name for ``Poll.pub_date``. For all other fields in this model, the field's
+machine-readable name will suffice as its human-readable name.
+
+Some ``Field`` classes have required elements. ``CharField``, for example,
+requires that you give it a ``maxlength``. That's used not only in the database
+schema, but in validation, as we'll soon see.
+
+Finally, note a relationship is defined, using ``models.ForeignKey``. That tells
+Django each Choice is related to a single Poll. Django supports all the common
+database relationships: many-to-ones, many-to-manys and one-to-ones.
+
+.. _`Python path`: http://docs.python.org/tut/node8.html#SECTION008110000000000000000
+.. _DRY Principle: http://c2.com/cgi/wiki?DontRepeatYourself
+
+Activating models
+=================
+
+That small bit of model code gives Django a lot of information. With it, Django
+is able to:
+
+    * Create a database schema (``CREATE TABLE`` statements) for this app.
+    * Create a Python database-access API for accessing Poll and Choice objects.
+
+But first we need to tell our project that the ``polls`` app is installed.
+
+.. admonition:: Philosophy
+
+    Django apps are "pluggable": You can use an app in multiple projects, and
+    you can distribute apps, because they don't have to be tied to a given
+    Django installation.
+
+Edit the ``settings.py`` file again, and change the ``INSTALLED_APPS`` setting
+to include the string ``'mysite.polls'``. So it'll look like this::
+
+    INSTALLED_APPS = (
+        'django.contrib.auth',
+        'django.contrib.contenttypes',
+        'django.contrib.sessions',
+        'django.contrib.sites',
+        'mysite.polls'
+    )
+
+Now Django knows ``mysite`` includes the ``polls`` app. Let's run another command::
+
+    python manage.py sql polls
+
+You should see the following (the CREATE TABLE SQL statements for the polls app)::
+
+    BEGIN;
+    CREATE TABLE "polls_poll" (
+        "id" serial NOT NULL PRIMARY KEY,
+        "question" varchar(200) NOT NULL,
+        "pub_date" timestamp with time zone NOT NULL
+    );
+    CREATE TABLE "polls_choice" (
+        "id" serial NOT NULL PRIMARY KEY,
+        "poll_id" integer NOT NULL REFERENCES "polls_poll" ("id"),
+        "choice" varchar(200) NOT NULL,
+        "votes" integer NOT NULL
+    );
+    COMMIT;
+
+Note the following:
+
+    * Table names are automatically generated by combining the name of the app
+      (``polls``) and the lowercase name of the model -- ``poll`` and
+      ``choice``. (You can override this behavior.)
+
+    * Primary keys (IDs) are added automatically. (You can override this, too.)
+
+    * By convention, Django appends ``"_id"`` to the foreign key field name.
+      Yes, you can override this, as well.
+
+    * The foreign key relationship is made explicit by a ``REFERENCES`` statement.
+
+    * It's tailored to the database you're using, so database-specific field
+      types such as ``auto_increment`` (MySQL), ``serial`` (PostgreSQL), or
+      ``integer primary key`` (SQLite) are handled for you automatically. Same
+      goes for quoting of field names -- e.g., using double quotes or single
+      quotes. The author of this tutorial runs PostgreSQL, so the example
+      output is in PostgreSQL syntax.
+
+    * The `sql` command doesn't actually run the SQL in your database - it just
+      prints it to the screen so that you can see what SQL Django thinks is required.
+      If you wanted to, you could copy and paste this SQL into your database prompt.
+      However, as we will see shortly, Django provides an easier way of committing
+      the SQL to the database.
+
+If you're interested, also run the following commands:
+    * ``python manage.py validate polls`` -- Checks for any errors in the
+      construction of your models.
+
+    * ``python manage.py sqlinitialdata polls`` -- Outputs any initial data
+      required for Django's admin framework and your models.
+
+    * ``python manage.py sqlclear polls`` -- Outputs the necessary ``DROP
+      TABLE`` statements for this app, according to which tables already exist
+      in your database (if any).
+
+    * ``python manage.py sqlindexes polls`` -- Outputs the ``CREATE INDEX``
+      statements for this app.
+
+    * ``python manage.py sqlall polls`` -- A combination of all the SQL from
+      the 'sql', 'sqlinitialdata', and 'sqlindexes' commands.
+
+Looking at the output of those commands can help you understand what's actually
+happening under the hood.
+
+Now, run ``syncdb`` again to create those model tables in your database::
+
+    python manage.py syncdb
+
+The ``syncdb`` command runs the sql from 'sqlall' on your database for all apps
+in ``INSTALLED_APPS`` that don't already exist in your database. This creates
+all the tables, initial data and indexes for any apps you have added to your
+project since the last time you ran syncdb. ``syncdb`` can be called as often
+as you like, and it will only ever create the tables that don't exist.
+
+Read the `django-admin.py documentation`_ for full information on what the
+``manage.py`` utility can do.
+
+.. _django-admin.py documentation: http://www.djangoproject.com/documentation/django_admin/
+
+Playing with the API
+====================
+
+Now, let's hop into the interactive Python shell and play around with the free
+API Django gives you. To invoke the Python shell, use this command::
+
+    python manage.py shell
+
+We're using this instead of simply typing "python", because ``manage.py`` sets
+up the project's environment for you. "Setting up the environment" involves two
+things:
+
+    * Putting ``mysite`` on ``sys.path``. For flexibility, several pieces of
+      Django refer to projects in Python dotted-path notation (e.g.
+      ``'mysite.polls.models'``). In order for this to work, the
+      ``mysite`` package has to be on ``sys.path``.
+
+      We've already seen one example of this: the ``INSTALLED_APPS`` setting is
+      a list of packages in dotted-path notation.
+
+    * Setting the ``DJANGO_SETTINGS_MODULE`` environment variable, which gives
+      Django the path to your ``settings.py`` file.
+
+.. admonition:: Bypassing manage.py
+
+    If you'd rather not use ``manage.py``, no problem. Just make sure
+    ``mysite`` is at the root level on the Python path (i.e.,
+    ``import mysite`` works) and set the ``DJANGO_SETTINGS_MODULE``
+    environment variable to ``mysite.settings``.
+
+    For more information on all of this, see the `django-admin.py documentation`_.
+
+Once you're in the shell, explore the database API::
+
+    # Import the model classes we just wrote.
+    >>> from mysite.polls.models import Poll, Choice
+
+    # No polls are in the system yet.
+    >>> Poll.objects.all()
+    []
+
+    # Create a new Poll.
+    >>> from datetime import datetime
+    >>> p = Poll(question="What's up?", pub_date=datetime.now())
+
+    # Save the object into the database. You have to call save() explicitly.
+    >>> p.save()
+
+    # Now it has an ID. Note that this might say "1L" instead of "1", depending
+    # on which database you're using. That's no biggie; it just means your
+    # database backend prefers to return integers as Python long integer
+    # objects.
+    >>> p.id
+    1
+
+    # Access database columns via Python attributes.
+    >>> p.question
+    "What's up?"
+    >>> p.pub_date
+    datetime.datetime(2005, 7, 15, 12, 00, 53)
+
+    # Change values by changing the attributes, then calling save().
+    >>> p.pub_date = datetime(2005, 4, 1, 0, 0)
+    >>> p.save()
+
+    # objects.all() displays all the polls in the database.
+    >>> Poll.objects.all()
+    [<Poll: Poll object>]
+
+
+Wait a minute. ``<Poll: Poll object>`` is, utterly, an unhelpful
+representation of this object. Let's fix that by editing the polls model (in
+the ``polls/models.py`` file) and adding a ``__str__()`` method to both
+``Poll`` and ``Choice``::
+
+    class Poll(models.Model):
+        # ...
+        def __str__(self):
+            return self.question
+
+    class Choice(models.Model):
+        # ...
+        def __str__(self):
+            return self.choice
+
+It's important to add ``__str__()`` methods to your models, not only for your
+own sanity when dealing with the interactive prompt, but also because objects'
+representations are used throughout Django's automatically-generated admin.
+
+Note these are normal Python methods. Let's add a custom method, just for
+demonstration::
+
+    import datetime
+    # ...
+    class Poll(models.Model):
+        # ...
+        def was_published_today(self):
+            return self.pub_date.date() == datetime.date.today()
+
+Note the addition of ``import datetime`` to reference Python's standard
+``datetime`` module.
+
+Let's jump back into the Python interactive shell by running
+``python manage.py shell`` again::
+
+    >>> from mysite.polls.models import Poll, Choice
+
+    # Make sure our __str__() addition worked.
+    >>> Poll.objects.all()
+    [<Poll: What's up?>]
+
+    # Django provides a rich database lookup API that's entirely driven by
+    # keyword arguments.
+    >>> Poll.objects.filter(id=1)
+    [<Poll: What's up?>]
+    >>> Poll.objects.filter(question__startswith='What')
+    [<Poll: What's up?>]
+
+    # Get the poll whose year is 2005. Of course, if you're going through this
+    # tutorial in another year, change as appropriate.
+    >>> Poll.objects.get(pub_date__year=2005)
+    <Poll: What's up?>
+
+    >>> Poll.objects.get(id=2)
+    Traceback (most recent call last):
+        ...
+    DoesNotExist: Poll matching query does not exist.
+
+    # Lookup by a primary key is the most common case, so Django provides a
+    # shortcut for primary-key exact lookups.
+    # The following is identical to Poll.objects.get(id=1).
+    >>> Poll.objects.get(pk=1)
+    <Poll: What's up?>
+
+    # Make sure our custom method worked.
+    >>> p = Poll.objects.get(pk=1)
+    >>> p.was_published_today()
+    False
+
+    # Give the Poll a couple of Choices. The create call constructs a new
+    # choice object, does the INSERT statement, adds the choice to the set
+    # of available choices and returns the new Choice object.
+    >>> p = Poll.objects.get(pk=1)
+    >>> p.choice_set.create(choice='Not much', votes=0)
+    <Choice: Not much>
+    >>> p.choice_set.create(choice='The sky', votes=0)
+    <Choice: The sky>
+    >>> c = p.choice_set.create(choice='Just hacking again', votes=0)
+
+    # Choice objects have API access to their related Poll objects.
+    >>> c.poll
+    <Poll: What's up?>
+
+    # And vice versa: Poll objects get access to Choice objects.
+    >>> p.choice_set.all()
+    [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
+    >>> p.choice_set.count()
+    3
+
+    # The API automatically follows relationships as far as you need.
+    # Use double underscores to separate relationships.
+    # This works as many levels deep as you want. There's no limit.
+    # Find all Choices for any poll whose pub_date is in 2005.
+    >>> Choice.objects.filter(poll__pub_date__year=2005)
+    [<Choice: Not much>, <Choice: The sky>, <Choice: Just hacking again>]
+
+    # Let's delete one of the choices. Use delete() for that.
+    >>> c = p.choice_set.filter(choice__startswith='Just hacking')
+    >>> c.delete()
+
+For full details on the database API, see our `Database API reference`_.
+
+When you're comfortable with the API, read `part 2 of this tutorial`_ to get
+Django's automatic admin working.
+
+.. _Database API reference: http://www.djangoproject.com/documentation/db_api/
+.. _part 2 of this tutorial: http://www.djangoproject.com/documentation/tutorial2/

Added: vendor/django/current/docs/tutorial02.txt
===================================================================
--- vendor/django/current/docs/tutorial02.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/tutorial02.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,437 @@
+=====================================
+Writing your first Django app, part 2
+=====================================
+
+This tutorial begins where `Tutorial 1`_ left off. We're continuing the Web-poll
+application and will focus on Django's automatically-generated admin site.
+
+.. _Tutorial 1: http://www.djangoproject.com/documentation/tutorial1/
+
+.. admonition:: Philosophy
+
+    Generating admin sites for your staff or clients to add, change and delete
+    content is tedious work that doesn't require much creativity. For that reason,
+    Django entirely automates creation of admin interfaces for models.
+
+    Django was written in a newsroom environment, with a very clear separation
+    between "content publishers" and the "public" site. Site managers use the
+    system to add news stories, events, sports scores, etc., and that content is
+    displayed on the public site. Django solves the problem of creating a unified
+    interface for site administrators to edit content.
+
+    The admin isn't necessarily intended to be used by site visitors; it's for site
+    managers.
+
+Activate the admin site
+=======================
+
+The Django admin site is not activated by default -- it's an opt-in thing. To
+activate the admin site for your installation, do these three things:
+
+    * Add ``"django.contrib.admin"`` to your ``INSTALLED_APPS`` setting.
+    * Run ``python manage.py syncdb``. Since you have added a new application
+      to ``INSTALLED_APPS``, the database tables need to be updated.
+    * Edit your ``mysite/urls.py`` file and uncomment the line below
+      "Uncomment this for admin:". This file is a URLconf; we'll dig into
+      URLconfs in the next tutorial. For now, all you need to know is that it
+      maps URL roots to applications.
+
+Start the development server
+============================
+
+Let's start the development server and explore the admin site.
+
+Recall from Tutorial 1 that you start the development server like so::
+
+    python manage.py runserver
+
+Now, open a Web browser and go to "/admin/" on your local domain -- e.g.,
+http://127.0.0.1:8000/admin/. You should see the admin's login screen:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin01.png
+   :alt: Django admin login screen
+
+Enter the admin site
+====================
+
+Now, try logging in. (You created a superuser account in the first part of this
+tutorial, remember?) You should see the Django admin index page:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin02t.png
+   :alt: Django admin index page
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin02.png
+
+By default, you should see two types of editable content: groups and users.
+These are core features Django ships with by default.
+
+.. _"I can't log in" questions: http://www.djangoproject.com/documentation/faq/#the-admin-site
+
+Make the poll app modifiable in the admin
+=========================================
+
+But where's our poll app? It's not displayed on the admin index page.
+
+Just one thing to do: We need to specify in the ``Poll`` model that ``Poll``
+objects have an admin interface. Edit the ``mysite/polls/models.py`` file and
+make the following change to add an inner ``Admin`` class::
+
+    class Poll(models.Model):
+        # ...
+        class Admin:
+            pass
+
+The ``class Admin`` will contain all the settings that control how this model
+appears in the Django admin.  All the settings are optional, however, so
+creating an empty class means "give this object an admin interface using
+all the default options."
+
+Now reload the Django admin page to see your changes. Note that you don't have
+to restart the development server -- the server will auto-reload your project,
+so any modifications code will be seen immediately in your browser.
+
+Explore the free admin functionality
+====================================
+
+Now that ``Poll`` has the inner ``Admin`` class, Django knows that it should be
+displayed on the admin index page:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin03t.png
+   :alt: Django admin index page, now with polls displayed
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin03.png
+
+Click "Polls." Now you're at the "change list" page for polls. This page
+displays all the polls in the database and lets you choose one to change it.
+There's the "What's up?" poll we created in the first tutorial:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin04t.png
+   :alt: Polls change list page
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin04.png
+
+Click the "What's up?" poll to edit it:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin05t.png
+   :alt: Editing form for poll object
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin05.png
+
+Things to note here:
+
+* The form is automatically generated from the Poll model.
+* The different model field types (``models.DateTimeField``, ``models.CharField``)
+  correspond to the appropriate HTML input widget. Each type of field knows
+  how to display itself in the Django admin.
+* Each ``DateTimeField`` gets free JavaScript shortcuts. Dates get a "Today"
+  shortcut and calendar popup, and times get a "Now" shortcut and a convenient
+  popup that lists commonly entered times.
+
+The bottom part of the page gives you a couple of options:
+
+* Save -- Saves changes and returns to the change-list page for this type of
+  object.
+* Save and continue editing -- Saves changes and reloads the admin page for
+  this object.
+* Save and add another -- Saves changes and loads a new, blank form for this
+  type of object.
+* Delete -- Displays a delete confirmation page.
+
+Change the "Date published" by clicking the "Today" and "Now" shortcuts. Then
+click "Save and continue editing." Then click "History" in the upper right.
+You'll see a page listing all changes made to this object via the Django admin,
+with the timestamp and username of the person who made the change:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin06t.png
+   :alt: History page for poll object
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin06.png
+
+Customize the admin form
+========================
+
+Take a few minutes to marvel at all the code you didn't have to write.
+
+Let's customize this a bit. We can reorder the fields by explicitly adding a
+``fields`` parameter to ``Admin``::
+
+        class Admin:
+            fields = (
+                (None, {'fields': ('pub_date', 'question')}),
+            )
+
+That made the "Publication date" show up first instead of second:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin07.png
+   :alt: Fields have been reordered
+
+This isn't impressive with only two fields, but for admin forms with dozens
+of fields, choosing an intuitive order is an important usability detail.
+
+And speaking of forms with dozens of fields, you might want to split the form
+up into fieldsets::
+
+        class Admin:
+            fields = (
+                (None, {'fields': ('question',)}),
+                ('Date information', {'fields': ('pub_date',)}),
+            )
+
+The first element of each tuple in ``fields`` is the title of the fieldset.
+Here's what our form looks like now:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin08t.png
+   :alt: Form has fieldsets now
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin08.png
+
+You can assign arbitrary HTML classes to each fieldset. Django provides a
+``"collapse"`` class that displays a particular fieldset initially collapsed.
+This is useful when you have a long form that contains a number of fields that
+aren't commonly used::
+
+        class Admin:
+            fields = (
+                (None, {'fields': ('question',)}),
+                ('Date information', {'fields': ('pub_date',), 'classes': 'collapse'}),
+            )
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin09.png
+   :alt: Fieldset is initially collapsed
+
+Adding related objects
+======================
+
+OK, we have our Poll admin page. But a ``Poll`` has multiple ``Choices``, and
+the admin page doesn't display choices.
+
+Yet.
+
+There are two ways to solve this problem. The first is to give the ``Choice``
+model its own inner ``Admin`` class, just as we did with ``Poll``. Here's what
+that would look like::
+
+    class Choice(models.Model):
+        # ...
+        class Admin:
+            pass
+
+Now "Choices" is an available option in the Django admin. The "Add choice" form
+looks like this:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin10.png
+   :alt: Choice admin page
+
+In that form, the "Poll" field is a select box containing every poll in the
+database. Django knows that a ``ForeignKey`` should be represented in the admin
+as a ``<select>`` box. In our case, only one poll exists at this point.
+
+Also note the "Add Another" link next to "Poll." Every object with a ForeignKey
+relationship to another gets this for free. When you click "Add Another," you'll
+get a popup window with the "Add poll" form. If you add a poll in that window
+and click "Save," Django will save the poll to the database and dynamically add
+it as the selected choice on the "Add choice" form you're looking at.
+
+But, really, this is an inefficient way of adding Choice objects to the system.
+It'd be better if you could add a bunch of Choices directly when you create the
+Poll object. Let's make that happen.
+
+Remove the ``Admin`` for the Choice model. Then, edit the ``ForeignKey(Poll)``
+field like so::
+
+    poll = models.ForeignKey(Poll, edit_inline=models.STACKED, num_in_admin=3)
+
+This tells Django: "Choice objects are edited on the Poll admin page. By
+default, provide enough fields for 3 Choices."
+
+Then change the other fields in ``Choice`` to give them ``core=True``::
+
+    choice = models.CharField(maxlength=200, core=True)
+    votes = models.IntegerField(core=True)
+
+This tells Django: "When you edit a Choice on the Poll admin page, the 'choice'
+and 'votes' fields are required. The presence of at least one of them signifies
+the addition of a new Choice object, and clearing both of them signifies the
+deletion of that existing Choice object."
+
+Load the "Add poll" page to see how that looks:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin11t.png
+   :alt: Add poll page now has choices on it
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin11.png
+
+It works like this: There are three slots for related Choices -- as specified
+by ``num_in_admin`` -- but each time you come back to the "Change" page for an
+already-created object, you get one extra slot. (This means there's no
+hard-coded limit on how many related objects can be added.) If you wanted space
+for three extra Choices each time you changed the poll, you'd use
+``num_extra_on_change=3``.
+
+One small problem, though. It takes a lot of screen space to display all the
+fields for entering related Choice objects. For that reason, Django offers an
+alternate way of displaying inline related objects::
+
+    poll = models.ForeignKey(Poll, edit_inline=models.TABULAR, num_in_admin=3)
+
+With that ``edit_inline=models.TABULAR`` (instead of ``models.STACKED``), the
+related objects are displayed in a more compact, table-based format:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin12.png
+   :alt: Add poll page now has more compact choices
+
+Customize the admin change list
+===============================
+
+Now that the Poll admin page is looking good, let's make some tweaks to the
+"change list" page -- the one that displays all the polls in the system.
+
+Here's what it looks like at this point:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin04t.png
+   :alt: Polls change list page
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin04.png
+
+By default, Django displays the ``str()`` of each object. But sometimes it'd
+be more helpful if we could display individual fields. To do that, use the
+``list_display`` option, which is a tuple of field names to display, as columns,
+on the change list page for the object::
+
+    class Poll(models.Model):
+        # ...
+        class Admin:
+            # ...
+            list_display = ('question', 'pub_date')
+
+Just for good measure, let's also include the ``was_published_today`` custom
+method from Tutorial 1::
+
+    list_display = ('question', 'pub_date', 'was_published_today')
+
+Now the poll change list page looks like this:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin13t.png
+   :alt: Polls change list page, updated
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin13.png
+
+You can click on the column headers to sort by those values -- except in the
+case of the ``was_published_today`` header, because sorting by the output of
+an arbitrary method is not supported. Also note that the column header for
+``was_published_today`` is, by default, the name of the method (with
+underscores replaced with spaces). But you can change that by giving that
+method a ``short_description`` attribute::
+
+    def was_published_today(self):
+        return self.pub_date.date() == datetime.date.today()
+    was_published_today.short_description = 'Published today?'
+
+
+Let's add another improvement to the Poll change list page: Filters. Add the
+following line to ``Poll.admin``::
+
+    list_filter = ['pub_date']
+
+That adds a "Filter" sidebar that lets people filter the change list by the
+``pub_date`` field:
+
+.. image:: http://media.djangoproject.com/img/doc/tutorial/admin14t.png
+   :alt: Polls change list page, updated
+   :target: http://media.djangoproject.com/img/doc/tutorial/admin14.png
+
+The type of filter displayed depends on the type of field you're filtering on.
+Because ``pub_date`` is a DateTimeField, Django knows to give the default
+filter options for DateTimeFields: "Any date," "Today," "Past 7 days,"
+"This month," "This year."
+
+This is shaping up well. Let's add some search capability::
+
+    search_fields = ['question']
+
+That adds a search box at the top of the change list. When somebody enters
+search terms, Django will search the ``question`` field. You can use as many
+fields as you'd like -- although because it uses a ``LIKE`` query behind the
+scenes, keep it reasonable, to keep your database happy.
+
+Finally, because Poll objects have dates, it'd be convenient to be able to
+drill down by date. Add this line::
+
+    date_hierarchy = 'pub_date'
+
+That adds hierarchical navigation, by date, to the top of the change list page.
+At top level, it displays all available years. Then it drills down to months
+and, ultimately, days.
+
+Now's also a good time to note that change lists give you free pagination. The
+default is to display 50 items per page. Change-list pagination, search boxes,
+filters, date-hierarchies and column-header-ordering all work together like you
+think they should.
+
+Customize the admin look and feel
+=================================
+
+Clearly, having "Django administration" and "example.com" at the top of each
+admin page is ridiculous. It's just placeholder text.
+
+That's easy to change, though, using Django's template system. The Django admin
+is powered by Django itself, and its interfaces use Django's own template
+system. (How meta!)
+
+Open your settings file (``mysite/settings.py``, remember) and look at the
+``TEMPLATE_DIRS`` setting. ``TEMPLATE_DIRS`` is a tuple of filesystem
+directories to check when loading Django templates. It's a search path.
+
+By default, ``TEMPLATE_DIRS`` is empty. So, let's add a line to it, to tell
+Django where our templates live::
+
+    TEMPLATE_DIRS = (
+        "/home/mytemplates", # Change this to your own directory.
+    )
+
+Now copy the template ``admin/base_site.html`` from within the default Django
+admin template directory (``django/contrib/admin/templates``) into an ``admin``
+subdirectory of whichever directory you're using in ``TEMPLATE_DIRS``. For
+example, if your ``TEMPLATE_DIRS`` includes ``"/home/mytemplates"``, as above,
+then copy ``django/contrib/admin/templates/admin/base_site.html`` to
+``/home/mytemplates/admin/base_site.html``. Don't forget that ``admin``
+subdirectory.
+
+Then, just edit the file and replace the generic Django text with your own
+site's name and URL as you see fit.
+
+Note that any of Django's default admin templates can be overridden. To
+override a template, just do the same thing you did with ``base_site.html`` --
+copy it from the default directory into your custom directory, and make
+changes.
+
+Astute readers will ask: But if ``TEMPLATE_DIRS`` was empty by default, how was
+Django finding the default admin templates? The answer is that, by default,
+Django automatically looks for a ``templates/`` subdirectory within each app
+package, for use as a fallback. See the `loader types documentation`_ for full
+information.
+
+.. _loader types documentation: http://www.djangoproject.com/documentation/templates_python/#loader-types
+
+Customize the admin index page
+==============================
+
+On a similar note, you might want to customize the look and feel of the Django
+admin index page.
+
+By default, it displays all available apps, according to your ``INSTALLED_APPS``
+setting. But the order in which it displays things is random, and you may want
+to make significant changes to the layout. After all, the index is probably the
+most important page of the admin, and it should be easy to use.
+
+The template to customize is ``admin/index.html``. (Do the same as with
+``admin/base_site.html`` in the previous section -- copy it from the default
+directory to your custom template directory.) Edit the file, and you'll see it
+uses a template tag called ``{% get_admin_app_list as app_list %}``. That's the
+magic that retrieves every installed Django app. Instead of using that, you can
+hard-code links to object-specific admin pages in whatever way you think is
+best.
+
+Django offers another shortcut in this department. Run the command
+``python manage.py adminindex polls`` to get a chunk of template code for
+inclusion in the admin index template. It's a useful starting point.
+
+For full details on customizing the look and feel of the Django admin site in
+general, see the `Django admin CSS guide`_.
+
+When you're comfortable with the admin site, read `part 3 of this tutorial`_ to
+start working on public poll views.
+
+.. _Django admin CSS guide: http://www.djangoproject.com/documentation/admin_css/
+.. _part 3 of this tutorial: http://www.djangoproject.com/documentation/tutorial3/

Added: vendor/django/current/docs/tutorial03.txt
===================================================================
--- vendor/django/current/docs/tutorial03.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/tutorial03.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,467 @@
+=====================================
+Writing your first Django app, part 3
+=====================================
+
+This tutorial begins where `Tutorial 2`_ left off. We're continuing the Web-poll
+application and will focus on creating the public interface -- "views."
+
+.. _Tutorial 2: http://www.djangoproject.com/documentation/tutorial2/
+
+Philosophy
+==========
+
+A view is a "type" of Web page in your Django application that generally serves
+a specific function and has a specific template. For example, in a weblog
+application, you might have the following views:
+
+    * Blog homepage -- displays the latest few entries.
+    * Entry "detail" page -- permalink page for a single entry.
+    * Year-based archive page -- displays all months with entries in the
+      given year.
+    * Month-based archive page -- displays all days with entries in the
+      given month.
+    * Day-based archive page -- displays all entries in the given day.
+    * Comment action -- handles posting comments to a given entry.
+
+In our poll application, we'll have the following four views:
+
+    * Poll "archive" page -- displays the latest few polls.
+    * Poll "detail" page -- displays a poll question, with no results but
+      with a form to vote.
+    * Poll "results" page -- displays results for a particular poll.
+    * Vote action -- handles voting for a particular choice in a particular
+      poll.
+
+In Django, each view is represented by a simple Python function.
+
+Design your URLs
+================
+
+The first step of writing views is to design your URL structure. You do this by
+creating a Python module, called a URLconf. URLconfs are how Django associates
+a given URL with given Python code.
+
+When a user requests a Django-powered page, the system looks at the
+``ROOT_URLCONF`` setting, which contains a string in Python dotted syntax.
+Django loads that module and looks for a module-level variable called
+``urlpatterns``, which is a sequence of tuples in the following format::
+
+    (regular expression, Python callback function [, optional dictionary])
+
+Django starts at the first regular expression and makes its way down the list,
+comparing the requested URL against each regular expression until it finds one
+that matches.
+
+When it finds a match, Django calls the Python callback function, with an
+``HTTPRequest`` object as the first argument, any "captured" values from the
+regular expression as keyword arguments, and, optionally, arbitrary keyword
+arguments from the dictionary (an optional third item in the tuple).
+
+For more on ``HTTPRequest`` objects, see the `request and response documentation`_.
+For more details on URLconfs, see the `URLconf documentation`_.
+
+When you ran ``python manage.py startproject mysite`` at the beginning of
+Tutorial 1, it created a default URLconf in ``mysite/urls.py``. It also
+automatically set your ``ROOT_URLCONF`` setting to point at that file::
+
+    ROOT_URLCONF = 'mysite.urls'
+
+Time for an example. Edit ``mysite/urls.py`` so it looks like this::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('',
+        (r'^polls/$', 'mysite.polls.views.index'),
+        (r'^polls/(?P<poll_id>\d+)/$', 'mysite.polls.views.detail'),
+        (r'^polls/(?P<poll_id>\d+)/results/$', 'mysite.polls.views.results'),
+        (r'^polls/(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
+    )
+
+This is worth a review. When somebody requests a page from your Web site --
+say, "/polls/23/", Django will load this Python module, because it's pointed to
+by the ``ROOT_URLCONF`` setting. It finds the variable named ``urlpatterns``
+and traverses the regular expressions in order. When it finds a regular
+expression that matches -- ``r'^polls/(?P<poll_id>\d+)/$'`` -- it loads the
+associated Python package/module: ``mysite.polls.views.detail``. That
+corresponds to the function ``detail()`` in ``mysite/polls/views.py``.
+Finally, it calls that ``detail()`` function like so::
+
+    detail(request=<HttpRequest object>, poll_id='23')
+
+The ``poll_id='23'`` part comes from ``(?P<poll_id>\d+)``. Using parenthesis around a
+pattern "captures" the text matched by that pattern and sends it as an argument
+to the view function; the ``?P<poll_id>`` defines the name that will be used to
+identify the matched pattern; and ``\d+`` is a regular experession to match a sequence of
+digits (i.e., a number).
+
+Because the URL patterns are regular expressions, there really is no limit on
+what you can do with them. And there's no need to add URL cruft such as
+``.php`` -- unless you have a sick sense of humor, in which case you can do
+something like this::
+
+    (r'^polls/latest\.php$', 'mysite.polls.views.index'),
+
+But, don't do that. It's silly.
+
+Note that these regular expressions do not search GET and POST parameters, or
+the domain name. For example, in a request to ``http://www.example.com/myapp/``,
+the URLconf will look for ``/myapp/``. In a request to
+``http://www.example.com/myapp/?page=3``, the URLconf will look for ``/myapp/``.
+
+If you need help with regular expressions, see `Wikipedia's entry`_ and the
+`Python documentation`_. Also, the O'Reilly book "Mastering Regular
+Expressions" by Jeffrey Friedl is fantastic.
+
+Finally, a performance note: these regular expressions are compiled the first
+time the URLconf module is loaded. They're super fast.
+
+.. _Wikipedia's entry: http://en.wikipedia.org/wiki/Regular_expression
+.. _Python documentation: http://www.python.org/doc/current/lib/module-re.html
+.. _request and response documentation: http://www.djangoproject.com/documentation/request_response/
+.. _URLconf documentation: http://www.djangoproject.com/documentation/url_dispatch/
+
+Write your first view
+=====================
+
+Well, we haven't created any views yet -- we just have the URLconf. But let's
+make sure Django is following the URLconf properly.
+
+Fire up the Django development Web server::
+
+    python manage.py runserver
+
+Now go to "http://localhost:8000/polls/" on your domain in your Web browser.
+You should get a pleasantly-colored error page with the following message::
+
+    ViewDoesNotExist at /polls/
+
+    Tried index in module mysite.polls.views. Error was: 'module'
+    object has no attribute 'index'
+
+This error happened because you haven't written a function ``index()`` in the
+module ``mysite/polls/views.py``.
+
+Try "/polls/23/", "/polls/23/results/" and "/polls/23/vote/". The error
+messages tell you which view Django tried (and failed to find, because you
+haven't written any views yet).
+
+Time to write the first view. Open the file ``mysite/polls/views.py``
+and put the following Python code in it::
+
+    from django.http import HttpResponse
+
+    def index(request):
+        return HttpResponse("Hello, world. You're at the poll index.")
+
+This is the simplest view possible. Go to "/polls/" in your browser, and you
+should see your text.
+
+Now add the following view. It's slightly different, because it takes an
+argument (which, remember, is passed in from whatever was captured by the
+regular expression in the URLconf)::
+
+    def detail(request, poll_id):
+        return HttpResponse("You're looking at poll %s." % poll_id)
+
+Take a look in your browser, at "/polls/34/". It'll display whatever ID you
+provide in the URL.
+
+Write views that actually do something
+======================================
+
+Each view is responsible for doing one of two things: Returning an ``HttpResponse``
+object containing the content for the requested page, or raising an exception
+such as ``Http404``. The rest is up to you.
+
+Your view can read records from a database, or not. It can use a template
+system such as Django's -- or a third-party Python template system -- or not.
+It can generate a PDF file, output XML, create a ZIP file on the fly, anything
+you want, using whatever Python libraries you want.
+
+All Django wants is that ``HttpResponse``. Or an exception.
+
+Because it's convenient, let's use Django's own database API, which we covered
+in Tutorial 1. Here's one stab at the ``index()`` view, which displays the
+latest 5 poll questions in the system, separated by commas, according to
+publication date::
+
+    from mysite.polls.models import Poll
+    from django.http import HttpResponse
+
+    def index(request):
+        latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
+        output = ', '.join([p.question for p in latest_poll_list])
+        return HttpResponse(output)
+
+There's a problem here, though: The page's design is hard-coded in the view. If
+you want to change the way the page looks, you'll have to edit this Python code.
+So let's use Django's template system to separate the design from Python::
+
+    from django.template import Context, loader
+    from mysite.polls.models import Poll
+    from django.http import HttpResponse
+
+    def index(request):
+        latest_poll_list = Poll.objects.all().order_by('-pub_date')[:5]
+        t = loader.get_template('polls/index.html')
+        c = Context({
+            'latest_poll_list': latest_poll_list,
+        })
+        return HttpResponse(t.render(c))
+
+That code loads the template called "polls/index.html" and passes it a context. The
+context is a dictionary mapping template variable names to Python objects.
+
+Reload the page. Now you'll see an error::
+
+    TemplateDoesNotExist at /polls/
+    polls/index.html
+
+Ah. There's no template yet. First, create a directory, somewhere on your
+filesystem, whose contents Django can access. (Django runs as whatever user
+your server runs.) Don't put them under your document root, though. You
+probably shouldn't make them public, just for security's sake.
+
+Then edit ``TEMPLATE_DIRS`` in your ``settings.py`` to tell Django where it can
+find templates -- just as you did in the "Customize the admin look and feel"
+section of Tutorial 2.
+
+When you've done that, create a directory ``polls`` in your template directory.
+Within that, create a file called ``index.html``. Note that our
+``loader.get_template('polls/index.html')`` code from above maps to
+"[template_directory]/polls/index.html" on the filesystem.
+
+Put the following code in that template::
+
+    {% if latest_poll_list %}
+        <ul>
+        {% for poll in latest_poll_list %}
+            <li>{{ poll.question }}</li>
+        {% endfor %}
+        </ul>
+    {% else %}
+        <p>No polls are available.</p>
+    {% endif %}
+
+Load the page in your Web browser, and you should see a bulleted-list
+containing the "What's up" poll from Tutorial 1.
+
+A shortcut: render_to_response()
+--------------------------------
+
+It's a very common idiom to load a template, fill a context and return an
+``HttpResponse`` object with the result of the rendered template. Django
+provides a shortcut. Here's the full ``index()`` view, rewritten::
+
+    from django.shortcuts import render_to_response
+    from mysite.polls.models import Poll
+
+    def index(request):
+        latest_poll_list = Poll.objects.all().order_by('-pub_date')
+        return render_to_response('polls/index.html', {'latest_poll_list': latest_poll_list})
+
+Note that we no longer need to import ``loader``, ``Context`` or
+``HttpResponse``.
+
+The ``render_to_response()`` function takes a template name as its first
+argument and a dictionary as its optional second argument. It returns an
+``HttpResponse`` object of the given template rendered with the given context.
+
+Raising 404
+===========
+
+Now, let's tackle the poll detail view -- the page that displays the question
+for a given poll. Here's the view::
+
+    from django.http import Http404
+    # ...
+    def detail(request, poll_id):
+        try:
+            p = Poll.objects.get(pk=poll_id)
+        except Poll.DoesNotExist:
+            raise Http404
+        return render_to_response('polls/detail.html', {'poll': p})
+
+The new concept here: The view raises the ``django.http.Http404``
+exception if a poll with the requested ID doesn't exist.
+
+A shortcut: get_object_or_404()
+-------------------------------
+
+It's a very common idiom to use ``get()`` and raise ``Http404`` if the
+object doesn't exist. Django provides a shortcut. Here's the ``detail()`` view,
+rewritten::
+
+    from django.shortcuts import render_to_response, get_object_or_404
+    # ...
+    def detail(request, poll_id):
+        p = get_object_or_404(Poll, pk=poll_id)
+        return render_to_response('polls/detail.html', {'poll': p})
+
+The ``get_object_or_404()`` function takes a Django model module as its first
+argument and an arbitrary number of keyword arguments, which it passes to the
+module's ``get_object()`` function. It raises ``Http404`` if the object doesn't
+exist.
+
+.. admonition:: Philosophy
+
+    Why do we use a helper function ``get_object_or_404()`` instead of
+    automatically catching the ``DoesNotExist`` exceptions at a higher level,
+    or having the model API raise ``Http404`` instead of ``DoesNotExist``?
+
+    Because that would couple the model layer to the view layer. One of the
+    foremost design goals of Django is to maintain loose coupling.
+
+There's also a ``get_list_or_404()`` function, which works just as
+``get_object_or_404()`` -- except using ``filter()`` instead of
+``get()``. It raises ``Http404`` if the list is empty.
+
+Write a 404 (page not found) view
+=================================
+
+When you raise ``Http404`` from within a view, Django will load a special view
+devoted to handling 404 errors. It finds it by looking for the variable
+``handler404``, which is a string in Python dotted syntax -- the same format
+the normal URLconf callbacks use. A 404 view itself has nothing special: It's
+just a normal view.
+
+You normally won't have to bother with writing 404 views. By default, URLconfs
+have the following line up top::
+
+    from django.conf.urls.defaults import *
+
+That takes care of setting ``handler404`` in the current module. As you can see
+in ``django/conf/urls/defaults.py``, ``handler404`` is set to
+``'django.views.defaults.page_not_found'`` by default.
+
+Three more things to note about 404 views:
+
+    * The 404 view is also called if Django doesn't find a match after checking
+      every regular expression in the URLconf.
+    * If you don't define your own 404 view -- and simply use the default,
+      which is recommended -- you still have one obligation: To create a
+      ``404.html`` template in the root of your template directory. The default
+      404 view will use that template for all 404 errors.
+    * If ``DEBUG`` is set to ``True`` (in your settings module) then your 404
+      view will never be used, and the traceback will be displayed instead.
+
+Write a 500 (server error) view
+===============================
+
+Similarly, URLconfs may define a ``handler500``, which points to a view to call
+in case of server errors. Server errors happen when you have runtime errors in
+view code.
+
+Use the template system
+=======================
+
+Back to our ``polls.detail`` view. Given the context variable ``poll``, here's
+what the template might look like::
+
+    <h1>{{ poll.question }}</h1>
+    <ul>
+    {% for choice in poll.choice_set.all %}
+        <li>{{ choice.choice }}</li>
+    {% endfor %}
+    </ul>
+
+The template system uses dot-lookup syntax to access variable attributes. In
+the example of ``{{ poll.question }}``, first Django does a dictionary lookup
+on the object ``poll``. Failing that, it tries attribute lookup -- which works,
+in this case. If attribute lookup had failed, it would've tried calling the
+method ``question()`` on the poll object.
+
+Method-calling happens in the ``{% for %}`` loop: ``poll.choice_set.all`` is
+interpreted as the Python code ``poll.choice_set.all()``, which returns an
+iterable of Choice objects and is suitable for use in the ``{% for %}`` tag.
+
+See the `template guide`_ for full details on how templates work.
+
+.. _template guide: http://www.djangoproject.com/documentation/templates/
+
+Simplifying the URLconfs
+========================
+
+Take some time to play around with the views and template system. As you edit
+the URLconf, you may notice there's a fair bit of redundancy in it::
+
+    urlpatterns = patterns('',
+        (r'^polls/$', 'mysite.polls.views.index'),
+        (r'^polls/(?P<poll_id>\d+)/$', 'mysite.polls.views.detail'),
+        (r'^polls/(?P<poll_id>\d+)/results/$', 'mysite.polls.views.results'),
+        (r'^polls/(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
+    )
+
+Namely, ``mysite.polls.views`` is in every callback.
+
+Because this is a common case, the URLconf framework provides a shortcut for
+common prefixes. You can factor out the common prefixes and add them as the
+first argument to ``patterns()``, like so::
+
+    urlpatterns = patterns('mysite.polls.views',
+        (r'^polls/$', 'index'),
+        (r'^polls/(?P<poll_id>\d+)/$', 'detail'),
+        (r'^polls/(?P<poll_id>\d+)/results/$', 'results'),
+        (r'^polls/(?P<poll_id>\d+)/vote/$', 'vote'),
+    )
+
+This is functionally identical to the previous formatting. It's just a bit
+tidier.
+
+Decoupling the URLconfs
+=======================
+
+While we're at it, we should take the time to decouple our poll-app URLs from
+our Django project configuration. Django apps are meant to be pluggable -- that
+is, each particular app should be transferrable to another Django installation
+with minimal fuss.
+
+Our poll app is pretty decoupled at this point, thanks to the strict directory
+structure that ``python manage.py startapp`` created, but one part of it is
+coupled to the Django settings: The URLconf.
+
+We've been editing the URLs in ``mysite/urls.py``, but the URL design of an
+app is specific to the app, not to the Django installation -- so let's move the
+URLs within the app directory.
+
+Copy the file ``mysite/urls.py`` to ``mysite/polls/urls.py``. Then,
+change ``mysite/urls.py`` to remove the poll-specific URLs and insert an
+``include()``::
+
+    (r'^polls/', include('mysite.polls.urls')),
+
+``include()``, simply, references another URLconf. Note that the regular
+expression doesn't have a ``$`` (end-of-string match character) but has the
+trailing slash. Whenever Django encounters ``include()``, it chops off whatever
+part of the URL matched up to that point and sends the remaining string to the
+included URLconf for further processing.
+
+Here's what happens if a user goes to "/polls/34/" in this system:
+
+* Django will find the match at ``'^polls/'``
+* It will strip off the matching text (``"polls/"``) and send the remaining
+  text -- ``"34/"`` -- to the 'mysite.polls.urls' urlconf for
+  further processing.
+
+Now that we've decoupled that, we need to decouple the
+'mysite.polls.urls' urlconf by removing the leading "polls/" from each
+line::
+
+    urlpatterns = patterns('mysite.polls.views',
+        (r'^$', 'index'),
+        (r'^(?P<poll_id>\d+)/$', 'detail'),
+        (r'^(?P<poll_id>\d+)/results/$', 'results'),
+        (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
+    )
+
+The idea behind ``include()`` and URLconf decoupling is to make it easy to
+plug-and-play URLs. Now that polls are in their own URLconf, they can be placed
+under "/polls/", or under "/fun_polls/", or under "/content/polls/", or any
+other URL root, and the app will still work.
+
+All the poll app cares about is its relative URLs, not its absolute URLs.
+
+When you're comfortable with writing views, read `part 4 of this tutorial`_ to
+learn about simple form processing and generic views.
+
+.. _part 4 of this tutorial: http://www.djangoproject.com/documentation/tutorial4/

Added: vendor/django/current/docs/tutorial04.txt
===================================================================
--- vendor/django/current/docs/tutorial04.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/tutorial04.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,244 @@
+=====================================
+Writing your first Django app, part 4
+=====================================
+
+This tutorial begins where `Tutorial 3`_ left off. We're continuing the Web-poll
+application and will focus on simple form processing and cutting down our code.
+
+Write a simple form
+===================
+
+Let's update our poll detail template from the last tutorial, so that the
+template contains an HTML ``<form>`` element::
+
+    <h1>{{ poll.question }}</h1>
+
+    {% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}
+
+    <form action="/polls/{{ poll.id }}/vote/" method="post">
+    {% for choice in poll.choice_set.all %}
+        <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
+        <label for="choice{{ forloop.counter }}">{{ choice.choice }}</label><br />
+    {% endfor %}
+    <input type="submit" value="Vote" />
+    </form>
+
+A quick rundown:
+
+    * The above template displays a radio button for each poll choice. The
+      ``value`` of each radio button is the associated poll choice's ID. The
+      ``name`` of each radio button is ``"choice"``. That means, when somebody
+      selects one of the radio buttons and submits the form, it'll send the
+      POST data ``choice=3``. This is HTML Forms 101.
+
+    * We set the form's ``action`` to ``/polls/{{ poll.id }}/vote/``, and we
+      set ``method="post"``. Using ``method="post"`` (as opposed to
+      ``method="get"``) is very important, because the act of submitting this
+      form will alter data server-side. Whenever you create a form that alters
+      data server-side, use ``method="post"``. This tip isn't specific to
+      Django; it's just good Web development practice.
+
+Now, let's create a Django view that handles the submitted data and does
+something with it. Remember, in `Tutorial 3`_, we created a URLconf for the
+polls application that includes this line::
+
+    (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
+
+So let's create a ``vote()`` function in ``mysite/polls/views.py``::
+
+    from django.shortcuts import get_object_or_404, render_to_response
+    from django.http import HttpResponseRedirect
+    from mysite.polls.models import Choice, Poll
+    # ...
+    def vote(request, poll_id):
+        p = get_object_or_404(Poll, pk=poll_id)
+        try:
+            selected_choice = p.choice_set.get(pk=request.POST['choice'])
+        except (KeyError, Choice.DoesNotExist):
+            # Redisplay the poll voting form.
+            return render_to_response('polls/detail.html', {
+                'poll': p,
+                'error_message': "You didn't select a choice.",
+            })
+        else:
+            selected_choice.votes += 1
+            selected_choice.save()
+            # Always return an HttpResponseRedirect after successfully dealing
+            # with POST data. This prevents data from being posted twice if a
+            # user hits the Back button.
+            return HttpResponseRedirect('/polls/%s/results/' % p.id)
+
+This code includes a few things we haven't covered yet in this tutorial:
+
+    * ``request.POST`` is a dictionary-like object that lets you access
+      submitted data by key name. In this case, ``request.POST['choice']``
+      returns the ID of the selected choice, as a string. ``request.POST``
+      values are always strings.
+
+      Note that Django also provides ``request.GET`` for accessing GET data
+      in the same way -- but we're explicitly using ``request.POST`` in our
+      code, to ensure that data is only altered via a POST call.
+
+    * ``request.POST['choice']`` will raise ``KeyError`` if ``choice`` wasn't
+      provided in POST data. The above code checks for ``KeyError`` and
+      redisplays the poll form with an error message if ``choice`` isn't given.
+
+    * After incrementing the choice count, the code returns an
+      ``HttpResponseRedirect`` rather than a normal ``HttpResponse``.
+      ``HttpResponseRedirect`` takes a single argument: the URL to which the
+      user will be redirected. You should leave off the "http://" and domain
+      name if you can. That helps your app become portable across domains.
+
+      As the Python comment above points out, you should always return an
+      ``HttpResponseRedirect`` after successfully dealing with POST data. This
+      tip isn't specific to Django; it's just good Web development practice.
+
+As mentioned in Tutorial 3, ``request`` is a ``HTTPRequest`` object. For more
+on ``HTTPRequest`` objects, see the `request and response documentation`_.
+
+After somebody votes in a poll, the ``vote()`` view redirects to the results
+page for the poll. Let's write that view::
+
+    def results(request, poll_id):
+        p = get_object_or_404(Poll, pk=poll_id)
+        return render_to_response('polls/results.html', {'poll': p})
+
+This is almost exactly the same as the ``detail()`` view from `Tutorial 3`_.
+The only difference is the template name. We'll fix this redundancy later.
+
+Now, create a ``results.html`` template::
+
+    <h1>{{ poll.question }}</h1>
+
+    <ul>
+    {% for choice in poll.choice_set.all %}
+        <li>{{ choice.choice }} -- {{ choice.votes }} vote{{ choice.votes|pluralize }}</li>
+    {% endfor %}
+    </ul>
+
+Now, go to ``/polls/1/`` in your browser and vote in the poll. You should see a
+results page that gets updated each time you vote. If you submit the form
+without having chosen a choice, you should see the error message.
+
+.. _request and response documentation: http://www.djangoproject.com/documentation/request_response/
+
+Use generic views: Less code is better
+======================================
+
+The ``detail()`` (from `Tutorial 3`_) and ``results()`` views are stupidly
+simple -- and, as mentioned above, redundant. The ``index()`` view (also from
+Tutorial 3), which displays a list of polls, is similar.
+
+These views represent a common case of basic Web development: getting data from
+the database according to a parameter passed in the URL, loading a template and
+returning the rendered template. Because this is so common, Django provides a
+shortcut, called the "generic views" system.
+
+Generic views abstract common patterns to the point where you don't even need
+to write Python code to write an app.
+
+Let's convert our poll app to use the generic views system, so we can delete a
+bunch of our own code. We'll just have to take a few steps to make the
+conversion.
+
+.. admonition:: Why the code-shuffle?
+
+    Generally, when writing a Django app, you'll evaluate whether generic views
+    are a good fit for your problem, and you'll use them from the beginning,
+    rather than refactoring your code halfway through. But this tutorial
+    intentionally has focused on writing the views "the hard way" until now, to
+    focus on core concepts.
+
+    You should know basic math before you start using a calculator.
+
+First, open the polls/urls.py URLconf. It looks like this, according to the
+tutorial so far::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('mysite.polls.views',
+        (r'^$', 'index'),
+        (r'^(?P<poll_id>\d+)/$', 'detail'),
+        (r'^(?P<poll_id>\d+)/results/$', 'results'),
+        (r'^(?P<poll_id>\d+)/vote/$', 'vote'),
+    )
+
+Change it like so::
+
+    from django.conf.urls.defaults import *
+    from mysite.polls.models import Poll
+
+    info_dict = {
+        'queryset': Poll.objects.all(),
+    }
+
+    urlpatterns = patterns('',
+        (r'^$', 'django.views.generic.list_detail.object_list', info_dict),
+        (r'^(?P<object_id>\d+)/$', 'django.views.generic.list_detail.object_detail', info_dict),
+        (r'^(?P<object_id>\d+)/results/$', 'django.views.generic.list_detail.object_detail', dict(info_dict, template_name='polls/results.html')),
+        (r'^(?P<poll_id>\d+)/vote/$', 'mysite.polls.views.vote'),
+    )
+
+We're using two generic views here: ``object_list`` and ``object_detail``.
+Respectively, those two views abstract the concepts of "display a list of
+objects" and "display a detail page for a particular type of object."
+
+    * Each generic view needs to know what data it will be acting upon. This
+      data is provided in a dictionary. The ``queryset`` key in this dictionary
+      points to the list of objects to be manipulated by the generic view.
+
+    * The ``object_detail`` generic view expects the ID value captured
+      from the URL to be called ``"object_id"``, so we've changed ``poll_id`` to
+      ``object_id`` for the generic views.
+
+By default, the ``object_detail`` generic view uses a template called
+``<app name>/<module name>_detail.html``. In our case, it'll use the template
+``"polls/poll_detail.html"``. Thus, rename your ``polls/detail.html`` template to
+``polls/poll_detail.html``, and change the ``render_to_response()`` line in
+``vote()``.
+
+Similarly, the ``object_list`` generic view uses a template called
+``<app name>/<module name>_list.html``. Thus, rename ``polls/index.html`` to
+``polls/poll_list.html``.
+
+Because we have more than one entry in the URLconf that uses ``object_detail``
+for the polls app, we manually specify a template name for the results view:
+``template_name='polls/results.html'``. Otherwise, both views would use the same
+template. Note that we use ``dict()`` to return an altered dictionary in place.
+
+In previous parts of the tutorial, the templates have been provided with a context
+that contains the ``poll` and ``latest_poll_list`` context variables. However,
+the generic views provide the variables ``object`` and ``object_list`` as context.
+Therefore, you need to change your templates to match the new context variables.
+Go through your templates, and modify any reference to ``latest_poll_list`` to
+``object_list``, and change any reference to ``poll`` to ``object``.
+
+You can now delete the ``index()``, ``detail()`` and ``results()`` views
+from ``polls/views.py``. We don't need them anymore -- they have been replaced
+by generic views.
+
+The ``vote()`` view is still required. However, it must be modified to match
+the new templates and context variables. Change the template call from
+``polls/detail.html`` to ``polls/poll_detail.html``, and pass ``object`` in the
+context instead of ``poll``.
+
+Run the server, and use your new polling app based on generic views.
+
+For full details on generic views, see the `generic views documentation`_.
+
+.. _generic views documentation: http://www.djangoproject.com/documentation/generic_views/
+
+Coming soon
+===========
+
+The tutorial ends here for the time being. But check back soon for the next
+installments:
+
+    * Advanced form processing
+    * Using the RSS framework
+    * Using the cache framework
+    * Using the comments framework
+    * Advanced admin features: Permissions
+    * Advanced admin features: Custom JavaScript
+
+.. _Tutorial 3: http://www.djangoproject.com/documentation/tutorial3/

Added: vendor/django/current/docs/url_dispatch.txt
===================================================================
--- vendor/django/current/docs/url_dispatch.txt	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/docs/url_dispatch.txt	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,391 @@
+==============
+URL dispatcher
+==============
+
+A clean, elegant URL scheme is an important detail in a high-quality Web
+application. Django lets you design URLs however you want, with no framework
+limitations.
+
+There's no ``.php`` or ``.cgi`` required, and certainly none of that
+``0,2097,1-1-1928,00`` nonsense.
+
+See `Cool URIs don't change`_, by World Wide Web creator Tim Berners-Lee, for
+excellent arguments on why URLs should be clean and usable.
+
+.. _Cool URIs don't change: http://www.w3.org/Provider/Style/URI
+
+Overview
+========
+
+To design URLs for an app, you create a Python module informally called a
+**URLconf** (URL configuration). This module is pure Python code and
+is a simple mapping between URL patterns (as simple regular expressions) to
+Python callback functions (your views).
+
+This mapping can be as short or as long as needed. It can reference other
+mappings. And, because it's pure Python code, it can be constructed
+dynamically.
+
+How Django processes a request
+==============================
+
+When a user requests a page from your Django-powered site, this is the
+algorithm the system follows to determine which Python code to execute:
+
+    1. Django looks at the ``ROOT_URLCONF`` setting in your `settings file`_.
+       This should be a string representing the full Python import path to your
+       URLconf. For example: ``"mydjangoapps.urls"``.
+    2. Django loads that Python module and looks for the variable
+       ``urlpatterns``. This should be a Python list, in the format returned by
+       the function ``django.conf.urls.defaults.patterns()``.
+    3. Django runs through each URL pattern, in order, and stops at the first
+       one that matches the requested URL.
+    4. Once one of the regexes matches, Django imports and calls the given
+       view, which is a simple Python function. The view gets passed a
+       `request object`_ as its first argument and any values captured in the
+       regex as remaining arguments.
+
+.. _settings file: http://www.djangoproject.com/documentation/settings/
+.. _request object: http://www.djangoproject.com/documentation/request_response/#httprequest-objects
+
+Example
+=======
+
+Here's a sample URLconf::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('',
+        (r'^articles/2003/$', 'news.views.special_case_2003'),
+        (r'^articles/(\d{4})/$', 'news.views.year_archive'),
+        (r'^articles/(\d{4})/(\d{2})/$', 'news.views.month_archive'),
+        (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'news.views.article_detail'),
+    )
+
+Notes:
+
+    * ``from django.conf.urls.defaults import *`` makes the ``patterns()``
+      function available.
+
+    * To capture a value from the URL, just put parenthesis around it.
+
+    * There's no need to add a leading slash, because every URL has that. For
+      example, it's ``^articles``, not ``^/articles``.
+
+    * The ``'r'`` in front of each regular expression string is optional but
+      recommended. It tells Python that a string is "raw" -- that nothing in
+      the string should be escaped. See `Dive Into Python's explanation`_.
+
+Example requests:
+
+    * A request to ``/articles/2005/03/`` would match the third entry in the
+      list. Django would call the function
+      ``news.views.month_archive(request, '2005', '03')``.
+
+    * ``/articles/2005/3/`` would not match any URL patterns, because the
+      third entry in the list requires two digits for the month.
+
+    * ``/articles/2003/`` would match the first pattern in the list, not the
+      second one, because the patterns are tested in order, and the first one
+      is the first test to pass. Feel free to exploit the ordering to insert
+      special cases like this.
+
+    * ``/articles/2003`` would not match any of these patterns, because each
+      pattern requires that the URL end with a slash.
+
+    * ``/articles/2003/03/3/`` would match the final pattern. Django would call
+      the function ``news.views.article_detail(request, '2003', '03', '3')``.
+
+.. _Dive Into Python's explanation: http://diveintopython.org/regular_expressions/street_addresses.html#re.matching.2.3
+
+Named groups
+============
+
+The above example used simple, *non-named* regular-expression groups (via
+parenthesis) to capture bits of the URL and pass them as *positional* arguments
+to a view. In more advanced usage, it's possible to use *named*
+regular-expression groups to capture URL bits and pass them as *keyword*
+arguments to a view.
+
+In Python regular expressions, the syntax for named regular-expression groups
+is ``(?P<name>pattern)``, where ``name`` is the name of the group and
+``pattern`` is some pattern to match.
+
+Here's the above example URLconf, rewritten to use named groups::
+
+    urlpatterns = patterns('',
+        (r'^articles/2003/$', 'news.views.special_case_2003'),
+        (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
+        (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/$', 'news.views.month_archive'),
+        (r'^articles/(?P<year>\d{4})/(?P<month>\d{2})/(?P<day>\d+)/$', 'news.views.article_detail'),
+    )
+
+This accomplishes exactly the same thing as the previous example, with one
+subtle difference: The captured values are passed to view functions as keyword
+arguments rather than positional arguments. For example:
+
+    * A request to ``/articles/2005/03/`` would call the function
+      ``news.views.month_archive(request, year='2005', month='03')``, instead
+      of ``news.views.month_archive(request, '2005', '03')``.
+
+    * A request to ``/articles/2003/03/3/`` would call the function
+      ``news.views.article_detail(request, year='2003', month='03', day='3')``.
+
+In practice, this means your URLconfs are slightly more explicit and less prone
+to argument-order bugs -- and you can reorder the arguments in your views'
+function definitions. Of course, these benefits come at the cost of brevity;
+some developers find the named-group syntax ugly and too verbose.
+
+The matching/grouping algorithm
+-------------------------------
+
+Here's the algorithm the URLconf parser follows, with respect to named groups
+vs. non-named groups in a regular expression:
+
+If there are any named arguments, it will use those, ignoring non-named arguments.
+Otherwise, it will pass all non-named arguments as positional arguments.
+
+In both cases, it will pass any extra keyword arguments as keyword arguments.
+See "Passing extra options to view functions" below.
+
+What the URLconf searches against
+=================================
+
+The URLconf searches against the requested URL, as a normal Python string. This
+does not include GET or POST parameters, or the domain name.
+
+For example, in a request to ``http://www.example.com/myapp/``, the URLconf
+will look for ``/myapp/``.
+
+In a request to ``http://www.example.com/myapp/?page=3``, the URLconf will look
+for ``/myapp/``.
+
+The URLconf doesn't look at the request method. In other words, all request
+methods -- ``POST``, ``GET``, ``HEAD``, etc. -- will be routed to the same
+function for the same URL.
+
+Syntax of the urlpatterns variable
+==================================
+
+``urlpatterns`` should be a Python list, in the format returned by the function
+``django.conf.urls.defaults.patterns()``. Always use ``patterns()`` to create
+the ``urlpatterns`` variable.
+
+Convention is to use ``from django.conf.urls.defaults import *`` at the top of
+your URLconf. This gives your module access to these objects:
+
+patterns
+--------
+
+A function that takes a prefix, and an arbitrary number of URL patterns, and
+returns a list of URL patterns in the format Django needs.
+
+The first argument to ``patterns()`` is a string ``prefix``. See
+"The view prefix" below.
+
+The remaining arguments should be tuples in this format::
+
+    (regular expression, Python callback function [, optional dictionary])
+
+...where ``optional dictionary`` is optional. (See
+_`Passing extra options to view functions` below.)
+
+handler404
+----------
+
+A string representing the full Python import path to the view that should be
+called if none of the URL patterns match.
+
+By default, this is ``'django.views.defaults.page_not_found'``. That default
+value should suffice.
+
+handler500
+----------
+
+A string representing the full Python import path to the view that should be
+called in case of server errors. Server errors happen when you have runtime
+errors in view code.
+
+By default, this is ``'django.views.defaults.server_error'``. That default
+value should suffice.
+
+include
+-------
+
+A function that takes a full Python import path to another URLconf that should
+be "included" in this place. See _`Including other URLconfs` below.
+
+Notes on capturing text in URLs
+===============================
+
+Each captured argument is sent to the view as a plain Python string, regardless
+of what sort of match the regular expression makes. For example, in this
+URLconf line::
+
+    (r'^articles/(?P<year>\d{4})/$', 'news.views.year_archive'),
+
+...the ``year`` argument to ``news.views.year_archive()`` will be a string, not
+an integer, even though the ``\d{4}`` will only match integer strings.
+
+A convenient trick is to specify default parameters for your views' arguments.
+Here's an example URLconf and view::
+
+    # URLconf
+    urlpatterns = patterns('',
+        (r'^blog/$', 'blog.views.page'),
+        (r'^blog/page(?P<num>\d+)/$', 'blog.views.page'),
+    )
+
+    # View (in blog/views.py)
+    def page(request, num="1"):
+        # Output the appropriate page of blog entries, according to num.
+
+In the above example, both URL patterns point to the same view --
+``blog.views.page`` -- but the first pattern doesn't capture anything from the
+URL. If the first pattern matches, the ``page()`` function will use its
+default argument for ``num``, ``"1"``. If the second pattern matches,
+``page()`` will use whatever ``num`` value was captured by the regex.
+
+Performance
+===========
+
+Each regular expression in a ``urlpatterns`` is compiled the first time it's
+accessed. This makes the system blazingly fast.
+
+The view prefix
+===============
+
+You can specify a common prefix in your ``patterns()`` call, to cut down on
+code duplication.
+
+Here's the example URLconf from the `Django overview`_::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('',
+        (r'^articles/(\d{4})/$', 'myproject.news.views.year_archive'),
+        (r'^articles/(\d{4})/(\d{2})/$', 'myproject.news.views.month_archive'),
+        (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'myproject.news.views.article_detail'),
+    )
+
+In this example, each view has a common prefix -- ``'myproject.news.views'``.
+Instead of typing that out for each entry in ``urlpatterns``, you can use the
+first argument to the ``patterns()`` function to specify a prefix to apply to
+each view function.
+
+With this in mind, the above example can be written more concisely as::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('myproject.news.views',
+        (r'^articles/(\d{4})/$', 'year_archive'),
+        (r'^articles/(\d{4})/(\d{2})/$', 'month_archive'),
+        (r'^articles/(\d{4})/(\d{2})/(\d+)/$', 'article_detail'),
+    )
+
+Note that you don't put a trailing dot (``"."``) in the prefix. Django puts
+that in automatically.
+
+.. _Django overview: http://www.djangoproject.com/documentation/overview/
+
+Multiple view prefixes
+----------------------
+
+In practice, you'll probably end up mixing and matching views to the point
+where the views in your ``urlpatterns`` won't have a common prefix. However,
+you can still take advantage of the view prefix shortcut to remove duplication.
+Just add multiple ``patterns()`` objects together, like this:
+
+Old::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('',
+        (r'^/?$', 'django.views.generic.date_based.archive_index'),
+        (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$', 'django.views.generic.date_based.archive_month'),
+        (r'^tag/(?P<tag>\w+)/$', 'weblog.views.tag'),
+    )
+
+New::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('django.views.generic.date_based',
+        (r'^/?$', 'archive_index'),
+        (r'^(?P<year>\d{4})/(?P<month>[a-z]{3})/$','archive_month'),
+    )
+
+    urlpatterns += patterns('weblog.views',
+        (r'^tag/(?P<tag>\w+)/$', 'tag'),
+    )
+
+Including other URLconfs
+========================
+
+At any point, your ``urlpatterns`` can "include" other URLconf modules. This
+essentially "roots" a set of URLs below other ones.
+
+For example, here's the URLconf for the `Django website`_ itself. It includes a
+number of other URLconfs::
+
+    from django.conf.urls.defaults import *
+
+    urlpatterns = patterns('',
+        (r'^weblog/',        include('django_website.apps.blog.urls.blog')),
+        (r'^documentation/', include('django_website.apps.docs.urls.docs')),
+        (r'^comments/',      include('django.contrib.comments.urls.comments')),
+    )
+
+Note that the regular expressions in this example don't have a ``$``
+(end-of-string match character) but do include a trailing slash. Whenever
+Django encounters ``include()``, it chops off whatever part of the URL matched
+up to that point and sends the remaining string to the included URLconf for
+further processing.
+
+.. _`Django website`: http://www.djangoproject.com/
+
+Captured parameters
+-------------------
+
+An included URLconf receives any captured parameters from parent URLconfs, so
+the following example is valid::
+
+    # In settings/urls/main.py
+    urlpatterns = patterns('',
+        (r'^(?P<username>\w+)/blog/', include('foo.urls.blog')),
+    )
+
+    # In foo/urls/blog.py
+    urlpatterns = patterns('foo.views',
+        (r'^$', 'blog.index'),
+        (r'^archive/$', 'blog.archive'),
+    )
+
+In the above example, the captured ``"username"`` variable is passed to the
+included URLconf, as expected.
+
+Passing extra options to view functions
+=======================================
+
+URLconfs have a hook that lets you pass extra arguments to your view functions,
+as a Python dictionary.
+
+Any URLconf tuple can have an optional third element, which should be a
+dictionary of extra keyword arguments to pass to the view function.
+
+For example::
+
+    urlpatterns = patterns('blog.views',
+        (r'^/blog/(?P<year>\d{4})/$', 'year_archive', {'foo': 'bar'}),
+    )
+
+In this example, for a request to ``/blog/2005/``, Django will call the
+``blog.views.year_archive()`` view, passing it these keyword arguments::
+
+    year='2005', foo='bar'
+
+This technique is used in `generic views`_ and in the `syndication framework`_
+to pass metadata and options to views.
+
+.. _generic views: http://www.djangoproject.com/documentation/generic_views/
+.. _syndication framework: http://www.djangoproject.com/documentation/syndication/

Added: vendor/django/current/examples/__init__.py
===================================================================

Added: vendor/django/current/examples/hello/__init__.py
===================================================================

Added: vendor/django/current/examples/hello/urls.py
===================================================================
--- vendor/django/current/examples/hello/urls.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/examples/hello/urls.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,10 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('examples.hello.views',
+    (r'^html/$', 'hello_html'),
+    (r'^text/$', 'hello_text'),
+    (r'^write/$', 'hello_write'),
+    (r'^metadata/$', 'metadata'),
+    (r'^getdata/$', 'get_data'),
+    (r'^postdata/$', 'post_data'),
+)

Added: vendor/django/current/examples/hello/views.py
===================================================================
--- vendor/django/current/examples/hello/views.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/examples/hello/views.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,55 @@
+from django.http import HttpResponse
+from django.utils.html import escape
+
+def hello_html(request):
+    "This view is a basic 'hello world' example in HTML."
+    return HttpResponse('<h1>Hello, world.</h1>')
+
+def hello_text(request):
+    "This view is a basic 'hello world' example in plain text."
+    return HttpResponse('Hello, world.', mimetype='text/plain')
+
+def hello_write(request):
+    "This view demonstrates how an HttpResponse object has a write() method."
+    r = HttpResponse()
+    r.write("<p>Here's a paragraph.</p>")
+    r.write("<p>Here's another paragraph.</p>")
+    return r
+
+def metadata(request):
+    "This view demonstrates how to retrieve request metadata, such as HTTP headers."
+    r = HttpResponse('<h1>All about you</h1>')
+    r.write("<p>Here's all known metadata about your request, according to <code>request.META</code>:</p>")
+    r.write('<table>')
+    meta_items = request.META.items()
+    meta_items.sort()
+    for k, v in meta_items:
+        r.write('<tr><th>%s</th><td>%r</td></tr>' % (k, v))
+    r.write('</table>')
+    return r
+
+def get_data(request):
+    "This view demonstrates how to retrieve GET data."
+    r = HttpResponse()
+    if request.GET:
+        r.write('<p>GET data found! Here it is:</p>')
+        r.write('<ul>%s</ul>' % ''.join(['<li><strong>%s:</strong> %r</li>' % (escape(k), escape(v)) for k, v in request.GET.items()]))
+    r.write('<form action="" method="get">')
+    r.write('<p>First name: <input type="text" name="first_name"></p>')
+    r.write('<p>Last name: <input type="text" name="last_name"></p>')
+    r.write('<p><input type="submit" value="Submit"></p>')
+    r.write('</form>')
+    return r
+
+def post_data(request):
+    "This view demonstrates how to retrieve POST data."
+    r = HttpResponse()
+    if request.POST:
+        r.write('<p>POST data found! Here it is:</p>')
+        r.write('<ul>%s</ul>' % ''.join(['<li><strong>%s:</strong> %r</li>' % (escape(k), escape(v)) for k, v in request.POST.items()]))
+    r.write('<form action="" method="post">')
+    r.write('<p>First name: <input type="text" name="first_name"></p>')
+    r.write('<p>Last name: <input type="text" name="last_name"></p>')
+    r.write('<p><input type="submit" value="Submit"></p>')
+    r.write('</form>')
+    return r

Added: vendor/django/current/examples/manage.py
===================================================================
--- vendor/django/current/examples/manage.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/examples/manage.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)

Added: vendor/django/current/examples/settings.py
===================================================================
--- vendor/django/current/examples/settings.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/examples/settings.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,5 @@
+# Django settings for the example project.
+
+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+ROOT_URLCONF = 'examples.urls'

Added: vendor/django/current/examples/urls.py
===================================================================
--- vendor/django/current/examples/urls.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/examples/urls.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,6 @@
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    (r'^$', 'examples.views.index'),
+    (r'^hello/', include('examples.hello.urls')),
+)

Added: vendor/django/current/examples/views.py
===================================================================
--- vendor/django/current/examples/views.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/examples/views.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,12 @@
+from django import http
+
+def index(request):
+    r = http.HttpResponse('<h1>Django examples</h1><ul>')
+    r.write('<li><a href="hello/html/">Hello world (HTML)</a></li>')
+    r.write('<li><a href="hello/text/">Hello world (text)</a></li>')
+    r.write('<li><a href="hello/write/">HttpResponse objects are file-like objects</a></li>')
+    r.write('<li><a href="hello/metadata/">Displaying request metadata</a></li>')
+    r.write('<li><a href="hello/getdata/">Displaying GET data</a></li>')
+    r.write('<li><a href="hello/postdata/">Displaying POST data</a></li>')
+    r.write('</ul>')
+    return r

Added: vendor/django/current/extras/README.TXT
===================================================================
--- vendor/django/current/extras/README.TXT	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/extras/README.TXT	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+This directory contains extra stuff that can improve your Django experience.

Added: vendor/django/current/extras/django_bash_completion
===================================================================
--- vendor/django/current/extras/django_bash_completion	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/extras/django_bash_completion	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,119 @@
+# #########################################################################
+# This bash script adds tab-completion feature to django-admin.py and
+# manage.py.
+#
+# Testing it out without installing
+# =================================
+#
+# To test out the completion without "installing" this, just run this file
+# directly, like so:
+#
+#     . ~/path/to/django_bash_completion
+#
+# Note: There's a dot ('.') at the beginning of that command.
+#
+# After you do that, tab completion will immediately be made available in your
+# current Bash shell. But it won't be available next time you log in.
+#
+# Installing
+# ==========
+#
+# To install this, point to this file from your .bash_profile, like so:
+#
+#     . ~/path/to/django_bash_completion
+#
+# Do the same in your .bashrc if .bashrc doesn't invoke .bash_profile.
+#
+# Settings will take effect the next time you log in.
+#
+# Uninstalling
+# ============
+#
+# To uninstall, just remove the line from your .bash_profile and .bashrc.
+
+_django_completion()
+{
+    local cur prev opts actions action_shell_opts action_runfcgi_opts
+    COMPREPLY=()
+    cur="${COMP_WORDS[COMP_CWORD]}"
+    prev="${COMP_WORDS[COMP_CWORD-1]}"
+
+    # Standalone options
+    opts="--help --settings --pythonpath --version"
+    # Actions
+    actions="adminindex createcachetable dbshell diffsettings \
+             inspectdb install reset runfcgi runserver \
+             shell sql sqlall sqlclear sqlindexes sqlinitialdata \
+             sqlreset sqlsequencereset startapp startproject \
+             syncdb validate"
+    # Action's options
+    action_shell_opts="--plain"
+    action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir"
+
+    if [[ # django-admin.py, ./manage, manage.py
+          ( ${COMP_CWORD} -eq 1 &&
+            ( ${COMP_WORDS[0]} == django-admin.py ||
+              ${COMP_WORDS[0]} == ./manage.py ||
+              ${COMP_WORDS[0]} == manage.py ) )
+          ||
+          # python manage.py, /some/path/python manage.py (if manage.py exists)
+          ( ${COMP_CWORD} -eq 2 &&
+            ( $( basename ${COMP_WORDS[0]} ) == python ) &&
+            ( $( basename ${COMP_WORDS[1]} ) == manage.py) &&
+            ( -r ${COMP_WORDS[1]} ) ) ]] ; then
+
+        case ${cur} in
+            -*)
+                COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
+                action=$COMPREPLY
+                return 0
+                ;;
+            *)
+                COMPREPLY=( $(compgen -W "${actions}" -- ${cur}) )
+                action=$COMPREPLY
+                return 0
+                ;;
+        esac
+    else
+        case ${prev} in
+            adminindex|install|reset| \
+            sql|sqlall|sqlclear|sqlindexes| \
+            sqlinitialdata|sqlreset|sqlsequencereset)
+            # App completion isn't yet implemented, but here's where that
+            # would go.
+            # COMPREPLY=( $(compgen -W "auth core" -- ${cur}) )
+            COMPREPLY=()
+            return 0
+            ;;
+
+            createcachetable|dbshell|diffsettings| \
+            inspectdb|runserver|startapp|startproject|syncdb| \
+            validate)
+                COMPREPLY=()
+                return 0
+                ;;
+            shell)
+                COMPREPLY=( $(compgen -W "$action_shell_opts" -- ${cur}) )
+                return 0
+                ;;
+            runfcgi)
+                COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) )
+                return 0
+                ;;
+            host*|port*|socket*|method*|maxspare*|minspare*|maxchildren*|daemonize*|pidfile*|workdir*)
+                if [ "$action"  == "runfcgi" ] ; then
+                    COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) )
+                    return 0
+                fi
+                return 0
+                ;;
+            *)
+                #COMPREPLY=( $(compgen -W "auth core" -- ${cur}) )
+                COMPREPLY=()
+                return 0
+                ;;
+        esac
+    fi
+}
+
+complete -F _django_completion django-admin.py manage.py

Added: vendor/django/current/ez_setup.py
===================================================================
--- vendor/django/current/ez_setup.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/ez_setup.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,217 @@
+#!python
+"""Bootstrap setuptools installation
+
+If you want to use setuptools in your package's setup.py, just include this
+file in the same directory with it, and add this to the top of your setup.py::
+
+    from ez_setup import use_setuptools
+    use_setuptools()
+
+If you want to require a specific version of setuptools, set a download
+mirror, or use an alternate download directory, you can do so by supplying
+the appropriate options to ``use_setuptools()``.
+
+This file can also be run as a script to install or upgrade setuptools.
+"""
+import sys
+DEFAULT_VERSION = "0.6c1"
+DEFAULT_URL     = "http://cheeseshop.python.org/packages/%s/s/setuptools/" % sys.version[:3]
+
+md5_data = {
+    'setuptools-0.6b1-py2.3.egg': '8822caf901250d848b996b7f25c6e6ca',
+    'setuptools-0.6b1-py2.4.egg': 'b79a8a403e4502fbb85ee3f1941735cb',
+    'setuptools-0.6b2-py2.3.egg': '5657759d8a6d8fc44070a9d07272d99b',
+    'setuptools-0.6b2-py2.4.egg': '4996a8d169d2be661fa32a6e52e4f82a',
+    'setuptools-0.6b3-py2.3.egg': 'bb31c0fc7399a63579975cad9f5a0618',
+    'setuptools-0.6b3-py2.4.egg': '38a8c6b3d6ecd22247f179f7da669fac',
+    'setuptools-0.6b4-py2.3.egg': '62045a24ed4e1ebc77fe039aa4e6f7e5',
+    'setuptools-0.6b4-py2.4.egg': '4cb2a185d228dacffb2d17f103b3b1c4',
+    'setuptools-0.6c1-py2.3.egg': 'b3f2b5539d65cb7f74ad79127f1a908c',
+    'setuptools-0.6c1-py2.4.egg': 'b45adeda0667d2d2ffe14009364f2a4b',
+}
+
+import sys, os
+
+def _validate_md5(egg_name, data):
+    if egg_name in md5_data:
+        from md5 import md5
+        digest = md5(data).hexdigest()
+        if digest != md5_data[egg_name]:
+            print >>sys.stderr, (
+                "md5 validation of %s failed!  (Possible download problem?)"
+                % egg_name
+            )
+            sys.exit(2)
+    return data
+
+
+def use_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    download_delay=15
+):
+    """Automatically find/download setuptools and make it available on sys.path
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end with
+    a '/').  `to_dir` is the directory where setuptools will be downloaded, if
+    it is not already available.  If `download_delay` is specified, it should
+    be the number of seconds that will be paused before initiating a download,
+    should one be required.  If an older version of setuptools is installed,
+    this routine will print a message to ``sys.stderr`` and raise SystemExit in
+    an attempt to abort the calling script.
+    """
+    try:
+        import setuptools
+        if setuptools.__version__ == '0.0.1':
+            print >>sys.stderr, (
+            "You have an obsolete version of setuptools installed.  Please\n"
+            "remove it from your system entirely before rerunning this script."
+            )
+            sys.exit(2)
+    except ImportError:
+        egg = download_setuptools(version, download_base, to_dir, download_delay)
+        sys.path.insert(0, egg)
+        import setuptools; setuptools.bootstrap_install_from = egg
+
+    import pkg_resources
+    try:
+        pkg_resources.require("setuptools>="+version)
+
+    except pkg_resources.VersionConflict:
+        # XXX could we install in a subprocess here?
+        print >>sys.stderr, (
+            "The required version of setuptools (>=%s) is not available, and\n"
+            "can't be installed while this script is running. Please install\n"
+            " a more recent version first."
+        ) % version
+        sys.exit(2)
+
+def download_setuptools(
+    version=DEFAULT_VERSION, download_base=DEFAULT_URL, to_dir=os.curdir,
+    delay = 15
+):
+    """Download setuptools from a specified location and return its filename
+
+    `version` should be a valid setuptools version number that is available
+    as an egg for download under the `download_base` URL (which should end
+    with a '/'). `to_dir` is the directory where the egg will be downloaded.
+    `delay` is the number of seconds to pause before an actual download attempt.
+    """
+    import urllib2, shutil
+    egg_name = "setuptools-%s-py%s.egg" % (version,sys.version[:3])
+    url = download_base + egg_name
+    saveto = os.path.join(to_dir, egg_name)
+    src = dst = None
+    if not os.path.exists(saveto):  # Avoid repeated downloads
+        try:
+            from distutils import log
+            if delay:
+                log.warn("""
+---------------------------------------------------------------------------
+This script requires setuptools version %s to run (even to display
+help).  I will attempt to download it for you (from
+%s), but
+you may need to enable firewall access for this script first.
+I will start the download in %d seconds.
+
+(Note: if this machine does not have network access, please obtain the file
+
+   %s
+
+and place it in this directory before rerunning this script.)
+---------------------------------------------------------------------------""",
+                    version, download_base, delay, url
+                ); from time import sleep; sleep(delay)
+            log.warn("Downloading %s", url)
+            src = urllib2.urlopen(url)
+            # Read/write all in one block, so we don't create a corrupt file
+            # if the download is interrupted.
+            data = _validate_md5(egg_name, src.read())
+            dst = open(saveto,"wb"); dst.write(data)
+        finally:
+            if src: src.close()
+            if dst: dst.close()
+    return os.path.realpath(saveto)
+
+def main(argv, version=DEFAULT_VERSION):
+    """Install or upgrade setuptools and EasyInstall"""
+
+    try:
+        import setuptools
+    except ImportError:
+        import tempfile, shutil
+        tmpdir = tempfile.mkdtemp(prefix="easy_install-")
+        try:
+            egg = download_setuptools(version, to_dir=tmpdir, delay=0)
+            sys.path.insert(0,egg)
+            from setuptools.command.easy_install import main
+            return main(list(argv)+[egg])   # we're done here
+        finally:
+            shutil.rmtree(tmpdir)
+    else:
+        if setuptools.__version__ == '0.0.1':
+            # tell the user to uninstall obsolete version
+            use_setuptools(version)
+
+    req = "setuptools>="+version
+    import pkg_resources
+    try:
+        pkg_resources.require(req)
+    except pkg_resources.VersionConflict:
+        try:
+            from setuptools.command.easy_install import main
+        except ImportError:
+            from easy_install import main
+        main(list(argv)+[download_setuptools(delay=0)])
+        sys.exit(0) # try to force an exit
+    else:
+        if argv:
+            from setuptools.command.easy_install import main
+            main(argv)
+        else:
+            print "Setuptools version",version,"or greater has been installed."
+            print '(Run "ez_setup.py -U setuptools" to reinstall or upgrade.)'
+
+
+
+def update_md5(filenames):
+    """Update our built-in md5 registry"""
+
+    import re
+    from md5 import md5
+
+    for name in filenames:
+        base = os.path.basename(name)
+        f = open(name,'rb')
+        md5_data[base] = md5(f.read()).hexdigest()
+        f.close()
+
+    data = ["    %r: %r,\n" % it for it in md5_data.items()]
+    data.sort()
+    repl = "".join(data)
+
+    import inspect
+    srcfile = inspect.getsourcefile(sys.modules[__name__])
+    f = open(srcfile, 'rb'); src = f.read(); f.close()
+
+    match = re.search("\nmd5_data = {\n([^}]+)}", src)
+    if not match:
+        print >>sys.stderr, "Internal error!"
+        sys.exit(2)
+
+    src = src[:match.start(1)] + repl + src[match.end(1):]
+    f = open(srcfile,'w')
+    f.write(src)
+    f.close()
+
+
+if __name__=='__main__':
+    if len(sys.argv)>2 and sys.argv[1]=='--md5update':
+        update_md5(sys.argv[2:])
+    else:
+        main(sys.argv[1:])
+
+
+
+
+

Added: vendor/django/current/setup.py
===================================================================
--- vendor/django/current/setup.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/setup.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,61 @@
+import ez_setup # From http://peak.telecommunity.com/DevCenter/setuptools
+ez_setup.use_setuptools()
+
+from setuptools import setup, find_packages
+
+setup(
+    name = "Django",
+    version = "0.95.1",
+    url = 'http://www.djangoproject.com/',
+    author = 'Lawrence Journal-World',
+    author_email = 'holovaty at gmail.com',
+    description = 'A high-level Python Web framework that encourages rapid development and clean, pragmatic design.',
+    license = 'BSD',
+    packages = find_packages(exclude=['examples', 'examples.*']),
+    package_data = {
+        '': ['*.TXT'],
+        'django.conf': ['locale/ar/LC_MESSAGES/*',
+                        'locale/bn/LC_MESSAGES/*',
+                        'locale/cs/LC_MESSAGES/*',
+                        'locale/cy/LC_MESSAGES/*',
+                        'locale/da/LC_MESSAGES/*',
+                        'locale/de/LC_MESSAGES/*',
+                        'locale/el/LC_MESSAGES/*',
+                        'locale/en/LC_MESSAGES/*',
+                        'locale/es/LC_MESSAGES/*',
+                        'locale/es_AR/LC_MESSAGES/*',
+                        'locale/fr/LC_MESSAGES/*',
+                        'locale/gl/LC_MESSAGES/*',
+                        'locale/hu/LC_MESSAGES/*',
+                        'locale/he/LC_MESSAGES/*',
+                        'locale/is/LC_MESSAGES/*',
+                        'locale/it/LC_MESSAGES/*',
+                        'locale/ja/LC_MESSAGES/*',
+                        'locale/nl/LC_MESSAGES/*',
+                        'locale/no/LC_MESSAGES/*',
+                        'locale/pl/LC_MESSAGES/*',
+                        'locale/pt_BR/LC_MESSAGES/*',
+                        'locale/ro/LC_MESSAGES/*',
+                        'locale/ru/LC_MESSAGES/*',
+                        'locale/sk/LC_MESSAGES/*',
+                        'locale/sl/LC_MESSAGES/*',
+                        'locale/sr/LC_MESSAGES/*',
+                        'locale/sv/LC_MESSAGES/*',
+                        'locale/ta/LC_MESSAGES/*',
+                        'locale/uk/LC_MESSAGES/*',
+                        'locale/zh_CN/LC_MESSAGES/*',
+                        'locale/zh_TW/LC_MESSAGES/*'],
+        'django.contrib.admin': ['templates/admin/*.html',
+                                 'templates/admin_doc/*.html',
+                                 'templates/registration/*.html',
+                                 'templates/widget/*.html',
+                                 'media/css/*.css',
+                                 'media/img/admin/*.gif',
+                                 'media/img/admin/*.png',
+                                 'media/js/*.js',
+                                 'media/js/admin/*js'],
+        'django.contrib.comments': ['templates/comments/*.html'],
+    },
+    scripts = ['django/bin/django-admin.py'],
+    zip_safe = False,
+)

Added: vendor/django/current/tests/doctest.py
===================================================================
--- vendor/django/current/tests/doctest.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/doctest.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,2665 @@
+# Module doctest.
+# Released to the public domain 16-Jan-2001, by Tim Peters (tim at python.org).
+# Major enhancements and refactoring by:
+#     Jim Fulton
+#     Edward Loper
+
+# Provided as-is; use at your own risk; no warranty; no promises; enjoy!
+
+r"""Module doctest -- a framework for running examples in docstrings.
+
+In simplest use, end each module M to be tested with:
+
+def _test():
+    import doctest
+    doctest.testmod()
+
+if __name__ == "__main__":
+    _test()
+
+Then running the module as a script will cause the examples in the
+docstrings to get executed and verified:
+
+python M.py
+
+This won't display anything unless an example fails, in which case the
+failing example(s) and the cause(s) of the failure(s) are printed to stdout
+(why not stderr? because stderr is a lame hack <0.2 wink>), and the final
+line of output is "Test failed.".
+
+Run it with the -v switch instead:
+
+python M.py -v
+
+and a detailed report of all examples tried is printed to stdout, along
+with assorted summaries at the end.
+
+You can force verbose mode by passing "verbose=True" to testmod, or prohibit
+it by passing "verbose=False".  In either of those cases, sys.argv is not
+examined by testmod.
+
+There are a variety of other ways to run doctests, including integration
+with the unittest framework, and support for running non-Python text
+files containing doctests.  There are also many ways to override parts
+of doctest's default behaviors.  See the Library Reference Manual for
+details.
+"""
+
+__docformat__ = 'reStructuredText en'
+
+__all__ = [
+    # 0, Option Flags
+    'register_optionflag',
+    'DONT_ACCEPT_TRUE_FOR_1',
+    'DONT_ACCEPT_BLANKLINE',
+    'NORMALIZE_WHITESPACE',
+    'ELLIPSIS',
+    'IGNORE_EXCEPTION_DETAIL',
+    'COMPARISON_FLAGS',
+    'REPORT_UDIFF',
+    'REPORT_CDIFF',
+    'REPORT_NDIFF',
+    'REPORT_ONLY_FIRST_FAILURE',
+    'REPORTING_FLAGS',
+    # 1. Utility Functions
+    'is_private',
+    # 2. Example & DocTest
+    'Example',
+    'DocTest',
+    # 3. Doctest Parser
+    'DocTestParser',
+    # 4. Doctest Finder
+    'DocTestFinder',
+    # 5. Doctest Runner
+    'DocTestRunner',
+    'OutputChecker',
+    'DocTestFailure',
+    'UnexpectedException',
+    'DebugRunner',
+    # 6. Test Functions
+    'testmod',
+    'testfile',
+    'run_docstring_examples',
+    # 7. Tester
+    'Tester',
+    # 8. Unittest Support
+    'DocTestSuite',
+    'DocFileSuite',
+    'set_unittest_reportflags',
+    # 9. Debugging Support
+    'script_from_examples',
+    'testsource',
+    'debug_src',
+    'debug',
+]
+
+import __future__
+
+import sys, traceback, inspect, linecache, os, re, types
+import unittest, difflib, pdb, tempfile
+import warnings
+from StringIO import StringIO
+
+# Don't whine about the deprecated is_private function in this
+# module's tests.
+warnings.filterwarnings("ignore", "is_private", DeprecationWarning,
+                        __name__, 0)
+
+# There are 4 basic classes:
+#  - Example: a <source, want> pair, plus an intra-docstring line number.
+#  - DocTest: a collection of examples, parsed from a docstring, plus
+#    info about where the docstring came from (name, filename, lineno).
+#  - DocTestFinder: extracts DocTests from a given object's docstring and
+#    its contained objects' docstrings.
+#  - DocTestRunner: runs DocTest cases, and accumulates statistics.
+#
+# So the basic picture is:
+#
+#                             list of:
+# +------+                   +---------+                   +-------+
+# |object| --DocTestFinder-> | DocTest | --DocTestRunner-> |results|
+# +------+                   +---------+                   +-------+
+#                            | Example |
+#                            |   ...   |
+#                            | Example |
+#                            +---------+
+
+# Option constants.
+
+OPTIONFLAGS_BY_NAME = {}
+def register_optionflag(name):
+    flag = 1 << len(OPTIONFLAGS_BY_NAME)
+    OPTIONFLAGS_BY_NAME[name] = flag
+    return flag
+
+DONT_ACCEPT_TRUE_FOR_1 = register_optionflag('DONT_ACCEPT_TRUE_FOR_1')
+DONT_ACCEPT_BLANKLINE = register_optionflag('DONT_ACCEPT_BLANKLINE')
+NORMALIZE_WHITESPACE = register_optionflag('NORMALIZE_WHITESPACE')
+ELLIPSIS = register_optionflag('ELLIPSIS')
+IGNORE_EXCEPTION_DETAIL = register_optionflag('IGNORE_EXCEPTION_DETAIL')
+
+COMPARISON_FLAGS = (DONT_ACCEPT_TRUE_FOR_1 |
+                    DONT_ACCEPT_BLANKLINE |
+                    NORMALIZE_WHITESPACE |
+                    ELLIPSIS |
+                    IGNORE_EXCEPTION_DETAIL)
+
+REPORT_UDIFF = register_optionflag('REPORT_UDIFF')
+REPORT_CDIFF = register_optionflag('REPORT_CDIFF')
+REPORT_NDIFF = register_optionflag('REPORT_NDIFF')
+REPORT_ONLY_FIRST_FAILURE = register_optionflag('REPORT_ONLY_FIRST_FAILURE')
+
+REPORTING_FLAGS = (REPORT_UDIFF |
+                   REPORT_CDIFF |
+                   REPORT_NDIFF |
+                   REPORT_ONLY_FIRST_FAILURE)
+
+# Special string markers for use in `want` strings:
+BLANKLINE_MARKER = '<BLANKLINE>'
+ELLIPSIS_MARKER = '...'
+
+######################################################################
+## Table of Contents
+######################################################################
+#  1. Utility Functions
+#  2. Example & DocTest -- store test cases
+#  3. DocTest Parser -- extracts examples from strings
+#  4. DocTest Finder -- extracts test cases from objects
+#  5. DocTest Runner -- runs test cases
+#  6. Test Functions -- convenient wrappers for testing
+#  7. Tester Class -- for backwards compatibility
+#  8. Unittest Support
+#  9. Debugging Support
+# 10. Example Usage
+
+######################################################################
+## 1. Utility Functions
+######################################################################
+
+def is_private(prefix, base):
+    """prefix, base -> true iff name prefix + "." + base is "private".
+
+    Prefix may be an empty string, and base does not contain a period.
+    Prefix is ignored (although functions you write conforming to this
+    protocol may make use of it).
+    Return true iff base begins with an (at least one) underscore, but
+    does not both begin and end with (at least) two underscores.
+
+    >>> is_private("a.b", "my_func")
+    False
+    >>> is_private("____", "_my_func")
+    True
+    >>> is_private("someclass", "__init__")
+    False
+    >>> is_private("sometypo", "__init_")
+    True
+    >>> is_private("x.y.z", "_")
+    True
+    >>> is_private("_x.y.z", "__")
+    False
+    >>> is_private("", "")  # senseless but consistent
+    False
+    """
+    warnings.warn("is_private is deprecated; it wasn't useful; "
+                  "examine DocTestFinder.find() lists instead",
+                  DeprecationWarning, stacklevel=2)
+    return base[:1] == "_" and not base[:2] == "__" == base[-2:]
+
+def _extract_future_flags(globs):
+    """
+    Return the compiler-flags associated with the future features that
+    have been imported into the given namespace (globs).
+    """
+    flags = 0
+    for fname in __future__.all_feature_names:
+        feature = globs.get(fname, None)
+        if feature is getattr(__future__, fname):
+            flags |= feature.compiler_flag
+    return flags
+
+def _normalize_module(module, depth=2):
+    """
+    Return the module specified by `module`.  In particular:
+      - If `module` is a module, then return module.
+      - If `module` is a string, then import and return the
+        module with that name.
+      - If `module` is None, then return the calling module.
+        The calling module is assumed to be the module of
+        the stack frame at the given depth in the call stack.
+    """
+    if inspect.ismodule(module):
+        return module
+    elif isinstance(module, (str, unicode)):
+        return __import__(module, globals(), locals(), ["*"])
+    elif module is None:
+        return sys.modules[sys._getframe(depth).f_globals['__name__']]
+    else:
+        raise TypeError("Expected a module, string, or None")
+
+def _indent(s, indent=4):
+    """
+    Add the given number of space characters to the beginning every
+    non-blank line in `s`, and return the result.
+    """
+    # This regexp matches the start of non-blank lines:
+    return re.sub('(?m)^(?!$)', indent*' ', s)
+
+def _exception_traceback(exc_info):
+    """
+    Return a string containing a traceback message for the given
+    exc_info tuple (as returned by sys.exc_info()).
+    """
+    # Get a traceback message.
+    excout = StringIO()
+    exc_type, exc_val, exc_tb = exc_info
+    traceback.print_exception(exc_type, exc_val, exc_tb, file=excout)
+    return excout.getvalue()
+
+# Override some StringIO methods.
+class _SpoofOut(StringIO):
+    def getvalue(self):
+        result = StringIO.getvalue(self)
+        # If anything at all was written, make sure there's a trailing
+        # newline.  There's no way for the expected output to indicate
+        # that a trailing newline is missing.
+        if result and not result.endswith("\n"):
+            result += "\n"
+        # Prevent softspace from screwing up the next test case, in
+        # case they used print with a trailing comma in an example.
+        if hasattr(self, "softspace"):
+            del self.softspace
+        return result
+
+    def truncate(self,   size=None):
+        StringIO.truncate(self, size)
+        if hasattr(self, "softspace"):
+            del self.softspace
+
+# Worst-case linear-time ellipsis matching.
+def _ellipsis_match(want, got):
+    """
+    Essentially the only subtle case:
+    >>> _ellipsis_match('aa...aa', 'aaa')
+    False
+    """
+    if ELLIPSIS_MARKER not in want:
+        return want == got
+
+    # Find "the real" strings.
+    ws = want.split(ELLIPSIS_MARKER)
+    assert len(ws) >= 2
+
+    # Deal with exact matches possibly needed at one or both ends.
+    startpos, endpos = 0, len(got)
+    w = ws[0]
+    if w:   # starts with exact match
+        if got.startswith(w):
+            startpos = len(w)
+            del ws[0]
+        else:
+            return False
+    w = ws[-1]
+    if w:   # ends with exact match
+        if got.endswith(w):
+            endpos -= len(w)
+            del ws[-1]
+        else:
+            return False
+
+    if startpos > endpos:
+        # Exact end matches required more characters than we have, as in
+        # _ellipsis_match('aa...aa', 'aaa')
+        return False
+
+    # For the rest, we only need to find the leftmost non-overlapping
+    # match for each piece.  If there's no overall match that way alone,
+    # there's no overall match period.
+    for w in ws:
+        # w may be '' at times, if there are consecutive ellipses, or
+        # due to an ellipsis at the start or end of `want`.  That's OK.
+        # Search for an empty string succeeds, and doesn't change startpos.
+        startpos = got.find(w, startpos, endpos)
+        if startpos < 0:
+            return False
+        startpos += len(w)
+
+    return True
+
+def _comment_line(line):
+    "Return a commented form of the given line"
+    line = line.rstrip()
+    if line:
+        return '# '+line
+    else:
+        return '#'
+
+class _OutputRedirectingPdb(pdb.Pdb):
+    """
+    A specialized version of the python debugger that redirects stdout
+    to a given stream when interacting with the user.  Stdout is *not*
+    redirected when traced code is executed.
+    """
+    def __init__(self, out):
+        self.__out = out
+        pdb.Pdb.__init__(self)
+
+    def trace_dispatch(self, *args):
+        # Redirect stdout to the given stream.
+        save_stdout = sys.stdout
+        sys.stdout = self.__out
+        # Call Pdb's trace dispatch method.
+        try:
+            return pdb.Pdb.trace_dispatch(self, *args)
+        finally:
+            sys.stdout = save_stdout
+
+# [XX] Normalize with respect to os.path.pardir?
+def _module_relative_path(module, path):
+    if not inspect.ismodule(module):
+        raise TypeError, 'Expected a module: %r' % module
+    if path.startswith('/'):
+        raise ValueError, 'Module-relative files may not have absolute paths'
+
+    # Find the base directory for the path.
+    if hasattr(module, '__file__'):
+        # A normal module/package
+        basedir = os.path.split(module.__file__)[0]
+    elif module.__name__ == '__main__':
+        # An interactive session.
+        if len(sys.argv)>0 and sys.argv[0] != '':
+            basedir = os.path.split(sys.argv[0])[0]
+        else:
+            basedir = os.curdir
+    else:
+        # A module w/o __file__ (this includes builtins)
+        raise ValueError("Can't resolve paths relative to the module " +
+                         module + " (it has no __file__)")
+
+    # Combine the base directory and the path.
+    return os.path.join(basedir, *(path.split('/')))
+
+######################################################################
+## 2. Example & DocTest
+######################################################################
+## - An "example" is a <source, want> pair, where "source" is a
+##   fragment of source code, and "want" is the expected output for
+##   "source."  The Example class also includes information about
+##   where the example was extracted from.
+##
+## - A "doctest" is a collection of examples, typically extracted from
+##   a string (such as an object's docstring).  The DocTest class also
+##   includes information about where the string was extracted from.
+
+class Example:
+    """
+    A single doctest example, consisting of source code and expected
+    output.  `Example` defines the following attributes:
+
+      - source: A single Python statement, always ending with a newline.
+        The constructor adds a newline if needed.
+
+      - want: The expected output from running the source code (either
+        from stdout, or a traceback in case of exception).  `want` ends
+        with a newline unless it's empty, in which case it's an empty
+        string.  The constructor adds a newline if needed.
+
+      - exc_msg: The exception message generated by the example, if
+        the example is expected to generate an exception; or `None` if
+        it is not expected to generate an exception.  This exception
+        message is compared against the return value of
+        `traceback.format_exception_only()`.  `exc_msg` ends with a
+        newline unless it's `None`.  The constructor adds a newline
+        if needed.
+
+      - lineno: The line number within the DocTest string containing
+        this Example where the Example begins.  This line number is
+        zero-based, with respect to the beginning of the DocTest.
+
+      - indent: The example's indentation in the DocTest string.
+        I.e., the number of space characters that preceed the
+        example's first prompt.
+
+      - options: A dictionary mapping from option flags to True or
+        False, which is used to override default options for this
+        example.  Any option flags not contained in this dictionary
+        are left at their default value (as specified by the
+        DocTestRunner's optionflags).  By default, no options are set.
+    """
+    def __init__(self, source, want, exc_msg=None, lineno=0, indent=0,
+                 options=None):
+        # Normalize inputs.
+        if not source.endswith('\n'):
+            source += '\n'
+        if want and not want.endswith('\n'):
+            want += '\n'
+        if exc_msg is not None and not exc_msg.endswith('\n'):
+            exc_msg += '\n'
+        # Store properties.
+        self.source = source
+        self.want = want
+        self.lineno = lineno
+        self.indent = indent
+        if options is None: options = {}
+        self.options = options
+        self.exc_msg = exc_msg
+
+class DocTest:
+    """
+    A collection of doctest examples that should be run in a single
+    namespace.  Each `DocTest` defines the following attributes:
+
+      - examples: the list of examples.
+
+      - globs: The namespace (aka globals) that the examples should
+        be run in.
+
+      - name: A name identifying the DocTest (typically, the name of
+        the object whose docstring this DocTest was extracted from).
+
+      - filename: The name of the file that this DocTest was extracted
+        from, or `None` if the filename is unknown.
+
+      - lineno: The line number within filename where this DocTest
+        begins, or `None` if the line number is unavailable.  This
+        line number is zero-based, with respect to the beginning of
+        the file.
+
+      - docstring: The string that the examples were extracted from,
+        or `None` if the string is unavailable.
+    """
+    def __init__(self, examples, globs, name, filename, lineno, docstring):
+        """
+        Create a new DocTest containing the given examples.  The
+        DocTest's globals are initialized with a copy of `globs`.
+        """
+        assert not isinstance(examples, basestring), \
+               "DocTest no longer accepts str; use DocTestParser instead"
+        self.examples = examples
+        self.docstring = docstring
+        self.globs = globs.copy()
+        self.name = name
+        self.filename = filename
+        self.lineno = lineno
+
+    def __repr__(self):
+        if len(self.examples) == 0:
+            examples = 'no examples'
+        elif len(self.examples) == 1:
+            examples = '1 example'
+        else:
+            examples = '%d examples' % len(self.examples)
+        return ('<DocTest %s from %s:%s (%s)>' %
+                (self.name, self.filename, self.lineno, examples))
+
+
+    # This lets us sort tests by name:
+    def __cmp__(self, other):
+        if not isinstance(other, DocTest):
+            return -1
+        return cmp((self.name, self.filename, self.lineno, id(self)),
+                   (other.name, other.filename, other.lineno, id(other)))
+
+######################################################################
+## 3. DocTestParser
+######################################################################
+
+class DocTestParser:
+    """
+    A class used to parse strings containing doctest examples.
+    """
+    # This regular expression is used to find doctest examples in a
+    # string.  It defines three groups: `source` is the source code
+    # (including leading indentation and prompts); `indent` is the
+    # indentation of the first (PS1) line of the source code; and
+    # `want` is the expected output (including leading indentation).
+    _EXAMPLE_RE = re.compile(r'''
+        # Source consists of a PS1 line followed by zero or more PS2 lines.
+        (?P<source>
+            (?:^(?P<indent> [ ]*) >>>    .*)    # PS1 line
+            (?:\n           [ ]*  \.\.\. .*)*)  # PS2 lines
+        \n?
+        # Want consists of any non-blank lines that do not start with PS1.
+        (?P<want> (?:(?![ ]*$)    # Not a blank line
+                     (?![ ]*>>>)  # Not a line starting with PS1
+                     .*$\n?       # But any other line
+                  )*)
+        ''', re.MULTILINE | re.VERBOSE)
+
+    # A regular expression for handling `want` strings that contain
+    # expected exceptions.  It divides `want` into three pieces:
+    #    - the traceback header line (`hdr`)
+    #    - the traceback stack (`stack`)
+    #    - the exception message (`msg`), as generated by
+    #      traceback.format_exception_only()
+    # `msg` may have multiple lines.  We assume/require that the
+    # exception message is the first non-indented line starting with a word
+    # character following the traceback header line.
+    _EXCEPTION_RE = re.compile(r"""
+        # Grab the traceback header.  Different versions of Python have
+        # said different things on the first traceback line.
+        ^(?P<hdr> Traceback\ \(
+            (?: most\ recent\ call\ last
+            |   innermost\ last
+            ) \) :
+        )
+        \s* $                # toss trailing whitespace on the header.
+        (?P<stack> .*?)      # don't blink: absorb stuff until...
+        ^ (?P<msg> \w+ .*)   #     a line *starts* with alphanum.
+        """, re.VERBOSE | re.MULTILINE | re.DOTALL)
+
+    # A callable returning a true value iff its argument is a blank line
+    # or contains a single comment.
+    _IS_BLANK_OR_COMMENT = re.compile(r'^[ ]*(#.*)?$').match
+
+    def parse(self, string, name='<string>'):
+        """
+        Divide the given string into examples and intervening text,
+        and return them as a list of alternating Examples and strings.
+        Line numbers for the Examples are 0-based.  The optional
+        argument `name` is a name identifying this string, and is only
+        used for error messages.
+        """
+        string = string.expandtabs()
+        # If all lines begin with the same indentation, then strip it.
+        min_indent = self._min_indent(string)
+        if min_indent > 0:
+            string = '\n'.join([l[min_indent:] for l in string.split('\n')])
+
+        output = []
+        charno, lineno = 0, 0
+        # Find all doctest examples in the string:
+        for m in self._EXAMPLE_RE.finditer(string):
+            # Add the pre-example text to `output`.
+            output.append(string[charno:m.start()])
+            # Update lineno (lines before this example)
+            lineno += string.count('\n', charno, m.start())
+            # Extract info from the regexp match.
+            (source, options, want, exc_msg) = \
+                     self._parse_example(m, name, lineno)
+            # Create an Example, and add it to the list.
+            if not self._IS_BLANK_OR_COMMENT(source):
+                output.append( Example(source, want, exc_msg,
+                                    lineno=lineno,
+                                    indent=min_indent+len(m.group('indent')),
+                                    options=options) )
+            # Update lineno (lines inside this example)
+            lineno += string.count('\n', m.start(), m.end())
+            # Update charno.
+            charno = m.end()
+        # Add any remaining post-example text to `output`.
+        output.append(string[charno:])
+        return output
+
+    def get_doctest(self, string, globs, name, filename, lineno):
+        """
+        Extract all doctest examples from the given string, and
+        collect them into a `DocTest` object.
+
+        `globs`, `name`, `filename`, and `lineno` are attributes for
+        the new `DocTest` object.  See the documentation for `DocTest`
+        for more information.
+        """
+        return DocTest(self.get_examples(string, name), globs,
+                       name, filename, lineno, string)
+
+    def get_examples(self, string, name='<string>'):
+        """
+        Extract all doctest examples from the given string, and return
+        them as a list of `Example` objects.  Line numbers are
+        0-based, because it's most common in doctests that nothing
+        interesting appears on the same line as opening triple-quote,
+        and so the first interesting line is called \"line 1\" then.
+
+        The optional argument `name` is a name identifying this
+        string, and is only used for error messages.
+        """
+        return [x for x in self.parse(string, name)
+                if isinstance(x, Example)]
+
+    def _parse_example(self, m, name, lineno):
+        """
+        Given a regular expression match from `_EXAMPLE_RE` (`m`),
+        return a pair `(source, want)`, where `source` is the matched
+        example's source code (with prompts and indentation stripped);
+        and `want` is the example's expected output (with indentation
+        stripped).
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        # Get the example's indentation level.
+        indent = len(m.group('indent'))
+
+        # Divide source into lines; check that they're properly
+        # indented; and then strip their indentation & prompts.
+        source_lines = m.group('source').split('\n')
+        self._check_prompt_blank(source_lines, indent, name, lineno)
+        self._check_prefix(source_lines[1:], ' '*indent + '.', name, lineno)
+        source = '\n'.join([sl[indent+4:] for sl in source_lines])
+
+        # Divide want into lines; check that it's properly indented; and
+        # then strip the indentation.  Spaces before the last newline should
+        # be preserved, so plain rstrip() isn't good enough.
+        want = m.group('want')
+        want_lines = want.split('\n')
+        if len(want_lines) > 1 and re.match(r' *$', want_lines[-1]):
+            del want_lines[-1]  # forget final newline & spaces after it
+        self._check_prefix(want_lines, ' '*indent, name,
+                           lineno + len(source_lines))
+        want = '\n'.join([wl[indent:] for wl in want_lines])
+
+        # If `want` contains a traceback message, then extract it.
+        m = self._EXCEPTION_RE.match(want)
+        if m:
+            exc_msg = m.group('msg')
+        else:
+            exc_msg = None
+
+        # Extract options from the source.
+        options = self._find_options(source, name, lineno)
+
+        return source, options, want, exc_msg
+
+    # This regular expression looks for option directives in the
+    # source code of an example.  Option directives are comments
+    # starting with "doctest:".  Warning: this may give false
+    # positives for string-literals that contain the string
+    # "#doctest:".  Eliminating these false positives would require
+    # actually parsing the string; but we limit them by ignoring any
+    # line containing "#doctest:" that is *followed* by a quote mark.
+    _OPTION_DIRECTIVE_RE = re.compile(r'#\s*doctest:\s*([^\n\'"]*)$',
+                                      re.MULTILINE)
+
+    def _find_options(self, source, name, lineno):
+        """
+        Return a dictionary containing option overrides extracted from
+        option directives in the given source string.
+
+        `name` is the string's name, and `lineno` is the line number
+        where the example starts; both are used for error messages.
+        """
+        options = {}
+        # (note: with the current regexp, this will match at most once:)
+        for m in self._OPTION_DIRECTIVE_RE.finditer(source):
+            option_strings = m.group(1).replace(',', ' ').split()
+            for option in option_strings:
+                if (option[0] not in '+-' or
+                    option[1:] not in OPTIONFLAGS_BY_NAME):
+                    raise ValueError('line %r of the doctest for %s '
+                                     'has an invalid option: %r' %
+                                     (lineno+1, name, option))
+                flag = OPTIONFLAGS_BY_NAME[option[1:]]
+                options[flag] = (option[0] == '+')
+        if options and self._IS_BLANK_OR_COMMENT(source):
+            raise ValueError('line %r of the doctest for %s has an option '
+                             'directive on a line with no example: %r' %
+                             (lineno, name, source))
+        return options
+
+    # This regular expression finds the indentation of every non-blank
+    # line in a string.
+    _INDENT_RE = re.compile('^([ ]*)(?=\S)', re.MULTILINE)
+
+    def _min_indent(self, s):
+        "Return the minimum indentation of any non-blank line in `s`"
+        indents = [len(indent) for indent in self._INDENT_RE.findall(s)]
+        if len(indents) > 0:
+            return min(indents)
+        else:
+            return 0
+
+    def _check_prompt_blank(self, lines, indent, name, lineno):
+        """
+        Given the lines of a source string (including prompts and
+        leading indentation), check to make sure that every prompt is
+        followed by a space character.  If any line is not followed by
+        a space character, then raise ValueError.
+        """
+        for i, line in enumerate(lines):
+            if len(line) >= indent+4 and line[indent+3] != ' ':
+                raise ValueError('line %r of the docstring for %s '
+                                 'lacks blank after %s: %r' %
+                                 (lineno+i+1, name,
+                                  line[indent:indent+3], line))
+
+    def _check_prefix(self, lines, prefix, name, lineno):
+        """
+        Check that every line in the given list starts with the given
+        prefix; if any line does not, then raise a ValueError.
+        """
+        for i, line in enumerate(lines):
+            if line and not line.startswith(prefix):
+                raise ValueError('line %r of the docstring for %s has '
+                                 'inconsistent leading whitespace: %r' %
+                                 (lineno+i+1, name, line))
+
+
+######################################################################
+## 4. DocTest Finder
+######################################################################
+
+class DocTestFinder:
+    """
+    A class used to extract the DocTests that are relevant to a given
+    object, from its docstring and the docstrings of its contained
+    objects.  Doctests can currently be extracted from the following
+    object types: modules, functions, classes, methods, staticmethods,
+    classmethods, and properties.
+    """
+
+    def __init__(self, verbose=False, parser=DocTestParser(),
+                 recurse=True, _namefilter=None, exclude_empty=True):
+        """
+        Create a new doctest finder.
+
+        The optional argument `parser` specifies a class or
+        function that should be used to create new DocTest objects (or
+        objects that implement the same interface as DocTest).  The
+        signature for this factory function should match the signature
+        of the DocTest constructor.
+
+        If the optional argument `recurse` is false, then `find` will
+        only examine the given object, and not any contained objects.
+
+        If the optional argument `exclude_empty` is false, then `find`
+        will include tests for objects with empty docstrings.
+        """
+        self._parser = parser
+        self._verbose = verbose
+        self._recurse = recurse
+        self._exclude_empty = exclude_empty
+        # _namefilter is undocumented, and exists only for temporary backward-
+        # compatibility support of testmod's deprecated isprivate mess.
+        self._namefilter = _namefilter
+
+    def find(self, obj, name=None, module=None, globs=None,
+             extraglobs=None):
+        """
+        Return a list of the DocTests that are defined by the given
+        object's docstring, or by any of its contained objects'
+        docstrings.
+
+        The optional parameter `module` is the module that contains
+        the given object.  If the module is not specified or is None, then
+        the test finder will attempt to automatically determine the
+        correct module.  The object's module is used:
+
+            - As a default namespace, if `globs` is not specified.
+            - To prevent the DocTestFinder from extracting DocTests
+              from objects that are imported from other modules.
+            - To find the name of the file containing the object.
+            - To help find the line number of the object within its
+              file.
+
+        Contained objects whose module does not match `module` are ignored.
+
+        If `module` is False, no attempt to find the module will be made.
+        This is obscure, of use mostly in tests:  if `module` is False, or
+        is None but cannot be found automatically, then all objects are
+        considered to belong to the (non-existent) module, so all contained
+        objects will (recursively) be searched for doctests.
+
+        The globals for each DocTest is formed by combining `globs`
+        and `extraglobs` (bindings in `extraglobs` override bindings
+        in `globs`).  A new copy of the globals dictionary is created
+        for each DocTest.  If `globs` is not specified, then it
+        defaults to the module's `__dict__`, if specified, or {}
+        otherwise.  If `extraglobs` is not specified, then it defaults
+        to {}.
+
+        """
+        # If name was not specified, then extract it from the object.
+        if name is None:
+            name = getattr(obj, '__name__', None)
+            if name is None:
+                raise ValueError("DocTestFinder.find: name must be given "
+                        "when obj.__name__ doesn't exist: %r" %
+                                 (type(obj),))
+
+        # Find the module that contains the given object (if obj is
+        # a module, then module=obj.).  Note: this may fail, in which
+        # case module will be None.
+        if module is False:
+            module = None
+        elif module is None:
+            module = inspect.getmodule(obj)
+
+        # Read the module's source code.  This is used by
+        # DocTestFinder._find_lineno to find the line number for a
+        # given object's docstring.
+        try:
+            file = inspect.getsourcefile(obj) or inspect.getfile(obj)
+            source_lines = linecache.getlines(file)
+            if not source_lines:
+                source_lines = None
+        except TypeError:
+            source_lines = None
+
+        # Initialize globals, and merge in extraglobs.
+        if globs is None:
+            if module is None:
+                globs = {}
+            else:
+                globs = module.__dict__.copy()
+        else:
+            globs = globs.copy()
+        if extraglobs is not None:
+            globs.update(extraglobs)
+
+        # Recursively explore `obj`, extracting DocTests.
+        tests = []
+        self._find(tests, obj, name, module, source_lines, globs, {})
+        return tests
+
+    def _filter(self, obj, prefix, base):
+        """
+        Return true if the given object should not be examined.
+        """
+        return (self._namefilter is not None and
+                self._namefilter(prefix, base))
+
+    def _from_module(self, module, object):
+        """
+        Return true if the given object is defined in the given
+        module.
+        """
+        if module is None:
+            return True
+        elif inspect.isfunction(object):
+            return module.__dict__ is object.func_globals
+        elif inspect.isclass(object):
+            return module.__name__ == object.__module__
+        elif inspect.getmodule(object) is not None:
+            return module is inspect.getmodule(object)
+        elif hasattr(object, '__module__'):
+            return module.__name__ == object.__module__
+        elif isinstance(object, property):
+            return True # [XX] no way not be sure.
+        else:
+            raise ValueError("object must be a class or function")
+
+    def _find(self, tests, obj, name, module, source_lines, globs, seen):
+        """
+        Find tests for the given object and any contained objects, and
+        add them to `tests`.
+        """
+        if self._verbose:
+            print 'Finding tests in %s' % name
+
+        # If we've already processed this object, then ignore it.
+        if id(obj) in seen:
+            return
+        seen[id(obj)] = 1
+
+        # Find a test for this object, and add it to the list of tests.
+        test = self._get_test(obj, name, module, globs, source_lines)
+        if test is not None:
+            tests.append(test)
+
+        # Look for tests in a module's contained objects.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                valname = '%s.%s' % (name, valname)
+                # Recurse to functions & classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val)) and
+                    self._from_module(module, val)):
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+        # Look for tests in a module's __test__ dictionary.
+        if inspect.ismodule(obj) and self._recurse:
+            for valname, val in getattr(obj, '__test__', {}).items():
+                if not isinstance(valname, basestring):
+                    raise ValueError("DocTestFinder.find: __test__ keys "
+                                     "must be strings: %r" %
+                                     (type(valname),))
+                if not (inspect.isfunction(val) or inspect.isclass(val) or
+                        inspect.ismethod(val) or inspect.ismodule(val) or
+                        isinstance(val, basestring)):
+                    raise ValueError("DocTestFinder.find: __test__ values "
+                                     "must be strings, functions, methods, "
+                                     "classes, or modules: %r" %
+                                     (type(val),))
+                valname = '%s.__test__.%s' % (name, valname)
+                self._find(tests, val, valname, module, source_lines,
+                           globs, seen)
+
+        # Look for tests in a class's contained objects.
+        if inspect.isclass(obj) and self._recurse:
+            for valname, val in obj.__dict__.items():
+                # Check if this contained object should be ignored.
+                if self._filter(val, name, valname):
+                    continue
+                # Special handling for staticmethod/classmethod.
+                if isinstance(val, staticmethod):
+                    val = getattr(obj, valname)
+                if isinstance(val, classmethod):
+                    val = getattr(obj, valname).im_func
+
+                # Recurse to methods, properties, and nested classes.
+                if ((inspect.isfunction(val) or inspect.isclass(val) or
+                      isinstance(val, property)) and
+                      self._from_module(module, val)):
+                    valname = '%s.%s' % (name, valname)
+                    self._find(tests, val, valname, module, source_lines,
+                               globs, seen)
+
+    def _get_test(self, obj, name, module, globs, source_lines):
+        """
+        Return a DocTest for the given object, if it defines a docstring;
+        otherwise, return None.
+        """
+        # Extract the object's docstring.  If it doesn't have one,
+        # then return None (no test for this object).
+        if isinstance(obj, basestring):
+            docstring = obj
+        else:
+            try:
+                if obj.__doc__ is None:
+                    docstring = ''
+                else:
+                    docstring = obj.__doc__
+                    if not isinstance(docstring, basestring):
+                        docstring = str(docstring)
+            except (TypeError, AttributeError):
+                docstring = ''
+
+        # Find the docstring's location in the file.
+        lineno = self._find_lineno(obj, source_lines)
+
+        # Don't bother if the docstring is empty.
+        if self._exclude_empty and not docstring:
+            return None
+
+        # Return a DocTest for this object.
+        if module is None:
+            filename = None
+        else:
+            filename = getattr(module, '__file__', module.__name__)
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+        return self._parser.get_doctest(docstring, globs, name,
+                                        filename, lineno)
+
+    def _find_lineno(self, obj, source_lines):
+        """
+        Return a line number of the given object's docstring.  Note:
+        this method assumes that the object has a docstring.
+        """
+        lineno = None
+
+        # Find the line number for modules.
+        if inspect.ismodule(obj):
+            lineno = 0
+
+        # Find the line number for classes.
+        # Note: this could be fooled if a class is defined multiple
+        # times in a single file.
+        if inspect.isclass(obj):
+            if source_lines is None:
+                return None
+            pat = re.compile(r'^\s*class\s*%s\b' %
+                             getattr(obj, '__name__', '-'))
+            for i, line in enumerate(source_lines):
+                if pat.match(line):
+                    lineno = i
+                    break
+
+        # Find the line number for functions & methods.
+        if inspect.ismethod(obj): obj = obj.im_func
+        if inspect.isfunction(obj): obj = obj.func_code
+        if inspect.istraceback(obj): obj = obj.tb_frame
+        if inspect.isframe(obj): obj = obj.f_code
+        if inspect.iscode(obj):
+            lineno = getattr(obj, 'co_firstlineno', None)-1
+
+        # Find the line number where the docstring starts.  Assume
+        # that it's the first line that begins with a quote mark.
+        # Note: this could be fooled by a multiline function
+        # signature, where a continuation line begins with a quote
+        # mark.
+        if lineno is not None:
+            if source_lines is None:
+                return lineno+1
+            pat = re.compile('(^|.*:)\s*\w*("|\')')
+            for lineno in range(lineno, len(source_lines)):
+                if pat.match(source_lines[lineno]):
+                    return lineno
+
+        # We couldn't find the line number.
+        return None
+
+######################################################################
+## 5. DocTest Runner
+######################################################################
+
+class DocTestRunner:
+    """
+    A class used to run DocTest test cases, and accumulate statistics.
+    The `run` method is used to process a single DocTest case.  It
+    returns a tuple `(f, t)`, where `t` is the number of test cases
+    tried, and `f` is the number of test cases that failed.
+
+        >>> tests = DocTestFinder().find(_TestClass)
+        >>> runner = DocTestRunner(verbose=False)
+        >>> for test in tests:
+        ...     print runner.run(test)
+        (0, 2)
+        (0, 1)
+        (0, 2)
+        (0, 2)
+
+    The `summarize` method prints a summary of all the test cases that
+    have been run by the runner, and returns an aggregated `(f, t)`
+    tuple:
+
+        >>> runner.summarize(verbose=1)
+        4 items passed all tests:
+           2 tests in _TestClass
+           2 tests in _TestClass.__init__
+           2 tests in _TestClass.get
+           1 tests in _TestClass.square
+        7 tests in 4 items.
+        7 passed and 0 failed.
+        Test passed.
+        (0, 7)
+
+    The aggregated number of tried examples and failed examples is
+    also available via the `tries` and `failures` attributes:
+
+        >>> runner.tries
+        7
+        >>> runner.failures
+        0
+
+    The comparison between expected outputs and actual outputs is done
+    by an `OutputChecker`.  This comparison may be customized with a
+    number of option flags; see the documentation for `testmod` for
+    more information.  If the option flags are insufficient, then the
+    comparison may also be customized by passing a subclass of
+    `OutputChecker` to the constructor.
+
+    The test runner's display output can be controlled in two ways.
+    First, an output function (`out) can be passed to
+    `TestRunner.run`; this function will be called with strings that
+    should be displayed.  It defaults to `sys.stdout.write`.  If
+    capturing the output is not sufficient, then the display output
+    can be also customized by subclassing DocTestRunner, and
+    overriding the methods `report_start`, `report_success`,
+    `report_unexpected_exception`, and `report_failure`.
+    """
+    # This divider string is used to separate failure messages, and to
+    # separate sections of the summary.
+    DIVIDER = "*" * 70
+
+    def __init__(self, checker=None, verbose=None, optionflags=0):
+        """
+        Create a new test runner.
+
+        Optional keyword arg `checker` is the `OutputChecker` that
+        should be used to compare the expected outputs and actual
+        outputs of doctest examples.
+
+        Optional keyword arg 'verbose' prints lots of stuff if true,
+        only failures if false; by default, it's true iff '-v' is in
+        sys.argv.
+
+        Optional argument `optionflags` can be used to control how the
+        test runner compares expected output to actual output, and how
+        it displays failures.  See the documentation for `testmod` for
+        more information.
+        """
+        self._checker = checker or OutputChecker()
+        if verbose is None:
+            verbose = '-v' in sys.argv
+        self._verbose = verbose
+        self.optionflags = optionflags
+        self.original_optionflags = optionflags
+
+        # Keep track of the examples we've run.
+        self.tries = 0
+        self.failures = 0
+        self._name2ft = {}
+
+        # Create a fake output target for capturing doctest output.
+        self._fakeout = _SpoofOut()
+
+    #/////////////////////////////////////////////////////////////////
+    # Reporting methods
+    #/////////////////////////////////////////////////////////////////
+
+    def report_start(self, out, test, example):
+        """
+        Report that the test runner is about to process the given
+        example.  (Only displays a message if verbose=True)
+        """
+        if self._verbose:
+            if example.want:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting:\n' + _indent(example.want))
+            else:
+                out('Trying:\n' + _indent(example.source) +
+                    'Expecting nothing\n')
+
+    def report_success(self, out, test, example, got):
+        """
+        Report that the given example ran successfully.  (Only
+        displays a message if verbose=True)
+        """
+        if self._verbose:
+            out("ok\n")
+
+    def report_failure(self, out, test, example, got):
+        """
+        Report that the given example failed.
+        """
+        out(self._failure_header(test, example) +
+            self._checker.output_difference(example, got, self.optionflags))
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        """
+        Report that the given example raised an unexpected exception.
+        """
+        out(self._failure_header(test, example) +
+            'Exception raised:\n' + _indent(_exception_traceback(exc_info)))
+
+    def _failure_header(self, test, example):
+        out = [self.DIVIDER]
+        if test.filename:
+            if test.lineno is not None and example.lineno is not None:
+                lineno = test.lineno + example.lineno + 1
+            else:
+                lineno = '?'
+            out.append('File "%s", line %s, in %s' %
+                       (test.filename, lineno, test.name))
+        else:
+            out.append('Line %s, in %s' % (example.lineno+1, test.name))
+        out.append('Failed example:')
+        source = example.source
+        out.append(_indent(source))
+        return '\n'.join(out)
+
+    #/////////////////////////////////////////////////////////////////
+    # DocTest Running
+    #/////////////////////////////////////////////////////////////////
+
+    def __run(self, test, compileflags, out):
+        """
+        Run the examples in `test`.  Write the outcome of each example
+        with one of the `DocTestRunner.report_*` methods, using the
+        writer function `out`.  `compileflags` is the set of compiler
+        flags that should be used to execute examples.  Return a tuple
+        `(f, t)`, where `t` is the number of examples tried, and `f`
+        is the number of examples that failed.  The examples are run
+        in the namespace `test.globs`.
+        """
+        # Keep track of the number of failures and tries.
+        failures = tries = 0
+
+        # Save the option flags (since option directives can be used
+        # to modify them).
+        original_optionflags = self.optionflags
+
+        SUCCESS, FAILURE, BOOM = range(3) # `outcome` state
+
+        check = self._checker.check_output
+
+        # Process each example.
+        for examplenum, example in enumerate(test.examples):
+
+            # If REPORT_ONLY_FIRST_FAILURE is set, then suppress
+            # reporting after the first failure.
+            quiet = (self.optionflags & REPORT_ONLY_FIRST_FAILURE and
+                     failures > 0)
+
+            # Merge in the example's options.
+            self.optionflags = original_optionflags
+            if example.options:
+                for (optionflag, val) in example.options.items():
+                    if val:
+                        self.optionflags |= optionflag
+                    else:
+                        self.optionflags &= ~optionflag
+
+            # Record that we started this example.
+            tries += 1
+            if not quiet:
+                self.report_start(out, test, example)
+
+            # Use a special filename for compile(), so we can retrieve
+            # the source code during interactive debugging (see
+            # __patched_linecache_getlines).
+            filename = '<doctest %s[%d]>' % (test.name, examplenum)
+
+            # Run the example in the given context (globs), and record
+            # any exception that gets raised.  (But don't intercept
+            # keyboard interrupts.)
+            try:
+                # Don't blink!  This is where the user's code gets run.
+                exec compile(example.source, filename, "single",
+                             compileflags, 1) in test.globs
+                self.debugger.set_continue() # ==== Example Finished ====
+                exception = None
+            except KeyboardInterrupt:
+                raise
+            except:
+                exception = sys.exc_info()
+                self.debugger.set_continue() # ==== Example Finished ====
+
+            got = self._fakeout.getvalue()  # the actual output
+            self._fakeout.truncate(0)
+            outcome = FAILURE   # guilty until proved innocent or insane
+
+            # If the example executed without raising any exceptions,
+            # verify its output.
+            if exception is None:
+                if check(example.want, got, self.optionflags):
+                    outcome = SUCCESS
+
+            # The example raised an exception:  check if it was expected.
+            else:
+                exc_info = sys.exc_info()
+                exc_msg = traceback.format_exception_only(*exc_info[:2])[-1]
+                if not quiet:
+                    got += _exception_traceback(exc_info)
+
+                # If `example.exc_msg` is None, then we weren't expecting
+                # an exception.
+                if example.exc_msg is None:
+                    outcome = BOOM
+
+                # We expected an exception:  see whether it matches.
+                elif check(example.exc_msg, exc_msg, self.optionflags):
+                    outcome = SUCCESS
+
+                # Another chance if they didn't care about the detail.
+                elif self.optionflags & IGNORE_EXCEPTION_DETAIL:
+                    m1 = re.match(r'[^:]*:', example.exc_msg)
+                    m2 = re.match(r'[^:]*:', exc_msg)
+                    if m1 and m2 and check(m1.group(0), m2.group(0),
+                                           self.optionflags):
+                        outcome = SUCCESS
+
+            # Report the outcome.
+            if outcome is SUCCESS:
+                if not quiet:
+                    self.report_success(out, test, example, got)
+            elif outcome is FAILURE:
+                if not quiet:
+                    self.report_failure(out, test, example, got)
+                failures += 1
+            elif outcome is BOOM:
+                if not quiet:
+                    self.report_unexpected_exception(out, test, example,
+                                                     exc_info)
+                failures += 1
+            else:
+                assert False, ("unknown outcome", outcome)
+
+        # Restore the option flags (in case they were modified)
+        self.optionflags = original_optionflags
+
+        # Record and return the number of failures and tries.
+        self.__record_outcome(test, failures, tries)
+        return failures, tries
+
+    def __record_outcome(self, test, f, t):
+        """
+        Record the fact that the given DocTest (`test`) generated `f`
+        failures out of `t` tried examples.
+        """
+        f2, t2 = self._name2ft.get(test.name, (0,0))
+        self._name2ft[test.name] = (f+f2, t+t2)
+        self.failures += f
+        self.tries += t
+
+    __LINECACHE_FILENAME_RE = re.compile(r'<doctest '
+                                         r'(?P<name>[\w\.]+)'
+                                         r'\[(?P<examplenum>\d+)\]>$')
+    def __patched_linecache_getlines(self, filename):
+        m = self.__LINECACHE_FILENAME_RE.match(filename)
+        if m and m.group('name') == self.test.name:
+            example = self.test.examples[int(m.group('examplenum'))]
+            return example.source.splitlines(True)
+        else:
+            return self.save_linecache_getlines(filename)
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        """
+        Run the examples in `test`, and display the results using the
+        writer function `out`.
+
+        The examples are run in the namespace `test.globs`.  If
+        `clear_globs` is true (the default), then this namespace will
+        be cleared after the test runs, to help with garbage
+        collection.  If you would like to examine the namespace after
+        the test completes, then use `clear_globs=False`.
+
+        `compileflags` gives the set of flags that should be used by
+        the Python compiler when running the examples.  If not
+        specified, then it will default to the set of future-import
+        flags that apply to `globs`.
+
+        The output of each example is checked using
+        `DocTestRunner.check_output`, and the results are formatted by
+        the `DocTestRunner.report_*` methods.
+        """
+        self.test = test
+
+        if compileflags is None:
+            compileflags = _extract_future_flags(test.globs)
+
+        save_stdout = sys.stdout
+        if out is None:
+            out = save_stdout.write
+        sys.stdout = self._fakeout
+
+        # Patch pdb.set_trace to restore sys.stdout during interactive
+        # debugging (so it's not still redirected to self._fakeout).
+        # Note that the interactive output will go to *our*
+        # save_stdout, even if that's not the real sys.stdout; this
+        # allows us to write test cases for the set_trace behavior.
+        save_set_trace = pdb.set_trace
+        self.debugger = _OutputRedirectingPdb(save_stdout)
+        self.debugger.reset()
+        pdb.set_trace = self.debugger.set_trace
+
+        # Patch linecache.getlines, so we can see the example's source
+        # when we're inside the debugger.
+        self.save_linecache_getlines = linecache.getlines
+        linecache.getlines = self.__patched_linecache_getlines
+
+        try:
+            return self.__run(test, compileflags, out)
+        finally:
+            sys.stdout = save_stdout
+            pdb.set_trace = save_set_trace
+            linecache.getlines = self.save_linecache_getlines
+            if clear_globs:
+                test.globs.clear()
+
+    #/////////////////////////////////////////////////////////////////
+    # Summarization
+    #/////////////////////////////////////////////////////////////////
+    def summarize(self, verbose=None):
+        """
+        Print a summary of all the test cases that have been run by
+        this DocTestRunner, and return a tuple `(f, t)`, where `f` is
+        the total number of failed examples, and `t` is the total
+        number of tried examples.
+
+        The optional `verbose` argument controls how detailed the
+        summary is.  If the verbosity is not specified, then the
+        DocTestRunner's verbosity is used.
+        """
+        if verbose is None:
+            verbose = self._verbose
+        notests = []
+        passed = []
+        failed = []
+        totalt = totalf = 0
+        for x in self._name2ft.items():
+            name, (f, t) = x
+            assert f <= t
+            totalt += t
+            totalf += f
+            if t == 0:
+                notests.append(name)
+            elif f == 0:
+                passed.append( (name, t) )
+            else:
+                failed.append(x)
+        if verbose:
+            if notests:
+                print len(notests), "items had no tests:"
+                notests.sort()
+                for thing in notests:
+                    print "   ", thing
+            if passed:
+                print len(passed), "items passed all tests:"
+                passed.sort()
+                for thing, count in passed:
+                    print " %3d tests in %s" % (count, thing)
+        if failed:
+            print self.DIVIDER
+            print len(failed), "items had failures:"
+            failed.sort()
+            for thing, (f, t) in failed:
+                print " %3d of %3d in %s" % (f, t, thing)
+        if verbose:
+            print totalt, "tests in", len(self._name2ft), "items."
+            print totalt - totalf, "passed and", totalf, "failed."
+        if totalf:
+            print "***Test Failed***", totalf, "failures."
+        elif verbose:
+            print "Test passed."
+        return totalf, totalt
+
+    #/////////////////////////////////////////////////////////////////
+    # Backward compatibility cruft to maintain doctest.master.
+    #/////////////////////////////////////////////////////////////////
+    def merge(self, other):
+        d = self._name2ft
+        for name, (f, t) in other._name2ft.items():
+            if name in d:
+                print "*** DocTestRunner.merge: '" + name + "' in both" \
+                    " testers; summing outcomes."
+                f2, t2 = d[name]
+                f = f + f2
+                t = t + t2
+            d[name] = f, t
+
+class OutputChecker:
+    """
+    A class used to check the whether the actual output from a doctest
+    example matches the expected output.  `OutputChecker` defines two
+    methods: `check_output`, which compares a given pair of outputs,
+    and returns true if they match; and `output_difference`, which
+    returns a string describing the differences between two outputs.
+    """
+    def check_output(self, want, got, optionflags):
+        """
+        Return True iff the actual output from an example (`got`)
+        matches the expected output (`want`).  These strings are
+        always considered to match if they are identical; but
+        depending on what option flags the test runner is using,
+        several non-exact match types are also possible.  See the
+        documentation for `TestRunner` for more information about
+        option flags.
+        """
+        # Handle the common case first, for efficiency:
+        # if they're string-identical, always return true.
+        if got == want:
+            return True
+
+        # The values True and False replaced 1 and 0 as the return
+        # value for boolean comparisons in Python 2.3.
+        if not (optionflags & DONT_ACCEPT_TRUE_FOR_1):
+            if (got,want) == ("True\n", "1\n"):
+                return True
+            if (got,want) == ("False\n", "0\n"):
+                return True
+
+        # <BLANKLINE> can be used as a special sequence to signify a
+        # blank line, unless the DONT_ACCEPT_BLANKLINE flag is used.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            # Replace <BLANKLINE> in want with a blank line.
+            want = re.sub('(?m)^%s\s*?$' % re.escape(BLANKLINE_MARKER),
+                          '', want)
+            # If a line in got contains only spaces, then remove the
+            # spaces.
+            got = re.sub('(?m)^\s*?$', '', got)
+            if got == want:
+                return True
+
+        # This flag causes doctest to ignore any differences in the
+        # contents of whitespace strings.  Note that this can be used
+        # in conjunction with the ELLIPSIS flag.
+        if optionflags & NORMALIZE_WHITESPACE:
+            got = ' '.join(got.split())
+            want = ' '.join(want.split())
+            if got == want:
+                return True
+
+        # The ELLIPSIS flag says to let the sequence "..." in `want`
+        # match any substring in `got`.
+        if optionflags & ELLIPSIS:
+            if _ellipsis_match(want, got):
+                return True
+
+        # We didn't find any match; return false.
+        return False
+
+    # Should we do a fancy diff?
+    def _do_a_fancy_diff(self, want, got, optionflags):
+        # Not unless they asked for a fancy diff.
+        if not optionflags & (REPORT_UDIFF |
+                              REPORT_CDIFF |
+                              REPORT_NDIFF):
+            return False
+
+        # If expected output uses ellipsis, a meaningful fancy diff is
+        # too hard ... or maybe not.  In two real-life failures Tim saw,
+        # a diff was a major help anyway, so this is commented out.
+        # [todo] _ellipsis_match() knows which pieces do and don't match,
+        # and could be the basis for a kick-ass diff in this case.
+        ##if optionflags & ELLIPSIS and ELLIPSIS_MARKER in want:
+        ##    return False
+
+        # ndiff does intraline difference marking, so can be useful even
+        # for 1-line differences.
+        if optionflags & REPORT_NDIFF:
+            return True
+
+        # The other diff types need at least a few lines to be helpful.
+        return want.count('\n') > 2 and got.count('\n') > 2
+
+    def output_difference(self, example, got, optionflags):
+        """
+        Return a string describing the differences between the
+        expected output for a given example (`example`) and the actual
+        output (`got`).  `optionflags` is the set of option flags used
+        to compare `want` and `got`.
+        """
+        want = example.want
+        # If <BLANKLINE>s are being used, then replace blank lines
+        # with <BLANKLINE> in the actual output string.
+        if not (optionflags & DONT_ACCEPT_BLANKLINE):
+            got = re.sub('(?m)^[ ]*(?=\n)', BLANKLINE_MARKER, got)
+
+        # Check if we should use diff.
+        if self._do_a_fancy_diff(want, got, optionflags):
+            # Split want & got into lines.
+            want_lines = want.splitlines(True)  # True == keep line ends
+            got_lines = got.splitlines(True)
+            # Use difflib to find their differences.
+            if optionflags & REPORT_UDIFF:
+                diff = difflib.unified_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'unified diff with -expected +actual'
+            elif optionflags & REPORT_CDIFF:
+                diff = difflib.context_diff(want_lines, got_lines, n=2)
+                diff = list(diff)[2:] # strip the diff header
+                kind = 'context diff with expected followed by actual'
+            elif optionflags & REPORT_NDIFF:
+                engine = difflib.Differ(charjunk=difflib.IS_CHARACTER_JUNK)
+                diff = list(engine.compare(want_lines, got_lines))
+                kind = 'ndiff with -expected +actual'
+            else:
+                assert 0, 'Bad diff option'
+            # Remove trailing whitespace on diff output.
+            diff = [line.rstrip() + '\n' for line in diff]
+            return 'Differences (%s):\n' % kind + _indent(''.join(diff))
+
+        # If we're not using diff, then simply list the expected
+        # output followed by the actual output.
+        if want and got:
+            return 'Expected:\n%sGot:\n%s' % (_indent(want), _indent(got))
+        elif want:
+            return 'Expected:\n%sGot nothing\n' % _indent(want)
+        elif got:
+            return 'Expected nothing\nGot:\n%s' % _indent(got)
+        else:
+            return 'Expected nothing\nGot nothing\n'
+
+class DocTestFailure(Exception):
+    """A DocTest example has failed in debugging mode.
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - got: the actual output
+    """
+    def __init__(self, test, example, got):
+        self.test = test
+        self.example = example
+        self.got = got
+
+    def __str__(self):
+        return str(self.test)
+
+class UnexpectedException(Exception):
+    """A DocTest example has encountered an unexpected exception
+
+    The exception instance has variables:
+
+    - test: the DocTest object being run
+
+    - excample: the Example object that failed
+
+    - exc_info: the exception info
+    """
+    def __init__(self, test, example, exc_info):
+        self.test = test
+        self.example = example
+        self.exc_info = exc_info
+
+    def __str__(self):
+        return str(self.test)
+
+class DebugRunner(DocTestRunner):
+    r"""Run doc tests but raise an exception as soon as there is a failure.
+
+       If an unexpected exception occurs, an UnexpectedException is raised.
+       It contains the test, the example, and the original exception:
+
+         >>> runner = DebugRunner(verbose=False)
+         >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
+         ...                                    {}, 'foo', 'foo.py', 0)
+         >>> try:
+         ...     runner.run(test)
+         ... except UnexpectedException, failure:
+         ...     pass
+
+         >>> failure.test is test
+         True
+
+         >>> failure.example.want
+         '42\n'
+
+         >>> exc_info = failure.exc_info
+         >>> raise exc_info[0], exc_info[1], exc_info[2]
+         Traceback (most recent call last):
+         ...
+         KeyError
+
+       We wrap the original exception to give the calling application
+       access to the test and example information.
+
+       If the output doesn't match, then a DocTestFailure is raised:
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 1
+         ...      >>> x
+         ...      2
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> try:
+         ...    runner.run(test)
+         ... except DocTestFailure, failure:
+         ...    pass
+
+       DocTestFailure objects provide access to the test:
+
+         >>> failure.test is test
+         True
+
+       As well as to the example:
+
+         >>> failure.example.want
+         '2\n'
+
+       and the actual output:
+
+         >>> failure.got
+         '1\n'
+
+       If a failure or error occurs, the globals are left intact:
+
+         >>> del test.globs['__builtins__']
+         >>> test.globs
+         {'x': 1}
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 2
+         ...      >>> raise KeyError
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> runner.run(test)
+         Traceback (most recent call last):
+         ...
+         UnexpectedException: <DocTest foo from foo.py:0 (2 examples)>
+
+         >>> del test.globs['__builtins__']
+         >>> test.globs
+         {'x': 2}
+
+       But the globals are cleared if there is no error:
+
+         >>> test = DocTestParser().get_doctest('''
+         ...      >>> x = 2
+         ...      ''', {}, 'foo', 'foo.py', 0)
+
+         >>> runner.run(test)
+         (0, 1)
+
+         >>> test.globs
+         {}
+
+       """
+
+    def run(self, test, compileflags=None, out=None, clear_globs=True):
+        r = DocTestRunner.run(self, test, compileflags, out, False)
+        if clear_globs:
+            test.globs.clear()
+        return r
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        raise UnexpectedException(test, example, exc_info)
+
+    def report_failure(self, out, test, example, got):
+        raise DocTestFailure(test, example, got)
+
+######################################################################
+## 6. Test Functions
+######################################################################
+# These should be backwards compatible.
+
+# For backward compatibility, a global instance of a DocTestRunner
+# class, updated by testmod.
+master = None
+
+def testmod(m=None, name=None, globs=None, verbose=None, isprivate=None,
+            report=True, optionflags=0, extraglobs=None,
+            raise_on_error=False, exclude_empty=False):
+    """m=None, name=None, globs=None, verbose=None, isprivate=None,
+       report=True, optionflags=0, extraglobs=None, raise_on_error=False,
+       exclude_empty=False
+
+    Test examples in docstrings in functions and classes reachable
+    from module m (or the current module if m is not supplied), starting
+    with m.__doc__.  Unless isprivate is specified, private names
+    are not skipped.
+
+    Also test examples reachable from dict m.__test__ if it exists and is
+    not None.  m.__test__ maps names to functions, classes and strings;
+    function and class docstrings are tested even if the name is private;
+    strings are tested directly, as if they were docstrings.
+
+    Return (#failures, #tests).
+
+    See doctest.__doc__ for an overview.
+
+    Optional keyword arg "name" gives the name of the module; by default
+    use m.__name__.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use m.__dict__.  A copy of this
+    dict is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.  This is new in 2.4.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  This is new in 2.3.  Possible values (see the
+    docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Deprecated in Python 2.4:
+    Optional keyword arg "isprivate" specifies a function used to
+    determine whether a name is private.  The default function is
+    treat all functions as public.  Optionally, "isprivate" can be
+    set to doctest.is_private to skip over functions marked as private
+    using the underscore naming convention; see its docs for details.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if isprivate is not None:
+        warnings.warn("the isprivate argument is deprecated; "
+                      "examine DocTestFinder.find() lists instead",
+                      DeprecationWarning)
+
+    # If no module was given, then use __main__.
+    if m is None:
+        # DWA - m will still be None if this wasn't invoked from the command
+        # line, in which case the following TypeError is about as good an error
+        # as we should expect
+        m = sys.modules.get('__main__')
+
+    # Check that we were actually given a module.
+    if not inspect.ismodule(m):
+        raise TypeError("testmod: module required; %r" % (m,))
+
+    # If no name was given, then use the module's name.
+    if name is None:
+        name = m.__name__
+
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(_namefilter=isprivate, exclude_empty=exclude_empty)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    for test in finder.find(m, name, globs=globs, extraglobs=extraglobs):
+        runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def testfile(filename, module_relative=True, name=None, package=None,
+             globs=None, verbose=None, report=True, optionflags=0,
+             extraglobs=None, raise_on_error=False, parser=DocTestParser()):
+    """
+    Test examples in the given file.  Return (#failures, #tests).
+
+    Optional keyword arg "module_relative" specifies how filenames
+    should be interpreted:
+
+      - If "module_relative" is True (the default), then "filename"
+         specifies a module-relative path.  By default, this path is
+         relative to the calling module's directory; but if the
+         "package" argument is specified, then it is relative to that
+         package.  To ensure os-independence, "filename" should use
+         "/" characters to separate path segments, and should not
+         be an absolute path (i.e., it may not begin with "/").
+
+      - If "module_relative" is False, then "filename" specifies an
+        os-specific path.  The path may be absolute or relative (to
+        the current working directory).
+
+    Optional keyword arg "name" gives the name of the test; by default
+    use the file's basename.
+
+    Optional keyword argument "package" is a Python package or the
+    name of a Python package whose directory should be used as the
+    base directory for a module relative filename.  If no package is
+    specified, then the calling module's directory is used as the base
+    directory for module relative filenames.  It is an error to
+    specify "package" if "module_relative" is False.
+
+    Optional keyword arg "globs" gives a dict to be used as the globals
+    when executing examples; by default, use {}.  A copy of this dict
+    is actually used for each docstring, so that each docstring's
+    examples start with a clean slate.
+
+    Optional keyword arg "extraglobs" gives a dictionary that should be
+    merged into the globals that are used to execute examples.  By
+    default, no extra globals are used.
+
+    Optional keyword arg "verbose" prints lots of stuff if true, prints
+    only failures if false; by default, it's true iff "-v" is in sys.argv.
+
+    Optional keyword arg "report" prints a summary at the end when true,
+    else prints nothing at the end.  In verbose mode, the summary is
+    detailed, else very brief (in fact, empty if all tests passed).
+
+    Optional keyword arg "optionflags" or's together module constants,
+    and defaults to 0.  Possible values (see the docs for details):
+
+        DONT_ACCEPT_TRUE_FOR_1
+        DONT_ACCEPT_BLANKLINE
+        NORMALIZE_WHITESPACE
+        ELLIPSIS
+        IGNORE_EXCEPTION_DETAIL
+        REPORT_UDIFF
+        REPORT_CDIFF
+        REPORT_NDIFF
+        REPORT_ONLY_FIRST_FAILURE
+
+    Optional keyword arg "raise_on_error" raises an exception on the
+    first unexpected exception or failure. This allows failures to be
+    post-mortem debugged.
+
+    Optional keyword arg "parser" specifies a DocTestParser (or
+    subclass) that should be used to extract tests from the files.
+
+    Advanced tomfoolery:  testmod runs methods of a local instance of
+    class doctest.Tester, then merges the results into (or creates)
+    global Tester instance doctest.master.  Methods of doctest.master
+    can be called directly too, if you want to do something unusual.
+    Passing report=0 to testmod is especially useful then, to delay
+    displaying a summary.  Invoke doctest.master.summarize(verbose)
+    when you're done fiddling.
+    """
+    global master
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path
+    if module_relative:
+        package = _normalize_module(package)
+        filename = _module_relative_path(package, filename)
+
+    # If no name was given, then use the file's name.
+    if name is None:
+        name = os.path.basename(filename)
+
+    # Assemble the globals.
+    if globs is None:
+        globs = {}
+    else:
+        globs = globs.copy()
+    if extraglobs is not None:
+        globs.update(extraglobs)
+
+    if raise_on_error:
+        runner = DebugRunner(verbose=verbose, optionflags=optionflags)
+    else:
+        runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+
+    # Read the file, convert it to a test, and run it.
+    s = open(filename).read()
+    test = parser.get_doctest(s, globs, name, filename, 0)
+    runner.run(test)
+
+    if report:
+        runner.summarize()
+
+    if master is None:
+        master = runner
+    else:
+        master.merge(runner)
+
+    return runner.failures, runner.tries
+
+def run_docstring_examples(f, globs, verbose=False, name="NoName",
+                           compileflags=None, optionflags=0):
+    """
+    Test examples in the given object's docstring (`f`), using `globs`
+    as globals.  Optional argument `name` is used in failure messages.
+    If the optional argument `verbose` is true, then generate output
+    even if there are no failures.
+
+    `compileflags` gives the set of flags that should be used by the
+    Python compiler when running the examples.  If not specified, then
+    it will default to the set of future-import flags that apply to
+    `globs`.
+
+    Optional keyword arg `optionflags` specifies options for the
+    testing and output.  See the documentation for `testmod` for more
+    information.
+    """
+    # Find, parse, and run all tests in the given module.
+    finder = DocTestFinder(verbose=verbose, recurse=False)
+    runner = DocTestRunner(verbose=verbose, optionflags=optionflags)
+    for test in finder.find(f, name, globs=globs):
+        runner.run(test, compileflags=compileflags)
+
+######################################################################
+## 7. Tester
+######################################################################
+# This is provided only for backwards compatibility.  It's not
+# actually used in any way.
+
+class Tester:
+    def __init__(self, mod=None, globs=None, verbose=None,
+                 isprivate=None, optionflags=0):
+
+        warnings.warn("class Tester is deprecated; "
+                      "use class doctest.DocTestRunner instead",
+                      DeprecationWarning, stacklevel=2)
+        if mod is None and globs is None:
+            raise TypeError("Tester.__init__: must specify mod or globs")
+        if mod is not None and not inspect.ismodule(mod):
+            raise TypeError("Tester.__init__: mod must be a module; %r" %
+                            (mod,))
+        if globs is None:
+            globs = mod.__dict__
+        self.globs = globs
+
+        self.verbose = verbose
+        self.isprivate = isprivate
+        self.optionflags = optionflags
+        self.testfinder = DocTestFinder(_namefilter=isprivate)
+        self.testrunner = DocTestRunner(verbose=verbose,
+                                        optionflags=optionflags)
+
+    def runstring(self, s, name):
+        test = DocTestParser().get_doctest(s, self.globs, name, None, None)
+        if self.verbose:
+            print "Running string", name
+        (f,t) = self.testrunner.run(test)
+        if self.verbose:
+            print f, "of", t, "examples failed in string", name
+        return (f,t)
+
+    def rundoc(self, object, name=None, module=None):
+        f = t = 0
+        tests = self.testfinder.find(object, name, module=module,
+                                     globs=self.globs)
+        for test in tests:
+            (f2, t2) = self.testrunner.run(test)
+            (f,t) = (f+f2, t+t2)
+        return (f,t)
+
+    def rundict(self, d, name, module=None):
+        import new
+        m = new.module(name)
+        m.__dict__.update(d)
+        if module is None:
+            module = False
+        return self.rundoc(m, name, module)
+
+    def run__test__(self, d, name):
+        import new
+        m = new.module(name)
+        m.__test__ = d
+        return self.rundoc(m, name)
+
+    def summarize(self, verbose=None):
+        return self.testrunner.summarize(verbose)
+
+    def merge(self, other):
+        self.testrunner.merge(other.testrunner)
+
+######################################################################
+## 8. Unittest Support
+######################################################################
+
+_unittest_reportflags = 0
+
+def set_unittest_reportflags(flags):
+    """Sets the unittest option flags.
+
+    The old flag is returned so that a runner could restore the old
+    value if it wished to:
+
+      >>> old = _unittest_reportflags
+      >>> set_unittest_reportflags(REPORT_NDIFF |
+      ...                          REPORT_ONLY_FIRST_FAILURE) == old
+      True
+
+      >>> import doctest
+      >>> doctest._unittest_reportflags == (REPORT_NDIFF |
+      ...                                   REPORT_ONLY_FIRST_FAILURE)
+      True
+
+    Only reporting flags can be set:
+
+      >>> set_unittest_reportflags(ELLIPSIS)
+      Traceback (most recent call last):
+      ...
+      ValueError: ('Only reporting flags allowed', 8)
+
+      >>> set_unittest_reportflags(old) == (REPORT_NDIFF |
+      ...                                   REPORT_ONLY_FIRST_FAILURE)
+      True
+    """
+    global _unittest_reportflags
+
+    if (flags & REPORTING_FLAGS) != flags:
+        raise ValueError("Only reporting flags allowed", flags)
+    old = _unittest_reportflags
+    _unittest_reportflags = flags
+    return old
+
+
+class DocTestCase(unittest.TestCase):
+
+    def __init__(self, test, optionflags=0, setUp=None, tearDown=None,
+                 checker=None):
+
+        unittest.TestCase.__init__(self)
+        self._dt_optionflags = optionflags
+        self._dt_checker = checker
+        self._dt_test = test
+        self._dt_setUp = setUp
+        self._dt_tearDown = tearDown
+
+    def setUp(self):
+        test = self._dt_test
+
+        if self._dt_setUp is not None:
+            self._dt_setUp(test)
+
+    def tearDown(self):
+        test = self._dt_test
+
+        if self._dt_tearDown is not None:
+            self._dt_tearDown(test)
+
+        test.globs.clear()
+
+    def runTest(self):
+        test = self._dt_test
+        old = sys.stdout
+        new = StringIO()
+        optionflags = self._dt_optionflags
+
+        if not (optionflags & REPORTING_FLAGS):
+            # The option flags don't include any reporting flags,
+            # so add the default reporting flags
+            optionflags |= _unittest_reportflags
+
+        runner = DocTestRunner(optionflags=optionflags,
+                               checker=self._dt_checker, verbose=False)
+
+        try:
+            runner.DIVIDER = "-"*70
+            failures, tries = runner.run(
+                test, out=new.write, clear_globs=False)
+        finally:
+            sys.stdout = old
+
+        if failures:
+            raise self.failureException(self.format_failure(new.getvalue()))
+
+    def format_failure(self, err):
+        test = self._dt_test
+        if test.lineno is None:
+            lineno = 'unknown line number'
+        else:
+            lineno = '%s' % test.lineno
+        lname = '.'.join(test.name.split('.')[-1:])
+        return ('Failed doctest test for %s\n'
+                '  File "%s", line %s, in %s\n\n%s'
+                % (test.name, test.filename, lineno, lname, err)
+                )
+
+    def debug(self):
+        r"""Run the test case without results and without catching exceptions
+
+           The unit test framework includes a debug method on test cases
+           and test suites to support post-mortem debugging.  The test code
+           is run in such a way that errors are not caught.  This way a
+           caller can catch the errors and initiate post-mortem debugging.
+
+           The DocTestCase provides a debug method that raises
+           UnexpectedException errors if there is an unexepcted
+           exception:
+
+             >>> test = DocTestParser().get_doctest('>>> raise KeyError\n42',
+             ...                {}, 'foo', 'foo.py', 0)
+             >>> case = DocTestCase(test)
+             >>> try:
+             ...     case.debug()
+             ... except UnexpectedException, failure:
+             ...     pass
+
+           The UnexpectedException contains the test, the example, and
+           the original exception:
+
+             >>> failure.test is test
+             True
+
+             >>> failure.example.want
+             '42\n'
+
+             >>> exc_info = failure.exc_info
+             >>> raise exc_info[0], exc_info[1], exc_info[2]
+             Traceback (most recent call last):
+             ...
+             KeyError
+
+           If the output doesn't match, then a DocTestFailure is raised:
+
+             >>> test = DocTestParser().get_doctest('''
+             ...      >>> x = 1
+             ...      >>> x
+             ...      2
+             ...      ''', {}, 'foo', 'foo.py', 0)
+             >>> case = DocTestCase(test)
+
+             >>> try:
+             ...    case.debug()
+             ... except DocTestFailure, failure:
+             ...    pass
+
+           DocTestFailure objects provide access to the test:
+
+             >>> failure.test is test
+             True
+
+           As well as to the example:
+
+             >>> failure.example.want
+             '2\n'
+
+           and the actual output:
+
+             >>> failure.got
+             '1\n'
+
+           """
+
+        self.setUp()
+        runner = DebugRunner(optionflags=self._dt_optionflags,
+                             checker=self._dt_checker, verbose=False)
+        runner.run(self._dt_test)
+        self.tearDown()
+
+    def id(self):
+        return self._dt_test.name
+
+    def __repr__(self):
+        name = self._dt_test.name.split('.')
+        return "%s (%s)" % (name[-1], '.'.join(name[:-1]))
+
+    __str__ = __repr__
+
+    def shortDescription(self):
+        return "Doctest: " + self._dt_test.name
+
+def DocTestSuite(module=None, globs=None, extraglobs=None, test_finder=None,
+                 **options):
+    """
+    Convert doctest tests for a module to a unittest test suite.
+
+    This converts each documentation string in a module that
+    contains doctest tests to a unittest test case.  If any of the
+    tests in a doc string fail, then the test case fails.  An exception
+    is raised showing the name of the file containing the test and a
+    (sometimes approximate) line number.
+
+    The `module` argument provides the module to be tested.  The argument
+    can be either a module or a module name.
+
+    If no argument is given, the calling module is used.
+
+    A number of options may be provided as keyword arguments:
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+       A set of doctest option flags expressed as an integer.
+    """
+
+    if test_finder is None:
+        test_finder = DocTestFinder()
+
+    module = _normalize_module(module)
+    tests = test_finder.find(module, globs=globs, extraglobs=extraglobs)
+    if globs is None:
+        globs = module.__dict__
+    if not tests:
+        # Why do we want to do this? Because it reveals a bug that might
+        # otherwise be hidden.
+        raise ValueError(module, "has no tests")
+
+    tests.sort()
+    suite = unittest.TestSuite()
+    for test in tests:
+        if len(test.examples) == 0:
+            continue
+        if not test.filename:
+            filename = module.__file__
+            if filename[-4:] in (".pyc", ".pyo"):
+                filename = filename[:-1]
+            test.filename = filename
+        suite.addTest(DocTestCase(test, **options))
+
+    return suite
+
+class DocFileCase(DocTestCase):
+
+    def id(self):
+        return '_'.join(self._dt_test.name.split('.'))
+
+    def __repr__(self):
+        return self._dt_test.filename
+    __str__ = __repr__
+
+    def format_failure(self, err):
+        return ('Failed doctest test for %s\n  File "%s", line 0\n\n%s'
+                % (self._dt_test.name, self._dt_test.filename, err)
+                )
+
+def DocFileTest(path, module_relative=True, package=None,
+                globs=None, parser=DocTestParser(), **options):
+    if globs is None:
+        globs = {}
+
+    if package and not module_relative:
+        raise ValueError("Package may only be specified for module-"
+                         "relative paths.")
+
+    # Relativize the path.
+    if module_relative:
+        package = _normalize_module(package)
+        path = _module_relative_path(package, path)
+
+    # Find the file and read it.
+    name = os.path.basename(path)
+    doc = open(path).read()
+
+    # Convert it to a test, and wrap it in a DocFileCase.
+    test = parser.get_doctest(doc, globs, name, path, 0)
+    return DocFileCase(test, **options)
+
+def DocFileSuite(*paths, **kw):
+    """A unittest suite for one or more doctest files.
+
+    The path to each doctest file is given as a string; the
+    interpretation of that string depends on the keyword argument
+    "module_relative".
+
+    A number of options may be provided as keyword arguments:
+
+    module_relative
+      If "module_relative" is True, then the given file paths are
+      interpreted as os-independent module-relative paths.  By
+      default, these paths are relative to the calling module's
+      directory; but if the "package" argument is specified, then
+      they are relative to that package.  To ensure os-independence,
+      "filename" should use "/" characters to separate path
+      segments, and may not be an absolute path (i.e., it may not
+      begin with "/").
+
+      If "module_relative" is False, then the given file paths are
+      interpreted as os-specific paths.  These paths may be absolute
+      or relative (to the current working directory).
+
+    package
+      A Python package or the name of a Python package whose directory
+      should be used as the base directory for module relative paths.
+      If "package" is not specified, then the calling module's
+      directory is used as the base directory for module relative
+      filenames.  It is an error to specify "package" if
+      "module_relative" is False.
+
+    setUp
+      A set-up function.  This is called before running the
+      tests in each file. The setUp function will be passed a DocTest
+      object.  The setUp function can access the test globals as the
+      globs attribute of the test passed.
+
+    tearDown
+      A tear-down function.  This is called after running the
+      tests in each file.  The tearDown function will be passed a DocTest
+      object.  The tearDown function can access the test globals as the
+      globs attribute of the test passed.
+
+    globs
+      A dictionary containing initial global variables for the tests.
+
+    optionflags
+      A set of doctest option flags expressed as an integer.
+
+    parser
+      A DocTestParser (or subclass) that should be used to extract
+      tests from the files.
+    """
+    suite = unittest.TestSuite()
+
+    # We do this here so that _normalize_module is called at the right
+    # level.  If it were called in DocFileTest, then this function
+    # would be the caller and we might guess the package incorrectly.
+    if kw.get('module_relative', True):
+        kw['package'] = _normalize_module(kw.get('package'))
+
+    for path in paths:
+        suite.addTest(DocFileTest(path, **kw))
+
+    return suite
+
+######################################################################
+## 9. Debugging Support
+######################################################################
+
+def script_from_examples(s):
+    r"""Extract script from text with examples.
+
+       Converts text with examples to a Python script.  Example input is
+       converted to regular code.  Example output and all other words
+       are converted to comments:
+
+       >>> text = '''
+       ...       Here are examples of simple math.
+       ...
+       ...           Python has super accurate integer addition
+       ...
+       ...           >>> 2 + 2
+       ...           5
+       ...
+       ...           And very friendly error messages:
+       ...
+       ...           >>> 1/0
+       ...           To Infinity
+       ...           And
+       ...           Beyond
+       ...
+       ...           You can use logic if you want:
+       ...
+       ...           >>> if 0:
+       ...           ...    blah
+       ...           ...    blah
+       ...           ...
+       ...
+       ...           Ho hum
+       ...           '''
+
+       >>> print script_from_examples(text)
+       # Here are examples of simple math.
+       #
+       #     Python has super accurate integer addition
+       #
+       2 + 2
+       # Expected:
+       ## 5
+       #
+       #     And very friendly error messages:
+       #
+       1/0
+       # Expected:
+       ## To Infinity
+       ## And
+       ## Beyond
+       #
+       #     You can use logic if you want:
+       #
+       if 0:
+          blah
+          blah
+       #
+       #     Ho hum
+       """
+    output = []
+    for piece in DocTestParser().parse(s):
+        if isinstance(piece, Example):
+            # Add the example's source code (strip trailing NL)
+            output.append(piece.source[:-1])
+            # Add the expected output:
+            want = piece.want
+            if want:
+                output.append('# Expected:')
+                output += ['## '+l for l in want.split('\n')[:-1]]
+        else:
+            # Add non-example text.
+            output += [_comment_line(l)
+                       for l in piece.split('\n')[:-1]]
+
+    # Trim junk on both ends.
+    while output and output[-1] == '#':
+        output.pop()
+    while output and output[0] == '#':
+        output.pop(0)
+    # Combine the output, and return it.
+    return '\n'.join(output)
+
+def testsource(module, name):
+    """Extract the test sources from a doctest docstring as a script.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the doc string with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    tests = DocTestFinder().find(module)
+    test = [t for t in tests if t.name == name]
+    if not test:
+        raise ValueError(name, "not found in tests")
+    test = test[0]
+    testsrc = script_from_examples(test.docstring)
+    return testsrc
+
+def debug_src(src, pm=False, globs=None):
+    """Debug a single doctest docstring, in argument `src`'"""
+    testsrc = script_from_examples(src)
+    debug_script(testsrc, pm, globs)
+
+def debug_script(src, pm=False, globs=None):
+    "Debug a test script.  `src` is the script, as a string."
+    import pdb
+
+    # Note that tempfile.NameTemporaryFile() cannot be used.  As the
+    # docs say, a file so created cannot be opened by name a second time
+    # on modern Windows boxes, and execfile() needs to open it.
+    srcfilename = tempfile.mktemp(".py", "doctestdebug")
+    f = open(srcfilename, 'w')
+    f.write(src)
+    f.close()
+
+    try:
+        if globs:
+            globs = globs.copy()
+        else:
+            globs = {}
+
+        if pm:
+            try:
+                execfile(srcfilename, globs, globs)
+            except:
+                print sys.exc_info()[1]
+                pdb.post_mortem(sys.exc_info()[2])
+        else:
+            # Note that %r is vital here.  '%s' instead can, e.g., cause
+            # backslashes to get treated as metacharacters on Windows.
+            pdb.run("execfile(%r)" % srcfilename, globs, globs)
+
+    finally:
+        os.remove(srcfilename)
+
+def debug(module, name, pm=False):
+    """Debug a single doctest docstring.
+
+    Provide the module (or dotted name of the module) containing the
+    test to be debugged and the name (within the module) of the object
+    with the docstring with tests to be debugged.
+    """
+    module = _normalize_module(module)
+    testsrc = testsource(module, name)
+    debug_script(testsrc, pm, module.__dict__)
+
+######################################################################
+## 10. Example Usage
+######################################################################
+class _TestClass:
+    """
+    A pointless class, for sanity-checking of docstring testing.
+
+    Methods:
+        square()
+        get()
+
+    >>> _TestClass(13).get() + _TestClass(-12).get()
+    1
+    >>> hex(_TestClass(13).square().get())
+    '0xa9'
+    """
+
+    def __init__(self, val):
+        """val -> _TestClass object with associated value val.
+
+        >>> t = _TestClass(123)
+        >>> print t.get()
+        123
+        """
+
+        self.val = val
+
+    def square(self):
+        """square() -> square TestClass's associated value
+
+        >>> _TestClass(13).square().get()
+        169
+        """
+
+        self.val = self.val ** 2
+        return self
+
+    def get(self):
+        """get() -> return TestClass's associated value.
+
+        >>> x = _TestClass(-42)
+        >>> print x.get()
+        -42
+        """
+
+        return self.val
+
+__test__ = {"_TestClass": _TestClass,
+            "string": r"""
+                      Example of a string object, searched as-is.
+                      >>> x = 1; y = 2
+                      >>> x + y, x * y
+                      (3, 2)
+                      """,
+
+            "bool-int equivalence": r"""
+                                    In 2.2, boolean expressions displayed
+                                    0 or 1.  By default, we still accept
+                                    them.  This can be disabled by passing
+                                    DONT_ACCEPT_TRUE_FOR_1 to the new
+                                    optionflags argument.
+                                    >>> 4 == 4
+                                    1
+                                    >>> 4 == 4
+                                    True
+                                    >>> 4 > 4
+                                    0
+                                    >>> 4 > 4
+                                    False
+                                    """,
+
+            "blank lines": r"""
+                Blank lines can be marked with <BLANKLINE>:
+                    >>> print 'foo\n\nbar\n'
+                    foo
+                    <BLANKLINE>
+                    bar
+                    <BLANKLINE>
+            """,
+
+            "ellipsis": r"""
+                If the ellipsis flag is used, then '...' can be used to
+                elide substrings in the desired output:
+                    >>> print range(1000) #doctest: +ELLIPSIS
+                    [0, 1, 2, ..., 999]
+            """,
+
+            "whitespace normalization": r"""
+                If the whitespace normalization flag is used, then
+                differences in whitespace are ignored.
+                    >>> print range(30) #doctest: +NORMALIZE_WHITESPACE
+                    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
+                     15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
+                     27, 28, 29]
+            """,
+           }
+
+def _test():
+    r = unittest.TextTestRunner()
+    r.run(DocTestSuite())
+
+if __name__ == "__main__":
+    _test()

Added: vendor/django/current/tests/modeltests/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/basic/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/basic/models.py
===================================================================
--- vendor/django/current/tests/modeltests/basic/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/basic/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,355 @@
+"""
+1. Bare-bones model
+
+This is a basic model with only two non-primary-key fields.
+"""
+
+from django.db import models
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100, default='Default headline')
+    pub_date = models.DateTimeField()
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+
+# No articles are in the system yet.
+>>> Article.objects.all()
+[]
+
+# Create an Article.
+>>> from datetime import datetime
+>>> a = Article(id=None, headline='Area man programs in Python', pub_date=datetime(2005, 7, 28))
+
+# Save it into the database. You have to call save() explicitly.
+>>> a.save()
+
+# Now it has an ID. Note it's a long integer, as designated by the trailing "L".
+>>> a.id
+1L
+
+# Access database columns via Python attributes.
+>>> a.headline
+'Area man programs in Python'
+>>> a.pub_date
+datetime.datetime(2005, 7, 28, 0, 0)
+
+# Change values by changing the attributes, then calling save().
+>>> a.headline = 'Area woman programs in Python'
+>>> a.save()
+
+# Article.objects.all() returns all the articles in the database.
+>>> Article.objects.all()
+[<Article: Area woman programs in Python>]
+
+# Django provides a rich database lookup API.
+>>> Article.objects.get(id__exact=1)
+<Article: Area woman programs in Python>
+>>> Article.objects.get(headline__startswith='Area woman')
+<Article: Area woman programs in Python>
+>>> Article.objects.get(pub_date__year=2005)
+<Article: Area woman programs in Python>
+>>> Article.objects.get(pub_date__year=2005, pub_date__month=7)
+<Article: Area woman programs in Python>
+>>> Article.objects.get(pub_date__year=2005, pub_date__month=7, pub_date__day=28)
+<Article: Area woman programs in Python>
+
+# The "__exact" lookup type can be omitted, as a shortcut.
+>>> Article.objects.get(id=1)
+<Article: Area woman programs in Python>
+>>> Article.objects.get(headline='Area woman programs in Python')
+<Article: Area woman programs in Python>
+
+>>> Article.objects.filter(pub_date__year=2005)
+[<Article: Area woman programs in Python>]
+>>> Article.objects.filter(pub_date__year=2004)
+[]
+>>> Article.objects.filter(pub_date__year=2005, pub_date__month=7)
+[<Article: Area woman programs in Python>]
+
+# Django raises an Article.DoesNotExist exception for get() if the parameters
+# don't match any object.
+>>> Article.objects.get(id__exact=2)
+Traceback (most recent call last):
+    ...
+DoesNotExist: Article matching query does not exist.
+
+>>> Article.objects.get(pub_date__year=2005, pub_date__month=8)
+Traceback (most recent call last):
+    ...
+DoesNotExist: Article matching query does not exist.
+
+# Lookup by a primary key is the most common case, so Django provides a
+# shortcut for primary-key exact lookups.
+# The following is identical to articles.get(id=1).
+>>> Article.objects.get(pk=1)
+<Article: Area woman programs in Python>
+
+# Model instances of the same type and same ID are considered equal.
+>>> a = Article.objects.get(pk=1)
+>>> b = Article.objects.get(pk=1)
+>>> a == b
+True
+
+# You can initialize a model instance using positional arguments, which should
+# match the field order as defined in the model.
+>>> a2 = Article(None, 'Second article', datetime(2005, 7, 29))
+>>> a2.save()
+>>> a2.id
+2L
+>>> a2.headline
+'Second article'
+>>> a2.pub_date
+datetime.datetime(2005, 7, 29, 0, 0)
+
+# ...or, you can use keyword arguments.
+>>> a3 = Article(id=None, headline='Third article', pub_date=datetime(2005, 7, 30))
+>>> a3.save()
+>>> a3.id
+3L
+>>> a3.headline
+'Third article'
+>>> a3.pub_date
+datetime.datetime(2005, 7, 30, 0, 0)
+
+# You can also mix and match position and keyword arguments, but be sure not to
+# duplicate field information.
+>>> a4 = Article(None, 'Fourth article', pub_date=datetime(2005, 7, 31))
+>>> a4.save()
+>>> a4.headline
+'Fourth article'
+
+# Don't use invalid keyword arguments.
+>>> a5 = Article(id=None, headline='Invalid', pub_date=datetime(2005, 7, 31), foo='bar')
+Traceback (most recent call last):
+    ...
+TypeError: 'foo' is an invalid keyword argument for this function
+
+# You can leave off the value for an AutoField when creating an object, because
+# it'll get filled in automatically when you save().
+>>> a5 = Article(headline='Article 6', pub_date=datetime(2005, 7, 31))
+>>> a5.save()
+>>> a5.id
+5L
+>>> a5.headline
+'Article 6'
+
+# If you leave off a field with "default" set, Django will use the default.
+>>> a6 = Article(pub_date=datetime(2005, 7, 31))
+>>> a6.save()
+>>> a6.headline
+'Default headline'
+
+# For DateTimeFields, Django saves as much precision (in seconds) as you
+# give it.
+>>> a7 = Article(headline='Article 7', pub_date=datetime(2005, 7, 31, 12, 30))
+>>> a7.save()
+>>> Article.objects.get(id__exact=7).pub_date
+datetime.datetime(2005, 7, 31, 12, 30)
+
+>>> a8 = Article(headline='Article 8', pub_date=datetime(2005, 7, 31, 12, 30, 45))
+>>> a8.save()
+>>> Article.objects.get(id__exact=8).pub_date
+datetime.datetime(2005, 7, 31, 12, 30, 45)
+>>> a8.id
+8L
+
+# Saving an object again doesn't create a new object -- it just saves the old one.
+>>> a8.save()
+>>> a8.id
+8L
+>>> a8.headline = 'Updated article 8'
+>>> a8.save()
+>>> a8.id
+8L
+
+>>> a7 == a8
+False
+>>> a8 == Article.objects.get(id__exact=8)
+True
+>>> a7 != a8
+True
+>>> Article.objects.get(id__exact=8) != Article.objects.get(id__exact=7)
+True
+>>> Article.objects.get(id__exact=8) == Article.objects.get(id__exact=7)
+False
+
+# dates() returns a list of available dates of the given scope for the given field.
+>>> Article.objects.dates('pub_date', 'year')
+[datetime.datetime(2005, 1, 1, 0, 0)]
+>>> Article.objects.dates('pub_date', 'month')
+[datetime.datetime(2005, 7, 1, 0, 0)]
+>>> Article.objects.dates('pub_date', 'day')
+[datetime.datetime(2005, 7, 28, 0, 0), datetime.datetime(2005, 7, 29, 0, 0), datetime.datetime(2005, 7, 30, 0, 0), datetime.datetime(2005, 7, 31, 0, 0)]
+>>> Article.objects.dates('pub_date', 'day', order='ASC')
+[datetime.datetime(2005, 7, 28, 0, 0), datetime.datetime(2005, 7, 29, 0, 0), datetime.datetime(2005, 7, 30, 0, 0), datetime.datetime(2005, 7, 31, 0, 0)]
+>>> Article.objects.dates('pub_date', 'day', order='DESC')
+[datetime.datetime(2005, 7, 31, 0, 0), datetime.datetime(2005, 7, 30, 0, 0), datetime.datetime(2005, 7, 29, 0, 0), datetime.datetime(2005, 7, 28, 0, 0)]
+
+# dates() requires valid arguments.
+
+>>> Article.objects.dates()
+Traceback (most recent call last):
+   ...
+TypeError: dates() takes at least 3 arguments (1 given)
+
+>>> Article.objects.dates('invalid_field', 'year')
+Traceback (most recent call last):
+   ...
+FieldDoesNotExist: Article has no field named 'invalid_field'
+
+>>> Article.objects.dates('pub_date', 'bad_kind')
+Traceback (most recent call last):
+   ...
+AssertionError: 'kind' must be one of 'year', 'month' or 'day'.
+
+>>> Article.objects.dates('pub_date', 'year', order='bad order')
+Traceback (most recent call last):
+   ...
+AssertionError: 'order' must be either 'ASC' or 'DESC'.
+
+# Use iterator() with dates() to return a generator that lazily requests each
+# result one at a time, to save memory.
+>>> for a in Article.objects.dates('pub_date', 'day', order='DESC').iterator():
+...     print repr(a)
+datetime.datetime(2005, 7, 31, 0, 0)
+datetime.datetime(2005, 7, 30, 0, 0)
+datetime.datetime(2005, 7, 29, 0, 0)
+datetime.datetime(2005, 7, 28, 0, 0)
+
+# You can combine queries with & and |.
+>>> s1 = Article.objects.filter(id__exact=1)
+>>> s2 = Article.objects.filter(id__exact=2)
+>>> s1 | s2
+[<Article: Area woman programs in Python>, <Article: Second article>]
+>>> s1 & s2
+[]
+
+# You can get the number of objects like this:
+>>> len(Article.objects.filter(id__exact=1))
+1
+
+# You can get items using index and slice notation.
+>>> Article.objects.all()[0]
+<Article: Area woman programs in Python>
+>>> Article.objects.all()[1:3]
+[<Article: Second article>, <Article: Third article>]
+>>> s3 = Article.objects.filter(id__exact=3)
+>>> (s1 | s2 | s3)[::2]
+[<Article: Area woman programs in Python>, <Article: Third article>]
+
+# Slices (without step) are lazy:
+>>> Article.objects.all()[0:5].filter()
+[<Article: Area woman programs in Python>, <Article: Second article>, <Article: Third article>, <Article: Fourth article>, <Article: Article 6>]
+
+# Slicing again works:
+>>> Article.objects.all()[0:5][0:2]
+[<Article: Area woman programs in Python>, <Article: Second article>]
+>>> Article.objects.all()[0:5][:2]
+[<Article: Area woman programs in Python>, <Article: Second article>]
+>>> Article.objects.all()[0:5][4:]
+[<Article: Article 6>]
+>>> Article.objects.all()[0:5][5:]
+[]
+
+# Some more tests!
+>>> Article.objects.all()[2:][0:2]
+[<Article: Third article>, <Article: Fourth article>]
+>>> Article.objects.all()[2:][:2]
+[<Article: Third article>, <Article: Fourth article>]
+>>> Article.objects.all()[2:][2:3]
+[<Article: Article 6>]
+
+# Note that you can't use 'offset' without 'limit' (on some dbs), so this doesn't work:
+>>> Article.objects.all()[2:]
+Traceback (most recent call last):
+    ...
+AssertionError: 'offset' is not allowed without 'limit'
+
+# Also, once you have sliced you can't filter, re-order or combine
+>>> Article.objects.all()[0:5].filter(id=1)
+Traceback (most recent call last):
+    ...
+AssertionError: Cannot filter a query once a slice has been taken.
+
+>>> Article.objects.all()[0:5].order_by('id')
+Traceback (most recent call last):
+    ...
+AssertionError: Cannot reorder a query once a slice has been taken.
+
+>>> Article.objects.all()[0:1] & Article.objects.all()[4:5]
+Traceback (most recent call last):
+    ...
+AssertionError: Cannot combine queries once a slice has been taken.
+
+# Negative slices are not supported, due to database constraints.
+# (hint: inverting your ordering might do what you need).
+>>> Article.objects.all()[-1]
+Traceback (most recent call last):
+    ...
+AssertionError: Negative indexing is not supported.
+>>> Article.objects.all()[0:-5]
+Traceback (most recent call last):
+    ...
+AssertionError: Negative indexing is not supported.
+
+# An Article instance doesn't have access to the "objects" attribute.
+# That's only available on the class.
+>>> a7.objects.all()
+Traceback (most recent call last):
+    ...
+AttributeError: Manager isn't accessible via Article instances
+
+>>> a7.objects
+Traceback (most recent call last):
+    ...
+AttributeError: Manager isn't accessible via Article instances
+
+# Bulk delete test: How many objects before and after the delete?
+>>> Article.objects.all()
+[<Article: Area woman programs in Python>, <Article: Second article>, <Article: Third article>, <Article: Fourth article>, <Article: Article 6>, <Article: Default headline>, <Article: Article 7>, <Article: Updated article 8>]
+>>> Article.objects.filter(id__lte=4).delete()
+>>> Article.objects.all()
+[<Article: Article 6>, <Article: Default headline>, <Article: Article 7>, <Article: Updated article 8>]
+
+"""
+
+from django.conf import settings
+
+building_docs = getattr(settings, 'BUILDING_DOCS', False)
+
+if building_docs or settings.DATABASE_ENGINE == 'postgresql':
+    API_TESTS += """
+# In PostgreSQL, microsecond-level precision is available.
+>>> a9 = Article(headline='Article 9', pub_date=datetime(2005, 7, 31, 12, 30, 45, 180))
+>>> a9.save()
+>>> Article.objects.get(id__exact=9).pub_date
+datetime.datetime(2005, 7, 31, 12, 30, 45, 180)
+"""
+
+if building_docs or settings.DATABASE_ENGINE == 'mysql':
+    API_TESTS += """
+# In MySQL, microsecond-level precision isn't available. You'll lose
+# microsecond-level precision once the data is saved.
+>>> a9 = Article(headline='Article 9', pub_date=datetime(2005, 7, 31, 12, 30, 45, 180))
+>>> a9.save()
+>>> Article.objects.get(id__exact=9).pub_date
+datetime.datetime(2005, 7, 31, 12, 30, 45)
+"""
+
+API_TESTS += """
+
+# You can manually specify the primary key when creating a new object.
+>>> a101 = Article(id=101, headline='Article 101', pub_date=datetime(2005, 7, 31, 12, 30, 45))
+>>> a101.save()
+>>> a101 = Article.objects.get(pk=101)
+>>> a101.headline
+'Article 101'
+
+# You can create saved objects in a single step
+>>> a10 = Article.objects.create(headline="Article 10", pub_date=datetime(2005, 7, 31, 12, 30, 45))
+>>> Article.objects.get(headline="Article 10")
+<Article: Article 10>
+"""

Added: vendor/django/current/tests/modeltests/choices/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/choices/models.py
===================================================================
--- vendor/django/current/tests/modeltests/choices/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/choices/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,39 @@
+"""
+21. Specifying 'choices' for a field
+
+Most fields take a ``choices`` parameter, which should be a tuple of tuples
+specifying which are the valid values for that field.
+
+For each field that has ``choices``, a model instance gets a
+``get_fieldname_display()`` method, where ``fieldname`` is the name of the
+field. This method returns the "human-readable" value of the field.
+"""
+
+from django.db import models
+
+GENDER_CHOICES = (
+    ('M', 'Male'),
+    ('F', 'Female'),
+)
+
+class Person(models.Model):
+    name = models.CharField(maxlength=20)
+    gender = models.CharField(maxlength=1, choices=GENDER_CHOICES)
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+>>> a = Person(name='Adrian', gender='M')
+>>> a.save()
+>>> s = Person(name='Sara', gender='F')
+>>> s.save()
+>>> a.gender
+'M'
+>>> s.gender
+'F'
+>>> a.get_gender_display()
+'Male'
+>>> s.get_gender_display()
+'Female'
+"""

Added: vendor/django/current/tests/modeltests/custom_columns/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/custom_columns/models.py
===================================================================
--- vendor/django/current/tests/modeltests/custom_columns/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/custom_columns/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,53 @@
+"""
+17. Custom column names
+
+If your database column name is different than your model attribute, use the
+``db_column`` parameter. Note that you'll use the field's name, not its column
+name, in API usage.
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    first_name = models.CharField(maxlength=30, db_column='firstname')
+    last_name = models.CharField(maxlength=30, db_column='last')
+
+    def __str__(self):
+        return '%s %s' % (self.first_name, self.last_name)
+
+API_TESTS = """
+# Create a Person.
+>>> p = Person(first_name='John', last_name='Smith')
+>>> p.save()
+
+>>> p.id
+1
+
+>>> Person.objects.all()
+[<Person: John Smith>]
+
+>>> Person.objects.filter(first_name__exact='John')
+[<Person: John Smith>]
+
+>>> Person.objects.get(first_name__exact='John')
+<Person: John Smith>
+
+>>> Person.objects.filter(firstname__exact='John')
+Traceback (most recent call last):
+    ...
+TypeError: Cannot resolve keyword 'firstname' into field
+
+>>> p = Person.objects.get(last_name__exact='Smith')
+>>> p.first_name
+'John'
+>>> p.last_name
+'Smith'
+>>> p.firstname
+Traceback (most recent call last):
+    ...
+AttributeError: 'Person' object has no attribute 'firstname'
+>>> p.last
+Traceback (most recent call last):
+    ...
+AttributeError: 'Person' object has no attribute 'last'
+"""

Added: vendor/django/current/tests/modeltests/custom_managers/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/custom_managers/models.py
===================================================================
--- vendor/django/current/tests/modeltests/custom_managers/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/custom_managers/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,107 @@
+"""
+23. Giving models a custom manager
+
+You can use a custom ``Manager`` in a particular model by extending the base
+``Manager`` class and instantiating your custom ``Manager`` in your model.
+
+There are two reasons you might want to customize a ``Manager``: to add extra
+``Manager`` methods, and/or to modify the initial ``QuerySet`` the ``Manager``
+returns.
+"""
+
+from django.db import models
+
+# An example of a custom manager called "objects".
+
+class PersonManager(models.Manager):
+    def get_fun_people(self):
+        return self.filter(fun=True)
+
+class Person(models.Model):
+    first_name = models.CharField(maxlength=30)
+    last_name = models.CharField(maxlength=30)
+    fun = models.BooleanField()
+    objects = PersonManager()
+
+    def __str__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+# An example of a custom manager that sets get_query_set().
+
+class PublishedBookManager(models.Manager):
+    def get_query_set(self):
+        return super(PublishedBookManager, self).get_query_set().filter(is_published=True)
+
+class Book(models.Model):
+    title = models.CharField(maxlength=50)
+    author = models.CharField(maxlength=30)
+    is_published = models.BooleanField()
+    published_objects = PublishedBookManager()
+    authors = models.ManyToManyField(Person, related_name='books')
+
+    def __str__(self):
+        return self.title
+
+# An example of providing multiple custom managers.
+
+class FastCarManager(models.Manager):
+    def get_query_set(self):
+        return super(FastCarManager, self).get_query_set().filter(top_speed__gt=150)
+
+class Car(models.Model):
+    name = models.CharField(maxlength=10)
+    mileage = models.IntegerField()
+    top_speed = models.IntegerField(help_text="In miles per hour.")
+    cars = models.Manager()
+    fast_cars = FastCarManager()
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+>>> p1 = Person(first_name='Bugs', last_name='Bunny', fun=True)
+>>> p1.save()
+>>> p2 = Person(first_name='Droopy', last_name='Dog', fun=False)
+>>> p2.save()
+>>> Person.objects.get_fun_people()
+[<Person: Bugs Bunny>]
+
+# The RelatedManager used on the 'books' descriptor extends the default manager
+>>> from modeltests.custom_managers.models import PublishedBookManager
+>>> isinstance(p2.books, PublishedBookManager)
+True
+
+>>> b1 = Book(title='How to program', author='Rodney Dangerfield', is_published=True)
+>>> b1.save()
+>>> b2 = Book(title='How to be smart', author='Albert Einstein', is_published=False)
+>>> b2.save()
+
+# The default manager, "objects", doesn't exist,
+# because a custom one was provided.
+>>> Book.objects
+Traceback (most recent call last):
+    ...
+AttributeError: type object 'Book' has no attribute 'objects'
+
+# The RelatedManager used on the 'authors' descriptor extends the default manager
+>>> from modeltests.custom_managers.models import PersonManager
+>>> isinstance(b2.authors, PersonManager)
+True
+
+>>> Book.published_objects.all()
+[<Book: How to program>]
+
+>>> c1 = Car(name='Corvette', mileage=21, top_speed=180)
+>>> c1.save()
+>>> c2 = Car(name='Neon', mileage=31, top_speed=100)
+>>> c2.save()
+>>> Car.cars.order_by('name')
+[<Car: Corvette>, <Car: Neon>]
+>>> Car.fast_cars.all()
+[<Car: Corvette>]
+
+# Each model class gets a "_default_manager" attribute, which is a reference
+# to the first manager defined in the class. In this case, it's "cars".
+>>> Car._default_manager.order_by('name')
+[<Car: Corvette>, <Car: Neon>]
+"""

Added: vendor/django/current/tests/modeltests/custom_methods/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/custom_methods/models.py
===================================================================
--- vendor/django/current/tests/modeltests/custom_methods/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/custom_methods/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,58 @@
+"""
+3. Giving models custom methods
+
+Any method you add to a model will be available to instances.
+"""
+
+from django.db import models
+import datetime
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    pub_date = models.DateField()
+
+    def __str__(self):
+        return self.headline
+
+    def was_published_today(self):
+        return self.pub_date == datetime.date.today()
+
+    def articles_from_same_day_1(self):
+        return Article.objects.filter(pub_date=self.pub_date).exclude(id=self.id)
+
+    def articles_from_same_day_2(self):
+        """
+        Verbose version of get_articles_from_same_day_1, which does a custom
+        database query for the sake of demonstration.
+        """
+        from django.db import connection
+        cursor = connection.cursor()
+        cursor.execute("""
+            SELECT id, headline, pub_date
+            FROM custom_methods_article
+            WHERE pub_date = %s
+                AND id != %s""", [str(self.pub_date), self.id])
+        # The asterisk in "(*row)" tells Python to expand the list into
+        # positional arguments to Article().
+        return [self.__class__(*row) for row in cursor.fetchall()]
+
+API_TESTS = """
+# Create a couple of Articles.
+>>> from datetime import date
+>>> a = Article(id=None, headline='Area man programs in Python', pub_date=date(2005, 7, 27))
+>>> a.save()
+>>> b = Article(id=None, headline='Beatles reunite', pub_date=date(2005, 7, 27))
+>>> b.save()
+
+# Test the custom methods.
+>>> a.was_published_today()
+False
+>>> a.articles_from_same_day_1()
+[<Article: Beatles reunite>]
+>>> a.articles_from_same_day_2()
+[<Article: Beatles reunite>]
+>>> b.articles_from_same_day_1()
+[<Article: Area man programs in Python>]
+>>> b.articles_from_same_day_2()
+[<Article: Area man programs in Python>]
+"""

Added: vendor/django/current/tests/modeltests/custom_pk/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/custom_pk/models.py
===================================================================
--- vendor/django/current/tests/modeltests/custom_pk/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/custom_pk/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,91 @@
+"""
+14. Using a custom primary key
+
+By default, Django adds an ``"id"`` field to each model. But you can override
+this behavior by explicitly adding ``primary_key=True`` to a field.
+"""
+
+from django.db import models
+
+class Employee(models.Model):
+    employee_code = models.CharField(maxlength=10, primary_key=True,
+            db_column = 'code')
+    first_name = models.CharField(maxlength=20)
+    last_name = models.CharField(maxlength=20)
+    class Meta:
+        ordering = ('last_name', 'first_name')
+
+    def __str__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+class Business(models.Model):
+    name = models.CharField(maxlength=20, primary_key=True)
+    employees = models.ManyToManyField(Employee)
+    class Meta:
+        verbose_name_plural = 'businesses'
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+>>> dan = Employee(employee_code='ABC123', first_name='Dan', last_name='Jones')
+>>> dan.save()
+>>> Employee.objects.all()
+[<Employee: Dan Jones>]
+
+>>> fran = Employee(employee_code='XYZ456', first_name='Fran', last_name='Bones')
+>>> fran.save()
+>>> Employee.objects.all()
+[<Employee: Fran Bones>, <Employee: Dan Jones>]
+
+>>> Employee.objects.get(pk='ABC123')
+<Employee: Dan Jones>
+>>> Employee.objects.get(pk='XYZ456')
+<Employee: Fran Bones>
+>>> Employee.objects.get(pk='foo')
+Traceback (most recent call last):
+    ...
+DoesNotExist: Employee matching query does not exist.
+
+# Use the name of the primary key, rather than pk.
+>>> Employee.objects.get(employee_code__exact='ABC123')
+<Employee: Dan Jones>
+
+# Fran got married and changed her last name.
+>>> fran = Employee.objects.get(pk='XYZ456')
+>>> fran.last_name = 'Jones'
+>>> fran.save()
+>>> Employee.objects.filter(last_name__exact='Jones')
+[<Employee: Dan Jones>, <Employee: Fran Jones>]
+>>> Employee.objects.in_bulk(['ABC123', 'XYZ456'])
+{'XYZ456': <Employee: Fran Jones>, 'ABC123': <Employee: Dan Jones>}
+
+>>> b = Business(name='Sears')
+>>> b.save()
+>>> b.employees.add(dan, fran)
+>>> b.employees.all()
+[<Employee: Dan Jones>, <Employee: Fran Jones>]
+>>> fran.business_set.all()
+[<Business: Sears>]
+>>> Business.objects.in_bulk(['Sears'])
+{'Sears': <Business: Sears>}
+
+>>> Business.objects.filter(name__exact='Sears')
+[<Business: Sears>]
+>>> Business.objects.filter(pk='Sears')
+[<Business: Sears>]
+
+# Queries across tables, involving primary key
+>>> Employee.objects.filter(business__name__exact='Sears')
+[<Employee: Dan Jones>, <Employee: Fran Jones>]
+>>> Employee.objects.filter(business__pk='Sears')
+[<Employee: Dan Jones>, <Employee: Fran Jones>]
+
+>>> Business.objects.filter(employees__employee_code__exact='ABC123')
+[<Business: Sears>]
+>>> Business.objects.filter(employees__pk='ABC123')
+[<Business: Sears>]
+>>> Business.objects.filter(employees__first_name__startswith='Fran')
+[<Business: Sears>]
+
+"""

Added: vendor/django/current/tests/modeltests/empty/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/empty/models.py
===================================================================
--- vendor/django/current/tests/modeltests/empty/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/empty/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,24 @@
+"""
+Empty model tests
+
+These test that things behave sensibly for the rare corner-case of a model with
+no fields.
+"""
+
+from django.db import models
+
+class Empty(models.Model):
+    pass
+
+API_TESTS = """
+>>> m = Empty()
+>>> m.id
+>>> m.save()
+>>> m2 = Empty()
+>>> m2.save()
+>>> len(Empty.objects.all())
+2
+>>> m.id is not None
+True
+
+"""

Added: vendor/django/current/tests/modeltests/field_defaults/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/field_defaults/models.py
===================================================================
--- vendor/django/current/tests/modeltests/field_defaults/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/field_defaults/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,51 @@
+"""
+31. Callable defaults
+
+You can pass callable objects as the ``default`` parameter to a field. When
+the object is created without an explicit value passed in, Django will call
+the method to determine the default value.
+
+This example uses ``datetime.datetime.now`` as the default for the ``pub_date``
+field.
+"""
+
+from django.db import models
+from datetime import datetime
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100, default='Default headline')
+    pub_date = models.DateTimeField(default=datetime.now)
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+>>> from datetime import datetime
+
+# No articles are in the system yet.
+>>> Article.objects.all()
+[]
+
+# Create an Article.
+>>> a = Article(id=None)
+
+# Grab the current datetime it should be very close to the default that just
+# got saved as a.pub_date
+>>> now = datetime.now()
+
+# Save it into the database. You have to call save() explicitly.
+>>> a.save()
+
+# Now it has an ID. Note it's a long integer, as designated by the trailing "L".
+>>> a.id
+1L
+
+# Access database columns via Python attributes.
+>>> a.headline
+'Default headline'
+
+# make sure the two dates are sufficiently close
+>>> d = now - a.pub_date
+>>> d.seconds < 5
+True
+"""

Added: vendor/django/current/tests/modeltests/generic_relations/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/generic_relations/models.py
===================================================================
--- vendor/django/current/tests/modeltests/generic_relations/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/generic_relations/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,108 @@
+"""
+33. Generic relations
+
+Generic relations let an object have a foreign key to any object through a
+content-type/object-id field. A generic foreign key can point to any object,
+be it animal, vegetable, or mineral.
+
+The canonical example is tags (although this example implementation is *far*
+from complete).
+"""
+
+from django.db import models
+from django.contrib.contenttypes.models import ContentType
+
+class TaggedItem(models.Model):
+    """A tag on an item."""
+    tag = models.SlugField()
+    content_type = models.ForeignKey(ContentType)
+    object_id = models.PositiveIntegerField()
+    
+    content_object = models.GenericForeignKey()
+    
+    class Meta:
+        ordering = ["tag"]
+    
+    def __str__(self):
+        return self.tag
+
+class Animal(models.Model):
+    common_name = models.CharField(maxlength=150)
+    latin_name = models.CharField(maxlength=150)
+    
+    tags = models.GenericRelation(TaggedItem)
+
+    def __str__(self):
+        return self.common_name
+        
+class Vegetable(models.Model):
+    name = models.CharField(maxlength=150)
+    is_yucky = models.BooleanField(default=True)
+    
+    tags = models.GenericRelation(TaggedItem)
+    
+    def __str__(self):
+        return self.name
+    
+class Mineral(models.Model):
+    name = models.CharField(maxlength=150)
+    hardness = models.PositiveSmallIntegerField()
+    
+    # note the lack of an explicit GenericRelation here...
+    
+    def __str__(self):
+        return self.name
+        
+API_TESTS = """
+# Create the world in 7 lines of code...
+>>> lion = Animal(common_name="Lion", latin_name="Panthera leo")
+>>> platypus = Animal(common_name="Platypus", latin_name="Ornithorhynchus anatinus")
+>>> eggplant = Vegetable(name="Eggplant", is_yucky=True)
+>>> bacon = Vegetable(name="Bacon", is_yucky=False)
+>>> quartz = Mineral(name="Quartz", hardness=7)
+>>> for o in (lion, platypus, eggplant, bacon, quartz):
+...     o.save()
+
+# Objects with declared GenericRelations can be tagged directly -- the API
+# mimics the many-to-many API.
+>>> lion.tags.create(tag="yellow")
+<TaggedItem: yellow>
+>>> lion.tags.create(tag="hairy")
+<TaggedItem: hairy>
+>>> bacon.tags.create(tag="fatty")
+<TaggedItem: fatty>
+>>> bacon.tags.create(tag="salty")
+<TaggedItem: salty>
+
+>>> lion.tags.all()
+[<TaggedItem: hairy>, <TaggedItem: yellow>]
+>>> bacon.tags.all()
+[<TaggedItem: fatty>, <TaggedItem: salty>]
+
+# You can easily access the content object like a foreign key.
+>>> t = TaggedItem.objects.get(tag="salty")
+>>> t.content_object
+<Vegetable: Bacon>
+
+# Recall that the Mineral class doesn't have an explicit GenericRelation
+# defined. That's OK, because you can create TaggedItems explicitly.
+>>> tag1 = TaggedItem(content_object=quartz, tag="shiny")
+>>> tag2 = TaggedItem(content_object=quartz, tag="clearish")
+>>> tag1.save()
+>>> tag2.save()
+
+# However, excluding GenericRelations means your lookups have to be a bit more
+# explicit.
+>>> from django.contrib.contenttypes.models import ContentType
+>>> ctype = ContentType.objects.get_for_model(quartz)
+>>> TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id)
+[<TaggedItem: clearish>, <TaggedItem: shiny>]
+
+# You can set a generic foreign key in the way you'd expect.
+>>> tag1.content_object = platypus
+>>> tag1.save()
+>>> platypus.tags.all()
+[<TaggedItem: shiny>]
+>>> TaggedItem.objects.filter(content_type__pk=ctype.id, object_id=quartz.id)
+[<TaggedItem: clearish>]
+"""

Added: vendor/django/current/tests/modeltests/get_latest/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/get_latest/models.py
===================================================================
--- vendor/django/current/tests/modeltests/get_latest/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/get_latest/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,79 @@
+"""
+8. get_latest_by
+
+Models can have a ``get_latest_by`` attribute, which should be set to the name
+of a DateField or DateTimeField. If ``get_latest_by`` exists, the model's
+module will get a ``get_latest()`` function, which will return the latest
+object in the database according to that field. "Latest" means "having the
+date farthest into the future."
+"""
+
+from django.db import models
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    pub_date = models.DateField()
+    expire_date = models.DateField()
+    class Meta:
+        get_latest_by = 'pub_date'
+
+    def __str__(self):
+        return self.headline
+
+class Person(models.Model):
+    name = models.CharField(maxlength=30)
+    birthday = models.DateField()
+
+    # Note that this model doesn't have "get_latest_by" set.
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+# Because no Articles exist yet, get_latest() raises ArticleDoesNotExist.
+>>> Article.objects.latest()
+Traceback (most recent call last):
+    ...
+DoesNotExist: Article matching query does not exist.
+
+# Create a couple of Articles.
+>>> from datetime import datetime
+>>> a1 = Article(headline='Article 1', pub_date=datetime(2005, 7, 26), expire_date=datetime(2005, 9, 1))
+>>> a1.save()
+>>> a2 = Article(headline='Article 2', pub_date=datetime(2005, 7, 27), expire_date=datetime(2005, 7, 28))
+>>> a2.save()
+>>> a3 = Article(headline='Article 3', pub_date=datetime(2005, 7, 27), expire_date=datetime(2005, 8, 27))
+>>> a3.save()
+>>> a4 = Article(headline='Article 4', pub_date=datetime(2005, 7, 28), expire_date=datetime(2005, 7, 30))
+>>> a4.save()
+
+# Get the latest Article.
+>>> Article.objects.latest()
+<Article: Article 4>
+
+# Get the latest Article that matches certain filters.
+>>> Article.objects.filter(pub_date__lt=datetime(2005, 7, 27)).latest()
+<Article: Article 1>
+
+# Pass a custom field name to latest() to change the field that's used to
+# determine the latest object.
+>>> Article.objects.latest('expire_date')
+<Article: Article 1>
+
+>>> Article.objects.filter(pub_date__gt=datetime(2005, 7, 26)).latest('expire_date')
+<Article: Article 3>
+
+# You can still use latest() with a model that doesn't have "get_latest_by"
+# set -- just pass in the field name manually.
+>>> p1 = Person(name='Ralph', birthday=datetime(1950, 1, 1))
+>>> p1.save()
+>>> p2 = Person(name='Stephanie', birthday=datetime(1960, 2, 3))
+>>> p2.save()
+>>> Person.objects.latest()
+Traceback (most recent call last):
+    ...
+AssertionError: latest() requires either a field_name parameter or 'get_latest_by' in the model
+
+>>> Person.objects.latest('birthday')
+<Person: Stephanie>
+"""

Added: vendor/django/current/tests/modeltests/get_or_create/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/get_or_create/models.py
===================================================================
--- vendor/django/current/tests/modeltests/get_or_create/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/get_or_create/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,52 @@
+"""
+32. get_or_create()
+
+get_or_create() does what it says: it tries to look up an object with the given
+parameters. If an object isn't found, it creates one with the given parameters.
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    first_name = models.CharField(maxlength=100)
+    last_name = models.CharField(maxlength=100)
+    birthday = models.DateField()
+
+    def __str__(self):
+        return '%s %s' % (self.first_name, self.last_name)
+
+API_TESTS = """
+# Acting as a divine being, create an Person.
+>>> from datetime import date
+>>> p = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
+>>> p.save()
+
+# Only one Person is in the database at this point.
+>>> Person.objects.count()
+1
+
+# get_or_create() a person with similar first names.
+>>> p, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)})
+
+# get_or_create() didn't have to create an object.
+>>> created
+False
+
+# There's still only one Person in the database.
+>>> Person.objects.count()
+1
+
+# get_or_create() a Person with a different name.
+>>> p, created = Person.objects.get_or_create(first_name='George', last_name='Harrison', defaults={'birthday': date(1943, 2, 25)})
+>>> created
+True
+>>> Person.objects.count()
+2
+
+# If we execute the exact same statement, it won't create a Person.
+>>> p, created = Person.objects.get_or_create(first_name='George', last_name='Harrison', defaults={'birthday': date(1943, 2, 25)})
+>>> created
+False
+>>> Person.objects.count()
+2
+"""

Added: vendor/django/current/tests/modeltests/invalid_models/__init__.py
===================================================================
--- vendor/django/current/tests/modeltests/invalid_models/__init__.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/invalid_models/__init__.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1 @@
+

Added: vendor/django/current/tests/modeltests/invalid_models/models.py
===================================================================
--- vendor/django/current/tests/modeltests/invalid_models/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/invalid_models/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,155 @@
+"""
+26. Invalid models
+
+This example exists purely to point out errors in models.
+"""
+
+from django.db import models
+
+class FieldErrors(models.Model):
+    charfield = models.CharField()
+    floatfield = models.FloatField()
+    filefield = models.FileField()
+    prepopulate = models.CharField(maxlength=10, prepopulate_from='bad')
+    choices = models.CharField(maxlength=10, choices='bad')
+    choices2 = models.CharField(maxlength=10, choices=[(1,2,3),(1,2,3)])
+    index = models.CharField(maxlength=10, db_index='bad')
+
+class Target(models.Model):
+    tgt_safe = models.CharField(maxlength=10)
+    clash1 = models.CharField(maxlength=10)
+    clash2 = models.CharField(maxlength=10)
+
+    clash1_set = models.CharField(maxlength=10)
+
+class Clash1(models.Model):
+    src_safe = models.CharField(maxlength=10, core=True)
+
+    foreign = models.ForeignKey(Target)
+    m2m = models.ManyToManyField(Target)
+
+class Clash2(models.Model):
+    src_safe = models.CharField(maxlength=10, core=True)
+
+    foreign_1 = models.ForeignKey(Target, related_name='id')
+    foreign_2 = models.ForeignKey(Target, related_name='src_safe')
+
+    m2m_1 = models.ManyToManyField(Target, related_name='id')
+    m2m_2 = models.ManyToManyField(Target, related_name='src_safe')
+
+class Target2(models.Model):
+    clash3 = models.CharField(maxlength=10)
+    foreign_tgt = models.ForeignKey(Target)
+    clashforeign_set = models.ForeignKey(Target)
+
+    m2m_tgt = models.ManyToManyField(Target)
+    clashm2m_set = models.ManyToManyField(Target)
+
+class Clash3(models.Model):
+    src_safe = models.CharField(maxlength=10, core=True)
+    
+    foreign_1 = models.ForeignKey(Target2, related_name='foreign_tgt')
+    foreign_2 = models.ForeignKey(Target2, related_name='m2m_tgt')
+
+    m2m_1 = models.ManyToManyField(Target2, related_name='foreign_tgt')
+    m2m_2 = models.ManyToManyField(Target2, related_name='m2m_tgt')
+
+class ClashForeign(models.Model):
+    foreign = models.ForeignKey(Target2)
+
+class ClashM2M(models.Model):
+    m2m = models.ManyToManyField(Target2)
+
+class SelfClashForeign(models.Model):
+    src_safe = models.CharField(maxlength=10, core=True)
+    selfclashforeign = models.CharField(maxlength=10)
+
+    selfclashforeign_set = models.ForeignKey("SelfClashForeign")
+    foreign_1 = models.ForeignKey("SelfClashForeign", related_name='id')
+    foreign_2 = models.ForeignKey("SelfClashForeign", related_name='src_safe')
+
+class SelfClashM2M(models.Model):
+    src_safe = models.CharField(maxlength=10)
+    selfclashm2m = models.CharField(maxlength=10)
+
+    selfclashm2m_set = models.ManyToManyField("SelfClashM2M")
+    m2m_1 = models.ManyToManyField("SelfClashM2M", related_name='id')
+    m2m_2 = models.ManyToManyField("SelfClashM2M", related_name='src_safe')
+
+
+
+error_log = """invalid_models.fielderrors: "charfield": CharFields require a "maxlength" attribute.
+invalid_models.fielderrors: "floatfield": FloatFields require a "decimal_places" attribute.
+invalid_models.fielderrors: "floatfield": FloatFields require a "max_digits" attribute.
+invalid_models.fielderrors: "filefield": FileFields require an "upload_to" attribute.
+invalid_models.fielderrors: "prepopulate": prepopulate_from should be a list or tuple.
+invalid_models.fielderrors: "choices": "choices" should be iterable (e.g., a tuple or list).
+invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples.
+invalid_models.fielderrors: "choices2": "choices" should be a sequence of two-tuples.
+invalid_models.fielderrors: "index": "db_index" should be either None, True or False.
+invalid_models.clash1: Accessor for field 'foreign' clashes with field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'.
+invalid_models.clash1: Accessor for field 'foreign' clashes with related m2m field 'Target.clash1_set'. Add a related_name argument to the definition for 'foreign'.
+invalid_models.clash1: Reverse query name for field 'foreign' clashes with field 'Target.clash1'. Add a related_name argument to the definition for 'foreign'.
+invalid_models.clash1: Accessor for m2m field 'm2m' clashes with field 'Target.clash1_set'. Add a related_name argument to the definition for 'm2m'.
+invalid_models.clash1: Accessor for m2m field 'm2m' clashes with related field 'Target.clash1_set'. Add a related_name argument to the definition for 'm2m'.
+invalid_models.clash1: Reverse query name for m2m field 'm2m' clashes with field 'Target.clash1'. Add a related_name argument to the definition for 'm2m'.
+invalid_models.clash2: Accessor for field 'foreign_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash2: Accessor for field 'foreign_1' clashes with related m2m field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash2: Reverse query name for field 'foreign_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash2: Reverse query name for field 'foreign_1' clashes with related m2m field 'Target.id'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash2: Accessor for field 'foreign_2' clashes with related m2m field 'Target.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.clash2: Reverse query name for field 'foreign_2' clashes with related m2m field 'Target.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.clash2: Accessor for m2m field 'm2m_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash2: Accessor for m2m field 'm2m_1' clashes with related field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash2: Reverse query name for m2m field 'm2m_1' clashes with field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash2: Reverse query name for m2m field 'm2m_1' clashes with related field 'Target.id'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash2: Accessor for m2m field 'm2m_2' clashes with related field 'Target.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.clash2: Reverse query name for m2m field 'm2m_2' clashes with related field 'Target.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.clash3: Accessor for field 'foreign_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash3: Accessor for field 'foreign_1' clashes with related m2m field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash3: Reverse query name for field 'foreign_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash3: Reverse query name for field 'foreign_1' clashes with related m2m field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.clash3: Accessor for field 'foreign_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.clash3: Accessor for field 'foreign_2' clashes with related m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.clash3: Reverse query name for field 'foreign_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.clash3: Reverse query name for field 'foreign_2' clashes with related m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.clash3: Accessor for m2m field 'm2m_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash3: Accessor for m2m field 'm2m_1' clashes with related field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash3: Reverse query name for m2m field 'm2m_1' clashes with field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash3: Reverse query name for m2m field 'm2m_1' clashes with related field 'Target2.foreign_tgt'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.clash3: Accessor for m2m field 'm2m_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.clash3: Accessor for m2m field 'm2m_2' clashes with related field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.clash3: Reverse query name for m2m field 'm2m_2' clashes with m2m field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.clash3: Reverse query name for m2m field 'm2m_2' clashes with related field 'Target2.m2m_tgt'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.clashforeign: Accessor for field 'foreign' clashes with field 'Target2.clashforeign_set'. Add a related_name argument to the definition for 'foreign'.
+invalid_models.clashm2m: Accessor for m2m field 'm2m' clashes with m2m field 'Target2.clashm2m_set'. Add a related_name argument to the definition for 'm2m'.
+invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'.
+invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'.
+invalid_models.target2: Accessor for field 'foreign_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'foreign_tgt'.
+invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'.
+invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'.
+invalid_models.target2: Accessor for field 'clashforeign_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashforeign_set'.
+invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
+invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
+invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
+invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
+invalid_models.target2: Accessor for m2m field 'm2m_tgt' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'm2m_tgt'.
+invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
+invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
+invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
+invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
+invalid_models.target2: Accessor for m2m field 'clashm2m_set' clashes with related m2m field 'Target.target2_set'. Add a related_name argument to the definition for 'clashm2m_set'.
+invalid_models.selfclashforeign: Accessor for field 'selfclashforeign_set' clashes with field 'SelfClashForeign.selfclashforeign_set'. Add a related_name argument to the definition for 'selfclashforeign_set'.
+invalid_models.selfclashforeign: Reverse query name for field 'selfclashforeign_set' clashes with field 'SelfClashForeign.selfclashforeign'. Add a related_name argument to the definition for 'selfclashforeign_set'.
+invalid_models.selfclashforeign: Accessor for field 'foreign_1' clashes with field 'SelfClashForeign.id'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.selfclashforeign: Reverse query name for field 'foreign_1' clashes with field 'SelfClashForeign.id'. Add a related_name argument to the definition for 'foreign_1'.
+invalid_models.selfclashforeign: Accessor for field 'foreign_2' clashes with field 'SelfClashForeign.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.selfclashforeign: Reverse query name for field 'foreign_2' clashes with field 'SelfClashForeign.src_safe'. Add a related_name argument to the definition for 'foreign_2'.
+invalid_models.selfclashm2m: Accessor for m2m field 'selfclashm2m_set' clashes with m2m field 'SelfClashM2M.selfclashm2m_set'. Add a related_name argument to the definition for 'selfclashm2m_set'.
+invalid_models.selfclashm2m: Reverse query name for m2m field 'selfclashm2m_set' clashes with field 'SelfClashM2M.selfclashm2m'. Add a related_name argument to the definition for 'selfclashm2m_set'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.selfclashm2m: Accessor for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
+invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_1' clashes with field 'SelfClashM2M.id'. Add a related_name argument to the definition for 'm2m_1'.
+invalid_models.selfclashm2m: Reverse query name for m2m field 'm2m_2' clashes with field 'SelfClashM2M.src_safe'. Add a related_name argument to the definition for 'm2m_2'.
+"""
+

Added: vendor/django/current/tests/modeltests/lookup/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/lookup/models.py
===================================================================
--- vendor/django/current/tests/modeltests/lookup/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/lookup/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,185 @@
+"""
+7. The lookup API
+
+This demonstrates features of the database API.
+"""
+
+from django.db import models
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    pub_date = models.DateTimeField()
+    class Meta:
+        ordering = ('-pub_date', 'headline')
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+# Create a couple of Articles.
+>>> from datetime import datetime
+>>> a1 = Article(headline='Article 1', pub_date=datetime(2005, 7, 26))
+>>> a1.save()
+>>> a2 = Article(headline='Article 2', pub_date=datetime(2005, 7, 27))
+>>> a2.save()
+>>> a3 = Article(headline='Article 3', pub_date=datetime(2005, 7, 27))
+>>> a3.save()
+>>> a4 = Article(headline='Article 4', pub_date=datetime(2005, 7, 28))
+>>> a4.save()
+>>> a5 = Article(headline='Article 5', pub_date=datetime(2005, 8, 1, 9, 0))
+>>> a5.save()
+>>> a6 = Article(headline='Article 6', pub_date=datetime(2005, 8, 1, 8, 0))
+>>> a6.save()
+>>> a7 = Article(headline='Article 7', pub_date=datetime(2005, 7, 27))
+>>> a7.save()
+
+# Each QuerySet gets iterator(), which is a generator that "lazily" returns
+# results using database-level iteration.
+>>> for a in Article.objects.iterator():
+...     print a.headline
+Article 5
+Article 6
+Article 4
+Article 2
+Article 3
+Article 7
+Article 1
+
+# iterator() can be used on any QuerySet.
+>>> for a in Article.objects.filter(headline__endswith='4').iterator():
+...     print a.headline
+Article 4
+
+# count() returns the number of objects matching search criteria.
+>>> Article.objects.count()
+7L
+>>> Article.objects.filter(pub_date__exact=datetime(2005, 7, 27)).count()
+3L
+>>> Article.objects.filter(headline__startswith='Blah blah').count()
+0L
+
+# Date and date/time lookups can also be done with strings.
+>>> Article.objects.filter(pub_date__exact='2005-07-27 00:00:00').count()
+3L
+
+# in_bulk() takes a list of IDs and returns a dictionary mapping IDs
+# to objects.
+>>> Article.objects.in_bulk([1, 2])
+{1: <Article: Article 1>, 2: <Article: Article 2>}
+>>> Article.objects.in_bulk([3])
+{3: <Article: Article 3>}
+>>> Article.objects.in_bulk([1000])
+{}
+>>> Article.objects.in_bulk([])
+{}
+>>> Article.objects.in_bulk('foo')
+Traceback (most recent call last):
+    ...
+AssertionError: in_bulk() must be provided with a list of IDs.
+>>> Article.objects.in_bulk()
+Traceback (most recent call last):
+    ...
+TypeError: in_bulk() takes exactly 2 arguments (1 given)
+>>> Article.objects.in_bulk(headline__startswith='Blah')
+Traceback (most recent call last):
+    ...
+TypeError: in_bulk() got an unexpected keyword argument 'headline__startswith'
+
+# values() returns a list of dictionaries instead of object instances -- and
+# you can specify which fields you want to retrieve.
+>>> Article.objects.values('headline')
+[{'headline': 'Article 5'}, {'headline': 'Article 6'}, {'headline': 'Article 4'}, {'headline': 'Article 2'}, {'headline': 'Article 3'}, {'headline': 'Article 7'}, {'headline': 'Article 1'}]
+>>> Article.objects.filter(pub_date__exact=datetime(2005, 7, 27)).values('id')
+[{'id': 2}, {'id': 3}, {'id': 7}]
+>>> list(Article.objects.values('id', 'headline')) == [{'id': 5, 'headline': 'Article 5'}, {'id': 6, 'headline': 'Article 6'}, {'id': 4, 'headline': 'Article 4'}, {'id': 2, 'headline': 'Article 2'}, {'id': 3, 'headline': 'Article 3'}, {'id': 7, 'headline': 'Article 7'}, {'id': 1, 'headline': 'Article 1'}]
+True
+
+>>> for d in Article.objects.values('id', 'headline'):
+...     i = d.items()
+...     i.sort()
+...     i
+[('headline', 'Article 5'), ('id', 5)]
+[('headline', 'Article 6'), ('id', 6)]
+[('headline', 'Article 4'), ('id', 4)]
+[('headline', 'Article 2'), ('id', 2)]
+[('headline', 'Article 3'), ('id', 3)]
+[('headline', 'Article 7'), ('id', 7)]
+[('headline', 'Article 1'), ('id', 1)]
+
+# You can use values() with iterator() for memory savings, because iterator()
+# uses database-level iteration.
+>>> for d in Article.objects.values('id', 'headline').iterator():
+...     i = d.items()
+...     i.sort()
+...     i
+[('headline', 'Article 5'), ('id', 5)]
+[('headline', 'Article 6'), ('id', 6)]
+[('headline', 'Article 4'), ('id', 4)]
+[('headline', 'Article 2'), ('id', 2)]
+[('headline', 'Article 3'), ('id', 3)]
+[('headline', 'Article 7'), ('id', 7)]
+[('headline', 'Article 1'), ('id', 1)]
+
+# if you don't specify which fields, all are returned
+>>> list(Article.objects.filter(id=5).values()) == [{'id': 5, 'headline': 'Article 5', 'pub_date': datetime(2005, 8, 1, 9, 0)}]
+True
+
+# Every DateField and DateTimeField creates get_next_by_FOO() and
+# get_previous_by_FOO() methods.
+# In the case of identical date values, these methods will use the ID as a
+# fallback check. This guarantees that no records are skipped or duplicated.
+>>> a1.get_next_by_pub_date()
+<Article: Article 2>
+>>> a2.get_next_by_pub_date()
+<Article: Article 3>
+>>> a2.get_next_by_pub_date(headline__endswith='6')
+<Article: Article 6>
+>>> a3.get_next_by_pub_date()
+<Article: Article 7>
+>>> a4.get_next_by_pub_date()
+<Article: Article 6>
+>>> a5.get_next_by_pub_date()
+Traceback (most recent call last):
+    ...
+DoesNotExist: Article matching query does not exist.
+>>> a6.get_next_by_pub_date()
+<Article: Article 5>
+>>> a7.get_next_by_pub_date()
+<Article: Article 4>
+
+>>> a7.get_previous_by_pub_date()
+<Article: Article 3>
+>>> a6.get_previous_by_pub_date()
+<Article: Article 4>
+>>> a5.get_previous_by_pub_date()
+<Article: Article 6>
+>>> a4.get_previous_by_pub_date()
+<Article: Article 7>
+>>> a3.get_previous_by_pub_date()
+<Article: Article 2>
+>>> a2.get_previous_by_pub_date()
+<Article: Article 1>
+
+# Underscores and percent signs have special meaning in the underlying
+# database library, but Django handles the quoting of them automatically.
+>>> a8 = Article(headline='Article_ with underscore', pub_date=datetime(2005, 11, 20))
+>>> a8.save()
+>>> Article.objects.filter(headline__startswith='Article')
+[<Article: Article_ with underscore>, <Article: Article 5>, <Article: Article 6>, <Article: Article 4>, <Article: Article 2>, <Article: Article 3>, <Article: Article 7>, <Article: Article 1>]
+>>> Article.objects.filter(headline__startswith='Article_')
+[<Article: Article_ with underscore>]
+>>> a9 = Article(headline='Article% with percent sign', pub_date=datetime(2005, 11, 21))
+>>> a9.save()
+>>> Article.objects.filter(headline__startswith='Article')
+[<Article: Article% with percent sign>, <Article: Article_ with underscore>, <Article: Article 5>, <Article: Article 6>, <Article: Article 4>, <Article: Article 2>, <Article: Article 3>, <Article: Article 7>, <Article: Article 1>]
+>>> Article.objects.filter(headline__startswith='Article%')
+[<Article: Article% with percent sign>]
+
+# exclude() is the opposite of filter() when doing lookups:
+>>> Article.objects.filter(headline__contains='Article').exclude(headline__contains='with')
+[<Article: Article 5>, <Article: Article 6>, <Article: Article 4>, <Article: Article 2>, <Article: Article 3>, <Article: Article 7>, <Article: Article 1>]
+>>> Article.objects.exclude(headline__startswith="Article_")
+[<Article: Article% with percent sign>, <Article: Article 5>, <Article: Article 6>, <Article: Article 4>, <Article: Article 2>, <Article: Article 3>, <Article: Article 7>, <Article: Article 1>]
+>>> Article.objects.exclude(headline="Article 7")
+[<Article: Article% with percent sign>, <Article: Article_ with underscore>, <Article: Article 5>, <Article: Article 6>, <Article: Article 4>, <Article: Article 2>, <Article: Article 3>, <Article: Article 1>]
+"""

Added: vendor/django/current/tests/modeltests/m2m_and_m2o/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/m2m_and_m2o/models.py
===================================================================
--- vendor/django/current/tests/modeltests/m2m_and_m2o/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/m2m_and_m2o/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,65 @@
+"""
+28. Many-to-many and many-to-one relationships to the same table
+
+Make sure to set ``related_name`` if you use relationships to the same table.
+"""
+
+from django.db import models
+
+class User(models.Model):
+    username = models.CharField(maxlength=20)
+
+class Issue(models.Model):
+    num = models.IntegerField()
+    cc = models.ManyToManyField(User, blank=True, related_name='test_issue_cc')
+    client = models.ForeignKey(User, related_name='test_issue_client')
+
+    def __str__(self):
+        return str(self.num)
+
+    class Meta:
+        ordering = ('num',)
+
+
+API_TESTS = """
+>>> Issue.objects.all()
+[]
+>>> r = User(username='russell')
+>>> r.save()
+>>> g = User(username='gustav')
+>>> g.save()
+
+>>> i = Issue(num=1)
+>>> i.client = r
+>>> i.save()
+
+>>> i2 = Issue(num=2)
+>>> i2.client = r
+>>> i2.save()
+>>> i2.cc.add(r)
+
+>>> i3 = Issue(num=3)
+>>> i3.client = g
+>>> i3.save()
+>>> i3.cc.add(r)
+
+>>> from django.db.models.query import Q
+
+>>> Issue.objects.filter(client=r.id)
+[<Issue: 1>, <Issue: 2>]
+>>> Issue.objects.filter(client=g.id)
+[<Issue: 3>]
+>>> Issue.objects.filter(cc__id__exact=g.id)
+[]
+>>> Issue.objects.filter(cc__id__exact=r.id)
+[<Issue: 2>, <Issue: 3>]
+
+# These queries combine results from the m2m and the m2o relationships.
+# They're three ways of saying the same thing.
+>>> Issue.objects.filter(Q(cc__id__exact=r.id) | Q(client=r.id))
+[<Issue: 1>, <Issue: 2>, <Issue: 3>]
+>>> Issue.objects.filter(cc__id__exact=r.id) | Issue.objects.filter(client=r.id)
+[<Issue: 1>, <Issue: 2>, <Issue: 3>]
+>>> Issue.objects.filter(Q(client=r.id) | Q(cc__id__exact=r.id))
+[<Issue: 1>, <Issue: 2>, <Issue: 3>]
+"""

Added: vendor/django/current/tests/modeltests/m2m_intermediary/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/m2m_intermediary/models.py
===================================================================
--- vendor/django/current/tests/modeltests/m2m_intermediary/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/m2m_intermediary/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,68 @@
+"""
+9. Many-to-many relationships via an intermediary table
+
+For many-to-many relationships that need extra fields on the intermediary
+table, use an intermediary model.
+
+In this example, an ``Article`` can have multiple ``Reporter``s, and each
+``Article``-``Reporter`` combination (a ``Writer``) has a ``position`` field,
+which specifies the ``Reporter``'s position for the given article (e.g. "Staff
+writer").
+"""
+
+from django.db import models
+
+class Reporter(models.Model):
+    first_name = models.CharField(maxlength=30)
+    last_name = models.CharField(maxlength=30)
+
+    def __str__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    pub_date = models.DateField()
+
+    def __str__(self):
+        return self.headline
+
+class Writer(models.Model):
+    reporter = models.ForeignKey(Reporter)
+    article = models.ForeignKey(Article)
+    position = models.CharField(maxlength=100)
+
+    def __str__(self):
+        return '%s (%s)' % (self.reporter, self.position)
+
+API_TESTS = """
+# Create a few Reporters.
+>>> r1 = Reporter(first_name='John', last_name='Smith')
+>>> r1.save()
+>>> r2 = Reporter(first_name='Jane', last_name='Doe')
+>>> r2.save()
+
+# Create an Article.
+>>> from datetime import datetime
+>>> a = Article(headline='This is a test', pub_date=datetime(2005, 7, 27))
+>>> a.save()
+
+# Create a few Writers.
+>>> w1 = Writer(reporter=r1, article=a, position='Main writer')
+>>> w1.save()
+>>> w2 = Writer(reporter=r2, article=a, position='Contributor')
+>>> w2.save()
+
+# Play around with the API.
+>>> a.writer_set.select_related().order_by('-position')
+[<Writer: John Smith (Main writer)>, <Writer: Jane Doe (Contributor)>]
+>>> w1.reporter
+<Reporter: John Smith>
+>>> w2.reporter
+<Reporter: Jane Doe>
+>>> w1.article
+<Article: This is a test>
+>>> w2.article
+<Article: This is a test>
+>>> r1.writer_set.all()
+[<Writer: John Smith (Main writer)>]
+"""

Added: vendor/django/current/tests/modeltests/m2m_multiple/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/m2m_multiple/models.py
===================================================================
--- vendor/django/current/tests/modeltests/m2m_multiple/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/m2m_multiple/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,79 @@
+"""
+20. Multiple many-to-many relationships between the same two tables
+
+In this example, an Article can have many Categories (as "primary") and many
+Categories (as "secondary").
+
+Set ``related_name`` to designate what the reverse relationship is called.
+"""
+
+from django.db import models
+
+class Category(models.Model):
+    name = models.CharField(maxlength=20)
+    class Meta:
+       ordering = ('name',)
+
+    def __str__(self):
+        return self.name
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=50)
+    pub_date = models.DateTimeField()
+    primary_categories = models.ManyToManyField(Category, related_name='primary_article_set')
+    secondary_categories = models.ManyToManyField(Category, related_name='secondary_article_set')
+    class Meta:
+       ordering = ('pub_date',)
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+>>> from datetime import datetime
+
+>>> c1 = Category(name='Sports')
+>>> c1.save()
+>>> c2 = Category(name='News')
+>>> c2.save()
+>>> c3 = Category(name='Crime')
+>>> c3.save()
+>>> c4 = Category(name='Life')
+>>> c4.save()
+
+>>> a1 = Article(headline='Area man steals', pub_date=datetime(2005, 11, 27))
+>>> a1.save()
+>>> a1.primary_categories.add(c2, c3)
+>>> a1.secondary_categories.add(c4)
+
+>>> a2 = Article(headline='Area man runs', pub_date=datetime(2005, 11, 28))
+>>> a2.save()
+>>> a2.primary_categories.add(c1, c2)
+>>> a2.secondary_categories.add(c4)
+
+>>> a1.primary_categories.all()
+[<Category: Crime>, <Category: News>]
+
+>>> a2.primary_categories.all()
+[<Category: News>, <Category: Sports>]
+
+>>> a1.secondary_categories.all()
+[<Category: Life>]
+
+
+>>> c1.primary_article_set.all()
+[<Article: Area man runs>]
+>>> c1.secondary_article_set.all()
+[]
+>>> c2.primary_article_set.all()
+[<Article: Area man steals>, <Article: Area man runs>]
+>>> c2.secondary_article_set.all()
+[]
+>>> c3.primary_article_set.all()
+[<Article: Area man steals>]
+>>> c3.secondary_article_set.all()
+[]
+>>> c4.primary_article_set.all()
+[]
+>>> c4.secondary_article_set.all()
+[<Article: Area man steals>, <Article: Area man runs>]
+"""

Added: vendor/django/current/tests/modeltests/m2m_recursive/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/m2m_recursive/models.py
===================================================================
--- vendor/django/current/tests/modeltests/m2m_recursive/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/m2m_recursive/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,192 @@
+"""
+27. Many-to-many relationships between the same two tables
+
+In this example, A Person can have many friends, who are also people. Friendship is a
+symmetrical relationship - if I am your friend, you are my friend.
+
+A person can also have many idols - but while I may idolize you, you may not think
+the same of me. 'Idols' is an example of a non-symmetrical m2m field. Only recursive
+m2m fields may be non-symmetrical, and they are symmetrical by default.
+
+This test validates that the m2m table will create a mangled name for the m2m table if
+there will be a clash, and tests that symmetry is preserved where appropriate.
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    name = models.CharField(maxlength=20)
+    friends = models.ManyToManyField('self')
+    idols = models.ManyToManyField('self', symmetrical=False, related_name='stalkers')
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+>>> a = Person(name='Anne')
+>>> a.save()
+>>> b = Person(name='Bill')
+>>> b.save()
+>>> c = Person(name='Chuck')
+>>> c.save()
+>>> d = Person(name='David')
+>>> d.save()
+
+# Add some friends in the direction of field definition
+# Anne is friends with Bill and Chuck
+>>> a.friends.add(b,c)
+
+# David is friends with Anne and Chuck - add in reverse direction
+>>> d.friends.add(a,c)
+
+# Who is friends with Anne?
+>>> a.friends.all()
+[<Person: Bill>, <Person: Chuck>, <Person: David>]
+
+# Who is friends with Bill?
+>>> b.friends.all()
+[<Person: Anne>]
+
+# Who is friends with Chuck?
+>>> c.friends.all()
+[<Person: Anne>, <Person: David>]
+
+# Who is friends with David?
+>>> d.friends.all()
+[<Person: Anne>, <Person: Chuck>]
+
+# Bill is already friends with Anne - add Anne again, but in the reverse direction
+>>> b.friends.add(a)
+
+# Who is friends with Anne?
+>>> a.friends.all()
+[<Person: Bill>, <Person: Chuck>, <Person: David>]
+
+# Who is friends with Bill?
+>>> b.friends.all()
+[<Person: Anne>]
+
+# Remove Anne from Bill's friends
+>>> b.friends.remove(a)
+
+# Who is friends with Anne?
+>>> a.friends.all()
+[<Person: Chuck>, <Person: David>]
+
+# Who is friends with Bill?
+>>> b.friends.all()
+[]
+
+# Clear Anne's group of friends
+>>> a.friends.clear()
+
+# Who is friends with Anne?
+>>> a.friends.all()
+[]
+
+# Reverse relationships should also be gone
+# Who is friends with Chuck?
+>>> c.friends.all()
+[<Person: David>]
+
+# Who is friends with David?
+>>> d.friends.all()
+[<Person: Chuck>]
+
+
+# Add some idols in the direction of field definition
+# Anne idolizes Bill and Chuck
+>>> a.idols.add(b,c)
+
+# Bill idolizes Anne right back
+>>> b.idols.add(a)
+
+# David is idolized by Anne and Chuck - add in reverse direction
+>>> d.stalkers.add(a,c)
+
+# Who are Anne's idols?
+>>> a.idols.all()
+[<Person: Bill>, <Person: Chuck>, <Person: David>]
+
+# Who is stalking Anne?
+>>> a.stalkers.all()
+[<Person: Bill>]
+
+# Who are Bill's idols?
+>>> b.idols.all()
+[<Person: Anne>]
+
+# Who is stalking Bill?
+>>> b.stalkers.all()
+[<Person: Anne>]
+
+# Who are Chuck's idols?
+>>> c.idols.all()
+[<Person: David>]
+
+# Who is stalking Chuck?
+>>> c.stalkers.all()
+[<Person: Anne>]
+
+# Who are David's idols?
+>>> d.idols.all()
+[]
+
+# Who is stalking David
+>>> d.stalkers.all()
+[<Person: Anne>, <Person: Chuck>]
+
+# Bill is already being stalked by Anne - add Anne again, but in the reverse direction
+>>> b.stalkers.add(a)
+
+# Who are Anne's idols?
+>>> a.idols.all()
+[<Person: Bill>, <Person: Chuck>, <Person: David>]
+
+# Who is stalking Anne?
+[<Person: Bill>]
+
+# Who are Bill's idols
+>>> b.idols.all()
+[<Person: Anne>]
+
+# Who is stalking Bill?
+>>> b.stalkers.all()
+[<Person: Anne>]
+
+# Remove Anne from Bill's list of stalkers
+>>> b.stalkers.remove(a)
+
+# Who are Anne's idols?
+>>> a.idols.all()
+[<Person: Chuck>, <Person: David>]
+
+# Who is stalking Anne?
+>>> a.stalkers.all()
+[<Person: Bill>]
+
+# Who are Bill's idols?
+>>> b.idols.all()
+[<Person: Anne>]
+
+# Who is stalking Bill?
+>>> b.stalkers.all()
+[]
+
+# Clear Anne's group of idols
+>>> a.idols.clear()
+
+# Who are Anne's idols
+>>> a.idols.all()
+[]
+
+# Reverse relationships should also be gone
+# Who is stalking Chuck?
+>>> c.stalkers.all()
+[]
+
+# Who is friends with David?
+>>> d.stalkers.all()
+[<Person: Chuck>]
+
+"""

Added: vendor/django/current/tests/modeltests/m2o_recursive/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/m2o_recursive/models.py
===================================================================
--- vendor/django/current/tests/modeltests/m2o_recursive/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/m2o_recursive/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,40 @@
+"""
+11. Relating an object to itself, many-to-one
+
+To define a many-to-one relationship between a model and itself, use
+``ForeignKey('self')``.
+
+In this example, a ``Category`` is related to itself. That is, each
+``Category`` has a parent ``Category``.
+
+Set ``related_name`` to designate what the reverse relationship is called.
+"""
+
+from django.db import models
+
+class Category(models.Model):
+    name = models.CharField(maxlength=20)
+    parent = models.ForeignKey('self', null=True, related_name='child_set')
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+# Create a few Category objects.
+>>> r = Category(id=None, name='Root category', parent=None)
+>>> r.save()
+>>> c = Category(id=None, name='Child category', parent=r)
+>>> c.save()
+
+>>> r.child_set.all()
+[<Category: Child category>]
+>>> r.child_set.get(name__startswith='Child')
+<Category: Child category>
+>>> print r.parent
+None
+
+>>> c.child_set.all()
+[]
+>>> c.parent
+<Category: Root category>
+"""

Added: vendor/django/current/tests/modeltests/m2o_recursive2/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/m2o_recursive2/models.py
===================================================================
--- vendor/django/current/tests/modeltests/m2o_recursive2/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/m2o_recursive2/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,43 @@
+"""
+12. Relating a model to another model more than once
+
+In this example, a ``Person`` can have a ``mother`` and ``father`` -- both of
+which are other ``Person`` objects.
+
+Set ``related_name`` to designate what the reverse relationship is called.
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    full_name = models.CharField(maxlength=20)
+    mother = models.ForeignKey('self', null=True, related_name='mothers_child_set')
+    father = models.ForeignKey('self', null=True, related_name='fathers_child_set')
+
+    def __str__(self):
+        return self.full_name
+
+API_TESTS = """
+# Create two Person objects -- the mom and dad in our family.
+>>> dad = Person(full_name='John Smith Senior', mother=None, father=None)
+>>> dad.save()
+>>> mom = Person(full_name='Jane Smith', mother=None, father=None)
+>>> mom.save()
+
+# Give mom and dad a kid.
+>>> kid = Person(full_name='John Smith Junior', mother=mom, father=dad)
+>>> kid.save()
+
+>>> kid.mother
+<Person: Jane Smith>
+>>> kid.father
+<Person: John Smith Senior>
+>>> dad.fathers_child_set.all()
+[<Person: John Smith Junior>]
+>>> mom.mothers_child_set.all()
+[<Person: John Smith Junior>]
+>>> kid.mothers_child_set.all()
+[]
+>>> kid.fathers_child_set.all()
+[]
+"""

Added: vendor/django/current/tests/modeltests/manipulators/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/manipulators/models.py
===================================================================
--- vendor/django/current/tests/modeltests/manipulators/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/manipulators/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,91 @@
+"""
+26. Default manipulators
+
+Each model gets an AddManipulator and ChangeManipulator by default.
+"""
+
+from django.db import models
+
+class Musician(models.Model):
+    first_name = models.CharField(maxlength=30)
+    last_name = models.CharField(maxlength=30)
+
+    def __str__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+class Album(models.Model):
+    name = models.CharField(maxlength=100)
+    musician = models.ForeignKey(Musician)
+    release_date = models.DateField(blank=True, null=True)
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+>>> from django.utils.datastructures import MultiValueDict
+
+# Create a Musician object via the default AddManipulator.
+>>> man = Musician.AddManipulator()
+>>> data = MultiValueDict({'first_name': ['Ella'], 'last_name': ['Fitzgerald']})
+
+>>> man.get_validation_errors(data)
+{}
+>>> man.do_html2python(data)
+>>> m1 = man.save(data)
+
+# Verify it worked.
+>>> Musician.objects.all()
+[<Musician: Ella Fitzgerald>]
+>>> [m1] == list(Musician.objects.all())
+True
+
+# Attempt to add a Musician without a first_name.
+>>> man.get_validation_errors(MultiValueDict({'last_name': ['Blakey']}))
+{'first_name': ['This field is required.']}
+
+# Attempt to add a Musician without a first_name and last_name.
+>>> man.get_validation_errors(MultiValueDict({}))
+{'first_name': ['This field is required.'], 'last_name': ['This field is required.']}
+
+# Attempt to create an Album without a name or musician.
+>>> man = Album.AddManipulator()
+>>> man.get_validation_errors(MultiValueDict({}))
+{'musician': ['This field is required.'], 'name': ['This field is required.']}
+
+# Attempt to create an Album with an invalid musician.
+>>> man.get_validation_errors(MultiValueDict({'name': ['Sallies Fforth'], 'musician': ['foo']}))
+{'musician': ["Select a valid choice; 'foo' is not in ['', '1']."]}
+
+# Attempt to create an Album with an invalid release_date.
+>>> man.get_validation_errors(MultiValueDict({'name': ['Sallies Fforth'], 'musician': ['1'], 'release_date': 'today'}))
+{'release_date': ['Enter a valid date in YYYY-MM-DD format.']}
+
+# Create an Album without a release_date (because it's optional).
+>>> data = MultiValueDict({'name': ['Ella and Basie'], 'musician': ['1']})
+>>> man.get_validation_errors(data)
+{}
+>>> man.do_html2python(data)
+>>> a1 = man.save(data)
+
+# Verify it worked.
+>>> Album.objects.all()
+[<Album: Ella and Basie>]
+>>> Album.objects.get().musician
+<Musician: Ella Fitzgerald>
+
+# Create an Album with a release_date.
+>>> data = MultiValueDict({'name': ['Ultimate Ella'], 'musician': ['1'], 'release_date': ['2005-02-13']})
+>>> man.get_validation_errors(data)
+{}
+>>> man.do_html2python(data)
+>>> a2 = man.save(data)
+
+# Verify it worked.
+>>> Album.objects.order_by('name')
+[<Album: Ella and Basie>, <Album: Ultimate Ella>]
+>>> a2 = Album.objects.get(pk=2)
+>>> a2
+<Album: Ultimate Ella>
+>>> a2.release_date
+datetime.date(2005, 2, 13)
+"""

Added: vendor/django/current/tests/modeltests/many_to_many/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/many_to_many/models.py
===================================================================
--- vendor/django/current/tests/modeltests/many_to_many/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/many_to_many/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,234 @@
+"""
+5. Many-to-many relationships
+
+To define a many-to-many relationship, use ManyToManyField().
+
+In this example, an article can be published in multiple publications,
+and a publication has multiple articles.
+"""
+
+from django.db import models
+
+class Publication(models.Model):
+    title = models.CharField(maxlength=30)
+
+    def __str__(self):
+        return self.title
+
+    class Meta:
+        ordering = ('title',)
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    publications = models.ManyToManyField(Publication)
+
+    def __str__(self):
+        return self.headline
+
+    class Meta:
+        ordering = ('headline',)
+
+API_TESTS = """
+# Create a couple of Publications.
+>>> p1 = Publication(id=None, title='The Python Journal')
+>>> p1.save()
+>>> p2 = Publication(id=None, title='Science News')
+>>> p2.save()
+>>> p3 = Publication(id=None, title='Science Weekly')
+>>> p3.save()
+
+# Create an Article.
+>>> a1 = Article(id=None, headline='Django lets you build Web apps easily')
+>>> a1.save()
+
+# Associate the Article with a Publication.
+>>> a1.publications.add(p1)
+
+# Create another Article, and set it to appear in both Publications.
+>>> a2 = Article(id=None, headline='NASA uses Python')
+>>> a2.save()
+>>> a2.publications.add(p1, p2)
+>>> a2.publications.add(p3)
+
+# Adding a second time is OK
+>>> a2.publications.add(p3)
+
+# Add a Publication directly via publications.add by using keyword arguments.
+>>> new_publication = a2.publications.create(title='Highlights for Children')
+
+# Article objects have access to their related Publication objects.
+>>> a1.publications.all()
+[<Publication: The Python Journal>]
+>>> a2.publications.all()
+[<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]
+
+# Publication objects have access to their related Article objects.
+>>> p2.article_set.all()
+[<Article: NASA uses Python>]
+>>> p1.article_set.all()
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+>>> Publication.objects.get(id=4).article_set.all()
+[<Article: NASA uses Python>]
+
+# We can perform kwarg queries across m2m relationships
+>>> Article.objects.filter(publications__id__exact=1)
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+>>> Article.objects.filter(publications__pk=1)
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+>>> Article.objects.filter(publications=1)
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+>>> Article.objects.filter(publications=p1)
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+
+>>> Article.objects.filter(publications__title__startswith="Science")
+[<Article: NASA uses Python>, <Article: NASA uses Python>]
+
+>>> Article.objects.filter(publications__title__startswith="Science").distinct()
+[<Article: NASA uses Python>]
+
+# The count() function respects distinct() as well.
+>>> Article.objects.filter(publications__title__startswith="Science").count()
+2
+
+>>> Article.objects.filter(publications__title__startswith="Science").distinct().count()
+1
+
+>>> Article.objects.filter(publications__in=[1,2]).distinct()
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+>>> Article.objects.filter(publications__in=[1,p2]).distinct()
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+>>> Article.objects.filter(publications__in=[p1,p2]).distinct()
+[<Article: Django lets you build Web apps easily>, <Article: NASA uses Python>]
+
+# Reverse m2m queries are supported (i.e., starting at the table that doesn't
+# have a ManyToManyField).
+>>> Publication.objects.filter(id__exact=1)
+[<Publication: The Python Journal>]
+>>> Publication.objects.filter(pk=1)
+[<Publication: The Python Journal>]
+
+>>> Publication.objects.filter(article__headline__startswith="NASA")
+[<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]
+
+>>> Publication.objects.filter(article__id__exact=1)
+[<Publication: The Python Journal>]
+>>> Publication.objects.filter(article__pk=1)
+[<Publication: The Python Journal>]
+>>> Publication.objects.filter(article=1)
+[<Publication: The Python Journal>]
+>>> Publication.objects.filter(article=a1)
+[<Publication: The Python Journal>]
+
+>>> Publication.objects.filter(article__in=[1,2]).distinct()
+[<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]
+>>> Publication.objects.filter(article__in=[1,a2]).distinct()
+[<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]
+>>> Publication.objects.filter(article__in=[a1,a2]).distinct()
+[<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>, <Publication: The Python Journal>]
+
+# If we delete a Publication, its Articles won't be able to access it.
+>>> p1.delete()
+>>> Publication.objects.all()
+[<Publication: Highlights for Children>, <Publication: Science News>, <Publication: Science Weekly>]
+>>> a1 = Article.objects.get(pk=1)
+>>> a1.publications.all()
+[]
+
+# If we delete an Article, its Publications won't be able to access it.
+>>> a2.delete()
+>>> Article.objects.all()
+[<Article: Django lets you build Web apps easily>]
+>>> p2.article_set.all()
+[]
+
+# Adding via the 'other' end of an m2m
+>>> a4 = Article(headline='NASA finds intelligent life on Earth')
+>>> a4.save()
+>>> p2.article_set.add(a4)
+>>> p2.article_set.all()
+[<Article: NASA finds intelligent life on Earth>]
+>>> a4.publications.all()
+[<Publication: Science News>]
+
+# Adding via the other end using keywords
+>>> new_article = p2.article_set.create(headline='Oxygen-free diet works wonders')
+>>> p2.article_set.all()
+[<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]
+>>> a5 = p2.article_set.all()[1]
+>>> a5.publications.all()
+[<Publication: Science News>]
+
+# Removing publication from an article:
+>>> a4.publications.remove(p2)
+>>> p2.article_set.all()
+[<Article: Oxygen-free diet works wonders>]
+>>> a4.publications.all()
+[]
+
+# And from the other end
+>>> p2.article_set.remove(a5)
+>>> p2.article_set.all()
+[]
+>>> a5.publications.all()
+[]
+
+# Relation sets can be assigned. Assignment clears any existing set members
+>>> p2.article_set = [a4, a5]
+>>> p2.article_set.all()
+[<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]
+>>> a4.publications.all()
+[<Publication: Science News>]
+>>> a4.publications = [p3]
+>>> p2.article_set.all()
+[<Article: Oxygen-free diet works wonders>]
+>>> a4.publications.all()
+[<Publication: Science Weekly>]
+
+# Relation sets can be cleared:
+>>> p2.article_set.clear()
+>>> p2.article_set.all()
+[]
+>>> a4.publications.all()
+[<Publication: Science Weekly>]
+
+# And you can clear from the other end
+>>> p2.article_set.add(a4, a5)
+>>> p2.article_set.all()
+[<Article: NASA finds intelligent life on Earth>, <Article: Oxygen-free diet works wonders>]
+>>> a4.publications.all()
+[<Publication: Science News>, <Publication: Science Weekly>]
+>>> a4.publications.clear()
+>>> a4.publications.all()
+[]
+>>> p2.article_set.all()
+[<Article: Oxygen-free diet works wonders>]
+
+# Recreate the article and Publication we just deleted.
+>>> p1 = Publication(id=None, title='The Python Journal')
+>>> p1.save()
+>>> a2 = Article(id=None, headline='NASA uses Python')
+>>> a2.save()
+>>> a2.publications.add(p1, p2, p3)
+
+# Bulk delete some Publications - references to deleted publications should go
+>>> Publication.objects.filter(title__startswith='Science').delete()
+>>> Publication.objects.all()
+[<Publication: Highlights for Children>, <Publication: The Python Journal>]
+>>> Article.objects.all()
+[<Article: Django lets you build Web apps easily>, <Article: NASA finds intelligent life on Earth>, <Article: NASA uses Python>, <Article: Oxygen-free diet works wonders>]
+>>> a2.publications.all()
+[<Publication: The Python Journal>]
+
+# Bulk delete some articles - references to deleted objects should go
+>>> q = Article.objects.filter(headline__startswith='Django')
+>>> print q
+[<Article: Django lets you build Web apps easily>]
+>>> q.delete()
+
+# After the delete, the QuerySet cache needs to be cleared, and the referenced objects should be gone
+>>> print q
+[]
+>>> p1.article_set.all()
+[<Article: NASA uses Python>]
+
+"""

Added: vendor/django/current/tests/modeltests/many_to_one/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/many_to_one/models.py
===================================================================
--- vendor/django/current/tests/modeltests/many_to_one/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/many_to_one/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,266 @@
+"""
+4. Many-to-one relationships
+
+To define a many-to-one relationship, use ``ForeignKey()`` .
+"""
+
+from django.db import models
+
+class Reporter(models.Model):
+    first_name = models.CharField(maxlength=30)
+    last_name = models.CharField(maxlength=30)
+    email = models.EmailField()
+
+    def __str__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    pub_date = models.DateField()
+    reporter = models.ForeignKey(Reporter)
+
+    def __str__(self):
+        return self.headline
+
+    class Meta:
+        ordering = ('headline',)
+
+API_TESTS = """
+# Create a few Reporters.
+>>> r = Reporter(first_name='John', last_name='Smith', email='john at example.com')
+>>> r.save()
+
+>>> r2 = Reporter(first_name='Paul', last_name='Jones', email='paul at example.com')
+>>> r2.save()
+
+# Create an Article.
+>>> from datetime import datetime
+>>> a = Article(id=None, headline="This is a test", pub_date=datetime(2005, 7, 27), reporter=r)
+>>> a.save()
+
+>>> a.reporter.id
+1
+
+>>> a.reporter
+<Reporter: John Smith>
+
+# Article objects have access to their related Reporter objects.
+>>> r = a.reporter
+>>> r.first_name, r.last_name
+('John', 'Smith')
+
+# Create an Article via the Reporter object.
+>>> new_article = r.article_set.create(headline="John's second story", pub_date=datetime(2005, 7, 29))
+>>> new_article
+<Article: John's second story>
+>>> new_article.reporter.id
+1
+
+# Create a new article, and add it to the article set.
+>>> new_article2 = Article(headline="Paul's story", pub_date=datetime(2006, 1, 17))
+>>> r.article_set.add(new_article2)
+>>> new_article2.reporter.id
+1
+>>> r.article_set.all()
+[<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>]
+
+# Add the same article to a different article set - check that it moves.
+>>> r2.article_set.add(new_article2)
+>>> new_article2.reporter.id
+2
+>>> r.article_set.all()
+[<Article: John's second story>, <Article: This is a test>]
+>>> r2.article_set.all()
+[<Article: Paul's story>]
+
+# Assign the article to the reporter directly using the descriptor
+>>> new_article2.reporter = r
+>>> new_article2.save()
+>>> new_article2.reporter
+<Reporter: John Smith>
+>>> new_article2.reporter.id
+1
+>>> r.article_set.all()
+[<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>]
+>>> r2.article_set.all()
+[]
+
+# Set the article back again using set descriptor.
+>>> r2.article_set = [new_article, new_article2]
+>>> r.article_set.all()
+[<Article: This is a test>]
+>>> r2.article_set.all()
+[<Article: John's second story>, <Article: Paul's story>]
+
+# Funny case - assignment notation can only go so far; because the
+# ForeignKey cannot be null, existing members of the set must remain
+>>> r.article_set = [new_article]
+>>> r.article_set.all()
+[<Article: John's second story>, <Article: This is a test>]
+>>> r2.article_set.all()
+[<Article: Paul's story>]
+
+# Reporter cannot be null - there should not be a clear or remove method
+>>> hasattr(r2.article_set, 'remove')
+False
+>>> hasattr(r2.article_set, 'clear')
+False
+
+# Reporter objects have access to their related Article objects.
+>>> r.article_set.all()
+[<Article: John's second story>, <Article: This is a test>]
+
+>>> r.article_set.filter(headline__startswith='This')
+[<Article: This is a test>]
+
+>>> r.article_set.count()
+2
+
+>>> r2.article_set.count()
+1
+
+# Get articles by id
+>>> Article.objects.filter(id__exact=1)
+[<Article: This is a test>]
+>>> Article.objects.filter(pk=1)
+[<Article: This is a test>]
+
+# Query on an article property
+>>> Article.objects.filter(headline__startswith='This')
+[<Article: This is a test>]
+
+# The API automatically follows relationships as far as you need.
+# Use double underscores to separate relationships.
+# This works as many levels deep as you want. There's no limit.
+# Find all Articles for any Reporter whose first name is "John".
+>>> Article.objects.filter(reporter__first_name__exact='John')
+[<Article: John's second story>, <Article: This is a test>]
+
+# Check that implied __exact also works
+>>> Article.objects.filter(reporter__first_name='John')
+[<Article: John's second story>, <Article: This is a test>]
+
+# Query twice over the related field.
+>>> Article.objects.filter(reporter__first_name__exact='John', reporter__last_name__exact='Smith')
+[<Article: John's second story>, <Article: This is a test>]
+
+# The underlying query only makes one join when a related table is referenced twice.
+>>> query = Article.objects.filter(reporter__first_name__exact='John', reporter__last_name__exact='Smith')
+>>> null, sql, null = query._get_sql_clause()
+>>> sql.count('INNER JOIN')
+1
+
+# The automatically joined table has a predictable name.
+>>> Article.objects.filter(reporter__first_name__exact='John').extra(where=["many_to_one_article__reporter.last_name='Smith'"])
+[<Article: John's second story>, <Article: This is a test>]
+
+# Find all Articles for the Reporter whose ID is 1.
+# Use direct ID check, pk check, and object comparison 
+>>> Article.objects.filter(reporter__id__exact=1)
+[<Article: John's second story>, <Article: This is a test>]
+>>> Article.objects.filter(reporter__pk=1)
+[<Article: John's second story>, <Article: This is a test>]
+>>> Article.objects.filter(reporter=1)
+[<Article: John's second story>, <Article: This is a test>]
+>>> Article.objects.filter(reporter=r)
+[<Article: John's second story>, <Article: This is a test>]
+
+>>> Article.objects.filter(reporter__in=[1,2]).distinct()
+[<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>]
+>>> Article.objects.filter(reporter__in=[r,r2]).distinct()
+[<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>]
+
+# You need two underscores between "reporter" and "id" -- not one.
+>>> Article.objects.filter(reporter_id__exact=1)
+Traceback (most recent call last):
+    ...
+TypeError: Cannot resolve keyword 'reporter_id' into field
+
+# You need to specify a comparison clause
+>>> Article.objects.filter(reporter_id=1)
+Traceback (most recent call last):
+    ...
+TypeError: Cannot resolve keyword 'reporter_id' into field
+
+# You can also instantiate an Article by passing
+# the Reporter's ID instead of a Reporter object.
+>>> a3 = Article(id=None, headline="This is a test", pub_date=datetime(2005, 7, 27), reporter_id=r.id)
+>>> a3.save()
+>>> a3.reporter.id
+1
+>>> a3.reporter
+<Reporter: John Smith>
+
+# Similarly, the reporter ID can be a string.
+>>> a4 = Article(id=None, headline="This is a test", pub_date=datetime(2005, 7, 27), reporter_id="1")
+>>> a4.save()
+>>> a4.reporter
+<Reporter: John Smith>
+
+# Reporters can be queried
+>>> Reporter.objects.filter(id__exact=1)
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(pk=1)
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(first_name__startswith='John')
+[<Reporter: John Smith>]
+
+# Reporters can query in opposite direction of ForeignKey definition
+>>> Reporter.objects.filter(article__id__exact=1)
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(article__pk=1)
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(article=1)
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(article=a)
+[<Reporter: John Smith>]
+
+>>> Reporter.objects.filter(article__in=[1,4]).distinct()
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(article__in=[1,a3]).distinct()
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(article__in=[a,a3]).distinct()
+[<Reporter: John Smith>]
+
+>>> Reporter.objects.filter(article__headline__startswith='This')
+[<Reporter: John Smith>, <Reporter: John Smith>, <Reporter: John Smith>]
+>>> Reporter.objects.filter(article__headline__startswith='This').distinct()
+[<Reporter: John Smith>]
+
+# Counting in the opposite direction works in conjunction with distinct()
+>>> Reporter.objects.filter(article__headline__startswith='This').count()
+3
+>>> Reporter.objects.filter(article__headline__startswith='This').distinct().count()
+1
+
+# Queries can go round in circles.
+>>> Reporter.objects.filter(article__reporter__first_name__startswith='John')
+[<Reporter: John Smith>, <Reporter: John Smith>, <Reporter: John Smith>, <Reporter: John Smith>]
+>>> Reporter.objects.filter(article__reporter__first_name__startswith='John').distinct()
+[<Reporter: John Smith>]
+>>> Reporter.objects.filter(article__reporter__exact=r).distinct()
+[<Reporter: John Smith>]
+
+# Check that implied __exact also works
+>>> Reporter.objects.filter(article__reporter=r).distinct()
+[<Reporter: John Smith>]
+
+# If you delete a reporter, his articles will be deleted.
+>>> Article.objects.all()
+[<Article: John's second story>, <Article: Paul's story>, <Article: This is a test>, <Article: This is a test>, <Article: This is a test>]
+>>> Reporter.objects.order_by('first_name')
+[<Reporter: John Smith>, <Reporter: Paul Jones>]
+>>> r2.delete()
+>>> Article.objects.all()
+[<Article: John's second story>, <Article: This is a test>, <Article: This is a test>, <Article: This is a test>]
+>>> Reporter.objects.order_by('first_name')
+[<Reporter: John Smith>]
+
+# Deletes using a join in the query
+>>> Reporter.objects.filter(article__headline__startswith='This').delete()
+>>> Reporter.objects.all()
+[]
+>>> Article.objects.all()
+[]
+
+"""

Added: vendor/django/current/tests/modeltests/many_to_one_null/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/many_to_one_null/models.py
===================================================================
--- vendor/django/current/tests/modeltests/many_to_one_null/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/many_to_one_null/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,124 @@
+"""
+16. Many-to-one relationships that can be null
+
+To define a many-to-one relationship that can have a null foreign key, use
+``ForeignKey()`` with ``null=True`` .
+"""
+
+from django.db import models
+
+class Reporter(models.Model):
+    name = models.CharField(maxlength=30)
+
+    def __str__(self):
+        return self.name
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    reporter = models.ForeignKey(Reporter, null=True)
+
+    class Meta:
+        ordering = ('headline',)
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+# Create a Reporter.
+>>> r = Reporter(name='John Smith')
+>>> r.save()
+
+# Create an Article.
+>>> a = Article(headline="First", reporter=r)
+>>> a.save()
+
+>>> a.reporter.id
+1
+
+>>> a.reporter
+<Reporter: John Smith>
+
+# Article objects have access to their related Reporter objects.
+>>> r = a.reporter
+
+# Create an Article via the Reporter object.
+>>> a2 = r.article_set.create(headline="Second")
+>>> a2
+<Article: Second>
+>>> a2.reporter.id
+1
+
+# Reporter objects have access to their related Article objects.
+>>> r.article_set.all()
+[<Article: First>, <Article: Second>]
+>>> r.article_set.filter(headline__startswith='Fir')
+[<Article: First>]
+>>> r.article_set.count()
+2
+
+# Create an Article with no Reporter by passing "reporter=None".
+>>> a3 = Article(headline="Third", reporter=None)
+>>> a3.save()
+>>> a3.id
+3
+>>> print a3.reporter
+None
+
+# Need to reget a3 to refresh the cache
+>>> a3 = Article.objects.get(pk=3)
+>>> print a3.reporter.id
+Traceback (most recent call last):
+    ...
+AttributeError: 'NoneType' object has no attribute 'id'
+
+# Accessing an article's 'reporter' attribute returns None
+# if the reporter is set to None.
+>>> print a3.reporter
+None
+
+# To retrieve the articles with no reporters set, use "reporter__isnull=True".
+>>> Article.objects.filter(reporter__isnull=True)
+[<Article: Third>]
+
+# Set the reporter for the Third article
+>>> r.article_set.add(a3)
+>>> r.article_set.all()
+[<Article: First>, <Article: Second>, <Article: Third>]
+
+# Remove an article from the set, and check that it was removed.
+>>> r.article_set.remove(a3)
+>>> r.article_set.all()
+[<Article: First>, <Article: Second>]
+>>> Article.objects.filter(reporter__isnull=True)
+[<Article: Third>]
+
+# Create another article and reporter
+>>> r2 = Reporter(name='Paul Jones')
+>>> r2.save()
+>>> a4 = r2.article_set.create(headline='Fourth')
+>>> r2.article_set.all()
+[<Article: Fourth>]
+
+# Try to remove a4 from a set it does not belong to
+>>> r.article_set.remove(a4)
+Traceback (most recent call last):
+...
+DoesNotExist: <Article: Fourth> is not related to <Reporter: John Smith>.
+
+>>> r2.article_set.all()
+[<Article: Fourth>]
+
+# Use descriptor assignment to allocate ForeignKey. Null is legal, so
+# existing members of set that are not in the assignment set are set null
+>>> r2.article_set = [a2, a3]
+>>> r2.article_set.all()
+[<Article: Second>, <Article: Third>]
+
+# Clear the rest of the set
+>>> r.article_set.clear()
+>>> r.article_set.all()
+[]
+>>> Article.objects.filter(reporter__isnull=True)
+[<Article: First>, <Article: Fourth>]
+
+"""

Added: vendor/django/current/tests/modeltests/model_inheritance/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/model_inheritance/models.py
===================================================================
--- vendor/django/current/tests/modeltests/model_inheritance/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/model_inheritance/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,53 @@
+"""
+XX. Model inheritance
+
+Model inheritance isn't yet supported.
+"""
+
+from django.db import models
+
+class Place(models.Model):
+    name = models.CharField(maxlength=50)
+    address = models.CharField(maxlength=80)
+
+    def __str__(self):
+        return "%s the place" % self.name
+
+class Restaurant(Place):
+    serves_hot_dogs = models.BooleanField()
+    serves_pizza = models.BooleanField()
+
+    def __str__(self):
+        return "%s the restaurant" % self.name
+
+class ItalianRestaurant(Restaurant):
+    serves_gnocchi = models.BooleanField()
+
+    def __str__(self):
+        return "%s the italian restaurant" % self.name
+
+API_TESTS = """
+# Make sure Restaurant has the right fields in the right order.
+>>> [f.name for f in Restaurant._meta.fields]
+['id', 'name', 'address', 'serves_hot_dogs', 'serves_pizza']
+
+# Make sure ItalianRestaurant has the right fields in the right order.
+>>> [f.name for f in ItalianRestaurant._meta.fields]
+['id', 'name', 'address', 'serves_hot_dogs', 'serves_pizza', 'serves_gnocchi']
+
+# Create a couple of Places.
+>>> p1 = Place(name='Master Shakes', address='666 W. Jersey')
+>>> p1.save()
+>>> p2 = Place(name='Ace Hardware', address='1013 N. Ashland')
+>>> p2.save()
+
+# Test constructor for Restaurant.
+>>> r = Restaurant(name='Demon Dogs', address='944 W. Fullerton', serves_hot_dogs=True, serves_pizza=False)
+>>> r.save()
+
+# Test the constructor for ItalianRestaurant.
+>>> ir = ItalianRestaurant(name='Ristorante Miron', address='1234 W. Elm', serves_hot_dogs=False, serves_pizza=False, serves_gnocchi=True)
+>>> ir.save()
+
+
+"""

Added: vendor/django/current/tests/modeltests/mutually_referential/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/mutually_referential/models.py
===================================================================
--- vendor/django/current/tests/modeltests/mutually_referential/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/mutually_referential/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,32 @@
+"""
+24. Mutually referential many-to-one relationships
+
+To define a many-to-one relationship, use ``ForeignKey()`` .
+"""
+
+from django.db.models import *
+
+class Parent(Model):
+    name = CharField(maxlength=100, core=True)
+    bestchild = ForeignKey("Child", null=True, related_name="favoured_by")
+
+class Child(Model):
+    name = CharField(maxlength=100)
+    parent = ForeignKey(Parent)
+
+API_TESTS = """
+# Create a Parent
+>>> q = Parent(name='Elizabeth')
+>>> q.save()
+
+# Create some children
+>>> c = q.child_set.create(name='Charles')
+>>> e = q.child_set.create(name='Edward')
+
+# Set the best child
+>>> q.bestchild = c
+>>> q.save()
+
+>>> q.delete()
+
+"""
\ No newline at end of file

Added: vendor/django/current/tests/modeltests/one_to_one/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/one_to_one/models.py
===================================================================
--- vendor/django/current/tests/modeltests/one_to_one/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/one_to_one/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,154 @@
+"""
+10. One-to-one relationships
+
+To define a one-to-one relationship, use ``OneToOneField()``.
+
+In this example, a ``Place`` optionally can be a ``Restaurant``.
+"""
+
+from django.db import models
+
+class Place(models.Model):
+    name = models.CharField(maxlength=50)
+    address = models.CharField(maxlength=80)
+
+    def __str__(self):
+        return "%s the place" % self.name
+
+class Restaurant(models.Model):
+    place = models.OneToOneField(Place)
+    serves_hot_dogs = models.BooleanField()
+    serves_pizza = models.BooleanField()
+
+    def __str__(self):
+        return "%s the restaurant" % self.place.name
+
+class Waiter(models.Model):
+    restaurant = models.ForeignKey(Restaurant)
+    name = models.CharField(maxlength=50)
+
+    def __str__(self):
+        return "%s the waiter at %s" % (self.name, self.restaurant)
+
+API_TESTS = """
+# Create a couple of Places.
+>>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
+>>> p1.save()
+>>> p2 = Place(name='Ace Hardware', address='1013 N. Ashland')
+>>> p2.save()
+
+# Create a Restaurant. Pass the ID of the "parent" object as this object's ID.
+>>> r = Restaurant(place=p1, serves_hot_dogs=True, serves_pizza=False)
+>>> r.save()
+
+# A Restaurant can access its place.
+>>> r.place
+<Place: Demon Dogs the place>
+
+# A Place can access its restaurant, if available.
+>>> p1.restaurant
+<Restaurant: Demon Dogs the restaurant>
+
+# p2 doesn't have an associated restaurant.
+>>> p2.restaurant
+Traceback (most recent call last):
+    ...
+DoesNotExist: Restaurant matching query does not exist.
+
+# Set the place using assignment notation. Because place is the primary key on Restaurant,
+# the save will create a new restaurant
+>>> r.place = p2
+>>> r.save()
+>>> p2.restaurant
+<Restaurant: Ace Hardware the restaurant>
+>>> r.place
+<Place: Ace Hardware the place>
+
+# Set the place back again, using assignment in the reverse direction
+# Need to reget restaurant object first, because the reverse set
+# can't update the existing restaurant instance
+>>> p1.restaurant = r
+>>> r.save()
+>>> p1.restaurant
+<Restaurant: Demon Dogs the restaurant>
+
+>>> r = Restaurant.objects.get(pk=1)
+>>> r.place
+<Place: Demon Dogs the place>
+
+# Restaurant.objects.all() just returns the Restaurants, not the Places.
+# Note that there are two restaurants - Ace Hardware the Restaurant was created
+# in the call to r.place = p2. This means there are multiple restaurants referencing
+# a single place...
+>>> Restaurant.objects.all()
+[<Restaurant: Demon Dogs the restaurant>, <Restaurant: Ace Hardware the restaurant>]
+
+# Place.objects.all() returns all Places, regardless of whether they have
+# Restaurants.
+>>> Place.objects.order_by('name')
+[<Place: Ace Hardware the place>, <Place: Demon Dogs the place>]
+
+>>> Restaurant.objects.get(place__id__exact=1)
+<Restaurant: Demon Dogs the restaurant>
+>>> Restaurant.objects.get(pk=1)
+<Restaurant: Demon Dogs the restaurant>
+>>> Restaurant.objects.get(place__exact=1)
+<Restaurant: Demon Dogs the restaurant>
+>>> Restaurant.objects.get(place__exact=p1)
+<Restaurant: Demon Dogs the restaurant>
+>>> Restaurant.objects.get(place=1)
+<Restaurant: Demon Dogs the restaurant>
+>>> Restaurant.objects.get(place=p1)
+<Restaurant: Demon Dogs the restaurant>
+>>> Restaurant.objects.get(place__pk=1)
+<Restaurant: Demon Dogs the restaurant>
+>>> Restaurant.objects.get(place__name__startswith="Demon")
+<Restaurant: Demon Dogs the restaurant>
+
+>>> Place.objects.get(id__exact=1)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(pk=1)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(restaurant__place__exact=1)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(restaurant__place__exact=p1)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(restaurant__pk=1)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(restaurant=1)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(restaurant=r)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(restaurant__exact=1)
+<Place: Demon Dogs the place>
+>>> Place.objects.get(restaurant__exact=r)
+<Place: Demon Dogs the place>
+
+# Add a Waiter to the Restaurant.
+>>> w = r.waiter_set.create(name='Joe')
+>>> w.save()
+>>> w
+<Waiter: Joe the waiter at Demon Dogs the restaurant>
+
+# Query the waiters
+>>> Waiter.objects.filter(restaurant__place__pk=1)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+>>> Waiter.objects.filter(restaurant__place__exact=1)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+>>> Waiter.objects.filter(restaurant__place__exact=p1)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+>>> Waiter.objects.filter(restaurant__pk=1)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+>>> Waiter.objects.filter(id__exact=1)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+>>> Waiter.objects.filter(pk=1)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+>>> Waiter.objects.filter(restaurant=1)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+>>> Waiter.objects.filter(restaurant=r)
+[<Waiter: Joe the waiter at Demon Dogs the restaurant>]
+
+# Delete the restaurant; the waiter should also be removed
+>>> r = Restaurant.objects.get(pk=1)
+>>> r.delete()
+"""

Added: vendor/django/current/tests/modeltests/or_lookups/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/or_lookups/models.py
===================================================================
--- vendor/django/current/tests/modeltests/or_lookups/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/or_lookups/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,104 @@
+"""
+19. OR lookups
+
+To perform an OR lookup, or a lookup that combines ANDs and ORs,
+combine QuerySet objects using & and | operators.
+
+Alternatively, use positional arguments, and pass one or more expressions
+of clauses using the variable ``django.db.models.Q`` (or any object with
+a get_sql method).
+
+
+"""
+
+from django.db import models
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=50)
+    pub_date = models.DateTimeField()
+
+    class Meta:
+       ordering = ('pub_date',)
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+>>> from datetime import datetime
+>>> from django.db.models import Q
+
+>>> a1 = Article(headline='Hello', pub_date=datetime(2005, 11, 27))
+>>> a1.save()
+
+>>> a2 = Article(headline='Goodbye', pub_date=datetime(2005, 11, 28))
+>>> a2.save()
+
+>>> a3 = Article(headline='Hello and goodbye', pub_date=datetime(2005, 11, 29))
+>>> a3.save()
+
+>>> Article.objects.filter(headline__startswith='Hello') |  Article.objects.filter(headline__startswith='Goodbye')
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+
+>>> Article.objects.filter(Q(headline__startswith='Hello') | Q(headline__startswith='Goodbye'))
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+
+>>> Article.objects.filter(Q(headline__startswith='Hello') & Q(headline__startswith='Goodbye'))
+[]
+
+# You can shorten this syntax with code like the following,
+# which is especially useful if building the query in stages:
+>>> articles = Article.objects.all()
+>>> articles.filter(headline__startswith='Hello') & articles.filter(headline__startswith='Goodbye')
+[]
+
+>>> articles.filter(headline__startswith='Hello') & articles.filter(headline__contains='bye')
+[<Article: Hello and goodbye>]
+
+>>> Article.objects.filter(Q(headline__contains='bye'), headline__startswith='Hello')
+[<Article: Hello and goodbye>]
+
+>>> Article.objects.filter(headline__contains='Hello') | Article.objects.filter(headline__contains='bye')
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+
+>>> Article.objects.filter(headline__iexact='Hello') | Article.objects.filter(headline__contains='ood')
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+
+>>> Article.objects.filter(Q(pk=1) | Q(pk=2))
+[<Article: Hello>, <Article: Goodbye>]
+
+>>> Article.objects.filter(Q(pk=1) | Q(pk=2) | Q(pk=3))
+[<Article: Hello>, <Article: Goodbye>, <Article: Hello and goodbye>]
+
+# Q arg objects are ANDed
+>>> Article.objects.filter(Q(headline__startswith='Hello'), Q(headline__contains='bye'))
+[<Article: Hello and goodbye>]
+
+# Q arg AND order is irrelevant
+>>> Article.objects.filter(Q(headline__contains='bye'), headline__startswith='Hello')
+[<Article: Hello and goodbye>]
+
+# Try some arg queries with operations other than get_list
+>>> Article.objects.get(Q(headline__startswith='Hello'), Q(headline__contains='bye'))
+<Article: Hello and goodbye>
+
+>>> Article.objects.filter(Q(headline__startswith='Hello') | Q(headline__contains='bye')).count()
+3
+
+>>> list(Article.objects.filter(Q(headline__startswith='Hello'), Q(headline__contains='bye')).values())
+[{'headline': 'Hello and goodbye', 'pub_date': datetime.datetime(2005, 11, 29, 0, 0), 'id': 3}]
+
+>>> Article.objects.filter(Q(headline__startswith='Hello')).in_bulk([1,2])
+{1: <Article: Hello>}
+
+# Demonstrating exclude with a Q object
+>>> Article.objects.exclude(Q(headline__startswith='Hello'))
+[<Article: Goodbye>]
+
+# The 'complex_filter' method supports framework features such as
+# 'limit_choices_to' which normally take a single dictionary of lookup arguments
+# but need to support arbitrary queries via Q objects too.
+>>> Article.objects.complex_filter({'pk': 1})
+[<Article: Hello>]
+>>> Article.objects.complex_filter(Q(pk=1) | Q(pk=2))
+[<Article: Hello>, <Article: Goodbye>]
+"""

Added: vendor/django/current/tests/modeltests/ordering/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/ordering/models.py
===================================================================
--- vendor/django/current/tests/modeltests/ordering/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/ordering/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,67 @@
+"""
+6. Specifying ordering
+
+Specify default ordering for a model using the ``ordering`` attribute, which
+should be a list or tuple of field names. This tells Django how to order the
+results of ``get_list()`` and other similar functions.
+
+If a field name in ``ordering`` starts with a hyphen, that field will be
+ordered in descending order. Otherwise, it'll be ordered in ascending order.
+The special-case field name ``"?"`` specifies random order.
+
+The ordering attribute is not required. If you leave it off, ordering will be
+undefined -- not random, just undefined.
+"""
+
+from django.db import models
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    pub_date = models.DateTimeField()
+    class Meta:
+        ordering = ('-pub_date', 'headline')
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+# Create a couple of Articles.
+>>> from datetime import datetime
+>>> a1 = Article(headline='Article 1', pub_date=datetime(2005, 7, 26))
+>>> a1.save()
+>>> a2 = Article(headline='Article 2', pub_date=datetime(2005, 7, 27))
+>>> a2.save()
+>>> a3 = Article(headline='Article 3', pub_date=datetime(2005, 7, 27))
+>>> a3.save()
+>>> a4 = Article(headline='Article 4', pub_date=datetime(2005, 7, 28))
+>>> a4.save()
+
+# By default, Article.objects.all() orders by pub_date descending, then
+# headline ascending.
+>>> Article.objects.all()
+[<Article: Article 4>, <Article: Article 2>, <Article: Article 3>, <Article: Article 1>]
+
+# Override ordering with order_by, which is in the same format as the ordering
+# attribute in models.
+>>> Article.objects.order_by('headline')
+[<Article: Article 1>, <Article: Article 2>, <Article: Article 3>, <Article: Article 4>]
+>>> Article.objects.order_by('pub_date', '-headline')
+[<Article: Article 1>, <Article: Article 3>, <Article: Article 2>, <Article: Article 4>]
+
+# Use the 'stop' part of slicing notation to limit the results.
+>>> Article.objects.order_by('headline')[:2]
+[<Article: Article 1>, <Article: Article 2>]
+
+# Use the 'stop' and 'start' parts of slicing notation to offset the result list.
+>>> Article.objects.order_by('headline')[1:3]
+[<Article: Article 2>, <Article: Article 3>]
+
+# Getting a single item should work too:
+>>> Article.objects.all()[0]
+<Article: Article 4>
+
+# Use '?' to order randomly. (We're using [...] in the output to indicate we
+# don't know what order the output will be in.
+>>> Article.objects.order_by('?')
+[...]
+"""

Added: vendor/django/current/tests/modeltests/pagination/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/pagination/models.py
===================================================================
--- vendor/django/current/tests/modeltests/pagination/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/pagination/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,67 @@
+"""
+29. Object pagination
+
+Django provides a framework for paginating a list of objects in a few lines
+of code. This is often useful for dividing search results or long lists of
+objects into easily readable pages.
+"""
+
+from django.db import models
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100, default='Default headline')
+    pub_date = models.DateTimeField()
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+# prepare a list of objects for pagination
+>>> from datetime import datetime
+>>> for x in range(1, 10):
+...     a = Article(headline='Article %s' % x, pub_date=datetime(2005, 7, 29))
+...     a.save()
+
+# create a basic paginator, 5 articles per page
+>>> from django.core.paginator import ObjectPaginator, InvalidPage
+>>> paginator = ObjectPaginator(Article.objects.all(), 5)
+
+# the paginator knows how many hits and pages it contains
+>>> paginator.hits
+9
+
+>>> paginator.pages
+2
+
+# get the first page (zero-based)
+>>> paginator.get_page(0)
+[<Article: Article 1>, <Article: Article 2>, <Article: Article 3>, <Article: Article 4>, <Article: Article 5>]
+
+# get the second page
+>>> paginator.get_page(1)
+[<Article: Article 6>, <Article: Article 7>, <Article: Article 8>, <Article: Article 9>]
+
+# does the first page have a next or previous page?
+>>> paginator.has_next_page(0)
+True
+
+>>> paginator.has_previous_page(0)
+False
+
+# check the second page
+>>> paginator.has_next_page(1)
+False
+
+>>> paginator.has_previous_page(1)
+True
+
+>>> paginator.first_on_page(0)
+1
+>>> paginator.first_on_page(1)
+6
+>>> paginator.last_on_page(0)
+5
+>>> paginator.last_on_page(1)
+9
+
+"""

Added: vendor/django/current/tests/modeltests/properties/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/properties/models.py
===================================================================
--- vendor/django/current/tests/modeltests/properties/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/properties/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,40 @@
+"""
+22. Using properties on models
+
+Use properties on models just like on any other Python object.
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    first_name = models.CharField(maxlength=30)
+    last_name = models.CharField(maxlength=30)
+
+    def _get_full_name(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+    def _set_full_name(self, combined_name):
+        self.first_name, self.last_name = combined_name.split(' ', 1)
+
+    full_name = property(_get_full_name)
+
+    full_name_2 = property(_get_full_name, _set_full_name)
+
+API_TESTS = """
+>>> a = Person(first_name='John', last_name='Lennon')
+>>> a.save()
+>>> a.full_name
+'John Lennon'
+
+# The "full_name" property hasn't provided a "set" method.
+>>> a.full_name = 'Paul McCartney'
+Traceback (most recent call last):
+    ...
+AttributeError: can't set attribute
+
+# But "full_name_2" has, and it can be used to initialise the class.
+>>> a2 = Person(full_name_2 = 'Paul McCartney')
+>>> a2.save()
+>>> a2.first_name
+'Paul'
+"""

Added: vendor/django/current/tests/modeltests/reserved_names/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/reserved_names/models.py
===================================================================
--- vendor/django/current/tests/modeltests/reserved_names/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/reserved_names/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,56 @@
+"""
+18. Using SQL reserved names
+
+Need to use a reserved SQL name as a column name or table name? Need to include
+a hyphen in a column or table name? No problem. Django quotes names
+appropriately behind the scenes, so your database won't complain about
+reserved-name usage.
+"""
+
+from django.db import models
+
+class Thing(models.Model):
+    when = models.CharField(maxlength=1, primary_key=True)
+    join = models.CharField(maxlength=1)
+    like = models.CharField(maxlength=1)
+    drop = models.CharField(maxlength=1)
+    alter = models.CharField(maxlength=1)
+    having = models.CharField(maxlength=1)
+    where = models.DateField(maxlength=1)
+    has_hyphen = models.CharField(maxlength=1, db_column='has-hyphen')
+    class Meta:
+       db_table = 'select'
+
+    def __str__(self):
+        return self.when
+
+API_TESTS = """
+>>> import datetime
+>>> day1 = datetime.date(2005, 1, 1)
+>>> day2 = datetime.date(2006, 2, 2)
+>>> t = Thing(when='a', join='b', like='c', drop='d', alter='e', having='f', where=day1, has_hyphen='h')
+>>> t.save()
+>>> print t.when
+a
+
+>>> u = Thing(when='h', join='i', like='j', drop='k', alter='l', having='m', where=day2)
+>>> u.save()
+>>> print u.when
+h
+
+>>> Thing.objects.order_by('when')
+[<Thing: a>, <Thing: h>]
+>>> v = Thing.objects.get(pk='a')
+>>> print v.join
+b
+>>> print v.where
+2005-01-01
+>>> Thing.objects.order_by('select.when')
+[<Thing: a>, <Thing: h>]
+
+>>> Thing.objects.dates('where', 'year')
+[datetime.datetime(2005, 1, 1, 0, 0), datetime.datetime(2006, 1, 1, 0, 0)]
+
+>>> Thing.objects.filter(where__month=1)
+[<Thing: a>]
+"""

Added: vendor/django/current/tests/modeltests/reverse_lookup/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/reverse_lookup/models.py
===================================================================
--- vendor/django/current/tests/modeltests/reverse_lookup/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/reverse_lookup/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,59 @@
+"""
+25. Reverse lookups
+
+This demonstrates the reverse lookup features of the database API.
+"""
+
+from django.db import models
+
+class User(models.Model):
+    name = models.CharField(maxlength=200)
+
+    def __str__(self):
+        return self.name
+
+class Poll(models.Model):
+    question = models.CharField(maxlength=200)
+    creator = models.ForeignKey(User)
+
+    def __str__(self):
+        return self.question
+
+class Choice(models.Model):
+    name = models.CharField(maxlength=100)
+    poll = models.ForeignKey(Poll, related_name="poll_choice")
+    related_poll = models.ForeignKey(Poll, related_name="related_choice")
+
+    def __str(self):
+        return self.name
+
+API_TESTS = """
+>>> john = User(name="John Doe")
+>>> john.save()
+>>> jim = User(name="Jim Bo")
+>>> jim.save()
+>>> first_poll = Poll(question="What's the first question?", creator=john)
+>>> first_poll.save()
+>>> second_poll = Poll(question="What's the second question?", creator=jim)
+>>> second_poll.save()
+>>> new_choice = Choice(poll=first_poll, related_poll=second_poll, name="This is the answer.")
+>>> new_choice.save()
+
+>>> # Reverse lookups by field name:
+>>> User.objects.get(poll__question__exact="What's the first question?")
+<User: John Doe>
+>>> User.objects.get(poll__question__exact="What's the second question?")
+<User: Jim Bo>
+
+>>> # Reverse lookups by related_name:
+>>> Poll.objects.get(poll_choice__name__exact="This is the answer.")
+<Poll: What's the first question?>
+>>> Poll.objects.get(related_choice__name__exact="This is the answer.")
+<Poll: What's the second question?>
+
+>>> # If a related_name is given you can't use the field name instead:
+>>> Poll.objects.get(choice__name__exact="This is the answer")
+Traceback (most recent call last):
+    ...
+TypeError: Cannot resolve keyword 'choice' into field
+"""

Added: vendor/django/current/tests/modeltests/save_delete_hooks/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/save_delete_hooks/models.py
===================================================================
--- vendor/django/current/tests/modeltests/save_delete_hooks/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/save_delete_hooks/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,42 @@
+"""
+13. Adding hooks before/after saving and deleting
+
+To execute arbitrary code around ``save()`` and ``delete()``, just subclass
+the methods.
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    first_name = models.CharField(maxlength=20)
+    last_name = models.CharField(maxlength=20)
+
+    def __str__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+    def save(self):
+        print "Before save"
+        super(Person, self).save() # Call the "real" save() method
+        print "After save"
+
+    def delete(self):
+        print "Before deletion"
+        super(Person, self).delete() # Call the "real" delete() method
+        print "After deletion"
+
+API_TESTS = """
+>>> p1 = Person(first_name='John', last_name='Smith')
+>>> p1.save()
+Before save
+After save
+
+>>> Person.objects.all()
+[<Person: John Smith>]
+
+>>> p1.delete()
+Before deletion
+After deletion
+
+>>> Person.objects.all()
+[]
+"""

Added: vendor/django/current/tests/modeltests/serializers/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/serializers/models.py
===================================================================
--- vendor/django/current/tests/modeltests/serializers/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/serializers/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,121 @@
+"""
+XXX. Serialization
+
+``django.core.serializers`` provides interfaces to converting Django querysets
+to and from "flat" data (i.e. strings).
+"""
+
+from django.db import models
+
+class Category(models.Model):
+    name = models.CharField(maxlength=20)
+
+    class Meta:
+       ordering = ('name',)
+
+    def __str__(self):
+        return self.name
+
+class Author(models.Model):
+    name = models.CharField(maxlength=20)
+
+    class Meta:
+        ordering = ('name',)
+    
+    def __str__(self):
+        return self.name
+
+class Article(models.Model):
+    author = models.ForeignKey(Author)
+    headline = models.CharField(maxlength=50)
+    pub_date = models.DateTimeField()
+    categories = models.ManyToManyField(Category)
+
+    class Meta:
+       ordering = ('pub_date',)
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+# Create some data:
+>>> from datetime import datetime
+>>> sports = Category(name="Sports")
+>>> music = Category(name="Music")
+>>> op_ed = Category(name="Op-Ed")
+>>> sports.save(); music.save(); op_ed.save()
+
+>>> joe = Author(name="Joe")
+>>> jane = Author(name="Jane")
+>>> joe.save(); jane.save()
+
+>>> a1 = Article(
+...     author = jane,
+...     headline = "Poker has no place on ESPN",
+...     pub_date = datetime(2006, 6, 16, 11, 00))
+>>> a2 = Article(
+...     author = joe,
+...     headline = "Time to reform copyright",
+...     pub_date = datetime(2006, 6, 16, 13, 00))
+>>> a1.save(); a2.save()
+>>> a1.categories = [sports, op_ed]
+>>> a2.categories = [music, op_ed]
+
+# Serialize a queryset to XML
+>>> from django.core import serializers
+>>> xml = serializers.serialize("xml", Article.objects.all())
+
+# The output is valid XML
+>>> from xml.dom import minidom
+>>> dom = minidom.parseString(xml)
+
+# Deserializing has a similar interface, except that special DeserializedObject
+# instances are returned.  This is because data might have changed in the 
+# database since the data was serialized (we'll simulate that below).
+>>> for obj in serializers.deserialize("xml", xml):
+...     print obj
+<DeserializedObject: Poker has no place on ESPN>
+<DeserializedObject: Time to reform copyright>
+
+# Deserializing data with different field values doesn't change anything in the
+# database until we call save():
+>>> xml = xml.replace("Poker has no place on ESPN", "Poker has no place on television")
+>>> objs = list(serializers.deserialize("xml", xml))
+
+# Even those I deserialized, the database hasn't been touched
+>>> Article.objects.all()
+[<Article: Poker has no place on ESPN>, <Article: Time to reform copyright>]
+
+# But when I save, the data changes as you might except.
+>>> objs[0].save()
+>>> Article.objects.all()
+[<Article: Poker has no place on television>, <Article: Time to reform copyright>]
+
+# Django also ships with a built-in JSON serializers
+>>> json = serializers.serialize("json", Category.objects.filter(pk=2))
+>>> json
+'[{"pk": "2", "model": "serializers.category", "fields": {"name": "Music"}}]'
+
+# You can easily create new objects by deserializing data with an empty PK
+# (It's easier to demo this with JSON...)
+>>> new_author_json = '[{"pk": null, "model": "serializers.author", "fields": {"name": "Bill"}}]'
+>>> for obj in serializers.deserialize("json", new_author_json):
+...     obj.save()
+>>> Author.objects.all()
+[<Author: Bill>, <Author: Jane>, <Author: Joe>]
+
+# All the serializers work the same
+>>> json = serializers.serialize("json", Article.objects.all())
+>>> for obj in serializers.deserialize("json", json):
+...     print obj
+<DeserializedObject: Poker has no place on television>
+<DeserializedObject: Time to reform copyright>
+
+>>> json = json.replace("Poker has no place on television", "Just kidding; I love TV poker")
+>>> for obj in serializers.deserialize("json", json):
+...     obj.save()
+
+>>> Article.objects.all()
+[<Article: Just kidding; I love TV poker>, <Article: Time to reform copyright>]
+
+"""

Added: vendor/django/current/tests/modeltests/str/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/str/models.py
===================================================================
--- vendor/django/current/tests/modeltests/str/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/str/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,31 @@
+"""
+2. Adding __str__() to models
+
+Although it's not a strict requirement, each model should have a ``__str__()``
+method to return a "human-readable" representation of the object. Do this not
+only for your own sanity when dealing with the interactive prompt, but also
+because objects' representations are used throughout Django's
+automatically-generated admin.
+"""
+
+from django.db import models
+
+class Article(models.Model):
+    headline = models.CharField(maxlength=100)
+    pub_date = models.DateTimeField()
+
+    def __str__(self):
+        return self.headline
+
+API_TESTS = """
+# Create an Article.
+>>> from datetime import datetime
+>>> a = Article(headline='Area man programs in Python', pub_date=datetime(2005, 7, 28))
+>>> a.save()
+
+>>> str(a)
+'Area man programs in Python'
+
+>>> a
+<Article: Area man programs in Python>
+"""

Added: vendor/django/current/tests/modeltests/transactions/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/transactions/models.py
===================================================================
--- vendor/django/current/tests/modeltests/transactions/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/transactions/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,99 @@
+"""
+15. Transactions
+
+Django handles transactions in three different ways. The default is to commit
+each transaction upon a write, but you can decorate a function to get
+commit-on-success behavior. Alternatively, you can manage the transaction
+manually.
+"""
+
+from django.db import models
+
+class Reporter(models.Model):
+    first_name = models.CharField(maxlength=30)
+    last_name = models.CharField(maxlength=30)
+    email = models.EmailField()
+
+    def __str__(self):
+        return "%s %s" % (self.first_name, self.last_name)
+
+API_TESTS = """
+>>> from django.db import connection, transaction
+"""
+
+from django.conf import settings
+
+building_docs = getattr(settings, 'BUILDING_DOCS', False)
+
+if building_docs or settings.DATABASE_ENGINE != 'mysql':
+    API_TESTS += """
+# the default behavior is to autocommit after each save() action
+>>> def create_a_reporter_then_fail(first, last):
+...     a = Reporter(first_name=first, last_name=last)
+...     a.save()
+...     raise Exception("I meant to do that")
+...
+>>> create_a_reporter_then_fail("Alice", "Smith")
+Traceback (most recent call last):
+    ...
+Exception: I meant to do that
+
+# The object created before the exception still exists
+>>> Reporter.objects.all()
+[<Reporter: Alice Smith>]
+
+# the autocommit decorator works exactly the same as the default behavior
+>>> autocomitted_create_then_fail = transaction.autocommit(create_a_reporter_then_fail)
+>>> autocomitted_create_then_fail("Ben", "Jones")
+Traceback (most recent call last):
+    ...
+Exception: I meant to do that
+
+# Same behavior as before
+>>> Reporter.objects.all()
+[<Reporter: Alice Smith>, <Reporter: Ben Jones>]
+
+# With the commit_on_success decorator, the transaction is only comitted if the
+# function doesn't throw an exception
+>>> committed_on_success = transaction.commit_on_success(create_a_reporter_then_fail)
+>>> committed_on_success("Carol", "Doe")
+Traceback (most recent call last):
+    ...
+Exception: I meant to do that
+
+# This time the object never got saved
+>>> Reporter.objects.all()
+[<Reporter: Alice Smith>, <Reporter: Ben Jones>]
+
+# If there aren't any exceptions, the data will get saved
+>>> def remove_a_reporter():
+...     r = Reporter.objects.get(first_name="Alice")
+...     r.delete()
+...
+>>> remove_comitted_on_success = transaction.commit_on_success(remove_a_reporter)
+>>> remove_comitted_on_success()
+>>> Reporter.objects.all()
+[<Reporter: Ben Jones>]
+
+# You can manually manage transactions if you really want to, but you
+# have to remember to commit/rollback
+>>> def manually_managed():
+...     r = Reporter(first_name="Carol", last_name="Doe")
+...     r.save()
+...     transaction.commit()
+>>> manually_managed = transaction.commit_manually(manually_managed)
+>>> manually_managed()
+>>> Reporter.objects.all()
+[<Reporter: Ben Jones>, <Reporter: Carol Doe>]
+
+# If you forget, you'll get bad errors
+>>> def manually_managed_mistake():
+...     r = Reporter(first_name="David", last_name="Davidson")
+...     r.save()
+...     # oops, I forgot to commit/rollback!
+>>> manually_managed_mistake = transaction.commit_manually(manually_managed_mistake)
+>>> manually_managed_mistake()
+Traceback (most recent call last):
+    ...
+TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK
+"""
\ No newline at end of file

Added: vendor/django/current/tests/modeltests/validation/__init__.py
===================================================================

Added: vendor/django/current/tests/modeltests/validation/models.py
===================================================================
--- vendor/django/current/tests/modeltests/validation/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/modeltests/validation/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,149 @@
+"""
+30. Validation
+
+This is an experimental feature!
+
+Each model instance has a validate() method that returns a dictionary of
+validation errors in the instance's fields. This method has a side effect
+of converting each field to its appropriate Python data type.
+"""
+
+from django.db import models
+
+class Person(models.Model):
+    is_child = models.BooleanField()
+    name = models.CharField(maxlength=20)
+    birthdate = models.DateField()
+    favorite_moment = models.DateTimeField()
+    email = models.EmailField()
+
+    def __str__(self):
+        return self.name
+
+API_TESTS = """
+
+>>> import datetime
+>>> valid_params = {
+...     'is_child': True,
+...     'name': 'John',
+...     'birthdate': datetime.date(2000, 5, 3),
+...     'favorite_moment': datetime.datetime(2002, 4, 3, 13, 23),
+...     'email': 'john at example.com'
+... }
+>>> p = Person(**valid_params)
+>>> p.validate()
+{}
+
+>>> p = Person(**dict(valid_params, id='23'))
+>>> p.validate()
+{}
+>>> p.id
+23
+
+>>> p = Person(**dict(valid_params, id='foo'))
+>>> p.validate()
+{'id': ['This value must be an integer.']}
+
+>>> p = Person(**dict(valid_params, id=None))
+>>> p.validate()
+{}
+>>> repr(p.id)
+'None'
+
+>>> p = Person(**dict(valid_params, is_child='t'))
+>>> p.validate()
+{}
+>>> p.is_child
+True
+
+>>> p = Person(**dict(valid_params, is_child='f'))
+>>> p.validate()
+{}
+>>> p.is_child
+False
+
+>>> p = Person(**dict(valid_params, is_child=True))
+>>> p.validate()
+{}
+>>> p.is_child
+True
+
+>>> p = Person(**dict(valid_params, is_child=False))
+>>> p.validate()
+{}
+>>> p.is_child
+False
+
+>>> p = Person(**dict(valid_params, is_child='foo'))
+>>> p.validate()
+{'is_child': ['This value must be either True or False.']}
+
+>>> p = Person(**dict(valid_params, name=u'Jose'))
+>>> p.validate()
+{}
+>>> p.name
+u'Jose'
+
+>>> p = Person(**dict(valid_params, name=227))
+>>> p.validate()
+{}
+>>> p.name
+'227'
+
+>>> p = Person(**dict(valid_params, birthdate=datetime.date(2000, 5, 3)))
+>>> p.validate()
+{}
+>>> p.birthdate
+datetime.date(2000, 5, 3)
+
+>>> p = Person(**dict(valid_params, birthdate=datetime.datetime(2000, 5, 3)))
+>>> p.validate()
+{}
+>>> p.birthdate
+datetime.date(2000, 5, 3)
+
+>>> p = Person(**dict(valid_params, birthdate='2000-05-03'))
+>>> p.validate()
+{}
+>>> p.birthdate
+datetime.date(2000, 5, 3)
+
+>>> p = Person(**dict(valid_params, birthdate='2000-5-3'))
+>>> p.validate()
+{}
+>>> p.birthdate
+datetime.date(2000, 5, 3)
+
+>>> p = Person(**dict(valid_params, birthdate='foo'))
+>>> p.validate()
+{'birthdate': ['Enter a valid date in YYYY-MM-DD format.']}
+
+>>> p = Person(**dict(valid_params, favorite_moment=datetime.datetime(2002, 4, 3, 13, 23)))
+>>> p.validate()
+{}
+>>> p.favorite_moment
+datetime.datetime(2002, 4, 3, 13, 23)
+
+>>> p = Person(**dict(valid_params, favorite_moment=datetime.datetime(2002, 4, 3)))
+>>> p.validate()
+{}
+>>> p.favorite_moment
+datetime.datetime(2002, 4, 3, 0, 0)
+
+>>> p = Person(**dict(valid_params, email='john at example.com'))
+>>> p.validate()
+{}
+>>> p.email
+'john at example.com'
+
+>>> p = Person(**dict(valid_params, email=u'john at example.com'))
+>>> p.validate()
+{}
+>>> p.email
+u'john at example.com'
+
+>>> p = Person(**dict(valid_params, email=22))
+>>> p.validate()
+{'email': ['Enter a valid e-mail address.']}
+
+"""

Added: vendor/django/current/tests/othertests/__init__.py
===================================================================

Added: vendor/django/current/tests/othertests/cache.py
===================================================================
--- vendor/django/current/tests/othertests/cache.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/cache.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,60 @@
+# Unit tests for cache framework
+# Uses whatever cache backend is set in the test settings file.
+
+from django.core.cache import cache
+import time
+
+# functions/classes for complex data type tests        
+def f():
+    return 42
+class C:
+    def m(n):
+        return 24
+
+# simple set/get
+cache.set("key", "value")
+assert cache.get("key") == "value"
+
+# get with non-existent keys
+assert cache.get("does not exist") is None
+assert cache.get("does not exist", "bang!") == "bang!"
+
+# get_many
+cache.set('a', 'a')
+cache.set('b', 'b')
+cache.set('c', 'c')
+cache.set('d', 'd')
+assert cache.get_many(['a', 'c', 'd']) == {'a' : 'a', 'c' : 'c', 'd' : 'd'}
+assert cache.get_many(['a', 'b', 'e']) == {'a' : 'a', 'b' : 'b'}
+
+# delete
+cache.set("key1", "spam")
+cache.set("key2", "eggs")
+assert cache.get("key1") == "spam"
+cache.delete("key1")
+assert cache.get("key1") is None
+assert cache.get("key2") == "eggs"
+
+# has_key
+cache.set("hello", "goodbye")
+assert cache.has_key("hello") == True
+assert cache.has_key("goodbye") == False
+
+# test data types
+stuff = {
+    'string'    : 'this is a string',
+    'int'       : 42,
+    'list'      : [1, 2, 3, 4],
+    'tuple'     : (1, 2, 3, 4),
+    'dict'      : {'A': 1, 'B' : 2},
+    'function'  : f,
+    'class'     : C,
+}
+for (key, value) in stuff.items():
+    cache.set(key, value)
+    assert cache.get(key) == value
+    
+# expiration
+cache.set('expire', 'very quickly', 1)
+time.sleep(2)
+assert cache.get("expire") == None

Added: vendor/django/current/tests/othertests/dateformat.py
===================================================================
--- vendor/django/current/tests/othertests/dateformat.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/dateformat.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,80 @@
+r"""
+>>> format(my_birthday, '')
+''
+>>> format(my_birthday, 'a')
+'p.m.'
+>>> format(my_birthday, 'A')
+'PM'
+>>> format(my_birthday, 'd')
+'08'
+>>> format(my_birthday, 'j')
+'8'
+>>> format(my_birthday, 'l')
+'Sunday'
+>>> format(my_birthday, 'L')
+'False'
+>>> format(my_birthday, 'm')
+'07'
+>>> format(my_birthday, 'M')
+'Jul'
+>>> format(my_birthday, 'n')
+'7'
+>>> format(my_birthday, 'N')
+'July'
+>>> format(my_birthday, 'O')
+'+0100'
+>>> format(my_birthday, 'P')
+'10 p.m.'
+>>> format(my_birthday, 'r')
+'Sun, 8 Jul 1979 22:00:00 +0100'
+>>> format(my_birthday, 's')
+'00'
+>>> format(my_birthday, 'S')
+'th'
+>>> format(my_birthday, 't')
+'31'
+>>> format(my_birthday, 'T')
+'CET'
+>>> format(my_birthday, 'U')
+'300531600'
+>>> format(my_birthday, 'w')
+'0'
+>>> format(my_birthday, 'W')
+'27'
+>>> format(my_birthday, 'y')
+'79'
+>>> format(my_birthday, 'Y')
+'1979'
+>>> format(my_birthday, 'z')
+'189'
+>>> format(my_birthday, 'Z')
+'3600'
+
+>>> format(summertime, 'I')
+'1'
+>>> format(summertime, 'O')
+'+0200'
+>>> format(wintertime, 'I')
+'0'
+>>> format(wintertime, 'O')
+'+0100'
+
+>>> format(my_birthday, r'Y z \C\E\T')
+'1979 189 CET'
+
+>>> format(my_birthday, r'jS o\f F')
+'8th of July'
+"""
+
+from django.utils import dateformat, translation
+import datetime, os, time
+
+format = dateformat.format
+os.environ['TZ'] = 'Europe/Copenhagen'
+translation.activate('en-us')
+
+time.tzset()
+
+my_birthday = datetime.datetime(1979, 7, 8, 22, 00)
+summertime = datetime.datetime(2005, 10, 30, 1, 00)
+wintertime = datetime.datetime(2005, 10, 30, 4, 00)

Added: vendor/django/current/tests/othertests/db_typecasts.py
===================================================================
--- vendor/django/current/tests/othertests/db_typecasts.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/db_typecasts.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,51 @@
+# Unit tests for typecast functions in django.db.backends.util
+
+from django.db.backends import util as typecasts
+import datetime
+
+TEST_CASES = {
+    'typecast_date': (
+        ('', None),
+        (None, None),
+        ('2005-08-11', datetime.date(2005, 8, 11)),
+        ('1990-01-01', datetime.date(1990, 1, 1)),
+    ),
+    'typecast_time': (
+        ('', None),
+        (None, None),
+        ('0:00:00', datetime.time(0, 0)),
+        ('0:30:00', datetime.time(0, 30)),
+        ('8:50:00', datetime.time(8, 50)),
+        ('08:50:00', datetime.time(8, 50)),
+        ('12:00:00', datetime.time(12, 00)),
+        ('12:30:00', datetime.time(12, 30)),
+        ('13:00:00', datetime.time(13, 00)),
+        ('23:59:00', datetime.time(23, 59)),
+        ('00:00:12', datetime.time(0, 0, 12)),
+        ('00:00:12.5', datetime.time(0, 0, 12, 500000)),
+        ('7:22:13.312', datetime.time(7, 22, 13, 312000)),
+    ),
+    'typecast_timestamp': (
+        ('', None),
+        (None, None),
+        ('2005-08-11 0:00:00', datetime.datetime(2005, 8, 11)),
+        ('2005-08-11 0:30:00', datetime.datetime(2005, 8, 11, 0, 30)),
+        ('2005-08-11 8:50:30', datetime.datetime(2005, 8, 11, 8, 50, 30)),
+        ('2005-08-11 8:50:30.123', datetime.datetime(2005, 8, 11, 8, 50, 30, 123000)),
+        ('2005-08-11 8:50:30.9', datetime.datetime(2005, 8, 11, 8, 50, 30, 900000)),
+        ('2005-08-11 8:50:30.312-05', datetime.datetime(2005, 8, 11, 8, 50, 30, 312000)),
+        ('2005-08-11 8:50:30.312+02', datetime.datetime(2005, 8, 11, 8, 50, 30, 312000)),
+    ),
+    'typecast_boolean': (
+        (None, None),
+        ('', False),
+        ('t', True),
+        ('f', False),
+        ('x', False),
+    ),
+}
+
+for k, v in TEST_CASES.items():
+    for inpt, expected in v:
+        got = getattr(typecasts, k)(inpt)
+        assert got == expected, "In %s: %r doesn't match %r. Got %r instead." % (k, inpt, expected, got)

Added: vendor/django/current/tests/othertests/defaultfilters.py
===================================================================
--- vendor/django/current/tests/othertests/defaultfilters.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/defaultfilters.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,358 @@
+r"""
+>>> floatformat(7.7)
+'7.7'
+>>> floatformat(7.0)
+'7'
+>>> floatformat(0.7)
+'0.7'
+>>> floatformat(0.07)
+'0.1'
+>>> floatformat(0.007)
+'0.0'
+>>> floatformat(0.0)
+'0'
+
+>>> addslashes('"double quotes" and \'single quotes\'')
+'\\"double quotes\\" and \\\'single quotes\\\''
+
+>>> capfirst('hello world')
+'Hello world'
+
+>>> fix_ampersands('Jack & Jill & Jeroboam')
+'Jack &amp; Jill &amp; Jeroboam'
+
+>>> linenumbers('line 1\nline 2')
+'1. line 1\n2. line 2'
+
+>>> linenumbers('\n'.join(['x'] * 10))
+'01. x\n02. x\n03. x\n04. x\n05. x\n06. x\n07. x\n08. x\n09. x\n10. x'
+
+>>> lower('TEST')
+'test'
+
+>>> lower(u'\xcb') # uppercase E umlaut
+u'\xeb'
+
+>>> make_list('abc')
+['a', 'b', 'c']
+
+>>> make_list(1234)
+['1', '2', '3', '4']
+
+>>> slugify(' Jack & Jill like numbers 1,2,3 and 4 and silly characters ?%.$!/')
+'jack-jill-like-numbers-123-and-4-and-silly-characters'
+
+>>> stringformat(1, '03d')
+'001'
+
+>>> stringformat(1, 'z')
+''
+
+>>> title('a nice title, isn\'t it?')
+"A Nice Title, Isn't It?"
+
+
+>>> truncatewords('A sentence with a few words in it', 1)
+'A ...'
+
+>>> truncatewords('A sentence with a few words in it', 5)
+'A sentence with a few ...'
+
+>>> truncatewords('A sentence with a few words in it', 100)
+'A sentence with a few words in it'
+
+>>> truncatewords('A sentence with a few words in it', 'not a number')
+'A sentence with a few words in it'
+
+
+>>> upper('Mixed case input')
+'MIXED CASE INPUT'
+
+>>> upper(u'\xeb') # lowercase e umlaut
+u'\xcb'
+
+
+>>> urlencode('jack & jill')
+'jack%20%26%20jill'
+
+
+>>> urlizetrunc('http://short.com/', 20)
+'<a href="http://short.com/" rel="nofollow">http://short.com/</a>'
+
+>>> urlizetrunc('http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=', 20)
+'<a href="http://www.google.co.uk/search?hl=en&q=some+long+url&btnG=Search&meta=" rel="nofollow">http://www.google.co...</a>'
+
+>>> wordcount('')
+0
+
+>>> wordcount('oneword')
+1
+
+>>> wordcount('lots of words')
+3
+
+>>> wordwrap('this is a long paragraph of text that really needs to be wrapped I\'m afraid', 14)
+"this is a long\nparagraph of\ntext that\nreally needs\nto be wrapped\nI'm afraid"
+
+>>> ljust('test', 10)
+'test      '
+
+>>> ljust('test', 3)
+'test'
+
+>>> rjust('test', 10)
+'      test'
+
+>>> rjust('test', 3)
+'test'
+
+>>> center('test', 6)
+' test '
+
+>>> cut('a string to be mangled', 'a')
+' string to be mngled'
+
+>>> cut('a string to be mangled', 'ng')
+'a stri to be maled'
+
+>>> cut('a string to be mangled', 'strings')
+'a string to be mangled'
+
+>>> escape('<some html & special characters > here')
+'&lt;some html &amp; special characters &gt; here'
+
+>>> linebreaks('line 1')
+'<p>line 1</p>'
+
+>>> linebreaks('line 1\nline 2')
+'<p>line 1<br />line 2</p>'
+
+>>> removetags('some <b>html</b> with <script>alert("You smell")</script> disallowed <img /> tags', 'script img')
+'some <b>html</b> with alert("You smell") disallowed  tags'
+
+>>> striptags('some <b>html</b> with <script>alert("You smell")</script> disallowed <img /> tags')
+'some html with alert("You smell") disallowed  tags'
+
+>>> dictsort([{'age': 23, 'name': 'Barbara-Ann'},
+...           {'age': 63, 'name': 'Ra Ra Rasputin'},
+...           {'name': 'Jonny B Goode', 'age': 18}], 'age')
+[{'age': 18, 'name': 'Jonny B Goode'}, {'age': 23, 'name': 'Barbara-Ann'}, {'age': 63, 'name': 'Ra Ra Rasputin'}]
+
+>>> dictsortreversed([{'age': 23, 'name': 'Barbara-Ann'},
+...           {'age': 63, 'name': 'Ra Ra Rasputin'},
+...           {'name': 'Jonny B Goode', 'age': 18}], 'age')
+[{'age': 63, 'name': 'Ra Ra Rasputin'}, {'age': 23, 'name': 'Barbara-Ann'}, {'age': 18, 'name': 'Jonny B Goode'}]
+
+>>> first([0,1,2])
+0
+
+>>> first('')
+''
+
+>>> first('test')
+'t'
+
+>>> join([0,1,2], 'glue')
+'0glue1glue2'
+
+>>> length('1234')
+4
+
+>>> length([1,2,3,4])
+4
+
+>>> length_is([], 0)
+True
+
+>>> length_is([], 1)
+False
+
+>>> length_is('a', 1)
+True
+
+>>> length_is('a', 10)
+False
+
+>>> slice_('abcdefg', '0')
+''
+
+>>> slice_('abcdefg', '1')
+'a'
+
+>>> slice_('abcdefg', '-1')
+'abcdef'
+
+>>> slice_('abcdefg', '1:2')
+'b'
+
+>>> slice_('abcdefg', '1:3')
+'bc'
+
+>>> slice_('abcdefg', '0::2')
+'aceg'
+
+>>> unordered_list(['item 1', []])
+'\t<li>item 1</li>'
+
+>>> unordered_list(['item 1', [['item 1.1', []]]])
+'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1</li>\n\t</ul>\n\t</li>'
+
+>>> unordered_list(['item 1', [['item 1.1', []], ['item 1.2', []]]])
+'\t<li>item 1\n\t<ul>\n\t\t<li>item 1.1</li>\n\t\t<li>item 1.2</li>\n\t</ul>\n\t</li>'
+
+>>> add('1', '2')
+3
+
+>>> get_digit(123, 1)
+3
+
+>>> get_digit(123, 2)
+2
+
+>>> get_digit(123, 3)
+1
+
+>>> get_digit(123, 4)
+0
+
+>>> get_digit(123, 0)
+123
+
+>>> get_digit('xyz', 0)
+'xyz'
+
+# real testing of date() is in dateformat.py
+>>> date(datetime.datetime(2005, 12, 29), "d F Y")
+'29 December 2005'
+>>> date(datetime.datetime(2005, 12, 29), r'jS o\f F')
+'29th of December'
+
+# real testing of time() is done in dateformat.py
+>>> time(datetime.time(13), "h")
+'01'
+
+# real testing is done in timesince.py, where we can provide our own 'now'
+>>> timesince(datetime.datetime.now() - datetime.timedelta(1))
+'1 day'
+
+>>> default("val", "default")
+'val'
+
+>>> default(None, "default")
+'default'
+
+>>> default('', "default")
+'default'
+
+>>> default_if_none("val", "default")
+'val'
+
+>>> default_if_none(None, "default")
+'default'
+
+>>> default_if_none('', "default")
+''
+
+>>> divisibleby(4, 2)
+True
+
+>>> divisibleby(4, 3)
+False
+
+>>> yesno(True)
+'yes'
+
+>>> yesno(False)
+'no'
+
+>>> yesno(None)
+'maybe'
+
+>>> yesno(True, 'certainly,get out of town,perhaps')
+'certainly'
+
+>>> yesno(False, 'certainly,get out of town,perhaps')
+'get out of town'
+
+>>> yesno(None, 'certainly,get out of town,perhaps')
+'perhaps'
+
+>>> yesno(None, 'certainly,get out of town')
+'get out of town'
+
+>>> filesizeformat(1023)
+'1023 bytes'
+
+>>> filesizeformat(1024)
+'1.0 KB'
+
+>>> filesizeformat(10*1024)
+'10.0 KB'
+
+>>> filesizeformat(1024*1024-1)
+'1024.0 KB'
+
+>>> filesizeformat(1024*1024)
+'1.0 MB'
+
+>>> filesizeformat(1024*1024*50)
+'50.0 MB'
+
+>>> filesizeformat(1024*1024*1024-1)
+'1024.0 MB'
+
+>>> filesizeformat(1024*1024*1024)
+'1.0 GB'
+
+>>> pluralize(1)
+''
+
+>>> pluralize(0)
+'s'
+
+>>> pluralize(2)
+'s'
+
+>>> pluralize([1])
+''
+
+>>> pluralize([])
+'s'
+
+>>> pluralize([1,2,3])
+'s'
+
+>>> pluralize(1,'es')
+''
+
+>>> pluralize(0,'es')
+'es'
+
+>>> pluralize(2,'es')
+'es'
+
+>>> pluralize(1,'y,ies')
+'y'
+
+>>> pluralize(0,'y,ies')
+'ies'
+
+>>> pluralize(2,'y,ies')
+'ies'
+
+>>> pluralize(0,'y,ies,error')
+''
+
+>>> phone2numeric('0800 flowers')
+'0800 3569377'
+
+
+
+"""
+
+from django.template.defaultfilters import *
+import datetime
+
+if __name__ == '__main__':
+    import doctest
+    doctest.testmod()

Added: vendor/django/current/tests/othertests/httpwrappers.py
===================================================================
--- vendor/django/current/tests/othertests/httpwrappers.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/httpwrappers.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,358 @@
+"""
+###################
+# Empty QueryDict #
+###################
+
+>>> q = QueryDict('')
+
+>>> q['foo']
+Traceback (most recent call last):
+...
+MultiValueDictKeyError: "Key 'foo' not found in <MultiValueDict: {}>"
+
+>>> q['something'] = 'bar'
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.get('foo', 'default')
+'default'
+
+>>> q.getlist('foo')
+[]
+
+>>> q.setlist('foo', ['bar', 'baz'])
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.appendlist('foo', ['bar'])
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.has_key('foo')
+False
+
+>>> q.items()
+[]
+
+>>> q.lists()
+[]
+
+>>> q.keys()
+[]
+
+>>> q.values()
+[]
+
+>>> len(q)
+0
+
+>>> q.update({'foo': 'bar'})
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.pop('foo')
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.popitem()
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.clear()
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.setdefault('foo', 'bar')
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.urlencode()
+''
+
+###################################
+# Mutable copy of empty QueryDict #
+###################################
+
+>>> q = q.copy()
+
+>>> q['foo']
+Traceback (most recent call last):
+...
+MultiValueDictKeyError: "Key 'foo' not found in <MultiValueDict: {}>"
+
+>>> q['name'] = 'john'
+
+>>> q['name']
+'john'
+
+>>> q.get('foo', 'default')
+'default'
+
+>>> q.get('name', 'default')
+'john'
+
+>>> q.getlist('name')
+['john']
+
+>>> q.getlist('foo')
+[]
+
+>>> q.setlist('foo', ['bar', 'baz'])
+
+>>> q.get('foo', 'default')
+'baz'
+
+>>> q.getlist('foo')
+['bar', 'baz']
+
+>>> q.appendlist('foo', 'another')
+
+>>> q.getlist('foo')
+['bar', 'baz', 'another']
+
+>>> q['foo']
+'another'
+
+>>> q.has_key('foo')
+True
+
+>>> q.items()
+[('foo', 'another'), ('name', 'john')]
+
+>>> q.lists()
+[('foo', ['bar', 'baz', 'another']), ('name', ['john'])]
+
+>>> q.keys()
+['foo', 'name']
+
+>>> q.values()
+['another', 'john']
+
+>>> len(q)
+2
+
+>>> q.update({'foo': 'hello'})
+
+# Displays last value
+>>> q['foo']
+'hello'
+
+>>> q.get('foo', 'not available')
+'hello'
+
+>>> q.getlist('foo')
+['bar', 'baz', 'another', 'hello']
+
+>>> q.pop('foo')
+['bar', 'baz', 'another', 'hello']
+
+>>> q.get('foo', 'not there')
+'not there'
+
+>>> q.setdefault('foo', 'bar')
+'bar'
+
+>>> q['foo']
+'bar'
+
+>>> q.getlist('foo')
+['bar']
+
+>>> q.urlencode()
+'foo=bar&name=john'
+
+>>> q.clear()
+
+>>> len(q)
+0
+
+#####################################
+# QueryDict with one key/value pair #
+#####################################
+
+>>> q = QueryDict('foo=bar')
+
+>>> q['foo']
+'bar'
+
+>>> q['bar']
+Traceback (most recent call last):
+...
+MultiValueDictKeyError: "Key 'bar' not found in <MultiValueDict: {'foo': ['bar']}>"
+
+>>> q['something'] = 'bar'
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.get('foo', 'default')
+'bar'
+
+>>> q.get('bar', 'default')
+'default'
+
+>>> q.getlist('foo')
+['bar']
+
+>>> q.getlist('bar')
+[]
+
+>>> q.setlist('foo', ['bar', 'baz'])
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.appendlist('foo', ['bar'])
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.has_key('foo')
+True
+
+>>> q.has_key('bar')
+False
+
+>>> q.items()
+[('foo', 'bar')]
+
+>>> q.lists()
+[('foo', ['bar'])]
+
+>>> q.keys()
+['foo']
+
+>>> q.values()
+['bar']
+
+>>> len(q)
+1
+
+>>> q.update({'foo': 'bar'})
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.pop('foo')
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.popitem()
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.clear()
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.setdefault('foo', 'bar')
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.urlencode()
+'foo=bar'
+
+#####################################################
+# QueryDict with two key/value pairs with same keys #
+#####################################################
+
+>>> q = QueryDict('vote=yes&vote=no')
+
+>>> q['vote']
+'no'
+
+>>> q['something'] = 'bar'
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.get('vote', 'default')
+'no'
+
+>>> q.get('foo', 'default')
+'default'
+
+>>> q.getlist('vote')
+['yes', 'no']
+
+>>> q.getlist('foo')
+[]
+
+>>> q.setlist('foo', ['bar', 'baz'])
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.appendlist('foo', ['bar'])
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.has_key('vote')
+True
+
+>>> q.has_key('foo')
+False
+
+>>> q.items()
+[('vote', 'no')]
+
+>>> q.lists()
+[('vote', ['yes', 'no'])]
+
+>>> q.keys()
+['vote']
+
+>>> q.values()
+['no']
+
+>>> len(q)
+1
+
+>>> q.update({'foo': 'bar'})
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.pop('foo')
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.popitem()
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.clear()
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.setdefault('foo', 'bar')
+Traceback (most recent call last):
+...
+AttributeError: This QueryDict instance is immutable
+
+>>> q.urlencode()
+'vote=yes&vote=no'
+
+"""
+
+from django.http import QueryDict
+
+if __name__ == "__main__":
+    import doctest
+    doctest.testmod()

Added: vendor/django/current/tests/othertests/markup.py
===================================================================
--- vendor/django/current/tests/othertests/markup.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/markup.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,70 @@
+# Quick tests for the markup templatetags (django.contrib.markup)
+
+from django.template import Template, Context, add_to_builtins
+import re
+
+add_to_builtins('django.contrib.markup.templatetags.markup')
+
+# find out if markup modules are installed and tailor the test appropriately
+try:
+    import textile
+except ImportError:
+    textile = None
+
+try:
+    import markdown
+except ImportError:
+    markdown = None
+
+try:
+    import docutils
+except ImportError:
+    docutils = None
+
+# simple examples 'cause this isn't actually testing the markup, just
+# that the filters work as advertised
+
+### test textile
+
+textile_content = """Paragraph 1
+
+Paragraph 2 with "quotes" and @code@"""
+
+t = Template("{{ textile_content|textile }}")
+rendered = t.render(Context(locals())).strip()
+if textile:
+    assert rendered == """<p>Paragraph 1</p>
+
+<p>Paragraph 2 with &#8220;quotes&#8221; and <code>code</code></p>"""
+else:
+    assert rendered == textile_content
+
+### test markdown
+
+markdown_content = """Paragraph 1
+
+## An h2"""
+
+t = Template("{{ markdown_content|markdown }}")
+rendered = t.render(Context(locals())).strip()
+if markdown:
+    pattern = re.compile("""<p>Paragraph 1\s*</p>\s*<h2>\s*An h2</h2>""")
+    assert pattern.match(rendered)
+else:
+    assert rendered == markdown_content
+
+### test rest
+
+rest_content = """Paragraph 1
+
+Paragraph 2 with a link_
+
+.. _link: http://www.example.com/"""
+
+t = Template("{{ rest_content|restructuredtext }}")
+rendered = t.render(Context(locals())).strip()
+if docutils:
+    assert rendered =="""<p>Paragraph 1</p>
+<p>Paragraph 2 with a <a class="reference" href="http://www.example.com/">link</a></p>"""
+else:
+    assert rendered == rest_content

Added: vendor/django/current/tests/othertests/templates.py
===================================================================
--- vendor/django/current/tests/othertests/templates.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/templates.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,634 @@
+from django.conf import settings
+
+if __name__ == '__main__':
+    # When running this file in isolation, we need to set up the configuration
+    # before importing 'template'.
+    settings.configure()
+
+from django import template
+from django.template import loader
+from django.utils.translation import activate, deactivate, install
+from django.utils.tzinfo import LocalTimezone
+from datetime import datetime, timedelta
+import traceback
+
+#################################
+# Custom template tag for tests #
+#################################
+
+register = template.Library()
+
+class EchoNode(template.Node):
+    def __init__(self, contents):
+        self.contents = contents
+
+    def render(self, context):
+        return " ".join(self.contents)
+
+def do_echo(parser, token):
+    return EchoNode(token.contents.split()[1:])
+
+register.tag("echo", do_echo)
+
+template.libraries['django.templatetags.testtags'] = register
+
+#####################################
+# Helper objects for template tests #
+#####################################
+
+class SomeException(Exception):
+    silent_variable_failure = True
+
+class SomeOtherException(Exception):
+    pass
+
+class SomeClass:
+    def __init__(self):
+        self.otherclass = OtherClass()
+
+    def method(self):
+        return "SomeClass.method"
+
+    def method2(self, o):
+        return o
+
+    def method3(self):
+        raise SomeException
+
+    def method4(self):
+        raise SomeOtherException
+
+class OtherClass:
+    def method(self):
+        return "OtherClass.method"
+
+# NOW and NOW_tz are used by timesince tag tests.
+NOW = datetime.now()
+NOW_tz = datetime.now(LocalTimezone(datetime.now()))
+
+# SYNTAX --
+# 'template_name': ('template contents', 'context dict', 'expected string output' or Exception class)
+TEMPLATE_TESTS = {
+
+    ### BASIC SYNTAX ##########################################################
+
+    # Plain text should go through the template parser untouched
+    'basic-syntax01': ("something cool", {}, "something cool"),
+
+    # Variables should be replaced with their value in the current context
+    'basic-syntax02': ("{{ headline }}", {'headline':'Success'}, "Success"),
+
+    # More than one replacement variable is allowed in a template
+    'basic-syntax03': ("{{ first }} --- {{ second }}", {"first" : 1, "second" : 2}, "1 --- 2"),
+
+    # Fail silently when a variable is not found in the current context
+    'basic-syntax04': ("as{{ missing }}df", {}, "asINVALIDdf"),
+
+    # A variable may not contain more than one word
+    'basic-syntax06': ("{{ multi word variable }}", {}, template.TemplateSyntaxError),
+
+    # Raise TemplateSyntaxError for empty variable tags
+    'basic-syntax07': ("{{ }}",        {}, template.TemplateSyntaxError),
+    'basic-syntax08': ("{{        }}", {}, template.TemplateSyntaxError),
+
+    # Attribute syntax allows a template to call an object's attribute
+    'basic-syntax09': ("{{ var.method }}", {"var": SomeClass()}, "SomeClass.method"),
+
+    # Multiple levels of attribute access are allowed
+    'basic-syntax10': ("{{ var.otherclass.method }}", {"var": SomeClass()}, "OtherClass.method"),
+
+    # Fail silently when a variable's attribute isn't found
+    'basic-syntax11': ("{{ var.blech }}", {"var": SomeClass()}, "INVALID"),
+
+    # Raise TemplateSyntaxError when trying to access a variable beginning with an underscore
+    'basic-syntax12': ("{{ var.__dict__ }}", {"var": SomeClass()}, template.TemplateSyntaxError),
+
+    # Raise TemplateSyntaxError when trying to access a variable containing an illegal character
+    'basic-syntax13': ("{{ va>r }}", {}, template.TemplateSyntaxError),
+    'basic-syntax14': ("{{ (var.r) }}", {}, template.TemplateSyntaxError),
+    'basic-syntax15': ("{{ sp%am }}", {}, template.TemplateSyntaxError),
+    'basic-syntax16': ("{{ eggs! }}", {}, template.TemplateSyntaxError),
+    'basic-syntax17': ("{{ moo? }}", {}, template.TemplateSyntaxError),
+
+    # Attribute syntax allows a template to call a dictionary key's value
+    'basic-syntax18': ("{{ foo.bar }}", {"foo" : {"bar" : "baz"}}, "baz"),
+
+    # Fail silently when a variable's dictionary key isn't found
+    'basic-syntax19': ("{{ foo.spam }}", {"foo" : {"bar" : "baz"}}, "INVALID"),
+
+    # Fail silently when accessing a non-simple method
+    'basic-syntax20': ("{{ var.method2 }}", {"var": SomeClass()}, "INVALID"),
+
+    # Basic filter usage
+    'basic-syntax21': ("{{ var|upper }}", {"var": "Django is the greatest!"}, "DJANGO IS THE GREATEST!"),
+
+    # Chained filters
+    'basic-syntax22': ("{{ var|upper|lower }}", {"var": "Django is the greatest!"}, "django is the greatest!"),
+
+    # Raise TemplateSyntaxError for space between a variable and filter pipe
+    'basic-syntax23': ("{{ var |upper }}", {}, template.TemplateSyntaxError),
+
+    # Raise TemplateSyntaxError for space after a filter pipe
+    'basic-syntax24': ("{{ var| upper }}", {}, template.TemplateSyntaxError),
+
+    # Raise TemplateSyntaxError for a nonexistent filter
+    'basic-syntax25': ("{{ var|does_not_exist }}", {}, template.TemplateSyntaxError),
+
+    # Raise TemplateSyntaxError when trying to access a filter containing an illegal character
+    'basic-syntax26': ("{{ var|fil(ter) }}", {}, template.TemplateSyntaxError),
+
+    # Raise TemplateSyntaxError for invalid block tags
+    'basic-syntax27': ("{% nothing_to_see_here %}", {}, template.TemplateSyntaxError),
+
+    # Raise TemplateSyntaxError for empty block tags
+    'basic-syntax28': ("{% %}", {}, template.TemplateSyntaxError),
+
+    # Chained filters, with an argument to the first one
+    'basic-syntax29': ('{{ var|removetags:"b i"|upper|lower }}', {"var": "<b><i>Yes</i></b>"}, "yes"),
+
+    # Escaped string as argument
+    'basic-syntax30': (r'{{ var|default_if_none:" endquote\" hah" }}', {"var": None}, ' endquote" hah'),
+
+    # Variable as argument
+    'basic-syntax31': (r'{{ var|default_if_none:var2 }}', {"var": None, "var2": "happy"}, 'happy'),
+
+    # Default argument testing
+    'basic-syntax32': (r'{{ var|yesno:"yup,nup,mup" }} {{ var|yesno }}', {"var": True}, 'yup yes'),
+
+    # Fail silently for methods that raise an exception with a "silent_variable_failure" attribute
+    'basic-syntax33': (r'1{{ var.method3 }}2', {"var": SomeClass()}, "1INVALID2"),
+
+    # In methods that raise an exception without a "silent_variable_attribute" set to True,
+    # the exception propogates
+    'basic-syntax34': (r'1{{ var.method4 }}2', {"var": SomeClass()}, SomeOtherException),
+
+    # Escaped backslash in argument
+    'basic-syntax35': (r'{{ var|default_if_none:"foo\bar" }}', {"var": None}, r'foo\bar'),
+
+    # Escaped backslash using known escape char
+    'basic-syntax35': (r'{{ var|default_if_none:"foo\now" }}', {"var": None}, r'foo\now'),
+
+    ### COMMENT TAG ###########################################################
+    'comment-tag01': ("{% comment %}this is hidden{% endcomment %}hello", {}, "hello"),
+    'comment-tag02': ("{% comment %}this is hidden{% endcomment %}hello{% comment %}foo{% endcomment %}", {}, "hello"),
+
+    # Comment tag can contain invalid stuff.
+    'comment-tag03': ("foo{% comment %} {% if %} {% endcomment %}", {}, "foo"),
+    'comment-tag04': ("foo{% comment %} {% endblock %} {% endcomment %}", {}, "foo"),
+    'comment-tag05': ("foo{% comment %} {% somerandomtag %} {% endcomment %}", {}, "foo"),
+
+    ### CYCLE TAG #############################################################
+    'cycle01': ('{% cycle a %}', {}, template.TemplateSyntaxError),
+    'cycle02': ('{% cycle a,b,c as abc %}{% cycle abc %}', {}, 'ab'),
+    'cycle03': ('{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}', {}, 'abc'),
+    'cycle04': ('{% cycle a,b,c as abc %}{% cycle abc %}{% cycle abc %}{% cycle abc %}', {}, 'abca'),
+    'cycle05': ('{% cycle %}', {}, template.TemplateSyntaxError),
+    'cycle06': ('{% cycle a %}', {}, template.TemplateSyntaxError),
+    'cycle07': ('{% cycle a,b,c as foo %}{% cycle bar %}', {}, template.TemplateSyntaxError),
+
+    ### EXCEPTIONS ############################################################
+
+    # Raise exception for invalid template name
+    'exception01': ("{% extends 'nonexistent' %}", {}, template.TemplateSyntaxError),
+
+    # Raise exception for invalid template name (in variable)
+    'exception02': ("{% extends nonexistent %}", {}, template.TemplateSyntaxError),
+
+    # Raise exception for extra {% extends %} tags
+    'exception03': ("{% extends 'inheritance01' %}{% block first %}2{% endblock %}{% extends 'inheritance16' %}", {}, template.TemplateSyntaxError),
+
+    # Raise exception for custom tags used in child with {% load %} tag in parent, not in child
+    'exception04': ("{% extends 'inheritance17' %}{% block first %}{% echo 400 %}5678{% endblock %}", {}, template.TemplateSyntaxError),
+
+    ### FILTER TAG ############################################################
+    'filter01': ('{% filter upper %}{% endfilter %}', {}, ''),
+    'filter02': ('{% filter upper %}django{% endfilter %}', {}, 'DJANGO'),
+    'filter03': ('{% filter upper|lower %}django{% endfilter %}', {}, 'django'),
+
+    ### FIRSTOF TAG ###########################################################
+    'firstof01': ('{% firstof a b c %}', {'a':0,'b':0,'c':0}, ''),
+    'firstof02': ('{% firstof a b c %}', {'a':1,'b':0,'c':0}, '1'),
+    'firstof03': ('{% firstof a b c %}', {'a':0,'b':2,'c':0}, '2'),
+    'firstof04': ('{% firstof a b c %}', {'a':0,'b':0,'c':3}, '3'),
+    'firstof05': ('{% firstof a b c %}', {'a':1,'b':2,'c':3}, '1'),
+    'firstof06': ('{% firstof %}', {}, template.TemplateSyntaxError),
+
+    ### FOR TAG ###############################################################
+    'for-tag01': ("{% for val in values %}{{ val }}{% endfor %}", {"values": [1, 2, 3]}, "123"),
+    'for-tag02': ("{% for val in values reversed %}{{ val }}{% endfor %}", {"values": [1, 2, 3]}, "321"),
+    'for-tag-vars01': ("{% for val in values %}{{ forloop.counter }}{% endfor %}", {"values": [6, 6, 6]}, "123"),
+    'for-tag-vars02': ("{% for val in values %}{{ forloop.counter0 }}{% endfor %}", {"values": [6, 6, 6]}, "012"),
+    'for-tag-vars03': ("{% for val in values %}{{ forloop.revcounter }}{% endfor %}", {"values": [6, 6, 6]}, "321"),
+    'for-tag-vars04': ("{% for val in values %}{{ forloop.revcounter0 }}{% endfor %}", {"values": [6, 6, 6]}, "210"),
+
+    ### IF TAG ################################################################
+    'if-tag01': ("{% if foo %}yes{% else %}no{% endif %}", {"foo": True}, "yes"),
+    'if-tag02': ("{% if foo %}yes{% else %}no{% endif %}", {"foo": False}, "no"),
+    'if-tag03': ("{% if foo %}yes{% else %}no{% endif %}", {}, "no"),
+
+    # AND
+    'if-tag-and01': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'),
+    'if-tag-and02': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'),
+    'if-tag-and03': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'),
+    'if-tag-and04': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'),
+    'if-tag-and05': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': False}, 'no'),
+    'if-tag-and06': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'bar': False}, 'no'),
+    'if-tag-and07': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'foo': True}, 'no'),
+    'if-tag-and08': ("{% if foo and bar %}yes{% else %}no{% endif %}", {'bar': True}, 'no'),
+
+    # OR
+    'if-tag-or01': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'),
+    'if-tag-or02': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'),
+    'if-tag-or03': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'),
+    'if-tag-or04': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'),
+    'if-tag-or05': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': False}, 'no'),
+    'if-tag-or06': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'bar': False}, 'no'),
+    'if-tag-or07': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'foo': True}, 'yes'),
+    'if-tag-or08': ("{% if foo or bar %}yes{% else %}no{% endif %}", {'bar': True}, 'yes'),
+
+    # TODO: multiple ORs
+
+    # NOT
+    'if-tag-not01': ("{% if not foo %}no{% else %}yes{% endif %}", {'foo': True}, 'yes'),
+    'if-tag-not02': ("{% if not %}yes{% else %}no{% endif %}", {'foo': True}, 'no'),
+    'if-tag-not03': ("{% if not %}yes{% else %}no{% endif %}", {'not': True}, 'yes'),
+    'if-tag-not04': ("{% if not not %}no{% else %}yes{% endif %}", {'not': True}, 'yes'),
+    'if-tag-not05': ("{% if not not %}no{% else %}yes{% endif %}", {}, 'no'),
+
+    'if-tag-not06': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {}, 'no'),
+    'if-tag-not07': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'),
+    'if-tag-not08': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'),
+    'if-tag-not09': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'),
+    'if-tag-not10': ("{% if foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'),
+
+    'if-tag-not11': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {}, 'no'),
+    'if-tag-not12': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'),
+    'if-tag-not13': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'),
+    'if-tag-not14': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'),
+    'if-tag-not15': ("{% if not foo and bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'no'),
+
+    'if-tag-not16': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {}, 'yes'),
+    'if-tag-not17': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'),
+    'if-tag-not18': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'),
+    'if-tag-not19': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'),
+    'if-tag-not20': ("{% if foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'),
+
+    'if-tag-not21': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {}, 'yes'),
+    'if-tag-not22': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'yes'),
+    'if-tag-not23': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'),
+    'if-tag-not24': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'),
+    'if-tag-not25': ("{% if not foo or bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'),
+
+    'if-tag-not26': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {}, 'yes'),
+    'if-tag-not27': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'),
+    'if-tag-not28': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'no'),
+    'if-tag-not29': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'no'),
+    'if-tag-not30': ("{% if not foo and not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'),
+
+    'if-tag-not31': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {}, 'yes'),
+    'if-tag-not32': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': True}, 'no'),
+    'if-tag-not33': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': True, 'bar': False}, 'yes'),
+    'if-tag-not34': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': True}, 'yes'),
+    'if-tag-not35': ("{% if not foo or not bar %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, 'yes'),
+
+    # AND and OR raises a TemplateSyntaxError
+    'if-tag-error01': ("{% if foo or bar and baz %}yes{% else %}no{% endif %}", {'foo': False, 'bar': False}, template.TemplateSyntaxError),
+    'if-tag-error02': ("{% if foo and %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError),
+    'if-tag-error03': ("{% if foo or %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError),
+    'if-tag-error04': ("{% if not foo and %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError),
+    'if-tag-error05': ("{% if not foo or %}yes{% else %}no{% endif %}", {'foo': True}, template.TemplateSyntaxError),
+
+    ### IFCHANGED TAG #########################################################
+    'ifchanged01': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,2,3) }, '123'),
+    'ifchanged02': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,3) }, '13'),
+    'ifchanged03': ('{% for n in num %}{% ifchanged %}{{ n }}{% endifchanged %}{% endfor %}', { 'num': (1,1,1) }, '1'),
+
+    ### IFEQUAL TAG ###########################################################
+    'ifequal01': ("{% ifequal a b %}yes{% endifequal %}", {"a": 1, "b": 2}, ""),
+    'ifequal02': ("{% ifequal a b %}yes{% endifequal %}", {"a": 1, "b": 1}, "yes"),
+    'ifequal03': ("{% ifequal a b %}yes{% else %}no{% endifequal %}", {"a": 1, "b": 2}, "no"),
+    'ifequal04': ("{% ifequal a b %}yes{% else %}no{% endifequal %}", {"a": 1, "b": 1}, "yes"),
+    'ifequal05': ("{% ifequal a 'test' %}yes{% else %}no{% endifequal %}", {"a": "test"}, "yes"),
+    'ifequal06': ("{% ifequal a 'test' %}yes{% else %}no{% endifequal %}", {"a": "no"}, "no"),
+    'ifequal07': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {"a": "test"}, "yes"),
+    'ifequal08': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {"a": "no"}, "no"),
+    'ifequal09': ('{% ifequal a "test" %}yes{% else %}no{% endifequal %}', {}, "no"),
+    'ifequal10': ('{% ifequal a b %}yes{% else %}no{% endifequal %}', {}, "yes"),
+
+    # SMART SPLITTING
+    'ifequal-split01': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {}, "no"),
+    'ifequal-split02': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'foo'}, "no"),
+    'ifequal-split03': ('{% ifequal a "test man" %}yes{% else %}no{% endifequal %}', {'a': 'test man'}, "yes"),
+    'ifequal-split04': ("{% ifequal a 'test man' %}yes{% else %}no{% endifequal %}", {'a': 'test man'}, "yes"),
+    'ifequal-split05': ("{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}", {'a': ''}, "no"),
+    'ifequal-split06': ("{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}", {'a': 'i "love" you'}, "yes"),
+    'ifequal-split07': ("{% ifequal a 'i \"love\" you' %}yes{% else %}no{% endifequal %}", {'a': 'i love you'}, "no"),
+    'ifequal-split08': (r"{% ifequal a 'I\'m happy' %}yes{% else %}no{% endifequal %}", {'a': "I'm happy"}, "yes"),
+    'ifequal-split09': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slash\man"}, "yes"),
+    'ifequal-split10': (r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}", {'a': r"slashman"}, "no"),
+
+    ### IFNOTEQUAL TAG ########################################################
+    'ifnotequal01': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 2}, "yes"),
+    'ifnotequal02': ("{% ifnotequal a b %}yes{% endifnotequal %}", {"a": 1, "b": 1}, ""),
+    'ifnotequal03': ("{% ifnotequal a b %}yes{% else %}no{% endifnotequal %}", {"a": 1, "b": 2}, "yes"),
+    'ifnotequal04': ("{% ifnotequal a b %}yes{% else %}no{% endifnotequal %}", {"a": 1, "b": 1}, "no"),
+
+    ### INCLUDE TAG ###########################################################
+    'include01': ('{% include "basic-syntax01" %}', {}, "something cool"),
+    'include02': ('{% include "basic-syntax02" %}', {'headline': 'Included'}, "Included"),
+    'include03': ('{% include template_name %}', {'template_name': 'basic-syntax02', 'headline': 'Included'}, "Included"),
+    'include04': ('a{% include "nonexistent" %}b', {}, "ab"),
+
+    ### INHERITANCE ###########################################################
+
+    # Standard template with no inheritance
+    'inheritance01': ("1{% block first %}_{% endblock %}3{% block second %}_{% endblock %}", {}, '1_3_'),
+
+    # Standard two-level inheritance
+    'inheritance02': ("{% extends 'inheritance01' %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {}, '1234'),
+
+    # Three-level with no redefinitions on third level
+    'inheritance03': ("{% extends 'inheritance02' %}", {}, '1234'),
+
+    # Two-level with no redefinitions on second level
+    'inheritance04': ("{% extends 'inheritance01' %}", {}, '1_3_'),
+
+    # Two-level with double quotes instead of single quotes
+    'inheritance05': ('{% extends "inheritance02" %}', {}, '1234'),
+
+    # Three-level with variable parent-template name
+    'inheritance06': ("{% extends foo %}", {'foo': 'inheritance02'}, '1234'),
+
+    # Two-level with one block defined, one block not defined
+    'inheritance07': ("{% extends 'inheritance01' %}{% block second %}5{% endblock %}", {}, '1_35'),
+
+    # Three-level with one block defined on this level, two blocks defined next level
+    'inheritance08': ("{% extends 'inheritance02' %}{% block second %}5{% endblock %}", {}, '1235'),
+
+    # Three-level with second and third levels blank
+    'inheritance09': ("{% extends 'inheritance04' %}", {}, '1_3_'),
+
+    # Three-level with space NOT in a block -- should be ignored
+    'inheritance10': ("{% extends 'inheritance04' %}      ", {}, '1_3_'),
+
+    # Three-level with both blocks defined on this level, but none on second level
+    'inheritance11': ("{% extends 'inheritance04' %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {}, '1234'),
+
+    # Three-level with this level providing one and second level providing the other
+    'inheritance12': ("{% extends 'inheritance07' %}{% block first %}2{% endblock %}", {}, '1235'),
+
+    # Three-level with this level overriding second level
+    'inheritance13': ("{% extends 'inheritance02' %}{% block first %}a{% endblock %}{% block second %}b{% endblock %}", {}, '1a3b'),
+
+    # A block defined only in a child template shouldn't be displayed
+    'inheritance14': ("{% extends 'inheritance01' %}{% block newblock %}NO DISPLAY{% endblock %}", {}, '1_3_'),
+
+    # A block within another block
+    'inheritance15': ("{% extends 'inheritance01' %}{% block first %}2{% block inner %}inner{% endblock %}{% endblock %}", {}, '12inner3_'),
+
+    # A block within another block (level 2)
+    'inheritance16': ("{% extends 'inheritance15' %}{% block inner %}out{% endblock %}", {}, '12out3_'),
+
+    # {% load %} tag (parent -- setup for exception04)
+    'inheritance17': ("{% load testtags %}{% block first %}1234{% endblock %}", {}, '1234'),
+
+    # {% load %} tag (standard usage, without inheritance)
+    'inheritance18': ("{% load testtags %}{% echo this that theother %}5678", {}, 'this that theother5678'),
+
+    # {% load %} tag (within a child template)
+    'inheritance19': ("{% extends 'inheritance01' %}{% block first %}{% load testtags %}{% echo 400 %}5678{% endblock %}", {}, '140056783_'),
+
+    # Two-level inheritance with {{ block.super }}
+    'inheritance20': ("{% extends 'inheritance01' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '1_a3_'),
+
+    # Three-level inheritance with {{ block.super }} from parent
+    'inheritance21': ("{% extends 'inheritance02' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '12a34'),
+
+    # Three-level inheritance with {{ block.super }} from grandparent
+    'inheritance22': ("{% extends 'inheritance04' %}{% block first %}{{ block.super }}a{% endblock %}", {}, '1_a3_'),
+
+    # Three-level inheritance with {{ block.super }} from parent and grandparent
+    'inheritance23': ("{% extends 'inheritance20' %}{% block first %}{{ block.super }}b{% endblock %}", {}, '1_ab3_'),
+
+    # Inheritance from local context without use of template loader
+    'inheritance24': ("{% extends context_template %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {'context_template': template.Template("1{% block first %}_{% endblock %}3{% block second %}_{% endblock %}")}, '1234'),
+
+    # Inheritance from local context with variable parent template
+    'inheritance25': ("{% extends context_template.1 %}{% block first %}2{% endblock %}{% block second %}4{% endblock %}", {'context_template': [template.Template("Wrong"), template.Template("1{% block first %}_{% endblock %}3{% block second %}_{% endblock %}")]}, '1234'),
+
+    ### I18N ##################################################################
+
+    # {% spaceless %} tag
+    'spaceless01': ("{% spaceless %} <b>    <i> text </i>    </b> {% endspaceless %}", {}, "<b> <i> text </i> </b>"),
+    'spaceless02': ("{% spaceless %} <b> \n <i> text </i> \n </b> {% endspaceless %}", {}, "<b> <i> text </i> </b>"),
+    'spaceless03': ("{% spaceless %}<b><i>text</i></b>{% endspaceless %}", {}, "<b><i>text</i></b>"),
+
+    # simple translation of a string delimited by '
+    'i18n01': ("{% load i18n %}{% trans 'xxxyyyxxx' %}", {}, "xxxyyyxxx"),
+
+    # simple translation of a string delimited by "
+    'i18n02': ('{% load i18n %}{% trans "xxxyyyxxx" %}', {}, "xxxyyyxxx"),
+
+    # simple translation of a variable
+    'i18n03': ('{% load i18n %}{% blocktrans %}{{ anton }}{% endblocktrans %}', {'anton': 'xxxyyyxxx'}, "xxxyyyxxx"),
+
+    # simple translation of a variable and filter
+    'i18n04': ('{% load i18n %}{% blocktrans with anton|lower as berta %}{{ berta }}{% endblocktrans %}', {'anton': 'XXXYYYXXX'}, "xxxyyyxxx"),
+
+    # simple translation of a string with interpolation
+    'i18n05': ('{% load i18n %}{% blocktrans %}xxx{{ anton }}xxx{% endblocktrans %}', {'anton': 'yyy'}, "xxxyyyxxx"),
+
+    # simple translation of a string to german
+    'i18n06': ('{% load i18n %}{% trans "Page not found" %}', {'LANGUAGE_CODE': 'de'}, "Seite nicht gefunden"),
+
+    # translation of singular form
+    'i18n07': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}plural{% endblocktrans %}', {'number': 1}, "singular"),
+
+    # translation of plural form
+    'i18n08': ('{% load i18n %}{% blocktrans count number as counter %}singular{% plural %}plural{% endblocktrans %}', {'number': 2}, "plural"),
+
+    # simple non-translation (only marking) of a string to german
+    'i18n09': ('{% load i18n %}{% trans "Page not found" noop %}', {'LANGUAGE_CODE': 'de'}, "Page not found"),
+
+    # translation of a variable with a translated filter
+    'i18n10': ('{{ bool|yesno:_("ja,nein") }}', {'bool': True}, 'ja'),
+
+    # translation of a variable with a non-translated filter
+    'i18n11': ('{{ bool|yesno:"ja,nein" }}', {'bool': True}, 'ja'),
+
+    # usage of the get_available_languages tag
+    'i18n12': ('{% load i18n %}{% get_available_languages as langs %}{% for lang in langs %}{% ifequal lang.0 "de" %}{{ lang.0 }}{% endifequal %}{% endfor %}', {}, 'de'),
+
+    # translation of a constant string
+    'i18n13': ('{{ _("Page not found") }}', {'LANGUAGE_CODE': 'de'}, 'Seite nicht gefunden'),
+
+    ### MULTILINE #############################################################
+
+    'multiline01': ("""
+                    Hello,
+                    boys.
+                    How
+                    are
+                    you
+                    gentlemen.
+                    """,
+                    {},
+                    """
+                    Hello,
+                    boys.
+                    How
+                    are
+                    you
+                    gentlemen.
+                    """),
+
+    ### REGROUP TAG ###########################################################
+    'regroup01': ('{% regroup data by bar as grouped %}' + \
+                  '{% for group in grouped %}' + \
+                  '{{ group.grouper }}:' + \
+                  '{% for item in group.list %}' + \
+                  '{{ item.foo }}' + \
+                  '{% endfor %},' + \
+                  '{% endfor %}',
+                  {'data': [ {'foo':'c', 'bar':1},
+                             {'foo':'d', 'bar':1},
+                             {'foo':'a', 'bar':2},
+                             {'foo':'b', 'bar':2},
+                             {'foo':'x', 'bar':3}  ]},
+                  '1:cd,2:ab,3:x,'),
+
+    # Test for silent failure when target variable isn't found
+    'regroup02': ('{% regroup data by bar as grouped %}' + \
+                  '{% for group in grouped %}' + \
+                  '{{ group.grouper }}:' + \
+                  '{% for item in group.list %}' + \
+                  '{{ item.foo }}' + \
+                  '{% endfor %},' + \
+                  '{% endfor %}',
+                  {}, 'INVALID:INVALIDINVALIDINVALIDINVALIDINVALIDINVALIDINVALID,'),
+
+    ### TEMPLATETAG TAG #######################################################
+    'templatetag01': ('{% templatetag openblock %}', {}, '{%'),
+    'templatetag02': ('{% templatetag closeblock %}', {}, '%}'),
+    'templatetag03': ('{% templatetag openvariable %}', {}, '{{'),
+    'templatetag04': ('{% templatetag closevariable %}', {}, '}}'),
+    'templatetag05': ('{% templatetag %}', {}, template.TemplateSyntaxError),
+    'templatetag06': ('{% templatetag foo %}', {}, template.TemplateSyntaxError),
+    'templatetag07': ('{% templatetag openbrace %}', {}, '{'),
+    'templatetag08': ('{% templatetag closebrace %}', {}, '}'),
+    'templatetag09': ('{% templatetag openbrace %}{% templatetag openbrace %}', {}, '{{'),
+    'templatetag10': ('{% templatetag closebrace %}{% templatetag closebrace %}', {}, '}}'),
+
+    ### WIDTHRATIO TAG ########################################################
+    'widthratio01': ('{% widthratio a b 0 %}', {'a':50,'b':100}, '0'),
+    'widthratio02': ('{% widthratio a b 100 %}', {'a':0,'b':0}, ''),
+    'widthratio03': ('{% widthratio a b 100 %}', {'a':0,'b':100}, '0'),
+    'widthratio04': ('{% widthratio a b 100 %}', {'a':50,'b':100}, '50'),
+    'widthratio05': ('{% widthratio a b 100 %}', {'a':100,'b':100}, '100'),
+
+    # 62.5 should round to 63
+    'widthratio06': ('{% widthratio a b 100 %}', {'a':50,'b':80}, '63'),
+
+    # 71.4 should round to 71
+    'widthratio07': ('{% widthratio a b 100 %}', {'a':50,'b':70}, '71'),
+
+    # Raise exception if we don't have 3 args, last one an integer
+    'widthratio08': ('{% widthratio %}', {}, template.TemplateSyntaxError),
+    'widthratio09': ('{% widthratio a b %}', {'a':50,'b':100}, template.TemplateSyntaxError),
+    'widthratio10': ('{% widthratio a b 100.0 %}', {'a':50,'b':100}, template.TemplateSyntaxError),
+
+    ### NOW TAG ########################################################
+    # Simple case
+    'now01' : ('{% now "j n Y"%}', {}, str(datetime.now().day) + ' ' + str(datetime.now().month) + ' ' + str(datetime.now().year)),
+
+    # Check parsing of escaped and special characters
+    'now02' : ('{% now "j "n" Y"%}', {}, template.TemplateSyntaxError),
+#    'now03' : ('{% now "j \"n\" Y"%}', {}, str(datetime.now().day) + '"' + str(datetime.now().month) + '"' + str(datetime.now().year)),
+#    'now04' : ('{% now "j \nn\n Y"%}', {}, str(datetime.now().day) + '\n' + str(datetime.now().month) + '\n' + str(datetime.now().year))
+
+    ### TIMESINCE TAG ##################################################
+    # Default compare with datetime.now()
+    'timesince01' : ('{{ a|timesince }}', {'a':datetime.now() + timedelta(minutes=-1, seconds = -10)}, '1 minute'),
+    'timesince02' : ('{{ a|timesince }}', {'a':(datetime.now() - timedelta(days=1, minutes = 1))}, '1 day'),
+    'timesince03' : ('{{ a|timesince }}', {'a':(datetime.now() -
+        timedelta(hours=1, minutes=25, seconds = 10))}, '1 hour, 25 minutes'),
+
+    # Compare to a given parameter
+    'timesince04' : ('{{ a|timesince:b }}', {'a':NOW + timedelta(days=2), 'b':NOW + timedelta(days=1)}, '1 day'),
+    'timesince05' : ('{{ a|timesince:b }}', {'a':NOW + timedelta(days=2, minutes=1), 'b':NOW + timedelta(days=2)}, '1 minute'),
+
+    # Check that timezone is respected
+    'timesince06' : ('{{ a|timesince:b }}', {'a':NOW_tz + timedelta(hours=8), 'b':NOW_tz}, '8 hours'),
+
+    ### TIMEUNTIL TAG ##################################################
+    # Default compare with datetime.now()
+    'timeuntil01' : ('{{ a|timeuntil }}', {'a':datetime.now() + timedelta(minutes=2, seconds = 10)}, '2 minutes'),
+    'timeuntil02' : ('{{ a|timeuntil }}', {'a':(datetime.now() + timedelta(days=1, seconds = 10))}, '1 day'),
+    'timeuntil03' : ('{{ a|timeuntil }}', {'a':(datetime.now() + timedelta(hours=8, minutes=10, seconds = 10))}, '8 hours, 10 minutes'),
+
+    # Compare to a given parameter
+    'timeuntil04' : ('{{ a|timeuntil:b }}', {'a':NOW - timedelta(days=1), 'b':NOW - timedelta(days=2)}, '1 day'),
+    'timeuntil05' : ('{{ a|timeuntil:b }}', {'a':NOW - timedelta(days=2), 'b':NOW - timedelta(days=2, minutes=1)}, '1 minute'),
+}
+
+def test_template_loader(template_name, template_dirs=None):
+    "A custom template loader that loads the unit-test templates."
+    try:
+        return (TEMPLATE_TESTS[template_name][0] , "test:%s" % template_name)
+    except KeyError:
+        raise template.TemplateDoesNotExist, template_name
+
+def run_tests(verbosity=0, standalone=False):
+    # Register our custom template loader.
+    old_template_loaders = loader.template_source_loaders
+    loader.template_source_loaders = [test_template_loader]
+
+    failed_tests = []
+    tests = TEMPLATE_TESTS.items()
+    tests.sort()
+
+    # Turn TEMPLATE_DEBUG off, because tests assume that.
+    old_td, settings.TEMPLATE_DEBUG = settings.TEMPLATE_DEBUG, False
+    # Set TEMPLATE_STRING_IF_INVALID to a known string 
+    old_invalid, settings.TEMPLATE_STRING_IF_INVALID = settings.TEMPLATE_STRING_IF_INVALID, 'INVALID'
+    
+    for name, vals in tests:
+        install()
+        if 'LANGUAGE_CODE' in vals[1]:
+            activate(vals[1]['LANGUAGE_CODE'])
+        else:
+            activate('en-us')
+        try:
+            output = loader.get_template(name).render(template.Context(vals[1]))
+        except Exception, e:
+            if e.__class__ == vals[2]:
+                if verbosity:
+                    print "Template test: %s -- Passed" % name
+            else:
+                if verbosity:
+                    traceback.print_exc()
+                    print "Template test: %s -- FAILED. Got %s, exception: %s" % (name, e.__class__, e)
+                failed_tests.append(name)
+            continue
+        if 'LANGUAGE_CODE' in vals[1]:
+            deactivate()
+        if output == vals[2]:
+            if verbosity:
+                print "Template test: %s -- Passed" % name
+        else:
+            if verbosity:
+                print "Template test: %s -- FAILED. Expected %r, got %r" % (name, vals[2], output)
+            failed_tests.append(name)
+    loader.template_source_loaders = old_template_loaders
+    deactivate()
+    settings.TEMPLATE_DEBUG = old_td
+    settings.TEMPLATE_STRING_IF_INVALID = old_invalid
+
+    if failed_tests and not standalone:
+        msg = "Template tests %s failed." % failed_tests
+        if not verbosity:
+            msg += "  Re-run tests with -v1 to see actual failures"
+        raise Exception, msg
+
+if __name__ == "__main__":
+    run_tests(1, True)

Added: vendor/django/current/tests/othertests/urlpatterns_reverse.py
===================================================================
--- vendor/django/current/tests/othertests/urlpatterns_reverse.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/othertests/urlpatterns_reverse.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,47 @@
+"Unit tests for reverse URL lookup"
+
+from django.core.urlresolvers import reverse_helper, NoReverseMatch
+import re
+
+test_data = (
+    ('^places/(\d+)/$', 'places/3/', [3], {}),
+    ('^places/(\d+)/$', 'places/3/', ['3'], {}),
+    ('^places/(\d+)/$', NoReverseMatch, ['a'], {}),
+    ('^places/(\d+)/$', NoReverseMatch, [], {}),
+    ('^places/(?P<id>\d+)/$', 'places/3/', [], {'id': 3}),
+    ('^people/(?P<name>\w+)/$', 'people/adrian/', ['adrian'], {}),
+    ('^people/(?P<name>\w+)/$', 'people/adrian/', [], {'name': 'adrian'}),
+    ('^people/(?P<name>\w+)/$', NoReverseMatch, ['name with spaces'], {}),
+    ('^people/(?P<name>\w+)/$', NoReverseMatch, [], {'name': 'name with spaces'}),
+    ('^people/(?P<name>\w+)/$', NoReverseMatch, [], {}),
+    ('^hardcoded/$', 'hardcoded/', [], {}),
+    ('^hardcoded/$', 'hardcoded/', ['any arg'], {}),
+    ('^hardcoded/$', 'hardcoded/', [], {'kwarg': 'foo'}),
+    ('^people/(?P<state>\w\w)/(?P<name>\w+)/$', 'people/il/adrian/', [], {'state': 'il', 'name': 'adrian'}),
+    ('^people/(?P<state>\w\w)/(?P<name>\d)/$', NoReverseMatch, [], {'state': 'il', 'name': 'adrian'}),
+    ('^people/(?P<state>\w\w)/(?P<name>\w+)/$', NoReverseMatch, [], {'state': 'il'}),
+    ('^people/(?P<state>\w\w)/(?P<name>\w+)/$', NoReverseMatch, [], {'name': 'adrian'}),
+    ('^people/(?P<state>\w\w)/(\w+)/$', NoReverseMatch, ['il'], {'name': 'adrian'}),
+    ('^people/(?P<state>\w\w)/(\w+)/$', 'people/il/adrian/', ['adrian'], {'state': 'il'}),
+)
+
+def run_tests(verbosity=0):
+    for regex, expected, args, kwargs in test_data:
+        passed = True
+        try:
+            got = reverse_helper(re.compile(regex), *args, **kwargs)
+        except NoReverseMatch, e:
+            if expected != NoReverseMatch:
+                passed, got = False, str(e)
+        else:
+            if got != expected:
+                passed, got = False, got
+        if passed and verbosity:
+            print "Passed: %s" % regex
+        elif not passed:
+            print "REVERSE LOOKUP FAILED: %s" % regex
+            print "   Got: %s" % got
+            print "   Expected: %r" % expected
+
+if __name__ == "__main__":
+    run_tests(1)

Added: vendor/django/current/tests/regressiontests/__init__.py
===================================================================

Added: vendor/django/current/tests/regressiontests/initial_sql_regress/__init__.py
===================================================================

Added: vendor/django/current/tests/regressiontests/initial_sql_regress/models.py
===================================================================
--- vendor/django/current/tests/regressiontests/initial_sql_regress/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/regressiontests/initial_sql_regress/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,13 @@
+"""
+Regression tests for initial SQL insertion.
+"""
+
+from django.db import models
+
+class Simple(models.Model):
+    name = models.CharField(maxlength = 50)
+
+API_TESTS = ""
+
+# NOTE: The format of the included SQL file for this test suite is important.
+# It must end with a trailing newline in order to test the fix for #2161.

Added: vendor/django/current/tests/regressiontests/initial_sql_regress/sql/simple.sql
===================================================================
--- vendor/django/current/tests/regressiontests/initial_sql_regress/sql/simple.sql	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/regressiontests/initial_sql_regress/sql/simple.sql	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,7 @@
+INSERT INTO initial_sql_regress_simple (name) VALUES ('John');
+INSERT INTO initial_sql_regress_simple (name) VALUES ('Paul');
+INSERT INTO initial_sql_regress_simple (name) VALUES ('Ringo');
+INSERT INTO initial_sql_regress_simple (name) VALUES ('George');
+INSERT INTO initial_sql_regress_simple (name) VALUES ('Miles O''Brien');
+INSERT INTO initial_sql_regress_simple (name) VALUES ('Semicolon;Man');
+

Added: vendor/django/current/tests/regressiontests/many_to_one_regress/__init__.py
===================================================================

Added: vendor/django/current/tests/regressiontests/many_to_one_regress/models.py
===================================================================
--- vendor/django/current/tests/regressiontests/many_to_one_regress/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/regressiontests/many_to_one_regress/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,13 @@
+from django.db import models
+
+class First(models.Model):
+    second = models.IntegerField()
+
+class Second(models.Model):
+    first = models.ForeignKey(First, related_name = 'the_first')
+
+# If ticket #1578 ever slips back in, these models will not be able to be
+# created (the field names being lower-cased versions of their opposite
+# classes is important here).
+
+API_TESTS = ""

Added: vendor/django/current/tests/regressiontests/one_to_one_regress/__init__.py
===================================================================

Added: vendor/django/current/tests/regressiontests/one_to_one_regress/models.py
===================================================================
--- vendor/django/current/tests/regressiontests/one_to_one_regress/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/regressiontests/one_to_one_regress/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,37 @@
+from django.db import models
+
+class Place(models.Model):
+    name = models.CharField(maxlength=50)
+    address = models.CharField(maxlength=80)
+
+    def __str__(self):
+        return "%s the place" % self.name
+
+class Restaurant(models.Model):
+    place = models.OneToOneField(Place)
+    serves_hot_dogs = models.BooleanField()
+    serves_pizza = models.BooleanField()
+
+    def __str__(self):
+        return "%s the restaurant" % self.place.name
+
+class Favorites(models.Model):
+    name = models.CharField(maxlength = 50)
+    restaurants = models.ManyToManyField(Restaurant)
+
+    def __str__(self):
+        return "Favorites for %s" % self.name
+
+API_TESTS = """
+# Regression test for #1064 and #1506: Check that we create models via the m2m
+# relation if the remote model has a OneToOneField.
+>>> p1 = Place(name='Demon Dogs', address='944 W. Fullerton')
+>>> p1.save()
+>>> r = Restaurant(place=p1, serves_hot_dogs=True, serves_pizza=False)
+>>> r.save()
+>>> f = Favorites(name = 'Fred')
+>>> f.save()
+>>> f.restaurants = [r]
+>>> f.restaurants.all()
+[<Restaurant: Demon Dogs the restaurant>]
+"""

Added: vendor/django/current/tests/regressiontests/string_lookup/__init__.py
===================================================================

Added: vendor/django/current/tests/regressiontests/string_lookup/models.py
===================================================================
--- vendor/django/current/tests/regressiontests/string_lookup/models.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/regressiontests/string_lookup/models.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,69 @@
+from django.db import models
+
+class Foo(models.Model):
+    name = models.CharField(maxlength=50)
+
+    def __str__(self):
+        return "Foo %s" % self.name
+
+class Bar(models.Model):
+    name = models.CharField(maxlength=50)
+    normal = models.ForeignKey(Foo, related_name='normal_foo')
+    fwd = models.ForeignKey("Whiz")
+    back = models.ForeignKey("Foo")
+
+    def __str__(self):
+        return "Bar %s" % self.place.name
+
+class Whiz(models.Model):
+    name = models.CharField(maxlength = 50)
+
+    def __str__(self):
+        return "Whiz %s" % self.name
+
+class Child(models.Model):
+    parent = models.OneToOneField('Base')
+    name = models.CharField(maxlength = 50)
+
+    def __str__(self):
+        return "Child %s" % self.name
+    
+class Base(models.Model):
+    name = models.CharField(maxlength = 50)
+
+    def __str__(self):
+        return "Base %s" % self.name
+
+API_TESTS = """
+# Regression test for #1661 and #1662: Check that string form referencing of models works, 
+# both as pre and post reference, on all RelatedField types.
+
+>>> f1 = Foo(name="Foo1")
+>>> f1.save()
+>>> f2 = Foo(name="Foo1")
+>>> f2.save()
+
+>>> w1 = Whiz(name="Whiz1")
+>>> w1.save()
+
+>>> b1 = Bar(name="Bar1", normal=f1, fwd=w1, back=f2)
+>>> b1.save()
+
+>>> b1.normal
+<Foo: Foo Foo1>
+
+>>> b1.fwd
+<Whiz: Whiz Whiz1>
+
+>>> b1.back
+<Foo: Foo Foo1>
+
+>>> base1 = Base(name="Base1")
+>>> base1.save()
+
+>>> child1 = Child(name="Child1", parent=base1)
+>>> child1.save()
+
+>>> child1.parent
+<Base: Base Base1>
+"""

Added: vendor/django/current/tests/runtests.py
===================================================================
--- vendor/django/current/tests/runtests.py	2007-03-08 00:35:52 UTC (rev 6186)
+++ vendor/django/current/tests/runtests.py	2007-03-08 02:35:26 UTC (rev 6187)
@@ -0,0 +1,294 @@
+#!/usr/bin/env python
+
+import os, re, sys, time, traceback
+
+# doctest is included in the same package as this module, because this testing
+# framework uses features only available in the Python 2.4 version of doctest,
+# and Django aims to work with Python 2.3+.
+import doctest
+
+MODEL_TESTS_DIR_NAME = 'modeltests'
+OTHER_TESTS_DIR = "othertests"
+REGRESSION_TESTS_DIR_NAME = 'regressiontests'
+TEST_DATABASE_NAME = 'django_test_db'
+
+error_list = []
+def log_error(model_name, title, description):
+    error_list.append({
+        'title': "%r module: %s" % (model_name, title),
+        'description': description,
+    })
+
+MODEL_TEST_DIR = os.path.join(os.path.dirname(__file__), MODEL_TESTS_DIR_NAME)
+REGRESSION_TEST_DIR = os.path.join(os.path.dirname(__file__), REGRESSION_TESTS_DIR_NAME)
+
+ALWAYS_INSTALLED_APPS = [
+    'django.contrib.contenttypes',
+    'django.contrib.auth',
+    'django.contrib.sites',
+    'django.contrib.flatpages',
+    'django.contrib.redirects',
+    'django.contrib.sessions',
+    'django.contrib.comments',
+    'django.contrib.admin',
+]
+
+def get_test_models():
+    models = []
+    for loc, dirpath in (MODEL_TESTS_DIR_NAME, MODEL_TEST_DIR), (REGRESSION_TESTS_DIR_NAME, REGRESSION_TEST_DIR):
+        for f in os.listdir(dirpath):
+            if f.startswith('__init__') or f.startswith('.') or f.startswith('sql'):
+                continue
+            models.append((loc, f))
+    return models
+
+class DjangoDoctestRunner(doctest.DocTestRunner):
+    def __init__(self, verbosity_level, *args, **kwargs):
+        self.verbosity_level = verbosity_level
+        doctest.DocTestRunner.__init__(self, *args, **kwargs)
+        self._checker = DjangoDoctestOutputChecker()
+        self.optionflags = doctest.ELLIPSIS
+
+    def report_start(self, out, test, example):
+        if self.verbosity_level > 1:
+            out("  >>> %s\n" % example.source.strip())
+
+    def report_failure(self, out, test, example, got):
+        log_error(test.name, "API test failed",
+            "Code: %r\nLine: %s\nExpected: %r\nGot: %r" % (example.source.strip(), example.lineno, example.want, got))
+
+    def report_unexpected_exception(self, out, test, example, exc_info):
+        from django.db import transaction
+        tb = ''.join(traceback.format_exception(*exc_info)[1:])
+        log_error(test.name, "API test raised an exception",
+            "Code: %r\nLine: %s\nException: %s" % (example.source.strip(), example.lineno, tb))
+        # Rollback, in case of database errors. Otherwise they'd have
+        # side effects on other tests.
+        transaction.rollback_unless_managed()
+
+normalize_long_ints = lambda s: re.sub(r'(?<![\w])(\d+)L(?![\w])', '\\1', s)
+
+class DjangoDoctestOutputChecker(doctest.OutputChecker):
+    def check_output(self, want, got, optionflags):
+        ok = doctest.OutputChecker.check_output(self, want, got, optionflags)
+
+        # Doctest does an exact string comparison of output, which means long
+        # integers aren't equal to normal integers ("22L" vs. "22"). The
+        # following code normalizes long integers so that they equal normal
+        # integers.
+        if not ok:
+            return normalize_long_ints(want) == normalize_long_ints(got)
+        return ok
+
+class TestRunner:
+    def __init__(self, verbosity_level=0, which_tests=None):
+        self.verbosity_level = verbosity_level
+        self.which_tests = which_tests
+
+    def output(self, required_level, message):
+        if self.verbosity_level > required_level - 1:
+            print message
+
+    def run_tests(self):
+        from django.conf import settings
+
+        # An empty access of the settings to force the default options to be
+        # installed prior to assigning to them.
+        settings.INSTALLED_APPS
+
+        # Manually set INSTALLED_APPS to point to the test models.
+        settings.INSTALLED_APPS = ALWAYS_INSTALLED_APPS + ['.'.join(a) for a in get_test_models()]
+
+        # Manually set DEBUG and USE_I18N.
+        settings.DEBUG = False
+        settings.USE_I18N = True
+
+        from django.db import connection
+        from django.core import management
+        import django.db.models
+
+        # Determine which models we're going to test.
+        test_models = get_test_models()
+        if 'othertests' in self.which_tests:
+            self.which_tests.remove('othertests')
+            run_othertests = True
+            if not self.which_tests:
+                test_models = []
+        else:
+            run_othertests = not self.which_tests
+
+        if self.which_tests:
+            # Only run the specified tests.
+            bad_models = [m for m in self.which_tests if (MODEL_TESTS_DIR_NAME, m) not in test_models and (REGRESSION_TESTS_DIR_NAME, m) not in test_models]
+            if bad_models:
+                sys.stderr.write("Models not found: %s\n" % bad_models)
+                sys.exit(1)
+            else:
+                all_tests = []
+                for test in self.which_tests:
+                    for loc in MODEL_TESTS_DIR_NAME, REGRESSION_TESTS_DIR_NAME:
+                        if (loc, test) in test_models:
+                            all_tests.append((loc, test))
+                test_models = all_tests
+
+        self.output(0, "Running tests with database %r" % settings.DATABASE_ENGINE)
+
+        # If we're using SQLite, it's more convenient to test against an
+        # in-memory database.
+        if settings.DATABASE_ENGINE == "sqlite3":
+            global TEST_DATABASE_NAME
+            TEST_DATABASE_NAME = ":memory:"
+        else:
+            # Create the test database and connect to it. We need to autocommit
+            # if the database supports it because PostgreSQL doesn't allow
+            # CREATE/DROP DATABASE statements within transactions.
+            cursor = connection.cursor()
+            self._set_autocommit(connection)
+            self.output(1, "Creating test database")
+            try:
+                cursor.execute("CREATE DATABASE %s" % TEST_DATABASE_NAME)
+            except Exception, e:
+                sys.stderr.write("Got an error creating the test database: %s\n" % e)
+                confirm = raw_input("It appears the test database, %s, already exists. Type 'yes' to delete it, or 'no' to cancel: " % TEST_DATABASE_NAME)
+                if confirm == 'yes':
+                    cursor.execute("DROP DATABASE %s" % TEST_DATABASE_NAME)
+                    cursor.execute("CREATE DATABASE %s" % TEST_DATABASE_NAME)
+                else:
+                    print "Tests cancelled."
+                    return
+        connection.close()
+        old_database_name = settings.DATABASE_NAME
+        settings.DATABASE_NAME = TEST_DATABASE_NAME
+
+        # Initialize the test database.
+        cursor = connection.cursor()
+
+        from django.db.models.loading import load_app
+        # Install the core always installed apps
+        for app in ALWAYS_INSTALLED_APPS:
+            self.output(1, "Installing contrib app %s" % app)
+            mod = load_app(app)
+            management.install(mod)
+
+        # Run the tests for each test model.
+        self.output(1, "Running app tests")
+        for model_dir, model_name in test_models:
+            self.output(1, "%s model: Importing" % model_name)
+            try:
+                mod = load_app(model_dir + '.' + model_name)
+            except Exception, e:
+                log_error(model_name, "Error while importing", ''.join(traceback.format_exception(*sys.exc_info())[1:]))
+                continue
+
+            if not getattr(mod, 'error_log', None):
+                # Model is not marked as an invalid model
+                self.output(1, "%s.%s model: Installing" % (model_dir, model_name))
+                management.install(mod)
+
+                # Run the API tests.
+                p = doctest.DocTestParser()
+                test_namespace = dict([(m._meta.object_name, m) \
+                                        for m in django.db.models.get_models(mod)])
+                dtest = p.get_doctest(mod.API_TESTS, test_namespace, model_name, None, None)
+                # Manually set verbose=False, because "-v" command-line parameter
+                # has side effects on doctest TestRunner class.
+                runner = DjangoDoctestRunner(verbosity_level=verbosity_level, verbose=False)
+                self.output(1, "%s.%s model: Running tests" % (model_dir, model_name))
+                runner.run(dtest, clear_globs=True, out=sys.stdout.write)
+            else:
+                # Check that model known to be invalid is invalid for the right reasons.
+                self.output(1, "%s.%s model: Validating" % (model_dir, model_name))
+
+                from cStringIO import StringIO
+                s = StringIO()
+                count = management.get_validation_errors(s, mod)
+                s.seek(0)
+                error_log = s.read()
+                actual = error_log.split('\n')
+                expected = mod.error_log.split('\n')
+
+                unexpected = [err for err in actual if err not in expected]
+                missing = [err for err in expected if err not in actual]
+
+                if unexpected or missing:
+                    unexpected_log = '\n'.join(unexpected)
+                    missing_log = '\n'.join(missing)
+                    log_error(model_name,
+                        "Validator found %d validation errors, %d expected" % (count, len(expected) - 1),
+                        "Missing errors:\n%s\n\nUnexpected errors:\n%s" % (missing_log, unexpected_log))
+
+        if run_othertests:
+            # Run the non-model tests in the other tests dir
+            self.output(1, "Running other tests")
+            other_tests_dir = os.path.join(os.path.dirname(__file__), OTHER_TESTS_DIR)
+            test_modules = [f[:-3] for f in os.listdir(other_tests_dir) if f.endswith('.py') and not f.startswith('__init__')]
+            for module in test_modules:
+                self.output(1, "%s module: Importing" % module)
+                try:
+                    mod = __import__("othertests." + module, '', '', [''])
+                except Exception, e:
+                    log_error(module, "Error while importing", ''.join(traceback.format_exception(*sys.exc_info())[1:]))
+                    continue
+                if mod.__doc__:
+                    p = doctest.DocTestParser()
+                    dtest = p.get_doctest(mod.__doc__, mod.__dict__, module, None, None)
+                    runner = DjangoDoctestRunner(verbosity_level=verbosity_level, verbose=False)
+                    self.output(1, "%s module: running tests" % module)
+                    runner.run(dtest, clear_globs=True, out=sys.stdout.write)
+                if hasattr(mod, "run_tests") and callable(mod.run_tests):
+                    self.output(1, "%s module: running tests" % module)
+                    try:
+                        mod.run_tests(verbosity_level)
+                    except Exception, e:
+                        log_error(module, "Exception running tests", ''.join(traceback.format_exception(*sys.exc_info())[1:]))
+                        continue
+
+        # Unless we're using SQLite, remove the test database to clean up after
+        # ourselves. Connect to the previous database (not the test database)
+        # to do so, because it's not allowed to delete a database while being
+        # connected to it.
+        if settings.DATABASE_ENGINE != "sqlite3":
+            connection.close()
+            settings.DATABASE_NAME = old_database_name
+            cursor = connection.cursor()
+            self.output(1, "Deleting test database")
+            self._set_autocommit(connection)
+            time.sleep(1) # To avoid "database is being accessed by other users" errors.
+            cursor.execute("DROP DATABASE %s" % TEST_DATABASE_NAME)
+
+        # Display output.
+        if error_list:
+            for d in error_list:
+                print
+                print d['title']
+                print "=" * len(d['title'])
+                print d['description']
+            print "%s error%s:" % (len(error_list), len(error_list) != 1 and 's' or '')
+        else:
+            print "All tests passed."
+
+    def _set_autocommit(self, connection):
+        """
+        Make sure a connection is in autocommit mode.
+        """
+        if hasattr(connection.connection, "autocommit"):
+            connection.connection.autocommit(True)
+        elif hasattr(connection.connection, "set_isolation_level"):
+            connection.connection.set_isolation_level(0)
+
+if __name__ == "__main__":
+    from optparse import OptionParser
+    usage = "%prog [options] [model model model ...]"
+    parser = OptionParser(usage=usage)
+    parser.add_option('-v', help='How verbose should the output be? Choices are 0, 1 and 2, where 2 is most verbose. Default is 0.',
+        type='choice', choices=['0', '1', '2'])
+    parser.add_option('--settings',
+        help='Python path to settings module, e.g. "myproject.settings". If this isn\'t provided, the DJANGO_SETTINGS_MODULE environment variable will be used.')
+    options, args = parser.parse_args()
+    verbosity_level = 0
+    if options.v:
+        verbosity_level = int(options.v)
+    if options.settings:
+        os.environ['DJANGO_SETTINGS_MODULE'] = options.settings
+    t = TestRunner(verbosity_level, args)
+    t.run_tests()


Property changes on: vendor/django/current/tests/runtests.py
___________________________________________________________________
Name: svn:executable
   + 



More information about the cig-commits mailing list