From f2c5749a4e9482eb42317bce520e780702a689ee Mon Sep 17 00:00:00 2001 From: Shreyas Mayya Date: Mon, 6 Dec 2021 08:51:40 -0500 Subject: [PATCH 01/18] feat(destinations): add unknown status --- .../0013_alter_decision_admission_status.py | 34 +++++++++++++++++++ tjdests/apps/destinations/models.py | 2 ++ .../templates/destinations/student_list.html | 4 +++ 3 files changed, 40 insertions(+) create mode 100644 tjdests/apps/destinations/migrations/0013_alter_decision_admission_status.py diff --git a/tjdests/apps/destinations/migrations/0013_alter_decision_admission_status.py b/tjdests/apps/destinations/migrations/0013_alter_decision_admission_status.py new file mode 100644 index 0000000..07511fe --- /dev/null +++ b/tjdests/apps/destinations/migrations/0013_alter_decision_admission_status.py @@ -0,0 +1,34 @@ +# Generated by Django 3.2.9 on 2021-12-06 13:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("destinations", "0012_alter_decision_options"), + ] + + operations = [ + migrations.AlterField( + model_name="decision", + name="admission_status", + field=models.CharField( + choices=[ + ("ADMIT", "Admitted"), + ("WAITLIST", "Waitlisted"), + ("WAITLIST_ADMIT", "Waitlist-Admitted"), + ("WAITLIST_DENY", "Waitlist-Denied"), + ("DEFER", "Deferred"), + ("DEFER_ADMIT", "Deferred-Admitted"), + ("DEFER_DENY", "Deferred-Denied"), + ("DEFER_WAITLIST", "Deferred-Waitlisted"), + ("DEFER_WAITLIST_ADMIT", "Deferred-Waitlisted-Admitted"), + ("DEFER_WAITLIST_DENY", "Deferred-Waitlisted-Denied"), + ("DENY", "Denied"), + ("UNKNOWN", "Unknown"), + ], + max_length=20, + ), + ), + ] diff --git a/tjdests/apps/destinations/models.py b/tjdests/apps/destinations/models.py index f285c40..deb72fb 100644 --- a/tjdests/apps/destinations/models.py +++ b/tjdests/apps/destinations/models.py @@ -51,6 +51,7 @@ class Decision(models.Model): DEFER_WL_D = "DEFER_WAITLIST_DENY" DEFER = "DEFER" DENY = "DENY" + UNKNOWN = "UNKNOWN" ADMIT_TYPE_CHOICES = [ (ADMIT, "Admitted"), @@ -64,6 +65,7 @@ class Decision(models.Model): (DEFER_WL_A, "Deferred-Waitlisted-Admitted"), (DEFER_WL_D, "Deferred-Waitlisted-Denied"), (DENY, "Denied"), + (UNKNOWN, "Unknown"), ] admission_status = models.CharField(max_length=20, choices=ADMIT_TYPE_CHOICES) diff --git a/tjdests/templates/destinations/student_list.html b/tjdests/templates/destinations/student_list.html index fe2999f..9d13f29 100644 --- a/tjdests/templates/destinations/student_list.html +++ b/tjdests/templates/destinations/student_list.html @@ -110,6 +110,10 @@ {% if "DENY" in decision.admission_status %} {% endif %} + { # Unknown # } + {% if "UNKNOWN" in decision.admission_status %} + + {% endif %} {{ decision.college.name }}
{{ decision.college.location }} From cba993fbcffa3bff69cd029549b99ee3ffd92b4a Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Mon, 6 Dec 2021 11:39:53 -0500 Subject: [PATCH 02/18] fix(destinations): unknown should be a comment --- tjdests/templates/destinations/student_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tjdests/templates/destinations/student_list.html b/tjdests/templates/destinations/student_list.html index 9d13f29..fc86a2e 100644 --- a/tjdests/templates/destinations/student_list.html +++ b/tjdests/templates/destinations/student_list.html @@ -110,7 +110,7 @@ {% if "DENY" in decision.admission_status %} {% endif %} - { # Unknown # } + {# Unknown #} {% if "UNKNOWN" in decision.admission_status %} {% endif %} From 893e02ae5bdbc41d1a32ce1e84683eee8d283621 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Thu, 6 Jan 2022 14:40:40 -0500 Subject: [PATCH 03/18] feat(destinations): add Markdown support to bios Co-authored-by: Ethan Nguyen --- Pipfile | 3 + Pipfile.lock | 392 ++++++++++-------- .../destinations/templatetags/__init__.py | 0 .../destinations/templatetags/markdown.py | 11 + .../destinations/templatetags/sanitize.py | 15 + tjdests/apps/profile/forms.py | 2 +- tjdests/static/bios.css | 99 +++++ tjdests/templates/base.html | 1 + .../templates/destinations/student_list.html | 26 +- 9 files changed, 366 insertions(+), 183 deletions(-) create mode 100644 tjdests/apps/destinations/templatetags/__init__.py create mode 100644 tjdests/apps/destinations/templatetags/markdown.py create mode 100644 tjdests/apps/destinations/templatetags/sanitize.py create mode 100644 tjdests/static/bios.css diff --git a/Pipfile b/Pipfile index 9dc0688..0b4306b 100644 --- a/Pipfile +++ b/Pipfile @@ -4,6 +4,7 @@ verify_ssl = true name = "pypi" [packages] +bleach = "~=4.1.0" crispy-bootstrap5 = "~=0.6" django = "~=3.2.9" django-bootstrap-pagination = "~=1.7.1" @@ -11,7 +12,9 @@ django-crispy-forms = "~=1.13.0" django-extensions = "~=3.1.5" gunicorn = "~=20.1.0" ipython = "~=7.30.0" +markdown = "~=3.3.6" psycopg2 = "~=2.9.2" +pygments = "~=2.10.0" social-auth-app-django = "~=5.0.0" whitenoise = "~=5.3.0" diff --git a/Pipfile.lock b/Pipfile.lock index 9c48c33..48faa3a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "cbca1b4fc9e3b704e9096e7889c300028ef2bb92f502374cafe7f5b8862e7605" + "sha256": "a48132ee6828ccc3f13e8f4bdb680ec9614406ae307cd396015b889a36ce20ce" }, "pipfile-spec": 6, "requires": { @@ -31,6 +31,14 @@ ], "version": "==0.2.0" }, + "bleach": { + "hashes": [ + "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da", + "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994" + ], + "index": "pypi", + "version": "==4.1.0" + }, "certifi": { "hashes": [ "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", @@ -95,11 +103,11 @@ }, "charset-normalizer": { "hashes": [ - "sha256:735e240d9a8506778cd7a453d97e817e536bb1fc29f4f6961ce297b9c7a917b0", - "sha256:83fcdeb225499d6344c8f7f34684c2981270beacc32ede2e669e94f7fa544405" + "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721", + "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c" ], "markers": "python_version >= '3'", - "version": "==2.0.8" + "version": "==2.0.9" }, "crispy-bootstrap5": { "hashes": [ @@ -111,30 +119,29 @@ }, "cryptography": { "hashes": [ - "sha256:2049f8b87f449fc6190350de443ee0c1dd631f2ce4fa99efad2984de81031681", - "sha256:231c4a69b11f6af79c1495a0e5a85909686ea8db946935224b7825cfb53827ed", - "sha256:24469d9d33217ffd0ce4582dfcf2a76671af115663a95328f63c99ec7ece61a4", - "sha256:2deab5ec05d83ddcf9b0916319674d3dae88b0e7ee18f8962642d3cde0496568", - "sha256:494106e9cd945c2cadfce5374fa44c94cfadf01d4566a3b13bb487d2e6c7959e", - "sha256:4c702855cd3174666ef0d2d13dcc879090aa9c6c38f5578896407a7028f75b9f", - "sha256:52f769ecb4ef39865719aedc67b4b7eae167bafa48dbc2a26dd36fa56460507f", - "sha256:5c49c9e8fb26a567a2b3fa0343c89f5d325447956cc2fc7231c943b29a973712", - "sha256:684993ff6f67000a56454b41bdc7e015429732d65a52d06385b6e9de6181c71e", - "sha256:6fbbbb8aab4053fa018984bb0e95a16faeb051dd8cca15add2a27e267ba02b58", - "sha256:8982c19bb90a4fa2aad3d635c6d71814e38b643649b4000a8419f8691f20ac44", - "sha256:9511416e85e449fe1de73f7f99b21b3aa04fba4c4d335d30c486ba3756e3a2a6", - "sha256:97199a13b772e74cdcdb03760c32109c808aff7cd49c29e9cf4b7754bb725d1d", - "sha256:a776bae1629c8d7198396fd93ec0265f8dd2341c553dc32b976168aaf0e6a636", - "sha256:aa94d617a4cd4cdf4af9b5af65100c036bce22280ebb15d8b5262e8273ebc6ba", - "sha256:b17d83b3d1610e571fedac21b2eb36b816654d6f7496004d6a0d32f99d1d8120", - "sha256:d73e3a96c38173e0aa5646c31bf8473bc3564837977dd480f5cbeacf1d7ef3a3", - "sha256:d91bc9f535599bed58f6d2e21a2724cb0c3895bf41c6403fe881391d29096f1d", - "sha256:ef216d13ac8d24d9cd851776662f75f8d29c9f2d05cdcc2d34a18d32463a9b0b", - "sha256:f6a5a85beb33e57998dc605b9dbe7deaa806385fdf5c4810fb849fcd04640c81", - "sha256:f92556f94e476c1b616e6daec5f7ddded2c082efa7cee7f31c7aeda615906ed8" + "sha256:0a817b961b46894c5ca8a66b599c745b9a3d9f822725221f0e0fe49dc043a3a3", + "sha256:2d87cdcb378d3cfed944dac30596da1968f88fb96d7fc34fdae30a99054b2e31", + "sha256:30ee1eb3ebe1644d1c3f183d115a8c04e4e603ed6ce8e394ed39eea4a98469ac", + "sha256:391432971a66cfaf94b21c24ab465a4cc3e8bf4a939c1ca5c3e3a6e0abebdbcf", + "sha256:39bdf8e70eee6b1c7b289ec6e5d84d49a6bfa11f8b8646b5b3dfe41219153316", + "sha256:4caa4b893d8fad33cf1964d3e51842cd78ba87401ab1d2e44556826df849a8ca", + "sha256:53e5c1dc3d7a953de055d77bef2ff607ceef7a2aac0353b5d630ab67f7423638", + "sha256:596f3cd67e1b950bc372c33f1a28a0692080625592ea6392987dba7f09f17a94", + "sha256:5d59a9d55027a8b88fd9fd2826c4392bd487d74bf628bb9d39beecc62a644c12", + "sha256:6c0c021f35b421ebf5976abf2daacc47e235f8b6082d3396a2fe3ccd537ab173", + "sha256:73bc2d3f2444bcfeac67dd130ff2ea598ea5f20b40e36d19821b4df8c9c5037b", + "sha256:74d6c7e80609c0f4c2434b97b80c7f8fdfaa072ca4baab7e239a15d6d70ed73a", + "sha256:7be0eec337359c155df191d6ae00a5e8bbb63933883f4f5dffc439dac5348c3f", + "sha256:94ae132f0e40fe48f310bba63f477f14a43116f05ddb69d6fa31e93f05848ae2", + "sha256:bb5829d027ff82aa872d76158919045a7c1e91fbf241aec32cb07956e9ebd3c9", + "sha256:ca238ceb7ba0bdf6ce88c1b74a87bffcee5afbfa1e41e173b1ceb095b39add46", + "sha256:ca28641954f767f9822c24e927ad894d45d5a1e501767599647259cbf030b903", + "sha256:e0344c14c9cb89e76eb6a060e67980c9e35b3f36691e15e1b7a9e58a0a6c6dc3", + "sha256:ebc15b1c22e55c4d5566e3ca4db8689470a0ca2babef8e3a9ee057a8b82ce4b1", + "sha256:ec63da4e7e4a5f924b90af42eddf20b698a70e58d86a72d943857c4c6045b3ee" ], "markers": "python_version >= '3.6'", - "version": "==36.0.0" + "version": "==36.0.1" }, "decorator": { "hashes": [ @@ -154,11 +161,11 @@ }, "django": { "hashes": [ - "sha256:51284300f1522ffcdb07ccbdf676a307c6678659e1284f0618e5a774127a6a08", - "sha256:e22c9266da3eec7827737cde57694d7db801fedac938d252bf27377cec06ed1b" + "sha256:074e8818b4b40acdc2369e67dcd6555d558329785408dcd25340ee98f1f1d5c4", + "sha256:df6f5eb3c797b27c096d61494507b7634526d4ce8d7c8ca1e57a4fb19c0738a3" ], "index": "pypi", - "version": "==3.2.9" + "version": "==3.2.10" }, "django-bootstrap-pagination": { "hashes": [ @@ -200,13 +207,21 @@ "markers": "python_version >= '3'", "version": "==3.3" }, + "importlib-metadata": { + "hashes": [ + "sha256:92a8b58ce734b2a4494878e0ecf7d79ccd7a128b5fc6014c401e0b61f006f0f6", + "sha256:b7cf7d3fef75f1e4c80a96ca660efbd51473d7e8f39b5ab9210febc7809012a4" + ], + "markers": "python_version < '3.10'", + "version": "==4.10.0" + }, "ipython": { "hashes": [ - "sha256:c8f3e07aefb9cf9e067f39686f035ce09b27a1ee602116a3030b91b6fc138ee4", - "sha256:d41f8e80b99690122400f9b2069b12f670246a1b4cc5d332bd6c4e2500e6d6fb" + "sha256:cb6aef731bf708a7727ab6cde8df87f0281b1427d41e65d62d4b68934fa54e97", + "sha256:fc60ef843e0863dd4e24ab2bb5698f071031332801ecf8d1aeb4fb622056545c" ], "index": "pypi", - "version": "==7.30.0" + "version": "==7.30.1" }, "jedi": { "hashes": [ @@ -216,6 +231,14 @@ "markers": "python_version >= '3.6'", "version": "==0.18.1" }, + "markdown": { + "hashes": [ + "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006", + "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3" + ], + "index": "pypi", + "version": "==3.3.6" + }, "matplotlib-inline": { "hashes": [ "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee", @@ -232,13 +255,21 @@ "markers": "python_version >= '3.6'", "version": "==3.1.1" }, - "parso": { + "packaging": { "hashes": [ - "sha256:12b83492c6239ce32ff5eed6d3639d6a536170723c6f3f1506869f1ace413398", - "sha256:a8c4922db71e4fdb90e0d0bc6e50f9b273d3397925e5e60a717e719201778d22" + "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", + "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" ], "markers": "python_version >= '3.6'", - "version": "==0.8.2" + "version": "==21.3" + }, + "parso": { + "hashes": [ + "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", + "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75" + ], + "markers": "python_version >= '3.6'", + "version": "==0.8.3" }, "pexpect": { "hashes": [ @@ -257,28 +288,28 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:5f29d62cb7a0ecacfa3d8ceea05a63cd22500543472d64298fc06ddda906b25d", - "sha256:7053aba00895473cb357819358ef33f11aa97e4ac83d38efb123e5649ceeecaf" + "sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6", + "sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506" ], "markers": "python_full_version >= '3.6.2'", - "version": "==3.0.23" + "version": "==3.0.24" }, "psycopg2": { "hashes": [ - "sha256:26322c3f114de1f60c1b0febf8fdd595c221b4f624524178f515d07350a71bd1", - "sha256:6796ac614412ce374587147150e56d03b7845c9e031b88aacdcadc880e81bb38", - "sha256:77b9105ef37bc005b8ffbcb1ed6d8685bb0e8ce84773738aa56421a007ec5a7a", - "sha256:77d09a79f9739b97099d2952bbbf18eaa4eaf825362387acbb9552ec1b3fa228", - "sha256:91c7fd0fe9e6c118e8ff5b665bc3445781d3615fa78e131d0b4f8c85e8ca9ec8", - "sha256:a761b60da0ecaf6a9866985bcde26327883ac3cdb90535ab68b8d784f02b05ef", - "sha256:a84da9fa891848e0270e8e04dcca073bc9046441eeb47069f5c0e36783debbea", - "sha256:b8816c6410fa08d2a022e4e38d128bae97c1855e176a00493d6ec62ccd606d57", - "sha256:dfc32db6ce9ecc35a131320888b547199f79822b028934bb5b332f4169393e15", - "sha256:f65cba7924363e0d2f416041b48ff69d559548f2cb168ff972c54e09e1e64db8", - "sha256:fd7ddab7d6afee4e21c03c648c8b667b197104713e57ec404d5b74097af21e31" + "sha256:06f32425949bd5fe8f625c49f17ebb9784e1e4fe928b7cce72edc36fb68e4c0c", + "sha256:0762c27d018edbcb2d34d51596e4346c983bd27c330218c56c4dc25ef7e819bf", + "sha256:083707a696e5e1c330af2508d8fab36f9700b26621ccbcb538abe22e15485362", + "sha256:34b33e0162cfcaad151f249c2649fd1030010c16f4bbc40a604c1cb77173dcf7", + "sha256:4295093a6ae3434d33ec6baab4ca5512a5082cc43c0505293087b8a46d108461", + "sha256:8cf3878353cc04b053822896bc4922b194792df9df2f1ad8da01fb3043602126", + "sha256:8e841d1bf3434da985cc5ef13e6f75c8981ced601fd70cc6bf33351b91562981", + "sha256:9572e08b50aed176ef6d66f15a21d823bb6f6d23152d35e8451d7d2d18fdac56", + "sha256:a81e3866f99382dfe8c15a151f1ca5fde5815fde879348fe5a9884a7c092a305", + "sha256:cb10d44e6694d763fa1078a26f7f6137d69f555a78ec85dc2ef716c37447e4b2", + "sha256:d3ca6421b942f60c008f81a3541e8faf6865a28d5a9b48544b0ee4f40cac7fca" ], "index": "pypi", - "version": "==2.9.2" + "version": "==2.9.3" }, "ptyprocess": { "hashes": [ @@ -300,7 +331,7 @@ "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380", "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6" ], - "markers": "python_version >= '3.5'", + "index": "pypi", "version": "==2.10.0" }, "pyjwt": { @@ -311,6 +342,14 @@ "markers": "python_version >= '3.6'", "version": "==2.3.0" }, + "pyparsing": { + "hashes": [ + "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4", + "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81" + ], + "markers": "python_version >= '3.6'", + "version": "==3.0.6" + }, "python3-openid": { "hashes": [ "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf", @@ -327,11 +366,11 @@ }, "requests": { "hashes": [ - "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", - "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" + "sha256:8e5643905bf20a308e25e4c1dd379117c09000bf8a82ebccc462cfb1b34a16b5", + "sha256:f71a09d7feba4a6b64ffd8e9d9bc60f9bf7d7e19fd0e04362acb1cfc2e3d98df" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==2.26.0" + "version": "==2.27.0" }, "requests-oauthlib": { "hashes": [ @@ -341,13 +380,13 @@ ], "version": "==1.3.0" }, - "setuptools": { + "six": { "hashes": [ - "sha256:b4c634615a0cf5b02cf83c7bedffc8da0ca439f00e79452699454da6fbd4153d", - "sha256:feb5ff19b354cde9efd2344ef6d5e79880ce4be643037641b49508bbb850d060" + "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", + "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '3.6'", - "version": "==59.4.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.16.0" }, "social-auth-app-django": { "hashes": [ @@ -396,6 +435,13 @@ ], "version": "==0.2.5" }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" + ], + "version": "==0.5.1" + }, "whitenoise": { "hashes": [ "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12", @@ -403,6 +449,14 @@ ], "index": "pypi", "version": "==5.3.0" + }, + "zipp": { + "hashes": [ + "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d", + "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375" + ], + "markers": "python_version >= '3.7'", + "version": "==3.7.0" } }, "develop": { @@ -416,11 +470,11 @@ }, "astroid": { "hashes": [ - "sha256:5939cf55de24b92bda00345d4d0659d01b3c7dafb5055165c330bc7c568ba273", - "sha256:776ca0b748b4ad69c00bfe0fff38fa2d21c338e12c84aa9715ee0d473c422778" + "sha256:72ace9c3333e274e9248168fc4f3e300da8545af1c303bd69197027f49e2bfff", + "sha256:aa296702f1a5c3102c860de49473aaa90a7f6d221555d5cf2678940a9be32a4e" ], - "markers": "python_version ~= '3.6'", - "version": "==2.9.0" + "markers": "python_full_version >= '3.6.2'", + "version": "==2.9.2" }, "autopep8": { "hashes": [ @@ -501,11 +555,11 @@ }, "django": { "hashes": [ - "sha256:51284300f1522ffcdb07ccbdf676a307c6678659e1284f0618e5a774127a6a08", - "sha256:e22c9266da3eec7827737cde57694d7db801fedac938d252bf27377cec06ed1b" + "sha256:074e8818b4b40acdc2369e67dcd6555d558329785408dcd25340ee98f1f1d5c4", + "sha256:df6f5eb3c797b27c096d61494507b7634526d4ce8d7c8ca1e57a4fb19c0738a3" ], "index": "pypi", - "version": "==3.2.9" + "version": "==3.2.10" }, "django-stubs": { "hashes": [ @@ -541,31 +595,46 @@ }, "lazy-object-proxy": { "hashes": [ - "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653", - "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61", - "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2", - "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837", - "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3", - "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43", - "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726", - "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3", - "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587", - "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8", - "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a", - "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd", - "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f", - "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad", - "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4", - "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b", - "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf", - "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981", - "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741", - "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e", - "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93", - "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b" + "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7", + "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a", + "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c", + "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc", + "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f", + "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09", + "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442", + "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e", + "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029", + "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61", + "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb", + "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0", + "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35", + "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42", + "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1", + "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad", + "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443", + "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd", + "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9", + "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148", + "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38", + "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55", + "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36", + "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a", + "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b", + "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44", + "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6", + "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69", + "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4", + "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84", + "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de", + "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28", + "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c", + "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1", + "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8", + "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b", + "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.6.0" + "markers": "python_version >= '3.6'", + "version": "==1.7.1" }, "mccabe": { "hashes": [ @@ -576,32 +645,29 @@ }, "mypy": { "hashes": [ - "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9", - "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a", - "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9", - "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e", - "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2", - "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212", - "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b", - "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885", - "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150", - "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703", - "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072", - "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457", - "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e", - "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0", - "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb", - "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97", - "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8", - "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811", - "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6", - "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de", - "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504", - "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921", - "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d" + "sha256:0feb82e9fa849affca7edd24713dbe809dce780ced9f3feca5ed3d80e40b777f", + "sha256:1d2296f35aae9802eeb1327058b550371ee382d71374b3e7d2804035ef0b830b", + "sha256:1e689e92cdebd87607a041585f1dc7339aa2e8a9f9bad9ba7e6ece619431b20c", + "sha256:1ea7199780c1d7940b82dbc0a4e37722b4e3851264dbba81e01abecc9052d8a7", + "sha256:221cc94dc6a801ccc2be7c0c9fd791c5e08d1fa2c5e1c12dec4eab15b2469871", + "sha256:2e9c5409e9cb81049bb03fa1009b573dea87976713e3898561567a86c4eaee01", + "sha256:45a4dc21c789cfd09b8ccafe114d6de66f0b341ad761338de717192f19397a8c", + "sha256:51426262ae4714cc7dd5439814676e0992b55bcc0f6514eccb4cf8e0678962c2", + "sha256:554873e45c1ca20f31ddf873deb67fa5d2e87b76b97db50669f0468ccded8fae", + "sha256:5feb56f8bb280468fe5fc8e6f56f48f99aa0df9eed3c507a11505ee4657b5380", + "sha256:601f46593f627f8a9b944f74fd387c9b5f4266b39abad77471947069c2fc7651", + "sha256:70b197dd8c78fc5d2daf84bd093e8466a2b2e007eedaa85e792e513a820adbf7", + "sha256:959319b9a3cafc33a8185f440a433ba520239c72e733bf91f9efd67b0a8e9b30", + "sha256:a9d8dffefba634b27d650e0de2564379a1a367e2e08d6617d8f89261a3bf63b2", + "sha256:b419e9721260161e70d054a15abbd50603c16f159860cfd0daeab647d828fc29", + "sha256:bc1a0607ea03c30225347334af66b0af12eefba018a89a88c209e02b7065ea95", + "sha256:bf4a44e03040206f7c058d1f5ba02ef2d1820720c88bc4285c7d9a4269f54173", + "sha256:db3a87376a1380f396d465bed462e76ea89f838f4c5e967d68ff6ee34b785c31", + "sha256:ed4e0ea066bb12f56b2812a15ff223c57c0a44eca817ceb96b214bb055c7051f", + "sha256:f9f665d69034b1fcfdbcd4197480d26298bbfb5d2dfe206245b6498addb34999" ], "index": "pypi", - "version": "==0.910" + "version": "==0.930" }, "mypy-extensions": { "hashes": [ @@ -619,11 +685,11 @@ }, "platformdirs": { "hashes": [ - "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2", - "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d" + "sha256:1d7385c7db91728b83efd0ca99a5afb296cab9d0ed8313a45ed8ba17967ecfca", + "sha256:440633ddfebcc36264232365d7840a970e75e1018d15b4327d11f91909045fda" ], - "markers": "python_version >= '3.6'", - "version": "==2.4.0" + "markers": "python_version >= '3.7'", + "version": "==2.4.1" }, "pycodestyle": { "hashes": [ @@ -643,11 +709,11 @@ }, "pylint": { "hashes": [ - "sha256:4f4a52b132c05b49094b28e109febcec6bfb7bc6961c7485a5ad0a0f961df289", - "sha256:b4b5a7b6d04e914a11c198c816042af1fb2d3cda29bb0c98a9c637010da2a5c5" + "sha256:9d945a73640e1fec07ee34b42f5669b770c759acd536ec7b16d7e4b87a9c9ff9", + "sha256:daabda3f7ed9d1c60f52d563b1b854632fd90035bcf01443e234d3dc794e3b74" ], "index": "pypi", - "version": "==2.12.1" + "version": "==2.12.2" }, "pylint-django": { "hashes": [ @@ -659,17 +725,11 @@ }, "pylint-plugin-utils": { "hashes": [ - "sha256:2f30510e1c46edf268d3a195b2849bd98a1b9433229bb2ba63b8d776e1fc4d0a", - "sha256:57625dcca20140f43731311cd8fd879318bf45a8b0fd17020717a8781714a25a" + "sha256:b3d43e85ab74c4f48bb46ae4ce771e39c3a20f8b3d56982ab17aa73b4f98d535", + "sha256:ce48bc0516ae9415dd5c752c940dfe601b18fe0f48aa249f2386adfa95a004dd" ], - "version": "==0.6" - }, - "pytz": { - "hashes": [ - "sha256:3672058bc3453457b622aab7a1c3bfd5ab0bdae451512f6cf25f64ed37f5b87c", - "sha256:acad2d8b20a1af07d4e4c9d2e9285c5ed9104354062f275f3fcd88dcef4f1326" - ], - "version": "==2021.3" + "markers": "python_full_version >= '3.6.2'", + "version": "==0.7" }, "pyyaml": { "hashes": [ @@ -789,14 +849,6 @@ ], "version": "==2021.11.10" }, - "setuptools": { - "hashes": [ - "sha256:b4c634615a0cf5b02cf83c7bedffc8da0ca439f00e79452699454da6fbd4153d", - "sha256:feb5ff19b354cde9efd2344ef6d5e79880ce4be643037641b49508bbb850d060" - ], - "markers": "python_version >= '3.6'", - "version": "==59.4.0" - }, "sqlparse": { "hashes": [ "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae", @@ -815,43 +867,43 @@ }, "tomli": { "hashes": [ - "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee", - "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade" + "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f", + "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c" ], "markers": "python_version >= '3.6'", - "version": "==1.2.2" + "version": "==1.2.3" }, "typed-ast": { "hashes": [ - "sha256:14fed8820114a389a2b7e91624db5f85f3f6682fda09fe0268a59aabd28fe5f5", - "sha256:155b74b078be842d2eb630dd30a280025eca0a5383c7d45853c27afee65f278f", - "sha256:224afecb8b39739f5c9562794a7c98325cb9d972712e1a98b6989a4720219541", - "sha256:361b9e5d27bd8e3ccb6ea6ad6c4f3c0be322a1a0f8177db6d56264fa0ae40410", - "sha256:37ba2ab65a0028b1a4f2b61a8fe77f12d242731977d274a03d68ebb751271508", - "sha256:49af5b8f6f03ed1eb89ee06c1d7c2e7c8e743d720c3746a5857609a1abc94c94", - "sha256:51040bf45aacefa44fa67fb9ebcd1f2bec73182b99a532c2394eea7dabd18e24", - "sha256:52ca2b2b524d770bed7a393371a38e91943f9160a190141e0df911586066ecda", - "sha256:618912cbc7e17b4aeba86ffe071698c6e2d292acbd6d1d5ec1ee724b8c4ae450", - "sha256:65c81abbabda7d760df7304d843cc9dbe7ef5d485504ca59a46ae2d1731d2428", - "sha256:7b310a207ee9fde3f46ba327989e6cba4195bc0c8c70a158456e7b10233e6bed", - "sha256:7e6731044f748340ef68dcadb5172a4b1f40847a2983fe3983b2a66445fbc8e6", - "sha256:806e0c7346b9b4af8c62d9a29053f484599921a4448c37fbbcbbf15c25138570", - "sha256:a67fd5914603e2165e075f1b12f5a8356bfb9557e8bfb74511108cfbab0f51ed", - "sha256:e4374a76e61399a173137e7984a1d7e356038cf844f24fd8aea46c8029a2f712", - "sha256:e8a9b9c87801cecaad3b4c2b8876387115d1a14caa602c1618cedbb0cb2a14e6", - "sha256:ea517c2bb11c5e4ba7a83a91482a2837041181d57d3ed0749a6c382a2b6b7086", - "sha256:ec184dfb5d3d11e82841dbb973e7092b75f306b625fad7b2e665b64c5d60ab3f", - "sha256:ff4ad88271aa7a55f19b6a161ed44e088c393846d954729549e3cde8257747bb" + "sha256:24058827d8f5d633f97223f5148a7d22628099a3d2efe06654ce872f46f07cdb", + "sha256:256115a5bc7ea9e665c6314ed6671ee2c08ca380f9d5f130bd4d2c1f5848d695", + "sha256:38cf5c642fa808300bae1281460d4f9b7617cf864d4e383054a5ef336e344d32", + "sha256:484137cab8ecf47e137260daa20bafbba5f4e3ec7fda1c1e69ab299b75fa81c5", + "sha256:4f30a2bcd8e68adbb791ce1567fdb897357506f7ea6716f6bbdd3053ac4d9471", + "sha256:591bc04e507595887160ed7aa8d6785867fb86c5793911be79ccede61ae96f4d", + "sha256:5b6ab14c56bc9c7e3c30228a0a0b54b915b1579613f6e463ba6f4eb1382e7fd4", + "sha256:5d8314c92414ce7481eee7ad42b353943679cf6f30237b5ecbf7d835519e1212", + "sha256:71dcda943a471d826ea930dd449ac7e76db7be778fcd722deb63642bab32ea3f", + "sha256:7c42707ab981b6cf4b73490c16e9d17fcd5227039720ca14abe415d39a173a30", + "sha256:9caaf2b440efb39ecbc45e2fabde809cbe56272719131a6318fd9bf08b58e2cb", + "sha256:a2b8d7007f6280e36fa42652df47087ac7b0a7d7f09f9468f07792ba646aac2d", + "sha256:a6d495c1ef572519a7bac9534dbf6d94c40e5b6a608ef41136133377bba4aa08", + "sha256:a80d84f535642420dd17e16ae25bb46c7f4c16ee231105e7f3eb43976a89670a", + "sha256:b53ae5de5500529c76225d18eeb060efbcec90ad5e030713fe8dab0fb4531631", + "sha256:b6d17f37f6edd879141e64a5db17b67488cfeffeedad8c5cec0392305e9bc775", + "sha256:c9bcad65d66d594bffab8575f39420fe0ee96f66e23c4d927ebb4e24354ec1af", + "sha256:ca9e8300d8ba0b66d140820cf463438c8e7b4cdc6fd710c059bfcfb1531d03fb", + "sha256:de4ecae89c7d8b56169473e08f6bfd2df7f95015591f43126e4ea7865928677e" ], "index": "pypi", - "version": "==1.5.0" + "version": "==1.5.1" }, "types-pytz": { "hashes": [ - "sha256:d58a0688094b768d8e21c044e45861cbcaecba0494fd5b9c5feb3e1739211606", - "sha256:dffd77f3efecd3b1555f187a9bf3a638d55fac296700b829c41bd51ec72a6eb7" + "sha256:75859c64c9a97d68259af6da208e8f5aaf4be4536e4d431a82a6e8b848fc183d", + "sha256:f6d21d6687935a1615db464b1e1df800d19502c36bc0486f43be7dfd2c404947" ], - "version": "==2021.3.1" + "version": "==2021.3.3" }, "types-pyyaml": { "hashes": [ @@ -862,11 +914,11 @@ }, "typing-extensions": { "hashes": [ - "sha256:2cdf80e4e04866a9b3689a51869016d36db0814d84b8d8a568d22781d45d27ed", - "sha256:829704698b22e13ec9eaf959122315eabb370b0884400e9818334d8b677023d9" + "sha256:4ca091dea149f945ec56afb48dae714f21e8692ef22a395223bcd328961b6a0e", + "sha256:7f001e5ac290a0c0401508864c7ec868be4e701886d5b573a9528ed3973d9d3b" ], - "markers": "python_version >= '3.6'", - "version": "==4.0.0" + "markers": "python_version < '3.10'", + "version": "==4.0.1" }, "wrapt": { "hashes": [ diff --git a/tjdests/apps/destinations/templatetags/__init__.py b/tjdests/apps/destinations/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tjdests/apps/destinations/templatetags/markdown.py b/tjdests/apps/destinations/templatetags/markdown.py new file mode 100644 index 0000000..e3c52be --- /dev/null +++ b/tjdests/apps/destinations/templatetags/markdown.py @@ -0,0 +1,11 @@ +from markdown import markdown + +from django import template + +register = template.Library() + + +@register.filter(name="markdown") +def convert_markdown(text: str): + """Convert text to markdown HTML.""" + return markdown(text, extensions=["extra", "codehilite", "smarty"]) diff --git a/tjdests/apps/destinations/templatetags/sanitize.py b/tjdests/apps/destinations/templatetags/sanitize.py new file mode 100644 index 0000000..6a13e14 --- /dev/null +++ b/tjdests/apps/destinations/templatetags/sanitize.py @@ -0,0 +1,15 @@ +from bleach import clean +from bleach.sanitizer import ALLOWED_TAGS + +from django import template + +register = template.Library() + +tags = ALLOWED_TAGS + ["h" + str(i) for i in range(1, 7)] + ["div", "p", "pre", "span"] +attrs = {"*": ["class"]} + + +@register.filter(name="sanitize") +def convert_markdown(text: str): + """Sanitize HTML (removing potential XSS attacks).""" + return clean(text, tags=tags, attributes=attrs) diff --git a/tjdests/apps/profile/forms.py b/tjdests/apps/profile/forms.py index c444d64..afc5175 100644 --- a/tjdests/apps/profile/forms.py +++ b/tjdests/apps/profile/forms.py @@ -39,7 +39,7 @@ class ProfilePublishForm(forms.ModelForm): fields = ["publish_data", "GPA", "biography", "attending_decision"] help_texts = { - "biography": "ECs, intended major, advice, etc.", + "biography": "ECs, intended major, advice, etc. Markdown is supported.", } diff --git a/tjdests/static/bios.css b/tjdests/static/bios.css new file mode 100644 index 0000000..1191f34 --- /dev/null +++ b/tjdests/static/bios.css @@ -0,0 +1,99 @@ +div#biography h1 { + font-size: 1.6rem; +} + +div#biography h2 { + font-size: 1.5rem; +} + +div#biography h3 { + font-size: 1.4rem; +} + +div#biography h4 { + font-size: 1.3rem; +} + +div#biography h5 { + font-size: 1.2rem; +} + +div#biography h6 { + font-size: 1.1rem; +} + +/* Syntax highlighting */ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.codehilite .hll { background-color: #ffffcc } +.codehilite { background: #f8f8f8; } +.codehilite .c { color: #408080; font-style: italic } /* Comment */ +.codehilite .err { border: 1px solid #FF0000 } /* Error */ +.codehilite .k { color: #008000; font-weight: bold } /* Keyword */ +.codehilite .o { color: #666666 } /* Operator */ +.codehilite .ch { color: #408080; font-style: italic } /* Comment.Hashbang */ +.codehilite .cm { color: #408080; font-style: italic } /* Comment.Multiline */ +.codehilite .cp { color: #BC7A00 } /* Comment.Preproc */ +.codehilite .cpf { color: #408080; font-style: italic } /* Comment.PreprocFile */ +.codehilite .c1 { color: #408080; font-style: italic } /* Comment.Single */ +.codehilite .cs { color: #408080; font-style: italic } /* Comment.Special */ +.codehilite .gd { color: #A00000 } /* Generic.Deleted */ +.codehilite .ge { font-style: italic } /* Generic.Emph */ +.codehilite .gr { color: #FF0000 } /* Generic.Error */ +.codehilite .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.codehilite .gi { color: #00A000 } /* Generic.Inserted */ +.codehilite .go { color: #888888 } /* Generic.Output */ +.codehilite .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.codehilite .gs { font-weight: bold } /* Generic.Strong */ +.codehilite .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.codehilite .gt { color: #0044DD } /* Generic.Traceback */ +.codehilite .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.codehilite .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.codehilite .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.codehilite .kp { color: #008000 } /* Keyword.Pseudo */ +.codehilite .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.codehilite .kt { color: #B00040 } /* Keyword.Type */ +.codehilite .m { color: #666666 } /* Literal.Number */ +.codehilite .s { color: #BA2121 } /* Literal.String */ +.codehilite .na { color: #7D9029 } /* Name.Attribute */ +.codehilite .nb { color: #008000 } /* Name.Builtin */ +.codehilite .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.codehilite .no { color: #880000 } /* Name.Constant */ +.codehilite .nd { color: #AA22FF } /* Name.Decorator */ +.codehilite .ni { color: #999999; font-weight: bold } /* Name.Entity */ +.codehilite .ne { color: #D2413A; font-weight: bold } /* Name.Exception */ +.codehilite .nf { color: #0000FF } /* Name.Function */ +.codehilite .nl { color: #A0A000 } /* Name.Label */ +.codehilite .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.codehilite .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.codehilite .nv { color: #19177C } /* Name.Variable */ +.codehilite .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.codehilite .w { color: #bbbbbb } /* Text.Whitespace */ +.codehilite .mb { color: #666666 } /* Literal.Number.Bin */ +.codehilite .mf { color: #666666 } /* Literal.Number.Float */ +.codehilite .mh { color: #666666 } /* Literal.Number.Hex */ +.codehilite .mi { color: #666666 } /* Literal.Number.Integer */ +.codehilite .mo { color: #666666 } /* Literal.Number.Oct */ +.codehilite .sa { color: #BA2121 } /* Literal.String.Affix */ +.codehilite .sb { color: #BA2121 } /* Literal.String.Backtick */ +.codehilite .sc { color: #BA2121 } /* Literal.String.Char */ +.codehilite .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.codehilite .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.codehilite .s2 { color: #BA2121 } /* Literal.String.Double */ +.codehilite .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */ +.codehilite .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.codehilite .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */ +.codehilite .sx { color: #008000 } /* Literal.String.Other */ +.codehilite .sr { color: #BB6688 } /* Literal.String.Regex */ +.codehilite .s1 { color: #BA2121 } /* Literal.String.Single */ +.codehilite .ss { color: #19177C } /* Literal.String.Symbol */ +.codehilite .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.codehilite .fm { color: #0000FF } /* Name.Function.Magic */ +.codehilite .vc { color: #19177C } /* Name.Variable.Class */ +.codehilite .vg { color: #19177C } /* Name.Variable.Global */ +.codehilite .vi { color: #19177C } /* Name.Variable.Instance */ +.codehilite .vm { color: #19177C } /* Name.Variable.Magic */ +.codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */ diff --git a/tjdests/templates/base.html b/tjdests/templates/base.html index cccc299..37040e1 100644 --- a/tjdests/templates/base.html +++ b/tjdests/templates/base.html @@ -15,6 +15,7 @@ + diff --git a/tjdests/templates/destinations/student_list.html b/tjdests/templates/destinations/student_list.html index fc86a2e..e92fc4d 100644 --- a/tjdests/templates/destinations/student_list.html +++ b/tjdests/templates/destinations/student_list.html @@ -1,6 +1,8 @@ {% extends "base.html" %} {% load bootstrap_pagination %} +{% load markdown %} +{% load sanitize %} {% block content %}

Student Destinations

@@ -36,20 +38,20 @@
- - - - - - + + + + + + {% for senior in object_list %} - - - - + + + - - + - +
NameGPATest scoresBiographyDecisions
NameGPATest scoresBiographyDecisions
{{ senior }}{{ senior.GPA|stringformat:".3f" }} +
{{ senior }}{{ senior.GPA|stringformat:".3f" }} {# Test scores #} @@ -73,8 +75,8 @@
{{ senior.biography|striptags|linebreaks }} +
{{ senior.biography|markdown|sanitize|safe }}
{# Decisions #} From e7df0c7f95bd0b4d2f5ccb5555b9fb51b5356e34 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Thu, 6 Jan 2022 22:07:55 -0500 Subject: [PATCH 04/18] ci: add types packages to appease check.sh --- Pipfile | 2 ++ Pipfile.lock | 42 +++++++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/Pipfile b/Pipfile index 0b4306b..3aa5afe 100644 --- a/Pipfile +++ b/Pipfile @@ -30,6 +30,8 @@ pylint = "~=2.12.1" pylint-django = "~=2.4.4" pyyaml = "~=6.0" typed-ast = "~=1.5.0" # Required by black, but Pipenv doesn't pull it in correctly on 3.8 +types-Markdown = "~=3.3.10" # To avoid CI failures +types-bleach = "~=4.1.3" # To avoid CI failures [requires] python_version = "3.9" diff --git a/Pipfile.lock b/Pipfile.lock index 48faa3a..ea8f02a 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a48132ee6828ccc3f13e8f4bdb680ec9614406ae307cd396015b889a36ce20ce" + "sha256": "c9f59d43f55ddbb92f6149c8b3b75499dbedad96d01b68641b971429315ebca1" }, "pipfile-spec": 6, "requires": { @@ -103,11 +103,11 @@ }, "charset-normalizer": { "hashes": [ - "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721", - "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c" + "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd", + "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455" ], "markers": "python_version >= '3'", - "version": "==2.0.9" + "version": "==2.0.10" }, "crispy-bootstrap5": { "hashes": [ @@ -161,11 +161,11 @@ }, "django": { "hashes": [ - "sha256:074e8818b4b40acdc2369e67dcd6555d558329785408dcd25340ee98f1f1d5c4", - "sha256:df6f5eb3c797b27c096d61494507b7634526d4ce8d7c8ca1e57a4fb19c0738a3" + "sha256:0a0a37f0b93aef30c4bf3a839c187e1175bcdeb7e177341da0cb7b8194416891", + "sha256:69c94abe5d6b1b088bf475e09b7b74403f943e34da107e798465d2045da27e75" ], "index": "pypi", - "version": "==3.2.10" + "version": "==3.2.11" }, "django-bootstrap-pagination": { "hashes": [ @@ -366,11 +366,11 @@ }, "requests": { "hashes": [ - "sha256:8e5643905bf20a308e25e4c1dd379117c09000bf8a82ebccc462cfb1b34a16b5", - "sha256:f71a09d7feba4a6b64ffd8e9d9bc60f9bf7d7e19fd0e04362acb1cfc2e3d98df" + "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61", + "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==2.27.0" + "version": "==2.27.1" }, "requests-oauthlib": { "hashes": [ @@ -555,11 +555,11 @@ }, "django": { "hashes": [ - "sha256:074e8818b4b40acdc2369e67dcd6555d558329785408dcd25340ee98f1f1d5c4", - "sha256:df6f5eb3c797b27c096d61494507b7634526d4ce8d7c8ca1e57a4fb19c0738a3" + "sha256:0a0a37f0b93aef30c4bf3a839c187e1175bcdeb7e177341da0cb7b8194416891", + "sha256:69c94abe5d6b1b088bf475e09b7b74403f943e34da107e798465d2045da27e75" ], "index": "pypi", - "version": "==3.2.10" + "version": "==3.2.11" }, "django-stubs": { "hashes": [ @@ -898,6 +898,22 @@ "index": "pypi", "version": "==1.5.1" }, + "types-bleach": { + "hashes": [ + "sha256:1a45942fdd84bd49305318d5559ab896b11e151d0b54e13c62c0ed295a804f89", + "sha256:b25662758e1c6f658649715a9323678071aa155493fb57b4501fe50fbd0fac5d" + ], + "index": "pypi", + "version": "==4.1.3" + }, + "types-markdown": { + "hashes": [ + "sha256:0e3153dc4ad3454326465e4e4e21fd90e8fc74966225ec5aeef15895a2c5d94a", + "sha256:d4004e36a33cd3417cd299324232fc28e9915171a7ce46b43bf5b0c579db459d" + ], + "index": "pypi", + "version": "==3.3.10" + }, "types-pytz": { "hashes": [ "sha256:75859c64c9a97d68259af6da208e8f5aaf4be4536e4d431a82a6e8b848fc183d", From 6a743c1144ab23a52517b22d5cd3d030b7787aa3 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sun, 30 Jan 2022 12:50:52 -0500 Subject: [PATCH 05/18] fix(authentication): don't search by preferred name --- tjdests/apps/authentication/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tjdests/apps/authentication/admin.py b/tjdests/apps/authentication/admin.py index deb3151..a6d50e3 100644 --- a/tjdests/apps/authentication/admin.py +++ b/tjdests/apps/authentication/admin.py @@ -4,7 +4,7 @@ from .models import User class UserAdmin(admin.ModelAdmin): - search_fields = ["username", "preferred_name", "last_name"] + search_fields = ["username", "first_name", "nickname", "last_name"] list_display = ["username", "last_name", "preferred_name", "last_modified"] list_filter = ["is_senior", "is_student", "accepted_terms", "publish_data"] From cf7923f62ae4b4c47aa29d56c82efc906413e487 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sun, 30 Jan 2022 12:51:49 -0500 Subject: [PATCH 06/18] feat(profile): make nickname optional --- .../migrations/0011_user_use_nickname.py | 18 ++++++++++++++++++ tjdests/apps/authentication/models.py | 7 ++++++- tjdests/apps/profile/forms.py | 2 +- tjdests/static/main.js | 7 +++++++ tjdests/templates/profile/profile.html | 7 +++++-- 5 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 tjdests/apps/authentication/migrations/0011_user_use_nickname.py diff --git a/tjdests/apps/authentication/migrations/0011_user_use_nickname.py b/tjdests/apps/authentication/migrations/0011_user_use_nickname.py new file mode 100644 index 0000000..cba0438 --- /dev/null +++ b/tjdests/apps/authentication/migrations/0011_user_use_nickname.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.11 on 2022-01-30 17:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0010_user_nickname'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='use_nickname', + field=models.BooleanField(default=False, help_text='If this is set, your nickname will be used to identify you across the site.', verbose_name='Use nickname instead of first name'), + ), + ] diff --git a/tjdests/apps/authentication/models.py b/tjdests/apps/authentication/models.py index 585fa45..02ec2a3 100644 --- a/tjdests/apps/authentication/models.py +++ b/tjdests/apps/authentication/models.py @@ -14,6 +14,11 @@ class User(AbstractUser): is_student = models.BooleanField(default=False) nickname = models.CharField(max_length=30, blank=True) + use_nickname = models.BooleanField( + default=(nickname is not None), + verbose_name="Use nickname instead of first name", + help_text="If this is set, your nickname will be used to identify you across the site.", + ) # The rest are used only if a senior publish_data = models.BooleanField( @@ -37,7 +42,7 @@ class User(AbstractUser): @property def preferred_name(self): - return self.nickname if self.nickname else self.first_name + return self.nickname if self.nickname and self.use_nickname else self.first_name def __str__(self): return f"{self.preferred_name} {self.last_name}" diff --git a/tjdests/apps/profile/forms.py b/tjdests/apps/profile/forms.py index afc5175..351ee72 100644 --- a/tjdests/apps/profile/forms.py +++ b/tjdests/apps/profile/forms.py @@ -36,7 +36,7 @@ class ProfilePublishForm(forms.ModelForm): class Meta: model = User - fields = ["publish_data", "GPA", "biography", "attending_decision"] + fields = ["use_nickname", "publish_data", "GPA", "biography", "attending_decision"] help_texts = { "biography": "ECs, intended major, advice, etc. Markdown is supported.", diff --git a/tjdests/static/main.js b/tjdests/static/main.js index 9048241..90791a9 100644 --- a/tjdests/static/main.js +++ b/tjdests/static/main.js @@ -15,4 +15,11 @@ $(document).ready(function(){ $(this).prop("checked", confirmreturn) } }) + + /* Hide "Use nickname" checkbox if person doesn't have a nickname + The box won't do anything if they don't have a nickname, + but it's nice to just get it out of the way, you know? */ + if ($("#without-nickname").length) { + $("#div_id_use_nickname").hide(); + } }) \ No newline at end of file diff --git a/tjdests/templates/profile/profile.html b/tjdests/templates/profile/profile.html index a83aeda..bff4c46 100644 --- a/tjdests/templates/profile/profile.html +++ b/tjdests/templates/profile/profile.html @@ -4,8 +4,11 @@ {% block content %}

Profile

-

You are {{ request.user.username }}, {{ request.user.preferred_name }} {{ request.user.last_name }}.

- + {% if request.user.nickname %} +

You are {{ request.user.username }}, {{ request.user.first_name }} {{ request.user.last_name }} ({{ request.user.nickname }}).

+ {% else %} +

You are {{ request.user.username }}, {{ request.user.preferred_name }} {{ request.user.last_name }}.

+ {% endif %}

Data Publication, College Attending, Biography

{% if request.user.is_senior %} From a09d97fb8e8dca74c1d9e8fab705a5e059612bd0 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sun, 30 Jan 2022 12:52:09 -0500 Subject: [PATCH 07/18] build(deps): bump dependencies --- Pipfile | 16 +- Pipfile.lock | 375 +++++++----------- .../migrations/0011_user_use_nickname.py | 12 +- tjdests/apps/profile/forms.py | 8 +- 4 files changed, 172 insertions(+), 239 deletions(-) diff --git a/Pipfile b/Pipfile index 3aa5afe..a2d6c22 100644 --- a/Pipfile +++ b/Pipfile @@ -6,30 +6,30 @@ name = "pypi" [packages] bleach = "~=4.1.0" crispy-bootstrap5 = "~=0.6" -django = "~=3.2.9" +django = "~=3.2.11" django-bootstrap-pagination = "~=1.7.1" django-crispy-forms = "~=1.13.0" django-extensions = "~=3.1.5" gunicorn = "~=20.1.0" -ipython = "~=7.30.0" +ipython = "~=7.31.0" markdown = "~=3.3.6" -psycopg2 = "~=2.9.2" +psycopg2 = "~=2.9.3" pygments = "~=2.10.0" social-auth-app-django = "~=5.0.0" whitenoise = "~=5.3.0" [dev-packages] autopep8 = "~=1.6.0" -black = "==21.11b1" +black = "==21.12b0" coverage = "~=6.2" django-stubs = "~=1.9.0" flake8 = "~=4.0.1" isort = "~=5.10.1" -mypy = "~=0.910" -pylint = "~=2.12.1" -pylint-django = "~=2.4.4" +mypy = "~=0.931" +pylint = "~=2.12.2" +pylint-django = "~=2.5.0" pyyaml = "~=6.0" -typed-ast = "~=1.5.0" # Required by black, but Pipenv doesn't pull it in correctly on 3.8 +typed-ast = "~=1.5.1" # Required by black, but Pipenv doesn't pull it in correctly on 3.8 types-Markdown = "~=3.3.10" # To avoid CI failures types-bleach = "~=4.1.3" # To avoid CI failures diff --git a/Pipfile.lock b/Pipfile.lock index ea8f02a..24997d1 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c9f59d43f55ddbb92f6149c8b3b75499dbedad96d01b68641b971429315ebca1" + "sha256": "2c7f32efd684e3a0b5cab04853273c113b3be7dc08e37da0afac86e28de7bbad" }, "pipfile-spec": 6, "requires": { @@ -18,11 +18,11 @@ "default": { "asgiref": { "hashes": [ - "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9", - "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214" + "sha256:2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0", + "sha256:88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9" ], - "markers": "python_version >= '3.6'", - "version": "==3.4.1" + "markers": "python_version >= '3.7'", + "version": "==3.5.0" }, "backcall": { "hashes": [ @@ -145,11 +145,11 @@ }, "decorator": { "hashes": [ - "sha256:7b12e7c3c6ab203a29e157335e9122cb03de9ab7264b137594103fd4a683b374", - "sha256:e59913af105b9860aa2c8d3272d9de5a56a4e608db9a2f167a8480b323d529a7" + "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", + "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" ], "markers": "python_version >= '3.5'", - "version": "==5.1.0" + "version": "==5.1.1" }, "defusedxml": { "hashes": [ @@ -209,19 +209,19 @@ }, "importlib-metadata": { "hashes": [ - "sha256:92a8b58ce734b2a4494878e0ecf7d79ccd7a128b5fc6014c401e0b61f006f0f6", - "sha256:b7cf7d3fef75f1e4c80a96ca660efbd51473d7e8f39b5ab9210febc7809012a4" + "sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6", + "sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e" ], "markers": "python_version < '3.10'", - "version": "==4.10.0" + "version": "==4.10.1" }, "ipython": { "hashes": [ - "sha256:cb6aef731bf708a7727ab6cde8df87f0281b1427d41e65d62d4b68934fa54e97", - "sha256:fc60ef843e0863dd4e24ab2bb5698f071031332801ecf8d1aeb4fb622056545c" + "sha256:55df3e0bd0f94e715abd968bedd89d4e8a7bce4bf498fb123fed4f5398fea874", + "sha256:b5548ec5329a4bcf054a5deed5099b0f9622eb9ea51aaa7104d215fece201d8c" ], "index": "pypi", - "version": "==7.30.1" + "version": "==7.31.1" }, "jedi": { "hashes": [ @@ -249,11 +249,11 @@ }, "oauthlib": { "hashes": [ - "sha256:42bf6354c2ed8c6acb54d971fce6f88193d97297e18602a3a886603f9d7730cc", - "sha256:8f0215fcc533dd8dd1bee6f4c412d4f0cd7297307d43ac61666389e3bc3198a3" + "sha256:23a8208d75b902797ea29fd31fa80a15ed9dc2c6c16fe73f5d346f83f6fa27a2", + "sha256:6db33440354787f9b7f3a6dbd4febf5d0f93758354060e802f6c06cb493022fe" ], "markers": "python_version >= '3.6'", - "version": "==3.1.1" + "version": "==3.2.0" }, "packaging": { "hashes": [ @@ -288,11 +288,11 @@ }, "prompt-toolkit": { "hashes": [ - "sha256:1bb05628c7d87b645974a1bad3f17612be0c29fa39af9f7688030163f680bad6", - "sha256:e56f2ff799bacecd3e88165b1e2f5ebf9bcd59e80e06d395fa0cc4b8bd7bb506" + "sha256:4bcf119be2200c17ed0d518872ef922f1de336eb6d1ddbd1e089ceb6447d97c6", + "sha256:a51d41a6a45fd9def54365bca8f0402c8f182f2b6f7e29c74d55faeb9fb38ac4" ], "markers": "python_full_version >= '3.6.2'", - "version": "==3.0.24" + "version": "==3.0.26" }, "psycopg2": { "hashes": [ @@ -344,11 +344,11 @@ }, "pyparsing": { "hashes": [ - "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4", - "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81" + "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea", + "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484" ], "markers": "python_version >= '3.6'", - "version": "==3.0.6" + "version": "==3.0.7" }, "python3-openid": { "hashes": [ @@ -374,11 +374,11 @@ }, "requests-oauthlib": { "hashes": [ - "sha256:7f71572defaecd16372f9006f33c2ec8c077c3cfa6f5911a9a90202beb513f3d", - "sha256:b4261601a71fd721a8bd6d7aa1cc1d6a8a93b4a9f5e96626f8e4d91e8beeaa6a", - "sha256:fa6c47b933f01060936d87ae9327fead68768b69c6c9ea2109c48be30f2d4dbc" + "sha256:2577c501a2fb8d05a304c09d090d6e47c306fef15809d102b327cf8364bddab5", + "sha256:75beac4a47881eeb94d5ea5d6ad31ef88856affe2332b9aafb52c6452ccf0d7a" ], - "version": "==1.3.0" + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", + "version": "==1.3.1" }, "six": { "hashes": [ @@ -398,11 +398,11 @@ }, "social-auth-core": { "hashes": [ - "sha256:5ab43b3b15dce5f059db69cc3082c216574739f0edbc98629c8c6e8769c67eb4", - "sha256:983b53167ac56e7ba4909db555602a6e7a98c97ca47183bb222eb85ba627bf2b" + "sha256:08fe6645b98950cff9d6970b6704345f821d78729df0164bca0002c624b001e1", + "sha256:af6fc7d9ee39f0aa697cd953121add638fc32a49816341a9838a67904c39e034" ], "markers": "python_version >= '3.6'", - "version": "==4.1.0" + "version": "==4.2.0" }, "sqlparse": { "hashes": [ @@ -422,11 +422,11 @@ }, "urllib3": { "hashes": [ - "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece", - "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844" + "sha256:000ca7f471a233c2251c6c7023ee85305721bfdf18621ebff4fd17a8653427ed", + "sha256:0e7c33d9a63e7ddfcb86780aac87befc2fbddf46c58dbb487e0855f7ceec283c" ], "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", - "version": "==1.26.7" + "version": "==1.26.8" }, "wcwidth": { "hashes": [ @@ -462,19 +462,19 @@ "develop": { "asgiref": { "hashes": [ - "sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9", - "sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214" + "sha256:2f8abc20f7248433085eda803936d98992f1343ddb022065779f37c5da0181d0", + "sha256:88d59c13d634dcffe0510be048210188edd79aeccb6a6c9028cdad6f31d730a9" ], - "markers": "python_version >= '3.6'", - "version": "==3.4.1" + "markers": "python_version >= '3.7'", + "version": "==3.5.0" }, "astroid": { "hashes": [ - "sha256:72ace9c3333e274e9248168fc4f3e300da8545af1c303bd69197027f49e2bfff", - "sha256:aa296702f1a5c3102c860de49473aaa90a7f6d221555d5cf2678940a9be32a4e" + "sha256:1efdf4e867d4d8ba4a9f6cf9ce07cd182c4c41de77f23814feb27ca93ca9d877", + "sha256:506daabe5edffb7e696ad82483ad0228245a9742ed7d2d8c9cdb31537decf9f6" ], "markers": "python_full_version >= '3.6.2'", - "version": "==2.9.2" + "version": "==2.9.3" }, "autopep8": { "hashes": [ @@ -486,11 +486,11 @@ }, "black": { "hashes": [ - "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac", - "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2" + "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3", + "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f" ], "index": "pypi", - "version": "==21.11b1" + "version": "==21.12b0" }, "click": { "hashes": [ @@ -502,56 +502,53 @@ }, "coverage": { "hashes": [ - "sha256:01774a2c2c729619760320270e42cd9e797427ecfddd32c2a7b639cdc481f3c0", - "sha256:03b20e52b7d31be571c9c06b74746746d4eb82fc260e594dc662ed48145e9efd", - "sha256:0a7726f74ff63f41e95ed3a89fef002916c828bb5fcae83b505b49d81a066884", - "sha256:1219d760ccfafc03c0822ae2e06e3b1248a8e6d1a70928966bafc6838d3c9e48", - "sha256:13362889b2d46e8d9f97c421539c97c963e34031ab0cb89e8ca83a10cc71ac76", - "sha256:174cf9b4bef0db2e8244f82059a5a72bd47e1d40e71c68ab055425172b16b7d0", - "sha256:17e6c11038d4ed6e8af1407d9e89a2904d573be29d51515f14262d7f10ef0a64", - "sha256:215f8afcc02a24c2d9a10d3790b21054b58d71f4b3c6f055d4bb1b15cecce685", - "sha256:22e60a3ca5acba37d1d4a2ee66e051f5b0e1b9ac950b5b0cf4aa5366eda41d47", - "sha256:2641f803ee9f95b1f387f3e8f3bf28d83d9b69a39e9911e5bfee832bea75240d", - "sha256:276651978c94a8c5672ea60a2656e95a3cce2a3f31e9fb2d5ebd4c215d095840", - "sha256:3f7c17209eef285c86f819ff04a6d4cbee9b33ef05cbcaae4c0b4e8e06b3ec8f", - "sha256:3feac4084291642165c3a0d9eaebedf19ffa505016c4d3db15bfe235718d4971", - "sha256:49dbff64961bc9bdd2289a2bda6a3a5a331964ba5497f694e2cbd540d656dc1c", - "sha256:4e547122ca2d244f7c090fe3f4b5a5861255ff66b7ab6d98f44a0222aaf8671a", - "sha256:5829192582c0ec8ca4a2532407bc14c2f338d9878a10442f5d03804a95fac9de", - "sha256:5d6b09c972ce9200264c35a1d53d43ca55ef61836d9ec60f0d44273a31aa9f17", - "sha256:600617008aa82032ddeace2535626d1bc212dfff32b43989539deda63b3f36e4", - "sha256:619346d57c7126ae49ac95b11b0dc8e36c1dd49d148477461bb66c8cf13bb521", - "sha256:63c424e6f5b4ab1cf1e23a43b12f542b0ec2e54f99ec9f11b75382152981df57", - "sha256:6dbc1536e105adda7a6312c778f15aaabe583b0e9a0b0a324990334fd458c94b", - "sha256:6e1394d24d5938e561fbeaa0cd3d356207579c28bd1792f25a068743f2d5b282", - "sha256:86f2e78b1eff847609b1ca8050c9e1fa3bd44ce755b2ec30e70f2d3ba3844644", - "sha256:8bdfe9ff3a4ea37d17f172ac0dff1e1c383aec17a636b9b35906babc9f0f5475", - "sha256:8e2c35a4c1f269704e90888e56f794e2d9c0262fb0c1b1c8c4ee44d9b9e77b5d", - "sha256:92b8c845527eae547a2a6617d336adc56394050c3ed8a6918683646328fbb6da", - "sha256:9365ed5cce5d0cf2c10afc6add145c5037d3148585b8ae0e77cc1efdd6aa2953", - "sha256:9a29311bd6429be317c1f3fe4bc06c4c5ee45e2fa61b2a19d4d1d6111cb94af2", - "sha256:9a2b5b52be0a8626fcbffd7e689781bf8c2ac01613e77feda93d96184949a98e", - "sha256:a4bdeb0a52d1d04123b41d90a4390b096f3ef38eee35e11f0b22c2d031222c6c", - "sha256:a9c8c4283e17690ff1a7427123ffb428ad6a52ed720d550e299e8291e33184dc", - "sha256:b637c57fdb8be84e91fac60d9325a66a5981f8086c954ea2772efe28425eaf64", - "sha256:bf154ba7ee2fd613eb541c2bc03d3d9ac667080a737449d1a3fb342740eb1a74", - "sha256:c254b03032d5a06de049ce8bca8338a5185f07fb76600afff3c161e053d88617", - "sha256:c332d8f8d448ded473b97fefe4a0983265af21917d8b0cdcb8bb06b2afe632c3", - "sha256:c7912d1526299cb04c88288e148c6c87c0df600eca76efd99d84396cfe00ef1d", - "sha256:cfd9386c1d6f13b37e05a91a8583e802f8059bebfccde61a418c5808dea6bbfa", - "sha256:d5d2033d5db1d58ae2d62f095e1aefb6988af65b4b12cb8987af409587cc0739", - "sha256:dca38a21e4423f3edb821292e97cec7ad38086f84313462098568baedf4331f8", - "sha256:e2cad8093172b7d1595b4ad66f24270808658e11acf43a8f95b41276162eb5b8", - "sha256:e3db840a4dee542e37e09f30859f1612da90e1c5239a6a2498c473183a50e781", - "sha256:edcada2e24ed68f019175c2b2af2a8b481d3d084798b8c20d15d34f5c733fa58", - "sha256:f467bbb837691ab5a8ca359199d3429a11a01e6dfb3d9dcc676dc035ca93c0a9", - "sha256:f506af4f27def639ba45789fa6fde45f9a217da0be05f8910458e4557eed020c", - "sha256:f614fc9956d76d8a88a88bb41ddc12709caa755666f580af3a688899721efecd", - "sha256:f9afb5b746781fc2abce26193d1c817b7eb0e11459510fba65d2bd77fe161d9e", - "sha256:fb8b8ee99b3fffe4fd86f4c81b35a6bf7e4462cba019997af2fe679365db0c49" + "sha256:012157499ec4f135fc36cd2177e3d1a1840af9b236cbe80e9a5ccfc83d912a69", + "sha256:0a34d313105cdd0d3644c56df2d743fe467270d6ab93b5d4a347eb9fec8924d6", + "sha256:11e61c5548ecf74ea1f8b059730b049871f0e32b74f88bd0d670c20c819ad749", + "sha256:152cc2624381df4e4e604e21bd8e95eb8059535f7b768c1fb8b8ae0b26f47ab0", + "sha256:1b4285fde5286b946835a1a53bba3ad41ef74285ba9e8013e14b5ea93deaeafc", + "sha256:27a94db5dc098c25048b0aca155f5fac674f2cf1b1736c5272ba28ead2fc267e", + "sha256:27ac7cb84538e278e07569ceaaa6f807a029dc194b1c819a9820b9bb5dbf63ab", + "sha256:2a491e159294d756e7fc8462f98175e2d2225e4dbe062cca7d3e0d5a75ba6260", + "sha256:2bc85664b06ba42d14bb74d6ddf19d8bfc520cb660561d2d9ce5786ae72f71b5", + "sha256:32168001f33025fd756884d56d01adebb34e6c8c0b3395ca8584cdcee9c7c9d2", + "sha256:3c4ce3b647bd1792d4394f5690d9df6dc035b00bcdbc5595099c01282a59ae01", + "sha256:433b99f7b0613bdcdc0b00cc3d39ed6d756797e3b078d2c43f8a38288520aec6", + "sha256:4578728c36de2801c1deb1c6b760d31883e62e33f33c7ba8f982e609dc95167d", + "sha256:509c68c3e2015022aeda03b003dd68fa19987cdcf64e9d4edc98db41cfc45d30", + "sha256:51372e24b1f7143ee2df6b45cff6a721f3abe93b1e506196f3ffa4155c2497f7", + "sha256:5d008e0f67ac800b0ca04d7914b8501312c8c6c00ad8c7ba17754609fae1231a", + "sha256:649df3641eb351cdfd0d5533c92fc9df507b6b2bf48a7ef8c71ab63cbc7b5c3c", + "sha256:6e78b1e25e5c5695dea012be473e442f7094d066925604be20b30713dbd47f89", + "sha256:72d9d186508325a456475dd05b1756f9a204c7086b07fffb227ef8cee03b1dc2", + "sha256:7d82c610a2e10372e128023c5baf9ce3d270f3029fe7274ff5bc2897c68f1318", + "sha256:7ee317486593193e066fc5e98ac0ce712178c21529a85c07b7cb978171f25d53", + "sha256:7eed8459a2b81848cafb3280b39d7d49950d5f98e403677941c752e7e7ee47cb", + "sha256:823f9325283dc9565ba0aa2d240471a93ca8999861779b2b6c7aded45b58ee0f", + "sha256:85c5fc9029043cf8b07f73fbb0a7ab6d3b717510c3b5642b77058ea55d7cacde", + "sha256:86c91c511853dfda81c2cf2360502cb72783f4b7cebabef27869f00cbe1db07d", + "sha256:8e0c3525b1a182c8ffc9bca7e56b521e0c2b8b3e82f033c8e16d6d721f1b54d6", + "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099", + "sha256:9ed3244b415725f08ca3bdf02ed681089fd95e9465099a21c8e2d9c5d6ca2606", + "sha256:a189036c50dcd56100746139a459f0d27540fef95b09aba03e786540b8feaa5f", + "sha256:a4748349734110fd32d46ff8897b561e6300d8989a494ad5a0a2e4f0ca974fc7", + "sha256:a5d79c9af3f410a2b5acad91258b4ae179ee9c83897eb9de69151b179b0227f5", + "sha256:a7596aa2f2b8fa5604129cfc9a27ad9beec0a96f18078cb424d029fdd707468d", + "sha256:ab4fc4b866b279740e0d917402f0e9a08683e002f43fa408e9655818ed392196", + "sha256:bde4aeabc0d1b2e52c4036c54440b1ad05beeca8113f47aceb4998bb7471e2c2", + "sha256:c72bb4679283c6737f452eeb9b2a0e570acaef2197ad255fb20162adc80bea76", + "sha256:c8582e9280f8d0f38114fe95a92ae8d0790b56b099d728cc4f8a2e14b1c4a18c", + "sha256:ca29c352389ea27a24c79acd117abdd8a865c6eb01576b6f0990cd9a4e9c9f48", + "sha256:ce443a3e6df90d692c38762f108fc4c88314bf477689f04de76b3f252e7a351c", + "sha256:d1675db48490e5fa0b300f6329ecb8a9a37c29b9ab64fa9c964d34111788ca2d", + "sha256:da1a428bdbe71f9a8c270c7baab29e9552ac9d0e0cba5e7e9a4c9ee6465d258d", + "sha256:e4ff163602c5c77e7bb4ea81ba5d3b793b4419f8acd296aae149370902cf4e92", + "sha256:e67ccd53da5958ea1ec833a160b96357f90859c220a00150de011b787c27b98d", + "sha256:e8071e7d9ba9f457fc674afc3de054450be2c9b195c470147fbbc082468d8ff7", + "sha256:fff16a30fdf57b214778eff86391301c4509e327a65b877862f7c929f10a4253" ], "index": "pypi", - "version": "==6.2" + "version": "==6.3" }, "django": { "hashes": [ @@ -645,29 +642,29 @@ }, "mypy": { "hashes": [ - "sha256:0feb82e9fa849affca7edd24713dbe809dce780ced9f3feca5ed3d80e40b777f", - "sha256:1d2296f35aae9802eeb1327058b550371ee382d71374b3e7d2804035ef0b830b", - "sha256:1e689e92cdebd87607a041585f1dc7339aa2e8a9f9bad9ba7e6ece619431b20c", - "sha256:1ea7199780c1d7940b82dbc0a4e37722b4e3851264dbba81e01abecc9052d8a7", - "sha256:221cc94dc6a801ccc2be7c0c9fd791c5e08d1fa2c5e1c12dec4eab15b2469871", - "sha256:2e9c5409e9cb81049bb03fa1009b573dea87976713e3898561567a86c4eaee01", - "sha256:45a4dc21c789cfd09b8ccafe114d6de66f0b341ad761338de717192f19397a8c", - "sha256:51426262ae4714cc7dd5439814676e0992b55bcc0f6514eccb4cf8e0678962c2", - "sha256:554873e45c1ca20f31ddf873deb67fa5d2e87b76b97db50669f0468ccded8fae", - "sha256:5feb56f8bb280468fe5fc8e6f56f48f99aa0df9eed3c507a11505ee4657b5380", - "sha256:601f46593f627f8a9b944f74fd387c9b5f4266b39abad77471947069c2fc7651", - "sha256:70b197dd8c78fc5d2daf84bd093e8466a2b2e007eedaa85e792e513a820adbf7", - "sha256:959319b9a3cafc33a8185f440a433ba520239c72e733bf91f9efd67b0a8e9b30", - "sha256:a9d8dffefba634b27d650e0de2564379a1a367e2e08d6617d8f89261a3bf63b2", - "sha256:b419e9721260161e70d054a15abbd50603c16f159860cfd0daeab647d828fc29", - "sha256:bc1a0607ea03c30225347334af66b0af12eefba018a89a88c209e02b7065ea95", - "sha256:bf4a44e03040206f7c058d1f5ba02ef2d1820720c88bc4285c7d9a4269f54173", - "sha256:db3a87376a1380f396d465bed462e76ea89f838f4c5e967d68ff6ee34b785c31", - "sha256:ed4e0ea066bb12f56b2812a15ff223c57c0a44eca817ceb96b214bb055c7051f", - "sha256:f9f665d69034b1fcfdbcd4197480d26298bbfb5d2dfe206245b6498addb34999" + "sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce", + "sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d", + "sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069", + "sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c", + "sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d", + "sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714", + "sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a", + "sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d", + "sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05", + "sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266", + "sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697", + "sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc", + "sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799", + "sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd", + "sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00", + "sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7", + "sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a", + "sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0", + "sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0", + "sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166" ], "index": "pypi", - "version": "==0.930" + "version": "==0.931" }, "mypy-extensions": { "hashes": [ @@ -717,11 +714,11 @@ }, "pylint-django": { "hashes": [ - "sha256:aff49d9602a39c027b4ed7521a041438893205918f405800063b7ff692b7371b", - "sha256:f63f717169b0c2e4e19c28f1c32c28290647330184fcb7427805ae9b6994f3fc" + "sha256:1fda2b86de993241c9a076970af0d1a7beac52a4333c786975a0e7f45c062490", + "sha256:7eb8399fc9813040754081e496655cd7cc40d32d4b68e49c64a2eea50df9af12" ], "index": "pypi", - "version": "==2.4.4" + "version": "==2.5.0" }, "pylint-plugin-utils": { "hashes": [ @@ -770,85 +767,6 @@ "index": "pypi", "version": "==6.0" }, - "regex": { - "hashes": [ - "sha256:0416f7399e918c4b0e074a0f66e5191077ee2ca32a0f99d4c187a62beb47aa05", - "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f", - "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc", - "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4", - "sha256:0f594b96fe2e0821d026365f72ac7b4f0b487487fb3d4aaf10dd9d97d88a9737", - "sha256:139a23d1f5d30db2cc6c7fd9c6d6497872a672db22c4ae1910be22d4f4b2068a", - "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4", - "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8", - "sha256:2409b5c9cef7054dde93a9803156b411b677affc84fca69e908b1cb2c540025d", - "sha256:2fee3ed82a011184807d2127f1733b4f6b2ff6ec7151d83ef3477f3b96a13d03", - "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f", - "sha256:3598893bde43091ee5ca0a6ad20f08a0435e93a69255eeb5f81b85e81e329264", - "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a", - "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef", - "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f", - "sha256:42b50fa6666b0d50c30a990527127334d6b96dd969011e843e726a64011485da", - "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc", - "sha256:473e67837f786404570eae33c3b64a4b9635ae9f00145250851a1292f484c063", - "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50", - "sha256:50a7ddf3d131dc5633dccdb51417e2d1910d25cbcf842115a3a5893509140a3a", - "sha256:529801a0d58809b60b3531ee804d3e3be4b412c94b5d267daa3de7fadef00f49", - "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d", - "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d", - "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733", - "sha256:563d5f9354e15e048465061509403f68424fef37d5add3064038c2511c8f5e00", - "sha256:5d408a642a5484b9b4d11dea15a489ea0928c7e410c7525cd892f4d04f2f617b", - "sha256:61600a7ca4bcf78a96a68a27c2ae9389763b5b94b63943d5158f2a377e09d29a", - "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36", - "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345", - "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0", - "sha256:6e1d2cc79e8dae442b3fa4a26c5794428b98f81389af90623ffcc650ce9f6732", - "sha256:74cbeac0451f27d4f50e6e8a8f3a52ca074b5e2da9f7b505c4201a57a8ed6286", - "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12", - "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646", - "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667", - "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244", - "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29", - "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec", - "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf", - "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4", - "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449", - "sha256:96fc32c16ea6d60d3ca7f63397bff5c75c5a562f7db6dec7d412f7c4d2e78ec0", - "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a", - "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d", - "sha256:a955b747d620a50408b7fdf948e04359d6e762ff8a85f5775d907ceced715129", - "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb", - "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e", - "sha256:b9ed0b1e5e0759d6b7f8e2f143894b2a7f3edd313f38cf44e1e15d360e11749b", - "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83", - "sha256:ca49e1ab99593438b204e00f3970e7a5f70d045267051dfa6b5f4304fcfa1dbf", - "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e", - "sha256:cd410a1cbb2d297c67d8521759ab2ee3f1d66206d2e4328502a487589a2cb21b", - "sha256:ce298e3d0c65bd03fa65ffcc6db0e2b578e8f626d468db64fdf8457731052942", - "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a", - "sha256:d5fd67df77bab0d3f4ea1d7afca9ef15c2ee35dfb348c7b57ffb9782a6e4db6e", - "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94", - "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc", - "sha256:dc07f021ee80510f3cd3af2cad5b6a3b3a10b057521d9e6aaeb621730d320c5a", - "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e", - "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965", - "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0", - "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36", - "sha256:e6096b0688e6e14af6a1b10eaad86b4ff17935c49aa774eac7c95a57a4e8c296", - "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec", - "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23", - "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7", - "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe", - "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6", - "sha256:f5be7805e53dafe94d295399cfbe5227f39995a997f4fd8539bf3cbdc8f47ca8", - "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b", - "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb", - "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b", - "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30", - "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e" - ], - "version": "==2021.11.10" - }, "sqlparse": { "hashes": [ "sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae", @@ -875,58 +793,63 @@ }, "typed-ast": { "hashes": [ - "sha256:24058827d8f5d633f97223f5148a7d22628099a3d2efe06654ce872f46f07cdb", - "sha256:256115a5bc7ea9e665c6314ed6671ee2c08ca380f9d5f130bd4d2c1f5848d695", - "sha256:38cf5c642fa808300bae1281460d4f9b7617cf864d4e383054a5ef336e344d32", - "sha256:484137cab8ecf47e137260daa20bafbba5f4e3ec7fda1c1e69ab299b75fa81c5", - "sha256:4f30a2bcd8e68adbb791ce1567fdb897357506f7ea6716f6bbdd3053ac4d9471", - "sha256:591bc04e507595887160ed7aa8d6785867fb86c5793911be79ccede61ae96f4d", - "sha256:5b6ab14c56bc9c7e3c30228a0a0b54b915b1579613f6e463ba6f4eb1382e7fd4", - "sha256:5d8314c92414ce7481eee7ad42b353943679cf6f30237b5ecbf7d835519e1212", - "sha256:71dcda943a471d826ea930dd449ac7e76db7be778fcd722deb63642bab32ea3f", - "sha256:7c42707ab981b6cf4b73490c16e9d17fcd5227039720ca14abe415d39a173a30", - "sha256:9caaf2b440efb39ecbc45e2fabde809cbe56272719131a6318fd9bf08b58e2cb", - "sha256:a2b8d7007f6280e36fa42652df47087ac7b0a7d7f09f9468f07792ba646aac2d", - "sha256:a6d495c1ef572519a7bac9534dbf6d94c40e5b6a608ef41136133377bba4aa08", - "sha256:a80d84f535642420dd17e16ae25bb46c7f4c16ee231105e7f3eb43976a89670a", - "sha256:b53ae5de5500529c76225d18eeb060efbcec90ad5e030713fe8dab0fb4531631", - "sha256:b6d17f37f6edd879141e64a5db17b67488cfeffeedad8c5cec0392305e9bc775", - "sha256:c9bcad65d66d594bffab8575f39420fe0ee96f66e23c4d927ebb4e24354ec1af", - "sha256:ca9e8300d8ba0b66d140820cf463438c8e7b4cdc6fd710c059bfcfb1531d03fb", - "sha256:de4ecae89c7d8b56169473e08f6bfd2df7f95015591f43126e4ea7865928677e" + "sha256:0eb77764ea470f14fcbb89d51bc6bbf5e7623446ac4ed06cbd9ca9495b62e36e", + "sha256:1098df9a0592dd4c8c0ccfc2e98931278a6c6c53cb3a3e2cf7e9ee3b06153344", + "sha256:183b183b7771a508395d2cbffd6db67d6ad52958a5fdc99f450d954003900266", + "sha256:18fe320f354d6f9ad3147859b6e16649a0781425268c4dde596093177660e71a", + "sha256:26a432dc219c6b6f38be20a958cbe1abffcc5492821d7e27f08606ef99e0dffd", + "sha256:294a6903a4d087db805a7656989f613371915fc45c8cc0ddc5c5a0a8ad9bea4d", + "sha256:31d8c6b2df19a777bc8826770b872a45a1f30cfefcfd729491baa5237faae837", + "sha256:33b4a19ddc9fc551ebabca9765d54d04600c4a50eda13893dadf67ed81d9a098", + "sha256:42c47c3b43fe3a39ddf8de1d40dbbfca60ac8530a36c9b198ea5b9efac75c09e", + "sha256:525a2d4088e70a9f75b08b3f87a51acc9cde640e19cc523c7e41aa355564ae27", + "sha256:58ae097a325e9bb7a684572d20eb3e1809802c5c9ec7108e85da1eb6c1a3331b", + "sha256:676d051b1da67a852c0447621fdd11c4e104827417bf216092ec3e286f7da596", + "sha256:74cac86cc586db8dfda0ce65d8bcd2bf17b58668dfcc3652762f3ef0e6677e76", + "sha256:8c08d6625bb258179b6e512f55ad20f9dfef019bbfbe3095247401e053a3ea30", + "sha256:90904d889ab8e81a956f2c0935a523cc4e077c7847a836abee832f868d5c26a4", + "sha256:963a0ccc9a4188524e6e6d39b12c9ca24cc2d45a71cfdd04a26d883c922b4b78", + "sha256:bbebc31bf11762b63bf61aaae232becb41c5bf6b3461b80a4df7e791fabb3aca", + "sha256:bc2542e83ac8399752bc16e0b35e038bdb659ba237f4222616b4e83fb9654985", + "sha256:c29dd9a3a9d259c9fa19d19738d021632d673f6ed9b35a739f48e5f807f264fb", + "sha256:c7407cfcad702f0b6c0e0f3e7ab876cd1d2c13b14ce770e412c0c4b9728a0f88", + "sha256:da0a98d458010bf4fe535f2d1e367a2e2060e105978873c04c04212fb20543f7", + "sha256:df05aa5b241e2e8045f5f4367a9f6187b09c4cdf8578bb219861c4e27c443db5", + "sha256:f290617f74a610849bd8f5514e34ae3d09eafd521dceaa6cf68b3f4414266d4e", + "sha256:f30ddd110634c2d7534b2d4e0e22967e88366b0d356b24de87419cc4410c41b7" ], "index": "pypi", - "version": "==1.5.1" + "version": "==1.5.2" }, "types-bleach": { "hashes": [ - "sha256:1a45942fdd84bd49305318d5559ab896b11e151d0b54e13c62c0ed295a804f89", - "sha256:b25662758e1c6f658649715a9323678071aa155493fb57b4501fe50fbd0fac5d" + "sha256:2d30c2c4fb6854088ac636471352c9a51bf6c089289800d2a8060820a01cd43a", + "sha256:edffe173ed6d7b6f3543036a96204a9319c3bf6c3645917b14274e43f000cc9b" ], "index": "pypi", - "version": "==4.1.3" + "version": "==4.1.4" }, "types-markdown": { "hashes": [ - "sha256:0e3153dc4ad3454326465e4e4e21fd90e8fc74966225ec5aeef15895a2c5d94a", - "sha256:d4004e36a33cd3417cd299324232fc28e9915171a7ce46b43bf5b0c579db459d" + "sha256:9a1428bfe856a0df0ac1e74507ee0cfe841c8b2a676cb83672ca249cb9f54a00", + "sha256:bcc56dfb95be2389646e01808dc637c45805a9bb38047c93a509d96d183ca79d" ], "index": "pypi", - "version": "==3.3.10" + "version": "==3.3.12" }, "types-pytz": { "hashes": [ - "sha256:75859c64c9a97d68259af6da208e8f5aaf4be4536e4d431a82a6e8b848fc183d", - "sha256:f6d21d6687935a1615db464b1e1df800d19502c36bc0486f43be7dfd2c404947" + "sha256:101da53091013bb07403468c20d36930d749d3918054ac46f9c1bfc607dadf7d", + "sha256:ccfa2ed29f816e3de2f882541c06ad2791f808a79cfe38265411820190999f0f" ], - "version": "==2021.3.3" + "version": "==2021.3.4" }, "types-pyyaml": { "hashes": [ - "sha256:2e27b0118ca4248a646101c5c318dc02e4ca2866d6bc42e84045dbb851555a76", - "sha256:d5b318269652e809b5c30a5fe666c50159ab80bfd41cd6bafe655bf20b29fcba" + "sha256:6ea4eefa8579e0ce022f785a62de2bcd647fad4a81df5cf946fd67e4b059920b", + "sha256:8b50294b55a9db89498cdc5a65b1b4545112b6cd1cf4465bd693d828b0282a17" ], - "version": "==6.0.1" + "version": "==6.0.3" }, "typing-extensions": { "hashes": [ diff --git a/tjdests/apps/authentication/migrations/0011_user_use_nickname.py b/tjdests/apps/authentication/migrations/0011_user_use_nickname.py index cba0438..be78208 100644 --- a/tjdests/apps/authentication/migrations/0011_user_use_nickname.py +++ b/tjdests/apps/authentication/migrations/0011_user_use_nickname.py @@ -6,13 +6,17 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('authentication', '0010_user_nickname'), + ("authentication", "0010_user_nickname"), ] operations = [ migrations.AddField( - model_name='user', - name='use_nickname', - field=models.BooleanField(default=False, help_text='If this is set, your nickname will be used to identify you across the site.', verbose_name='Use nickname instead of first name'), + model_name="user", + name="use_nickname", + field=models.BooleanField( + default=False, + help_text="If this is set, your nickname will be used to identify you across the site.", + verbose_name="Use nickname instead of first name", + ), ), ] diff --git a/tjdests/apps/profile/forms.py b/tjdests/apps/profile/forms.py index 351ee72..66765ef 100644 --- a/tjdests/apps/profile/forms.py +++ b/tjdests/apps/profile/forms.py @@ -36,7 +36,13 @@ class ProfilePublishForm(forms.ModelForm): class Meta: model = User - fields = ["use_nickname", "publish_data", "GPA", "biography", "attending_decision"] + fields = [ + "use_nickname", + "publish_data", + "GPA", + "biography", + "attending_decision", + ] help_texts = { "biography": "ECs, intended major, advice, etc. Markdown is supported.", From cef0799efde6cc6a39f5866fa7b875b45ffb3170 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sun, 30 Jan 2022 13:27:13 -0500 Subject: [PATCH 08/18] feat(authentication): add use_nickname to admin --- tjdests/apps/authentication/admin.py | 1 + tjdests/apps/authentication/models.py | 2 +- tjdests/apps/profile/tests.py | 11 +++++++++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/tjdests/apps/authentication/admin.py b/tjdests/apps/authentication/admin.py index a6d50e3..c5050e4 100644 --- a/tjdests/apps/authentication/admin.py +++ b/tjdests/apps/authentication/admin.py @@ -20,6 +20,7 @@ class UserAdmin(admin.ModelAdmin): "email", "password", "accepted_terms", + "use_nickname", "is_staff", "is_superuser", "is_senior", diff --git a/tjdests/apps/authentication/models.py b/tjdests/apps/authentication/models.py index 02ec2a3..7d98f64 100644 --- a/tjdests/apps/authentication/models.py +++ b/tjdests/apps/authentication/models.py @@ -15,7 +15,7 @@ class User(AbstractUser): nickname = models.CharField(max_length=30, blank=True) use_nickname = models.BooleanField( - default=(nickname is not None), + default=False, verbose_name="Use nickname instead of first name", help_text="If this is set, your nickname will be used to identify you across the site.", ) diff --git a/tjdests/apps/profile/tests.py b/tjdests/apps/profile/tests.py index fcea528..9c787bb 100644 --- a/tjdests/apps/profile/tests.py +++ b/tjdests/apps/profile/tests.py @@ -130,6 +130,17 @@ class ProfileTest(TJDestsTestCase): ).count(), ) + # Test nickname/preferred name feature + user = self.login(accept_tos=True, make_student=True) + user.first_name = "Dank" + user.nickname = "Memer" + # Should use nickname ("Memer") if option set + user.use_nickname = True + self.assertEqual("Memer", user.preferred_name) + # Should use first name ("Dank") if option not set + user.use_nickname = False + self.assertEqual("Dank", user.preferred_name) + def test_testscore_create(self): """Tests creating test scores.""" From 56464ec2312d333aee60a75671cb2848c0c53978 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sun, 30 Jan 2022 15:13:23 -0500 Subject: [PATCH 09/18] feat(destinations): add strikethrough extension --- .../destinations/templatetags/markdown.py | 6 ++- .../destinations/templatetags/sanitize.py | 6 ++- .../templatetags/strikethrough.py | 39 +++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 tjdests/apps/destinations/templatetags/strikethrough.py diff --git a/tjdests/apps/destinations/templatetags/markdown.py b/tjdests/apps/destinations/templatetags/markdown.py index e3c52be..c6ae66f 100644 --- a/tjdests/apps/destinations/templatetags/markdown.py +++ b/tjdests/apps/destinations/templatetags/markdown.py @@ -2,10 +2,14 @@ from markdown import markdown from django import template +from .strikethrough import StrikethroughExtension + register = template.Library() @register.filter(name="markdown") def convert_markdown(text: str): """Convert text to markdown HTML.""" - return markdown(text, extensions=["extra", "codehilite", "smarty"]) + return markdown( + text, extensions=["extra", "codehilite", "smarty", StrikethroughExtension()] + ) diff --git a/tjdests/apps/destinations/templatetags/sanitize.py b/tjdests/apps/destinations/templatetags/sanitize.py index 6a13e14..e04f277 100644 --- a/tjdests/apps/destinations/templatetags/sanitize.py +++ b/tjdests/apps/destinations/templatetags/sanitize.py @@ -5,7 +5,11 @@ from django import template register = template.Library() -tags = ALLOWED_TAGS + ["h" + str(i) for i in range(1, 7)] + ["div", "p", "pre", "span"] +tags = ( + ALLOWED_TAGS + + ["h" + str(i) for i in range(1, 7)] + + ["div", "p", "pre", "span", "s"] +) attrs = {"*": ["class"]} diff --git a/tjdests/apps/destinations/templatetags/strikethrough.py b/tjdests/apps/destinations/templatetags/strikethrough.py new file mode 100644 index 0000000..ab1df5f --- /dev/null +++ b/tjdests/apps/destinations/templatetags/strikethrough.py @@ -0,0 +1,39 @@ +# -*- coding: utf-8 -*- +# pylint: skip-file +"""Markdown Strikethrough Extension +Extends the Python-Markdown library to support strikethrough text. +Given the text: + The molecular composition of water is ~~HCl~~. +Will output: +

The molecular composition of water is HCl.

+Based on Markdown Subscript Extension + :website: https://github.com/jambonrose/markdown_subscript_extension + :copyright: Copyright 2014-2018 Andrew Pinkham + :license: Simplified BSD, see LICENSE for details. +This version by Shreyas Mayya. +Pylint was skipped here because python-markdown appears to require +a specific syntax which is at odds with pylint's ruleset. +""" + +from __future__ import unicode_literals + +from markdown import Extension +from markdown.inlinepatterns import SimpleTagPattern + +# match ~~, at least one character that is not ~, and ~~ again +SUBSCRIPT_RE = r"(\~\~)([^(\~)]+)(\~\~)" + + +def makeExtension(*args, **kwargs): # noqa: N802 + """Inform Markdown of the existence of the extension.""" + return StrikethroughExtension(*args, **kwargs) + + +class StrikethroughExtension(Extension): + """Extension: text between ~~ characters will be struck through.""" + + def extendMarkdown(self, md, md_globals): # noqa: N802 + """Insert 's' pattern before 'not_strong' pattern.""" + md.inlinePatterns.add( + "strikethrough", SimpleTagPattern(SUBSCRIPT_RE, "s"), " Date: Wed, 2 Feb 2022 13:48:34 -0500 Subject: [PATCH 10/18] feat(profile): make nickname an actual field --- tjdests/apps/profile/forms.py | 1 + tjdests/templates/profile/profile.html | 4 ++-- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/tjdests/apps/profile/forms.py b/tjdests/apps/profile/forms.py index 66765ef..76acad6 100644 --- a/tjdests/apps/profile/forms.py +++ b/tjdests/apps/profile/forms.py @@ -37,6 +37,7 @@ class ProfilePublishForm(forms.ModelForm): class Meta: model = User fields = [ + "nickname", "use_nickname", "publish_data", "GPA", diff --git a/tjdests/templates/profile/profile.html b/tjdests/templates/profile/profile.html index bff4c46..0b35339 100644 --- a/tjdests/templates/profile/profile.html +++ b/tjdests/templates/profile/profile.html @@ -7,9 +7,9 @@ {% if request.user.nickname %}

You are {{ request.user.username }}, {{ request.user.first_name }} {{ request.user.last_name }} ({{ request.user.nickname }}).

{% else %} -

You are {{ request.user.username }}, {{ request.user.preferred_name }} {{ request.user.last_name }}.

+

You are {{ request.user.username }}, {{ request.user.first_name }} {{ request.user.last_name }}.

{% endif %} -

Data Publication, College Attending, Biography

+

Personal Information, Data Publication, College Attending, Biography

{% if request.user.is_senior %} {% crispy profile_form %} From fcf78a0f9bc589d3d59df2fee1d38588b7f0b626 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Wed, 2 Feb 2022 13:49:03 -0500 Subject: [PATCH 11/18] feat(profile): add character count for biography --- tjdests/static/bios.css | 5 +++++ tjdests/static/main.js | 16 ++++++++++------ 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/tjdests/static/bios.css b/tjdests/static/bios.css index 1191f34..6075dd3 100644 --- a/tjdests/static/bios.css +++ b/tjdests/static/bios.css @@ -97,3 +97,8 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: .codehilite .vi { color: #19177C } /* Name.Variable.Instance */ .codehilite .vm { color: #19177C } /* Name.Variable.Magic */ .codehilite .il { color: #666666 } /* Literal.Number.Integer.Long */ + +small#count { + float: right; + text-align: right; +} diff --git a/tjdests/static/main.js b/tjdests/static/main.js index 90791a9..3315ad1 100644 --- a/tjdests/static/main.js +++ b/tjdests/static/main.js @@ -16,10 +16,14 @@ $(document).ready(function(){ } }) - /* Hide "Use nickname" checkbox if person doesn't have a nickname - The box won't do anything if they don't have a nickname, - but it's nice to just get it out of the way, you know? */ - if ($("#without-nickname").length) { - $("#div_id_use_nickname").hide(); - } + function characterCount() { + return $("#id_biography").val().length.toString() + "/1500 characters"; + } + + $("#div_id_biography").append(""); + $("#count").text(characterCount()); + + $("#id_biography").keyup(function(){ + $("#count").text(characterCount()); + }); }) \ No newline at end of file From aa2df1935e1117b86da9f95d8afe6a8a5f850014 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sat, 5 Feb 2022 23:13:01 -0500 Subject: [PATCH 12/18] feat(destinations): use mistune for Markdown parsing --- Pipfile | 3 +- Pipfile.lock | 184 ++++++------------ scripts/check.sh | 2 +- scripts/format.sh | 2 +- .../destinations/templatetags/markdown.py | 23 ++- .../destinations/templatetags/sanitize.py | 19 -- .../templatetags/strikethrough.py | 39 ---- tjdests/static/bios.css | 138 ++++++------- .../templates/destinations/student_list.html | 3 +- 9 files changed, 154 insertions(+), 259 deletions(-) delete mode 100644 tjdests/apps/destinations/templatetags/sanitize.py delete mode 100644 tjdests/apps/destinations/templatetags/strikethrough.py diff --git a/Pipfile b/Pipfile index a2d6c22..01eb9b8 100644 --- a/Pipfile +++ b/Pipfile @@ -4,7 +4,6 @@ verify_ssl = true name = "pypi" [packages] -bleach = "~=4.1.0" crispy-bootstrap5 = "~=0.6" django = "~=3.2.11" django-bootstrap-pagination = "~=1.7.1" @@ -12,7 +11,7 @@ django-crispy-forms = "~=1.13.0" django-extensions = "~=3.1.5" gunicorn = "~=20.1.0" ipython = "~=7.31.0" -markdown = "~=3.3.6" +mistune = "~=2.0.2" psycopg2 = "~=2.9.3" pygments = "~=2.10.0" social-auth-app-django = "~=5.0.0" diff --git a/Pipfile.lock b/Pipfile.lock index 24997d1..4ed6808 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "2c7f32efd684e3a0b5cab04853273c113b3be7dc08e37da0afac86e28de7bbad" + "sha256": "227de253d05fb4f8b4d6b6c577312f4de5e0f4238deeb329e62c2451e7717a1f" }, "pipfile-spec": 6, "requires": { @@ -31,14 +31,6 @@ ], "version": "==0.2.0" }, - "bleach": { - "hashes": [ - "sha256:0900d8b37eba61a802ee40ac0061f8c2b5dee29c1927dd1d233e075ebf5a71da", - "sha256:4d2651ab93271d1129ac9cbc679f524565cc8a1b791909c4a51eac4446a15994" - ], - "index": "pypi", - "version": "==4.1.0" - }, "certifi": { "hashes": [ "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872", @@ -103,11 +95,11 @@ }, "charset-normalizer": { "hashes": [ - "sha256:876d180e9d7432c5d1dfd4c5d26b72f099d503e8fcc0feb7532c9289be60fcbd", - "sha256:cb957888737fc0bbcd78e3df769addb41fd1ff8cf950dc9e7ad7793f1bf44455" + "sha256:2842d8f5e82a1f6aa437380934d5e1cd4fcf2003b06fed6940769c164a480a45", + "sha256:98398a9d69ee80548c762ba991a4728bfc3836768ed226b3945908d1a688371c" ], "markers": "python_version >= '3'", - "version": "==2.0.10" + "version": "==2.0.11" }, "crispy-bootstrap5": { "hashes": [ @@ -161,11 +153,11 @@ }, "django": { "hashes": [ - "sha256:0a0a37f0b93aef30c4bf3a839c187e1175bcdeb7e177341da0cb7b8194416891", - "sha256:69c94abe5d6b1b088bf475e09b7b74403f943e34da107e798465d2045da27e75" + "sha256:9772e6935703e59e993960832d66a614cf0233a1c5123bc6224ecc6ad69e41e2", + "sha256:9b06c289f9ba3a8abea16c9c9505f25107809fb933676f6c891ded270039d965" ], "index": "pypi", - "version": "==3.2.11" + "version": "==3.2.12" }, "django-bootstrap-pagination": { "hashes": [ @@ -207,14 +199,6 @@ "markers": "python_version >= '3'", "version": "==3.3" }, - "importlib-metadata": { - "hashes": [ - "sha256:899e2a40a8c4a1aec681feef45733de8a6c58f3f6a0dbed2eb6574b4387a77b6", - "sha256:951f0d8a5b7260e9db5e41d429285b5f451e928479f19d80818878527d36e95e" - ], - "markers": "python_version < '3.10'", - "version": "==4.10.1" - }, "ipython": { "hashes": [ "sha256:55df3e0bd0f94e715abd968bedd89d4e8a7bce4bf498fb123fed4f5398fea874", @@ -231,14 +215,6 @@ "markers": "python_version >= '3.6'", "version": "==0.18.1" }, - "markdown": { - "hashes": [ - "sha256:76df8ae32294ec39dcf89340382882dfa12975f87f45c3ed1ecdb1e8cefc7006", - "sha256:9923332318f843411e9932237530df53162e29dc7a4e2b91e35764583c46c9a3" - ], - "index": "pypi", - "version": "==3.3.6" - }, "matplotlib-inline": { "hashes": [ "sha256:a04bfba22e0d1395479f866853ec1ee28eea1485c1d69a6faf00dc3e24ff34ee", @@ -247,6 +223,14 @@ "markers": "python_version >= '3.5'", "version": "==0.1.3" }, + "mistune": { + "hashes": [ + "sha256:6bab6c6abd711c4604206c7d8cad5cd48b28f072b4bb75797d74146ba393a049", + "sha256:6fc88c3cb49dba8b16687b41725e661cf85784c12e8974a29b9d336dd596c3a1" + ], + "index": "pypi", + "version": "==2.0.2" + }, "oauthlib": { "hashes": [ "sha256:23a8208d75b902797ea29fd31fa80a15ed9dc2c6c16fe73f5d346f83f6fa27a2", @@ -255,14 +239,6 @@ "markers": "python_version >= '3.6'", "version": "==3.2.0" }, - "packaging": { - "hashes": [ - "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb", - "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522" - ], - "markers": "python_version >= '3.6'", - "version": "==21.3" - }, "parso": { "hashes": [ "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0", @@ -342,14 +318,6 @@ "markers": "python_version >= '3.6'", "version": "==2.3.0" }, - "pyparsing": { - "hashes": [ - "sha256:18ee9022775d270c55187733956460083db60b37d0d0fb357445f3094eed3eea", - "sha256:a6c06a88f252e6c322f65faf8f418b16213b51bdfaece0524c1c1bc30c63c484" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.7" - }, "python3-openid": { "hashes": [ "sha256:33fbf6928f401e0b790151ed2b5290b02545e8775f982485205a066f874aaeaf", @@ -380,14 +348,6 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.3.1" }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.16.0" - }, "social-auth-app-django": { "hashes": [ "sha256:52241a25445a010ab1c108bafff21fc5522d5c8cd0d48a92c39c7371824b065d", @@ -435,13 +395,6 @@ ], "version": "==0.2.5" }, - "webencodings": { - "hashes": [ - "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", - "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" - ], - "version": "==0.5.1" - }, "whitenoise": { "hashes": [ "sha256:d234b871b52271ae7ed6d9da47ffe857c76568f11dd30e28e18c5869dbd11e12", @@ -449,14 +402,6 @@ ], "index": "pypi", "version": "==5.3.0" - }, - "zipp": { - "hashes": [ - "sha256:9f50f446828eb9d45b267433fd3e9da8d801f614129124863f9c51ebceafb87d", - "sha256:b47250dd24f92b7dd6a0a8fc5244da14608f3ca90a5efcd37a3b1642fac9a375" - ], - "markers": "python_version >= '3.7'", - "version": "==3.7.0" } }, "develop": { @@ -502,61 +447,58 @@ }, "coverage": { "hashes": [ - "sha256:012157499ec4f135fc36cd2177e3d1a1840af9b236cbe80e9a5ccfc83d912a69", - "sha256:0a34d313105cdd0d3644c56df2d743fe467270d6ab93b5d4a347eb9fec8924d6", - "sha256:11e61c5548ecf74ea1f8b059730b049871f0e32b74f88bd0d670c20c819ad749", - "sha256:152cc2624381df4e4e604e21bd8e95eb8059535f7b768c1fb8b8ae0b26f47ab0", - "sha256:1b4285fde5286b946835a1a53bba3ad41ef74285ba9e8013e14b5ea93deaeafc", - "sha256:27a94db5dc098c25048b0aca155f5fac674f2cf1b1736c5272ba28ead2fc267e", - "sha256:27ac7cb84538e278e07569ceaaa6f807a029dc194b1c819a9820b9bb5dbf63ab", - "sha256:2a491e159294d756e7fc8462f98175e2d2225e4dbe062cca7d3e0d5a75ba6260", - "sha256:2bc85664b06ba42d14bb74d6ddf19d8bfc520cb660561d2d9ce5786ae72f71b5", - "sha256:32168001f33025fd756884d56d01adebb34e6c8c0b3395ca8584cdcee9c7c9d2", - "sha256:3c4ce3b647bd1792d4394f5690d9df6dc035b00bcdbc5595099c01282a59ae01", - "sha256:433b99f7b0613bdcdc0b00cc3d39ed6d756797e3b078d2c43f8a38288520aec6", - "sha256:4578728c36de2801c1deb1c6b760d31883e62e33f33c7ba8f982e609dc95167d", - "sha256:509c68c3e2015022aeda03b003dd68fa19987cdcf64e9d4edc98db41cfc45d30", - "sha256:51372e24b1f7143ee2df6b45cff6a721f3abe93b1e506196f3ffa4155c2497f7", - "sha256:5d008e0f67ac800b0ca04d7914b8501312c8c6c00ad8c7ba17754609fae1231a", - "sha256:649df3641eb351cdfd0d5533c92fc9df507b6b2bf48a7ef8c71ab63cbc7b5c3c", - "sha256:6e78b1e25e5c5695dea012be473e442f7094d066925604be20b30713dbd47f89", - "sha256:72d9d186508325a456475dd05b1756f9a204c7086b07fffb227ef8cee03b1dc2", - "sha256:7d82c610a2e10372e128023c5baf9ce3d270f3029fe7274ff5bc2897c68f1318", - "sha256:7ee317486593193e066fc5e98ac0ce712178c21529a85c07b7cb978171f25d53", - "sha256:7eed8459a2b81848cafb3280b39d7d49950d5f98e403677941c752e7e7ee47cb", - "sha256:823f9325283dc9565ba0aa2d240471a93ca8999861779b2b6c7aded45b58ee0f", - "sha256:85c5fc9029043cf8b07f73fbb0a7ab6d3b717510c3b5642b77058ea55d7cacde", - "sha256:86c91c511853dfda81c2cf2360502cb72783f4b7cebabef27869f00cbe1db07d", - "sha256:8e0c3525b1a182c8ffc9bca7e56b521e0c2b8b3e82f033c8e16d6d721f1b54d6", - "sha256:987a84ff98a309994ca77ed3cc4b92424f824278e48e4bf7d1bb79a63cfe2099", - "sha256:9ed3244b415725f08ca3bdf02ed681089fd95e9465099a21c8e2d9c5d6ca2606", - "sha256:a189036c50dcd56100746139a459f0d27540fef95b09aba03e786540b8feaa5f", - "sha256:a4748349734110fd32d46ff8897b561e6300d8989a494ad5a0a2e4f0ca974fc7", - "sha256:a5d79c9af3f410a2b5acad91258b4ae179ee9c83897eb9de69151b179b0227f5", - "sha256:a7596aa2f2b8fa5604129cfc9a27ad9beec0a96f18078cb424d029fdd707468d", - "sha256:ab4fc4b866b279740e0d917402f0e9a08683e002f43fa408e9655818ed392196", - "sha256:bde4aeabc0d1b2e52c4036c54440b1ad05beeca8113f47aceb4998bb7471e2c2", - "sha256:c72bb4679283c6737f452eeb9b2a0e570acaef2197ad255fb20162adc80bea76", - "sha256:c8582e9280f8d0f38114fe95a92ae8d0790b56b099d728cc4f8a2e14b1c4a18c", - "sha256:ca29c352389ea27a24c79acd117abdd8a865c6eb01576b6f0990cd9a4e9c9f48", - "sha256:ce443a3e6df90d692c38762f108fc4c88314bf477689f04de76b3f252e7a351c", - "sha256:d1675db48490e5fa0b300f6329ecb8a9a37c29b9ab64fa9c964d34111788ca2d", - "sha256:da1a428bdbe71f9a8c270c7baab29e9552ac9d0e0cba5e7e9a4c9ee6465d258d", - "sha256:e4ff163602c5c77e7bb4ea81ba5d3b793b4419f8acd296aae149370902cf4e92", - "sha256:e67ccd53da5958ea1ec833a160b96357f90859c220a00150de011b787c27b98d", - "sha256:e8071e7d9ba9f457fc674afc3de054450be2c9b195c470147fbbc082468d8ff7", - "sha256:fff16a30fdf57b214778eff86391301c4509e327a65b877862f7c929f10a4253" + "sha256:1245ab82e8554fa88c4b2ab1e098ae051faac5af829efdcf2ce6b34dccd5567c", + "sha256:1bc6d709939ff262fd1432f03f080c5042dc6508b6e0d3d20e61dd045456a1a0", + "sha256:25e73d4c81efa8ea3785274a2f7f3bfbbeccb6fcba2a0bdd3be9223371c37554", + "sha256:276b13cc085474e482566c477c25ed66a097b44c6e77132f3304ac0b039f83eb", + "sha256:2aed4761809640f02e44e16b8b32c1a5dee5e80ea30a0ff0912158bde9c501f2", + "sha256:2dd70a167843b4b4b2630c0c56f1b586fe965b4f8ac5da05b6690344fd065c6b", + "sha256:352c68e233409c31048a3725c446a9e48bbff36e39db92774d4f2380d630d8f8", + "sha256:3f2b05757c92ad96b33dbf8e8ec8d4ccb9af6ae3c9e9bd141c7cc44d20c6bcba", + "sha256:448d7bde7ceb6c69e08474c2ddbc5b4cd13c9e4aa4a717467f716b5fc938a734", + "sha256:463e52616ea687fd323888e86bf25e864a3cc6335a043fad6bbb037dbf49bbe2", + "sha256:482fb42eea6164894ff82abbcf33d526362de5d1a7ed25af7ecbdddd28fc124f", + "sha256:56c4a409381ddd7bbff134e9756077860d4e8a583d310a6f38a2315b9ce301d0", + "sha256:56d296cbc8254a7dffdd7bcc2eb70be5a233aae7c01856d2d936f5ac4e8ac1f1", + "sha256:5e15d424b8153756b7c903bde6d4610be0c3daca3986173c18dd5c1a1625e4cd", + "sha256:618eeba986cea7f621d8607ee378ecc8c2504b98b3fdc4952b30fe3578304687", + "sha256:61d47a897c1e91f33f177c21de897267b38fbb45f2cd8e22a710bcef1df09ac1", + "sha256:621f6ea7260ea2ffdaec64fe5cb521669984f567b66f62f81445221d4754df4c", + "sha256:6a5cdc3adb4f8bb8d8f5e64c2e9e282bc12980ef055ec6da59db562ee9bdfefa", + "sha256:6c3f6158b02ac403868eea390930ae64e9a9a2a5bbfafefbb920d29258d9f2f8", + "sha256:704f89b87c4f4737da2860695a18c852b78ec7279b24eedacab10b29067d3a38", + "sha256:72128176fea72012063200b7b395ed8a57849282b207321124d7ff14e26988e8", + "sha256:78fbb2be068a13a5d99dce9e1e7d168db880870f7bc73f876152130575bd6167", + "sha256:7bff3a98f63b47464480de1b5bdd80c8fade0ba2832c9381253c9b74c4153c27", + "sha256:84f2436d6742c01136dd940ee158bfc7cf5ced3da7e4c949662b8703b5cd8145", + "sha256:9976fb0a5709988778ac9bc44f3d50fccd989987876dfd7716dee28beed0a9fa", + "sha256:9ad0a117b8dc2061ce9461ea4c1b4799e55edceb236522c5b8f958ce9ed8fa9a", + "sha256:9e3dd806f34de38d4c01416344e98eab2437ac450b3ae39c62a0ede2f8b5e4ed", + "sha256:9eb494070aa060ceba6e4bbf44c1bc5fa97bfb883a0d9b0c9049415f9e944793", + "sha256:9fde6b90889522c220dd56a670102ceef24955d994ff7af2cb786b4ba8fe11e4", + "sha256:9fff3ff052922cb99f9e52f63f985d4f7a54f6b94287463bc66b7cdf3eb41217", + "sha256:a06c358f4aed05fa1099c39decc8022261bb07dfadc127c08cfbd1391b09689e", + "sha256:a4f923b9ab265136e57cc14794a15b9dcea07a9c578609cd5dbbfff28a0d15e6", + "sha256:c5b81fb37db76ebea79aa963b76d96ff854e7662921ce742293463635a87a78d", + "sha256:d5ed164af5c9078596cfc40b078c3b337911190d3faeac830c3f1274f26b8320", + "sha256:d651fde74a4d3122e5562705824507e2f5b2d3d57557f1916c4b27635f8fbe3f", + "sha256:de73fca6fb403dd72d4da517cfc49fcf791f74eee697d3219f6be29adf5af6ce", + "sha256:e647a0be741edbb529a72644e999acb09f2ad60465f80757da183528941ff975", + "sha256:e92c7a5f7d62edff50f60a045dc9542bf939758c95b2fcd686175dd10ce0ed10", + "sha256:eeffd96882d8c06d31b65dddcf51db7c612547babc1c4c5db6a011abe9798525", + "sha256:f5a4551dfd09c3bd12fca8144d47fe7745275adf3229b7223c2f9e29a975ebda", + "sha256:fac0bcc5b7e8169bffa87f0dcc24435446d329cbc2b5486d155c2e0f3b493ae1" ], "index": "pypi", - "version": "==6.3" + "version": "==6.3.1" }, "django": { "hashes": [ - "sha256:0a0a37f0b93aef30c4bf3a839c187e1175bcdeb7e177341da0cb7b8194416891", - "sha256:69c94abe5d6b1b088bf475e09b7b74403f943e34da107e798465d2045da27e75" + "sha256:9772e6935703e59e993960832d66a614cf0233a1c5123bc6224ecc6ad69e41e2", + "sha256:9b06c289f9ba3a8abea16c9c9505f25107809fb933676f6c891ded270039d965" ], "index": "pypi", - "version": "==3.2.11" + "version": "==3.2.12" }, "django-stubs": { "hashes": [ @@ -846,10 +788,10 @@ }, "types-pyyaml": { "hashes": [ - "sha256:6ea4eefa8579e0ce022f785a62de2bcd647fad4a81df5cf946fd67e4b059920b", - "sha256:8b50294b55a9db89498cdc5a65b1b4545112b6cd1cf4465bd693d828b0282a17" + "sha256:6252f62d785e730e454dfa0c9f0fb99d8dae254c5c3c686903cf878ea27c04b7", + "sha256:693b01c713464a6851f36ff41077f8adbc6e355eda929addfb4a97208aea9b4b" ], - "version": "==6.0.3" + "version": "==6.0.4" }, "typing-extensions": { "hashes": [ diff --git a/scripts/check.sh b/scripts/check.sh index 5de221c..02ee486 100755 --- a/scripts/check.sh +++ b/scripts/check.sh @@ -23,7 +23,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -cd "$(dirname -- "$(dirname -- "$(readlink -f "$0")")")" +cd "$(dirname -- "$(dirname -- "$(readlink -f "$0")")")" || exit for cmd in flake8 isort mypy pylint; do if [[ ! -x "$(which "$cmd")" ]]; then diff --git a/scripts/format.sh b/scripts/format.sh index 1cb2e78..67d46a9 100755 --- a/scripts/format.sh +++ b/scripts/format.sh @@ -23,7 +23,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -cd "$(dirname -- "$(dirname -- "$(readlink -f "$0")")")" +cd "$(dirname -- "$(dirname -- "$(readlink -f "$0")")")" || exit for cmd in black autopep8 isort; do if [[ ! -x "$(which "$cmd")" ]]; then diff --git a/tjdests/apps/destinations/templatetags/markdown.py b/tjdests/apps/destinations/templatetags/markdown.py index c6ae66f..36b4b0f 100644 --- a/tjdests/apps/destinations/templatetags/markdown.py +++ b/tjdests/apps/destinations/templatetags/markdown.py @@ -1,15 +1,28 @@ -from markdown import markdown +import mistune +from pygments import highlight +from pygments.formatters import html +from pygments.lexers import get_lexer_by_name from django import template -from .strikethrough import StrikethroughExtension - register = template.Library() +class HighlightRenderer(mistune.HTMLRenderer): + def block_code(self, code, info=None): + if info: + lexer = get_lexer_by_name(info, stripall=True) + formatter = html.HtmlFormatter() + return highlight(code, lexer, formatter) + return "
" + mistune.escape(code) + "
" + + @register.filter(name="markdown") def convert_markdown(text: str): """Convert text to markdown HTML.""" - return markdown( - text, extensions=["extra", "codehilite", "smarty", StrikethroughExtension()] + markdown = mistune.create_markdown( + renderer=HighlightRenderer(), + plugins=["footnotes", "strikethrough", "table"], + escape=False, ) + return markdown(text) diff --git a/tjdests/apps/destinations/templatetags/sanitize.py b/tjdests/apps/destinations/templatetags/sanitize.py deleted file mode 100644 index e04f277..0000000 --- a/tjdests/apps/destinations/templatetags/sanitize.py +++ /dev/null @@ -1,19 +0,0 @@ -from bleach import clean -from bleach.sanitizer import ALLOWED_TAGS - -from django import template - -register = template.Library() - -tags = ( - ALLOWED_TAGS - + ["h" + str(i) for i in range(1, 7)] - + ["div", "p", "pre", "span", "s"] -) -attrs = {"*": ["class"]} - - -@register.filter(name="sanitize") -def convert_markdown(text: str): - """Sanitize HTML (removing potential XSS attacks).""" - return clean(text, tags=tags, attributes=attrs) diff --git a/tjdests/apps/destinations/templatetags/strikethrough.py b/tjdests/apps/destinations/templatetags/strikethrough.py deleted file mode 100644 index ab1df5f..0000000 --- a/tjdests/apps/destinations/templatetags/strikethrough.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# pylint: skip-file -"""Markdown Strikethrough Extension -Extends the Python-Markdown library to support strikethrough text. -Given the text: - The molecular composition of water is ~~HCl~~. -Will output: -

The molecular composition of water is HCl.

-Based on Markdown Subscript Extension - :website: https://github.com/jambonrose/markdown_subscript_extension - :copyright: Copyright 2014-2018 Andrew Pinkham - :license: Simplified BSD, see LICENSE for details. -This version by Shreyas Mayya. -Pylint was skipped here because python-markdown appears to require -a specific syntax which is at odds with pylint's ruleset. -""" - -from __future__ import unicode_literals - -from markdown import Extension -from markdown.inlinepatterns import SimpleTagPattern - -# match ~~, at least one character that is not ~, and ~~ again -SUBSCRIPT_RE = r"(\~\~)([^(\~)]+)(\~\~)" - - -def makeExtension(*args, **kwargs): # noqa: N802 - """Inform Markdown of the existence of the extension.""" - return StrikethroughExtension(*args, **kwargs) - - -class StrikethroughExtension(Extension): - """Extension: text between ~~ characters will be struck through.""" - - def extendMarkdown(self, md, md_globals): # noqa: N802 - """Insert 's' pattern before 'not_strong' pattern.""" - md.inlinePatterns.add( - "strikethrough", SimpleTagPattern(SUBSCRIPT_RE, "s"), "Student Destinations @@ -75,7 +74,7 @@
{{ senior.biography|markdown|sanitize|safe }}
{{ senior.biography|markdown|safe }}
{# Decisions #} From 69fb6f8ca8f20ee8c2c2b33b51af71fa77521709 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Wed, 9 Feb 2022 17:14:23 -0500 Subject: [PATCH 13/18] fix(destinations): sort properly by preferred name --- .../migrations/0012_user_preferred_name.py | 18 ++++++++++++++++++ tjdests/apps/authentication/models.py | 9 +++++++-- tjdests/apps/destinations/views.py | 4 +++- 3 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 tjdests/apps/authentication/migrations/0012_user_preferred_name.py diff --git a/tjdests/apps/authentication/migrations/0012_user_preferred_name.py b/tjdests/apps/authentication/migrations/0012_user_preferred_name.py new file mode 100644 index 0000000..3e6fb55 --- /dev/null +++ b/tjdests/apps/authentication/migrations/0012_user_preferred_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-02-09 22:04 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("authentication", "0011_user_use_nickname"), + ] + + operations = [ + migrations.AddField( + model_name="user", + name="preferred_name", + field=models.CharField(blank=True, max_length=30), + ), + ] diff --git a/tjdests/apps/authentication/models.py b/tjdests/apps/authentication/models.py index 7d98f64..a7bcd4d 100644 --- a/tjdests/apps/authentication/models.py +++ b/tjdests/apps/authentication/models.py @@ -40,9 +40,14 @@ class User(AbstractUser): last_modified = models.DateTimeField(auto_now=True) - @property - def preferred_name(self): + preferred_name = models.CharField(max_length=30, blank=True) + + def get_preferred_name(self): return self.nickname if self.nickname and self.use_nickname else self.first_name def __str__(self): return f"{self.preferred_name} {self.last_name}" + + def save(self, *args, **kwargs): + self.preferred_name = self.get_preferred_name() + super().save(*args, **kwargs) diff --git a/tjdests/apps/destinations/views.py b/tjdests/apps/destinations/views.py index 629b3ac..3669737 100644 --- a/tjdests/apps/destinations/views.py +++ b/tjdests/apps/destinations/views.py @@ -27,7 +27,9 @@ class StudentDestinationListView( else: queryset = User.objects.filter(publish_data=True) - queryset = queryset.filter(is_senior=True).order_by("last_name", "first_name") + queryset = queryset.filter(is_senior=True).order_by( + "last_name", "preferred_name" + ) college_id: Optional[str] = self.request.GET.get("college", None) if college_id is not None: From 1c70273a1ce0d2ed3b7682aa38491399144af714 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Thu, 17 Feb 2022 10:04:13 -0500 Subject: [PATCH 14/18] feat(authentications): make GPA a DecimalField this allows us to set the decimal places in the field instead of in a string format, eliminating confusion when some writes e.g. 4.500 in their profile but profile says 4.5 after save --- .../migrations/0013_alter_user_gpa.py | 18 ++++++++++++++++++ tjdests/apps/authentication/models.py | 2 +- .../templates/destinations/student_list.html | 2 +- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 tjdests/apps/authentication/migrations/0013_alter_user_gpa.py diff --git a/tjdests/apps/authentication/migrations/0013_alter_user_gpa.py b/tjdests/apps/authentication/migrations/0013_alter_user_gpa.py new file mode 100644 index 0000000..facd2ff --- /dev/null +++ b/tjdests/apps/authentication/migrations/0013_alter_user_gpa.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.12 on 2022-02-17 15:02 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('authentication', '0012_user_preferred_name'), + ] + + operations = [ + migrations.AlterField( + model_name='user', + name='GPA', + field=models.DecimalField(blank=True, decimal_places=3, help_text='Weighted GPA', max_digits=4, null=True), + ), + ] diff --git a/tjdests/apps/authentication/models.py b/tjdests/apps/authentication/models.py index a7bcd4d..a4c3588 100644 --- a/tjdests/apps/authentication/models.py +++ b/tjdests/apps/authentication/models.py @@ -8,7 +8,7 @@ class User(AbstractUser): accepted_terms = models.BooleanField(default=False) graduation_year = models.PositiveSmallIntegerField(null=True) - GPA = models.FloatField(null=True, blank=True, name="GPA", help_text="Weighted GPA") + GPA = models.DecimalField(null=True, blank=True, name="GPA", help_text="Weighted GPA", max_digits=4, decimal_places=3) is_senior = models.BooleanField(default=False) is_student = models.BooleanField(default=False) diff --git a/tjdests/templates/destinations/student_list.html b/tjdests/templates/destinations/student_list.html index 1237426..703bf6c 100644 --- a/tjdests/templates/destinations/student_list.html +++ b/tjdests/templates/destinations/student_list.html @@ -49,7 +49,7 @@ {% for senior in object_list %} - +
{{ senior }}{{ senior.GPA|stringformat:".3f" }}{{ senior.GPA }} {# Test scores #} From 1ddad17a1e7f616c0cd77cc96d24034678b280e9 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Thu, 17 Feb 2022 10:10:21 -0500 Subject: [PATCH 15/18] fix(profile): use Decimal in GPA tests --- .../migrations/0013_alter_user_gpa.py | 14 ++++++++++---- tjdests/apps/authentication/models.py | 9 ++++++++- tjdests/apps/profile/forms.py | 3 ++- tjdests/apps/profile/tests.py | 8 +++++--- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/tjdests/apps/authentication/migrations/0013_alter_user_gpa.py b/tjdests/apps/authentication/migrations/0013_alter_user_gpa.py index facd2ff..454bc94 100644 --- a/tjdests/apps/authentication/migrations/0013_alter_user_gpa.py +++ b/tjdests/apps/authentication/migrations/0013_alter_user_gpa.py @@ -6,13 +6,19 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('authentication', '0012_user_preferred_name'), + ("authentication", "0012_user_preferred_name"), ] operations = [ migrations.AlterField( - model_name='user', - name='GPA', - field=models.DecimalField(blank=True, decimal_places=3, help_text='Weighted GPA', max_digits=4, null=True), + model_name="user", + name="GPA", + field=models.DecimalField( + blank=True, + decimal_places=3, + help_text="Weighted GPA", + max_digits=4, + null=True, + ), ), ] diff --git a/tjdests/apps/authentication/models.py b/tjdests/apps/authentication/models.py index a4c3588..86e81c2 100644 --- a/tjdests/apps/authentication/models.py +++ b/tjdests/apps/authentication/models.py @@ -8,7 +8,14 @@ class User(AbstractUser): accepted_terms = models.BooleanField(default=False) graduation_year = models.PositiveSmallIntegerField(null=True) - GPA = models.DecimalField(null=True, blank=True, name="GPA", help_text="Weighted GPA", max_digits=4, decimal_places=3) + GPA = models.DecimalField( + null=True, + blank=True, + name="GPA", + help_text="Weighted GPA", + max_digits=4, + decimal_places=3, + ) is_senior = models.BooleanField(default=False) is_student = models.BooleanField(default=False) diff --git a/tjdests/apps/profile/forms.py b/tjdests/apps/profile/forms.py index 76acad6..2f1f9aa 100644 --- a/tjdests/apps/profile/forms.py +++ b/tjdests/apps/profile/forms.py @@ -1,3 +1,4 @@ +from decimal import Decimal from typing import Any, Dict from crispy_forms.helper import FormHelper @@ -28,7 +29,7 @@ class ProfilePublishForm(forms.ModelForm): # Check the GPA: 0.0 <= GPA <= 5.0 if cleaned_data.get("GPA"): gpa = cleaned_data.get("GPA") - assert isinstance(gpa, float) + assert isinstance(gpa, Decimal) if not 0.0 <= gpa <= 5.0: self.add_error("GPA", "This is not a valid GPA") diff --git a/tjdests/apps/profile/tests.py b/tjdests/apps/profile/tests.py index 9c787bb..799cec4 100644 --- a/tjdests/apps/profile/tests.py +++ b/tjdests/apps/profile/tests.py @@ -1,3 +1,5 @@ +from decimal import Decimal + from django.urls import reverse from tjdests.apps.authentication.models import User @@ -44,7 +46,7 @@ class ProfileTest(TJDestsTestCase): self.assertEqual( 1, User.objects.filter( - GPA=4.000, + GPA=Decimal(4.000), id=user.id, biography="hello", attending_decision=None, @@ -92,7 +94,7 @@ class ProfileTest(TJDestsTestCase): 1, User.objects.filter( id=user.id, - GPA=3.141, + GPA=Decimal(3.141), biography="hello2", attending_decision=decision, publish_data=True, @@ -123,7 +125,7 @@ class ProfileTest(TJDestsTestCase): 1, User.objects.filter( id=user.id, - GPA=3.141, + GPA=Decimal(3.141), biography="hello2", attending_decision=decision, publish_data=True, From d84e608ecb49cf2fea4f73f7b75ec0b68868a5bd Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sat, 19 Feb 2022 23:18:01 -0500 Subject: [PATCH 16/18] feat(destinations): don't show None if no GPA entered --- tjdests/templates/destinations/student_list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tjdests/templates/destinations/student_list.html b/tjdests/templates/destinations/student_list.html index 703bf6c..e4e4ef1 100644 --- a/tjdests/templates/destinations/student_list.html +++ b/tjdests/templates/destinations/student_list.html @@ -49,7 +49,7 @@ {% for senior in object_list %} - +
{{ senior }}{{ senior.GPA }}{% firstof senior.GPA "" %} {# Test scores #} From 8694e2524764344288204bb1558607a13fb53ea8 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya <2022smayya@tjhsst.edu> Date: Sat, 19 Feb 2022 23:20:16 -0500 Subject: [PATCH 17/18] fix(profile): save user before checking preferred_name --- tjdests/apps/profile/tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tjdests/apps/profile/tests.py b/tjdests/apps/profile/tests.py index 799cec4..51b9cd2 100644 --- a/tjdests/apps/profile/tests.py +++ b/tjdests/apps/profile/tests.py @@ -138,9 +138,11 @@ class ProfileTest(TJDestsTestCase): user.nickname = "Memer" # Should use nickname ("Memer") if option set user.use_nickname = True + user.save() self.assertEqual("Memer", user.preferred_name) # Should use first name ("Dank") if option not set user.use_nickname = False + user.save() self.assertEqual("Dank", user.preferred_name) def test_testscore_create(self): From e9fc4261b7979c27c2e1b32f1ae6925097b56e79 Mon Sep 17 00:00:00 2001 From: Shreyas Mayya Date: Mon, 21 Mar 2022 08:59:10 -0400 Subject: [PATCH 18/18] fix(profile): remove carriage returns from biographies on save --- tjdests/apps/profile/forms.py | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/tjdests/apps/profile/forms.py b/tjdests/apps/profile/forms.py index 2f1f9aa..411e245 100644 --- a/tjdests/apps/profile/forms.py +++ b/tjdests/apps/profile/forms.py @@ -24,6 +24,17 @@ class ProfilePublishForm(forms.ModelForm): ) def clean(self) -> Dict[str, Any]: + data = self.data.copy() + + # Remove carriage returns from biography + if data.get("biography"): + data["biography"] = data["biography"].replace("\r", "") + self.instance.biography = data["biography"] + if len(data["biography"]) <= self.fields["biography"].max_length: + if self.errors.get("biography"): + del self.errors["biography"] + + self.data = data cleaned_data = super().clean() # Check the GPA: 0.0 <= GPA <= 5.0