mirror of
https://github.com/Hopiu/djLint.git
synced 2026-03-16 21:40:24 +00:00
updated formatter and docs
This commit is contained in:
parent
558b3b3cf4
commit
9120f70147
705 changed files with 61642 additions and 382 deletions
|
|
@ -1,2 +1,2 @@
|
|||
include pyproject.toml
|
||||
include rules.yaml
|
||||
include src/djlint/rules.yaml
|
||||
|
|
|
|||
117
README.rst
117
README.rst
|
|
@ -1,114 +1,41 @@
|
|||
djlint
|
||||
djLint
|
||||
======
|
||||
|
||||
Simple Django template linter and reformatter. Ps, reformatting might
|
||||
work with Jinja and Handlebar templates as well! Test it out with the
|
||||
``--check`` flag.
|
||||
Simple html template linter and reformatter to find common formatting issues with and *reformat* django html templates
|
||||
|
||||
Ps, ``--check`` it out on Jinja and Handlebar templates as well!
|
||||
|
||||
|codecov| |test| |Codacy Badge| |Maintainability|
|
||||
|
||||
Install from `Pypi <https://pypi.org/project/djlint/>`__
|
||||
--------------------------------------------------------
|
||||
|
||||
.. code:: sh
|
||||
|
||||
pip install djlint
|
||||
|
||||
Linter Usage
|
||||
------------
|
||||
|
||||
.. code:: sh
|
||||
|
||||
djlint src # file or path
|
||||
|
||||
# with custom extensions
|
||||
djlint src -e html.dj
|
||||
|
||||
Reformatter Usage
|
||||
-----------------
|
||||
|
||||
Reforamtting is beta. Check the output before applying changes. Please
|
||||
PR any changes needed 👍🏽
|
||||
|
||||
.. code:: sh
|
||||
|
||||
djlint src --reformat --check
|
||||
|
||||
djlint src --reformat
|
||||
|
||||
Optional args
|
||||
Documentation
|
||||
-------------
|
||||
|
||||
+--------------------+---------------------------+----------------+
|
||||
| Arg | Definition | Default |
|
||||
+====================+===========================+================+
|
||||
| -e, --extension | File extension to lint. | default=html |
|
||||
+--------------------+---------------------------+----------------+
|
||||
| --reformat --check | Checks html formatting | |
|
||||
+--------------------+---------------------------+----------------+
|
||||
| --reformat | Reformats html | |
|
||||
+--------------------+---------------------------+----------------+
|
||||
Read the `documentation <https://djlint.readthedocs.io>`_
|
||||
|
||||
Linter Rules
|
||||
------------
|
||||
Show your format
|
||||
----------------
|
||||
|
||||
Error Codes
|
||||
~~~~~~~~~~~
|
||||
Add a badge to your projects `readme.md`:
|
||||
|
||||
+--------+----------------------------------------------------------------------+
|
||||
| Code | Meaning |
|
||||
+========+======================================================================+
|
||||
| E001 | Variables should be wrapped in a single whitespace. Ex: {{ this }} |
|
||||
+--------+----------------------------------------------------------------------+
|
||||
| E002 | Double quotes should be used in tags. Ex {% extends "this.html" %} |
|
||||
+--------+----------------------------------------------------------------------+
|
||||
.. code-block:: md
|
||||
|
||||
Warning Codes
|
||||
~~~~~~~~~~~~~
|
||||
[](https://github.com/Riverside-Healthcare/djlint)
|
||||
|
||||
+--------+----------------------------------------------------------------+
|
||||
| Code | Meaning |
|
||||
+========+================================================================+
|
||||
| W003 | Endblock should have name. Ex: {% endblock body %}. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W004 | Status urls should follow {% static path/to/file %} pattern. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W005 | Html tag should have lang attribute. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W006 | Img tag should have alt, height and width attributes. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W007 | <!DOCTYPE ... > should be present before the html tag. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W008 | Attributes should be double quoted. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W009 | Tag names should be lowercase. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W010 | Attribute names should be lowercase. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W011 | Attirbute values should be quoted. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W012 | There should be no spaces around attribute =. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W013 | Line is longer than 99 chars. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W014 | More than 2 blank lines. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W015 | Follow h tags with a blank line. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W016 | Missging title tag in html. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W017 | Tag should be self closing. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
|
||||
Adding Rules
|
||||
------------
|
||||
Add a badge to your `readme.rst`:
|
||||
|
||||
A good rule consists of
|
||||
.. code-block:: rst
|
||||
|
||||
.. image:: https://img.shields.io/badge/html%20style-djlint-blue.svg
|
||||
:target: https://github.com/Riverside-Healthcare/djlint
|
||||
|
||||
|
||||
Looks like this:
|
||||
|
||||
.. image:: https://img.shields.io/badge/html%20style-djlint-blue.svg
|
||||
:target: https://github.com/Riverside-Healthcare/djlint
|
||||
|
||||
- Name
|
||||
- Code - Codes beginning with "E" signify error, and "W" warning.
|
||||
- Message - Message to display when error is found.
|
||||
- Patterns - regex expressions that will find the error.
|
||||
|
||||
Contributing - Please Help!
|
||||
---------------------------
|
||||
|
|
|
|||
BIN
docs/_static/icon.png
vendored
Normal file
BIN
docs/_static/icon.png
vendored
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 3.7 KiB |
|
|
@ -38,14 +38,14 @@ html_sidebars = {
|
|||
|
||||
html_theme_options = {
|
||||
"show_related": False,
|
||||
"description": "django template formatter",
|
||||
"description": "Html Template Lint",
|
||||
"github_button": True,
|
||||
"github_user": "Riverside-Healthcare",
|
||||
"github_repo": "djlint",
|
||||
"github_type": "star",
|
||||
"show_powered_by": False,
|
||||
"fixed_sidebar": True,
|
||||
# "logo": "logo2.png",
|
||||
"logo": "icon.png",
|
||||
}
|
||||
|
||||
html_static_path = ["_static"]
|
||||
|
|
|
|||
6
docs/djlint/configuration.rst
Normal file
6
docs/djlint/configuration.rst
Normal file
|
|
@ -0,0 +1,6 @@
|
|||
Configuration
|
||||
=============
|
||||
|
||||
Help needed!
|
||||
|
||||
Ideally we'd like to be able to ignore rules through pyproject.toml, or cli.
|
||||
51
docs/djlint/formatter.rst
Normal file
51
docs/djlint/formatter.rst
Normal file
|
|
@ -0,0 +1,51 @@
|
|||
Formatter
|
||||
=========
|
||||
|
||||
djLint's formatter will take sloppy html templates and make it look pretty nice!
|
||||
|
||||
For an example of what the output will be, check out the `/tests/` folder to see over 300 **formatted** templates from the top django and flask projects.
|
||||
|
||||
Before
|
||||
------
|
||||
.. code :: html
|
||||
|
||||
{% load admin_list %} {% load i18n %}
|
||||
<p class="paginator">
|
||||
{% if pagination_required %}
|
||||
{% for i in page_range %} {% paginator_number cl i %}
|
||||
{% endfor %} {% endif %}
|
||||
{{ cl.result_count }}
|
||||
{% if cl.result_count == 1 %}{{ cl.opts.verbose_name }} {% else %}
|
||||
{{ cl.opts.verbose_name_plural }} {% endif %}
|
||||
{% if show_all_url %} <a href="{{ show_all_url }}" class="showall">{% translate 'Show all' %}
|
||||
</a>
|
||||
{% endif %}{% if cl.formset and cl.result_count %}<input type="submit" name="_save" class="default" value="{% translate 'Save' %}">{% endif %}
|
||||
</p>
|
||||
|
||||
After
|
||||
-----
|
||||
.. code :: html
|
||||
|
||||
{% load admin_list %}
|
||||
{% load i18n %}
|
||||
<p class="paginator">
|
||||
{% if pagination_required %}
|
||||
{% for i in page_range %}
|
||||
{% paginator_number cl i %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{{ cl.result_count }}
|
||||
{% if cl.result_count == 1 %}
|
||||
{{ cl.opts.verbose_name }}
|
||||
{% else %}
|
||||
{{ cl.opts.verbose_name_plural }}
|
||||
{% endif %}
|
||||
{% if show_all_url %}
|
||||
<a href="{{ show_all_url }}" class="showall">
|
||||
{% translate 'Show all' %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if cl.formset and cl.result_count %}
|
||||
<input type="submit" name="_save" class="default" value="{% translate 'Save' %}">
|
||||
{% endif %}
|
||||
</p>
|
||||
60
docs/djlint/rules.rst
Normal file
60
docs/djlint/rules.rst
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
Linter Rules
|
||||
============
|
||||
|
||||
Error Codes
|
||||
~~~~~~~~~~~
|
||||
|
||||
+--------+----------------------------------------------------------------------+
|
||||
| Code | Meaning |
|
||||
+========+======================================================================+
|
||||
| E001 | Variables should be wrapped in a single whitespace. Ex: {{ this }} |
|
||||
+--------+----------------------------------------------------------------------+
|
||||
| E002 | Double quotes should be used in tags. Ex {% extends "this.html" %} |
|
||||
+--------+----------------------------------------------------------------------+
|
||||
|
||||
Warning Codes
|
||||
~~~~~~~~~~~~~
|
||||
|
||||
+--------+----------------------------------------------------------------+
|
||||
| Code | Meaning |
|
||||
+========+================================================================+
|
||||
| W003 | Endblock should have name. Ex: {% endblock body %}. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W004 | Status urls should follow {% static path/to/file %} pattern. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W005 | Html tag should have lang attribute. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W006 | Img tag should have alt, height and width attributes. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W007 | <!DOCTYPE ... > should be present before the html tag. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W008 | Attributes should be double quoted. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W009 | Tag names should be lowercase. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W010 | Attribute names should be lowercase. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W011 | Attirbute values should be quoted. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W012 | There should be no spaces around attribute =. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W013 | Line is longer than 120 chars. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W014 | More than 2 blank lines. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W015 | Follow h tags with a blank line. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W016 | Missging title tag in html. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
| W017 | Tag should be self closing. |
|
||||
+--------+----------------------------------------------------------------+
|
||||
|
||||
Adding Rules
|
||||
------------
|
||||
|
||||
A good rule consists of
|
||||
|
||||
- Name
|
||||
- Code - Codes beginning with "E" signify error, and "W" warning.
|
||||
- Message - Message to display when error is found.
|
||||
- Patterns - regex expressions that will find the error.
|
||||
54
docs/djlint/usage.rst
Normal file
54
docs/djlint/usage.rst
Normal file
|
|
@ -0,0 +1,54 @@
|
|||
Getting Started
|
||||
================
|
||||
|
||||
Installation from `Pypi <https://pypi.org/project/djlint/>`__
|
||||
--------------------------------------------------------------
|
||||
|
||||
.. code:: sh
|
||||
|
||||
pip install djlint
|
||||
|
||||
Linter Usage
|
||||
------------
|
||||
|
||||
.. code:: sh
|
||||
|
||||
djlint src # file or path
|
||||
|
||||
# with custom extensions
|
||||
djlint src -e html.dj
|
||||
|
||||
Reformatter Usage
|
||||
-----------------
|
||||
|
||||
Reforamtting is a beta product. Check the output before applying changes.
|
||||
|
||||
Reformatting does not work with long json/html embedded into attribute data.
|
||||
|
||||
To check what may change in formatting run:
|
||||
|
||||
.. code:: sh
|
||||
|
||||
djlint src --check
|
||||
|
||||
To reformat run:
|
||||
|
||||
.. code:: sh
|
||||
|
||||
djlint src --reformat
|
||||
|
||||
CLI Args
|
||||
-------------
|
||||
|
||||
.. code:: sh
|
||||
|
||||
Usage: djlint [OPTIONS] SRC ...
|
||||
|
||||
Djlint django template files.
|
||||
|
||||
Options:
|
||||
-e, --extension TEXT File extension to lint [default: html]
|
||||
--reformat Reformat the file(s).
|
||||
--check Check formatting on the file(s).
|
||||
--quiet Do not print diff when reformatting.
|
||||
-h, --help Show this message and exit.
|
||||
|
|
@ -1,12 +1,17 @@
|
|||
.. djlint documentation master file, created by
|
||||
sphinx-quickstart on Tue Jul 27 15:28:35 2021.
|
||||
|
||||
Django Template Formatter
|
||||
=========================
|
||||
Html Template Linter and Formatter
|
||||
==================================
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
:caption: Contents:
|
||||
:hidden:
|
||||
:glob:
|
||||
:maxdepth: 1
|
||||
:titlesonly:
|
||||
|
||||
Welcome<self>
|
||||
djlint/*
|
||||
|
||||
.. toctree::
|
||||
:hidden:
|
||||
|
|
@ -15,5 +20,48 @@ Django Template Formatter
|
|||
PyPI ↪ <https://pypi.org/project/djlint/>
|
||||
|
||||
|
||||
.. include:: ../readme.rst
|
||||
:start-line: 1
|
||||
Simple html template linter and reformatter to find common formatting issues with and *reformat* django html templates
|
||||
|
||||
Ps, ``--check`` it out on Jinja and Handlebar templates as well!
|
||||
|
||||
|codecov| |test| |Codacy Badge| |Maintainability|
|
||||
|
||||
.. note:: djLint is not an html parser or syntax validator.
|
||||
|
||||
Show your format
|
||||
----------------
|
||||
|
||||
Add a badge to your projects `readme.md`:
|
||||
|
||||
.. code-block:: md
|
||||
|
||||
[](https://github.com/Riverside-Healthcare/djlint)
|
||||
|
||||
|
||||
Add a badge to your `readme.rst`:
|
||||
|
||||
.. code-block:: rst
|
||||
|
||||
.. image:: https://img.shields.io/badge/html%20style-djlint-blue.svg
|
||||
:target: https://github.com/Riverside-Healthcare/djlint
|
||||
|
||||
|
||||
Looks like this:
|
||||
|
||||
.. image:: https://img.shields.io/badge/html%20style-djlint-blue.svg
|
||||
:target: https://github.com/Riverside-Healthcare/djlint
|
||||
|
||||
|
||||
Contributing - Please Help!
|
||||
---------------------------
|
||||
|
||||
Checkout the `issue <https://github.com/Riverside-Healthcare/djlint/issues>`_ list and help where you can!
|
||||
|
||||
.. |codecov| image:: https://codecov.io/gh/Riverside-Healthcare/djlint/branch/master/graph/badge.svg?token=eNTG721BAA
|
||||
:target: https://codecov.io/gh/Riverside-Healthcare/djlint
|
||||
.. |test| image:: https://github.com/Riverside-Healthcare/djlint/actions/workflows/test.yml/badge.svg
|
||||
:target: https://github.com/Riverside-Healthcare/djlint/actions/workflows/test.yml
|
||||
.. |Codacy Badge| image:: https://app.codacy.com/project/badge/Grade/dba6338b0e7a4de896b45b382574f369
|
||||
:target: https://www.codacy.com/gh/Riverside-Healthcare/djlint/dashboard?utm_source=github.com&utm_medium=referral&utm_content=Riverside-Healthcare/djlint&utm_campaign=Badge_Grade
|
||||
.. |Maintainability| image:: https://api.codeclimate.com/v1/badges/5febe4111a36c7e0d2ed/maintainability
|
||||
:target: https://codeclimate.com/github/Riverside-Healthcare/djlint/maintainability
|
||||
|
|
|
|||
|
|
@ -22,4 +22,4 @@ quiet = true
|
|||
|
||||
|
||||
[tool.pylint.messages_control]
|
||||
disable = "E1120, R0914, E0401, R0912"
|
||||
disable = "E1120, R0914, E0401, R0912, R0916"
|
||||
|
|
|
|||
11
setup.py
11
setup.py
|
|
@ -12,7 +12,7 @@ __version__ = "0.1.1"
|
|||
def long_description():
|
||||
"""Build long description from readme and changelog."""
|
||||
return (
|
||||
(project_path / "README.md").read_text(encoding="utf8")
|
||||
(project_path / "README.rst").read_text(encoding="utf8")
|
||||
+ "\n\n"
|
||||
+ (project_path / "CHANGELOG.md").read_text(encoding="utf8")
|
||||
)
|
||||
|
|
@ -31,7 +31,7 @@ setup(
|
|||
author_email="cpickering@rhc.net",
|
||||
description="Django Template Linter",
|
||||
long_description=long_description(),
|
||||
long_description_content_type="text/markdown",
|
||||
long_description_content_type="text/rst",
|
||||
url="https://github.com/Riverside-Healthcare/djlint",
|
||||
include_package_data=True,
|
||||
package_data={"djlint": ["rules.yaml"]},
|
||||
|
|
@ -43,7 +43,12 @@ setup(
|
|||
package_dir={"": "src"},
|
||||
packages=find_packages(where="src"),
|
||||
python_requires=">=3.6",
|
||||
install_requires=["click>=7.1.2", "pyyaml>=5.4.1", "colorama>=0.4.3"],
|
||||
install_requires=[
|
||||
"click>=7.1.2",
|
||||
"pyyaml>=5.4.1",
|
||||
"colorama>=0.4.3",
|
||||
"regex>=2020.11.13",
|
||||
],
|
||||
test_suite="tests.test_djlint",
|
||||
entry_points={
|
||||
"console_scripts": [
|
||||
|
|
|
|||
|
|
@ -4,10 +4,11 @@ Check Django template syntax.
|
|||
|
||||
usage::
|
||||
|
||||
djlint INPUT -e <extension>
|
||||
djlint src
|
||||
|
||||
options:
|
||||
|
||||
-e or --extension | <extension>
|
||||
--check | will check html formatting for needed changes
|
||||
--reformat | will reformat html
|
||||
|
||||
|
|
@ -24,9 +25,9 @@ import click
|
|||
from click import echo
|
||||
from colorama import Fore, Style, deinit, init
|
||||
|
||||
from djlint.lint import lint_file
|
||||
from djlint.reformat import reformat_file
|
||||
from djlint.settings import ignored_paths
|
||||
from .lint import lint_file
|
||||
from .reformat import reformat_file
|
||||
from .settings import ignored_paths
|
||||
|
||||
|
||||
def get_src(src: Path, extension=None):
|
||||
|
|
@ -149,17 +150,17 @@ def build_quantity_tense(size: int):
|
|||
@click.option(
|
||||
"--reformat",
|
||||
is_flag=True,
|
||||
help="Reformat the file.",
|
||||
help="Reformat the file(s).",
|
||||
)
|
||||
@click.option(
|
||||
"--check",
|
||||
is_flag=True,
|
||||
help="Reformat the file.",
|
||||
help="Check formatting on the file(s).",
|
||||
)
|
||||
@click.option(
|
||||
"--quiet",
|
||||
is_flag=True,
|
||||
help="Reformat the file.",
|
||||
help="Do not print diff when reformatting.",
|
||||
)
|
||||
def main(src: str, extension: str, reformat: bool, check: bool, quiet: bool):
|
||||
"""Djlint django template files."""
|
||||
|
|
@ -192,7 +193,7 @@ def main(src: str, extension: str, reformat: bool, check: bool, quiet: bool):
|
|||
worker_count = min(worker_count, 60)
|
||||
|
||||
with ProcessPoolExecutor(max_workers=worker_count) as exe:
|
||||
if reformat is True:
|
||||
if reformat is True or check is True:
|
||||
func = partial(reformat_file, check)
|
||||
file_errors = exe.map(func, file_list)
|
||||
else:
|
||||
|
|
@ -202,16 +203,8 @@ def main(src: str, extension: str, reformat: bool, check: bool, quiet: bool):
|
|||
success_message = ""
|
||||
error_count = 0
|
||||
|
||||
if reformat is not True:
|
||||
for error in file_errors:
|
||||
error_count += build_output(error)
|
||||
|
||||
success_message = "%sed %s, found %d errors." % (
|
||||
message,
|
||||
file_quantity,
|
||||
error_count,
|
||||
)
|
||||
else:
|
||||
if reformat is True or check is True:
|
||||
# reformat message
|
||||
for error in file_errors:
|
||||
error_count += build_check_output(error, quiet)
|
||||
tense_message = (
|
||||
|
|
@ -221,6 +214,17 @@ def main(src: str, extension: str, reformat: bool, check: bool, quiet: bool):
|
|||
)
|
||||
success_message = "%s updated." % tense_message
|
||||
|
||||
else:
|
||||
# lint message
|
||||
for error in file_errors:
|
||||
error_count += build_output(error)
|
||||
|
||||
success_message = "%sed %s, found %d errors." % (
|
||||
message,
|
||||
file_quantity,
|
||||
error_count,
|
||||
)
|
||||
|
||||
echo("\n%s\n" % (success_message))
|
||||
|
||||
|
||||
|
|
|
|||
1
src/djlint/formatter/__init__.py
Normal file
1
src/djlint/formatter/__init__.py
Normal file
|
|
@ -0,0 +1 @@
|
|||
# flake8:noqa
|
||||
116
src/djlint/formatter/compress_html.py
Normal file
116
src/djlint/formatter/compress_html.py
Normal file
|
|
@ -0,0 +1,116 @@
|
|||
"""djLint Attempt to logically shrink html."""
|
||||
import regex as re
|
||||
|
||||
from ..settings import (
|
||||
ignored_inline_blocks,
|
||||
ignored_tag_closing,
|
||||
ignored_tag_opening,
|
||||
single_line_html_tags,
|
||||
single_line_template_tags,
|
||||
start_template_tags,
|
||||
tag_raw_flat_closing,
|
||||
tag_raw_flat_opening,
|
||||
)
|
||||
|
||||
|
||||
def _clean_line(line):
|
||||
"""Clean up a line of html.
|
||||
|
||||
* remove duplicate spaces
|
||||
* remove trailing spaces
|
||||
|
||||
"""
|
||||
return re.sub(r" {2,}", " ", line.strip())
|
||||
|
||||
|
||||
def _strip_html_whitespace(html):
|
||||
"""Remove unnecessary whitespace from text."""
|
||||
rawcode_flat = ""
|
||||
is_block_ignored = False
|
||||
is_block_raw = False
|
||||
|
||||
for item in html.strip().splitlines():
|
||||
|
||||
# start of ignored block
|
||||
is_block_raw = bool(re.search(tag_raw_flat_opening, item, re.IGNORECASE))
|
||||
|
||||
# find ignored blocks and retain indentation, otherwise strip white space
|
||||
if re.findall(
|
||||
r"(?:%s)" % "|".join(ignored_inline_blocks), item, flags=re.IGNORECASE
|
||||
):
|
||||
tmp = _clean_line(item)
|
||||
|
||||
elif (
|
||||
re.search(ignored_tag_closing, item, re.IGNORECASE)
|
||||
and is_block_raw is False
|
||||
):
|
||||
tmp = _clean_line(item)
|
||||
is_block_ignored = False
|
||||
|
||||
elif (
|
||||
re.search(ignored_tag_opening, item, re.IGNORECASE)
|
||||
and is_block_raw is False
|
||||
):
|
||||
tmp = _clean_line(item)
|
||||
is_block_ignored = True
|
||||
|
||||
elif is_block_raw or is_block_ignored:
|
||||
tmp = item
|
||||
|
||||
else:
|
||||
tmp = _clean_line(item)
|
||||
|
||||
# end of ignore raw code
|
||||
is_block_raw = not bool(re.search(tag_raw_flat_closing, item, re.IGNORECASE))
|
||||
|
||||
rawcode_flat = rawcode_flat + tmp + "\n"
|
||||
|
||||
return rawcode_flat
|
||||
|
||||
|
||||
def compress_html(html):
|
||||
"""Compress back tags that do not need to be expanded."""
|
||||
# put empty tags on one line
|
||||
html = re.sub(
|
||||
r"(<([\w]+)[^>]*>)\s+?(<\/\2>)",
|
||||
r"\1\3",
|
||||
html,
|
||||
flags=re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
|
||||
# put empty template tags on one line
|
||||
html = re.sub(
|
||||
r"(" + start_template_tags + r")\s+?(\{\% end[^}]*?\%\})",
|
||||
r"\1\2",
|
||||
html,
|
||||
re.MULTILINE,
|
||||
)
|
||||
|
||||
# put short single line tags on one line
|
||||
slt_html = "|".join(single_line_html_tags)
|
||||
html = re.sub(
|
||||
r"(<(%s)>)\s*([^<\n]{,80})\s*?(</(\2)>)" % slt_html,
|
||||
r"\1\3\4",
|
||||
html,
|
||||
re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
html = re.sub(
|
||||
r"(<(%s) [^\n]{,30}>)\s*([^<\n]{,50})\s*?(</(\2)>)" % slt_html,
|
||||
r"\1\3\4",
|
||||
html,
|
||||
re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
|
||||
slt_template = "|".join(single_line_template_tags)
|
||||
html = re.sub(
|
||||
r"({% +?("
|
||||
+ slt_template
|
||||
+ r") +?[^\n]{,30}%})\s*([^%\n]{,50})\s*?({% +?end(\2) +?%})",
|
||||
r"\1\3\4",
|
||||
html,
|
||||
re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
|
||||
html = _strip_html_whitespace(html)
|
||||
|
||||
return html
|
||||
201
src/djlint/formatter/expand_html.py
Normal file
201
src/djlint/formatter/expand_html.py
Normal file
|
|
@ -0,0 +1,201 @@
|
|||
"""djLint expand out html code."""
|
||||
from functools import partial
|
||||
|
||||
import regex as re
|
||||
|
||||
from ..settings import (
|
||||
break_html_tags,
|
||||
break_template_tags,
|
||||
ignored_attributes,
|
||||
ignored_blocks,
|
||||
tag_pattern,
|
||||
)
|
||||
|
||||
|
||||
def _flatten_attributes(match):
|
||||
"""Flatten multiline attributes back to one line.
|
||||
|
||||
Skip when attribute is ignored.
|
||||
Attribute name can be in group one or group 2.
|
||||
for now, skipping if they are anywhere
|
||||
"""
|
||||
for attribute in ignored_attributes:
|
||||
if attribute in match.group():
|
||||
return match.group()
|
||||
|
||||
return "{} {}{}".format(
|
||||
match.group(1),
|
||||
" ".join(match.group(2).strip().splitlines()),
|
||||
match.group(3),
|
||||
)
|
||||
|
||||
|
||||
def _should_ignore(html, match):
|
||||
"""Do not add whitespace if the tag is in a non indent block."""
|
||||
for block in ignored_blocks:
|
||||
return any(
|
||||
ignored_match.start() < match.start(1)
|
||||
and ignored_match.end() > match.end(1)
|
||||
for ignored_match in re.finditer(
|
||||
block % re.escape(match.group(1)), html, re.DOTALL | re.IGNORECASE
|
||||
)
|
||||
)
|
||||
|
||||
return False
|
||||
|
||||
|
||||
def expand_html(html):
|
||||
"""Split single line html into many lines based on tags."""
|
||||
|
||||
def add_html_line(out_format, match):
|
||||
"""Add whitespace.
|
||||
|
||||
Do not add whitespace if the tag is in a non indent block.
|
||||
"""
|
||||
if _should_ignore(html, match):
|
||||
return match.group(1)
|
||||
|
||||
return out_format % match.group(1)
|
||||
|
||||
# put attributes on one line
|
||||
html = re.sub(
|
||||
tag_pattern,
|
||||
_flatten_attributes,
|
||||
html,
|
||||
flags=re.IGNORECASE | re.DOTALL | re.MULTILINE,
|
||||
)
|
||||
|
||||
html_tags = "|".join(break_html_tags)
|
||||
|
||||
# process opening tags ############
|
||||
|
||||
# the tag either closes <div>
|
||||
# self closes <img />
|
||||
# has attributes <div text>
|
||||
# or has attributes and self closes <img text/>
|
||||
|
||||
add_left = partial(add_html_line, "\n%s")
|
||||
add_right = partial(add_html_line, "%s\n")
|
||||
|
||||
break_char = r"(?<!\n *?)"
|
||||
|
||||
html = re.sub(
|
||||
r"%s\K(<(?:%s)>)"
|
||||
% (
|
||||
break_char,
|
||||
html_tags,
|
||||
),
|
||||
add_left,
|
||||
html,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
html = re.sub(
|
||||
r"(<(?:%s)>)(?=[^\n])" % html_tags, add_right, html, flags=re.IGNORECASE
|
||||
)
|
||||
|
||||
html = re.sub(
|
||||
r"%s\K(<(?:%s) ?/>)"
|
||||
% (
|
||||
break_char,
|
||||
html_tags,
|
||||
),
|
||||
add_left,
|
||||
html,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
html = re.sub(
|
||||
r"(<(?:%s) ?/>)(?=[^\n])" % html_tags, add_right, html, flags=re.IGNORECASE
|
||||
)
|
||||
|
||||
html = re.sub(
|
||||
r"%s\K(<(?:%s) [^>]*?[^/]>)"
|
||||
% (
|
||||
break_char,
|
||||
html_tags,
|
||||
),
|
||||
add_left,
|
||||
html,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
html = re.sub(
|
||||
r"(<(?:%s) [^>]*?[^/]>)(?=[^\n])" % html_tags,
|
||||
add_right,
|
||||
html,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
|
||||
html = re.sub(
|
||||
r"%s\K(<(?:%s) [^>]+?/>)"
|
||||
% (
|
||||
break_char,
|
||||
html_tags,
|
||||
),
|
||||
add_left,
|
||||
html,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
html = re.sub(
|
||||
r"(<(?:%s) [^>]+?/>)(?=[^\n])" % html_tags, add_right, html, flags=re.IGNORECASE
|
||||
)
|
||||
|
||||
# process closing (break_char, html_tags,)s ######
|
||||
|
||||
html = re.sub(
|
||||
r"%s\K(</(?:%s)>)"
|
||||
% (
|
||||
break_char,
|
||||
html_tags,
|
||||
),
|
||||
add_left,
|
||||
html,
|
||||
flags=re.IGNORECASE,
|
||||
)
|
||||
html = re.sub(
|
||||
r"(</(?:%s)>)(?=[^\n])" % html_tags, add_right, html, flags=re.IGNORECASE
|
||||
)
|
||||
|
||||
# template tag breaks
|
||||
|
||||
def should_i_move_template_tag(out_format, match):
|
||||
# ensure template tag is not inside an html tag
|
||||
html_tags = "|".join(break_html_tags)
|
||||
|
||||
if _should_ignore(html, match):
|
||||
return match.group(1)
|
||||
|
||||
if not re.findall(
|
||||
r"\<(?:"
|
||||
+ html_tags
|
||||
+ r") .*? ?\w+=[\"][^\"]*?"
|
||||
+ re.escape(match.group(1))
|
||||
+ "$",
|
||||
html[: match.end()],
|
||||
re.MULTILINE,
|
||||
):
|
||||
|
||||
return out_format % match.group(1)
|
||||
|
||||
return match.group(1)
|
||||
|
||||
for tag in break_template_tags:
|
||||
# find all matching tags
|
||||
|
||||
html = re.sub(
|
||||
r"%s\K(%s)"
|
||||
% (
|
||||
break_char,
|
||||
tag,
|
||||
),
|
||||
partial(should_i_move_template_tag, "\n%s"),
|
||||
html,
|
||||
re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
|
||||
html = re.sub(
|
||||
r"(%s)(?=[^\n])" % tag,
|
||||
partial(should_i_move_template_tag, "%s\n"),
|
||||
html,
|
||||
re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
|
||||
return html
|
||||
163
src/djlint/formatter/indent_html.py
Normal file
163
src/djlint/formatter/indent_html.py
Normal file
|
|
@ -0,0 +1,163 @@
|
|||
"""djLint add indentation to html."""
|
||||
import regex as re
|
||||
|
||||
from ..settings import (
|
||||
always_single_line_html_tags,
|
||||
attribute_pattern,
|
||||
break_html_tags,
|
||||
format_long_attributes,
|
||||
ignored_inline_blocks,
|
||||
ignored_tag_closing,
|
||||
ignored_tag_opening,
|
||||
indent,
|
||||
max_line_length,
|
||||
reduce_extralines_gt,
|
||||
single_line_template_tags,
|
||||
tag_indent,
|
||||
tag_raw_flat_closing,
|
||||
tag_raw_flat_opening,
|
||||
tag_unindent,
|
||||
tag_unindent_line,
|
||||
)
|
||||
|
||||
|
||||
def _format_attributes(match):
|
||||
"""Spread long attributes over multiple lines."""
|
||||
leading_space = match.group(1)
|
||||
|
||||
tag = match.group(2)
|
||||
|
||||
spacing = "\n" + leading_space + len(tag) * " "
|
||||
|
||||
attributes = (spacing).join(re.findall(attribute_pattern, match.group(3).strip()))
|
||||
|
||||
close = match.group(4)
|
||||
|
||||
return "{}{}{}{}".format(
|
||||
leading_space,
|
||||
tag,
|
||||
attributes,
|
||||
close,
|
||||
)
|
||||
|
||||
|
||||
def indent_html(rawcode):
|
||||
"""Indent raw code."""
|
||||
rawcode_flat_list = re.split("\n", rawcode)
|
||||
|
||||
beautified_code = ""
|
||||
indent_level = 0
|
||||
is_block_raw = False
|
||||
blank_counter = 0
|
||||
|
||||
slt_html = "|".join(
|
||||
break_html_tags
|
||||
) # here using all tags cause we allow empty tags on one line
|
||||
always_slt_html = "|".join(
|
||||
always_single_line_html_tags
|
||||
) # here using all tags cause we allow empty tags on one line
|
||||
slt_template = "|".join(single_line_template_tags)
|
||||
|
||||
for item in rawcode_flat_list:
|
||||
# if a raw tag then start ignoring
|
||||
if (
|
||||
tag_raw_flat_opening
|
||||
and re.search(tag_raw_flat_opening, item, re.IGNORECASE)
|
||||
) or re.search(tag_raw_flat_opening, item, re.IGNORECASE):
|
||||
is_block_raw = True
|
||||
if re.findall(
|
||||
r"(?:%s)" % "|".join(ignored_inline_blocks), item, flags=re.IGNORECASE
|
||||
):
|
||||
tmp = (indent * indent_level) + item + "\n"
|
||||
|
||||
# if a one-line, inline tag, just process it, only if line starts w/ it
|
||||
elif (
|
||||
re.findall(r"(<(%s)>)(.*?)(</(\2)>)" % slt_html, item, re.IGNORECASE)
|
||||
or re.findall(r"(<(%s) .+?>)(.*?)(</(\2)>)" % slt_html, item, re.IGNORECASE)
|
||||
or re.findall(
|
||||
r"({% +?(" + slt_template + r") +?.+?%})(.*?)({% +?end(\2) +?%})",
|
||||
item,
|
||||
re.IGNORECASE,
|
||||
)
|
||||
or re.findall(r"(<(%s) .*?/>)" % slt_html, item, flags=re.IGNORECASE)
|
||||
or re.findall(
|
||||
r"(<(%s) .*?/?>)" % always_slt_html, item, flags=re.IGNORECASE
|
||||
)
|
||||
) and is_block_raw is False:
|
||||
|
||||
tmp = (indent * indent_level) + item + "\n"
|
||||
blank_counter = 0
|
||||
|
||||
# if unindent, move left
|
||||
elif (
|
||||
re.search(r"^(?:" + tag_unindent + r")", item, re.IGNORECASE | re.MULTILINE)
|
||||
and is_block_raw is False
|
||||
or re.search(ignored_tag_closing, item, re.IGNORECASE)
|
||||
):
|
||||
indent_level = indent_level - 1
|
||||
tmp = (indent * indent_level) + item + "\n"
|
||||
blank_counter = 0
|
||||
|
||||
elif (
|
||||
re.search(r"^" + tag_unindent_line, item, re.IGNORECASE | re.MULTILINE)
|
||||
and is_block_raw is False
|
||||
):
|
||||
tmp = (indent * (indent_level - 1)) + item + "\n"
|
||||
blank_counter = 0
|
||||
|
||||
# if indent, move right
|
||||
elif (
|
||||
re.search(r"^(?:" + tag_indent + r")", item, re.IGNORECASE | re.MULTILINE)
|
||||
and is_block_raw is False
|
||||
):
|
||||
tmp = (indent * indent_level) + item + "\n"
|
||||
indent_level = indent_level + 1
|
||||
blank_counter = 0
|
||||
|
||||
elif is_block_raw is True:
|
||||
tmp = item + "\n"
|
||||
|
||||
# if just a blank line
|
||||
elif item.strip() == "" and (
|
||||
blank_counter < int(reduce_extralines_gt) or blank_counter + 1
|
||||
):
|
||||
tmp = item.strip()
|
||||
|
||||
# otherwise, just leave same level
|
||||
else:
|
||||
tmp = (indent * indent_level) + item + "\n"
|
||||
|
||||
# we can try to fix django tags
|
||||
tmp = re.sub(r"({[{|%])(\w[^}].+?)([}|%]})", r"\1 \2\3", tmp)
|
||||
tmp = re.sub(r"({[{|%])([^}].+?[^ ])([}|%]})", r"\1\2 \3", tmp)
|
||||
|
||||
# handlebars templates
|
||||
tmp = re.sub(r"({{#(?:each|if).+?[^ ])(}})", r"\1 \2", tmp)
|
||||
|
||||
# if a opening raw tag then start ignoring.. only if there is no closing tag
|
||||
# on the same line
|
||||
if (
|
||||
tag_raw_flat_closing
|
||||
and re.search(tag_raw_flat_opening, item, re.IGNORECASE)
|
||||
) or re.search(ignored_tag_opening, item, re.IGNORECASE):
|
||||
is_block_raw = True
|
||||
|
||||
# if a normal tag, we can try to expand attributes
|
||||
elif (
|
||||
format_long_attributes
|
||||
and is_block_raw is False
|
||||
and len(tmp) > max_line_length
|
||||
):
|
||||
# get leading space, and attributes
|
||||
tmp = re.sub(r"(\s*?)(<\w+\s)([^>]+?)(/?>)", _format_attributes, tmp)
|
||||
|
||||
# turn off raw block if we hit end - for one line raw blocks
|
||||
if (
|
||||
tag_raw_flat_closing
|
||||
and re.search(tag_raw_flat_closing, item, re.IGNORECASE)
|
||||
) or re.search(ignored_tag_closing, item, re.IGNORECASE):
|
||||
is_block_raw = False
|
||||
|
||||
beautified_code = beautified_code + tmp
|
||||
|
||||
return beautified_code.strip() + "\n"
|
||||
|
|
@ -4,246 +4,43 @@ Much code is borrowed from https://github.com/rareyman/HTMLBeautify, many thanks
|
|||
"""
|
||||
|
||||
import difflib
|
||||
import re
|
||||
from pathlib import Path
|
||||
|
||||
from djlint.settings import (
|
||||
attribute_pattern,
|
||||
format_long_attributes,
|
||||
ignored_tag_closing,
|
||||
ignored_tag_opening,
|
||||
indent,
|
||||
max_line_length,
|
||||
reduce_extralines_gt,
|
||||
tag_indent,
|
||||
tag_newline_after,
|
||||
tag_newline_before,
|
||||
tag_pattern,
|
||||
tag_pos_inline,
|
||||
tag_raw_flat_closing,
|
||||
tag_raw_flat_opening,
|
||||
tag_unindent,
|
||||
tag_unindent_line,
|
||||
)
|
||||
|
||||
|
||||
def clean_line(line):
|
||||
"""Clean up a line of html.
|
||||
|
||||
* remove duplicate spaces
|
||||
* remove trailing spaces
|
||||
|
||||
"""
|
||||
return re.sub(r" {2,}", " ", line.strip())
|
||||
|
||||
|
||||
def flatten_attributes(match):
|
||||
"""Flatten multiline attributes back to one line."""
|
||||
return "{} {}{}".format(
|
||||
match.group(1),
|
||||
" ".join(match.group(2).strip().splitlines()),
|
||||
match.group(3),
|
||||
)
|
||||
|
||||
|
||||
def format_attributes(match):
|
||||
"""Spread long attributes over multiple lines."""
|
||||
leading_space = match.group(1)
|
||||
|
||||
tag = match.group(2)
|
||||
|
||||
attributes = "{}{}".format(
|
||||
("\n" + leading_space + indent),
|
||||
("\n" + leading_space + indent).join(
|
||||
re.findall(attribute_pattern, match.group(3).strip())
|
||||
),
|
||||
)
|
||||
|
||||
close = match.group(4)
|
||||
|
||||
return "{}{}{}{}".format(
|
||||
leading_space,
|
||||
tag,
|
||||
attributes,
|
||||
close,
|
||||
)
|
||||
|
||||
|
||||
def add_newlines(match):
|
||||
"""Only add newlines of the match is not in our acceptable one line pattern."""
|
||||
g_one = match.group(1)
|
||||
g_two = match.group(2)
|
||||
|
||||
if not re.search(tag_pos_inline, g_one + g_two, flags=re.IGNORECASE | re.MULTILINE):
|
||||
return g_one + "\n" + g_two
|
||||
|
||||
return g_one + g_two
|
||||
|
||||
|
||||
def remove_indentation(rawcode):
|
||||
"""Remove indentation from raw code."""
|
||||
rawcode_flat = ""
|
||||
is_block_ignored = False
|
||||
is_block_raw = False
|
||||
|
||||
for item in rawcode.strip().splitlines():
|
||||
|
||||
# ignore raw code
|
||||
if re.search(tag_raw_flat_closing, item, re.IGNORECASE):
|
||||
is_block_raw = False
|
||||
|
||||
elif re.search(tag_raw_flat_opening, item, re.IGNORECASE):
|
||||
is_block_raw = True
|
||||
|
||||
# find ignored blocks and retain indentation, otherwise strip white space
|
||||
if re.search(ignored_tag_closing, item, re.IGNORECASE):
|
||||
tmp = clean_line(item)
|
||||
is_block_ignored = False
|
||||
|
||||
elif re.search(ignored_tag_opening, item, re.IGNORECASE):
|
||||
tmp = clean_line(item)
|
||||
is_block_ignored = True
|
||||
|
||||
# not filtered so just output it
|
||||
elif is_block_raw:
|
||||
# remove tabs from raw_flat content
|
||||
tmp = re.sub(indent, "", item)
|
||||
|
||||
elif is_block_ignored:
|
||||
tmp = item
|
||||
|
||||
else:
|
||||
tmp = clean_line(item) # item.strip()
|
||||
|
||||
# add missing line breaks before tag
|
||||
tmp = re.sub(
|
||||
tag_newline_before,
|
||||
add_newlines,
|
||||
tmp,
|
||||
flags=re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
|
||||
# add missing line breaks after tag
|
||||
tmp = re.sub(
|
||||
tag_newline_after, add_newlines, tmp, flags=re.IGNORECASE | re.MULTILINE
|
||||
)
|
||||
|
||||
rawcode_flat = rawcode_flat + tmp + "\n"
|
||||
|
||||
# put attributes back on one line
|
||||
rawcode_flat = re.sub(
|
||||
tag_pattern,
|
||||
flatten_attributes,
|
||||
rawcode_flat,
|
||||
flags=re.IGNORECASE | re.DOTALL | re.MULTILINE,
|
||||
)
|
||||
|
||||
# put empty tags on one line
|
||||
rawcode_flat = re.sub(
|
||||
r"(<([\w]+)[^>]*>)\n(<\/\2>)",
|
||||
r"\1\3",
|
||||
rawcode_flat,
|
||||
flags=re.IGNORECASE | re.MULTILINE,
|
||||
)
|
||||
|
||||
return rawcode_flat
|
||||
|
||||
|
||||
def add_indentation(rawcode):
|
||||
"""Indent raw code."""
|
||||
rawcode_flat_list = re.split("\n", rawcode)
|
||||
|
||||
beautified_code = ""
|
||||
indent_level = 0
|
||||
is_block_raw = False
|
||||
blank_counter = 0
|
||||
|
||||
for item in rawcode_flat_list:
|
||||
|
||||
# if a raw tag then start ignoring
|
||||
if (
|
||||
tag_raw_flat_closing
|
||||
and re.search(tag_raw_flat_closing, item, re.IGNORECASE)
|
||||
) or re.search(ignored_tag_closing, item, re.IGNORECASE):
|
||||
is_block_raw = False
|
||||
|
||||
# if a one-line, inline tag, just process it
|
||||
if re.search(tag_pos_inline, item, re.IGNORECASE) and is_block_raw is False:
|
||||
tmp = (indent * indent_level) + item
|
||||
blank_counter = 0
|
||||
|
||||
# if unindent, move left
|
||||
elif re.search(tag_unindent, item, re.IGNORECASE) and is_block_raw is False:
|
||||
indent_level = indent_level - 1
|
||||
tmp = (indent * indent_level) + item
|
||||
blank_counter = 0
|
||||
|
||||
elif (
|
||||
re.search(tag_unindent_line, item, re.IGNORECASE) and is_block_raw is False
|
||||
):
|
||||
tmp = (indent * (indent_level - 1)) + item
|
||||
blank_counter = 0
|
||||
|
||||
# if indent, move right
|
||||
elif re.search(tag_indent, item, re.IGNORECASE) and is_block_raw is False:
|
||||
tmp = (indent * indent_level) + item
|
||||
indent_level = indent_level + 1
|
||||
blank_counter = 0
|
||||
|
||||
elif is_block_raw is True:
|
||||
tmp = item
|
||||
|
||||
# if just a blank line
|
||||
elif item.strip() == "" and (
|
||||
blank_counter < int(reduce_extralines_gt) or blank_counter + 1
|
||||
):
|
||||
tmp = item.strip()
|
||||
|
||||
# otherwise, just leave same level
|
||||
else:
|
||||
tmp = (indent * indent_level) + item
|
||||
|
||||
# if not raw, we can try to fix django tags
|
||||
tmp = re.sub(r"({[{|%])(\w[^}].+?)([}|%]})", r"\1 \2\3", tmp)
|
||||
tmp = re.sub(r"({[{|%])([^}].+?[^ ])([}|%]})", r"\1\2 \3", tmp)
|
||||
|
||||
# handlebars templates
|
||||
tmp = re.sub(r"({{#(?:each|if).+?[^ ])(}})", r"\1 \2", tmp)
|
||||
|
||||
# if a opening raw tag then start ignoring.. only if there is no closing tag
|
||||
# on the same line
|
||||
if (
|
||||
tag_raw_flat_closing
|
||||
and re.search(tag_raw_flat_opening, item, re.IGNORECASE)
|
||||
) or re.search(ignored_tag_opening, item, re.IGNORECASE):
|
||||
is_block_raw = True
|
||||
|
||||
# if a normal tag, we can try to expand attributes
|
||||
elif (
|
||||
format_long_attributes
|
||||
and is_block_raw is False
|
||||
and len(tmp) > max_line_length
|
||||
):
|
||||
# get leading space, and attributes
|
||||
tmp = re.sub(r"(\s*?)(<\w+)(\s[^>]+?)(/?>)", format_attributes, tmp)
|
||||
|
||||
# turn off raw block if we hit end - for one line raw blocks
|
||||
if (
|
||||
tag_raw_flat_closing
|
||||
and re.search(tag_raw_flat_closing, item, re.IGNORECASE)
|
||||
) or re.search(ignored_tag_closing, item, re.IGNORECASE):
|
||||
is_block_raw = False
|
||||
|
||||
beautified_code = beautified_code + tmp + "\n"
|
||||
|
||||
return beautified_code.strip() + "\n"
|
||||
from .formatter.compress_html import compress_html
|
||||
from .formatter.expand_html import expand_html
|
||||
from .formatter.indent_html import indent_html
|
||||
|
||||
|
||||
def reformat_file(check: bool, this_file: Path):
|
||||
"""Reformat html file."""
|
||||
rawcode = this_file.read_text(encoding="utf8")
|
||||
|
||||
beautified_code = add_indentation(remove_indentation(rawcode))
|
||||
itteration = 0
|
||||
|
||||
beautified_code = rawcode
|
||||
|
||||
while itteration < 10:
|
||||
|
||||
expanded = expand_html(rawcode)
|
||||
compressed = compress_html(expanded)
|
||||
indented = indent_html(compressed)
|
||||
|
||||
if (
|
||||
len(
|
||||
list(
|
||||
difflib.unified_diff(
|
||||
beautified_code.splitlines(), indented.splitlines()
|
||||
)
|
||||
)
|
||||
)
|
||||
== 0
|
||||
):
|
||||
beautified_code = indented
|
||||
break
|
||||
|
||||
beautified_code = indented
|
||||
|
||||
itteration += 1
|
||||
|
||||
if check is not True:
|
||||
# update the file
|
||||
|
|
|
|||
|
|
@ -65,9 +65,9 @@
|
|||
- <(?:(?!\{[%|{|#])[^\n])*=\s
|
||||
- rule:
|
||||
name: W013
|
||||
message: Line is longer than 99 chars.
|
||||
message: Line is longer than 120 chars.
|
||||
patterns:
|
||||
- "[^\n]{99,}"
|
||||
- "[^\n]{120,}"
|
||||
- rule:
|
||||
name: W014
|
||||
message: More than 2 blank lines.
|
||||
|
|
|
|||
|
|
@ -5,20 +5,17 @@
|
|||
# default indentation
|
||||
indent = " "
|
||||
|
||||
break_html_tags = ["a", "abbr"]
|
||||
|
||||
|
||||
# indicates tags whose contents should not be formatted
|
||||
ignored_tag_opening = r"<script|<style|<!--|{\*|<\?php|<pre|<svg"
|
||||
ignored_tag_opening = r"<script|<style|<!--|{\*|<\?php|<pre|<svg|{#"
|
||||
|
||||
# indicates when to stop ignoring
|
||||
ignored_tag_closing = r"</script|</style|-->|\*}|\?>|</pre|</svg"
|
||||
|
||||
# the contents of these tag blocks will be start on a new line
|
||||
tag_newline_before = r"([^\n]+?)((?:(?:\{\{[\/|\#])|\{% +?(?:if|end|for|block|endblock|else|spaceless|compress|load|include|assets)|(?:<script)|(?:{% endverbatim %})|(?:{% verbatim %})|(?:</?(html|head|body|div|cache|a|nav|ul|ol|dl|li|table|thead|tbody|tr|th|td|blockquote|select|form|option|optgroup|fieldset|legend|label|header|main|section|aside|footer|figure|video|span|p|g|svg|button|img|source)[^>]*?>.*?)))"
|
||||
|
||||
# these tags should be followed by a newline
|
||||
tag_newline_after = r"((?:(?:\{\{[\/\#].*?\}\})|\{% +?(?:if|end|for|block|else|spaceless|compress|load|include)(?:.*?%}))|(?:{% endverbatim %})|(?:{% verbatim %})|(?:<html|<head|</head|<body|</body|</script|<div|</div|<cache|</cache|<nav|</nav|<ul|</ul|<ol|</ol|<dl|</dl|<li|</li|<table|</table|<thead|</thead|<tbody|</tbody|<tr|</tr|<th|</th|<td|</td|<blockquote|</blockquote|<select|</select|<form|</form|<option|</option|<optgroup|</optgroup|<fieldset|</fieldset|<legend|</legend|<label|</label|<header|</header|<main|</main|<section|</section|<aside|</aside|<footer|</footer|<figure|</figure|<video|</video|<source|</source|</span|<p|</p|<g|</g|<svg|</svg|</h\d|<img).*?\>)([^\n]+)"
|
||||
ignored_tag_closing = r"</script|</style|-->|\*}|\?>|</pre|</svg|#}"
|
||||
|
||||
# the contents of these tag blocks will be indented
|
||||
tag_indent = r"(?:\{\{\#)|\{% +?(if|for|block|else|spaceless|compress)|(?:{% verbatim %})|(?:<(?:html|head|body|div|a|nav|ul|ol|dl|li|table|thead|tbody|tr|th|td|blockquote|select|form|option|cache|optgroup|fieldset|legend|label|header|main|section|aside|footer|figure|video|span|p|g|svg|h\d|button|img|script|style|source))"
|
||||
tag_indent = r"(?:\{\{\#)|\{% +?(if|for|block|else|spaceless|compress|addto|language)|(?:{% verbatim %})|(?:<(?:html|head|body|div|a|nav|ul|ol|dl|li|table|thead|tbody|tr|th|td|blockquote|select|form|option|cache|optgroup|fieldset|legend|label|header|main|section|aside|footer|figure|video|span|p|g|svg|h\d|button|img|script|style|source))"
|
||||
|
||||
# this signals when tags should be unindented (see tags above)
|
||||
tag_unindent = r"(?:\{\{\/)|\{% end|(?:{% endverbatim %})|(?:</(?:html|head|body|div|a|nav|ul|ol|dl|li|table|thead|tbody|tr|th|td|blockquote|select|form|option|optgroup|fieldset|legend|label|header|cache|main|section|aside|footer|figure|video|span|p|g|svg|h\d|button|img|script|style|source))"
|
||||
|
|
@ -26,26 +23,198 @@ tag_unindent = r"(?:\{\{\/)|\{% end|(?:{% endverbatim %})|(?:</(?:html|head|body
|
|||
# these tags should be unindented and next line will be indented
|
||||
tag_unindent_line = r"(?:\{% el)|(?:\{\{ *?(?:else|\^) *?\}\})"
|
||||
|
||||
# these tags can sometimes be on one line
|
||||
tag_pos_inline = r"(?:<link.*/>|<link.*\">|<link.*>|<meta.*/>|<script.*</script>|<div[^>]*>[^<]*</div>|<a[^>]*>[^<]*</a>|<li[^>]*>[^<]*</li>|<dt[^>]*>[^<]*</dt>|<dd[^>]*>[^<]*</dd>|<th[^>]*>[^<]*</th>|<td[^>]*>[^<]*</td>|<legend[^>]*>[^<]*</legend>|<label[^>]*>[^<]*</label>|<option[^>]*>[^<]*</option>|<input.*/>|<input.*\">|<span[^>]*>[^<]*</span>|<p[^>]*>[^<]*</p>|<path.*/>|<!--.*-->|<button[^>]*>[^<]*</button>|<h\d[^>]*>[^<]*</h\d>|<img.*?/>)"
|
||||
|
||||
# these tags use raw code and should flatten to column 1
|
||||
# tabs will be removed inside these tags! use spaces for spacing if needed!
|
||||
# flatten starting with this tag...
|
||||
tag_raw_flat_opening = r""
|
||||
tag_raw_flat_opening = r"{#"
|
||||
|
||||
# ...stop flattening when you encounter this tag
|
||||
tag_raw_flat_closing = r""
|
||||
tag_raw_flat_closing = r"#}"
|
||||
|
||||
# reduce empty lines greater than x to 1 line
|
||||
reduce_extralines_gt = 2
|
||||
|
||||
# if lines are longer than x
|
||||
max_line_length = 99
|
||||
max_line_length = 120
|
||||
format_long_attributes = True
|
||||
|
||||
# pattern used to find attributes in a tag
|
||||
attribute_pattern = r"(.+?=(?:\".*?\"|\'.*?\')|required|checked)\s*"
|
||||
tag_pattern = r"(<\w+?)((?:\n\s*?[^>]+?)+?)(/?\>)"
|
||||
tag_pattern = r"(<\w+?[^>]*?)((?:\n\s*?[^>]+?)+?)(/?\>)"
|
||||
ignored_attributes = [
|
||||
"data-json",
|
||||
]
|
||||
|
||||
ignored_paths = r"(?:\.tox|\.venv|node_modules|_build)"
|
||||
|
||||
|
||||
start_template_tags = r"{% ?(?:if|for|block|spaceless|compress|load|include|assets|addto|language)[^}]+?%}"
|
||||
|
||||
break_template_tags = [
|
||||
r"{% ?(?:if|end|for|block|endblock|else|spaceless|compress|load|include|assets|addto|language)[^}]+?%}",
|
||||
]
|
||||
|
||||
unformated_html_tags = ["script"]
|
||||
|
||||
ignored_blocks = [
|
||||
r"<(script|style|pre|svg).*?(?:%s).*?</(\1)>",
|
||||
r"<!--.*?(?:%s).*?-->",
|
||||
r"{\*.*?(?:%s).*?\*}",
|
||||
r"{#.*?(?:%s).*?#}",
|
||||
r"<\?php.*?(?:%s).*?\?>",
|
||||
]
|
||||
|
||||
ignored_inline_blocks = [
|
||||
r"<!--.*?-->",
|
||||
r"{\*.*?\*}",
|
||||
r"{#.*?#}",
|
||||
r"<\?php.*?\?>",
|
||||
]
|
||||
|
||||
single_line_html_tags = [
|
||||
"button",
|
||||
"a",
|
||||
"h1",
|
||||
"h2",
|
||||
"h3",
|
||||
"h4",
|
||||
"h5",
|
||||
"h6",
|
||||
"td",
|
||||
"th",
|
||||
"strong",
|
||||
"em",
|
||||
"icon",
|
||||
"span",
|
||||
"title",
|
||||
"link",
|
||||
]
|
||||
|
||||
always_single_line_html_tags = ["link"]
|
||||
|
||||
single_line_template_tags = ["if", "for", "block"]
|
||||
|
||||
break_html_tags = [
|
||||
"a",
|
||||
"abbr",
|
||||
"acronym",
|
||||
"address",
|
||||
"applet",
|
||||
"area",
|
||||
"article",
|
||||
"aside",
|
||||
"audio",
|
||||
"b",
|
||||
"base",
|
||||
"basefont",
|
||||
"bdi",
|
||||
"bdo",
|
||||
"big",
|
||||
"blockquote",
|
||||
"body",
|
||||
"br",
|
||||
"button",
|
||||
"canvas",
|
||||
"caption",
|
||||
"center",
|
||||
"cite",
|
||||
"code",
|
||||
"col",
|
||||
"colgroup",
|
||||
"data",
|
||||
"datalist",
|
||||
"dd",
|
||||
"del",
|
||||
"details",
|
||||
"dfn",
|
||||
"dialog",
|
||||
"dir",
|
||||
"div",
|
||||
"dl",
|
||||
"dt",
|
||||
"em",
|
||||
"embed",
|
||||
"fieldset",
|
||||
"figcaption",
|
||||
"figure",
|
||||
"font",
|
||||
"footer",
|
||||
"form",
|
||||
"frame",
|
||||
"frameset",
|
||||
"h1",
|
||||
"h2",
|
||||
"h3",
|
||||
"h4",
|
||||
"h5",
|
||||
"h6",
|
||||
"head",
|
||||
"header",
|
||||
"hr",
|
||||
"html",
|
||||
"i",
|
||||
"iframe",
|
||||
"img",
|
||||
"input",
|
||||
"ins",
|
||||
"kbd",
|
||||
"label",
|
||||
"legend",
|
||||
"li",
|
||||
"link",
|
||||
"main",
|
||||
"map",
|
||||
"mark",
|
||||
"meta",
|
||||
"meter",
|
||||
"nav",
|
||||
"noframes",
|
||||
"noscript",
|
||||
"object",
|
||||
"ol",
|
||||
"optgroup",
|
||||
"option",
|
||||
"output",
|
||||
"p",
|
||||
"param",
|
||||
"picture",
|
||||
"pre",
|
||||
"progress",
|
||||
"q",
|
||||
"rp",
|
||||
"rt",
|
||||
"ruby",
|
||||
"s",
|
||||
"samp",
|
||||
"script",
|
||||
"section",
|
||||
"select",
|
||||
"small",
|
||||
"source",
|
||||
"span",
|
||||
"strike",
|
||||
"strong",
|
||||
"style",
|
||||
"sub",
|
||||
"summary",
|
||||
"sup",
|
||||
"svg",
|
||||
"table",
|
||||
"tbody",
|
||||
"td",
|
||||
"template",
|
||||
"textarea",
|
||||
"tfoot",
|
||||
"th",
|
||||
"thead",
|
||||
"time",
|
||||
"title",
|
||||
"tr",
|
||||
"track",
|
||||
"tt",
|
||||
"u",
|
||||
"ul",
|
||||
"var",
|
||||
"video",
|
||||
"wbr",
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1,10 +1,6 @@
|
|||
My first name is {{htmlfirst_name }}. My last name is {{ last_name}}.
|
||||
|
||||
My first name is {{ htmlfirst_name }}. My last name is {{ last_name }}.
|
||||
{% extends 'base_generic.html" %}
|
||||
{% block body %}
|
||||
{% endblock%}
|
||||
|
||||
|
||||
{% block body %}{% endblock %}
|
||||
<link rel="stylesheet" href="/static/css/nav.scss" type="text/x-scss" charset="utf-8"/>
|
||||
<script type="text/javascript" src="/static/lib/markdown-it/markdown-it.js"></script>
|
||||
<img src="/static/images/hi.jpg" alt="Hi!">
|
||||
|
|
|
|||
11
tests/django_admin/admin/404.html
Normal file
11
tests/django_admin/admin/404.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n %}
|
||||
{% block title %}
|
||||
{% translate 'Page not found' %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<h2>{% translate 'Page not found' %}</h2>
|
||||
<p>
|
||||
{% translate 'We’re sorry, but the requested page could not be found.' %}
|
||||
</p>
|
||||
{% endblock %}
|
||||
21
tests/django_admin/admin/500.html
Normal file
21
tests/django_admin/admin/500.html
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {% translate 'Server error' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block title %}
|
||||
{% translate 'Server error (500)' %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<h1>
|
||||
{% translate 'Server Error
|
||||
<em>(500)</em>
|
||||
' %}
|
||||
</h1>
|
||||
<p>
|
||||
{% translate 'There’s been an error. It’s been reported to the site administrators via email and should be fixed shortly. Thanks for your patience.' %}
|
||||
</p>
|
||||
{% endblock %}
|
||||
44
tests/django_admin/admin/actions.html
Normal file
44
tests/django_admin/admin/actions.html
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
{% load i18n %}
|
||||
<div class="actions">
|
||||
{% block actions %}
|
||||
{% block actions-form %}
|
||||
{% for field in action_form %}
|
||||
{% if field.label %}
|
||||
<label>
|
||||
{{ field.label }}
|
||||
{% endif %}
|
||||
{{ field }}
|
||||
{% if field.label %}</label>{% endif %}
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
{% block actions-submit %}
|
||||
<button type="submit"
|
||||
class="button"
|
||||
title="{% translate "
|
||||
Run the selected action" %}" name="index"
|
||||
value="{{ action_index|default:0 }}">
|
||||
{% translate "Go" %}
|
||||
</button>
|
||||
{% endblock %}
|
||||
{% block actions-counter %}
|
||||
{% if actions_selection_counter %}
|
||||
<span class="action-counter" data-actions-icnt="{{ cl.result_list|length }}">
|
||||
{{ selection_note }}
|
||||
</span>
|
||||
{% if cl.result_count != cl.result_list|length %}
|
||||
<span class="all hidden">{{ selection_note_all }}</span>
|
||||
<span class="question hidden">
|
||||
<a href="#" title="{% translate ">
|
||||
{% blocktranslate with cl.result_count as total_count %}
|
||||
Select all {{ total_count }} {{ module_name }}
|
||||
{% endblocktranslate %}
|
||||
</a>
|
||||
</span>
|
||||
<span class="clear hidden">
|
||||
<a href="#">{% translate "Clear selection" %}</a>
|
||||
</span>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
13
tests/django_admin/admin/app_index.html
Normal file
13
tests/django_admin/admin/app_index.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{% extends "admin/index.html" %}
|
||||
{% load i18n %}
|
||||
{% block bodyclass %}{{ block.super }} app-{{ app_label }}{% endblock %}
|
||||
{% if not is_popup %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
›
|
||||
{% for app in app_list %}{{ app.name }}{% endfor %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% endif %}
|
||||
{% block sidebar %}{% endblock %}
|
||||
63
tests/django_admin/admin/app_list.html
Normal file
63
tests/django_admin/admin/app_list.html
Normal file
|
|
@ -0,0 +1,63 @@
|
|||
{% load i18n %}
|
||||
{% if app_list %}
|
||||
{% for app in app_list %}
|
||||
<div class="app-{{ app.app_label }} module{% if app.app_url in request.path %}current-app{% endif %}">
|
||||
<table>
|
||||
<caption>
|
||||
<a href="{{ app.app_url }}"
|
||||
class="section"
|
||||
title="{% blocktranslate with name=app.name %}Models in the {{ name }} application{% endblocktranslate %}">
|
||||
{{ app.name }}
|
||||
</a>
|
||||
</caption>
|
||||
{% for model in app.models %}
|
||||
<tr class="model-{{ model.object_name|lower }}{% if model.admin_url in request.path %} current-model{% endif %}">
|
||||
{% if model.admin_url %}
|
||||
<th scope="row">
|
||||
<a href="{{ model.admin_url }}"
|
||||
{% if model.admin_url in request.path %}
|
||||
aria-current="page"
|
||||
{% endif %}
|
||||
>
|
||||
{{ model.name }}
|
||||
</a>
|
||||
</th>
|
||||
{% else %}
|
||||
<th scope="row">{{ model.name }}</th>
|
||||
{% endif %}
|
||||
{% if model.add_url %}
|
||||
<td>
|
||||
<a href="{{ model.add_url }}" class="addlink">
|
||||
{% translate 'Add' %}
|
||||
</a>
|
||||
</td>
|
||||
{% else %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
{% if model.admin_url and show_changelinks %}
|
||||
{% if model.view_only %}
|
||||
<td>
|
||||
<a href="{{ model.admin_url }}" class="viewlink">
|
||||
{% translate 'View' %}
|
||||
</a>
|
||||
</td>
|
||||
{% else %}
|
||||
<td>
|
||||
<a href="{{ model.admin_url }}" class="changelink">
|
||||
{% translate 'Change' %}
|
||||
</a>
|
||||
</td>
|
||||
{% endif %}
|
||||
{% elif show_changelinks %}
|
||||
<td></td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</table>
|
||||
</div>
|
||||
{% endfor %}
|
||||
{% else %}
|
||||
<p>
|
||||
{% translate 'You don’t have permission to view or edit anything.' %}
|
||||
</p>
|
||||
{% endif %}
|
||||
13
tests/django_admin/admin/auth/user/add_form.html
Normal file
13
tests/django_admin/admin/auth/user/add_form.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{% extends "admin/change_form.html" %}
|
||||
{% load i18n %}
|
||||
{% block form_top %}
|
||||
{% if not is_popup %}
|
||||
<p>
|
||||
{% translate 'First, enter a username and password. Then, you’ll be able to edit more user options.' %}
|
||||
</p>
|
||||
{% else %}
|
||||
<p>
|
||||
{% translate "Enter a username and password." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
85
tests/django_admin/admin/auth/user/change_password.html
Normal file
85
tests/django_admin/admin/auth/user/change_password.html
Normal file
|
|
@ -0,0 +1,85 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n static %}
|
||||
{% load admin_urls %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static ">
|
||||
{% endblock %}
|
||||
{% block bodyclass %}
|
||||
{{ block.super }} {{ opts.app_label }}-{{ opts.model_name }} change-form
|
||||
{% endblock %}
|
||||
{% if not is_popup %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
›
|
||||
<a href="{% url 'admin:app_list' app_label=opts.app_label %}">
|
||||
{{ opts.app_config.verbose_name }}
|
||||
</a>
|
||||
›
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}">
|
||||
{{ opts.verbose_name_plural|capfirst }}
|
||||
</a>
|
||||
›
|
||||
<a href="{% url opts|admin_urlname:'change' original.pk|admin_urlquote %}">
|
||||
{{ original|truncatewords:"18" }}
|
||||
</a>
|
||||
› {% translate 'Change password' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% endif %}
|
||||
{% block content %}
|
||||
<div id="content-main">
|
||||
<form
|
||||
{% if form_url %}action="{{ form_url }}" {% endif %}
|
||||
method="post" id="{{ opts.model_name }}_form">
|
||||
{% csrf_token %}
|
||||
{% block form_top %}{% endblock %}
|
||||
<input type="text" name="username" value="{{ original.get_username }}" class="hidden">
|
||||
<div>
|
||||
{% if is_popup %}
|
||||
<input type="hidden" name="{{ is_popup_var }}" value="1">
|
||||
{% endif %}
|
||||
{% if form.errors %}
|
||||
<p class="errornote">
|
||||
{% if form.errors.items|length == 1 %}
|
||||
{% translate "Please correct the error below." %}
|
||||
{% else %}
|
||||
{% translate "Please correct the errors below." %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<p>
|
||||
{% blocktranslate with username=original %}
|
||||
Enter a new password for the user
|
||||
<strong>{{ username }}</strong>
|
||||
.
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
<fieldset class="module aligned">
|
||||
<div class="form-row">
|
||||
{{ form.password1.errors }}
|
||||
{{ form.password1.label_tag }} {{ form.password1 }}
|
||||
{% if form.password1.help_text %}
|
||||
<div class="help">
|
||||
{{ form.password1.help_text|safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
{{ form.password2.errors }}
|
||||
{{ form.password2.label_tag }} {{ form.password2 }}
|
||||
{% if form.password2.help_text %}
|
||||
<div class="help">
|
||||
{{ form.password2.help_text|safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</fieldset>
|
||||
<div class="submit-row">
|
||||
<input type="submit" value="{% translate 'Change password' %}" class="default">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
122
tests/django_admin/admin/base.html
Normal file
122
tests/django_admin/admin/base.html
Normal file
|
|
@ -0,0 +1,122 @@
|
|||
{% load i18n static %}
|
||||
<!DOCTYPE html>
|
||||
{% get_current_language as LANGUAGE_CODE %}{% get_current_language_bidi as LANGUAGE_BIDI %}
|
||||
<html lang="{{ LANGUAGE_CODE|default:"en-us" }}" dir="{{ LANGUAGE_BIDI|yesno:'rtl,ltr,auto' }}">
|
||||
<head>
|
||||
<title>{% block title %}{% endblock %}</title>
|
||||
<link rel="stylesheet" type="text/css" href=" {% block stylesheet %} {% static "admin/css/base.css" %}
|
||||
{% endblock %}
|
||||
">
|
||||
{% if not is_popup and is_nav_sidebar_enabled %}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/nav_sidebar.css" %}">
|
||||
<script src="{% static 'admin/js/nav_sidebar.js' %}" defer></script>
|
||||
{% endif %}
|
||||
{% block extrastyle %}{% endblock %}
|
||||
{% if LANGUAGE_BIDI %}
|
||||
<link rel="stylesheet" type="text/css" href=" {% block stylesheet_rtl %} {% static "admin/css/rtl.css" %}
|
||||
{% endblock %}
|
||||
">
|
||||
{% endif %}
|
||||
{% block extrahead %}{% endblock %}
|
||||
{% block responsive %}
|
||||
<meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1.0, maximum-scale=1.0">
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/responsive.css" %}">
|
||||
{% if LANGUAGE_BIDI %}
|
||||
<link rel="stylesheet" type="text/css" href="{% static ">
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE">{% endblock %}
|
||||
</head>
|
||||
<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}"
|
||||
data-admin-utc-offset="{% now ">
|
||||
<!-- Container -->
|
||||
<div id="container">
|
||||
{% if not is_popup %}
|
||||
<!-- Header -->
|
||||
{% block header %}
|
||||
<div id="header">
|
||||
<div id="branding">
|
||||
{% block branding %}{% endblock %}
|
||||
</div>
|
||||
{% block usertools %}
|
||||
{% if has_permission %}
|
||||
<div id="user-tools">
|
||||
{% block welcome-msg %}
|
||||
{% translate 'Welcome,' %}
|
||||
<strong>{% firstof user.get_short_name user.get_username %}</strong>
|
||||
.
|
||||
{% endblock %}
|
||||
{% block userlinks %}
|
||||
{% if site_url %}
|
||||
<a href="{{ site_url }}">{% translate 'View site' %}</a>
|
||||
/
|
||||
{% endif %}
|
||||
{% if user.is_active and user.is_staff %}
|
||||
{% url 'django-admindocs-docroot' as docsroot %}
|
||||
{% if docsroot %}
|
||||
<a href="{{ docsroot }}">{% translate 'Documentation' %}</a>
|
||||
/
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if user.has_usable_password %}
|
||||
<a href="{% url 'admin:password_change' %}">
|
||||
{% translate 'Change password' %}
|
||||
</a>
|
||||
/
|
||||
{% endif %}
|
||||
<a href="{% url 'admin:logout' %}">
|
||||
{% translate 'Log out' %}
|
||||
</a>
|
||||
{% endblock %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block nav-global %}{% endblock %}</div>{% endblock %}
|
||||
<!-- END Header -->
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
{% if title %}› {{ title }}{% endif %}
|
||||
</div>
|
||||
{% endblock %}{% endif %}
|
||||
<div class="main" id="main">
|
||||
{% if not is_popup and is_nav_sidebar_enabled %}
|
||||
{% block nav-sidebar %}
|
||||
{% include "admin/nav_sidebar.html" %}{% endblock %}{% endif %}
|
||||
<div class="content">
|
||||
{% block messages %}
|
||||
{% if messages %}
|
||||
<ul class="messagelist">
|
||||
{% for message in messages %}
|
||||
<li{% if message.tags %}class="{{ message.tags }}"{% endif %}>{{ message|capfirst }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endblock messages %}
|
||||
<!-- Content -->
|
||||
<div id="content" class="{% block coltype %}colM{% endblock %}">
|
||||
{% block pretitle %}{% endblock %}
|
||||
{% block content_title %}{% if title %}
|
||||
<h1>{{ title }}</h1>
|
||||
{% endif %}{% endblock %}
|
||||
{% block content_subtitle %}{% if subtitle %}
|
||||
<h2>{{ subtitle }}</h2>
|
||||
{% endif %}{% endblock %}
|
||||
{% block content %}
|
||||
{% block object-tools %}{% endblock %}
|
||||
{{ content }}
|
||||
{% endblock %}
|
||||
{% block sidebar %}{% endblock %}
|
||||
<br class="clear">
|
||||
</div>
|
||||
<!-- END Content -->
|
||||
{% block footer %}
|
||||
<div id="footer"></div>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- END Container -->
|
||||
</body>
|
||||
</html>
|
||||
13
tests/django_admin/admin/base_site.html
Normal file
13
tests/django_admin/admin/base_site.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{% extends "admin/base.html" %}
|
||||
{% block title %}
|
||||
{% if subtitle %}{{ subtitle }} |{% endif %}
|
||||
{{ title }} | {{ site_title|default:_('Django site admin') }}
|
||||
{% endblock %}
|
||||
{% block branding %}
|
||||
<h1 id="site-name">
|
||||
<a href="{% url 'admin:index' %}">
|
||||
{{ site_header|default:_('Django administration') }}
|
||||
</a>
|
||||
</h1>
|
||||
{% endblock %}
|
||||
{% block nav-global %}{% endblock %}
|
||||
97
tests/django_admin/admin/change_form.html
Normal file
97
tests/django_admin/admin/change_form.html
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n admin_urls static admin_modify %}
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
<script src="{% url 'admin:jsi18n' %}"></script>
|
||||
{{ media }}
|
||||
{% endblock %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">
|
||||
{% endblock %}
|
||||
{% block coltype %}colM{% endblock %}
|
||||
{% block bodyclass %}
|
||||
{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-form
|
||||
{% endblock %}
|
||||
{% if not is_popup %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
›
|
||||
<a href="{% url 'admin:app_list' app_label=opts.app_label %}">
|
||||
{{ opts.app_config.verbose_name }}
|
||||
</a>
|
||||
›
|
||||
{% if has_view_permission %}
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}">
|
||||
{{ opts.verbose_name_plural|capfirst }}
|
||||
</a>
|
||||
{% else %}
|
||||
{{ opts.verbose_name_plural|capfirst }}
|
||||
{% endif %}
|
||||
›
|
||||
{% if add %}
|
||||
{% blocktranslate with name=opts.verbose_name %}
|
||||
Add {{ name }}
|
||||
{% endblocktranslate %}
|
||||
{% else %}
|
||||
{{ original|truncatewords:"18" }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}{% endif %}
|
||||
{% block content %}
|
||||
<div id="content-main">
|
||||
{% block object-tools %}
|
||||
{% if change %}
|
||||
{% if not is_popup %}
|
||||
<ul class="object-tools">
|
||||
{% block object-tools-items %}
|
||||
{% change_form_object_tools %}
|
||||
{% endblock %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
<form {% if has_file_field %}enctype="multipart/form-data"
|
||||
{% endif %} {% if form_url %}action="{{ form_url }}"
|
||||
{% endif %} method="post"
|
||||
id="{{ opts.model_name }}_form">
|
||||
{% csrf_token %}{% block form_top %}{% endblock %}
|
||||
<div>
|
||||
{% if is_popup %}
|
||||
<input type="hidden" name="{{ is_popup_var }}" value="1">
|
||||
{% endif %}
|
||||
{% if to_field %}
|
||||
<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}">
|
||||
{% endif %}
|
||||
{% if save_on_top %}
|
||||
{% block submit_buttons_top %}
|
||||
{% submit_row %}{% endblock %}{% endif %}
|
||||
{% if errors %}
|
||||
<p class="errornote">
|
||||
{% if errors|length == 1 %}{% translate "Please correct the error below." %}{% else %}
|
||||
{% translate "Please correct the errors below." %}{% endif %}
|
||||
</p>
|
||||
{{ adminform.form.non_field_errors }}
|
||||
{% endif %}
|
||||
{% block field_sets %}
|
||||
{% for fieldset in adminform %}
|
||||
{% include "admin/includes/fieldset.html" %}{% endfor %}
|
||||
{% endblock %}
|
||||
{% block after_field_sets %}{% endblock %}
|
||||
{% block inline_field_sets %}
|
||||
{% for inline_admin_formset in inline_admin_formsets %}
|
||||
{% include inline_admin_formset.opts.template %}{% endfor %}
|
||||
{% endblock %}
|
||||
{% block after_related_objects %}{% endblock %}
|
||||
{% block submit_buttons_bottom %}
|
||||
{% submit_row %}{% endblock %}
|
||||
{% block admin_change_form_document_ready %}
|
||||
<script id="django-admin-form-add-constants" src="{% static 'admin/js/change_form.js' %}" {% if adminform and add %}data-model-name="{{ opts.model_name }}" {% endif %} async></script>
|
||||
{% endblock %}
|
||||
{# JavaScript for prepopulated fields #}
|
||||
{% prepopulated_fields_js %}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
16
tests/django_admin/admin/change_form_object_tools.html
Normal file
16
tests/django_admin/admin/change_form_object_tools.html
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{% load i18n admin_urls %}
|
||||
{% block object-tools-items %}
|
||||
<li>
|
||||
{% url opts|admin_urlname:'history' original.pk|admin_urlquote as history_url %}
|
||||
<a href="{% add_preserved_filters history_url %}" class="historylink">
|
||||
{% translate "History" %}
|
||||
</a>
|
||||
</li>
|
||||
{% if has_absolute_url %}
|
||||
<li>
|
||||
<a href="{{ absolute_url }}" class="viewsitelink">
|
||||
{% translate "View on site" %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
113
tests/django_admin/admin/change_list.html
Normal file
113
tests/django_admin/admin/change_list.html
Normal file
|
|
@ -0,0 +1,113 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n admin_urls static admin_list %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/changelists.css" %}">
|
||||
{% if cl.formset %}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">
|
||||
{% endif %}
|
||||
{% if cl.formset or action_form %}
|
||||
<script src="{% url 'admin:jsi18n' %}"></script>
|
||||
{% endif %}
|
||||
{{ media.css }}
|
||||
{% if not actions_on_top and not actions_on_bottom %}
|
||||
<style>
|
||||
#changelist table thead th:first-child {width: inherit}
|
||||
|
||||
</style>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
{{ media.js }}
|
||||
{% endblock %}
|
||||
{% block bodyclass %}
|
||||
{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} change-list
|
||||
{% endblock %}
|
||||
{% if not is_popup %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
›
|
||||
<a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">
|
||||
{{ cl.opts.app_config.verbose_name }}
|
||||
</a>
|
||||
› {{ cl.opts.verbose_name_plural|capfirst }}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% endif %}
|
||||
{% block coltype %}{% endblock %}
|
||||
{% block content %}
|
||||
<div id="content-main">
|
||||
{% block object-tools %}
|
||||
<ul class="object-tools">
|
||||
{% block object-tools-items %}
|
||||
{% change_list_object_tools %}
|
||||
{% endblock %}
|
||||
</ul>
|
||||
{% endblock %}
|
||||
{% if cl.formset and cl.formset.errors %}
|
||||
<p class="errornote">
|
||||
{% if cl.formset.total_error_count == 1 %}
|
||||
{% translate "Please correct the error below." %}
|
||||
{% else %}
|
||||
{% translate "Please correct the errors below." %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{{ cl.formset.non_form_errors }}
|
||||
{% endif %}
|
||||
<div class="module{% if cl.has_filters %}filtered{% endif %}" id="changelist">
|
||||
<div class="changelist-form-container">
|
||||
{% block search %}
|
||||
{% search_form cl %}
|
||||
{% endblock %}
|
||||
{% block date_hierarchy %}
|
||||
{% if cl.date_hierarchy %}
|
||||
{% date_hierarchy cl %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
<form id="changelist-form" method="post"
|
||||
{% if cl.formset and cl.formset.is_multipart %}
|
||||
enctype="multipart/form-data"
|
||||
{% endif %}
|
||||
novalidate>
|
||||
{% csrf_token %}
|
||||
{% if cl.formset %}
|
||||
<div>
|
||||
{{ cl.formset.management_form }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% block result_list %}
|
||||
{% if action_form and actions_on_top and cl.show_admin_actions %}
|
||||
{% admin_actions %}
|
||||
{% endif %}
|
||||
{% result_list cl %}
|
||||
{% if action_form and actions_on_bottom and cl.show_admin_actions %}
|
||||
{% admin_actions %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block pagination %}
|
||||
{% pagination cl %}
|
||||
{% endblock %}
|
||||
</form>
|
||||
</div>
|
||||
{% block filters %}
|
||||
{% if cl.has_filters %}
|
||||
<div id="changelist-filter">
|
||||
<h2>{% translate 'Filter' %}</h2>
|
||||
{% if cl.has_active_filters %}
|
||||
<h3 id="changelist-filter-clear">
|
||||
<a href="{{ cl.clear_all_filters_qs }}">
|
||||
✖ {% translate "Clear all filters" %}
|
||||
</a>
|
||||
</h3>
|
||||
{% endif %}
|
||||
{% for spec in cl.filter_specs %}
|
||||
{% admin_list_filter cl spec %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
13
tests/django_admin/admin/change_list_object_tools.html
Normal file
13
tests/django_admin/admin/change_list_object_tools.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{% load i18n admin_urls %}
|
||||
{% block object-tools-items %}
|
||||
{% if has_add_permission %}
|
||||
<li>
|
||||
{% url cl.opts|admin_urlname:'add' as add_url %}
|
||||
<a href="{% add_preserved_filters add_url is_popup to_field %}" class="addlink">
|
||||
{% blocktranslate with cl.opts.verbose_name as name %}
|
||||
Add {{ name }}
|
||||
{% endblocktranslate %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
59
tests/django_admin/admin/change_list_results.html
Normal file
59
tests/django_admin/admin/change_list_results.html
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
{% load i18n %}
|
||||
{% if result_hidden_fields %}
|
||||
<div class="hiddenfields">
|
||||
{# DIV for HTML validation #}
|
||||
{% for item in result_hidden_fields %}{{ item }}{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if results %}
|
||||
<div class="results">
|
||||
<table id="result_list">
|
||||
<thead>
|
||||
<tr>
|
||||
{% for header in result_headers %}
|
||||
<th scope="col"{{ header.class_attrib }}>
|
||||
{% if header.sortable %}
|
||||
{% if header.sort_priority > 0 %}
|
||||
<div class="sortoptions">
|
||||
<a class="sortremove" href="{{ header.url_remove }}" title="{% translate "></a>
|
||||
{% if num_sorted_fields > 1 %}
|
||||
<span class="sortpriority"
|
||||
title="{% blocktranslate with priority_number=header.sort_priority %}Sorting priority: {{ priority_number }}{% endblocktranslate %}">
|
||||
{{ header.sort_priority }}
|
||||
</span>
|
||||
{% endif %}
|
||||
<a href="{{ header.url_toggle }}"
|
||||
class="toggle {% if header.ascending %}ascending{% else %}descending{% endif %}"
|
||||
title="{% translate "></a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<div class="text">
|
||||
{% if header.sortable %}
|
||||
<a href="{{ header.url_primary }}">
|
||||
{{ header.text|capfirst }}
|
||||
</a>
|
||||
{% else %}
|
||||
<span>{{ header.text|capfirst }}</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="clear"></div>
|
||||
</th>
|
||||
{% endfor %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for result in results %}
|
||||
{% if result.form and result.form.non_field_errors %}
|
||||
<tr>
|
||||
<td colspan="{{ result|length }}">{{ result.form.non_field_errors }}</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr>
|
||||
{% for item in result %}{{ item }}{% endfor %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% endif %}
|
||||
25
tests/django_admin/admin/date_hierarchy.html
Normal file
25
tests/django_admin/admin/date_hierarchy.html
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{% if show %}
|
||||
<div class="xfull">
|
||||
<ul class="toplinks">
|
||||
{% block date-hierarchy-toplinks %}
|
||||
{% block date-hierarchy-back %}
|
||||
{% if back %}
|
||||
<li class="date-back">
|
||||
<a href="{{ back.link }}">‹ {{ back.title }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block date-hierarchy-choices %}
|
||||
{% for choice in choices %}
|
||||
<li>
|
||||
{% if choice.link %}<a href="{{ choice.link }}">{% endif %}
|
||||
{{ choice.title }}
|
||||
{% if choice.link %}</a>{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% endblock %}
|
||||
{% endblock %}
|
||||
</ul>
|
||||
<br class="clear">
|
||||
</div>
|
||||
{% endif %}
|
||||
84
tests/django_admin/admin/delete_confirmation.html
Normal file
84
tests/django_admin/admin/delete_confirmation.html
Normal file
|
|
@ -0,0 +1,84 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n admin_urls static %}
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
{{ media }}
|
||||
<script src="{% static 'admin/js/cancel.js' %}" async></script>
|
||||
{% endblock %}
|
||||
{% block bodyclass %}
|
||||
{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
›
|
||||
<a href="{% url 'admin:app_list' app_label=opts.app_label %}">
|
||||
{{ opts.app_config.verbose_name }}
|
||||
</a>
|
||||
›
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}">
|
||||
{{ opts.verbose_name_plural|capfirst }}
|
||||
</a>
|
||||
›
|
||||
<a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">
|
||||
{{ object|truncatewords:"18" }}
|
||||
</a>
|
||||
› {% translate 'Delete' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% if perms_lacking %}
|
||||
<p>
|
||||
{% blocktranslate with escaped_object=object %}
|
||||
Deleting the {{ object_name }} '{{ escaped_object }}' would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
<ul>
|
||||
{% for obj in perms_lacking %}
|
||||
<li>
|
||||
{{ obj }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% elif protected %}
|
||||
<p>
|
||||
{% blocktranslate with escaped_object=object %}
|
||||
Deleting the {{ object_name }} '{{ escaped_object }}' would require deleting the following protected related objects:
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
<ul>
|
||||
{% for obj in protected %}
|
||||
<li>
|
||||
{{ obj }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p>
|
||||
{% blocktranslate with escaped_object=object %}
|
||||
Are you sure you want to delete the {{ object_name }} "{{ escaped_object }}"? All of the following related items will be deleted:
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
{% include "admin/includes/object_delete_summary.html" %}
|
||||
<h2>{% translate "Objects" %}</h2>
|
||||
<ul>
|
||||
{{ deleted_objects|unordered_list }}
|
||||
</ul>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div>
|
||||
<input type="hidden" name="post" value="yes">
|
||||
{% if is_popup %}
|
||||
<input type="hidden" name="{{ is_popup_var }}" value="1">
|
||||
{% endif %}
|
||||
{% if to_field %}
|
||||
<input type="hidden" name="{{ to_field_var }}" value="{{ to_field }}">
|
||||
{% endif %}
|
||||
<input type="submit" value="{% translate 'Yes, I’m sure' %}">
|
||||
<a href="#" class="button cancel-link">
|
||||
{% translate "No, take me back" %}
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
80
tests/django_admin/admin/delete_selected_confirmation.html
Normal file
80
tests/django_admin/admin/delete_selected_confirmation.html
Normal file
|
|
@ -0,0 +1,80 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n l10n admin_urls static %}
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
{{ media }}
|
||||
<script src="{% static 'admin/js/cancel.js' %}" async></script>
|
||||
{% endblock %}
|
||||
{% block bodyclass %}
|
||||
{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} delete-confirmation delete-selected-confirmation
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
›
|
||||
<a href="{% url 'admin:app_list' app_label=opts.app_label %}">
|
||||
{{ opts.app_config.verbose_name }}
|
||||
</a>
|
||||
›
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}">
|
||||
{{ opts.verbose_name_plural|capfirst }}
|
||||
</a>
|
||||
› {% translate 'Delete multiple objects' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% if perms_lacking %}
|
||||
<p>
|
||||
{% blocktranslate %}
|
||||
Deleting the selected {{ objects_name }} would result in deleting related objects, but your account doesn't have permission to delete the following types of objects:
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
<ul>
|
||||
{% for obj in perms_lacking %}
|
||||
<li>
|
||||
{{ obj }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% elif protected %}
|
||||
<p>
|
||||
{% blocktranslate %}
|
||||
Deleting the selected {{ objects_name }} would require deleting the following protected related objects:
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
<ul>
|
||||
{% for obj in protected %}
|
||||
<li>
|
||||
{{ obj }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p>
|
||||
{% blocktranslate %}
|
||||
Are you sure you want to delete the selected {{ objects_name }}? All of the following objects and their related items will be deleted:
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
{% include "admin/includes/object_delete_summary.html" %}
|
||||
<h2>{% translate "Objects" %}</h2>
|
||||
{% for deletable_object in deletable_objects %}
|
||||
<ul>
|
||||
{{ deletable_object|unordered_list }}
|
||||
</ul>
|
||||
{% endfor %}
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div>
|
||||
{% for obj in queryset %}
|
||||
<input type="hidden" name="{{ action_checkbox_name }}" value="{{ obj.pk|unlocalize }}">
|
||||
{% endfor %}
|
||||
<input type="hidden" name="action" value="delete_selected">
|
||||
<input type="hidden" name="post" value="yes">
|
||||
<input type="submit" value="{% translate 'Yes, I’m sure' %}">
|
||||
<a href="#" class="button cancel-link">
|
||||
{% translate "No, take me back" %}
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
53
tests/django_admin/admin/edit_inline/stacked.html
Normal file
53
tests/django_admin/admin/edit_inline/stacked.html
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
{% load i18n admin_urls %}
|
||||
<div class="js-inline-admin-formset inline-group"
|
||||
id="{{ inline_admin_formset.formset.prefix }}-group"
|
||||
data-inline-type="stacked"
|
||||
data-inline-formset="{{ inline_admin_formset.inline_formset_data }}">
|
||||
<fieldset class="module {{ inline_admin_formset.classes }}">
|
||||
{% if inline_admin_formset.formset.max_num == 1 %}
|
||||
<h2>{{ inline_admin_formset.opts.verbose_name|capfirst }}</h2>
|
||||
{% else %}
|
||||
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
|
||||
{% endif %}
|
||||
{{ inline_admin_formset.formset.management_form }}
|
||||
{{ inline_admin_formset.formset.non_form_errors }}
|
||||
{% for inline_admin_form in inline_admin_formset %}
|
||||
<div class="inline-related{% if inline_admin_form.original or inline_admin_form.show_url %} has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form last-related{% endif %}"
|
||||
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
|
||||
<h3>
|
||||
<b>
|
||||
{{ inline_admin_formset.opts.verbose_name|capfirst }}:
|
||||
</b>
|
||||
<span class="inline_label">
|
||||
{% if inline_admin_form.original %}
|
||||
{{ inline_admin_form.original }}
|
||||
{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}
|
||||
<a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}"
|
||||
class="{% if inline_admin_formset.has_change_permission %}inlinechangelink{% else %}inlineviewlink{% endif %}">
|
||||
{% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
#{{ forloop.counter }}
|
||||
{% endif %}
|
||||
</span>
|
||||
{% if inline_admin_form.show_url %}
|
||||
<a href="{{ inline_admin_form.absolute_url }}">
|
||||
{% translate "View on site" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission and inline_admin_form.original %}
|
||||
<span class="delete">
|
||||
{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}
|
||||
</span>
|
||||
{% endif %}
|
||||
</h3>
|
||||
{% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %}
|
||||
{% for fieldset in inline_admin_form %}
|
||||
{% include "admin/includes/fieldset.html" %}{% endfor %}
|
||||
{% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
|
||||
{% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</fieldset>
|
||||
</div>
|
||||
110
tests/django_admin/admin/edit_inline/tabular.html
Normal file
110
tests/django_admin/admin/edit_inline/tabular.html
Normal file
|
|
@ -0,0 +1,110 @@
|
|||
{% load i18n admin_urls static admin_modify %}
|
||||
<div class="js-inline-admin-formset inline-group"
|
||||
id="{{ inline_admin_formset.formset.prefix }}-group"
|
||||
data-inline-type="tabular"
|
||||
data-inline-formset="{{ inline_admin_formset.inline_formset_data }}">
|
||||
<div class="tabular inline-related {% if forloop.last %}last-related{% endif %}">
|
||||
{{ inline_admin_formset.formset.management_form }}
|
||||
<fieldset class="module {{ inline_admin_formset.classes }}">
|
||||
{% if inline_admin_formset.formset.max_num == 1 %}
|
||||
<h2>{{ inline_admin_formset.opts.verbose_name|capfirst }}</h2>
|
||||
{% else %}
|
||||
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2>
|
||||
{% endif %}
|
||||
{{ inline_admin_formset.formset.non_form_errors }}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="original"></th>
|
||||
{% for field in inline_admin_formset.fields %}
|
||||
{% if not field.widget.is_hidden %}
|
||||
<th class="column-{{ field.name }}{% if field.required %}required{% endif %}">
|
||||
{{ field.label|capfirst }}
|
||||
{% if field.help_text %}
|
||||
<img src="{% static "
|
||||
admin/img/icon-unknown.svg" %}" class="help help-tooltip"
|
||||
width="10"
|
||||
height="10"
|
||||
alt="({{ field.help_text|striptags }})"
|
||||
title="{{ field.help_text|striptags }}">
|
||||
{% endif %}
|
||||
</th>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
|
||||
<th>{% translate "Delete?" %}</th>
|
||||
{% endif %}
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for inline_admin_form in inline_admin_formset %}
|
||||
{% if inline_admin_form.form.non_field_errors %}
|
||||
<tr class="row-form-errors">
|
||||
<td colspan="{{ inline_admin_form|cell_count }}">
|
||||
{{ inline_admin_form.form.non_field_errors }}
|
||||
</td>
|
||||
</tr>
|
||||
{% endif %}
|
||||
<tr class="form-row {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last and inline_admin_formset.has_add_permission %} empty-form{% endif %}"
|
||||
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}">
|
||||
<td class="original">
|
||||
{% if inline_admin_form.original or inline_admin_form.show_url %}
|
||||
<p>
|
||||
{% if inline_admin_form.original %}
|
||||
{{ inline_admin_form.original }}
|
||||
{% if inline_admin_form.model_admin.show_change_link and inline_admin_form.model_admin.has_registered_model %}
|
||||
<a href="{% url inline_admin_form.model_admin.opts|admin_urlname:'change' inline_admin_form.original.pk|admin_urlquote %}"
|
||||
class="{% if inline_admin_formset.has_change_permission %}inlinechangelink{% else %}inlineviewlink{% endif %}">
|
||||
{% if inline_admin_formset.has_change_permission %}{% translate "Change" %}{% else %}{% translate "View" %}{% endif %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if inline_admin_form.show_url %}
|
||||
<a href="{{ inline_admin_form.absolute_url }}">
|
||||
{% translate "View on site" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if inline_admin_form.needs_explicit_pk_field %}{{ inline_admin_form.pk_field.field }}{% endif %}
|
||||
{% if inline_admin_form.fk_field %}{{ inline_admin_form.fk_field.field }}{% endif %}
|
||||
{% spaceless %}
|
||||
{% for fieldset in inline_admin_form %}
|
||||
{% for line in fieldset %}
|
||||
{% for field in line %}
|
||||
{% if not field.is_readonly and field.field.is_hidden %}{{ field.field }}{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endspaceless %}
|
||||
</td>
|
||||
{% for fieldset in inline_admin_form %}
|
||||
{% for line in fieldset %}
|
||||
{% for field in line %}
|
||||
{% if field.is_readonly or not field.field.is_hidden %}
|
||||
<td{% if field.field.name %}class="field-{{ field.field.name }}"{% endif %}>
|
||||
{% if field.is_readonly %}
|
||||
<p>
|
||||
{{ field.contents }}
|
||||
</p>
|
||||
{% else %}
|
||||
{{ field.field.errors.as_ul }}
|
||||
{{ field.field }}
|
||||
{% endif %}
|
||||
</td>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
{% if inline_admin_formset.formset.can_delete and inline_admin_formset.has_delete_permission %}
|
||||
<td class="delete">
|
||||
{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}
|
||||
</td>
|
||||
{% endif %}
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
17
tests/django_admin/admin/filter.html
Normal file
17
tests/django_admin/admin/filter.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{% load i18n %}
|
||||
<h3>
|
||||
{% blocktranslate with filter_title=title %}
|
||||
By {{ filter_title }}
|
||||
{% endblocktranslate %}
|
||||
</h3>
|
||||
<ul>
|
||||
{% for choice in choices %}
|
||||
<li
|
||||
{% if choice.selected %}class="selected" {% endif %}
|
||||
>
|
||||
<a href="{{ choice.query_string|iriencode }}" title="{{ choice.display }}">
|
||||
{{ choice.display }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
37
tests/django_admin/admin/includes/fieldset.html
Normal file
37
tests/django_admin/admin/includes/fieldset.html
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<fieldset class="module aligned {{ fieldset.classes }}">
|
||||
{% if fieldset.name %}<h2>{{ fieldset.name }}</h2>{% endif %}
|
||||
{% if fieldset.description %}
|
||||
<div class="description">
|
||||
{{ fieldset.description|safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
{% for line in fieldset %}
|
||||
<div class="form-row{% if line.fields|length_is:'1' and line.errors %} errors{% endif %}{% if not line.has_visible_field %}hidden{% endif %}{% for field in line %}{% if field.field.name %}field-{{ field.field.name }}{% endif %}{% endfor %}">
|
||||
{% if line.fields|length_is:'1' %}{{ line.errors }}{% endif %}
|
||||
{% for field in line %}
|
||||
<div
|
||||
{% if not line.fields|length_is:'1' %}
|
||||
class="fieldBox {% if field.field.name %}field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %}hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
|
||||
{% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
|
||||
{% if field.is_checkbox %}
|
||||
{{ field.field }}{{ field.label_tag }}
|
||||
{% else %}
|
||||
{{ field.label_tag }}
|
||||
{% if field.is_readonly %}
|
||||
<div class="readonly">
|
||||
{{ field.contents }}
|
||||
</div>
|
||||
{% else %}
|
||||
{{ field.field }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% if field.field.help_text %}
|
||||
<div class="help">
|
||||
{{ field.field.help_text|safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</fieldset>
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
{% load i18n %}
|
||||
<h2>{% translate "Summary" %}</h2>
|
||||
<ul>
|
||||
{% for model_name, object_count in model_count %}
|
||||
<li>
|
||||
{{ model_name|capfirst }}: {{ object_count }}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
53
tests/django_admin/admin/index.html
Normal file
53
tests/django_admin/admin/index.html
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n static %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}">
|
||||
{% endblock %}
|
||||
{% block coltype %}colMS{% endblock %}
|
||||
{% block bodyclass %}{{ block.super }} dashboard{% endblock %}
|
||||
{% block breadcrumbs %}{% endblock %}
|
||||
{% block nav-sidebar %}{% endblock %}
|
||||
{% block content %}
|
||||
<div id="content-main">
|
||||
{% include "admin/app_list.html" with app_list=app_list show_changelinks=True %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block sidebar %}
|
||||
<div id="content-related">
|
||||
<div class="module" id="recent-actions-module">
|
||||
<h2>{% translate 'Recent actions' %}</h2>
|
||||
<h3>{% translate 'My actions' %}</h3>
|
||||
{% load log %}
|
||||
{% get_admin_log 10 as admin_log for_user user %}
|
||||
{% if not admin_log %}
|
||||
<p>
|
||||
{% translate 'None available' %}
|
||||
</p>
|
||||
{% else %}
|
||||
<ul class="actionlist">
|
||||
{% for entry in admin_log %}
|
||||
<li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">
|
||||
{% if entry.is_deletion or not entry.get_admin_url %}
|
||||
{{ entry.object_repr }}
|
||||
{% else %}
|
||||
<a href="{{ entry.get_admin_url }}">
|
||||
{{ entry.object_repr }}
|
||||
</a>
|
||||
{% endif %}
|
||||
<br>
|
||||
{% if entry.content_type %}
|
||||
<span class="mini quiet">
|
||||
{% filter capfirst %}{{ entry.content_type.name }}
|
||||
{% endfilter %}
|
||||
</span>
|
||||
{% else %}
|
||||
<span class="mini quiet">{% translate 'Unknown content' %}</span>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
13
tests/django_admin/admin/invalid_setup.html
Normal file
13
tests/django_admin/admin/invalid_setup.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {{ title }}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<p>
|
||||
{% translate 'Something’s wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user.' %}
|
||||
</p>
|
||||
{% endblock %}
|
||||
64
tests/django_admin/admin/login.html
Normal file
64
tests/django_admin/admin/login.html
Normal file
|
|
@ -0,0 +1,64 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n static %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/login.css" %}">
|
||||
{{ form.media }}
|
||||
{% endblock %}
|
||||
{% block bodyclass %}{{ block.super }} login{% endblock %}
|
||||
{% block usertools %}{% endblock %}
|
||||
{% block nav-global %}{% endblock %}
|
||||
{% block nav-sidebar %}{% endblock %}
|
||||
{% block content_title %}{% endblock %}
|
||||
{% block breadcrumbs %}{% endblock %}
|
||||
{% block content %}
|
||||
{% if form.errors and not form.non_field_errors %}
|
||||
<p class="errornote">
|
||||
{% if form.errors.items|length == 1 %}
|
||||
{% translate "Please correct the error below." %}
|
||||
{% else %}
|
||||
{% translate "Please correct the errors below." %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if form.non_field_errors %}
|
||||
{% for error in form.non_field_errors %}
|
||||
<p class="errornote">
|
||||
{{ error }}
|
||||
</p>
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
<div id="content-main">
|
||||
{% if user.is_authenticated %}
|
||||
<p class="errornote">
|
||||
{% blocktranslate trimmed %}
|
||||
You are authenticated as {{ username }}, but are not authorized to
|
||||
access this page. Would you like to login to a different account?
|
||||
{% endblocktranslate %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<form action="{{ app_path }}" method="post" id="login-form">
|
||||
{% csrf_token %}
|
||||
<div class="form-row">
|
||||
{{ form.username.errors }}
|
||||
{{ form.username.label_tag }} {{ form.username }}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
{{ form.password.errors }}
|
||||
{{ form.password.label_tag }} {{ form.password }}
|
||||
<input type="hidden" name="next" value="{{ next }}">
|
||||
</div>
|
||||
{% url 'admin_password_reset' as password_reset_url %}
|
||||
{% if password_reset_url %}
|
||||
<div class="password-reset-link">
|
||||
<a href="{{ password_reset_url }}">
|
||||
{% translate 'Forgotten your password or username?' %}
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="submit-row">
|
||||
<input type="submit" value="{% translate 'Log in' %}">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
11
tests/django_admin/admin/nav_sidebar.html
Normal file
11
tests/django_admin/admin/nav_sidebar.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{% load i18n %}
|
||||
<button class="sticky toggle-nav-sidebar"
|
||||
id="toggle-nav-sidebar"
|
||||
aria-label="{% translate 'Toggle navigation' %}"></button>
|
||||
<nav class="sticky" id="nav-sidebar">
|
||||
<input type="search"
|
||||
id="nav-filter"
|
||||
placeholder="{% translate 'Start typing to filter...' %}"
|
||||
aria-label="{% translate 'Filter navigation items' %}">
|
||||
{% include 'admin/app_list.html' with app_list=available_apps show_changelinks=False %}
|
||||
</nav>
|
||||
53
tests/django_admin/admin/object_history.html
Normal file
53
tests/django_admin/admin/object_history.html
Normal file
|
|
@ -0,0 +1,53 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n admin_urls %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
›
|
||||
<a href="{% url 'admin:app_list' app_label=opts.app_label %}">
|
||||
{{ opts.app_config.verbose_name }}
|
||||
</a>
|
||||
›
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}">
|
||||
{{ module_name }}
|
||||
</a>
|
||||
›
|
||||
<a href="{% url opts|admin_urlname:'change' object.pk|admin_urlquote %}">
|
||||
{{ object|truncatewords:"18" }}
|
||||
</a>
|
||||
› {% translate 'History' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div id="content-main">
|
||||
<div class="module">
|
||||
{% if action_list %}
|
||||
<table id="change-history">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{% translate 'Date/time' %}</th>
|
||||
<th scope="col">{% translate 'User' %}</th>
|
||||
<th scope="col">{% translate 'Action' %}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for action in action_list %}
|
||||
<tr>
|
||||
<th scope="row">{{ action.action_time|date:"DATETIME_FORMAT" }}</th>
|
||||
<td>
|
||||
{{ action.user.get_username }}
|
||||
{% if action.user.get_full_name %}({{ action.user.get_full_name }}){% endif %}
|
||||
</td>
|
||||
<td>{{ action.get_change_message }}</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>
|
||||
{% translate 'This object doesn’t have a change history. It probably wasn’t added via this admin site.' %}
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
23
tests/django_admin/admin/pagination.html
Normal file
23
tests/django_admin/admin/pagination.html
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
{% load admin_list %}
|
||||
{% load i18n %}
|
||||
<p class="paginator">
|
||||
{% if pagination_required %}
|
||||
{% for i in page_range %}
|
||||
{% paginator_number cl i %}
|
||||
{% endfor %}
|
||||
{% endif %}
|
||||
{{ cl.result_count }}
|
||||
{% if cl.result_count == 1 %}
|
||||
{{ cl.opts.verbose_name }}
|
||||
{% else %}
|
||||
{{ cl.opts.verbose_name_plural }}
|
||||
{% endif %}
|
||||
{% if show_all_url %}
|
||||
<a href="{{ show_all_url }}" class="showall">
|
||||
{% translate 'Show all' %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if cl.formset and cl.result_count %}
|
||||
<input type="submit" name="_save" class="default" value="{% translate 'Save' %}">
|
||||
{% endif %}
|
||||
</p>
|
||||
10
tests/django_admin/admin/popup_response.html
Normal file
10
tests/django_admin/admin/popup_response.html
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{% load i18n static %}
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>{% translate 'Popup closing…' %}</title>
|
||||
</head>
|
||||
<body>
|
||||
<script id="django-admin-popup-response-constants" src="{% static "admin/js/popup_response.js" %}" data-popup-response="{{ popup_response_data }}"></script>
|
||||
</body>
|
||||
</html>
|
||||
2
tests/django_admin/admin/prepopulated_fields_js.html
Normal file
2
tests/django_admin/admin/prepopulated_fields_js.html
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
{% load static %}
|
||||
<script id="django-admin-prepopulated-fields-constants" src="{% static "admin/js/prepopulate_init.js" %}" data-prepopulated-fields="{{ prepopulated_fields_json }}"></script>
|
||||
44
tests/django_admin/admin/search_form.html
Normal file
44
tests/django_admin/admin/search_form.html
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
{% load i18n static %}
|
||||
{% if cl.search_fields %}
|
||||
<div id="toolbar">
|
||||
<form id="changelist-search" method="get">
|
||||
<div>
|
||||
<!-- DIV needed for valid HTML -->
|
||||
<label for="searchbar">
|
||||
<img src="{% static "admin/img/search.svg" %}" alt="Search">
|
||||
</label>
|
||||
<input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar">
|
||||
<input type="submit" value="{% translate 'Search' %}">
|
||||
{% if show_result_count %}
|
||||
<span class="small quiet">
|
||||
{% blocktranslate count counter=cl.result_count %}
|
||||
{{ counter }} result{% plural %}{{ counter }} results
|
||||
{% endblocktranslate %}
|
||||
(
|
||||
<a href="?{% if cl.is_popup %}{{ is_popup_var }}=1{% endif %}">
|
||||
{% if cl.show_full_result_count %}
|
||||
{% blocktranslate with full_result_count=cl.full_result_count %}
|
||||
{{ full_result_count }} total
|
||||
{% endblocktranslate %}
|
||||
{% else %}
|
||||
{% translate "Show all" %}
|
||||
{% endif %}
|
||||
</a>
|
||||
)
|
||||
</span>
|
||||
{% endif %}
|
||||
{% for pair in cl.params.items %}
|
||||
{% if pair.0 != search_var %}
|
||||
<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}">
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% if cl.search_help_text %}
|
||||
<br class="clear">
|
||||
<div class="help">
|
||||
{{ cl.search_help_text }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</form>
|
||||
</div>
|
||||
{% endif %}
|
||||
32
tests/django_admin/admin/submit_line.html
Normal file
32
tests/django_admin/admin/submit_line.html
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
{% load i18n admin_urls %}
|
||||
<div class="submit-row">
|
||||
{% block submit-row %}
|
||||
{% if show_save %}
|
||||
<input type="submit" value="{% translate 'Save' %}" class="default" name="_save">
|
||||
{% endif %}
|
||||
{% if show_delete_link and original %}
|
||||
{% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
|
||||
<p class="deletelink-box">
|
||||
<a href="{% add_preserved_filters delete_url %}" class="deletelink">
|
||||
{% translate "Delete" %}
|
||||
</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if show_save_as_new %}
|
||||
<input type="submit" value="{% translate 'Save as new' %}" name="_saveasnew">
|
||||
{% endif %}
|
||||
{% if show_save_and_add_another %}
|
||||
<input type="submit" value="{% translate 'Save and add another' %}" name="_addanother">
|
||||
{% endif %}
|
||||
{% if show_save_and_continue %}
|
||||
<input type="submit"
|
||||
value="{% if can_change %} {% translate 'Save and continue editing' %}{% else %}{% translate 'Save and view' %}{% endif %}"
|
||||
name="_continue">
|
||||
{% endif %}
|
||||
{% if show_close %}
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}" class="closelink">
|
||||
{% translate 'Close' %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
21
tests/django_admin/admin/widgets/clearable_file_input.html
Normal file
21
tests/django_admin/admin/widgets/clearable_file_input.html
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
{% if widget.is_initial %}
|
||||
<p class="file-upload">
|
||||
{{ widget.initial_text }}:
|
||||
<a href="{{ widget.value.url }}">{{ widget.value }}</a>
|
||||
{% if not widget.required %}
|
||||
<span class="clearable-file-input">
|
||||
<input type="checkbox" name="{{ widget.checkbox_name }}" id="{{ widget.checkbox_id }}"
|
||||
{% if widget.attrs.disabled %}disabled {% endif %}
|
||||
>
|
||||
<label for="{{ widget.checkbox_id }}">
|
||||
{{ widget.clear_checkbox_label }}
|
||||
</label>
|
||||
</span>
|
||||
{% endif %}
|
||||
<br>
|
||||
{{ widget.input_text }}:
|
||||
{% endif %}
|
||||
<input type="{{ widget.type }}" name="{{ widget.name }}"
|
||||
{% include "django/forms/widgets/attrs.html" %}
|
||||
>
|
||||
{% if widget.is_initial %}</p>{% endif %}
|
||||
11
tests/django_admin/admin/widgets/foreign_key_raw_id.html
Normal file
11
tests/django_admin/admin/widgets/foreign_key_raw_id.html
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
{% include 'django/forms/widgets/input.html' %}
|
||||
{% if related_url %}
|
||||
<a href="{{ related_url }}" class="related-lookup" id="lookup_id_{{ widget.name }}" title="{{ link_title }}"></a>
|
||||
{% endif %}
|
||||
{% if link_label %}
|
||||
<strong>
|
||||
{% if link_url %}<a href="{{ link_url }}">{% endif %}
|
||||
{{ link_label }}
|
||||
{% if link_url %}</a>{% endif %}
|
||||
</strong>
|
||||
{% endif %}
|
||||
|
|
@ -0,0 +1 @@
|
|||
{% include 'admin/widgets/foreign_key_raw_id.html' %}
|
||||
1
tests/django_admin/admin/widgets/radio.html
Normal file
1
tests/django_admin/admin/widgets/radio.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
{% include "django/forms/widgets/multiple_input.html" %}
|
||||
34
tests/django_admin/admin/widgets/related_widget_wrapper.html
Normal file
34
tests/django_admin/admin/widgets/related_widget_wrapper.html
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
{% load i18n static %}
|
||||
<div class="related-widget-wrapper">
|
||||
{{ rendered_widget }}
|
||||
{% block links %}
|
||||
{% spaceless %}
|
||||
{% if not is_hidden %}
|
||||
{% if can_change_related %}
|
||||
<a class="related-widget-wrapper-link change-related"
|
||||
id="change_id_{{ name }}"
|
||||
data-href-template="{{ change_related_template_url }}?{{ url_params }}"
|
||||
title="{% blocktranslate %}Change selected {{ model }}{% endblocktranslate %}">
|
||||
<img src="{% static 'admin/img/icon-changelink.svg' %}" alt="{% translate 'Change' %}">
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if can_add_related %}
|
||||
<a class="related-widget-wrapper-link add-related"
|
||||
id="add_id_{{ name }}"
|
||||
href="{{ add_related_url }}?{{ url_params }}"
|
||||
title="{% blocktranslate %}Add another {{ model }}{% endblocktranslate %}">
|
||||
<img src="{% static 'admin/img/icon-addlink.svg' %}" alt="{% translate 'Add' %}">
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if can_delete_related %}
|
||||
<a class="related-widget-wrapper-link delete-related"
|
||||
id="delete_id_{{ name }}"
|
||||
data-href-template="{{ delete_related_template_url }}?{{ url_params }}"
|
||||
title="{% blocktranslate %}Delete selected {{ model }}{% endblocktranslate %}">
|
||||
<img src="{% static 'admin/img/icon-deletelink.svg' %}" alt="{% translate 'Delete' %}">
|
||||
</a>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endspaceless %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
7
tests/django_admin/admin/widgets/split_datetime.html
Normal file
7
tests/django_admin/admin/widgets/split_datetime.html
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
<p class="datetime">
|
||||
{{ date_label }} {% with widget=widget.subwidgets.0 %}
|
||||
{% include widget.template_name %}{% endwith %}
|
||||
<br>
|
||||
{{ time_label }} {% with widget=widget.subwidgets.1 %}
|
||||
{% include widget.template_name %}{% endwith %}
|
||||
</p>
|
||||
9
tests/django_admin/admin/widgets/url.html
Normal file
9
tests/django_admin/admin/widgets/url.html
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{% if url_valid %}
|
||||
<p class="url">
|
||||
{{ current_label }}
|
||||
<a href="{{ widget.href }}">{{ widget.value }}</a>
|
||||
<br>
|
||||
{{ change_label }}
|
||||
{% endif %}
|
||||
{% include "django/forms/widgets/input.html" %}
|
||||
{% if url_valid %}</p>{% endif %}
|
||||
16
tests/django_admin/registration/logged_out.html
Normal file
16
tests/django_admin/registration/logged_out.html
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block nav-sidebar %}{% endblock %}
|
||||
{% block content %}
|
||||
<p>
|
||||
{% translate "Thanks for spending some quality time with the Web site today." %}
|
||||
</p>
|
||||
<p>
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Log in again' %}</a>
|
||||
</p>
|
||||
{% endblock %}
|
||||
24
tests/django_admin/registration/password_change_done.html
Normal file
24
tests/django_admin/registration/password_change_done.html
Normal file
|
|
@ -0,0 +1,24 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n %}
|
||||
{% block userlinks %}
|
||||
{% url 'django-admindocs-docroot' as docsroot %}
|
||||
{% if docsroot %}
|
||||
<a href="{{ docsroot }}">{% translate 'Documentation' %}</a>
|
||||
/
|
||||
{% endif %}
|
||||
{% translate 'Change password' %} /
|
||||
<a href="{% url 'admin:logout' %}">
|
||||
{% translate 'Log out' %}
|
||||
</a>
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {% translate 'Password change' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<p>
|
||||
{% translate 'Your password was changed.' %}
|
||||
</p>
|
||||
{% endblock %}
|
||||
71
tests/django_admin/registration/password_change_form.html
Normal file
71
tests/django_admin/registration/password_change_form.html
Normal file
|
|
@ -0,0 +1,71 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n static %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">
|
||||
{% endblock %}
|
||||
{% block userlinks %}
|
||||
{% url 'django-admindocs-docroot' as docsroot %}
|
||||
{% if docsroot %}
|
||||
<a href="{{ docsroot }}">{% translate 'Documentation' %}</a>
|
||||
/
|
||||
{% endif %}
|
||||
{% translate 'Change password' %} /
|
||||
<a href="{% url 'admin:logout' %}">
|
||||
{% translate 'Log out' %}
|
||||
</a>
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {% translate 'Password change' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div id="content-main">
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<div>
|
||||
{% if form.errors %}
|
||||
<p class="errornote">
|
||||
{% if form.errors.items|length == 1 %}
|
||||
{% translate "Please correct the error below." %}
|
||||
{% else %}
|
||||
{% translate "Please correct the errors below." %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{% endif %}
|
||||
<p>
|
||||
{% translate 'Please enter your old password, for security’s sake, and then enter your new password twice so we can verify you typed it in correctly.' %}
|
||||
</p>
|
||||
<fieldset class="module aligned wide">
|
||||
<div class="form-row">
|
||||
{{ form.old_password.errors }}
|
||||
{{ form.old_password.label_tag }} {{ form.old_password }}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
{{ form.new_password1.errors }}
|
||||
{{ form.new_password1.label_tag }} {{ form.new_password1 }}
|
||||
{% if form.new_password1.help_text %}
|
||||
<div class="help">
|
||||
{{ form.new_password1.help_text|safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="form-row">
|
||||
{{ form.new_password2.errors }}
|
||||
{{ form.new_password2.label_tag }} {{ form.new_password2 }}
|
||||
{% if form.new_password2.help_text %}
|
||||
<div class="help">
|
||||
{{ form.new_password2.help_text|safe }}
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</fieldset>
|
||||
<div class="submit-row">
|
||||
<input type="submit" value="{% translate 'Change my password' %}" class="default">
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
16
tests/django_admin/registration/password_reset_complete.html
Normal file
16
tests/django_admin/registration/password_reset_complete.html
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {% translate 'Password reset' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<p>
|
||||
{% translate "Your password has been set. You may go ahead and log in now." %}
|
||||
</p>
|
||||
<p>
|
||||
<a href="{{ login_url }}">{% translate 'Log in' %}</a>
|
||||
</p>
|
||||
{% endblock %}
|
||||
44
tests/django_admin/registration/password_reset_confirm.html
Normal file
44
tests/django_admin/registration/password_reset_confirm.html
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n static %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {% translate 'Password reset confirmation' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{% if validlink %}
|
||||
<p>
|
||||
{% translate "Please enter your new password twice so we can verify you typed it in correctly." %}
|
||||
</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<fieldset class="module aligned">
|
||||
<input class="hidden" autocomplete="username" value="{{ form.user.get_username }}">
|
||||
<div class="form-row field-password1">
|
||||
{{ form.new_password1.errors }}
|
||||
<label for="id_new_password1">
|
||||
{% translate 'New password:' %}
|
||||
</label>
|
||||
{{ form.new_password1 }}
|
||||
</div>
|
||||
<div class="form-row field-password2">
|
||||
{{ form.new_password2.errors }}
|
||||
<label for="id_new_password2">
|
||||
{% translate 'Confirm password:' %}
|
||||
</label>
|
||||
{{ form.new_password2 }}
|
||||
</div>
|
||||
<input type="submit" value="{% translate 'Change my password' %}">
|
||||
</fieldset>
|
||||
</form>
|
||||
{% else %}
|
||||
<p>
|
||||
{% translate "The password reset link was invalid, possibly because it has already been used. Please request a new password reset." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
16
tests/django_admin/registration/password_reset_done.html
Normal file
16
tests/django_admin/registration/password_reset_done.html
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {% translate 'Password reset' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<p>
|
||||
{% translate 'We’ve emailed you instructions for setting your password, if an account exists with the email you entered. You should receive them shortly.' %}
|
||||
</p>
|
||||
<p>
|
||||
{% translate 'If you don’t receive an email, please make sure you’ve entered the address you registered with, and check your spam folder.' %}
|
||||
</p>
|
||||
{% endblock %}
|
||||
15
tests/django_admin/registration/password_reset_email.html
Normal file
15
tests/django_admin/registration/password_reset_email.html
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
{% load i18n %}
|
||||
{% autoescape off %}
|
||||
{% blocktranslate %}
|
||||
You're receiving this email because you requested a password reset for your user account at {{ site_name }}.
|
||||
{% endblocktranslate %}
|
||||
{% translate "Please go to the following page and choose a new password:" %}
|
||||
{% block reset_link %}
|
||||
{{ protocol }}://{{ domain }}{% url 'password_reset_confirm' uidb64=uid token=token %}
|
||||
{% endblock %}
|
||||
{% translate 'Your username, in case you’ve forgotten:' %} {{ user.get_username }}
|
||||
{% translate "Thanks for using our site!" %}
|
||||
{% blocktranslate %}
|
||||
The {{ site_name }} team
|
||||
{% endblocktranslate %}
|
||||
{% endautoescape %}
|
||||
30
tests/django_admin/registration/password_reset_form.html
Normal file
30
tests/django_admin/registration/password_reset_form.html
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
{% extends "admin/base_site.html" %}
|
||||
{% load i18n static %}
|
||||
{% block extrastyle %}
|
||||
{{ block.super }}
|
||||
<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}">
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% translate 'Home' %}</a>
|
||||
› {% translate 'Password reset' %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<p>
|
||||
{% translate 'Forgotten your password? Enter your email address below, and we’ll email instructions for setting a new one.' %}
|
||||
</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
<fieldset class="module aligned">
|
||||
<div class="form-row field-email">
|
||||
{{ form.email.errors }}
|
||||
<label for="id_email">
|
||||
{% translate 'Email address:' %}
|
||||
</label>
|
||||
{{ form.email }}
|
||||
</div>
|
||||
<input type="submit" value="{% translate 'Reset my password' %}">
|
||||
</fieldset>
|
||||
</form>
|
||||
{% endblock %}
|
||||
17
tests/django_cms/admin/cms/extensions/change_form.html
Normal file
17
tests/django_cms/admin/cms/extensions/change_form.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{% extends "admin/change_form.html" %}
|
||||
{% load i18n admin_urls %}
|
||||
{% block submit_buttons_bottom %}
|
||||
<div class="submit-row"
|
||||
{% if is_popup %}style="overflow: auto;" {% endif %}
|
||||
>
|
||||
<input type="submit" name="_save" class="default" value="{% trans 'Save' %}"/>
|
||||
{% if not add %}
|
||||
<p class="deletelink-box">
|
||||
{% url opts|admin_urlname:'delete' original.pk|admin_urlquote as delete_url %}
|
||||
<a href="{% add_preserved_filters delete_url %}" class="deletelink">
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
73
tests/django_cms/admin/cms/mail/base.html
Normal file
73
tests/django_cms/admin/cms/mail/base.html
Normal file
|
|
@ -0,0 +1,73 @@
|
|||
{% load i18n %}
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head height="100%">
|
||||
<title>{{ title }}</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="Content-Language" content="en-us" />
|
||||
<style type="text/css">
|
||||
html,
|
||||
body,
|
||||
.grid {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.header {
|
||||
margin-bottom: 40px;
|
||||
}
|
||||
|
||||
.content {
|
||||
padding: 28px;
|
||||
font-family: Lucida Grande;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.content h1 {
|
||||
font-size: 20px;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.content a,
|
||||
.content a:active,
|
||||
.content a:visited,
|
||||
.content a:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.data {
|
||||
line-height: 24px;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" height="100%">
|
||||
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="100%" class="grid">
|
||||
<tr>
|
||||
<td width="100%" class="content" valign="top">
|
||||
<div class="header">
|
||||
<h1>{{ title }}</h1>
|
||||
{% block header %}{% endblock %}
|
||||
</div>
|
||||
{% block content %}{% endblock %}
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="content">
|
||||
<p>
|
||||
{% blocktrans %}
|
||||
Log in to administration
|
||||
<a href="{{ login_url }}">here</a>
|
||||
.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
<p>
|
||||
Generated by
|
||||
<a href="https://www.django-cms.org">
|
||||
django cms
|
||||
</a>
|
||||
{% now "d.m.Y H:i:s" %}.
|
||||
</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</body>
|
||||
</html>
|
||||
10
tests/django_cms/admin/cms/mail/base.txt
Normal file
10
tests/django_cms/admin/cms/mail/base.txt
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
{% load i18n %}
|
||||
|
||||
{{ title }}
|
||||
--------------
|
||||
{% block header %}{% endblock %}
|
||||
{% block content %}{% endblock %}
|
||||
|
||||
{% blocktrans %}Login url: {{ login_url }}{% endblocktrans %}
|
||||
|
||||
[Generated by: http://www.django-cms.org {% now "d.m.Y H:i:s" %}.]
|
||||
14
tests/django_cms/admin/cms/mail/page_user_change.html
Normal file
14
tests/django_cms/admin/cms/mail/page_user_change.html
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
{% extends 'admin/cms/mail/base.html' %}
|
||||
{% load i18n %}
|
||||
{% block content %}
|
||||
<table>
|
||||
<tr>
|
||||
<td>{% trans 'Username:' %}</td>
|
||||
<td>{{ user.username }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>{% trans 'Password:' %}</td>
|
||||
<td>{{ password }}</td>
|
||||
</tr>
|
||||
</table>
|
||||
{% endblock %}
|
||||
7
tests/django_cms/admin/cms/mail/page_user_change.txt
Normal file
7
tests/django_cms/admin/cms/mail/page_user_change.txt
Normal file
|
|
@ -0,0 +1,7 @@
|
|||
{% extends 'admin/cms/mail/base.txt' %}
|
||||
{% load i18n %}
|
||||
|
||||
{% block content %}
|
||||
{% trans 'Username:' %} {{ user.username }}
|
||||
{% trans 'Password:' %} {{ password }}
|
||||
{% endblock %}
|
||||
130
tests/django_cms/admin/cms/page/change_form.html
Normal file
130
tests/django_cms/admin/cms/page/change_form.html
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
{% extends "admin/change_form.html" %}
|
||||
{% load i18n admin_urls static admin_modify admin_urls cms_admin cms_static %}
|
||||
{% block title %}
|
||||
{% if add %}
|
||||
{% trans 'Add a page' %}
|
||||
{% else %}
|
||||
{% trans "Change a page" %}
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% trans 'Home' %}</a>
|
||||
›
|
||||
<a href="{% url 'admin:app_list' app_label=opts.app_label %}">
|
||||
{{ opts.app_config.verbose_name }}
|
||||
</a>
|
||||
›
|
||||
{% if has_change_permission %}
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}">
|
||||
{{ opts.verbose_name_plural|capfirst }}
|
||||
</a>
|
||||
{% else %}
|
||||
{{ opts.verbose_name_plural|capfirst }}
|
||||
{% endif %}
|
||||
›
|
||||
{% if add %}
|
||||
{% trans 'Add' %} {{ opts.verbose_name }}
|
||||
{% else %}
|
||||
{{ original|truncatewords:"18" }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block extrahead %}
|
||||
<script src="{% static "admin/js/urlify.js" %}" type="text/javascript"></script>
|
||||
<script src="{% static_with_version "cms/js/dist/bundle.admin.base.min.js" %}" type="text/javascript"></script>
|
||||
<script src="{% static_with_version "cms/js/dist/bundle.admin.changeform.min.js" %}" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
if (!window.jQuery) {
|
||||
window.jQuery = CMS.$;
|
||||
window.$ = window.jQuery;
|
||||
}
|
||||
</script>
|
||||
{{ block.super }}
|
||||
{% endblock %}
|
||||
{% block content_title %}
|
||||
{% if title %}<h1>{{ title }}</h1>{% endif %}
|
||||
{% if not popup and not add %}
|
||||
<ul class="object-tools hide-in-modal">
|
||||
<li>
|
||||
{% url opts|admin_urlname:'preview_page' page.id language as admin_url %}
|
||||
<a href="{{ admin_url }}" target="_parent">{% trans "View on site" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<div id="content-main">
|
||||
{% block object-tools %}{% endblock %}
|
||||
<form {% if has_file_field %}enctype="multipart/form-data"
|
||||
{% endif %}action="?language={{ language }}{% if request.GET.parent_node %}&parent_node={{ request.GET.parent_node }}{% endif %}{% if request.GET.source %}&source={{ request.GET.source }}{% endif %}"
|
||||
method="post"
|
||||
id="page_form">
|
||||
{% csrf_token %}
|
||||
{% block form_top %}{% endblock %}
|
||||
<div style="display: none;"><input type="hidden"
|
||||
name="language"
|
||||
value="{{ language }}"
|
||||
id="id_language"/></div>
|
||||
{% if show_language_tabs and not show_permissions %}
|
||||
<div id="page_form_lang_tabs">
|
||||
{% for lang_code, lang_name in language_tabs %}
|
||||
<input type="button"
|
||||
onclick="CMS.API.changeLanguage('./?language={{ lang_code }}');"
|
||||
class="language_button {% if lang_code == language %}selected{% else %}{% if not lang_code in filled_languages %} notfilled{% endif %}{% endif %}"
|
||||
id="{{ lang_code }}button"
|
||||
name="{{ lang_code }}"
|
||||
value="{{ lang_name }}"/>
|
||||
{% endfor %}
|
||||
<div class="lang_tabs_line"></div>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div id="lang_tab_content">
|
||||
{% if is_popup %}<input type="hidden" name="_popup" value="1" />{% endif %}
|
||||
{% if save_on_top %}{% submit_row %}{% endif %}
|
||||
{% if errors %}
|
||||
<p class="errornote">
|
||||
{% blocktrans count errors|length as counter %}Please correct the error below.{% plural %}Please correct the errors below.{% endblocktrans %}
|
||||
</p>
|
||||
<ul class="errorlist">{% for error in adminform.form.non_field_errors %}<li>{{ error }}</li>{% endfor %}</ul>
|
||||
{% endif %}
|
||||
{% for fieldset in adminform %}
|
||||
{% include "admin/cms/page/includes/fieldset.html" %}{% endfor %}
|
||||
{% for inline_admin_formset in inline_admin_formsets %}
|
||||
{% include inline_admin_formset.opts.template %}{% endfor %}
|
||||
{% if show_permissions %}
|
||||
{% if CMS_PERMISSION and can_change_permissions %}
|
||||
<div class="inline-group">
|
||||
<div class="tabular inline-related">
|
||||
<fieldset id="inherited_permissions" class="module aligned collapse">
|
||||
<h2>{% trans 'All permissions' %}</h2>
|
||||
<div class="loading" rel="../permissions/">{% trans 'Loading...' %}</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% block after_related_objects %}{% endblock %}
|
||||
{% if add %}
|
||||
<div class="submit-row" {% if is_popup %} style="overflow: auto;">
|
||||
<input type="submit" name="_save" class="default" value="{% trans 'Save' %}"/>
|
||||
<input type="submit" name="_continue" value="{% trans 'Save and continue editing' %}"/>
|
||||
</div>
|
||||
{% else %}
|
||||
{% page_submit_row %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% block admin_change_form_document_ready %}
|
||||
{{ block.super }}
|
||||
{% endblock %}
|
||||
{% for url in unihandecode_urls %}<script src="{{ url }}" type="text/javascript"></script>{% endfor %}
|
||||
{% if unihandecode_urls %}
|
||||
<script>
|
||||
var UNIHANDECODER = unihandecode.Unihan('{{ unihandecode_lang }}');
|
||||
</script>
|
||||
{% endif %}
|
||||
{# JavaScript for prepopulated fields #}
|
||||
{% prepopulated_fields_js %}
|
||||
{% endblock %}
|
||||
37
tests/django_cms/admin/cms/page/close_frame.html
Normal file
37
tests/django_cms/admin/cms/page/close_frame.html
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
{% extends "admin/change_form.html" %}
|
||||
{% load i18n l10n static cms_static %}
|
||||
{% block title %}
|
||||
{% trans "Change a page" %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
{# trick for cms to understand that the plugin was actually correctly saved #}
|
||||
<div class="messagelist">
|
||||
<div class="success"></div>
|
||||
</div>
|
||||
<script>
|
||||
window.CMS || window.parent.CMS || document.write(
|
||||
'<script src="{% static_with_version "cms/js/dist/bundle.admin.base.min.js" %}" type="text/javascript"><\/script>'
|
||||
);
|
||||
</script>
|
||||
<script>
|
||||
// we have a special case here cause the CMS namespace
|
||||
// can be either inside the current window or the parent
|
||||
(function(Window) {
|
||||
// the dataBridge is used to access plugin information from different resources
|
||||
// Do NOT move this!!!
|
||||
Window.CMS.API.Helpers.dataBridge = {{ plugin_data|safe }};
|
||||
|
||||
{% if plugin_structure %}
|
||||
Window.CMS.API.Helpers.dataBridge.structure = {{ plugin_structure|safe }};
|
||||
{% endif %}
|
||||
|
||||
Window.CMS.$(document).ready(function () {
|
||||
// make sure we're doing after the "modal" mechanism kicked in
|
||||
setTimeout(function () {
|
||||
// save current plugin
|
||||
Window.CMS.API.Helpers.onPluginSave();
|
||||
}, 100);
|
||||
});
|
||||
})(window.parent || window);
|
||||
</script>
|
||||
{% endblock %}
|
||||
1
tests/django_cms/admin/cms/page/includes/fieldset.html
Normal file
1
tests/django_cms/admin/cms/page/includes/fieldset.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
{% extends "admin/includes/fieldset.html" %}
|
||||
75
tests/django_cms/admin/cms/page/permissions.html
Normal file
75
tests/django_cms/admin/cms/page/permissions.html
Normal file
|
|
@ -0,0 +1,75 @@
|
|||
{% load i18n cms_admin cms_tags admin_urls %}
|
||||
{% if rows %}
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans "Page" %}</th>
|
||||
<th>{% trans "User" %}</th>
|
||||
<th>{% trans "Group" %}</th>
|
||||
<th>{% trans "Can edit" %}</th>
|
||||
<th>{% trans "Can add" %}</th>
|
||||
<th>{% trans "Can delete" %}</th>
|
||||
<th>{% trans "Can publish" %}</th>
|
||||
<th>{% trans "Can change permissions" %}</th>
|
||||
<th>{% trans "Can move" %}</th>
|
||||
<th>{% trans "Can view" %}</th>
|
||||
<th>
|
||||
{% trans "Grant on" %}
|
||||
</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for row in rows %}
|
||||
{% with permission=row.permission %}
|
||||
<tr class="{% cycle 'row1' 'row2' %}">
|
||||
<td class="page">
|
||||
{% if row.is_global %}
|
||||
{% if row.can_change %}
|
||||
<a href="{% cms_admin_url 'cms_globalpagepermission_change' permission.id %}">
|
||||
{% trans "(global)" %}
|
||||
</a>
|
||||
{% else %}
|
||||
{% trans "(global)" %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
{% if permission.page_id == page.id %}
|
||||
{% trans "(current)" %}
|
||||
{% else %}
|
||||
{% if row.can_change %}
|
||||
<a href="{% url opts|admin_urlname:'change' permission.page_id %}">
|
||||
{{ permission.page }}
|
||||
</a>
|
||||
{% else %}
|
||||
{{ permission.page }}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="user">{{ permission.user|default_if_none:"-" }}</td>
|
||||
<td class="group">{{ permission.group|default_if_none:"-" }}</td>
|
||||
<td class="can_change">{{ permission.can_change|boolean_icon }}</td>
|
||||
<td class="can_add">{{ permission.can_add|boolean_icon }}</td>
|
||||
<td class="can_delete">{{ permission.can_delete|boolean_icon }}</td>
|
||||
<td class="can_publish">{{ permission.can_publish|boolean_icon }}</td>
|
||||
<td class="can_change_permissions">
|
||||
{{ permission.can_change_permissions|boolean_icon }}
|
||||
</td>
|
||||
<td class="can_move_page">{{ permission.can_move_page|boolean_icon }}</td>
|
||||
<td class="can_view">{{ permission.can_view|boolean_icon }}</td>
|
||||
<td class="grant_on">
|
||||
{% if row.is_global %}
|
||||
{% trans "All" %}
|
||||
{% else %}
|
||||
{{ permission.get_grant_on_display }}
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endwith %}
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
{% else %}
|
||||
<p>
|
||||
{% trans "Page doesn't inherit any permissions." %}
|
||||
</p>
|
||||
{% endif %}
|
||||
16
tests/django_cms/admin/cms/page/plugin/change_form.html
Normal file
16
tests/django_cms/admin/cms/page/plugin/change_form.html
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{% extends "admin/change_form.html" %}
|
||||
{% load cms_admin cms_static %}
|
||||
{% block extrahead %}
|
||||
{# in case plugins require widgets, they need to have bundle here #}
|
||||
<script src="{% static_with_version "cms/js/dist/bundle.admin.base.min.js" %}" type="text/javascript"></script>
|
||||
<script type="text/javascript">
|
||||
if (!window.jQuery) {
|
||||
window.jQuery = CMS.$;
|
||||
window.$ = window.jQuery;
|
||||
}
|
||||
</script>
|
||||
{{ block.super }}
|
||||
{% endblock %}
|
||||
{% block submit_buttons_bottom %}
|
||||
{% submit_row_plugin %}
|
||||
{% endblock %}
|
||||
1
tests/django_cms/admin/cms/page/plugin/confirm_form.html
Normal file
1
tests/django_cms/admin/cms/page/plugin/confirm_form.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
{% extends "admin/cms/page/close_frame.html" %}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
{% extends "admin/delete_confirmation.html" %}
|
||||
{% load i18n admin_urls cms_tags %}
|
||||
{% block breadcrumbs %}{% endblock %}
|
||||
17
tests/django_cms/admin/cms/page/plugin/error_form.html
Normal file
17
tests/django_cms/admin/cms/page/plugin/error_form.html
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
{% extends "admin/change_form.html" %}
|
||||
{% load i18n l10n static %}
|
||||
{% block title %}
|
||||
{% trans "Edit model" %}
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<form action="." method="post" id="cmsplugin_form">
|
||||
{% csrf_token %}
|
||||
<div>
|
||||
<fieldset class="module aligned ">
|
||||
<div class="description">
|
||||
{{ message }}
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
22
tests/django_cms/admin/cms/page/plugin/submit_line.html
Normal file
22
tests/django_cms/admin/cms/page/plugin/submit_line.html
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{% load i18n admin_urls cms_tags %}
|
||||
<div class="submit-row">
|
||||
{% if show_save %}
|
||||
<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />
|
||||
{% endif %}
|
||||
{% if show_delete_link %}
|
||||
<p class="deletelink-box">
|
||||
<a href="{% cms_admin_url "cms_page_delete_plugin" original.pk %}" class="deletelink">
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if show_save_as_new %}
|
||||
<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />
|
||||
{% endif %}
|
||||
{% if show_save_and_add_another %}
|
||||
<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />
|
||||
{% endif %}
|
||||
{% if show_save_and_continue %}
|
||||
<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />
|
||||
{% endif %}
|
||||
</div>
|
||||
34
tests/django_cms/admin/cms/page/submit_row.html
Normal file
34
tests/django_cms/admin/cms/page/submit_row.html
Normal file
|
|
@ -0,0 +1,34 @@
|
|||
{% load i18n cms_tags admin_urls %}
|
||||
<div class="submit-row"
|
||||
{% if is_popup %}style="overflow: auto;" {% endif %}
|
||||
>
|
||||
{% if show_save %}
|
||||
<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" />
|
||||
{% endif %}
|
||||
<p class="deletelink-box">
|
||||
{% if show_delete_link %}
|
||||
<a href="delete/" class="deletelink">
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
{% if show_buttons %}
|
||||
<a href="{% url opts|admin_urlname:'change' object_id %}?language={{ language }}"
|
||||
class="cms-btn-group{% if basic_info_active %}cms-btn-active{% endif %}">
|
||||
{% trans "Basic Settings" %}
|
||||
</a>
|
||||
<a href="{% url opts|admin_urlname:'advanced' object_id %}?language={{ language }}"
|
||||
class="cms-btn-group{% if advanced_settings_active %}cms-btn-active{% endif %}">
|
||||
{% trans "Advanced Settings" %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</p>
|
||||
{% if show_save_as_new %}
|
||||
<input type="submit" value="{% trans 'Save as new' %}" name="_saveasnew" />
|
||||
{% endif %}
|
||||
{% if show_save_and_add_another %}
|
||||
<input type="submit" value="{% trans 'Save and add another' %}" name="_addanother" />
|
||||
{% endif %}
|
||||
{% if show_save_and_continue %}
|
||||
<input type="submit" value="{% trans 'Save and continue editing' %}" name="_continue" />
|
||||
{% endif %}
|
||||
</div>
|
||||
162
tests/django_cms/admin/cms/page/tree/actions_dropdown.html
Normal file
162
tests/django_cms/admin/cms/page/tree/actions_dropdown.html
Normal file
|
|
@ -0,0 +1,162 @@
|
|||
{% load i18n admin_urls %}
|
||||
{% spaceless %}
|
||||
<ul class="cms-pagetree-dropdown-menu-inner">
|
||||
{% block actions %}
|
||||
<li
|
||||
{% if has_copy_page_permission %}
|
||||
class="js-cms-tree-item-copy" data-id="{{ page.pk }}" data-node-id="{{ node.pk }}" data-apphook="{{ page.application_urls|default_if_none:"" }}"
|
||||
{% endif %}
|
||||
>
|
||||
<a
|
||||
{% if not has_copy_page_permission %}class="cms-pagetree-dropdown-item-disabled" {% endif %}
|
||||
href="#" title="{% filter escapejs %}{% trans "Copy" %}
|
||||
{% endfilter %}
|
||||
">
|
||||
<span class="cms-icon cms-icon-copy"></span>
|
||||
<span>
|
||||
{% filter escapejs %}{% trans "Copy" %}
|
||||
{% endfilter %}
|
||||
<span>
|
||||
</a>
|
||||
</li>
|
||||
<li
|
||||
{% if has_move_page_permission %}
|
||||
class="js-cms-tree-item-cut" data-id="{{ page.pk }}" data-node-id="{{ node.pk }}"
|
||||
{% endif %}
|
||||
>
|
||||
<a
|
||||
{% if not has_move_page_permission %}class="cms-pagetree-dropdown-item-disabled" {% endif %}
|
||||
href="#" title="{% filter escapejs %}{% trans "Cut" %}{% endfilter %}
|
||||
">
|
||||
<span class="cms-icon cms-icon-scissors"></span>
|
||||
<span>
|
||||
{% filter escapejs %}{% trans "Cut" %}{% endfilter %}
|
||||
<span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#"
|
||||
data-id="{{ page.pk }}"
|
||||
data-node-id="{{ node.pk }}"
|
||||
class="{% if has_add_permission %}js-cms-tree-item-paste{% endif %} {% if not has_add_permission or not paste_enabled %} cms-pagetree-dropdown-item-disabled{% endif %}">
|
||||
<span class="cms-icon cms-icon-alias"></span>
|
||||
<span>{% filter escapejs %}{% trans "Paste" %}{% endfilter %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
{% if has_delete_permission %}
|
||||
<a href="{% url opts|admin_urlname:'delete' page.id %}?language={{ preview_language }}"
|
||||
title="{% filter escapejs %}{% trans ">
|
||||
{% else %}
|
||||
<a href="#" class="cms-pagetree-dropdown-item-disabled">
|
||||
{% endif %}
|
||||
<span class="cms-icon cms-icon-bin"></span>
|
||||
<span>{% filter escapejs %}{% trans "Delete" %}...{% endfilter %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% if has_change_permission and page.is_potential_home %}
|
||||
<li class="js-cms-tree-item-set-home">
|
||||
<a href="{% url opts|admin_urlname:'set_home' page.id %}"
|
||||
title="{% filter escapejs %}{% trans ">
|
||||
<span class="cms-icon cms-icon-home"></span>
|
||||
<span>{% filter escapejs %}{% trans "Set as home" %}{% endfilter %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="js-cms-tree-item-set-home">
|
||||
<a href="#" class="cms-pagetree-dropdown-item-disabled">
|
||||
<span class="cms-icon cms-icon-home"></span>
|
||||
<span>{% filter escapejs %}{% trans "Set as home" %}{% endfilter %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li>
|
||||
{% if has_change_advanced_settings_permission %}
|
||||
<a href="{% url opts|admin_urlname:'advanced' page.id %}"
|
||||
title="{% filter escapejs %}{% trans ">
|
||||
{% else %}
|
||||
<a href="#" class="cms-pagetree-dropdown-item-disabled">
|
||||
{% endif %}
|
||||
<span class="cms-icon cms-icon-cogs"></span>
|
||||
<span>{% filter escapejs %}{% trans "Advanced settings" %}{% endfilter %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% if CMS_PERMISSION %}
|
||||
<li>
|
||||
{% if has_change_permissions_permission %}
|
||||
<a href="{% url opts|admin_urlname:'permissions' page.id %}"
|
||||
title="{% filter escapejs %}{% trans ">
|
||||
{% else %}
|
||||
<a href="#" class="cms-pagetree-dropdown-item-disabled">
|
||||
{% endif %}
|
||||
<span class="cms-icon cms-icon-lock"></span>
|
||||
<span>{% filter escapejs %}{% trans "Permissions" %}{% endfilter %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endblock actions %}
|
||||
<li class="cms-pagetree-dropdown-separator">
|
||||
|
||||
</li>
|
||||
<li>
|
||||
{% if page.publication_date %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>{% filter escapejs %}{% trans "publication date" %}{% endfilter %}:</strong>
|
||||
{{ page.publication_date|date:"Y-m-d" }}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if page.publication_end_date %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>{% filter escapejs %}{% trans "publication end date" %}{% endfilter %}:</strong>
|
||||
{{ page.publication_end_date|date:"Y-m-d" }}
|
||||
</p>
|
||||
{% endif %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>{% filter escapejs %}{% trans "is restricted" %}{% endfilter %}:</strong>
|
||||
{% if page_is_restricted %}
|
||||
{% filter escapejs %}{% trans "Yes" %}{% endfilter %}
|
||||
{% else %}
|
||||
{% filter escapejs %}{% trans "No" %}{% endfilter %}
|
||||
{% endif %}
|
||||
</p>
|
||||
{% if page.changed_by %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>{% filter escapejs %}{% trans "last change by" %}{% endfilter %}:</strong>
|
||||
{{ page.changed_by }}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if page.changed_date %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>
|
||||
{% filter escapejs %}{% trans "last change on" %}{% endfilter %}:
|
||||
</strong>
|
||||
{{ page.changed_date|date:"Y-m-d H:i:s" }}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if page.get_template_display %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>
|
||||
{% filter escapejs %}{% trans "template" %}{% endfilter %}:
|
||||
</strong>
|
||||
{{ page.get_template_display }}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if metadata %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>
|
||||
{% filter escapejs %}{% trans "meta" %}{% endfilter %}:
|
||||
</strong>
|
||||
{{ metadata }}
|
||||
</p>
|
||||
{% endif %}
|
||||
{% if page.site %}
|
||||
<p title="{% filter escapejs %}{% trans ">
|
||||
<strong>
|
||||
{% filter escapejs %}{% trans "site" %}{% endfilter %}:
|
||||
</strong>
|
||||
{{ page.site }}
|
||||
</p>
|
||||
{% endif %}
|
||||
</li>
|
||||
</ul>
|
||||
{% endspaceless %}
|
||||
182
tests/django_cms/admin/cms/page/tree/base.html.broken
Normal file
182
tests/django_cms/admin/cms/page/tree/base.html.broken
Normal file
|
|
@ -0,0 +1,182 @@
|
|||
{% extends "admin/change_list.html" %}
|
||||
{% load i18n admin_list static admin_urls cms_admin cms_js_tags cms_static cms_tags %}
|
||||
|
||||
{# TODO might not need that #}
|
||||
{% block title %}{% trans "List of pages" %}{% endblock %}
|
||||
{% block bodyclass %}{{ block.super }} change-list cms-pagetree-wrapper{% endblock %}
|
||||
{% block coltype %}flex{% endblock %}
|
||||
{% block date_hierarchy %}{% endblock %}
|
||||
{% block pagination %}{% endblock %}
|
||||
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
{# INFO: we need to add styles here instead of "extrastyle" to avoid conflicts with adminstyle #}
|
||||
<link rel="stylesheet" href="{% static_with_version 'cms/css/cms.base.css' %}">
|
||||
<link rel="stylesheet" href="{% static_with_version 'cms/css/cms.pagetree.css' %}">
|
||||
<script src="{% static_with_version 'cms/js/dist/bundle.admin.base.min.js' %}"></script>
|
||||
<script src="{% static_with_version 'cms/js/dist/bundle.admin.pagetree.min.js' %}"></script>
|
||||
{% endblock extrahead %}
|
||||
|
||||
{% if not is_popup %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs cms-pagetree-breadcrumbs">
|
||||
<a href="{% url 'admin:index' %}">{% trans "Home" %}</a> ›
|
||||
<a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_config.verbose_name }}</a> ›
|
||||
{{ opts.verbose_name_plural|capfirst|escape }}
|
||||
{# TODO might remove this or add reset #}
|
||||
{% if request.GET.q or request.POST.q %}
|
||||
› {% trans "Search" %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% endif %}
|
||||
|
||||
{% block content_title %}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
{% spaceless %}
|
||||
<div id="content-main">
|
||||
<div class="cms-pagetree-root module{% if tree.is_filtered %} filtered{% endif %}" id="changelist">
|
||||
<div class="cms-pagetree cms-pagetree-header">
|
||||
<div class="cms-pagetree-header-cell cms-pagetree-header-cell-fluid">
|
||||
<div class="cms-pagetree-header-row cms-pagetree-search-container">
|
||||
<div class="cms-pagetree-header-cell">
|
||||
<div class="cms-pagetree-header-title">
|
||||
<h1>
|
||||
{% trans "Page Tree" %} <span>({{ tree.site.name }})</span>
|
||||
</h1>
|
||||
</div>
|
||||
|
||||
{% if tree.is_filtered or request.GET.q %}
|
||||
{# INFO: show reset button when filtering is active #}
|
||||
<a href="{% url opts|admin_urlname:'changelist' %}" class="cms-pagetree-header-cell cms-pagetree-header-search-reset">{% trans "Reset filter"|lower %}</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="cms-pagetree-header-cell cms-pagetree-header-cell-search">
|
||||
{# INFO: visible search field with filtering #}
|
||||
<form method="get" class="cms-pagetree-header-search js-cms-pagetree-header-search">
|
||||
<label for="field-searchbar" class="cms-hidden">{% trans "Search" %}</label>
|
||||
<div class="cms-pagetree-header-filter">
|
||||
<input type="text" size="40" name="q" id="field-searchbar" value="{{ tree.query }}" placeholder="{% trans "Search" %}">
|
||||
<div class="cms-pagetree-header-filter-trigger js-cms-pagetree-header-filter-trigger">
|
||||
<a href="#"><span class="cms-icon cms-icon-arrow"></span></a>
|
||||
</div>
|
||||
<div class="cms-pagetree-header-filter-container js-cms-pagetree-header-filter-container">
|
||||
{% for field in changelist_form.visible_fields %}
|
||||
{% render_filter_field request field %}
|
||||
{% endfor %}
|
||||
<a href="#" class="cms-pagetree-header-search-close js-cms-pagetree-header-search-close">
|
||||
<span class="cms-icon cms-icon-close"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
<button type="submit" class="cms-pagetree-header-search-btn">
|
||||
<span class="cms-icon cms-icon-search"></span>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="cms-pagetree-header-cell cms-pagetree-header-body">
|
||||
{# INFO: hidden search field with dynamic content #}
|
||||
<div class="js-cms-pagetree-header-search-copy cms-hidden">
|
||||
<div id="toolbar">
|
||||
<form id="changelist-search" method="get">
|
||||
<div><!-- DIV needed for valid HTML -->
|
||||
<label for="searchbar"><img src="{% static "admin/img/search.svg" %}" alt="Search" /></label>
|
||||
<input type="text" size="40" name="{{ search_var }}" value="{{ tree.query }}" id="searchbar" autofocus />
|
||||
<input type="submit" value="{% trans 'Search' %}" />
|
||||
{% for pair in changelist_form.get_filter_items %}
|
||||
{% if pair.0 != search_var %}<input type="hidden" name="{{ pair.0 }}" value="{{ pair.1 }}"/>{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cms-clear-mobile"></div>
|
||||
|
||||
{# INFO: dropdown for changing sites and recover deleted pages #}
|
||||
<div class="cms-pagetree-sites-list cms-pagetree-dropdown js-cms-pagetree-dropdown">
|
||||
<a href="#" class="cms-pagetree-dropdown-trigger js-cms-pagetree-dropdown-trigger">
|
||||
<span class="cms-icon cms-icon-squares"></span>
|
||||
</a>
|
||||
<div class="cms-pagetree-dropdown-menu cms-pagetree-dropdown-menu-condensed cms-pagetree-dropdown-menu-arrow-top-right js-cms-pagetree-dropdown-menu">
|
||||
<ul class="cms-pagetree-dropdown-menu-inner">
|
||||
<li>
|
||||
<span class="label">{% trans "Sites" %}</span>
|
||||
</li>
|
||||
{% for site in tree.sites %}
|
||||
<li{% if site.pk == tree.site.pk %} class="active"{% endif %}>
|
||||
<a href="#{{ site.pk }}" class="js-cms-pagetree-site-trigger" data-id="{{ site.pk }}">{{ site.name }}</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
{% if has_recover_permission %}
|
||||
<li class="cms-pagetree-dropdown-separator"> </li>
|
||||
<li>
|
||||
<a href="{% url opts|admin_urlname:'recoverlist' %}" class="recoverlink">
|
||||
{% blocktrans with opts.verbose_name_plural|escape as name %}
|
||||
Restore deleted {{ name }}
|
||||
{% endblocktrans %}
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
{# INFO: hidden site form when using the dropdown site switcher #}
|
||||
<form method="post" class="js-cms-pagetree-site-form cms-hidden">
|
||||
<select name="site">
|
||||
{% for site in tree.sites %}
|
||||
<option value="{{ site.pk }}">{{ site.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% csrf_token %}
|
||||
</form>
|
||||
</div>
|
||||
|
||||
{# INFO: "new page" button #}
|
||||
{% if has_add_permission %}
|
||||
<a href="{% url opts|admin_urlname:'add' %}" class="cms-pagetree-header-create cms-btn cms-btn-toolbar cms-btn-action">
|
||||
{% blocktrans with opts.verbose_name|title as name %}
|
||||
New {{ name }}
|
||||
{% endblocktrans %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form id="changelist-form" action="" method="post" novalidate>{% csrf_token %}
|
||||
<div class="cms-pagetree cms-pagetree-section">
|
||||
<h2>{% trans "Main Navigation" %}</h2>
|
||||
<div class="cms-pagetree-section-nav">
|
||||
{% if has_add_permission %}
|
||||
<div class="cms-pagetree-dropdown js-cms-pagetree-dropdown">
|
||||
<a href="#root" data-node-id="#root" data-id="#root" class="js-cms-pagetree-dropdown-trigger js-cms-pagetree-options cms-pagetree-dropdown-trigger cms-btn cms-btn-default cms-btn-no-border cms-icon cms-icon-menu">
|
||||
<span class="sr-only">{% trans "Options" %}</span>
|
||||
</a>
|
||||
|
||||
<div class="js-cms-pagetree-dropdown-menu cms-pagetree-dropdown-menu cms-pagetree-dropdown-menu-arrow-right-top">
|
||||
<ul class="cms-pagetree-dropdown-menu-inner">
|
||||
<li>
|
||||
<a href="#" data-node-id="#root" data-id="#root" class="js-cms-tree-item-paste cms-pagetree-dropdown-item-disabled">
|
||||
<span class="cms-icon cms-icon-alias"></span>
|
||||
<span>{% trans "Paste" %}</span>
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# INFO: javascript is loaded from cms.pagetree.js #}
|
||||
|
||||
</form>
|
||||
|
||||
{# INFO: used when copying nodes #}
|
||||
<div class="cms-tree-dialog js-cms-tree-dialog"></div>
|
||||
</div>
|
||||
</div>
|
||||
{% endspaceless %}
|
||||
{% endblock content %}
|
||||
16
tests/django_cms/admin/cms/page/tree/copy_premissions.html
Normal file
16
tests/django_cms/admin/cms/page/tree/copy_premissions.html
Normal file
|
|
@ -0,0 +1,16 @@
|
|||
{% load i18n %}
|
||||
<div class="cms-dialog js-cms-dialog js-cms-dialog-{{ dialog_id }}">
|
||||
<h1>{% trans "Copy options" %}</h1>
|
||||
<p>
|
||||
{% trans "Choose copy options" %}
|
||||
</p>
|
||||
<form method="post">
|
||||
{% csrf_token %}
|
||||
{{ form.as_p }}
|
||||
<div class="submit-row">
|
||||
<input type="submit" value="{% trans 'Save' %}" class="default submit">
|
||||
<input type="submit" value="{% trans 'Close' %}" class="cancel">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<div class="cms-dialog-dimmer js-cms-dialog-dimmer"></div>
|
||||
13
tests/django_cms/admin/cms/page/tree/filter.html
Normal file
13
tests/django_cms/admin/cms/page/tree/filter.html
Normal file
|
|
@ -0,0 +1,13 @@
|
|||
{% load i18n %}
|
||||
<h3>{{ field.label }}</h3>
|
||||
<ul>
|
||||
{% for choice in choices %}
|
||||
<li
|
||||
{% if choice.selected %}class="selected" {% endif %}
|
||||
>
|
||||
<a href="{{ choice.query_string|iriencode }}">
|
||||
{{ choice.display }}
|
||||
</a>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
77
tests/django_cms/admin/cms/page/tree/legend.html
Normal file
77
tests/django_cms/admin/cms/page/tree/legend.html
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
{% load i18n %}
|
||||
{% spaceless %}
|
||||
<div class="cms-pagetree cms-pagetree-section cms-pagetree-section-condensed cms-pagetree-legend">
|
||||
<span class="cms-pagetree-dropdown js-cms-pagetree-dropdown">
|
||||
<div class="js-cms-pagetree-dropdown-trigger cms-pagetree-legend-title-wrap">
|
||||
<span class="cms-icon cms-icon-info"></span>
|
||||
<span class="cms-pagetree-legend-title">
|
||||
{% trans "Legend" %}
|
||||
</span>
|
||||
</div>
|
||||
<div class="cms-pagetree-dropdown-menu cms-pagetree-dropdown-menu-condensed cms-pagetree-dropdown-menu-arrow-right-bottom js-cms-pagetree-dropdown-menu">
|
||||
<ul class="cms-pagetree-dropdown-menu-inner">
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-pagetree-node-state cms-pagetree-node-state-published"></span>
|
||||
<span>{% trans "Published" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-pagetree-node-state cms-pagetree-node-state-dirty"></span>
|
||||
<span>{% trans "Changed" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-pagetree-node-state cms-pagetree-node-state-unpublished"></span>
|
||||
<span>{% trans "Unpublished" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-pagetree-node-state cms-pagetree-node-state-empty"></span>
|
||||
<span>{% trans "Empty" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-icon cms-icon-check-square"></span>
|
||||
<span>{% trans "In menu" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-icon cms-icon-minus-square"></span>
|
||||
<span>{% trans "Not in menu" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-icon cms-icon-eye"></span>
|
||||
<span>{% trans "View page" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-icon cms-icon-home"></span>
|
||||
<span>{% trans "Home" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-icon cms-icon-sitemap"></span>
|
||||
<span>{% trans "Softroot" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
<li>
|
||||
<span class="cms-pagetree-dropdown-item">
|
||||
<span class="cms-icon cms-icon-puzzle"></span>
|
||||
<span>{% trans "Apphook" %}</span>
|
||||
</span>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</span>
|
||||
</div>
|
||||
{% endspaceless %}
|
||||
282
tests/django_cms/admin/cms/page/tree/menu.html.brocken
Normal file
282
tests/django_cms/admin/cms/page/tree/menu.html.brocken
Normal file
|
|
@ -0,0 +1,282 @@
|
|||
{% load i18n cms_admin admin_urls %}
|
||||
|
||||
{# INFO: columns are defined in base.html options #}
|
||||
{% spaceless %}
|
||||
<li class="cms-tree-node {{ css_class }}
|
||||
{% if follow_descendants %}{% if descendants %} jstree-open{% elif node.is_branch %} jstree-closed{% endif %}{% endif %}
|
||||
{% if page.reverse_id == 'page_types' %} cms-tree-node-pagetype{% endif %}
|
||||
{% if node.depth == 0 %} cms-tree-node-top{% endif %}
|
||||
{% if filtered %} cms-tree-node-filtered{% endif %}
|
||||
{% if has_add_permission %} cms-tree-node-root-allow-children{% endif %}
|
||||
{% block extra_class %}
|
||||
{% if is_shared_page %}
|
||||
cms-tree-node-shared-true
|
||||
{% else %}
|
||||
cms-tree-node-shared-false
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
"
|
||||
{% if is_popup %}onclick="opener.dismissRelatedLookupPopup(window, {{ page.id }}); return false;"{% endif %}
|
||||
data-id="{{ page.pk }}"
|
||||
data-node-id="{{ node.pk }}"
|
||||
data-slug="{{ page.get_slug }}"
|
||||
data-is-home="{{ page.is_home|yesno:"true,false" }}"
|
||||
data-move-permission="{{ has_move_page_permission|yesno:"true,false" }}"
|
||||
data-add-permission="{{ has_add_page_permission|yesno:"true,false" }}"
|
||||
{% block extra_data %}
|
||||
{% if is_shared_page %}
|
||||
data-shared-page="-true"
|
||||
{% else %}
|
||||
data-shared-page="-false"
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
data-colview='
|
||||
<div class="cms-tree-col">
|
||||
<div class="cms-tree-item-wrapper">
|
||||
{% block row_icon %}
|
||||
{% if page.is_home %}
|
||||
<div class="cms-tree-item cms-tree-item-icons">
|
||||
<div class="cms-tree-item-inner">
|
||||
<div class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% autoescape on %}{% trans 'Home' %}{% endautoescape %}">
|
||||
<span class="cms-icon cms-icon-home"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if page.soft_root %}
|
||||
<div class="cms-tree-item cms-tree-item-icons">
|
||||
<div class="cms-tree-item-inner">
|
||||
<div class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% autoescape on %}{% trans 'Softroot' %}{% endautoescape %}">
|
||||
<a href="{% url opts|admin_urlname:'advanced' page.id %}">
|
||||
<span class="cms-icon cms-icon-sitemap"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if page.application_urls %}
|
||||
<div class="cms-tree-item cms-tree-item-icons">
|
||||
<div class="cms-tree-item-inner">
|
||||
<div class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% autoescape on %}{% blocktrans with page.application_urls as apphook%}Application: {{ apphook }}{% endblocktrans %}{% endautoescape %}">
|
||||
<a href="{% url opts|admin_urlname:'advanced' page.id %}">
|
||||
<span class="cms-icon cms-icon-puzzle"></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
</div>
|
||||
</div>
|
||||
'
|
||||
data-colpreview='
|
||||
<div class="cms-tree-col">
|
||||
<div class="cms-tree-item cms-tree-item-preview
|
||||
{# INFO: highlight active icon when in sidebar mode #}
|
||||
{% if page.id|slugify == request.GET.page_id|slugify %} cms-tree-preview-active{% endif %}">
|
||||
<div class="cms-tree-item-inner cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay" data-cms-tooltip="{% autoescape on %}{% trans "View on site" %}{% endautoescape %}">
|
||||
<a class="js-cms-pagetree-page-view" href="{% url opts|admin_urlname:'preview_page' page.id lang %}"{% if lang in page_languages %} target="_top"{% endif %}">
|
||||
<span class="sr-only">{% autoescape on %}{% trans "View on site" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
'
|
||||
{% for lang in site_languages %}
|
||||
data-col{{ lang|lower|cut:'-' }}='
|
||||
<div class="cms-tree-col">
|
||||
<div class="cms-tree-item {% if is_shared_page or not has_publish_permission %} cms-tree-item-disabled{% endif %} cms-tree-item-lang">
|
||||
<div class="cms-tree-item-inner cms-pagetree-dropdown{% if has_publish_permission %} js-cms-pagetree-dropdown{% endif %}">
|
||||
{% if has_publish_permission %}
|
||||
<a href="{% url opts|admin_urlname:'preview_page' page.id lang %}"
|
||||
class="cms-pagetree-dropdown-trigger js-cms-pagetree-dropdown-trigger"
|
||||
{# INFO: delegate click event to parent window when in sideframe #}
|
||||
{% if lang in page_languages %} target="_top"{% endif %}>
|
||||
{# INFO: renders <span class="{cls}" title="{title}"></span> #}
|
||||
{% tree_publish_row page lang %}
|
||||
</a>
|
||||
|
||||
<div class="cms-pagetree-dropdown-menu cms-pagetree-dropdown-menu-arrow-right-top js-cms-pagetree-dropdown-menu">
|
||||
<ul class="cms-pagetree-dropdown-menu-inner">
|
||||
<li>
|
||||
<a href="{% url opts|admin_urlname:'preview_page' page.id lang %}" class="js-cms-pagetree-page-view" target="_top">
|
||||
<span class="cms-icon cms-icon-eye" title="{% autoescape on %}{% blocktrans with lang|upper as language %}Preview this page in {{ language }} {% endblocktrans %}{% endautoescape %}"></span>
|
||||
<span>{% autoescape on %}{% trans "Preview" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{# hide if page is empty #}
|
||||
{% if lang in page_languages %}
|
||||
{% if ancestors|items_are_published:lang %}
|
||||
{% if page|is_dirty:lang or not page|is_published:lang %}
|
||||
<li>
|
||||
<a href="{% url opts|admin_urlname:'publish_page' page.id lang %}?redirect_language={{ preview_language }}{% if request.GET.page_id %}&redirect_page_id={{ request.GET.page_id }}{% endif %}" class="js-cms-tree-lang-trigger">
|
||||
<span class="cms-icon cms-icon-check-o"></span>
|
||||
<span>{% autoescape on %}{% trans "Publish" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if page|is_published:lang %}
|
||||
<li>
|
||||
<a href="{% url opts|admin_urlname:'unpublish' page.id lang %}?redirect_language={{ preview_language }}{% if request.GET.page_id %}&redirect_page_id={{ request.GET.page_id }}{% endif %}" class="js-cms-tree-lang-trigger">
|
||||
<span class="cms-icon cms-icon-forbidden"></span>
|
||||
<span>{% autoescape on %}{% trans "Unpublish" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<li>
|
||||
<a href="{% url opts|admin_urlname:'change' page.id %}?language={{ lang }}">
|
||||
<span class="cms-icon cms-icon-cogs"></span>
|
||||
<span>{% autoescape on %}{% trans "Configure" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
{% else %}
|
||||
<span class="cms-tree-lang-container">
|
||||
{% tree_publish_row page lang %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
'
|
||||
{% endfor %}
|
||||
data-colmenu='
|
||||
<div class="cms-tree-col">
|
||||
<div class="cms-tree-item cms-tree-item-menu{% if not has_change_permission %} cms-tree-item-disabled{% endif %} js-cms-tree-item-menu">
|
||||
<div class="cms-tree-item-inner">
|
||||
{% if has_change_permission %}
|
||||
<a href="{% url opts|admin_urlname:'change_innavigation' page.id %}?language={{ preview_language }}&{{ page.id }}={{ page.in_navigation|yesno:"1,0" }}">
|
||||
{% endif %}
|
||||
{% if page.in_navigation %}
|
||||
<div class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% autoescape on %}{% trans "in menu" %}{% endautoescape %}">
|
||||
<span class="cms-icon cms-icon-check-square"></span>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% autoescape on %}{% trans "not in menu" %}{% endautoescape %}">
|
||||
<span class="cms-icon cms-icon-minus-square"></span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if has_change_permission %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
'
|
||||
data-coloptions='
|
||||
<div class="cms-tree-col cms-tree-col-padding-sm">
|
||||
<div class="cms-tree-item-wrapper">
|
||||
<div class="cms-tree-item cms-tree-item-button">
|
||||
<div{% if has_change_permission and has_change_advanced_settings_permission %} class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% autoescape on %}{% trans "Page settings (SHIFT click for advanced settings)" %}{% endautoescape %}"{% endif %}>
|
||||
{% if has_change_permission or has_change_advanced_settings_permission %}
|
||||
<a {% if has_change_permission %}href="{% url opts|admin_urlname:'change' page.id %}?language={{ preview_language }}" {% endif %}
|
||||
class="cms-btn cms-btn-default js-cms-tree-advanced-settings cms-icon cms-icon-pencil"
|
||||
{% if has_change_advanced_settings_permission %}
|
||||
data-url="{% url opts|admin_urlname:'advanced' page.id %}"
|
||||
{% endif %}
|
||||
>
|
||||
{% else %}
|
||||
<span class="cms-btn cms-btn-default cms-btn-disabled js-cms-tree-advanced-settings cms-icon cms-icon-pencil">
|
||||
{% endif %}
|
||||
<span class="sr-only">{% autoescape on %}{% trans "Page settings (SHIFT click for advanced settings)" %}{% endautoescape %}</span>
|
||||
{% if has_change_permission or has_change_advanced_settings_permission %}
|
||||
</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="cms-tree-item cms-tree-item-button">
|
||||
<div{% if has_add_page_permission %} class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% autoescape on %}{% trans 'New sub page' %}{% endautoescape %}"{% endif %}>
|
||||
{% if has_add_page_permission %}
|
||||
<a href="{% url opts|admin_urlname:'add' %}?parent_node={{ node.pk }}"
|
||||
class="js-cms-pagetree-add-page cms-btn cms-btn-default cms-icon cms-icon-plus">
|
||||
{% else %}
|
||||
<span class="cms-btn cms-btn-default cms-btn-disabled cms-icon cms-icon-plus">
|
||||
{% endif %}
|
||||
<span class="sr-only">{% autoescape on %}{% trans 'New sub page' %}{% endautoescape %}</span>
|
||||
{% if has_add_page_permission %}
|
||||
</a>
|
||||
{% else %}
|
||||
</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="js-cms-pagetree-actions-dropdown cms-tree-item cms-tree-item-button cms-pagetree-dropdown js-cms-pagetree-dropdown" data-lazy-url="{% url opts|admin_urlname:'actions_menu' page.id %}">
|
||||
<a data-node-id="{{ node.pk }}" data-id="{{ page.pk }}" href="#" class="js-cms-pagetree-dropdown-trigger js-cms-pagetree-options cms-pagetree-dropdown-trigger cms-btn cms-btn-default cms-btn-no-border cms-icon cms-icon-menu">
|
||||
<span class="sr-only">{% autoescape on %}{% trans "Options" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
|
||||
<div class="js-cms-pagetree-dropdown-menu cms-pagetree-dropdown-menu cms-pagetree-dropdown-menu-arrow-right-top">
|
||||
<div class="js-cms-pagetree-dropdown-loader cms-pagetree-dropdown-loader">
|
||||
</div>
|
||||
{# dummy structure #}
|
||||
<ul class="cms-pagetree-dropdown-menu-inner">
|
||||
<li>
|
||||
<a class="cms-pagetree-dropdown-item-disabled" href="#" title="{% autoescape on %}{% trans 'Copy' %}{% endautoescape %}">
|
||||
<span class="cms-icon cms-icon-copy"></span>
|
||||
<span>{% autoescape on %}{% trans 'Copy' %}{% endautoescape %}<span>
|
||||
</a>
|
||||
</li>
|
||||
<li class="">
|
||||
<a href="#" class="cms-pagetree-dropdown-item-disabled" title="{% autoescape on %}{% trans 'Cut' %}{% endautoescape %}">
|
||||
<span class="cms-icon cms-icon-scissors"></span>
|
||||
<span>{% autoescape on %}{% trans 'Cut' %}{% endautoescape %}<span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="#" data-node-id="{{ node.pk }}" data-id="{{ page.pk }}" class="cms-pagetree-dropdown-item-disabled">
|
||||
<span class="cms-icon cms-icon-alias"></span>
|
||||
<span>{% autoescape on %}{% trans "Paste" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="cms-pagetree-dropdown-item-disabled" href="#" title="{% autoescape on %}{% trans 'Delete' %}{% endautoescape %}">
|
||||
<span class="cms-icon cms-icon-bin"></span>
|
||||
<span>{% autoescape on %}{% trans 'Delete' %}...{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a class="cms-pagetree-dropdown-item-disabled" href="#" title="{% autoescape on %}{% trans "Advanced settings" %}{% endautoescape %}">
|
||||
<span class="cms-icon cms-icon-cogs"></span>
|
||||
<span>{% autoescape on %}{% trans "Advanced settings" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% if CMS_PERMISSION %}
|
||||
<li>
|
||||
<a href="#" class="cms-pagetree-dropdown-item-disabled">
|
||||
<span class="cms-icon cms-icon-lock"></span>
|
||||
<span>{% autoescape on %}{% trans "Permissions" %}{% endautoescape %}</span>
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
'
|
||||
{% block extra_cols %}{% endblock %}
|
||||
>
|
||||
|
||||
{% language LANGUAGE_CODE %}
|
||||
{{ page.get_admin_tree_title }}
|
||||
{% endlanguage %}
|
||||
|
||||
{# INFO render children #}
|
||||
{% if descendants %}
|
||||
<ul>
|
||||
{% show_admin_menu_for_pages descendants depth=node.depth|add:1 %}
|
||||
</ul>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% endspaceless %}
|
||||
50
tests/django_cms/admin/cms/usersettings/change_form.html
Normal file
50
tests/django_cms/admin/cms/usersettings/change_form.html
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
{% extends "admin/change_form.html" %}
|
||||
{% load i18n cms_tags %}
|
||||
{% block extrahead %}
|
||||
{{ block.super }}
|
||||
<script>
|
||||
// we have to wait till the window is loaded, otherwise
|
||||
// the sideframe code will override the url, because every time
|
||||
// the iframe is loaded, it's current url is saved in the settings
|
||||
window.onload = function () {
|
||||
// we have to setTimeout here because the cms.sideframe load event
|
||||
// fires after this one :(
|
||||
setTimeout(function () {
|
||||
var CMS = window.parent.CMS;
|
||||
// we need to reload the parent window once "?reload_window" is defined and
|
||||
// set the new url for the sideframe with the correct language specification
|
||||
if (location.href.indexOf('reload_window') > -1 && CMS) {
|
||||
// save url in settings
|
||||
CMS.settings.sideframe.url = window.location.href.replace(/[?&]reload_window/, '');
|
||||
CMS.settings = CMS.API.Helpers.setSettings(CMS.settings);
|
||||
// reload everything
|
||||
CMS.API.Helpers.reloadBrowser();
|
||||
}
|
||||
}, 0);
|
||||
}
|
||||
</script>
|
||||
{% endblock %}
|
||||
{% block breadcrumbs %}
|
||||
<div class="breadcrumbs">
|
||||
<a href="{% cms_admin_url 'index' %}">
|
||||
{% trans 'Home' %}
|
||||
</a>
|
||||
›
|
||||
<a href="{% cms_admin_url 'app_list' app_label=opts.app_label %}">
|
||||
{{ app_label|capfirst|escape }}
|
||||
</a>
|
||||
› {{ opts.verbose_name_plural|capfirst }}
|
||||
›
|
||||
{% if add %}
|
||||
{% trans 'Add' %} {{ opts.verbose_name }}
|
||||
{% else %}
|
||||
{{ original|truncatewords:"18" }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
{% block object-tools %}{% endblock %}
|
||||
{% block submit_buttons_bottom %}
|
||||
<div class="submit-row">
|
||||
<input type="submit" value="{% trans 'Save' %}" class="default" name="_save" {{ onclick_attrib }}/>
|
||||
</div>
|
||||
{% endblock %}
|
||||
1
tests/django_cms/cms/content.html
Normal file
1
tests/django_cms/cms/content.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
{{ content }}
|
||||
1
tests/django_cms/cms/dummy.html
Normal file
1
tests/django_cms/cms/dummy.html
Normal file
|
|
@ -0,0 +1 @@
|
|||
{% extends template %}
|
||||
4
tests/django_cms/cms/plugins/alias.html
Normal file
4
tests/django_cms/cms/plugins/alias.html
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
{% load cms_alias_tags %}
|
||||
{% if request and not instance.is_recursive %}
|
||||
{% render_alias_plugin instance %}
|
||||
{% endif %}
|
||||
8
tests/django_cms/cms/toolbar/clipboard.html
Normal file
8
tests/django_cms/cms/toolbar/clipboard.html
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
{% load i18n cms_admin %}
|
||||
<div class="cms-clipboard" data-title="{% trans 'Clipboard' %}">
|
||||
<div class="cms-plugins"></div>
|
||||
<div class="cms-clipboard-containers cms-dragarea cms-draggables">
|
||||
{% if clipboard_plugin %}
|
||||
{% include cms_toolbar.templates.drag_item_template with clipboard="true" plugin=clipboard_plugin %}{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
2
tests/django_cms/cms/toolbar/content.html
Normal file
2
tests/django_cms/cms/toolbar/content.html
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
{% if edit and placeholder %}{{ placeholder }}{% endif %}
|
||||
{{ content }}
|
||||
66
tests/django_cms/cms/toolbar/dragbar.html
Normal file
66
tests/django_cms/cms/toolbar/dragbar.html
Normal file
|
|
@ -0,0 +1,66 @@
|
|||
{% load i18n l10n cms_tags %}
|
||||
<div class="cms-dragbar cms-dragbar-{{ placeholder.pk|unlocalize }}">
|
||||
<div class="cms-submenu-btn cms-submenu-add cms-btn">
|
||||
<span class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% trans "></span>
|
||||
</div>
|
||||
<div class="cms-submenu-settings cms-submenu-btn cms-btn"></div>
|
||||
<div class="cms-submenu-dropdown cms-submenu-dropdown-settings" data-touch-action="pan-y">
|
||||
<div class="cms-dropdown-inner">
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="copy" data-rel="copy" href="#">
|
||||
{% trans "Copy all" %}
|
||||
</a>
|
||||
</div>
|
||||
{% for language in placeholder.get_filled_languages %}
|
||||
{% if language.code != LANGUAGE_CODE %}
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="copy" data-rel="copy-lang" data-language="{{ language.code }}" href="#">
|
||||
{% trans "Copy from" %} {% trans language.name %}
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="paste" data-rel="paste" href="#">
|
||||
{% trans "Paste" %}
|
||||
</a>
|
||||
</div>
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="bin"
|
||||
data-rel="modal"
|
||||
href="{{ placeholder.get_clear_url }}?language={{ LANGUAGE_CODE }}"
|
||||
data-name="{{ placeholder.get_label }}">
|
||||
{% trans "Empty all" %}
|
||||
</a>
|
||||
</div>
|
||||
{% render_extra_menu_items placeholder %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="cms-plugin-picker" data-touch-action="pan-y">
|
||||
<div class="cms-quicksearch">
|
||||
<label>
|
||||
<input type="text" placeholder="{% trans 'Filter plugins...' %}" />
|
||||
</label>
|
||||
</div>
|
||||
{# plugin child classes here #}
|
||||
</div>
|
||||
<div class="cms-dragbar-title" title="{{ placeholder.get_label }}">
|
||||
{{ placeholder.get_label }}
|
||||
{% if placeholder.is_static %}
|
||||
<span class="cms-hover-tooltip cms-hover-tooltip-right"
|
||||
tabindex="-1"
|
||||
data-cms-tooltip="{% trans 'This is a static placeholder' %}">
|
||||
<span class="cms-icon cms-icon-pin cms-dragarea-static-icon"></span>
|
||||
</span>
|
||||
{% endif %}
|
||||
<span class="cms-dragbar-toggler">
|
||||
<a href="#" class="cms-dragbar-expand-all" tabindex="-1">
|
||||
{% trans "Expand all" %}
|
||||
</a>
|
||||
<a href="#" class="cms-dragbar-collapse-all" tabindex="-1">
|
||||
{% trans "Collapse all" %}
|
||||
</a>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
77
tests/django_cms/cms/toolbar/dragitem.html
Normal file
77
tests/django_cms/cms/toolbar/dragitem.html
Normal file
|
|
@ -0,0 +1,77 @@
|
|||
{% load i18n l10n cms_tags %}
|
||||
{% with allow_children=plugin.get_plugin_class.allow_children disable_child_plugins=plugin.get_plugin_class.disable_child_plugins %}
|
||||
<div class="cms-draggable cms-draggable-{{ plugin.pk|unlocalize }} {% if not allow_children %}cms-draggable-disabled{% endif %} {% if clipboard %}cms-draggable-from-clipboard{% endif %}">
|
||||
<div class="cms-dragitem cms-dragitem-handler {% if plugin.child_plugin_instances %}cms-dragitem-collapsable{% endif %}">
|
||||
{% if not disabled_child %}
|
||||
<div class="cms-submenu-btn cms-submenu-edit cms-btn" data-rel="edit">
|
||||
<span class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% trans "></span>
|
||||
</div>
|
||||
<div class="cms-submenu-btn cms-submenu-add cms-btn {% if not allow_children %}cms-btn-disabled{% endif %}">
|
||||
{% if not allow_children %}
|
||||
<span class="cms-hover-tooltip" data-cms-tooltip="{% trans "></span>
|
||||
{% else %}
|
||||
<span class="cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% trans "></span>
|
||||
{% endif %}
|
||||
</div>
|
||||
<div class="cms-submenu cms-submenu-settings cms-submenu-btn cms-btn"></div>
|
||||
{% else %}
|
||||
<div class="cms-hover-tooltip cms-hover-tooltip-left cms-plugin-disabled" tabindex="-1" data-cms-tooltip="{% trans ">
|
||||
<span class="cms-icon cms-icon-lock"></span>
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="cms-submenu-dropdown cms-submenu-dropdown-settings">
|
||||
<div class="cms-dropdown-inner">
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="scissors" data-rel="cut" href="#">
|
||||
{% trans "Cut" %}
|
||||
</a>
|
||||
</div>
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="copy" data-rel="copy" href="#">
|
||||
{% trans "Copy" %}
|
||||
</a>
|
||||
</div>
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="paste" data-rel="paste" href="#">
|
||||
{% trans "Paste" %}
|
||||
</a>
|
||||
<span class="cms-submenu-item-paste-tooltip cms-submenu-item-paste-tooltip-empty cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% trans "></span>
|
||||
<span class="cms-submenu-item-paste-tooltip cms-submenu-item-paste-tooltip-restricted cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% trans "></span>
|
||||
<span class="cms-submenu-item-paste-tooltip cms-submenu-item-paste-tooltip-disabled cms-hover-tooltip cms-hover-tooltip-left cms-hover-tooltip-delay"
|
||||
data-cms-tooltip="{% trans "></span>
|
||||
</div>
|
||||
<div class="cms-submenu-item">
|
||||
<a data-cms-icon="bin" data-rel="delete" href="#">
|
||||
{% trans "Delete" %}
|
||||
</a>
|
||||
</div>
|
||||
{% render_extra_menu_items plugin %}
|
||||
</div>
|
||||
</div>
|
||||
{% if not clipboard %}
|
||||
<div class="cms-plugin-picker" data-touch-action="pan-y">
|
||||
<div class="cms-quicksearch">
|
||||
<label>
|
||||
<input type="text" placeholder="{% trans 'Filter plugins...' %}" />
|
||||
</label>
|
||||
</div>
|
||||
{# plugin child classes here #}
|
||||
</div>
|
||||
{% endif %}
|
||||
<span class="cms-dragitem-text" title="{{ plugin.plugin_type }} ID: {{ plugin.pk }}">
|
||||
<strong>{{ plugin.get_plugin_name }}</strong>
|
||||
{{ plugin.get_short_description }}
|
||||
</span>
|
||||
</div>
|
||||
<div class="cms-collapsable-container cms-hidden {% if allow_children %}cms-draggables{% endif %}">
|
||||
{% if plugin.child_plugin_instances %}
|
||||
{% for child in plugin.child_plugin_instances %}
|
||||
{% include cms_toolbar.templates.drag_item_template with plugin=child disabled_child=disable_child_plugins %}{% endfor %}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% endwith %}
|
||||
20
tests/django_cms/cms/toolbar/dragitem_extra_menu.html
Normal file
20
tests/django_cms/cms/toolbar/dragitem_extra_menu.html
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{% load i18n %}
|
||||
<div class="cms-submenu-item cms-submenu-item-highlight">
|
||||
<a href="#" data-rel="highlight" data-cms-icon="highlight">
|
||||
{{ plugin }}{% trans "Highlight" %}
|
||||
</a>
|
||||
</div>
|
||||
{% for item in items %}
|
||||
<div class="cms-submenu-item">
|
||||
<a href="{{ item.url }}" data-rel="{{ item.action }}"
|
||||
{% if item.data %}data-post="{{ item.data }}" {% endif %}
|
||||
{% if question %}data-text="{{ question }}" {% endif %}
|
||||
data-on-success="REFRESH_PAGE"
|
||||
{% for key, attr in item.attributes.items %}
|
||||
data-{{ key }}="{{ attr }}"
|
||||
{% endfor %}
|
||||
>
|
||||
{{ item.name }}
|
||||
</a>
|
||||
</div>
|
||||
{% endfor %}
|
||||
22
tests/django_cms/cms/toolbar/dragitem_menu.html
Normal file
22
tests/django_cms/cms/toolbar/dragitem_menu.html
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
{% load i18n %}
|
||||
{% regroup plugin_menu by module as module_list %}
|
||||
{% for module in module_list %}
|
||||
<div class="cms-submenu-item cms-submenu-item-title">
|
||||
<span>
|
||||
{% if module.grouper %}
|
||||
{{ module.grouper|capfirst }}
|
||||
{% else %}
|
||||
{% trans "Available plugins" %}
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
{% for p in module.list %}
|
||||
{% if p.value != 'AliasPlugin' and p.value != 'PlaceholderPlugin' %}
|
||||
<div class="cms-submenu-item">
|
||||
<a data-rel="add" href="{{ p.value }}">
|
||||
{{ p.name }}
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
{% endfor %}
|
||||
3
tests/django_cms/cms/toolbar/items/break.html
Normal file
3
tests/django_cms/cms/toolbar/items/break.html
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
<li class="cms-toolbar-item-navigation-break">
|
||||
-----
|
||||
</li>
|
||||
4
tests/django_cms/cms/toolbar/items/button.html
Normal file
4
tests/django_cms/cms/toolbar/items/button.html
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
<a href="{{ url }}"
|
||||
class="cms-btn{% if active %}cms-btn-active{% endif %}{% if disabled %}cms-btn-disabled{% endif %}{% if extra_classes %}{{ extra_classes|join:' ' }}{% endif %}">
|
||||
{{ name }}
|
||||
</a>
|
||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue