测试gitnore

This commit is contained in:
ladeng07
2022-05-06 15:45:57 +08:00
parent 12f390949b
commit 51552904f9
2347 changed files with 120102 additions and 53549 deletions
@@ -3,5 +3,5 @@ from django.utils.translation import gettext_lazy as _
class AdminDocsConfig(AppConfig):
name = "django.contrib.admindocs"
name = 'django.contrib.admindocs'
verbose_name = _("Administrative Documentation")
@@ -1,15 +1,14 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Charl du Plessis <cjdupless@gmail.com>, 2021
# F Wolff <friedel@translate.org.za>, 2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-08-23 10:57+0000\n"
"Last-Translator: Charl du Plessis <cjdupless@gmail.com>\n"
"POT-Creation-Date: 2017-01-19 16:49+0100\n"
"PO-Revision-Date: 2019-01-07 08:38+0000\n"
"Last-Translator: F Wolff <friedel@translate.org.za>\n"
"Language-Team: Afrikaans (http://www.transifex.com/django/django/language/"
"af/)\n"
"MIME-Version: 1.0\n"
@@ -46,14 +45,12 @@ msgid ""
"Jumps you from any page to the documentation for the view that generates "
"that page."
msgstr ""
"Neem jou van enige bladsy na die dokumentasie vir die vertooning wat daardie "
"bladsy genereer."
msgid "Tags"
msgstr ""
msgid "List of all the template tags and their functions."
msgstr "Lys van alle templaat tags en hulle funksies."
msgstr ""
msgid "Filters"
msgstr ""
@@ -80,46 +77,39 @@ msgid ""
"template is used to generate the page and which objects are available to "
"that template."
msgstr ""
"Elke bladsy op die publieke werf word gegenereer deur 'n vertoning. Die "
"vertoning definiëer watter templaat word gebruik om die bladsy te genereer "
"en watter objekte is beskikbaar aan daardie templaat."
msgid "Tools for your browser to quickly access admin functionality."
msgstr ""
msgid "Please install docutils"
msgstr "Installeer asseblief docutils"
msgstr ""
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Die admin dokumentasie stelsel benodig Python se <a href=\"%(link)s"
"\">docutils</a> biblioteek."
#, python-format
msgid ""
"Please ask your administrators to install <a href=\"%(link)s\">docutils</a>."
msgstr ""
"Vra asseblief jou administrateurs om <a href=\"%(link)s\">docutils</a> te "
"installeer."
#, python-format
msgid "Model: %(name)s"
msgstr ""
msgid "Fields"
msgstr "Velde"
msgstr ""
msgid "Field"
msgstr "Veld"
msgstr ""
msgid "Type"
msgstr "Tipe"
msgstr ""
msgid "Description"
msgstr "Beskrywing"
msgstr ""
msgid "Methods with arguments"
msgstr ""
@@ -131,32 +121,32 @@ msgid "Arguments"
msgstr ""
msgid "Back to Model documentation"
msgstr "Terug na Model dokumentasie"
msgstr ""
msgid "Model documentation"
msgstr "Model dokumentasie"
msgstr ""
msgid "Model groups"
msgstr "Model groepe"
msgstr ""
msgid "Templates"
msgstr "Template"
msgstr ""
#, python-format
msgid "Template: %(name)s"
msgstr "Templaat: %(name)s"
msgstr ""
#, python-format
msgid "Template: <q>%(name)s</q>"
msgstr "Templaat: <q>%(name)s</q>"
msgid "Template: \"%(name)s\""
msgstr ""
#. Translators: Search is not a verb here, it qualifies path (a search path)
#, python-format
msgid "Search path for template <q>%(name)s</q>:"
msgid "Search path for template \"%(name)s\":"
msgstr ""
msgid "(does not exist)"
msgstr "(bestaan nie)"
msgstr ""
msgid "Back to Documentation"
msgstr ""
@@ -257,7 +247,7 @@ msgstr ""
#, python-format
msgid "all %s"
msgstr "alle %s"
msgstr ""
#, python-format
msgid "number of %s"
@@ -1,7 +1,7 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Bashar Al-Abdulhadi, 2015-2016,2021
# Bashar Al-Abdulhadi, 2015-2016
# Bashar Al-Abdulhadi, 2014
# Jannis Leidel <jannis@leidel.info>, 2011
# Muaaz Alsaied, 2020
@@ -10,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-10-15 21:25+0000\n"
"Last-Translator: Bashar Al-Abdulhadi\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2020-04-02 10:32+0000\n"
"Last-Translator: Muaaz Alsaied\n"
"Language-Team: Arabic (http://www.transifex.com/django/django/language/ar/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -98,10 +98,9 @@ msgstr "الرجاء تثبيت docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"نظام توثيقات المشرف يتطلب مكتبة بايثون <a href=\"%(link)s\">docutils</a>."
msgstr "نظام توثيقات المشرف مكتبة بايثون <a href=\"%(link)s\">docutils</a>."
#, python-format
msgid ""
@@ -1,19 +1,18 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# arneatec <arneatec@gmail.com>, 2022
# Boris Chervenkov <office@sentido.bg>, 2012
# Jannis Leidel <jannis@leidel.info>, 2011
# Lyuboslav Petrov <petrov.lyuboslav@gmail.com>, 2014
# Todor Lubenov <tlubenov@gmail.com>, 2011,2015
# Todor Lubenov <tgl.sysdev@gmail.com>, 2011,2015
# Venelin Stoykov <vkstoykov@gmail.com>, 2016
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2022-01-14 10:04+0000\n"
"Last-Translator: arneatec <arneatec@gmail.com>\n"
"POT-Creation-Date: 2017-01-19 16:49+0100\n"
"PO-Revision-Date: 2017-09-19 16:40+0000\n"
"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
"Language-Team: Bulgarian (http://www.transifex.com/django/django/language/"
"bg/)\n"
"MIME-Version: 1.0\n"
@@ -23,7 +22,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Administrative Documentation"
msgstr "Административна документация"
msgstr "Административна Документация"
msgid "Home"
msgstr "Начало"
@@ -58,10 +57,10 @@ msgstr ""
"е генерирал."
msgid "Tags"
msgstr "Тагове"
msgstr "Етикети"
msgid "List of all the template tags and their functions."
msgstr "Списък на всички шаблонни тагове и техните функции."
msgstr "Списък на всички етикети на шаблона и техните функции."
msgid "Filters"
msgstr "Филтри"
@@ -70,7 +69,7 @@ msgid ""
"Filters are actions which can be applied to variables in a template to alter "
"the output."
msgstr ""
"Филтрите са действия, които могат да се използват върху променливи в даден "
"Филтрите са действия, които могат да се използват към променливи в даден "
"шаблон, за да променят изхода."
msgid "Models"
@@ -82,20 +81,20 @@ msgid ""
"template variables"
msgstr ""
"Моделите са описания на всички обекти в системата и свързаните с тях полета. "
"Всеки модел си има списък на полетата, които могат да бъдат достъпени както "
"Всеки модел си има списък на полетата, които могат да бъдат достъпни както "
"шаблонни променливи"
msgid "Views"
msgstr "Изгледи"
msgstr "Прегледи"
msgid ""
"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."
msgstr ""
"Всяка страница на публичния сайт се генерира от изглед. Изгледът определя "
"кой шаблон се използва за генериране на страницата и кои обекти са на "
"разположение за този шаблон."
"Всяка страница на публичния сайт се генерира от един изглед. Изгледа "
"определя кой шаблон се използва за генериране на страницата, и които обекти "
"са на разположение за този шаблон."
msgid "Tools for your browser to quickly access admin functionality."
msgstr ""
@@ -107,17 +106,17 @@ msgstr "Моля инсталирайте docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Системата за администраторска документация изисква библиотеката за Python <a "
"Системата за администраторска документация изисква библиотеката за python <a "
"href=\"%(link)s\">docutils</a>."
#, python-format
msgid ""
"Please ask your administrators to install <a href=\"%(link)s\">docutils</a>."
msgstr ""
"Моля, помолете вашите администратори да инсталират <a href=\"%(link)s"
"Моля, попитайте вашите администратори да инсталирате <a href=\"%(link)s"
"\">docutils</a> ."
#, python-format
@@ -137,7 +136,7 @@ msgid "Description"
msgstr "Описание"
msgid "Methods with arguments"
msgstr "Методи с аргументи"
msgstr "Методи и аргументи"
msgid "Method"
msgstr "Метод"
@@ -146,32 +145,32 @@ msgid "Arguments"
msgstr "Аргументи"
msgid "Back to Model documentation"
msgstr " Върни се в документацията за модели"
msgstr " Върни се в документацията на модела"
msgid "Model documentation"
msgstr "Документация за модели"
msgstr "Модел документация"
msgid "Model groups"
msgstr "Групи на модела"
msgstr "Модел групи"
msgid "Templates"
msgstr "Шаблони"
#, python-format
msgid "Template: %(name)s"
msgstr "Шаблон: %(name)s"
msgstr "Template: %(name)s"
#, python-format
msgid "Template: <q>%(name)s</q>"
msgstr "Шаблон: <q>%(name)s</q>"
msgid "Template: \"%(name)s\""
msgstr "Шаблон: \"%(name)s\""
#. Translators: Search is not a verb here, it qualifies path (a search path)
#, python-format
msgid "Search path for template <q>%(name)s</q>:"
msgstr "Път за търсене на шаблон <q>%(name)s</q>:"
msgid "Search path for template \"%(name)s\":"
msgstr "Път за търсене на шаблон \"%(name)s\""
msgid "(does not exist)"
msgstr "(не съществува)"
msgstr "(Не съществува)"
msgid "Back to Documentation"
msgstr "Назад към Документацията"
@@ -180,7 +179,7 @@ msgid "Template filters"
msgstr "Шаблонни филтри"
msgid "Template filter documentation"
msgstr "Документация за шаблонни филтри"
msgstr "Документация за Шаблонни филтри"
msgid "Built-in filters"
msgstr "Вградени филтри"
@@ -190,25 +189,25 @@ msgid ""
"To use these filters, put <code>%(code)s</code> in your template before "
"using the filter."
msgstr ""
"За да използвате тези филтри, сложете <code>%(code)s</code> във вашия "
"шаблон, преди да използвате филтъра."
"За да използвате тези филтри, сложи <code>%(code)s</code> във вашия шаблон, "
"преди да използвате филтъра."
msgid "Template tags"
msgstr "Шаблонни тагове"
msgstr "Шаблон тагове"
msgid "Template tag documentation"
msgstr "Документация за Шаблонни тагове"
msgstr "Документация за шаблонни тагове"
msgid "Built-in tags"
msgstr "Вградени тагове"
msgstr "Вградени в тагове"
#, python-format
msgid ""
"To use these tags, put <code>%(code)s</code> in your template before using "
"the tag."
msgstr ""
"За да използвате тези тагове, сложете <code>%(code)s</code> във вашия "
"шаблон, преди да използвате тага."
"За да използвате тези тагове, сложи <code>%(code)s</code> във вашия шаблон, "
"преди да използвате етикет."
#, python-format
msgid "View: %(name)s"
@@ -221,23 +220,23 @@ msgid "Templates:"
msgstr "Шаблони:"
msgid "Back to View documentation"
msgstr "Обратно към документацията за Изглед"
msgstr ""
msgid "View documentation"
msgstr "Документация за Изглед"
msgstr "Документация за Изгледи"
msgid "Jump to namespace"
msgstr "Прескочи към именни пространства"
msgstr "Направо към именни пространства"
msgid "Empty namespace"
msgstr "Празни именни пространства"
msgstr "Empty именни пространства"
#, python-format
msgid "Views by namespace %(name)s"
msgstr "Изгледи по именни пространства %(name)s"
msgstr ""
msgid "Views by empty namespace"
msgstr "Изгледи по празни именни пространства"
msgstr "Прегледи на празна именни пространства"
#, python-format
msgid ""
@@ -245,12 +244,9 @@ msgid ""
" View function: <code>%(full_name)s</code>. Name: <code>%(url_name)s</"
"code>.\n"
msgstr ""
"\n"
" Изглед функция: <code>%(full_name)s</code>. Име: <code>%(url_name)s</"
"code>.\n"
msgid "tag:"
msgstr "таг:"
msgstr "етикет:"
msgid "filter:"
msgstr "филтър:"
@@ -2,7 +2,7 @@
#
# Translators:
# abraham.martin <abraham.martin@gmail.com>, 2014
# Antoni Aloy <aaloy@apsl.net>, 2014,2017,2021
# Antoni Aloy <aaloy@apsl.net>, 2014,2017
# Carles Barrobés <carles@barrobes.com>, 2012
# Gil Obradors Via <gil.obradors@gmail.com>, 2019
# Jannis Leidel <jannis@leidel.info>, 2011
@@ -11,9 +11,9 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-10-27 08:46+0000\n"
"Last-Translator: Antoni Aloy <aaloy@apsl.net>\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2019-11-03 20:47+0000\n"
"Last-Translator: Gil Obradors Via <gil.obradors@gmail.com>\n"
"Language-Team: Catalan (http://www.transifex.com/django/django/language/"
"ca/)\n"
"MIME-Version: 1.0\n"
@@ -105,7 +105,7 @@ msgstr "Si us plau instal·leu docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"El sistema d'administració de documentació requereix de la biblioteca de "
@@ -1,7 +1,6 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Florian Apolloner <florian@apolloner.eu>, 2021
# Jannis Vajen, 2013
# Jannis Leidel <jannis@leidel.info>, 2013-2016,2020
# Jannis Vajen, 2016
@@ -9,9 +8,9 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-11-28 17:15+0000\n"
"Last-Translator: Raphael Michel <mail@raphaelmichel.de>\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2020-01-17 22:42+0000\n"
"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
"Language-Team: German (http://www.transifex.com/django/django/language/de/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -104,7 +103,7 @@ msgstr "Bitte docutils installieren."
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Das Admin-Dokumentationssystem erfordert die Python-Bibliothek <a href="
@@ -2,7 +2,6 @@
#
# Translators:
# Dimitris Glezos <glezos@transifex.com>, 2011
# Fotis Athineos <fotis@transifex.com>, 2021
# Jannis Leidel <jannis@leidel.info>, 2011
# Nick Mavrakis <mavrakis.n@gmail.com>, 2016
# Pãnoș <panos.laganakos@gmail.com>, 2014
@@ -11,9 +10,9 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-08-04 06:47+0000\n"
"Last-Translator: Fotis Athineos <fotis@transifex.com>\n"
"POT-Creation-Date: 2017-01-19 16:49+0100\n"
"PO-Revision-Date: 2017-09-23 18:54+0000\n"
"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
"Language-Team: Greek (http://www.transifex.com/django/django/language/el/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -106,7 +105,7 @@ msgstr "Παρακαλώ εγκαταστείστε τα docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Το σύστημα διαχειριστικής τεκμηρίωσης απαιτεί την βιβλιοθήκη της Python <a "
@@ -161,13 +160,13 @@ msgid "Template: %(name)s"
msgstr "Περίγραμμα: %(name)s"
#, python-format
msgid "Template: <q>%(name)s</q>"
msgstr "Περίγραμμα: <q>%(name)s</q>"
msgid "Template: \"%(name)s\""
msgstr "Περίγραμμα: \"%(name)s\""
#. Translators: Search is not a verb here, it qualifies path (a search path)
#, python-format
msgid "Search path for template <q>%(name)s</q>:"
msgstr "Αναζήτηση μονοπατιού για περίγραμμα <q>%(name)s</q>:"
msgid "Search path for template \"%(name)s\":"
msgstr "Αναζήτηση μονοπατιού για περίγραμμα \"%(name)s\":"
msgid "(does not exist)"
msgstr "(δεν υπάρχει)"
@@ -3,17 +3,16 @@
# Translators:
# Jannis Leidel <jannis@leidel.info>, 2011
# Janno Liivak <jannolii@gmail.com>, 2013,2015
# Martin <martinpajuste@gmail.com>, 2021
# Martin <martinpajuste@gmail.com>, 2016
# Martin Pajuste <martinpajuste@gmail.com>, 2016
# Marti Raudsepp <marti@juffo.org>, 2014
# Ragnar Rebase <rrebase@gmail.com>, 2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-11-22 11:26+0000\n"
"Last-Translator: Martin <martinpajuste@gmail.com>\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2019-12-28 01:40+0000\n"
"Last-Translator: Ragnar Rebase <rrebase@gmail.com>\n"
"Language-Team: Estonian (http://www.transifex.com/django/django/language/"
"et/)\n"
"MIME-Version: 1.0\n"
@@ -105,7 +104,7 @@ msgstr "Palun paigaldage docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Administreerimise dokumentatsioon vajab Python'i <a href=\"%(link)s"
@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-07-15 10:42+0000\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2019-12-13 12:31+0000\n"
"Last-Translator: GunChleoc\n"
"Language-Team: Gaelic, Scottish (http://www.transifex.com/django/django/"
"language/gd/)\n"
@@ -106,7 +106,7 @@ msgstr "Stàlaich docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Tha siostam docamaideadh na rianachd feumach air an leabharlann <a href="
@@ -3,14 +3,13 @@
# Translators:
# Jannis Leidel <jannis@leidel.info>, 2011
# Meir Kriheli <mkriheli@gmail.com>, 2012-2015,2017,2020
# Yaron Shahrabani <sh.yaron@gmail.com>, 2021
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-05-17 12:29+0000\n"
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2020-08-02 13:22+0000\n"
"Last-Translator: Meir Kriheli <mkriheli@gmail.com>\n"
"Language-Team: Hebrew (http://www.transifex.com/django/django/language/he/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -57,7 +56,7 @@ msgid "List of all the template tags and their functions."
msgstr "רשימת כל ה-template tags והפונקציות שלהן."
msgid "Filters"
msgstr "מסננים"
msgstr "Filters"
msgid ""
"Filters are actions which can be applied to variables in a template to alter "
@@ -94,9 +93,11 @@ msgstr "נא להתקין את docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"מערכת התיעוד במנשק הניהול דורשת את ספריית הפייתון <a href=\"%(link)s"
"\">docutils</a>."
#, python-format
msgid ""
@@ -254,11 +255,11 @@ msgstr "מודל:"
#, python-format
msgid "the related `%(app_label)s.%(data_type)s` object"
msgstr "עצמי `%(app_label)s.%(data_type)s` קשורים"
msgstr "אוביקטי `%(app_label)s.%(data_type)s` קשורים"
#, python-format
msgid "related `%(app_label)s.%(object_name)s` objects"
msgstr "עצמי `%(app_label)s.%(object_name)s` קשורים"
msgstr "אובייקטי `%(app_label)s.%(object_name)s` קשורים"
#, python-format
msgid "all %s"
@@ -270,4 +271,4 @@ msgstr "מספר %s"
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "לא נראה כי %s הוא עצם urlpattern"
msgstr "לא נראה ש-%s הוא אובייקט urlpattern"
@@ -1,18 +1,18 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Fery Setiawan <gembelweb@gmail.com>, 2015-2016,2021
# Fery Setiawan <gembelweb@gmail.com>, 2015-2016
# Jannis Leidel <jannis@leidel.info>, 2011
# rodin <romihardiyanto@gmail.com>, 2011-2012
# rodin <romihardiyanto@gmail.com>, 2013-2014,2016
# sage <laymonage@gmail.com>, 2019
# sage <laymonage@gmail.com>, 2019
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-09-14 00:30+0000\n"
"Last-Translator: Fery Setiawan <gembelweb@gmail.com>\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2019-11-18 03:39+0000\n"
"Last-Translator: sage <laymonage@gmail.com>\n"
"Language-Team: Indonesian (http://www.transifex.com/django/django/language/"
"id/)\n"
"MIME-Version: 1.0\n"
@@ -104,11 +104,11 @@ msgstr "Instal docutils."
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Sistem dokumentasi admin membutuhkan pustaka <a href=\"%(link)s\">docutils</"
"a> Python."
"a> dari Python."
#, python-format
msgid ""
@@ -15,7 +15,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: kn\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "Administrative Documentation"
msgstr ""
@@ -2,7 +2,6 @@
#
# Translators:
# Jiyoon, Ha <cryptography@konkuk.ac.kr>, 2016
# 코딩 영, 2021
# Geonho Kim / Leo Kim <gh.leokim@gmail.com>, 2019
# Ian Y. Choi <ianyrchoi@gmail.com>, 2015
# Jannis Leidel <jannis@leidel.info>, 2011
@@ -13,9 +12,9 @@ msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-11-10 02:10+0000\n"
"Last-Translator: 코딩 영\n"
"POT-Creation-Date: 2019-09-08 17:27+0200\n"
"PO-Revision-Date: 2019-10-05 06:55+0000\n"
"Last-Translator: Geonho Kim / Leo Kim <gh.leokim@gmail.com>\n"
"Language-Team: Korean (http://www.transifex.com/django/django/language/ko/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -99,11 +98,11 @@ msgstr "docutils를 설치해주세요."
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"관리자 문서 시스템은 파이썬의 <a href=\"%(link)s\">docutils</a> 라이브러리"
"를 필요로 합니다."
"를 필요로합니다."
#, python-format
msgid ""
@@ -1,283 +0,0 @@
# This file is distributed under the same license as the Django package.
#
# Translators:
# Jafry Hisham, 2021
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-11-16 14:09+0000\n"
"Last-Translator: Jafry Hisham\n"
"Language-Team: Malay (http://www.transifex.com/django/django/language/ms/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Language: ms\n"
"Plural-Forms: nplurals=1; plural=0;\n"
msgid "Administrative Documentation"
msgstr "Dokumentasi Pentadbiran"
msgid "Home"
msgstr "Utama"
msgid "Documentation"
msgstr "Dokumentasi"
msgid "Bookmarklets"
msgstr "Penanda"
msgid "Documentation bookmarklets"
msgstr "Dokumentasi penanda"
msgid ""
"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."
msgstr ""
"Untuk memasang penanda, heret pautan ke palang-alat penanda-buku, atau klik-"
"kanan pada pautan dan tambahkan ke penanda-buku anda. Kini anda boleh "
"memilih penanda itu daripada mana-mana ruangan di laman."
msgid "Documentation for this page"
msgstr "Dokumentasi untuk ruangan ini"
msgid ""
"Jumps you from any page to the documentation for the view that generates "
"that page."
msgstr ""
"Membawa anda daripada mana-mana ruangan kepada dokumentasi bagi pemandangan "
"yang menjana ruang itu."
msgid "Tags"
msgstr "Tag-tag"
msgid "List of all the template tags and their functions."
msgstr "Senarai kesemua tag templat dan fungsiannya."
msgid "Filters"
msgstr "Tapisan"
msgid ""
"Filters are actions which can be applied to variables in a template to alter "
"the output."
msgstr ""
"Tapisan adalah tindakan yang boleh digunakan pada pembolehubah didalam "
"templat untuk mengubah outputnya."
msgid "Models"
msgstr "Model-model"
msgid ""
"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"
msgstr ""
"Model-model adalah penerangan bagi semua objek-objek didalam sistem dan "
"medan-medan yang berkaitan. Setiap model mempunyai senarai medan-medan yang "
"boleh diakses sebagai tempat pembolehubah."
msgid "Views"
msgstr "Pemandangan"
msgid ""
"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."
msgstr ""
"Setiap ruangan pada laman awan dihasilkan daripada pemandangan. Pemandangan "
"menakrifkan templat mana yang diguna-pakai untuk menghasilkan ruangan itu "
"dan objek mana yang boleh digunakan bersama templat itu."
msgid "Tools for your browser to quickly access admin functionality."
msgstr ""
"Alat-alat untuk pelayar anda untuk mengakses fungsian pentadbiran secara "
"pantas."
msgid "Please install docutils"
msgstr "Sila pasang docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Sistem dokumentasi pentadbiran memerlukan perpustakaan <a href=\"%(link)s"
"\">docutils</a> Python."
#, python-format
msgid ""
"Please ask your administrators to install <a href=\"%(link)s\">docutils</a>."
msgstr ""
"Sila mohon pada pentadbir-pentadbir anda untuk memasang <a href=\"%(link)s"
"\">docutils</a>."
#, python-format
msgid "Model: %(name)s"
msgstr "Model: %(name)s"
msgid "Fields"
msgstr "Medan-medan"
msgid "Field"
msgstr "Medan"
msgid "Type"
msgstr "Jenis"
msgid "Description"
msgstr "Penerangan"
msgid "Methods with arguments"
msgstr "Kaedah dengan argumen"
msgid "Method"
msgstr "Kaedah"
msgid "Arguments"
msgstr "Argumen"
msgid "Back to Model documentation"
msgstr "Patah balik ke dokumentasi Model"
msgid "Model documentation"
msgstr "Dokumentasi Model"
msgid "Model groups"
msgstr "Kumpulan-kumpulan Model"
msgid "Templates"
msgstr "Templat-templat"
#, python-format
msgid "Template: %(name)s"
msgstr "Templat: %(name)s"
#, python-format
msgid "Template: <q>%(name)s</q>"
msgstr "Templat: <q>%(name)s</q>"
#. Translators: Search is not a verb here, it qualifies path (a search path)
#, python-format
msgid "Search path for template <q>%(name)s</q>:"
msgstr "Cari laluan untuk templat <q>%(name)s</q>:"
msgid "(does not exist)"
msgstr "(tidak wujud)"
msgid "Back to Documentation"
msgstr "Patah balik ke Dokumentasi"
msgid "Template filters"
msgstr "Penapisan templat"
msgid "Template filter documentation"
msgstr "Dokumentasi penapisan templat"
msgid "Built-in filters"
msgstr "Penapisan terbina-dalam"
#, python-format
msgid ""
"To use these filters, put <code>%(code)s</code> in your template before "
"using the filter."
msgstr ""
"Untuk menggunakan tapisan-tapisan ini, letakkan <code>%(code)s</code> "
"didalam templat anda sebelum menggunakan tapisan itu."
msgid "Template tags"
msgstr "Tag-tag templat"
msgid "Template tag documentation"
msgstr "Dokumentasi tag templat"
msgid "Built-in tags"
msgstr "Tag-tag terbina-dalam"
#, python-format
msgid ""
"To use these tags, put <code>%(code)s</code> in your template before using "
"the tag."
msgstr ""
"Untuk menggunakan tag-tag ini, letakkan <code>%(code)s</code> didalam "
"templat anda sebelum menggunakan tag itu."
#, python-format
msgid "View: %(name)s"
msgstr "Pemandagan: %(name)s"
msgid "Context:"
msgstr "Konteks:"
msgid "Templates:"
msgstr "Templat-templat:"
msgid "Back to View documentation"
msgstr "Patah balik ke Dokumentasi Pemandangan"
msgid "View documentation"
msgstr "Dokumentasi Pemandangan"
msgid "Jump to namespace"
msgstr "Lompat ke ruangnama"
msgid "Empty namespace"
msgstr "Ruangnama koson"
#, python-format
msgid "Views by namespace %(name)s"
msgstr "Pemandangan berdasakran ruangnama %(name)s"
msgid "Views by empty namespace"
msgstr "Pemandangan berdasarkan ruangnama kosong"
#, python-format
msgid ""
"\n"
" View function: <code>%(full_name)s</code>. Name: <code>%(url_name)s</"
"code>.\n"
msgstr ""
"\n"
"Fungsi Pemandangan: <code>%(full_name)s</code>. Name: <code>%(url_name)s</"
"code>.\n"
msgid "tag:"
msgstr "tag:"
msgid "filter:"
msgstr "tapis:"
msgid "view:"
msgstr "lihat:"
#, python-format
msgid "App %(app_label)r not found"
msgstr "App %(app_label)r tidak dijumpai"
#, python-format
msgid "Model %(model_name)r not found in app %(app_label)r"
msgstr "Model %(model_name)r tidak dijumpai didalam app %(app_label)r"
msgid "model:"
msgstr "model:"
#, python-format
msgid "the related `%(app_label)s.%(data_type)s` object"
msgstr "objek `%(app_label)s.%(data_type)s` berkaitan"
#, python-format
msgid "related `%(app_label)s.%(object_name)s` objects"
msgstr "objek-objek `%(app_label)s.%(object_name)s` berkaitan"
#, python-format
msgid "all %s"
msgstr "semua %s"
#, python-format
msgid "number of %s"
msgstr "bilangan %s"
#, python-format
msgid "%s does not appear to be a urlpattern object"
msgstr "%s nampaknya bukan objek urlpattern"
@@ -2,14 +2,13 @@
#
# Translators:
# Jannis Leidel <jannis@leidel.info>, 2011
# Sivert Olstad, 2021
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-11-16 23:22+0000\n"
"Last-Translator: Sivert Olstad\n"
"POT-Creation-Date: 2017-01-19 16:49+0100\n"
"PO-Revision-Date: 2017-09-19 16:40+0000\n"
"Last-Translator: Jannis Leidel <jannis@leidel.info>\n"
"Language-Team: Norwegian Nynorsk (http://www.transifex.com/django/django/"
"language/nn/)\n"
"MIME-Version: 1.0\n"
@@ -19,7 +18,7 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid "Administrative Documentation"
msgstr "Administrasjons-dokumentasjon"
msgstr ""
msgid "Home"
msgstr "Heim"
@@ -38,9 +37,6 @@ msgid ""
"click the link and add it to your bookmarks. Now you can select the "
"bookmarklet from any page in the site."
msgstr ""
"For å installere bokmerke, dra lenkja til verktøylinja for bokmerke, eller "
"høgreklikk og legg til i dine bokmerke. No kan du velje bokmerket frå kva "
"for helst side på nettstaden."
msgid "Documentation for this page"
msgstr "Dokumentasjon for denne sida"
@@ -53,183 +49,168 @@ msgstr ""
"genererte sida."
msgid "Tags"
msgstr "Taggar"
msgstr ""
msgid "List of all the template tags and their functions."
msgstr "Liste over alle mal-taggar og funksjonane deira."
msgstr ""
msgid "Filters"
msgstr "Filter"
msgstr ""
msgid ""
"Filters are actions which can be applied to variables in a template to alter "
"the output."
msgstr ""
"Filter er handlingar som kan bli brukt på variablar i ein mal for å endre "
"utdata."
msgid "Models"
msgstr "Modellar"
msgstr ""
msgid ""
"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"
msgstr ""
"Modellar er beskrivingar av alle objekta i eit system og tilhøyrande felt. "
"Kvar modell har ein liste over felt som kan bli brukt som mal-variablar."
msgid "Views"
msgstr "Views"
msgstr ""
msgid ""
"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."
msgstr ""
"Kvar side på den offentlege nettstaden er generert av ein view. Viewen "
"definerer kva for ein mal som blir brukt til å generere sida og kva for "
"nokre objekt som er tilgjengelege for den malen."
msgid "Tools for your browser to quickly access admin functionality."
msgstr ""
"Verktøy for nettlesaren din for å få rask tilgang til admin-funksjonalitet"
msgid "Please install docutils"
msgstr "Installer docutils"
msgstr ""
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Admin-verktøyet sitt dokumentasjonssystem behøver Python sitt <a href="
"\"%(link)s\">docutils</a>-bibliotek."
#, python-format
msgid ""
"Please ask your administrators to install <a href=\"%(link)s\">docutils</a>."
msgstr ""
"Spør administratorane dine om å installere <a href=\"%(link)s\">docutils</a>."
#, python-format
msgid "Model: %(name)s"
msgstr "Modell: %(name)s"
msgstr ""
msgid "Fields"
msgstr "Felt"
msgstr ""
msgid "Field"
msgstr "Felt"
msgstr ""
msgid "Type"
msgstr "Type"
msgstr ""
msgid "Description"
msgstr "Beskriving"
msgstr ""
msgid "Methods with arguments"
msgstr "Metodar med argument"
msgstr ""
msgid "Method"
msgstr "Metode"
msgstr ""
msgid "Arguments"
msgstr "Argument"
msgstr ""
msgid "Back to Model documentation"
msgstr "Attende til Modelldokumentasjon"
msgstr ""
msgid "Model documentation"
msgstr "Modelldokumentasjon"
msgstr ""
msgid "Model groups"
msgstr "Modellgrupper"
msgstr ""
msgid "Templates"
msgstr "Malar"
msgstr ""
#, python-format
msgid "Template: %(name)s"
msgstr "Mal: %(name)s"
msgstr ""
#, python-format
msgid "Template: <q>%(name)s</q>"
msgstr "Mal: <q>%(name)s</q>"
msgid "Template: \"%(name)s\""
msgstr ""
#. Translators: Search is not a verb here, it qualifies path (a search path)
#, python-format
msgid "Search path for template <q>%(name)s</q>:"
msgstr "Søkjebane for mal <q>%(name)s</q>:"
msgid "Search path for template \"%(name)s\":"
msgstr ""
msgid "(does not exist)"
msgstr "(finnast ikkje)"
msgstr ""
msgid "Back to Documentation"
msgstr "Attende til Dokumentasjon"
msgstr ""
msgid "Template filters"
msgstr "Malfilter"
msgstr ""
msgid "Template filter documentation"
msgstr "Malfilterdokumentasjon"
msgstr ""
msgid "Built-in filters"
msgstr "Innbygde filter"
msgstr ""
#, python-format
msgid ""
"To use these filters, put <code>%(code)s</code> in your template before "
"using the filter."
msgstr ""
"For å bruke desse filtera, set inn <code>%(code)s</code> i malen før du "
"brukar filteret."
msgid "Template tags"
msgstr "Maltaggar"
msgstr ""
msgid "Template tag documentation"
msgstr "Maltagdokumentasjon"
msgstr ""
msgid "Built-in tags"
msgstr "Innebygde taggar"
msgstr ""
#, python-format
msgid ""
"To use these tags, put <code>%(code)s</code> in your template before using "
"the tag."
msgstr ""
"For å bruke desse taggane, set inn <code>%(code)s</code> i malen før du "
"brukar taggen."
#, python-format
msgid "View: %(name)s"
msgstr "View: %(name)s"
msgstr ""
msgid "Context:"
msgstr "Kontekst:"
msgstr ""
msgid "Templates:"
msgstr "Malar:"
msgstr ""
msgid "Back to View documentation"
msgstr "Attende til Viewdokumentasjon"
msgstr ""
msgid "View documentation"
msgstr "Viewdokumentasjon"
msgstr ""
msgid "Jump to namespace"
msgstr "Gå til namnerom"
msgstr ""
msgid "Empty namespace"
msgstr "Tomt namnerom"
msgstr ""
#, python-format
msgid "Views by namespace %(name)s"
msgstr "Views etter namnerom %(name)s"
msgstr ""
msgid "Views by empty namespace"
msgstr "Views etter tomt namnerom"
msgstr ""
#, python-format
msgid ""
@@ -237,8 +218,6 @@ msgid ""
" View function: <code>%(full_name)s</code>. Name: <code>%(url_name)s</"
"code>.\n"
msgstr ""
"\n"
" Viewfunksjon: <code>%(full_name)s</code>. Namn: <code>%(url_name)s</code>.\n"
msgid "tag:"
msgstr "tag:"
@@ -251,7 +230,7 @@ msgstr "view:"
#, python-format
msgid "App %(app_label)r not found"
msgstr "Applikasjon %(app_label)r ikkje funne"
msgstr ""
#, python-format
msgid "Model %(model_name)r not found in app %(app_label)r"
@@ -2,18 +2,17 @@
#
# Translators:
# Jannis Leidel <jannis@leidel.info>, 2011
# 18f25ad6fa9930fc67cb11aca9d16a27, 2012-2013
# Juraj Bubniak <translations@jbub.eu>, 2012-2013
# Marian Andre <marian@andre.sk>, 2012-2013,2015,2017
# Martin Tóth <ezimir@gmail.com>, 2017
# Peter Kuma, 2021
# supowski <supowski@gmail.com>, 2015
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-07-24 21:08+0000\n"
"Last-Translator: Peter Kuma\n"
"POT-Creation-Date: 2017-01-19 16:49+0100\n"
"PO-Revision-Date: 2017-09-23 18:54+0000\n"
"Last-Translator: Martin Tóth <ezimir@gmail.com>\n"
"Language-Team: Slovak (http://www.transifex.com/django/django/language/sk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -104,10 +103,10 @@ msgstr "Prosím, nainštalujte docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Dokumentačný systém správy stránok vyžaduje Python knižnicu <a href="
"Dokumentačný systém správy stránok vyžaduje pythonovskú knižnicu <a href="
"\"%(link)s\">docutils</a>."
#, python-format
@@ -158,13 +157,13 @@ msgid "Template: %(name)s"
msgstr "Šablóna: %(name)s"
#, python-format
msgid "Template: <q>%(name)s</q>"
msgstr "Šablóna: <q>%(name)s</q>"
msgid "Template: \"%(name)s\""
msgstr "Šablóna: \"%(name)s\""
#. Translators: Search is not a verb here, it qualifies path (a search path)
#, python-format
msgid "Search path for template <q>%(name)s</q>:"
msgstr "Vyhľadávacia cesta pre šablónu <q>%(name)s</q>:"
msgid "Search path for template \"%(name)s\":"
msgstr "Vyhľadávacia cesta pre šablónu \"%(name)s\":"
msgid "(does not exist)"
msgstr "(neexistuje)"
@@ -6,14 +6,13 @@
# Jonathan Lindén, 2014
# Petter Strandmark <petter.strandmark@gmail.com>, 2019
# Thomas Lundqvist, 2013
# Tomas Lööw <tomas.loow@mailbox.org>, 2021
msgid ""
msgstr ""
"Project-Id-Version: django\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-01-15 09:00+0100\n"
"PO-Revision-Date: 2021-10-27 05:33+0000\n"
"Last-Translator: Tomas Lööw <tomas.loow@mailbox.org>\n"
"POT-Creation-Date: 2017-01-19 16:49+0100\n"
"PO-Revision-Date: 2019-01-28 13:49+0000\n"
"Last-Translator: Petter Strandmark <petter.strandmark@gmail.com>\n"
"Language-Team: Swedish (http://www.transifex.com/django/django/language/"
"sv/)\n"
"MIME-Version: 1.0\n"
@@ -106,7 +105,7 @@ msgstr "Vänligen installera docutils"
#, python-format
msgid ""
"The admin documentation system requires Pythons <a href=\"%(link)s"
"The admin documentation system requires Python's <a href=\"%(link)s"
"\">docutils</a> library."
msgstr ""
"Administrationsdokumentationen kräver Pythons <a href=\"%(link)s\">docutils</"
@@ -160,13 +159,13 @@ msgid "Template: %(name)s"
msgstr "Mall: %(name)s"
#, python-format
msgid "Template: <q>%(name)s</q>"
msgstr ""
msgid "Template: \"%(name)s\""
msgstr "Mall: \"%(name)s\""
#. Translators: Search is not a verb here, it qualifies path (a search path)
#, python-format
msgid "Search path for template <q>%(name)s</q>:"
msgstr ""
msgid "Search path for template \"%(name)s\":"
msgstr "Sökväg för mall \"%(name)s\":"
msgid "(does not exist)"
msgstr "(finns inte)"
@@ -1,5 +1,4 @@
from django.conf import settings
from django.core.exceptions import ImproperlyConfigured
from django.http import HttpResponse
from django.utils.deprecation import MiddlewareMixin
@@ -10,7 +9,6 @@ class XViewMiddleware(MiddlewareMixin):
"""
Add an X-View header to internal HEAD requests.
"""
def process_view(self, request, view_func, view_args, view_kwargs):
"""
If the request method is HEAD and either the IP is internal or the
@@ -18,16 +16,13 @@ class XViewMiddleware(MiddlewareMixin):
header indicating the view function. This is used to lookup the view
function for an arbitrary page.
"""
if not hasattr(request, "user"):
raise ImproperlyConfigured(
"The XView middleware requires authentication middleware to "
"be installed. Edit your MIDDLEWARE setting to insert "
"'django.contrib.auth.middleware.AuthenticationMiddleware'."
)
if request.method == "HEAD" and (
request.META.get("REMOTE_ADDR") in settings.INTERNAL_IPS
or (request.user.is_active and request.user.is_staff)
):
assert hasattr(request, 'user'), (
"The XView middleware requires authentication middleware to be "
"installed. Edit your MIDDLEWARE setting to insert "
"'django.contrib.auth.middleware.AuthenticationMiddleware'."
)
if request.method == 'HEAD' and (request.META.get('REMOTE_ADDR') in settings.INTERNAL_IPS or
(request.user.is_active and request.user.is_staff)):
response = HttpResponse()
response.headers["X-View"] = get_view_name(view_func)
response.headers['X-View'] = get_view_name(view_func)
return response
@@ -3,48 +3,48 @@ from django.urls import path, re_path
urlpatterns = [
path(
"",
views.BaseAdminDocsView.as_view(template_name="admin_doc/index.html"),
name="django-admindocs-docroot",
'',
views.BaseAdminDocsView.as_view(template_name='admin_doc/index.html'),
name='django-admindocs-docroot',
),
path(
"bookmarklets/",
'bookmarklets/',
views.BookmarkletsView.as_view(),
name="django-admindocs-bookmarklets",
name='django-admindocs-bookmarklets',
),
path(
"tags/",
'tags/',
views.TemplateTagIndexView.as_view(),
name="django-admindocs-tags",
name='django-admindocs-tags',
),
path(
"filters/",
'filters/',
views.TemplateFilterIndexView.as_view(),
name="django-admindocs-filters",
name='django-admindocs-filters',
),
path(
"views/",
'views/',
views.ViewIndexView.as_view(),
name="django-admindocs-views-index",
name='django-admindocs-views-index',
),
path(
"views/<view>/",
'views/<view>/',
views.ViewDetailView.as_view(),
name="django-admindocs-views-detail",
name='django-admindocs-views-detail',
),
path(
"models/",
'models/',
views.ModelIndexView.as_view(),
name="django-admindocs-models-index",
name='django-admindocs-models-index',
),
re_path(
r"^models/(?P<app_label>[^\.]+)\.(?P<model_name>[^/]+)/$",
r'^models/(?P<app_label>[^\.]+)\.(?P<model_name>[^/]+)/$',
views.ModelDetailView.as_view(),
name="django-admindocs-models-detail",
name='django-admindocs-models-detail',
),
path(
"templates/<path:template>/",
'templates/<path:template>/',
views.TemplateDetailView.as_view(),
name="django-admindocs-templates",
name='django-admindocs-templates',
),
]
@@ -20,12 +20,9 @@ else:
def get_view_name(view_func):
if hasattr(view_func, "view_class"):
klass = view_func.view_class
return f"{klass.__module__}.{klass.__qualname__}"
mod_name = view_func.__module__
view_name = getattr(view_func, "__qualname__", view_func.__class__.__name__)
return mod_name + "." + view_name
view_name = getattr(view_func, '__qualname__', view_func.__class__.__name__)
return mod_name + '.' + view_name
def parse_docstring(docstring):
@@ -33,12 +30,12 @@ def parse_docstring(docstring):
Parse out the parts of a docstring. Return (title, body, metadata).
"""
if not docstring:
return "", "", {}
return '', '', {}
docstring = cleandoc(docstring)
parts = re.split(r"\n{2,}", docstring)
parts = re.split(r'\n{2,}', docstring)
title = parts[0]
if len(parts) == 1:
body = ""
body = ''
metadata = {}
else:
parser = HeaderParser()
@@ -61,14 +58,14 @@ def parse_rst(text, default_reference_context, thing_being_parsed=None):
Convert the string from reST to an XHTML fragment.
"""
overrides = {
"doctitle_xform": True,
"initial_header_level": 3,
'doctitle_xform': True,
'initial_header_level': 3,
"default_reference_context": default_reference_context,
"link_base": reverse("django-admindocs-docroot").rstrip("/"),
"raw_enabled": False,
"file_insertion_enabled": False,
"link_base": reverse('django-admindocs-docroot').rstrip('/'),
'raw_enabled': False,
'file_insertion_enabled': False,
}
thing_being_parsed = thing_being_parsed and "<%s>" % thing_being_parsed
thing_being_parsed = thing_being_parsed and '<%s>' % thing_being_parsed
# Wrap ``text`` in some reST that sets the default role to ``cmsreference``,
# then restores it.
source = """
@@ -80,23 +77,21 @@ def parse_rst(text, default_reference_context, thing_being_parsed=None):
"""
parts = docutils.core.publish_parts(
source % text,
source_path=thing_being_parsed,
destination_path=None,
writer_name="html",
settings_overrides=overrides,
source_path=thing_being_parsed, destination_path=None,
writer_name='html', settings_overrides=overrides,
)
return mark_safe(parts["fragment"])
return mark_safe(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",
'model': '%s/models/%s/',
'view': '%s/views/%s/',
'template': '%s/templates/%s/',
'filter': '%s/filters/#%s',
'tag': '%s/tags/#%s',
}
@@ -107,52 +102,41 @@ def create_reference_role(rolename, urlbase):
node = docutils.nodes.reference(
rawtext,
text,
refuri=(
urlbase
% (
inliner.document.settings.link_base,
text.lower(),
)
),
**options,
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
):
def default_reference_role(name, rawtext, text, lineno, inliner, options=None, content=None):
if options is None:
options = {}
context = inliner.document.settings.default_reference_context
node = docutils.nodes.reference(
rawtext,
text,
refuri=(
ROLES[context]
% (
inliner.document.settings.link_base,
text.lower(),
)
),
**options,
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.register_canonical_role('cmsreference', default_reference_role)
for name, urlbase in ROLES.items():
create_reference_role(name, urlbase)
# Match the beginning of a named or unnamed group.
named_group_matcher = _lazy_re_compile(r"\(\?P(<\w+>)")
unnamed_group_matcher = _lazy_re_compile(r"\(")
named_group_matcher = _lazy_re_compile(r'\(\?P(<\w+>)')
unnamed_group_matcher = _lazy_re_compile(r'\(')
def replace_named_groups(pattern):
@@ -164,7 +148,8 @@ def replace_named_groups(pattern):
4. ^(?P<a>\w+)/b/(?P<c>\w+) ==> ^<a>/b/<c>
"""
named_group_indices = [
(m.start(0), m.end(0), m[1]) for m in named_group_matcher.finditer(pattern)
(m.start(0), m.end(0), m[1])
for m in named_group_matcher.finditer(pattern)
]
# Tuples of (named capture group pattern, group name).
group_pattern_and_name = []
@@ -175,17 +160,15 @@ def replace_named_groups(pattern):
for idx, val in enumerate(pattern[end:]):
# Check for unescaped `(` and `)`. They mark the start and end of a
# nested group.
if val == "(" and prev_char != "\\":
if val == '(' and prev_char != '\\':
unmatched_open_brackets += 1
elif val == ")" and prev_char != "\\":
elif val == ')' and prev_char != '\\':
unmatched_open_brackets -= 1
prev_char = val
# If brackets are balanced, the end of the string for the current
# named capture group pattern has been reached.
if unmatched_open_brackets == 0:
group_pattern_and_name.append(
(pattern[start : end + idx + 1], group_name)
)
group_pattern_and_name.append((pattern[start:end + idx + 1], group_name))
break
# Replace the string for named capture groups with their group names.
@@ -202,21 +185,19 @@ def replace_unnamed_groups(pattern):
3. ^(?P<a>\w+)/b/(\w+) ==> ^(?P<a>\w+)/b/<var>
4. ^(?P<a>\w+)/b/((x|y)\w+) ==> ^(?P<a>\w+)/b/<var>
"""
unnamed_group_indices = [
m.start(0) for m in unnamed_group_matcher.finditer(pattern)
]
unnamed_group_indices = [m.start(0) for m in unnamed_group_matcher.finditer(pattern)]
# Indices of the start of unnamed capture groups.
group_indices = []
# Loop over the start indices of the groups.
for start in unnamed_group_indices:
# Handle nested parentheses, e.g. '^b/((x|y)\w+)$'.
unmatched_open_brackets, prev_char = 1, None
for idx, val in enumerate(pattern[start + 1 :]):
for idx, val in enumerate(pattern[start + 1:]):
# Check for unescaped `(` and `)`. They mark the start and end of
# a nested group.
if val == "(" and prev_char != "\\":
if val == '(' and prev_char != '\\':
unmatched_open_brackets += 1
elif val == ")" and prev_char != "\\":
elif val == ')' and prev_char != '\\':
unmatched_open_brackets -= 1
prev_char = val
@@ -239,9 +220,9 @@ def replace_unnamed_groups(pattern):
for start, end in group_start_end_indices:
if prev_end:
final_pattern.append(pattern[prev_end:start])
final_pattern.append(pattern[:start] + "<var>")
final_pattern.append(pattern[:start] + '<var>')
prev_end = end
final_pattern.append(pattern[prev_end:])
return "".join(final_pattern)
return ''.join(final_pattern)
else:
return pattern
@@ -4,10 +4,13 @@ from inspect import cleandoc
from pathlib import Path
from django.apps import apps
from django.conf import settings
from django.contrib import admin
from django.contrib.admin.views.decorators import staff_member_required
from django.contrib.admindocs import utils
from django.contrib.admindocs.utils import replace_named_groups, replace_unnamed_groups
from django.contrib.admindocs.utils import (
replace_named_groups, replace_unnamed_groups,
)
from django.core.exceptions import ImproperlyConfigured, ViewDoesNotExist
from django.db import models
from django.http import Http404
@@ -15,11 +18,8 @@ from django.template.engine import Engine
from django.urls import get_mod_func, get_resolver, get_urlconf
from django.utils._os import safe_join
from django.utils.decorators import method_decorator
from django.utils.functional import cached_property
from django.utils.inspect import (
func_accepts_kwargs,
func_accepts_var_args,
get_func_full_args,
func_accepts_kwargs, func_accepts_var_args, get_func_full_args,
method_has_no_args,
)
from django.utils.translation import gettext as _
@@ -28,37 +28,34 @@ from django.views.generic import TemplateView
from .utils import get_view_name
# Exclude methods starting with these strings from documentation
MODEL_METHODS_EXCLUDE = ("_", "add_", "delete", "save", "set_")
MODEL_METHODS_EXCLUDE = ('_', 'add_', 'delete', 'save', 'set_')
class BaseAdminDocsView(TemplateView):
"""
Base view for admindocs views.
"""
@method_decorator(staff_member_required)
def dispatch(self, request, *args, **kwargs):
if not utils.docutils_is_available:
# Display an error message for people without docutils
self.template_name = "admin_doc/missing_docutils.html"
self.template_name = 'admin_doc/missing_docutils.html'
return self.render_to_response(admin.site.each_context(request))
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
return super().get_context_data(
**{
**kwargs,
**admin.site.each_context(self.request),
}
)
return super().get_context_data(**{
**kwargs,
**admin.site.each_context(self.request),
})
class BookmarkletsView(BaseAdminDocsView):
template_name = "admin_doc/bookmarklets.html"
template_name = 'admin_doc/bookmarklets.html'
class TemplateTagIndexView(BaseAdminDocsView):
template_name = "admin_doc/template_tag_index.html"
template_name = 'admin_doc/template_tag_index.html'
def get_context_data(self, **kwargs):
tags = []
@@ -69,33 +66,27 @@ class TemplateTagIndexView(BaseAdminDocsView):
pass
else:
app_libs = sorted(engine.template_libraries.items())
builtin_libs = [("", lib) for lib in engine.template_builtins]
builtin_libs = [('', lib) for lib in engine.template_builtins]
for module_name, library in builtin_libs + app_libs:
for tag_name, tag_func in library.tags.items():
title, body, metadata = utils.parse_docstring(tag_func.__doc__)
title = title and utils.parse_rst(
title, "tag", _("tag:") + tag_name
)
body = body and utils.parse_rst(body, "tag", _("tag:") + tag_name)
title = title and utils.parse_rst(title, 'tag', _('tag:') + tag_name)
body = body and utils.parse_rst(body, 'tag', _('tag:') + tag_name)
for key in metadata:
metadata[key] = utils.parse_rst(
metadata[key], "tag", _("tag:") + tag_name
)
tag_library = module_name.split(".")[-1]
tags.append(
{
"name": tag_name,
"title": title,
"body": body,
"meta": metadata,
"library": tag_library,
}
)
return super().get_context_data(**{**kwargs, "tags": tags})
metadata[key] = utils.parse_rst(metadata[key], 'tag', _('tag:') + tag_name)
tag_library = module_name.split('.')[-1]
tags.append({
'name': tag_name,
'title': title,
'body': body,
'meta': metadata,
'library': tag_library,
})
return super().get_context_data(**{**kwargs, 'tags': tags})
class TemplateFilterIndexView(BaseAdminDocsView):
template_name = "admin_doc/template_filter_index.html"
template_name = 'admin_doc/template_filter_index.html'
def get_context_data(self, **kwargs):
filters = []
@@ -106,58 +97,45 @@ class TemplateFilterIndexView(BaseAdminDocsView):
pass
else:
app_libs = sorted(engine.template_libraries.items())
builtin_libs = [("", lib) for lib in engine.template_builtins]
builtin_libs = [('', lib) for lib in engine.template_builtins]
for module_name, library in builtin_libs + app_libs:
for filter_name, filter_func in library.filters.items():
title, body, metadata = utils.parse_docstring(filter_func.__doc__)
title = title and utils.parse_rst(
title, "filter", _("filter:") + filter_name
)
body = body and utils.parse_rst(
body, "filter", _("filter:") + filter_name
)
title = title and utils.parse_rst(title, 'filter', _('filter:') + filter_name)
body = body and utils.parse_rst(body, 'filter', _('filter:') + filter_name)
for key in metadata:
metadata[key] = utils.parse_rst(
metadata[key], "filter", _("filter:") + filter_name
)
tag_library = module_name.split(".")[-1]
filters.append(
{
"name": filter_name,
"title": title,
"body": body,
"meta": metadata,
"library": tag_library,
}
)
return super().get_context_data(**{**kwargs, "filters": filters})
metadata[key] = utils.parse_rst(metadata[key], 'filter', _('filter:') + filter_name)
tag_library = module_name.split('.')[-1]
filters.append({
'name': filter_name,
'title': title,
'body': body,
'meta': metadata,
'library': tag_library,
})
return super().get_context_data(**{**kwargs, 'filters': filters})
class ViewIndexView(BaseAdminDocsView):
template_name = "admin_doc/view_index.html"
template_name = 'admin_doc/view_index.html'
def get_context_data(self, **kwargs):
views = []
url_resolver = get_resolver(get_urlconf())
try:
view_functions = extract_views_from_urlpatterns(url_resolver.url_patterns)
except ImproperlyConfigured:
view_functions = []
urlconf = import_module(settings.ROOT_URLCONF)
view_functions = extract_views_from_urlpatterns(urlconf.urlpatterns)
for (func, regex, namespace, name) in view_functions:
views.append(
{
"full_name": get_view_name(func),
"url": simplify_regex(regex),
"url_name": ":".join((namespace or []) + (name and [name] or [])),
"namespace": ":".join(namespace or []),
"name": name,
}
)
return super().get_context_data(**{**kwargs, "views": views})
views.append({
'full_name': get_view_name(func),
'url': simplify_regex(regex),
'url_name': ':'.join((namespace or []) + (name and [name] or [])),
'namespace': ':'.join(namespace or []),
'name': name,
})
return super().get_context_data(**{**kwargs, 'views': views})
class ViewDetailView(BaseAdminDocsView):
template_name = "admin_doc/view_detail.html"
template_name = 'admin_doc/view_detail.html'
@staticmethod
def _get_view_func(view):
@@ -177,56 +155,52 @@ class ViewDetailView(BaseAdminDocsView):
return getattr(getattr(import_module(mod), klass), func)
def get_context_data(self, **kwargs):
view = self.kwargs["view"]
view = self.kwargs['view']
view_func = self._get_view_func(view)
if view_func is None:
raise Http404
title, body, metadata = utils.parse_docstring(view_func.__doc__)
title = title and utils.parse_rst(title, "view", _("view:") + view)
body = body and utils.parse_rst(body, "view", _("view:") + view)
title = title and utils.parse_rst(title, 'view', _('view:') + view)
body = body and utils.parse_rst(body, 'view', _('view:') + view)
for key in metadata:
metadata[key] = utils.parse_rst(metadata[key], "model", _("view:") + view)
return super().get_context_data(
**{
**kwargs,
"name": view,
"summary": title,
"body": body,
"meta": metadata,
}
)
metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
return super().get_context_data(**{
**kwargs,
'name': view,
'summary': title,
'body': body,
'meta': metadata,
})
class ModelIndexView(BaseAdminDocsView):
template_name = "admin_doc/model_index.html"
template_name = 'admin_doc/model_index.html'
def get_context_data(self, **kwargs):
m_list = [m._meta for m in apps.get_models()]
return super().get_context_data(**{**kwargs, "models": m_list})
return super().get_context_data(**{**kwargs, 'models': m_list})
class ModelDetailView(BaseAdminDocsView):
template_name = "admin_doc/model_detail.html"
template_name = 'admin_doc/model_detail.html'
def get_context_data(self, **kwargs):
model_name = self.kwargs["model_name"]
model_name = self.kwargs['model_name']
# Get the model class.
try:
app_config = apps.get_app_config(self.kwargs["app_label"])
app_config = apps.get_app_config(self.kwargs['app_label'])
except LookupError:
raise Http404(_("App %(app_label)r not found") % self.kwargs)
try:
model = app_config.get_model(model_name)
except LookupError:
raise Http404(
_("Model %(model_name)r not found in app %(app_label)r") % self.kwargs
)
raise Http404(_("Model %(model_name)r not found in app %(app_label)r") % self.kwargs)
opts = model._meta
title, body, metadata = utils.parse_docstring(model.__doc__)
title = title and utils.parse_rst(title, "model", _("model:") + model_name)
body = body and utils.parse_rst(body, "model", _("model:") + model_name)
title = title and utils.parse_rst(title, 'model', _('model:') + model_name)
body = body and utils.parse_rst(body, 'model', _('model:') + model_name)
# Gather fields/field descriptions.
fields = []
@@ -237,63 +211,45 @@ class ModelDetailView(BaseAdminDocsView):
data_type = field.remote_field.model.__name__
app_label = field.remote_field.model._meta.app_label
verbose = utils.parse_rst(
(
_("the related `%(app_label)s.%(data_type)s` object")
% {
"app_label": app_label,
"data_type": data_type,
}
),
"model",
_("model:") + data_type,
(_("the related `%(app_label)s.%(data_type)s` object") % {
'app_label': app_label, 'data_type': 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 or "",
"help_text": field.help_text,
}
)
fields.append({
'name': field.name,
'data_type': data_type,
'verbose': verbose or '',
'help_text': field.help_text,
})
# Gather many-to-many fields.
for field in opts.many_to_many:
data_type = field.remote_field.model.__name__
app_label = field.remote_field.model._meta.app_label
verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
"app_label": app_label,
"object_name": data_type,
'app_label': app_label,
'object_name': data_type,
}
fields.append(
{
"name": "%s.all" % field.name,
"data_type": "List",
"verbose": utils.parse_rst(
_("all %s") % verbose, "model", _("model:") + opts.model_name
),
}
)
fields.append(
{
"name": "%s.count" % field.name,
"data_type": "Integer",
"verbose": utils.parse_rst(
_("number of %s") % verbose,
"model",
_("model:") + opts.model_name,
),
}
)
fields.append({
'name': "%s.all" % field.name,
"data_type": 'List',
'verbose': utils.parse_rst(_("all %s") % verbose, 'model', _('model:') + opts.model_name),
})
fields.append({
'name': "%s.count" % field.name,
'data_type': 'Integer',
'verbose': utils.parse_rst(_("number of %s") % verbose, 'model', _('model:') + opts.model_name),
})
methods = []
# Gather model methods.
for func_name, func in model.__dict__.items():
if inspect.isfunction(func) or isinstance(
func, (cached_property, property)
):
if inspect.isfunction(func) or isinstance(func, property):
try:
for exclude in MODEL_METHODS_EXCLUDE:
if func_name.startswith(exclude):
@@ -302,96 +258,69 @@ class ModelDetailView(BaseAdminDocsView):
continue
verbose = func.__doc__
verbose = verbose and (
utils.parse_rst(
cleandoc(verbose), "model", _("model:") + opts.model_name
)
utils.parse_rst(cleandoc(verbose), 'model', _('model:') + opts.model_name)
)
# Show properties, cached_properties, and methods without
# arguments as fields. Otherwise, show as a 'method with
# arguments'.
if isinstance(func, (cached_property, property)):
fields.append(
{
"name": func_name,
"data_type": get_return_data_type(func_name),
"verbose": verbose or "",
}
)
elif (
method_has_no_args(func)
and not func_accepts_kwargs(func)
and not func_accepts_var_args(func)
):
fields.append(
{
"name": func_name,
"data_type": get_return_data_type(func_name),
"verbose": verbose or "",
}
)
# Show properties and methods without arguments as fields.
# Otherwise, show as a 'method with arguments'.
if isinstance(func, property):
fields.append({
'name': func_name,
'data_type': get_return_data_type(func_name),
'verbose': verbose or ''
})
elif method_has_no_args(func) and not func_accepts_kwargs(func) and not func_accepts_var_args(func):
fields.append({
'name': func_name,
'data_type': get_return_data_type(func_name),
'verbose': verbose or '',
})
else:
arguments = get_func_full_args(func)
# Join arguments with ', ' and in case of default value,
# join it with '='. Use repr() so that strings will be
# correctly displayed.
print_arguments = ", ".join(
[
"=".join([arg_el[0], *map(repr, arg_el[1:])])
for arg_el in arguments
]
)
methods.append(
{
"name": func_name,
"arguments": print_arguments,
"verbose": verbose or "",
}
)
print_arguments = ', '.join([
'='.join([arg_el[0], *map(repr, arg_el[1:])])
for arg_el in arguments
])
methods.append({
'name': func_name,
'arguments': print_arguments,
'verbose': verbose or '',
})
# Gather related objects
for rel in opts.related_objects:
verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
"app_label": rel.related_model._meta.app_label,
"object_name": rel.related_model._meta.object_name,
'app_label': rel.related_model._meta.app_label,
'object_name': rel.related_model._meta.object_name,
}
accessor = rel.get_accessor_name()
fields.append(
{
"name": "%s.all" % accessor,
"data_type": "List",
"verbose": utils.parse_rst(
_("all %s") % verbose, "model", _("model:") + opts.model_name
),
}
)
fields.append(
{
"name": "%s.count" % accessor,
"data_type": "Integer",
"verbose": utils.parse_rst(
_("number of %s") % verbose,
"model",
_("model:") + opts.model_name,
),
}
)
return super().get_context_data(
**{
**kwargs,
"name": opts.label,
"summary": title,
"description": body,
"fields": fields,
"methods": methods,
}
)
fields.append({
'name': "%s.all" % accessor,
'data_type': 'List',
'verbose': utils.parse_rst(_("all %s") % verbose, 'model', _('model:') + opts.model_name),
})
fields.append({
'name': "%s.count" % accessor,
'data_type': 'Integer',
'verbose': utils.parse_rst(_("number of %s") % verbose, 'model', _('model:') + opts.model_name),
})
return super().get_context_data(**{
**kwargs,
'name': opts.label,
'summary': title,
'description': body,
'fields': fields,
'methods': methods,
})
class TemplateDetailView(BaseAdminDocsView):
template_name = "admin_doc/template_detail.html"
template_name = 'admin_doc/template_detail.html'
def get_context_data(self, **kwargs):
template = self.kwargs["template"]
template = self.kwargs['template']
templates = []
try:
default_engine = Engine.get_default()
@@ -405,22 +334,18 @@ class TemplateDetailView(BaseAdminDocsView):
if template_file.exists():
template_contents = template_file.read_text()
else:
template_contents = ""
templates.append(
{
"file": template_file,
"exists": template_file.exists(),
"contents": template_contents,
"order": index,
}
)
return super().get_context_data(
**{
**kwargs,
"name": template,
"templates": templates,
}
)
template_contents = ''
templates.append({
'file': template_file,
'exists': template_file.exists(),
'contents': template_contents,
'order': index,
})
return super().get_context_data(**{
**kwargs,
'name': template,
'templates': templates,
})
####################
@@ -430,12 +355,12 @@ class TemplateDetailView(BaseAdminDocsView):
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 ""
if func_name.startswith('get_'):
if func_name.endswith('_list'):
return 'List'
elif func_name.endswith('_count'):
return 'Integer'
return ''
def get_readable_field_data_type(field):
@@ -447,7 +372,7 @@ def get_readable_field_data_type(field):
return field.description % field.__dict__
def extract_views_from_urlpatterns(urlpatterns, base="", namespace=None):
def extract_views_from_urlpatterns(urlpatterns, base='', namespace=None):
"""
Return a list of views from a list of urlpatterns.
@@ -455,19 +380,17 @@ def extract_views_from_urlpatterns(urlpatterns, base="", namespace=None):
"""
views = []
for p in urlpatterns:
if hasattr(p, "url_patterns"):
if hasattr(p, 'url_patterns'):
try:
patterns = p.url_patterns
except ImportError:
continue
views.extend(
extract_views_from_urlpatterns(
patterns,
base + str(p.pattern),
(namespace or []) + (p.namespace and [p.namespace] or []),
)
)
elif hasattr(p, "callback"):
views.extend(extract_views_from_urlpatterns(
patterns,
base + str(p.pattern),
(namespace or []) + (p.namespace and [p.namespace] or [])
))
elif hasattr(p, 'callback'):
try:
views.append((p.callback, base + str(p.pattern), namespace, p.name))
except ViewDoesNotExist:
@@ -486,7 +409,7 @@ def simplify_regex(pattern):
pattern = replace_named_groups(pattern)
pattern = replace_unnamed_groups(pattern)
# clean up any outstanding regex-y characters.
pattern = pattern.replace("^", "").replace("$", "").replace("?", "")
if not pattern.startswith("/"):
pattern = "/" + pattern
pattern = pattern.replace('^', '').replace('$', '').replace('?', '')
if not pattern.startswith('/'):
pattern = '/' + pattern
return pattern