From 95e22ec018b2e0c0c3bb04e94be1d80d206d12ec Mon Sep 17 00:00:00 2001 From: Dylan Hillerbrand Date: Fri, 29 Nov 2024 12:31:38 -0500 Subject: [PATCH 1/6] refactor(css): move all custom stylings to single css file Format the html for these pages. --- django/cantusdb_project/static/style.css | 131 +++- django/cantusdb_project/templates/base.html | 824 +++++++++----------- nginx/error_pages/500.html | 36 +- nginx/error_pages/502.html | 34 +- nginx/error_pages/504.html | 34 +- 5 files changed, 557 insertions(+), 502 deletions(-) diff --git a/django/cantusdb_project/static/style.css b/django/cantusdb_project/static/style.css index 2792de766..7c542a23d 100644 --- a/django/cantusdb_project/static/style.css +++ b/django/cantusdb_project/static/style.css @@ -1,15 +1,140 @@ body { background-image: url("background.jpg"); - font-family: "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif; } -.page { +.error-page { margin: auto; max-width: 600px; background-color: white; padding: 20px; + font-family: "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif; } -h1 { +.error-page h1 { font-weight: 500; +} + +html { + position: relative; + min-height: 90%; +} + +body { + margin-bottom: 30px; + /* Margin bottom by footer height */ + background-image: url("background.jpg"); +} + +.container { + /* this is relevant for the Article List page */ + overflow-wrap: break-word; +} + +.footer { + position: absolute; + bottom: 0; + width: 100%; + height: 30px; +} + +.footer li { + padding: 5px 0px !important +} + +.bg-footer { + background-color: #CC3333; +} + +/* Change dropdown selected background to blue */ +.dropdown .dropdown-menu .dropdown-item:active, +.dropdown .dropdown-menu .dropdown-item:hover { + background-color: #f6f6f6 !important; + color: #CC3333; +} + +hr.color { + border-top: 1px solid lightblue !important; +} + +.nav-link { + color: black; +} + +.nav-item { + margin: 0px 10px; +} + +.nav-item .nav-link .small { + color: #5e5e5f; +} + +.navbar-toggler { + margin: 0px 10px; +} + +.navbar-brand { + margin: 0px 10px; +} + +.navbar-brand img { + max-height: 60px; + width: auto; +} + +.border-top { + border-style: solid none none; + border-width: 5px !important; + border-color: #CC3333 !important; +} + +a { + color: #922; +} + +a:hover { + color: #922; + text-decoration: underline; +} + +.footer h5 { + margin: 25px 0px 10px +} + +/* links, appearing in sidebars, preceded with guillemets ("»"s) */ +.guillemet { + display: block +} + +.guillemet::before { + content: "» " +} + +.select2 { + width: 100% !important; +} + +/* this class is used for displaying results under the global search bar */ +.list-group-item-action:hover { + color: black; + transition: background-color .25s; + background-color: #CC3333; +} + +@media print { + + header, + footer, + .search-bar, + .sidebar { + display: none; + } +} + +@media (max-width: 992px) { + + /* 992px = bootstrap large breakpoint */ + .main-content { + margin-bottom: 16px; + + } } \ No newline at end of file diff --git a/django/cantusdb_project/templates/base.html b/django/cantusdb_project/templates/base.html index 9039febab..1b43bdf80 100644 --- a/django/cantusdb_project/templates/base.html +++ b/django/cantusdb_project/templates/base.html @@ -1,494 +1,400 @@ {% load static %} -{% load helper_tags %} {# for has_group #} - +{% load helper_tags %} +{# for has_group #} - - {% if PROJECT_ENVIRONMENT == "PRODUCTION" %} - - - - {% endif %} - {% if not PROJECT_ENVIRONMENT == "PRODUCTION" %} - {# to ensure Google/etc. only indexes the main production site, and not staging #} - - {% endif %} - {% block title %} - Cantus Database - {% endblock %} - - - - - - - - - - - - - - - - - - - - - {% block scripts %} - {% endblock %} - - - -
- -
- +
+ +
+ +
+ {% block content %} + {% endblock %} +
+ + - diff --git a/nginx/error_pages/500.html b/nginx/error_pages/500.html index 8d987ae68..de72faa37 100644 --- a/nginx/error_pages/500.html +++ b/nginx/error_pages/500.html @@ -1,16 +1,24 @@ - - 500 Internal Server Error | Cantus Manuscript Database - - - - -
- -

500 Internal Server Error

-

The server encountered a temporary error and could not fulfill your request.

-

Our apologies. Please wait a few moments and try again.

-
- - \ No newline at end of file + + 500 Internal Server Error | Cantus Manuscript Database + + + + +
+ + + +

+ 500 Internal Server Error +

+

+ The server encountered a temporary error and could not fulfill your request. +

+

+ Our apologies. Please wait a few moments and try again. +

+
+ + diff --git a/nginx/error_pages/502.html b/nginx/error_pages/502.html index c9b67bfdf..864b9e1a8 100644 --- a/nginx/error_pages/502.html +++ b/nginx/error_pages/502.html @@ -1,16 +1,24 @@ - - 502 Bad Gateway | Cantus Manuscript Database - - - - -
- -

502 Bad Gateway

-

The server encountered a temporary error and could not fulfill your request.

-

Our apologies. Please wait a few moments and try again.

-
- + + 502 Bad Gateway | Cantus Manuscript Database + + + + +
+ + + +

+ 502 Bad Gateway +

+

+ The server encountered a temporary error and could not fulfill your request. +

+

+ Our apologies. Please wait a few moments and try again. +

+
+ diff --git a/nginx/error_pages/504.html b/nginx/error_pages/504.html index 74fb4a365..f45edb853 100644 --- a/nginx/error_pages/504.html +++ b/nginx/error_pages/504.html @@ -1,16 +1,24 @@ - - 504 Gateway Timeout | Cantus Manuscript Database - - - - -
- -

504 Gateway Timeout

-

The server took too long to respond and could not fulfill your request.

-

Our apologies. Please wait a few moments and try again.

-
- + + 504 Gateway Timeout | Cantus Manuscript Database + + + + +
+ + + +

+ 504 Gateway Timeout +

+

+ The server took too long to respond and could not fulfill your request. +

+

+ Our apologies. Please wait a few moments and try again. +

+
+ From b0026fc68b9de2778267ebdc01a0ff36ffcce2e7 Mon Sep 17 00:00:00 2001 From: Dylan Hillerbrand Date: Mon, 2 Dec 2024 14:53:38 -0500 Subject: [PATCH 2/6] build(deps): upgrade djlint --- poetry.lock | 106 +++++++++++++++++++++++++++++++------------------ pyproject.toml | 2 +- 2 files changed, 69 insertions(+), 39 deletions(-) diff --git a/poetry.lock b/poetry.lock index 73e0a8f94..a94eff4ee 100644 --- a/poetry.lock +++ b/poetry.lock @@ -472,33 +472,33 @@ typing-extensions = "*" [[package]] name = "djlint" -version = "1.36.1" +version = "1.36.3" description = "HTML Template Linter and Formatter" optional = false python-versions = ">=3.9" files = [ - {file = "djlint-1.36.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef40527fd6cd82cdd18f65a6bf5b486b767d2386f6c21f2ebd60e5d88f487fe8"}, - {file = "djlint-1.36.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4712de3dea172000a098da6a0cd709d158909b4964ba0f68bee584cef18b4878"}, - {file = "djlint-1.36.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:63d01c1425170b7059d68a3b01709e1c31d2cd6520a1eb0166e6670fd250518a"}, - {file = "djlint-1.36.1-cp310-cp310-win_amd64.whl", hash = "sha256:65585a97d3a37760b4c1fbd089a3573506ad0ab2885119322a66231f911d113f"}, - {file = "djlint-1.36.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:607437a0a230462916858c269bc5dfd15ff71b27d15dfd1ad6e96b3da9cbd8f6"}, - {file = "djlint-1.36.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8ddc9ae6b83b288465f6685b24797adbde79952d6e1a5276026e5ef479bac76f"}, - {file = "djlint-1.36.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:001e5124b0ebab60a2044134abd11ff11dee772e7c3caaa2c8d12eb5d3b1f1dc"}, - {file = "djlint-1.36.1-cp311-cp311-win_amd64.whl", hash = "sha256:095d62f3cabbac08683c51c1d9dacab522b54437a2a317df9e134599360f7b89"}, - {file = "djlint-1.36.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:210f319c2d22489aebc0e9c1acd5015ca3892b66fa35647344511b3c03fcbe82"}, - {file = "djlint-1.36.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7aa3db13d7702c35f4e408325061d9d4e84d006c99bb3e55fddf2b2543736923"}, - {file = "djlint-1.36.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f907e97f4d67f4423dc71671592891cfd9cd311aeef14db25633f292dbf7048"}, - {file = "djlint-1.36.1-cp312-cp312-win_amd64.whl", hash = "sha256:abadf6b61dc53d81710f230542f57f2d470b7503cd3108ad8a0113271c0514dd"}, - {file = "djlint-1.36.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7f31646435385eec1d4b03dad7bebb5e4078d9893c60d490a685535bd6303c83"}, - {file = "djlint-1.36.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4399477ac51f9c8147eedbef70aa8465eccba6759d875d1feec6782744aa168a"}, - {file = "djlint-1.36.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f08c217b17d3ae3c0e3b5fff57fb708029cceda6e232f5a54ff1b3aeb43a7540"}, - {file = "djlint-1.36.1-cp313-cp313-win_amd64.whl", hash = "sha256:1577490802ca4697af3488ed13066c9214ef0f625a96aa20d4f297e37aa19303"}, - {file = "djlint-1.36.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ae356faf8180c7629ca705b7b9d8c9269b2c53273a1887a438a21b8fa263588"}, - {file = "djlint-1.36.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2237ac5cecd2524960e1684f64ce358624b0d769b7404e5aad415750ad00edc9"}, - {file = "djlint-1.36.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02c22352a49c053ff6260428ed571afb783011d20afc98b44bbe1dd2fa2d5418"}, - {file = "djlint-1.36.1-cp39-cp39-win_amd64.whl", hash = "sha256:99a2debeea2e931b68360306fdbf13861e3d6f96037a9d882f3d4d5e44fdc319"}, - {file = "djlint-1.36.1-py3-none-any.whl", hash = "sha256:950782b396dd82b74622c09d7e4c52328e56a3b03c8ac790c319708e5caa0686"}, - {file = "djlint-1.36.1.tar.gz", hash = "sha256:f7260637ed72c270fa6dd4a87628e1a21c49b24a46df52e4e26f44d4934fb97c"}, + {file = "djlint-1.36.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2ae7c620b58e16d6bf003bd7de3f71376a7a3daa79dc02e77f3726d5a75243f2"}, + {file = "djlint-1.36.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e155ce0970d4a28d0a2e9f2e106733a2ad05910eee90e056b056d48049e4a97b"}, + {file = "djlint-1.36.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e8bb0406e60cc696806aa6226df137618f3889c72f2dbdfa76c908c99151579"}, + {file = "djlint-1.36.3-cp310-cp310-win_amd64.whl", hash = "sha256:76d32faf988ad58ef2e7a11d04046fc984b98391761bf1b61f9a6044da53d414"}, + {file = "djlint-1.36.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:32f7a5834000fff22e94d1d35f95aaf2e06f2af2cae18af0ed2a4e215d60e730"}, + {file = "djlint-1.36.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3eb1b9c0be499e63e8822a051e7e55f188ff1ab8172a85d338a8ae21c872060e"}, + {file = "djlint-1.36.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c2e0dd1f26eb472b8c84eb70d6482877b6497a1fd031d7534864088f016d5ea"}, + {file = "djlint-1.36.3-cp311-cp311-win_amd64.whl", hash = "sha256:a06b531ab9d049c46ad4d2365d1857004a1a9dd0c23c8eae94aa0d233c6ec00d"}, + {file = "djlint-1.36.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e66361a865e5e5a4bbcb40f56af7f256fd02cbf9d48b763a40172749cc294084"}, + {file = "djlint-1.36.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:36e102b80d83e9ac2e6be9a9ded32fb925945f6dbc7a7156e4415de1b0aa0dba"}, + {file = "djlint-1.36.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ac4b7370d80bd82281e57a470de8923ac494ffb571b89d8787cef57c738c69a"}, + {file = "djlint-1.36.3-cp312-cp312-win_amd64.whl", hash = "sha256:107cc56bbef13d60cc0ae774a4d52881bf98e37c02412e573827a3e549217e3a"}, + {file = "djlint-1.36.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2a9f51971d6e63c41ea9b3831c928e1f21ae6fe57e87a3452cfe672d10232433"}, + {file = "djlint-1.36.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:080c98714b55d8f0fef5c42beaee8247ebb2e3d46b0936473bd6c47808bb6302"}, + {file = "djlint-1.36.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f65a80e0b5cb13d357ea51ca6570b34c2d9d18974c1e57142de760ea27d49ed0"}, + {file = "djlint-1.36.3-cp313-cp313-win_amd64.whl", hash = "sha256:95ef6b67ef7f2b90d9434bba37d572031079001dc8524add85c00ef0386bda1e"}, + {file = "djlint-1.36.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8e2317a32094d525bc41cd11c8dc064bf38d1b442c99cc3f7c4a2616b5e6ce6e"}, + {file = "djlint-1.36.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e82266c28793cd15f97b93535d72bfbc77306eaaf6b210dd90910383a814ee6c"}, + {file = "djlint-1.36.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01b2101c2d1b079e8d545e6d9d03487fcca14d2371e44cbfdedee15b0bf4567c"}, + {file = "djlint-1.36.3-cp39-cp39-win_amd64.whl", hash = "sha256:15cde63ef28beb5194ff4137883025f125676ece1b574b64a3e1c6daed734639"}, + {file = "djlint-1.36.3-py3-none-any.whl", hash = "sha256:0c05cd5b76785de2c41a2420c06ffd112800bfc0f9c0f399cc7cea7c42557f4c"}, + {file = "djlint-1.36.3.tar.gz", hash = "sha256:d85735da34bc7ac93ad8ef9b4822cc2a23d5f0ce33f25438737b8dca1d404f78"}, ] [package.dependencies] @@ -603,13 +603,13 @@ six = ">=1.13.0" [[package]] name = "json5" -version = "0.9.28" +version = "0.10.0" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8.0" files = [ - {file = "json5-0.9.28-py3-none-any.whl", hash = "sha256:29c56f1accdd8bc2e037321237662034a7e07921e2b7223281a5ce2c46f0c4df"}, - {file = "json5-0.9.28.tar.gz", hash = "sha256:1f82f36e615bc5b42f1bbd49dbc94b12563c56408c6ffa06414ea310890e9a6e"}, + {file = "json5-0.10.0-py3-none-any.whl", hash = "sha256:19b23410220a7271e8377f81ba8aacba2fdd56947fbb137ee5977cbe1f5e8dfa"}, + {file = "json5-0.10.0.tar.gz", hash = "sha256:e66941c8f0a02026943c52c2eb34ebeb2a6f819a0be05920a6f5243cd30fd559"}, ] [package.extras] @@ -898,17 +898,17 @@ files = [ [[package]] name = "pylint" -version = "3.3.1" +version = "3.3.2" description = "python code static checker" optional = false python-versions = ">=3.9.0" files = [ - {file = "pylint-3.3.1-py3-none-any.whl", hash = "sha256:2f846a466dd023513240bc140ad2dd73bfc080a5d85a710afdb728c420a5a2b9"}, - {file = "pylint-3.3.1.tar.gz", hash = "sha256:9f3dcc87b1203e612b78d91a896407787e708b3f189b5fa0b307712d49ff0c6e"}, + {file = "pylint-3.3.2-py3-none-any.whl", hash = "sha256:77f068c287d49b8683cd7c6e624243c74f92890f767f106ffa1ddf3c0a54cb7a"}, + {file = "pylint-3.3.2.tar.gz", hash = "sha256:9ec054ec992cd05ad30a6df1676229739a73f8feeabf3912c995d17601052b01"}, ] [package.dependencies] -astroid = ">=3.3.4,<=3.4.0-dev0" +astroid = ">=3.3.5,<=3.4.0-dev0" colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} dill = [ {version = ">=0.2", markers = "python_version < \"3.11\""}, @@ -1197,13 +1197,43 @@ files = [ [[package]] name = "tomli" -version = "2.1.0" +version = "2.2.1" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" files = [ - {file = "tomli-2.1.0-py3-none-any.whl", hash = "sha256:a5c57c3d1c56f5ccdf89f6523458f60ef716e210fc47c4cfb188c5ba473e0391"}, - {file = "tomli-2.1.0.tar.gz", hash = "sha256:3f646cae2aec94e17d04973e4249548320197cfabdf130015d023de4b74d8ab8"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, + {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, + {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, + {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, + {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, + {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, + {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, + {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, + {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, + {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, + {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, + {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, + {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, + {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, + {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, + {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, + {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, + {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, ] [[package]] @@ -1219,20 +1249,20 @@ files = [ [[package]] name = "tqdm" -version = "4.67.0" +version = "4.67.1" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.67.0-py3-none-any.whl", hash = "sha256:0cd8af9d56911acab92182e88d763100d4788bdf421d251616040cc4d44863be"}, - {file = "tqdm-4.67.0.tar.gz", hash = "sha256:fe5a6f95e6fe0b9755e9469b77b9c3cf850048224ecaa8293d7d2d31f97d869a"}, + {file = "tqdm-4.67.1-py3-none-any.whl", hash = "sha256:26445eca388f82e72884e0d580d5464cd801a3ea01e63e5601bdff9ba6a48de2"}, + {file = "tqdm-4.67.1.tar.gz", hash = "sha256:f8aef9c52c08c13a65f30ea34f4e5aac3fd1a34959879d7e59e63027286627f2"}, ] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [package.extras] -dev = ["pytest (>=6)", "pytest-cov", "pytest-timeout", "pytest-xdist"] +dev = ["nbval", "pytest (>=6)", "pytest-asyncio (>=0.24)", "pytest-cov", "pytest-timeout"] discord = ["requests"] notebook = ["ipywidgets (>=6)"] slack = ["slack-sdk"] @@ -1411,4 +1441,4 @@ watchdog = ["watchdog (>=2.3)"] [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "9473fcfdec1ce1fc58edb72fdf471cf132cd7a831d2ae39572dc4df911540184" +content-hash = "8d399601ed75f8219575ad4328e2e0a63db787806b2ebf1dc3e09918c0f86f31" diff --git a/pyproject.toml b/pyproject.toml index 441065053..fdf0e23c8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ django-stubs = {git = "https://github.com/typeddjango/django-stubs.git", rev = " django-extensions = "^3.2.3" werkzeug = "^3.0.6" types-requests = "^2.32.0.20240712" -djlint = "^1.36.1" +djlint = "^1.36.3" [build-system] From 0c4bcc9ea05863b8154fc569a0f542a93b7561c3 Mon Sep 17 00:00:00 2001 From: Dylan Hillerbrand Date: Mon, 2 Dec 2024 14:54:52 -0500 Subject: [PATCH 3/6] build(dev environment): don't require debug pin in development --- docker-compose-development.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose-development.yml b/docker-compose-development.yml index 08d3eca60..0dc295a16 100644 --- a/docker-compose-development.yml +++ b/docker-compose-development.yml @@ -19,7 +19,7 @@ services: restart: always depends_on: - postgres - command: [ "python", "manage.py", "runserver_plus", "0:8000" ] + command: [ "python", "manage.py", "runserver_plus", "0:8000", "--nopin" ] nginx: build: From 22a34cf7920439599b4cd5830d79f86de2db9d1c Mon Sep 17 00:00:00 2001 From: Dylan Hillerbrand Date: Fri, 6 Dec 2024 12:33:04 -0500 Subject: [PATCH 4/6] deps(bootstrap): upgrade to bootstrap 5 --- .../articles/templates/article_detail.html | 11 +- .../articles/templates/article_list.html | 39 +- django/cantusdb_project/main_app/forms.py | 18 +- .../main_app/templates/400.html | 36 +- .../main_app/templates/403.html | 37 +- .../main_app/templates/404.html | 25 +- .../main_app/templates/browse_chants.html | 260 ++++---- .../main_app/templates/century_detail.html | 31 +- .../main_app/templates/chant_create.html | 441 ++++++------ .../main_app/templates/chant_delete.html | 34 +- .../main_app/templates/chant_detail.html | 255 +++---- .../main_app/templates/chant_edit.html | 476 ++++++------- .../main_app/templates/chant_search.html | 463 +++++++------ .../templates/chant_seq_by_cantus_id.html | 49 +- .../templates/chant_syllabification_edit.html | 141 ++-- .../main_app/templates/ci_search.html | 142 ++-- .../main_app/templates/contact.html | 18 +- .../main_app/templates/content_overview.html | 200 +++--- .../main_app/templates/feast_detail.html | 87 +-- .../main_app/templates/feast_list.html | 62 +- .../filterable_table_with_search_bar.html | 27 +- .../main_app/templates/full_inventory.html | 194 +++--- .../main_app/templates/genre_detail.html | 19 +- .../main_app/templates/genre_list.html | 20 +- .../main_app/templates/global_search_bar.html | 23 +- .../main_app/templates/indexer_list.html | 28 +- .../templates/institution_detail.html | 35 +- .../main_app/templates/institution_list.html | 20 +- .../main_app/templates/items_count.html | 12 +- .../main_app/templates/melody_search.html | 200 +++--- .../main_app/templates/notation_detail.html | 33 +- .../main_app/templates/pagination.html | 15 +- .../main_app/templates/provenance_detail.html | 31 +- .../registration/change_password.html | 88 ++- .../templates/registration/login.html | 78 +-- .../registration/reset_password.html | 55 +- .../registration/reset_password_complete.html | 21 +- .../registration/reset_password_confirm.html | 63 +- .../registration/reset_password_sent.html | 21 +- .../main_app/templates/sequence_detail.html | 233 +++---- .../main_app/templates/sequence_edit.html | 287 ++++---- .../main_app/templates/sequence_list.html | 80 +-- .../main_app/templates/service_detail.html | 18 +- .../main_app/templates/service_list.html | 10 +- .../single_column_with_search_bar.html | 37 +- .../main_app/templates/source_create.html | 392 +++++------ .../main_app/templates/source_delete.html | 68 +- .../main_app/templates/source_detail.html | 631 +++++++++--------- .../main_app/templates/source_edit.html | 324 ++++----- .../main_app/templates/source_list.html | 195 +++--- .../main_app/templates/user_detail.html | 29 +- .../main_app/templates/user_list.html | 37 +- .../main_app/templates/user_source_list.html | 62 +- django/cantusdb_project/main_app/widgets.py | 12 +- .../static/js/chant_create.js | 40 +- .../static/js/chant_detail.js | 71 +- .../static/js/melody_search.js | 18 +- django/cantusdb_project/static/style.css | 81 ++- django/cantusdb_project/templates/base.html | 593 ++++++++-------- .../templates/base_page_with_side_cards.html | 33 +- .../templates/flatpages/default.html | 68 +- 61 files changed, 3396 insertions(+), 3731 deletions(-) diff --git a/django/cantusdb_project/articles/templates/article_detail.html b/django/cantusdb_project/articles/templates/article_detail.html index 6bf4813b7..27056af71 100644 --- a/django/cantusdb_project/articles/templates/article_detail.html +++ b/django/cantusdb_project/articles/templates/article_detail.html @@ -1,15 +1,14 @@ {% extends "base_page_with_side_cards.html" %} -{% load helper_tags %} {# for recent_articles #} +{% load helper_tags %} +{# for recent_articles #} {% block title %} -{{ article.title }} | Cantus Database + {{ article.title }} | Cantus Database {% endblock %} - {% block uppersidebar %} - -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django/cantusdb_project/articles/templates/article_list.html b/django/cantusdb_project/articles/templates/article_list.html index 993286b2a..e6aee9082 100644 --- a/django/cantusdb_project/articles/templates/article_list.html +++ b/django/cantusdb_project/articles/templates/article_list.html @@ -1,29 +1,32 @@ {% extends "base_page_with_side_cards.html" %} -{% load helper_tags %} {# for recent_articles #}\ +{% load helper_tags %} +{# for recent_articles #}\ {% block title %} -What's New | Cantus Database + What's New | Cantus Database {% endblock %} {% block uppersidebar %} - + {% endblock %} {% block maincontent %} -

What's New

+

+ What's New +

{% for article in articles %} -
-
- {{ article.date_created|date:"D, m/d/Y - H:i" }} -

- {{ article.title }} -

-
- - {{ article.body.html|safe|truncatechars_html:3000 }} - +
+
+ {{ article.date_created|date:"D, m/d/Y - H:i" }} +

+ {{ article.title }} +

+
+ + {{ article.body.html|safe|truncatechars_html:3000 }} + +
-
{% endfor %} {% include "pagination.html" %} {% endblock %} @@ -36,4 +39,4 @@

{% recent_articles %}

-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django/cantusdb_project/main_app/forms.py b/django/cantusdb_project/main_app/forms.py index 322a70870..81a96107f 100644 --- a/django/cantusdb_project/main_app/forms.py +++ b/django/cantusdb_project/main_app/forms.py @@ -286,6 +286,9 @@ class Meta: widgets = { # "title": TextInputWidget(), # "siglum": TextInputWidget(), + "holding_institution": autocomplete.ModelSelect2( + url="holding-autocomplete" + ), "shelfmark": TextInputWidget(), "provenance": autocomplete.ModelSelect2(url="provenance-autocomplete"), "name": TextInputWidget(), @@ -325,12 +328,6 @@ class Meta: "segment_m2m": CheckboxNameModelMultipleChoiceField, } - holding_institution = forms.ModelChoiceField( - queryset=Institution.objects.all(), - widget=autocomplete.ModelSelect2(url="holding-autocomplete"), - required=False, - ) - complete_inventory = StyledChoiceField( choices=COMPLETE_INVENTORY_FORM_CHOICES, required=False ) @@ -477,6 +474,9 @@ class Meta: "source_completeness", ] widgets = { + "holding_institution": autocomplete.ModelSelect2( + url="holding-autocomplete" + ), "shelfmark": TextInputWidget(), "segment_m2m": CheckboxSelectMultiple(), "name": TextInputWidget(), @@ -518,12 +518,6 @@ class Meta: "segment_m2m": CheckboxNameModelMultipleChoiceField, } - holding_institution = forms.ModelChoiceField( - queryset=Institution.objects.all(), - widget=autocomplete.ModelSelect2(url="holding-autocomplete"), - required=False, - ) - complete_inventory = StyledChoiceField( choices=COMPLETE_INVENTORY_FORM_CHOICES, required=False ) diff --git a/django/cantusdb_project/main_app/templates/400.html b/django/cantusdb_project/main_app/templates/400.html index 2d12bcd82..e4eff000e 100644 --- a/django/cantusdb_project/main_app/templates/400.html +++ b/django/cantusdb_project/main_app/templates/400.html @@ -1,39 +1,15 @@ +{% extends 'base.html' %} {% load static %} - - - - - - - - 400 Bad Request | Cantus Database - - - - - - -
- {% block content %} -
+{% block title %}400 Bad Request | Cantus Database{% endblock %} +{% block content %} +

400

Bad Request
-
+

Your request couldn't be understood by the server.

- {% endblock %} -
- - - \ No newline at end of file +{% endblock %} diff --git a/django/cantusdb_project/main_app/templates/403.html b/django/cantusdb_project/main_app/templates/403.html index 2a4426cca..02f3f3edf 100644 --- a/django/cantusdb_project/main_app/templates/403.html +++ b/django/cantusdb_project/main_app/templates/403.html @@ -1,22 +1,23 @@ {% extends "base.html" %} -{% block title %} - 403 Access Denied | Cantus Database -{% endblock %} - +{% block title %}403 Access Denied | Cantus Database{% endblock %} {% block content %} -
-
-
-

403

-
Access denied
-
-
-
You are not authorized to access this page.
- {% if not user.is_authenticated %} -
This could be because you are not currently logged in. If you are a contributor and believe you should be able to see this page, try logging in.
- {% endif %} -
+
+
+
+

403

+
Access denied
+
+
+
+ You are not authorized to access this page. +
+ {% if not user.is_authenticated %} +
+ This could be because you are not currently logged in. If you are a contributor and believe you should be able to see this page, try logging in. +
+ {% endif %} +
+
-
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django/cantusdb_project/main_app/templates/404.html b/django/cantusdb_project/main_app/templates/404.html index 5f2ec4e51..d98485f39 100644 --- a/django/cantusdb_project/main_app/templates/404.html +++ b/django/cantusdb_project/main_app/templates/404.html @@ -1,19 +1,14 @@ {% extends "base.html" %} -{% block title %} - 404 Not Found | Cantus Database -{% endblock %} - +{% block title %}404 Not Found | Cantus Database{% endblock %} {% block content %} -
-
-
-

404

-
Page not found
-
-

- We couldn't find a page at this address. -

+
+
+
+

404

+
Page not found
+
+

We couldn't find a page at this address.

+
-
-{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/django/cantusdb_project/main_app/templates/browse_chants.html b/django/cantusdb_project/main_app/templates/browse_chants.html index 8ac640490..3daddd4c4 100644 --- a/django/cantusdb_project/main_app/templates/browse_chants.html +++ b/django/cantusdb_project/main_app/templates/browse_chants.html @@ -1,39 +1,35 @@ {% extends "base_page_with_side_cards.html" %} -{% block title %} - Browse Chants | Cantus Database -{% endblock %} - -{% block scripts %} - -{% endblock %} - +{% block title %}Browse Chants | Cantus Database{% endblock %} +{% block scripts %}{% endblock %} {% block uppersidebar %} - + {% endblock %} - {% block maincontent %}

Browse Chants

- Displaying {{ page_obj.start_index }}-{{ page_obj.end_index }} of {{ page_obj.paginator.count }} chants - + Displaying {{ page_obj.start_index }}-{{ page_obj.end_index }} of {{ page_obj.paginator.count }} chants.
-
-
- - {% comment %} {% endcomment %} {% for source_obj in sources %} - + {% endfor %}
-
- -
-
- - {% for feast in feasts %} @@ -41,16 +37,24 @@

Browse Chants

- -
-
- - +
+
+ +
- -
- - {% for genre in genres %} @@ -59,21 +63,28 @@

Browse Chants

{% if user_can_proofread_source %} -
- {% for field in proofread_filter_form %} -
- - {% for radio in field %} - - {% endfor %} -
- {% endfor %} +
+
+ + Proofread Status + + {% for field in proofread_filter_form %} +
+ {{ field.label }} +
+ {% for radio in field %} + + {{ radio.tag }} + {% endfor %} +
+
+ {% endfor %} +
{% endif %} - {% with exists_on_cantus_ultimus=source.exists_on_cantus_ultimus %} {% if chants %} @@ -97,53 +108,60 @@

Browse Chants

{% for chant in chants %} - - {{ chant.folio|default:"" }} - {{ chant.c_sequence|default_if_none:"" }} {# default_if_none: sometimes, c_sequence is 0, and should still be displayed #} - - {{ chant.incipit|default:"" }} -

{{ chant.manuscript_full_text_std_spelling|default:"" }}
- - {% if chant.volpiano and chant.source.id != 680970 %} - {{ chant.volpiano|default:"" }} - {% endif %} -

- - - {% if chant.feast %} - {{ chant.feast.name|default:"" }} - {% endif %} - - - {% if chant.service %} - {{ chant.service.name|default:"" }} - {% endif %} - - - {% if chant.genre %} - {{ chant.genre.name|default:"" }} - {% endif %} - - {{ chant.position|default:"" }} - - {{ chant.cantus_id|default:"" }} - - {{ chant.mode|default:"" }} - - {% if exists_on_cantus_ultimus %} - - Image - - {% elif chant.image_link %} - Image - {% endif %} - - {% if user_can_edit_chant %} - - Edit + + + {{ chant.folio|default:"" }} - {% endif %} - + {{ chant.c_sequence|default_if_none:"" }} + {# default_if_none: sometimes, c_sequence is 0, and should still be displayed #} + + {{ chant.incipit|default:"" }} +

+ {{ chant.manuscript_full_text_std_spelling|default:"" }} +
+ + {% if chant.volpiano and chant.source.id != 680970 %} + {{ chant.volpiano|default:"" }} + {% endif %} +

+ + + {% if chant.feast %} + {{ chant.feast.name|default:"" }} + {% endif %} + + + {% if chant.service %} + {{ chant.service.name|default:"" }} + {% endif %} + + + {% if chant.genre %} + {{ chant.genre.name|default:"" }} + {% endif %} + + {{ chant.position|default:"" }} + + {{ chant.cantus_id|default:"" }} + + {{ chant.mode|default:"" }} + + {% if exists_on_cantus_ultimus %} + Image + {% elif chant.image_link %} + Image + {% endif %} + + {% if user_can_edit_chant %} + + Edit + + {% endif %} + {% endfor %} @@ -153,53 +171,63 @@

Browse Chants

{% endif %} {% endwith %} {% endblock %} - {% block lowersidebar %}
- -
- {% if previous_folio %} {{ previous_folio }} < {% endif %} {% if next_folio %}  > {{ next_folio }} - {% endif %} -
- - + {% for feast_id, feast_name, folio_range in feasts_with_folios %} {% endfor %} -
- View all chants - View full inventory +
+ View all chants + View full inventory {% if source.exists_on_cantus_ultimus %} - View inventory with images + View inventory with images {% endif %} {% if source.image_link %} View images on external site - {% endif %} - CSV export - Search chants in this source - Search melodies in this source - Analyse this source (Cantus Analysis Tool) + {% endif %} + CSV export + Search chants in this source + Search melodies in this source + Analyse this source (Cantus Analysis Tool)
-
- +
{% endblock %} diff --git a/django/cantusdb_project/main_app/templates/century_detail.html b/django/cantusdb_project/main_app/templates/century_detail.html index 631c6afe3..ad268eb3e 100644 --- a/django/cantusdb_project/main_app/templates/century_detail.html +++ b/django/cantusdb_project/main_app/templates/century_detail.html @@ -1,24 +1,13 @@ {% extends "single_column_with_search_bar.html" %} - -{% block title %} - {{ century.name }} | Cantus Database -{% endblock %} - -{% block header %} -

{{ century.name }}

-{% endblock %} +{% block title %}{{ century.name }} | Cantus Database{% endblock %} +{% block header %}

{{ century.name }}

{% endblock %} {% block maincontent %} -
-
- -
-
+ {% endblock %} diff --git a/django/cantusdb_project/main_app/templates/chant_create.html b/django/cantusdb_project/main_app/templates/chant_create.html index 69f36bc25..d0aa4c693 100644 --- a/django/cantusdb_project/main_app/templates/chant_create.html +++ b/django/cantusdb_project/main_app/templates/chant_create.html @@ -1,357 +1,298 @@ {% extends "base_page_with_side_cards.html" %} {% load static %} - -{% block title %} - Create Chant | Cantus Database -{% endblock %} - +{% block title %}Create Chant | Cantus Database{% endblock %} {% block scripts %} - + {{ form.media }} {% endblock %} - {% block uppersidebar %} - + {% endblock %} - {% block maincontent %}

Create Chant

{% if messages %} -
- {% for message in messages %} - × - {{ message }} - {% endfor %} -
+
+ {% for message in messages %} + × + {{ message }} + {% endfor %} +
{% endif %} - {% if form.errors %} -
- × - {% for error in form.non_field_errors %} - × - {{ error }} - {% endfor %} - {% for field in form %} - {% if field.errors %} - × - {{ field.label }}: {{ field.errors|striptags }} - {% endif %} - {% endfor %} -
+
+ × + {% for error in form.non_field_errors %}{{ error }}{% endfor %} + {% for field in form %} + {% if field.errors %}{{ field.label }}: {{ field.errors|striptags }}{% endif %} + {% endfor %} +
{% endif %} - -
{% csrf_token %} -
- -
- {{ form.marginalia.label_tag }} + + {% csrf_token %} +
+
+ {{ form.marginalia.label_tag }} {{ form.marginalia }}
- -
- {{ form.folio.label_tag }}* +
+ {{ form.folio.label_tag }}* {{ form.folio }} -

{{ form.folio.help_text}}

+

{{ form.folio.help_text }}

- -
- +
+ {{ form.c_sequence }} -

{{ form.c_sequence.help_text}}

+

{{ form.c_sequence.help_text }}

-
- -
-
- -
{{ form.service }} - ? +
+
+ + {{ form.service }} + ?
- -
-
- {{ form.genre.label_tag }} -
{{ form.genre }} +
+
+ {{ form.genre.label_tag }} + {{ form.genre }}
- -
-
- {{ form.position.label_tag }} +
+
+ {{ form.position.label_tag }} {{ form.position }}
- -
- +
+ {{ form.cantus_id }}
- -
- {{ form.project.label_tag }} +
+ {{ form.project.label_tag }} {{ form.project }}
- -
- {{ form.liturgical_function.label_tag }} +
+ {{ form.liturgical_function.label_tag }} {{ form.liturgical_function }} -
+
- -
- -
- {{ form.feast.label_tag }} -
{{ form.feast }} +
+
+ {{ form.feast.label_tag }} +
+ {{ form.feast }}
-
- -

- - {% if previous_chant %} - Feasts that follow: - {% for feast, count in suggested_feasts.items %} - {{ feast.name }} ({{ count }}x) | - {% endfor %} - - - {% endif %} - - +

+ {% if previous_chant %} + Feasts that follow: + {% for feast, count in suggested_feasts.items %} + {{ feast.name }} ({{ count }}x) | + {% endfor %} + + {% endif %}

- -
- -
- {{ form.mode.label_tag }} +
+
+ {{ form.mode.label_tag }} {{ form.mode }}
- -
- {{ form.finalis.label_tag }} +
+ {{ form.finalis.label_tag }} {{ form.finalis }}
- -
- {{ form.differentia.label_tag }} +
+ {{ form.differentia.label_tag }} {{ form.differentia }}
- -
- {{ form.extra.label_tag }} +
+ {{ form.extra.label_tag }} {{ form.extra }}
- -
- {{ form.polyphony.label_tag }} +
+ {{ form.polyphony.label_tag }} {{ form.polyphony }}
- -
-
- -
{{ form.diff_db }} -
- - For a list of Differentia IDs, refer to - the Differentiae Database. - -
+
+
+ + {{ form.diff_db }} +

+ For a list of Differentia IDs, refer to + the Differentiae Database. +

- -
- -
- +
+
+ {{ form.chant_range }} -

{{ form.chant_range.help_text }}

+

{{ form.chant_range.help_text }}

- -
- +
+ {{ form.melody_id }}
- -
- {{ form.addendum.label_tag }} +
+ {{ form.addendum.label_tag }} {{ form.addendum }}
-
-