summaryrefslogtreecommitdiff
path: root/parts/django/tests/regressiontests/views
diff options
context:
space:
mode:
Diffstat (limited to 'parts/django/tests/regressiontests/views')
-rw-r--r--parts/django/tests/regressiontests/views/__init__.py10
-rw-r--r--parts/django/tests/regressiontests/views/app0/__init__.py1
-rw-r--r--parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mobin0 -> 482 bytes
-rw-r--r--parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po20
-rw-r--r--parts/django/tests/regressiontests/views/app1/__init__.py1
-rw-r--r--parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.mobin0 -> 482 bytes
-rw-r--r--parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.po20
-rw-r--r--parts/django/tests/regressiontests/views/app2/__init__.py1
-rw-r--r--parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.mobin0 -> 482 bytes
-rw-r--r--parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.po20
-rw-r--r--parts/django/tests/regressiontests/views/app3/__init__.py1
-rw-r--r--parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.mobin0 -> 483 bytes
-rw-r--r--parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.po20
-rw-r--r--parts/django/tests/regressiontests/views/app4/__init__.py1
-rw-r--r--parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.mobin0 -> 483 bytes
-rw-r--r--parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.po20
-rw-r--r--parts/django/tests/regressiontests/views/fixtures/testdata.json75
-rw-r--r--parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.mobin0 -> 490 bytes
-rw-r--r--parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.po25
-rw-r--r--parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.mobin0 -> 484 bytes
-rw-r--r--parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.po24
-rw-r--r--parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.mobin0 -> 489 bytes
-rw-r--r--parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.po24
-rw-r--r--parts/django/tests/regressiontests/views/media/file.txt1
-rw-r--r--parts/django/tests/regressiontests/views/media/file.txt.gzbin0 -> 51 bytes
-rw-r--r--parts/django/tests/regressiontests/views/media/file.unknown1
-rw-r--r--parts/django/tests/regressiontests/views/models.py49
-rw-r--r--parts/django/tests/regressiontests/views/templates/debug/template_exception.html2
-rw-r--r--parts/django/tests/regressiontests/views/templatetags/__init__.py0
-rw-r--r--parts/django/tests/regressiontests/views/templatetags/debugtags.py10
-rw-r--r--parts/django/tests/regressiontests/views/tests/__init__.py7
-rw-r--r--parts/django/tests/regressiontests/views/tests/debug.py50
-rw-r--r--parts/django/tests/regressiontests/views/tests/defaults.py85
-rw-r--r--parts/django/tests/regressiontests/views/tests/generic/__init__.py0
-rw-r--r--parts/django/tests/regressiontests/views/tests/generic/create_update.py211
-rw-r--r--parts/django/tests/regressiontests/views/tests/generic/date_based.py140
-rw-r--r--parts/django/tests/regressiontests/views/tests/i18n.py149
-rw-r--r--parts/django/tests/regressiontests/views/tests/specials.py35
-rw-r--r--parts/django/tests/regressiontests/views/tests/static.py77
-rw-r--r--parts/django/tests/regressiontests/views/urls.py131
-rw-r--r--parts/django/tests/regressiontests/views/views.py59
41 files changed, 1270 insertions, 0 deletions
diff --git a/parts/django/tests/regressiontests/views/__init__.py b/parts/django/tests/regressiontests/views/__init__.py
new file mode 100644
index 0000000..d1c6e08
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/__init__.py
@@ -0,0 +1,10 @@
+# -*- coding: utf8 -*-
+
+class BrokenException(Exception):
+ pass
+
+except_args = ('Broken!', # plain exception with ASCII text
+ u'¡Broken!', # non-ASCII unicode data
+ '¡Broken!', # non-ASCII, utf-8 encoded bytestring
+ '\xa1Broken!', ) # non-ASCII, latin1 bytestring
+
diff --git a/parts/django/tests/regressiontests/views/app0/__init__.py b/parts/django/tests/regressiontests/views/app0/__init__.py
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app0/__init__.py
@@ -0,0 +1 @@
+#
diff --git a/parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..662204a
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a458935
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app0/locale/en/LC_MESSAGES/djangojs.po
@@ -0,0 +1,20 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 12:41-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "il faut traduire cette chaîne de caractères de app0"
+msgstr "this app0 string is to be translated"
diff --git a/parts/django/tests/regressiontests/views/app1/__init__.py b/parts/django/tests/regressiontests/views/app1/__init__.py
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app1/__init__.py
@@ -0,0 +1 @@
+#
diff --git a/parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..5d6aecb
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..a4627db
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app1/locale/fr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,20 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 12:41-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "this app1 string is to be translated"
+msgstr "il faut traduire cette chaîne de caractères de app1"
diff --git a/parts/django/tests/regressiontests/views/app2/__init__.py b/parts/django/tests/regressiontests/views/app2/__init__.py
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app2/__init__.py
@@ -0,0 +1 @@
+#
diff --git a/parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..17e1863
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..637b9e6
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app2/locale/fr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,20 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 22:05-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "this app2 string is to be translated"
+msgstr "il faut traduire cette chaîne de caractères de app2"
diff --git a/parts/django/tests/regressiontests/views/app3/__init__.py b/parts/django/tests/regressiontests/views/app3/__init__.py
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app3/__init__.py
@@ -0,0 +1 @@
+#
diff --git a/parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..0c485a9
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..1e3be0b
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app3/locale/es_AR/LC_MESSAGES/djangojs.po
@@ -0,0 +1,20 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 12:41-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "il faut traduire cette chaîne de caractères de app3"
+msgstr "este texto de app3 debe ser traducido"
diff --git a/parts/django/tests/regressiontests/views/app4/__init__.py b/parts/django/tests/regressiontests/views/app4/__init__.py
new file mode 100644
index 0000000..792d600
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app4/__init__.py
@@ -0,0 +1 @@
+#
diff --git a/parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..581fbb0
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..27403c0
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/app4/locale/es_AR/LC_MESSAGES/djangojs.po
@@ -0,0 +1,20 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 12:41-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "il faut traduire cette chaîne de caractères de app4"
+msgstr "este texto de app4 debe ser traducido"
diff --git a/parts/django/tests/regressiontests/views/fixtures/testdata.json b/parts/django/tests/regressiontests/views/fixtures/testdata.json
new file mode 100644
index 0000000..ab68407
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/fixtures/testdata.json
@@ -0,0 +1,75 @@
+[
+ {
+ "pk": "1",
+ "model": "auth.user",
+ "fields": {
+ "username": "testclient",
+ "first_name": "Test",
+ "last_name": "Client",
+ "is_active": true,
+ "is_superuser": false,
+ "is_staff": false,
+ "last_login": "2006-12-17 07:03:31",
+ "groups": [],
+ "user_permissions": [],
+ "password": "sha1$6efc0$f93efe9fd7542f25a7be94871ea45aa95de57161",
+ "email": "testclient@example.com",
+ "date_joined": "2006-12-17 07:03:31"
+ }
+ },
+ {
+ "pk": 1,
+ "model": "views.author",
+ "fields": {
+ "name": "Boris"
+ }
+ },
+ {
+ "pk": 1,
+ "model": "views.article",
+ "fields": {
+ "author": 1,
+ "title": "Old Article",
+ "slug": "old_article",
+ "date_created": "2001-01-01 21:22:23"
+ }
+ },
+ {
+ "pk": 2,
+ "model": "views.article",
+ "fields": {
+ "author": 1,
+ "title": "Current Article",
+ "slug": "current_article",
+ "date_created": "2007-09-17 21:22:23"
+ }
+ },
+ {
+ "pk": 3,
+ "model": "views.article",
+ "fields": {
+ "author": 1,
+ "title": "Future Article",
+ "slug": "future_article",
+ "date_created": "3000-01-01 21:22:23"
+ }
+ },
+ {
+ "pk": 1,
+ "model": "views.urlarticle",
+ "fields": {
+ "author": 1,
+ "title": "Old Article",
+ "slug": "old_article",
+ "date_created": "2001-01-01 21:22:23"
+ }
+ },
+ {
+ "pk": 1,
+ "model": "sites.site",
+ "fields": {
+ "domain": "testserver",
+ "name": "testserver"
+ }
+ }
+]
diff --git a/parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..b6b0887
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..669af4b
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/locale/es/LC_MESSAGES/djangojs.po
@@ -0,0 +1,25 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 16:45+0200\n"
+"PO-Revision-Date: 2010-05-12 12:57-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: media/js/translate.js:1
+msgid "this is to be translated"
+msgstr "esto tiene que ser traducido"
+
+
+msgid "Choose a time"
+msgstr "Elige una hora"
diff --git a/parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..356147c
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..0d03f95
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/locale/fr/LC_MESSAGES/djangojs.po
@@ -0,0 +1,24 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 19:15+0200\n"
+"PO-Revision-Date: 2010-05-12 12:41-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "this is to be translated"
+msgstr "il faut le traduire"
+
+
+msgid "Choose a time"
+msgstr "Choisir une heure"
diff --git a/parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.mo b/parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.mo
new file mode 100644
index 0000000..21659a9
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.mo
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.po b/parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.po
new file mode 100644
index 0000000..4ea193a
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/locale/ru/LC_MESSAGES/djangojs.po
@@ -0,0 +1,24 @@
+# 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@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-09-15 16:45+0200\n"
+"PO-Revision-Date: 2010-05-12 12:57-0300\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+msgid "this is to be translated"
+msgstr "перевод"
+
+
+msgid "Choose a time"
+msgstr "Выберите время"
diff --git a/parts/django/tests/regressiontests/views/media/file.txt b/parts/django/tests/regressiontests/views/media/file.txt
new file mode 100644
index 0000000..f1fc82c
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/media/file.txt
@@ -0,0 +1 @@
+An example media file. \ No newline at end of file
diff --git a/parts/django/tests/regressiontests/views/media/file.txt.gz b/parts/django/tests/regressiontests/views/media/file.txt.gz
new file mode 100644
index 0000000..0ee7d18
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/media/file.txt.gz
Binary files differ
diff --git a/parts/django/tests/regressiontests/views/media/file.unknown b/parts/django/tests/regressiontests/views/media/file.unknown
new file mode 100644
index 0000000..77dcda8
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/media/file.unknown
@@ -0,0 +1 @@
+An unknown file extension.
diff --git a/parts/django/tests/regressiontests/views/models.py b/parts/django/tests/regressiontests/views/models.py
new file mode 100644
index 0000000..54f5c1c
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/models.py
@@ -0,0 +1,49 @@
+"""
+Regression tests for Django built-in views.
+"""
+
+from django.db import models
+
+class Author(models.Model):
+ name = models.CharField(max_length=100)
+
+ def __unicode__(self):
+ return self.name
+
+ def get_absolute_url(self):
+ return '/views/authors/%s/' % self.id
+
+class BaseArticle(models.Model):
+ """
+ An abstract article Model so that we can create article models with and
+ without a get_absolute_url method (for create_update generic views tests).
+ """
+ title = models.CharField(max_length=100)
+ slug = models.SlugField()
+ author = models.ForeignKey(Author)
+
+ class Meta:
+ abstract = True
+
+ def __unicode__(self):
+ return self.title
+
+class Article(BaseArticle):
+ date_created = models.DateTimeField()
+
+class UrlArticle(BaseArticle):
+ """
+ An Article class with a get_absolute_url defined.
+ """
+ date_created = models.DateTimeField()
+
+ def get_absolute_url(self):
+ return '/urlarticles/%s/' % self.slug
+ get_absolute_url.purge = True
+
+class DateArticle(BaseArticle):
+ """
+ An article Model with a DateField instead of DateTimeField,
+ for testing #7602
+ """
+ date_created = models.DateField()
diff --git a/parts/django/tests/regressiontests/views/templates/debug/template_exception.html b/parts/django/tests/regressiontests/views/templates/debug/template_exception.html
new file mode 100644
index 0000000..c6b34a8
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/templates/debug/template_exception.html
@@ -0,0 +1,2 @@
+{% load debugtags %}
+{% go_boom arg %}
diff --git a/parts/django/tests/regressiontests/views/templatetags/__init__.py b/parts/django/tests/regressiontests/views/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/templatetags/__init__.py
diff --git a/parts/django/tests/regressiontests/views/templatetags/debugtags.py b/parts/django/tests/regressiontests/views/templatetags/debugtags.py
new file mode 100644
index 0000000..9b2c661
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/templatetags/debugtags.py
@@ -0,0 +1,10 @@
+from django import template
+
+from regressiontests.views import BrokenException
+
+register = template.Library()
+
+@register.simple_tag
+def go_boom(arg):
+ raise BrokenException(arg)
+
diff --git a/parts/django/tests/regressiontests/views/tests/__init__.py b/parts/django/tests/regressiontests/views/tests/__init__.py
new file mode 100644
index 0000000..697968e
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/__init__.py
@@ -0,0 +1,7 @@
+from debug import *
+from defaults import *
+from generic.create_update import *
+from generic.date_based import *
+from i18n import *
+from specials import *
+from static import *
diff --git a/parts/django/tests/regressiontests/views/tests/debug.py b/parts/django/tests/regressiontests/views/tests/debug.py
new file mode 100644
index 0000000..4ebe37f
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/debug.py
@@ -0,0 +1,50 @@
+import inspect
+
+from django.conf import settings
+from django.core.files.uploadedfile import SimpleUploadedFile
+from django.test import TestCase
+from django.core.urlresolvers import reverse
+from django.template import TemplateSyntaxError
+
+from regressiontests.views import BrokenException, except_args
+
+class DebugViewTests(TestCase):
+ def setUp(self):
+ self.old_debug = settings.DEBUG
+ settings.DEBUG = True
+ self.old_template_debug = settings.TEMPLATE_DEBUG
+ settings.TEMPLATE_DEBUG = True
+
+ def tearDown(self):
+ settings.DEBUG = self.old_debug
+ settings.TEMPLATE_DEBUG = self.old_template_debug
+
+ def test_files(self):
+ response = self.client.get('/views/raises/')
+ self.assertEquals(response.status_code, 500)
+
+ data = {
+ 'file_data.txt': SimpleUploadedFile('file_data.txt', 'haha'),
+ }
+ response = self.client.post('/views/raises/', data)
+ self.assertTrue('file_data.txt' in response.content)
+ self.assertFalse('haha' in response.content)
+
+ def test_404(self):
+ response = self.client.get('/views/raises404/')
+ self.assertEquals(response.status_code, 404)
+
+ def test_view_exceptions(self):
+ for n in range(len(except_args)):
+ self.assertRaises(BrokenException, self.client.get,
+ reverse('view_exception', args=(n,)))
+
+ def test_template_exceptions(self):
+ for n in range(len(except_args)):
+ try:
+ self.client.get(reverse('template_exception', args=(n,)))
+ except TemplateSyntaxError, e:
+ raising_loc = inspect.trace()[-1][-2][0].strip()
+ self.assertFalse(raising_loc.find('raise BrokenException') == -1,
+ "Failed to find 'raise BrokenException' in last frame of traceback, instead found: %s" %
+ raising_loc)
diff --git a/parts/django/tests/regressiontests/views/tests/defaults.py b/parts/django/tests/regressiontests/views/tests/defaults.py
new file mode 100644
index 0000000..ffc3471
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/defaults.py
@@ -0,0 +1,85 @@
+from os import path
+
+from django.conf import settings
+from django.test import TestCase
+from django.contrib.contenttypes.models import ContentType
+
+from regressiontests.views.models import Author, Article, UrlArticle
+
+class DefaultsTests(TestCase):
+ """Test django views in django/views/defaults.py"""
+ fixtures = ['testdata.json']
+ non_existing_urls = ['/views/non_existing_url/', # this is in urls.py
+ '/views/other_non_existing_url/'] # this NOT in urls.py
+
+ def test_shortcut_with_absolute_url(self):
+ "Can view a shortcut for an Author object that has a get_absolute_url method"
+ for obj in Author.objects.all():
+ short_url = '/views/shortcut/%s/%s/' % (ContentType.objects.get_for_model(Author).id, obj.pk)
+ response = self.client.get(short_url)
+ self.assertRedirects(response, 'http://testserver%s' % obj.get_absolute_url(),
+ status_code=302, target_status_code=404)
+
+ def test_shortcut_no_absolute_url(self):
+ "Shortcuts for an object that has no get_absolute_url method raises 404"
+ for obj in Article.objects.all():
+ short_url = '/views/shortcut/%s/%s/' % (ContentType.objects.get_for_model(Article).id, obj.pk)
+ response = self.client.get(short_url)
+ self.assertEquals(response.status_code, 404)
+
+ def test_wrong_type_pk(self):
+ short_url = '/views/shortcut/%s/%s/' % (ContentType.objects.get_for_model(Author).id, 'nobody/expects')
+ response = self.client.get(short_url)
+ self.assertEquals(response.status_code, 404)
+
+ def test_shortcut_bad_pk(self):
+ short_url = '/views/shortcut/%s/%s/' % (ContentType.objects.get_for_model(Author).id, '42424242')
+ response = self.client.get(short_url)
+ self.assertEquals(response.status_code, 404)
+
+ def test_nonint_content_type(self):
+ an_author = Author.objects.all()[0]
+ short_url = '/views/shortcut/%s/%s/' % ('spam', an_author.pk)
+ response = self.client.get(short_url)
+ self.assertEquals(response.status_code, 404)
+
+ def test_bad_content_type(self):
+ an_author = Author.objects.all()[0]
+ short_url = '/views/shortcut/%s/%s/' % (42424242, an_author.pk)
+ response = self.client.get(short_url)
+ self.assertEquals(response.status_code, 404)
+
+ def test_page_not_found(self):
+ "A 404 status is returned by the page_not_found view"
+ for url in self.non_existing_urls:
+ response = self.client.get(url)
+ self.assertEquals(response.status_code, 404)
+
+ def test_csrf_token_in_404(self):
+ """
+ The 404 page should have the csrf_token available in the context
+ """
+ # See ticket #14565
+ old_DEBUG = settings.DEBUG
+ try:
+ settings.DEBUG = False # so we get real 404, not technical
+ for url in self.non_existing_urls:
+ response = self.client.get(url)
+ csrf_token = response.context['csrf_token']
+ self.assertNotEqual(str(csrf_token), 'NOTPROVIDED')
+ self.assertNotEqual(str(csrf_token), '')
+ finally:
+ settings.DEBUG = old_DEBUG
+
+ def test_server_error(self):
+ "The server_error view raises a 500 status"
+ response = self.client.get('/views/server_error/')
+ self.assertEquals(response.status_code, 500)
+
+ def test_get_absolute_url_attributes(self):
+ "A model can set attributes on the get_absolute_url method"
+ self.assertTrue(getattr(UrlArticle.get_absolute_url, 'purge', False),
+ 'The attributes of the original get_absolute_url must be added.')
+ article = UrlArticle.objects.get(pk=1)
+ self.assertTrue(getattr(article.get_absolute_url, 'purge', False),
+ 'The attributes of the original get_absolute_url must be added.')
diff --git a/parts/django/tests/regressiontests/views/tests/generic/__init__.py b/parts/django/tests/regressiontests/views/tests/generic/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/generic/__init__.py
diff --git a/parts/django/tests/regressiontests/views/tests/generic/create_update.py b/parts/django/tests/regressiontests/views/tests/generic/create_update.py
new file mode 100644
index 0000000..4ba1c35
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/generic/create_update.py
@@ -0,0 +1,211 @@
+import datetime
+
+from django.test import TestCase
+from django.core.exceptions import ImproperlyConfigured
+from regressiontests.views.models import Article, UrlArticle
+
+class CreateObjectTest(TestCase):
+
+ fixtures = ['testdata.json']
+
+ def test_login_required_view(self):
+ """
+ Verifies that an unauthenticated user attempting to access a
+ login_required view gets redirected to the login page and that
+ an authenticated user is let through.
+ """
+ view_url = '/views/create_update/member/create/article/'
+ response = self.client.get(view_url)
+ self.assertRedirects(response, '/accounts/login/?next=%s' % view_url)
+ # Now login and try again.
+ login = self.client.login(username='testclient', password='password')
+ self.assertTrue(login, 'Could not log in')
+ response = self.client.get(view_url)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, 'views/article_form.html')
+
+ def test_create_article_display_page(self):
+ """
+ Ensures the generic view returned the page and contains a form.
+ """
+ view_url = '/views/create_update/create/article/'
+ response = self.client.get(view_url)
+ self.assertEqual(response.status_code, 200)
+ self.assertTemplateUsed(response, 'views/article_form.html')
+ if not response.context.get('form'):
+ self.fail('No form found in the response.')
+
+ def test_create_article_with_errors(self):
+ """
+ POSTs a form that contains validation errors.
+ """
+ view_url = '/views/create_update/create/article/'
+ num_articles = Article.objects.count()
+ response = self.client.post(view_url, {
+ 'title': 'My First Article',
+ })
+ self.assertFormError(response, 'form', 'slug', [u'This field is required.'])
+ self.assertTemplateUsed(response, 'views/article_form.html')
+ self.assertEqual(num_articles, Article.objects.count(),
+ "Number of Articles should not have changed.")
+
+ def test_create_custom_save_article(self):
+ """
+ Creates a new article using a custom form class with a save method
+ that alters the slug entered.
+ """
+ view_url = '/views/create_update/create_custom/article/'
+ response = self.client.post(view_url, {
+ 'title': 'Test Article',
+ 'slug': 'this-should-get-replaced',
+ 'author': 1,
+ 'date_created': datetime.datetime(2007, 6, 25),
+ })
+ self.assertRedirects(response,
+ '/views/create_update/view/article/some-other-slug/',
+ target_status_code=404)
+
+class UpdateDeleteObjectTest(TestCase):
+
+ fixtures = ['testdata.json']
+
+ def test_update_object_form_display(self):
+ """
+ Verifies that the form was created properly and with initial values.
+ """
+ response = self.client.get('/views/create_update/update/article/old_article/')
+ self.assertTemplateUsed(response, 'views/article_form.html')
+ self.assertEquals(unicode(response.context['form']['title']),
+ u'<input id="id_title" type="text" name="title" value="Old Article" maxlength="100" />')
+
+ def test_update_object(self):
+ """
+ Verifies the updating of an Article.
+ """
+ response = self.client.post('/views/create_update/update/article/old_article/', {
+ 'title': 'Another Article',
+ 'slug': 'another-article-slug',
+ 'author': 1,
+ 'date_created': datetime.datetime(2007, 6, 25),
+ })
+ article = Article.objects.get(pk=1)
+ self.assertEquals(article.title, "Another Article")
+
+ def test_delete_object_confirm(self):
+ """
+ Verifies the confirm deletion page is displayed using a GET.
+ """
+ response = self.client.get('/views/create_update/delete/article/old_article/')
+ self.assertTemplateUsed(response, 'views/article_confirm_delete.html')
+
+ def test_delete_object(self):
+ """
+ Verifies the object actually gets deleted on a POST.
+ """
+ view_url = '/views/create_update/delete/article/old_article/'
+ response = self.client.post(view_url)
+ try:
+ Article.objects.get(slug='old_article')
+ except Article.DoesNotExist:
+ pass
+ else:
+ self.fail('Object was not deleted.')
+
+class PostSaveRedirectTests(TestCase):
+ """
+ Verifies that the views redirect to the correct locations depending on
+ if a post_save_redirect was passed and a get_absolute_url method exists
+ on the Model.
+ """
+
+ fixtures = ['testdata.json']
+ article_model = Article
+
+ create_url = '/views/create_update/create/article/'
+ update_url = '/views/create_update/update/article/old_article/'
+ delete_url = '/views/create_update/delete/article/old_article/'
+
+ create_redirect = '/views/create_update/view/article/my-first-article/'
+ update_redirect = '/views/create_update/view/article/another-article-slug/'
+ delete_redirect = '/views/create_update/'
+
+ def test_create_article(self):
+ num_articles = self.article_model.objects.count()
+ response = self.client.post(self.create_url, {
+ 'title': 'My First Article',
+ 'slug': 'my-first-article',
+ 'author': '1',
+ 'date_created': datetime.datetime(2007, 6, 25),
+ })
+ self.assertRedirects(response, self.create_redirect,
+ target_status_code=404)
+ self.assertEqual(num_articles + 1, self.article_model.objects.count(),
+ "A new Article should have been created.")
+
+ def test_update_article(self):
+ num_articles = self.article_model.objects.count()
+ response = self.client.post(self.update_url, {
+ 'title': 'Another Article',
+ 'slug': 'another-article-slug',
+ 'author': 1,
+ 'date_created': datetime.datetime(2007, 6, 25),
+ })
+ self.assertRedirects(response, self.update_redirect,
+ target_status_code=404)
+ self.assertEqual(num_articles, self.article_model.objects.count(),
+ "A new Article should not have been created.")
+
+ def test_delete_article(self):
+ num_articles = self.article_model.objects.count()
+ response = self.client.post(self.delete_url)
+ self.assertRedirects(response, self.delete_redirect,
+ target_status_code=404)
+ self.assertEqual(num_articles - 1, self.article_model.objects.count(),
+ "An Article should have been deleted.")
+
+class NoPostSaveNoAbsoluteUrl(PostSaveRedirectTests):
+ """
+ Tests that when no post_save_redirect is passed and no get_absolute_url
+ method exists on the Model that the view raises an ImproperlyConfigured
+ error.
+ """
+
+ create_url = '/views/create_update/no_redirect/create/article/'
+ update_url = '/views/create_update/no_redirect/update/article/old_article/'
+
+ def test_create_article(self):
+ self.assertRaises(ImproperlyConfigured,
+ super(NoPostSaveNoAbsoluteUrl, self).test_create_article)
+
+ def test_update_article(self):
+ self.assertRaises(ImproperlyConfigured,
+ super(NoPostSaveNoAbsoluteUrl, self).test_update_article)
+
+ def test_delete_article(self):
+ """
+ The delete_object view requires a post_delete_redirect, so skip testing
+ here.
+ """
+ pass
+
+class AbsoluteUrlNoPostSave(PostSaveRedirectTests):
+ """
+ Tests that the views redirect to the Model's get_absolute_url when no
+ post_save_redirect is passed.
+ """
+
+ # Article model with get_absolute_url method.
+ article_model = UrlArticle
+
+ create_url = '/views/create_update/no_url/create/article/'
+ update_url = '/views/create_update/no_url/update/article/old_article/'
+
+ create_redirect = '/urlarticles/my-first-article/'
+ update_redirect = '/urlarticles/another-article-slug/'
+
+ def test_delete_article(self):
+ """
+ The delete_object view requires a post_delete_redirect, so skip testing
+ here.
+ """
+ pass
diff --git a/parts/django/tests/regressiontests/views/tests/generic/date_based.py b/parts/django/tests/regressiontests/views/tests/generic/date_based.py
new file mode 100644
index 0000000..c6ba562
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/generic/date_based.py
@@ -0,0 +1,140 @@
+# coding: utf-8
+from django.test import TestCase
+from datetime import datetime, date
+from datetime import timedelta
+from regressiontests.views.models import Article, Author, DateArticle
+
+class ObjectDetailTest(TestCase):
+ fixtures = ['testdata.json']
+ def setUp(self):
+ # Correct the date for the current article
+ current_article = Article.objects.get(title="Current Article")
+ current_article.date_created = datetime.now()
+ current_article.save()
+
+ def test_finds_past(self):
+ "date_based.object_detail can view a page in the past"
+ response = self.client.get('/views/date_based/object_detail/2001/01/01/old_article/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['object'].title, "Old Article")
+
+ def test_object_detail_finds_today(self):
+ "date_based.object_detail can view a page from today"
+ today_url = datetime.now().strftime('%Y/%m/%d')
+ response = self.client.get('/views/date_based/object_detail/%s/current_article/' % today_url)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['object'].title, "Current Article")
+
+ def test_object_detail_ignores_future(self):
+ "date_based.object_detail can view a page from the future, but only if allowed."
+ response = self.client.get('/views/date_based/object_detail/3000/01/01/future_article/')
+ self.assertEqual(response.status_code, 404)
+
+ def test_object_detail_allowed_future_if_enabled(self):
+ "date_based.object_detail can view a page from the future if explicitly allowed."
+ response = self.client.get('/views/date_based/object_detail/3000/01/01/future_article/allow_future/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['object'].title, "Future Article")
+
+class MonthArchiveTest(TestCase):
+ def test_archive_month_includes_only_month(self):
+ "Regression for #3031: Archives around Feburary include only one month"
+ author = Author(name="John Smith")
+ author.save()
+
+ # 2004 was a leap year, so it should be weird enough to not cheat
+ first_second_of_feb = datetime(2004, 2, 1, 0, 0, 1)
+ first_second_of_mar = datetime(2004, 3, 1, 0, 0, 1)
+ two_seconds = timedelta(0, 2, 0)
+ article = Article(title="example", author=author)
+
+ article.date_created = first_second_of_feb
+ article.save()
+ response = self.client.get('/views/date_based/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['next_month'], date(2004, 3, 1))
+ self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
+
+ article.date_created = first_second_of_feb-two_seconds
+ article.save()
+ response = self.client.get('/views/date_based/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 404)
+
+ article.date_created = first_second_of_mar-two_seconds
+ article.save()
+ response = self.client.get('/views/date_based/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['next_month'], date(2004, 3, 1))
+ self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
+
+ article.date_created = first_second_of_mar
+ article.save()
+ response = self.client.get('/views/date_based/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 404)
+
+ article2 = DateArticle(title="example", author=author)
+
+ article2.date_created = first_second_of_feb.date()
+ article2.save()
+ response = self.client.get('/views/date_based/datefield/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['next_month'], date(2004, 3, 1))
+ self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
+
+ article2.date_created = (first_second_of_feb-two_seconds).date()
+ article2.save()
+ response = self.client.get('/views/date_based/datefield/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 404)
+
+ article2.date_created = (first_second_of_mar-two_seconds).date()
+ article2.save()
+ response = self.client.get('/views/date_based/datefield/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['next_month'], date(2004, 3, 1))
+ self.assertEqual(response.context['previous_month'], date(2004, 1, 1))
+
+ article2.date_created = first_second_of_mar.date()
+ article2.save()
+ response = self.client.get('/views/date_based/datefield/archive_month/2004/02/')
+ self.assertEqual(response.status_code, 404)
+
+ now = datetime.now()
+ prev_month = now.date().replace(day=1)
+ if prev_month.month == 1:
+ prev_month = prev_month.replace(year=prev_month.year-1, month=12)
+ else:
+ prev_month = prev_month.replace(month=prev_month.month-1)
+ article2.date_created = now
+ article2.save()
+ response = self.client.get('/views/date_based/datefield/archive_month/%s/' % now.strftime('%Y/%m'))
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['next_month'], None)
+ self.assertEqual(response.context['previous_month'], prev_month)
+
+ def test_archive_month_date_list(self):
+ author = Author(name="John Smith")
+ author.save()
+ date1 = datetime(2010, 1, 1, 0, 0, 0)
+ date2 = datetime(2010, 1, 2, 0, 0, 0)
+ Article.objects.create(title='example1', author=author, date_created=date1)
+ Article.objects.create(title='example2', author=author, date_created=date2)
+ response = self.client.get('/views/date_based/archive_month/2010/1/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(len(response.context['date_list']), 2)
+ self.assertEqual(response.context['date_list'][0], date1)
+ # Checks that the same date is not included more than once in the list
+ Article.objects.create(title='example2', author=author, date_created=date2)
+ response = self.client.get('/views/date_based/archive_month/2010/1/')
+ self.assertEqual(len(response.context['date_list']), 2)
+
+class DayArchiveTests(TestCase):
+
+ def test_year_month_day_format(self):
+ """
+ Make sure day views don't get confused with numeric month formats (#7944)
+ """
+ author = Author.objects.create(name="John Smith")
+ article = Article.objects.create(title="example", author=author, date_created=datetime(2004, 1, 21, 0, 0, 1))
+ response = self.client.get('/views/date_based/archive_day/2004/1/21/')
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(response.context['object_list'][0], article)
diff --git a/parts/django/tests/regressiontests/views/tests/i18n.py b/parts/django/tests/regressiontests/views/tests/i18n.py
new file mode 100644
index 0000000..24aa933
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/i18n.py
@@ -0,0 +1,149 @@
+# -*- coding:utf-8 -*-
+import gettext
+
+from django.conf import settings
+from django.test import TestCase
+from django.utils.translation import activate, deactivate
+from django.utils.text import javascript_quote
+
+from regressiontests.views.urls import locale_dir
+
+class I18NTests(TestCase):
+ """ Tests django views in django/views/i18n.py """
+
+ def test_setlang(self):
+ """The set_language view can be used to change the session language"""
+ for lang_code, lang_name in settings.LANGUAGES:
+ post_data = dict(language=lang_code, next='/views/')
+ response = self.client.post('/views/i18n/setlang/', data=post_data)
+ self.assertRedirects(response, 'http://testserver/views/')
+ self.assertEquals(self.client.session['django_language'], lang_code)
+
+ def test_jsi18n(self):
+ """The javascript_catalog can be deployed with language settings"""
+ for lang_code in ['es', 'fr', 'ru']:
+ activate(lang_code)
+ catalog = gettext.translation('djangojs', locale_dir, [lang_code])
+ trans_txt = catalog.ugettext('this is to be translated')
+ response = self.client.get('/views/jsi18n/')
+ # in response content must to be a line like that:
+ # catalog['this is to be translated'] = 'same_that_trans_txt'
+ # javascript_quote is used to be able to check unicode strings
+ self.assertContains(response, javascript_quote(trans_txt), 1)
+
+
+class JsI18NTests(TestCase):
+ """
+ Tests django views in django/views/i18n.py that need to change
+ settings.LANGUAGE_CODE.
+ """
+
+ def setUp(self):
+ self.old_language_code = settings.LANGUAGE_CODE
+ self.old_installed_apps = settings.INSTALLED_APPS
+
+ def tearDown(self):
+ deactivate()
+ settings.LANGUAGE_CODE = self.old_language_code
+ settings.INSTALLED_APPS = self.old_installed_apps
+
+ def test_jsi18n_with_missing_en_files(self):
+ """
+ The javascript_catalog shouldn't load the fallback language in the
+ case that the current selected language is actually the one translated
+ from, and hence missing translation files completely.
+
+ This happens easily when you're translating from English to other
+ languages and you've set settings.LANGUAGE_CODE to some other language
+ than English.
+ """
+ settings.LANGUAGE_CODE = 'es'
+ activate('en-us')
+ response = self.client.get('/views/jsi18n/')
+ self.assertNotContains(response, 'esto tiene que ser traducido')
+
+ def test_jsi18n_fallback_language(self):
+ """
+ Let's make sure that the fallback language is still working properly
+ in cases where the selected language cannot be found.
+ """
+ settings.LANGUAGE_CODE = 'fr'
+ activate('fi')
+ response = self.client.get('/views/jsi18n/')
+ self.assertContains(response, 'il faut le traduire')
+
+ def testI18NLanguageNonEnglishDefault(self):
+ """
+ Check if the Javascript i18n view returns an empty language catalog
+ if the default language is non-English, the selected language
+ is English and there is not 'en' translation available. See #13388,
+ #3594 and #13726 for more details.
+ """
+ settings.LANGUAGE_CODE = 'fr'
+ activate('en-us')
+ response = self.client.get('/views/jsi18n/')
+ self.assertNotContains(response, 'Choisir une heure')
+
+ def test_nonenglish_default_english_userpref(self):
+ """
+ Same as above with the difference that there IS an 'en' translation
+ available. The Javascript i18n view must return a NON empty language catalog
+ with the proper English translations. See #13726 for more details.
+ """
+ settings.LANGUAGE_CODE = 'fr'
+ settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.views.app0']
+ activate('en-us')
+ response = self.client.get('/views/jsi18n_english_translation/')
+ self.assertContains(response, javascript_quote('this app0 string is to be translated'))
+
+ def testI18NLanguageNonEnglishFallback(self):
+ """
+ Makes sure that the fallback language is still working properly
+ in cases where the selected language cannot be found.
+ """
+ settings.LANGUAGE_CODE = 'fr'
+ activate('none')
+ response = self.client.get('/views/jsi18n/')
+ self.assertContains(response, 'Choisir une heure')
+
+
+class JsI18NTestsMultiPackage(TestCase):
+ """
+ Tests for django views in django/views/i18n.py that need to change
+ settings.LANGUAGE_CODE and merge JS translation from several packages.
+ """
+
+ def setUp(self):
+ self.old_language_code = settings.LANGUAGE_CODE
+ self.old_installed_apps = settings.INSTALLED_APPS
+
+ def tearDown(self):
+ settings.LANGUAGE_CODE = self.old_language_code
+ settings.INSTALLED_APPS = self.old_installed_apps
+
+ def testI18NLanguageEnglishDefault(self):
+ """
+ Check if the JavaScript i18n view returns a complete language catalog
+ if the default language is en-us, the selected language has a
+ translation available and a catalog composed by djangojs domain
+ translations of multiple Python packages is requested. See #13388,
+ #3594 and #13514 for more details.
+ """
+ settings.LANGUAGE_CODE = 'en-us'
+ settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.views.app1', 'regressiontests.views.app2']
+ activate('fr')
+ response = self.client.get('/views/jsi18n_multi_packages1/')
+ self.assertContains(response, javascript_quote('il faut traduire cette chaîne de caractères de app1'))
+ deactivate()
+
+ def testI18NDifferentNonEnLangs(self):
+ """
+ Similar to above but with neither default or requested language being
+ English.
+ """
+ settings.LANGUAGE_CODE = 'fr'
+ settings.INSTALLED_APPS = list(settings.INSTALLED_APPS) + ['regressiontests.views.app3', 'regressiontests.views.app4']
+ activate('es-ar')
+ response = self.client.get('/views/jsi18n_multi_packages2/')
+ self.assertContains(response, javascript_quote('este texto de app3 debe ser traducido'))
+ deactivate()
diff --git a/parts/django/tests/regressiontests/views/tests/specials.py b/parts/django/tests/regressiontests/views/tests/specials.py
new file mode 100644
index 0000000..bcdffca
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/specials.py
@@ -0,0 +1,35 @@
+# coding: utf-8
+from django.test import TestCase
+
+class URLHandling(TestCase):
+ """
+ Tests for URL handling in views and responses.
+ """
+ redirect_target = "/views/%E4%B8%AD%E6%96%87/target/"
+
+ def test_combining_redirect(self):
+ """
+ Tests that redirecting to an IRI, requiring encoding before we use it
+ in an HTTP response, is handled correctly. In this case the arg to
+ HttpRedirect is ASCII but the current request path contains non-ASCII
+ characters so this test ensures the creation of the full path with a
+ base non-ASCII part is handled correctly.
+ """
+ response = self.client.get(u'/views/中文/')
+ self.assertRedirects(response, self.redirect_target)
+
+ def test_nonascii_redirect(self):
+ """
+ Tests that a non-ASCII argument to HttpRedirect is handled properly.
+ """
+ response = self.client.get('/views/nonascii_redirect/')
+ self.assertRedirects(response, self.redirect_target)
+
+ def test_permanent_nonascii_redirect(self):
+ """
+ Tests that a non-ASCII argument to HttpPermanentRedirect is handled
+ properly.
+ """
+ response = self.client.get('/views/permanent_nonascii_redirect/')
+ self.assertRedirects(response, self.redirect_target, status_code=301)
+
diff --git a/parts/django/tests/regressiontests/views/tests/static.py b/parts/django/tests/regressiontests/views/tests/static.py
new file mode 100644
index 0000000..de0bd51
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/tests/static.py
@@ -0,0 +1,77 @@
+import mimetypes
+from os import path
+
+from django.test import TestCase
+from django.http import HttpResponseNotModified
+from regressiontests.views.urls import media_dir
+
+class StaticTests(TestCase):
+ """Tests django views in django/views/static.py"""
+
+ def test_serve(self):
+ "The static view can serve static media"
+ media_files = ['file.txt', 'file.txt.gz']
+ for filename in media_files:
+ response = self.client.get('/views/site_media/%s' % filename)
+ file_path = path.join(media_dir, filename)
+ self.assertEquals(open(file_path).read(), response.content)
+ self.assertEquals(len(response.content), int(response['Content-Length']))
+ self.assertEquals(mimetypes.guess_type(file_path)[1], response.get('Content-Encoding', None))
+
+ def test_unknown_mime_type(self):
+ response = self.client.get('/views/site_media/file.unknown')
+ self.assertEquals('application/octet-stream', response['Content-Type'])
+
+ def test_copes_with_empty_path_component(self):
+ file_name = 'file.txt'
+ response = self.client.get('/views/site_media//%s' % file_name)
+ file = open(path.join(media_dir, file_name))
+ self.assertEquals(file.read(), response.content)
+
+ def test_is_modified_since(self):
+ file_name = 'file.txt'
+ response = self.client.get(
+ '/views/site_media/%s' % file_name,
+ HTTP_IF_MODIFIED_SINCE='Thu, 1 Jan 1970 00:00:00 GMT')
+ file = open(path.join(media_dir, file_name))
+ self.assertEquals(file.read(), response.content)
+
+ def test_not_modified_since(self):
+ file_name = 'file.txt'
+ response = self.client.get(
+ '/views/site_media/%s' % file_name,
+ HTTP_IF_MODIFIED_SINCE='Mon, 18 Jan 2038 05:14:07 UTC'
+ # This is 24h before max Unix time. Remember to fix Django and
+ # update this test well before 2038 :)
+ )
+ self.assertTrue(isinstance(response, HttpResponseNotModified))
+
+ def test_invalid_if_modified_since(self):
+ """Handle bogus If-Modified-Since values gracefully
+
+ Assume that a file is modified since an invalid timestamp as per RFC
+ 2616, section 14.25.
+ """
+ file_name = 'file.txt'
+ invalid_date = 'Mon, 28 May 999999999999 28:25:26 GMT'
+ response = self.client.get('/views/site_media/%s' % file_name,
+ HTTP_IF_MODIFIED_SINCE=invalid_date)
+ file = open(path.join(media_dir, file_name))
+ self.assertEquals(file.read(), response.content)
+ self.assertEquals(len(response.content),
+ int(response['Content-Length']))
+
+ def test_invalid_if_modified_since2(self):
+ """Handle even more bogus If-Modified-Since values gracefully
+
+ Assume that a file is modified since an invalid timestamp as per RFC
+ 2616, section 14.25.
+ """
+ file_name = 'file.txt'
+ invalid_date = ': 1291108438, Wed, 20 Oct 2010 14:05:00 GMT'
+ response = self.client.get('/views/site_media/%s' % file_name,
+ HTTP_IF_MODIFIED_SINCE=invalid_date)
+ file = open(path.join(media_dir, file_name))
+ self.assertEquals(file.read(), response.content)
+ self.assertEquals(len(response.content),
+ int(response['Content-Length']))
diff --git a/parts/django/tests/regressiontests/views/urls.py b/parts/django/tests/regressiontests/views/urls.py
new file mode 100644
index 0000000..0ccb988
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/urls.py
@@ -0,0 +1,131 @@
+# coding: utf-8
+from os import path
+
+from django.conf.urls.defaults import *
+
+from models import *
+import views
+
+
+base_dir = path.dirname(path.abspath(__file__))
+media_dir = path.join(base_dir, 'media')
+locale_dir = path.join(base_dir, 'locale')
+
+js_info_dict = {
+ 'domain': 'djangojs',
+ 'packages': ('regressiontests.views',),
+}
+
+js_info_dict_english_translation = {
+ 'domain': 'djangojs',
+ 'packages': ('regressiontests.views.app0',),
+}
+
+js_info_dict_multi_packages1 = {
+ 'domain': 'djangojs',
+ 'packages': ('regressiontests.views.app1', 'regressiontests.views.app2'),
+}
+
+js_info_dict_multi_packages2 = {
+ 'domain': 'djangojs',
+ 'packages': ('regressiontests.views.app3', 'regressiontests.views.app4'),
+}
+
+date_based_info_dict = {
+ 'queryset': Article.objects.all(),
+ 'date_field': 'date_created',
+ 'month_format': '%m',
+}
+numeric_days_info_dict = dict(date_based_info_dict, day_format='%d')
+
+date_based_datefield_info_dict = dict(date_based_info_dict, queryset=DateArticle.objects.all())
+
+urlpatterns = patterns('',
+ (r'^$', views.index_page),
+
+ # Default views
+ (r'^shortcut/(\d+)/(.*)/$', 'django.views.defaults.shortcut'),
+ (r'^non_existing_url/', 'django.views.defaults.page_not_found'),
+ (r'^server_error/', 'django.views.defaults.server_error'),
+
+ # i18n views
+ (r'^i18n/', include('django.conf.urls.i18n')),
+ (r'^jsi18n/$', 'django.views.i18n.javascript_catalog', js_info_dict),
+ (r'^jsi18n_english_translation/$', 'django.views.i18n.javascript_catalog', js_info_dict_english_translation),
+ (r'^jsi18n_multi_packages1/$', 'django.views.i18n.javascript_catalog', js_info_dict_multi_packages1),
+ (r'^jsi18n_multi_packages2/$', 'django.views.i18n.javascript_catalog', js_info_dict_multi_packages2),
+
+ # Static views
+ (r'^site_media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': media_dir}),
+
+ # Special URLs for particular regression cases.
+ url(u'^中文/$', 'regressiontests.views.views.redirect'),
+ url(u'^中文/target/$', 'regressiontests.views.views.index_page'),
+)
+
+# Date-based generic views.
+urlpatterns += patterns('django.views.generic.date_based',
+ (r'^date_based/object_detail/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/$',
+ 'object_detail',
+ dict(slug_field='slug', **date_based_info_dict)),
+ (r'^date_based/object_detail/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/(?P<slug>[-\w]+)/allow_future/$',
+ 'object_detail',
+ dict(allow_future=True, slug_field='slug', **date_based_info_dict)),
+ (r'^date_based/archive_day/(?P<year>\d{4})/(?P<month>\d{1,2})/(?P<day>\d{1,2})/$',
+ 'archive_day',
+ numeric_days_info_dict),
+ (r'^date_based/archive_month/(?P<year>\d{4})/(?P<month>\d{1,2})/$',
+ 'archive_month',
+ date_based_info_dict),
+ (r'^date_based/datefield/archive_month/(?P<year>\d{4})/(?P<month>\d{1,2})/$',
+ 'archive_month',
+ date_based_datefield_info_dict),
+)
+
+# crud generic views.
+
+urlpatterns += patterns('django.views.generic.create_update',
+ (r'^create_update/member/create/article/$', 'create_object',
+ dict(login_required=True, model=Article)),
+ (r'^create_update/create/article/$', 'create_object',
+ dict(post_save_redirect='/views/create_update/view/article/%(slug)s/',
+ model=Article)),
+ (r'^create_update/update/article/(?P<slug>[-\w]+)/$', 'update_object',
+ dict(post_save_redirect='/views/create_update/view/article/%(slug)s/',
+ slug_field='slug', model=Article)),
+ (r'^create_update/create_custom/article/$', views.custom_create),
+ (r'^create_update/delete/article/(?P<slug>[-\w]+)/$', 'delete_object',
+ dict(post_delete_redirect='/views/create_update/', slug_field='slug',
+ model=Article)),
+
+ # No post_save_redirect and no get_absolute_url on model.
+ (r'^create_update/no_redirect/create/article/$', 'create_object',
+ dict(model=Article)),
+ (r'^create_update/no_redirect/update/article/(?P<slug>[-\w]+)/$',
+ 'update_object', dict(slug_field='slug', model=Article)),
+
+ # get_absolute_url on model, but no passed post_save_redirect.
+ (r'^create_update/no_url/create/article/$', 'create_object',
+ dict(model=UrlArticle)),
+ (r'^create_update/no_url/update/article/(?P<slug>[-\w]+)/$',
+ 'update_object', dict(slug_field='slug', model=UrlArticle)),
+)
+
+# a view that raises an exception for the debug view
+urlpatterns += patterns('',
+ (r'^raises/$', views.raises),
+ (r'^raises404/$', views.raises404),
+)
+
+# rediriects, both temporary and permanent, with non-ASCII targets
+urlpatterns += patterns('django.views.generic.simple',
+ ('^nonascii_redirect/$', 'redirect_to',
+ {'url': u'/views/中文/target/', 'permanent': False}),
+ ('^permanent_nonascii_redirect/$', 'redirect_to',
+ {'url': u'/views/中文/target/', 'permanent': True}),
+)
+
+urlpatterns += patterns('regressiontests.views.views',
+ url(r'view_exception/(?P<n>\d+)/$', 'view_exception', name='view_exception'),
+ url(r'template_exception/(?P<n>\d+)/$', 'template_exception', name='template_exception'),
+)
diff --git a/parts/django/tests/regressiontests/views/views.py b/parts/django/tests/regressiontests/views/views.py
new file mode 100644
index 0000000..445b4ed
--- /dev/null
+++ b/parts/django/tests/regressiontests/views/views.py
@@ -0,0 +1,59 @@
+import sys
+
+from django.http import HttpResponse, HttpResponseRedirect
+from django import forms
+from django.views.debug import technical_500_response
+from django.views.generic.create_update import create_object
+from django.core.urlresolvers import get_resolver
+from django.shortcuts import render_to_response
+
+from regressiontests.views import BrokenException, except_args
+
+from models import Article
+
+
+def index_page(request):
+ """Dummy index page"""
+ return HttpResponse('<html><body>Dummy page</body></html>')
+
+def custom_create(request):
+ """
+ Calls create_object generic view with a custom form class.
+ """
+ class SlugChangingArticleForm(forms.ModelForm):
+ """Custom form class to overwrite the slug."""
+
+ class Meta:
+ model = Article
+
+ def save(self, *args, **kwargs):
+ self.instance.slug = 'some-other-slug'
+ return super(SlugChangingArticleForm, self).save(*args, **kwargs)
+
+ return create_object(request,
+ post_save_redirect='/views/create_update/view/article/%(slug)s/',
+ form_class=SlugChangingArticleForm)
+
+def raises(request):
+ try:
+ raise Exception
+ except Exception:
+ return technical_500_response(request, *sys.exc_info())
+
+def raises404(request):
+ resolver = get_resolver(None)
+ resolver.resolve('')
+
+def redirect(request):
+ """
+ Forces an HTTP redirect.
+ """
+ return HttpResponseRedirect("target/")
+
+def view_exception(request, n):
+ raise BrokenException(except_args[int(n)])
+
+def template_exception(request, n):
+ return render_to_response('debug/template_exception.html',
+ {'arg': except_args[int(n)]})
+