Browse Source

Add markdown content, phase 1 migration

pull/16/head
Matīss Treinis 4 years ago
parent
commit
4867bb3cca
No known key found for this signature in database GPG Key ID: 9123B913EBF53D43
  1. 4
      Pipfile
  2. 239
      Pipfile.lock
  3. 61
      frontend/src/admin/scss/main.scss
  4. 55
      page_blog_dump.sql
  5. 19
      www/management/commands/migrate_quill.py
  6. 52
      www/migrations/0005_auto_20210912_1242.py
  7. 29
      www/models.py
  8. 6
      www/templates/blog/post.html
  9. 6
      www/templates/page/page.html

4
Pipfile

@ -12,6 +12,10 @@ PyYAML = "~=5.4.1"
django-quill-editor = "~=0.1.22"
uWSGI = "~=2.0"
requests = "~=2.25"
Markdown = "~=3.3"
# Temporay for posts migration
markdownify = "*"
[dev-packages]
mypy = "*"

239
Pipfile.lock

@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
"sha256": "5e1a3669d564f2f929bcb69cfeceb5d5b84037931b54ffca8ed60dd8f6ecc85f"
"sha256": "154e39a24587c0dbd391fcfc006b365b7ae0cb4c7d4ee79c368ff72c32136713"
},
"pipfile-spec": 6,
"requires": {
@ -18,34 +18,42 @@
"default": {
"asgiref": {
"hashes": [
"sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee",
"sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"
"sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9",
"sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"
],
"markers": "python_version >= '3.6'",
"version": "==3.3.4"
"version": "==3.4.1"
},
"beautifulsoup4": {
"hashes": [
"sha256:9a315ce70049920ea4572a4055bc4bd700c940521d36fc858205ad4fcde149bf",
"sha256:c23ad23c521d818955a4151a67d81580319d4bf548d3d49f4223ae041ff98891"
],
"markers": "python_version >= '3.1'",
"version": "==4.10.0"
},
"certifi": {
"hashes": [
"sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c",
"sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"
"sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee",
"sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"
],
"version": "==2020.12.5"
"version": "==2021.5.30"
},
"chardet": {
"charset-normalizer": {
"hashes": [
"sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa",
"sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"
"sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b",
"sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'",
"version": "==4.0.0"
"markers": "python_version >= '3'",
"version": "==2.0.4"
},
"django": {
"hashes": [
"sha256:13ac78dbfd189532cad8f383a27e58e18b3d33f80009ceb476d7fcbfc5dcebd8",
"sha256:7e0a1393d18c16b503663752a8b6790880c5084412618990ce8a81cc908b4962"
"sha256:95b318319d6997bac3595517101ad9cc83fe5672ac498ba48d1a410f47afecd2",
"sha256:e93c93565005b37ddebf2396b4dc4b6913c1838baa82efdfb79acedd5816c240"
],
"index": "pypi",
"version": "==3.2.3"
"version": "==3.2.7"
},
"django-quill-editor": {
"hashes": [
@ -57,11 +65,27 @@
},
"idna": {
"hashes": [
"sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6",
"sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"
"sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a",
"sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==2.10"
"markers": "python_version >= '3'",
"version": "==3.2"
},
"markdown": {
"hashes": [
"sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49",
"sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"
],
"index": "pypi",
"version": "==3.3.4"
},
"markdownify": {
"hashes": [
"sha256:153c9e739544a5dc086dbc55709c5019532f81052fbdf0dc937f7835009110dd",
"sha256:a32d7d6b0801f81d12a44533093a5681b402c6b7e9a7049512d26697517eb795"
],
"index": "pypi",
"version": "==0.9.4"
},
"mysqlclient": {
"hashes": [
@ -94,6 +118,7 @@
"sha256:63728564c1410d99e6d1ae8e3b810fe012bc440952168af0a2877e8ff5ab96b9",
"sha256:66cc56579fd91f517290ab02c51e3a80f581aba45fd924fcdee01fa06e635812",
"sha256:6c32cc3145928c4305d142ebec682419a6c0a8ce9e33db900027ddca1ec39178",
"sha256:8b56553c0345ad6dcb2e9b433ae47d67f95fc23fe28a0bde15a120f25257e291",
"sha256:8bb1e155a74e1bfbacd84555ea62fa21c58e0b4e7e6b20e4447b8d07990ac78b",
"sha256:95d5ef984eff897850f3a83883363da64aae1000e79cb3c321915468e8c6add5",
"sha256:a013cbe25d20c2e0c4e85a9daf438f85121a4d0344ddc76e33fd7e3965d9af4b",
@ -165,27 +190,43 @@
},
"requests": {
"hashes": [
"sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804",
"sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"
"sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24",
"sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"
],
"index": "pypi",
"version": "==2.25.1"
"version": "==2.26.0"
},
"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"
},
"soupsieve": {
"hashes": [
"sha256:052774848f448cf19c7e959adf5566904d525f33a3f8b6ba6f6f8f26ec7de0cc",
"sha256:c2c1c2d44f158cdbddab7824a9af8c4f83c76b1e23e049479aa432feb6c4c23b"
],
"markers": "python_version >= '3.6'",
"version": "==2.2.1"
},
"sqlparse": {
"hashes": [
"sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0",
"sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"
"sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae",
"sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"
],
"markers": "python_version >= '3.5'",
"version": "==0.4.1"
"version": "==0.4.2"
},
"urllib3": {
"hashes": [
"sha256:2f4da4594db7e1e110a944bb1b551fdf4e6c136ad42e4234131391e21eb5b0df",
"sha256:e7b021f7241115872f92f43c6508082facffbd1c048e3c6e2bb9c2a157e28937"
"sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4",
"sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"
],
"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.4"
"version": "==1.26.6"
},
"uwsgi": {
"hashes": [
@ -198,63 +239,64 @@
"develop": {
"asgiref": {
"hashes": [
"sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee",
"sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"
"sha256:4ef1ab46b484e3c706329cedeff284a5d40824200638503f5768edb6de7d58e9",
"sha256:ffc141aa908e6f175673e7b1b3b7af4fdb0ecb738fc5c8b88f69f055c2415214"
],
"markers": "python_version >= '3.6'",
"version": "==3.3.4"
"version": "==3.4.1"
},
"django": {
"hashes": [
"sha256:13ac78dbfd189532cad8f383a27e58e18b3d33f80009ceb476d7fcbfc5dcebd8",
"sha256:7e0a1393d18c16b503663752a8b6790880c5084412618990ce8a81cc908b4962"
"sha256:95b318319d6997bac3595517101ad9cc83fe5672ac498ba48d1a410f47afecd2",
"sha256:e93c93565005b37ddebf2396b4dc4b6913c1838baa82efdfb79acedd5816c240"
],
"index": "pypi",
"version": "==3.2.3"
"version": "==3.2.7"
},
"django-stubs": {
"hashes": [
"sha256:717967d7fee0a6af0746724a0be80d72831a982a40fa8f245a6a46f4cafd157b",
"sha256:bde9e44e3c4574c2454e74a3e607cc3bc23b0441bb7d1312cd677d5e30984b74"
"sha256:59c9f81af64d214b1954eaf90f037778c8d2b9c2de946a3cda177fefcf588fbd",
"sha256:664843091636a917faf5256d028476559dc360fdef9050b6df87ab61b21607bf"
],
"index": "pypi",
"version": "==1.8.0"
"version": "==1.9.0"
},
"django-stubs-ext": {
"hashes": [
"sha256:bd4a1e36ef2ba0ef15801933c85c68e59b383302c873795c6ecfc25950c7ecdb",
"sha256:c14f297835a42c1122421ec7e2d06579996b29d33b8016002762afa5d78863af"
"sha256:783c198d7e39a41be0b90fd843fa2770243a642922af679be4b19e03b82c8c28",
"sha256:a51a3e9e844d4e1cacaaedbb33bf3def78a3956eed5d9575a640bd97ccd99cec"
],
"markers": "python_version >= '3.6'",
"version": "==0.2.0"
"version": "==0.3.1"
},
"mypy": {
"hashes": [
"sha256:0d0a87c0e7e3a9becdfbe936c981d32e5ee0ccda3e0f07e1ef2c3d1a817cf73e",
"sha256:25adde9b862f8f9aac9d2d11971f226bd4c8fbaa89fb76bdadb267ef22d10064",
"sha256:28fb5479c494b1bab244620685e2eb3c3f988d71fd5d64cc753195e8ed53df7c",
"sha256:2f9b3407c58347a452fc0736861593e105139b905cca7d097e413453a1d650b4",
"sha256:33f159443db0829d16f0a8d83d94df3109bb6dd801975fe86bacb9bf71628e97",
"sha256:3f2aca7f68580dc2508289c729bd49ee929a436208d2b2b6aab15745a70a57df",
"sha256:499c798053cdebcaa916eef8cd733e5584b5909f789de856b482cd7d069bdad8",
"sha256:4eec37370483331d13514c3f55f446fc5248d6373e7029a29ecb7b7494851e7a",
"sha256:552a815579aa1e995f39fd05dde6cd378e191b063f031f2acfe73ce9fb7f9e56",
"sha256:5873888fff1c7cf5b71efbe80e0e73153fe9212fafdf8e44adfe4c20ec9f82d7",
"sha256:61a3d5b97955422964be6b3baf05ff2ce7f26f52c85dd88db11d5e03e146a3a6",
"sha256:674e822aa665b9fd75130c6c5f5ed9564a38c6cea6a6432ce47eafb68ee578c5",
"sha256:7ce3175801d0ae5fdfa79b4f0cfed08807af4d075b402b7e294e6aa72af9aa2a",
"sha256:9743c91088d396c1a5a3c9978354b61b0382b4e3c440ce83cf77994a43e8c521",
"sha256:9f94aac67a2045ec719ffe6111df543bac7874cee01f41928f6969756e030564",
"sha256:a26f8ec704e5a7423c8824d425086705e381b4f1dfdef6e3a1edab7ba174ec49",
"sha256:abf7e0c3cf117c44d9285cc6128856106183938c68fd4944763003decdcfeb66",
"sha256:b09669bcda124e83708f34a94606e01b614fa71931d356c1f1a5297ba11f110a",
"sha256:cd07039aa5df222037005b08fbbfd69b3ab0b0bd7a07d7906de75ae52c4e3119",
"sha256:d23e0ea196702d918b60c8288561e722bf437d82cb7ef2edcd98cfa38905d506",
"sha256:d65cc1df038ef55a99e617431f0553cd77763869eebdf9042403e16089fe746c",
"sha256:d7da2e1d5f558c37d6e8c1246f1aec1e7349e4913d8fb3cb289a35de573fe2eb"
"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"
],
"index": "pypi",
"version": "==0.812"
"version": "==0.910"
},
"mypy-extensions": {
"hashes": [
@ -272,54 +314,41 @@
},
"sqlparse": {
"hashes": [
"sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0",
"sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"
"sha256:0c00730c74263a94e5a9919ade150dfc3b19c574389985446148402998287dae",
"sha256:48719e356bb8b42991bdbb1e8b83223757b93789c00910a616a071910ca4a64d"
],
"markers": "python_version >= '3.5'",
"version": "==0.4.1"
},
"typed-ast": {
"hashes": [
"sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace",
"sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff",
"sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266",
"sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528",
"sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6",
"sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808",
"sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4",
"sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363",
"sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341",
"sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04",
"sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41",
"sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e",
"sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3",
"sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899",
"sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805",
"sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c",
"sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c",
"sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39",
"sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a",
"sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3",
"sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7",
"sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f",
"sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075",
"sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0",
"sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40",
"sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428",
"sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927",
"sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3",
"sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f",
"sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"
],
"version": "==1.4.3"
"version": "==0.4.2"
},
"toml": {
"hashes": [
"sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b",
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
],
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==0.10.2"
},
"types-pytz": {
"hashes": [
"sha256:28fb1c0f77f59aebe9b792d073ebfbbbf7b329f9d4af6a6079713a618a1c0f31",
"sha256:448828a06f2aaa840e57364d866c661645a045e532f817e4f10c8c3ab2b66651"
],
"version": "==2021.1.2"
},
"types-pyyaml": {
"hashes": [
"sha256:1d9e431e9f1f78a65ea957c558535a3b15ad67ea4912bce48a6c1b613dcf81ad",
"sha256:f1d1357168988e45fa20c65aecb3911462246a84809015dd889ebf8b1db74124"
],
"version": "==5.4.10"
},
"typing-extensions": {
"hashes": [
"sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497",
"sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342",
"sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"
"sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e",
"sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7",
"sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"
],
"version": "==3.10.0.0"
"version": "==3.10.0.2"
}
}
}

61
frontend/src/admin/scss/main.scss

@ -129,64 +129,11 @@ div.checkbox-row label {
}
/** Editor customizations **/
.colM .aligned .vLargeTextField.django-quill-widget-container {
width: unset;
textarea[name="content_md"] {
width: 656px !important;
display: block;
box-sizing: border-box;
float: none;
overflow: hidden;
}
form {
.ql-editor, .ql-snow .ql-editor {
min-height: 400px;
background: $al-body-background;
color: $al-font-color;
font-size: $al-font-base-size;
font-family: $al-font-family;
@import "../../common/scss/bootstrap";
@import "~bootstrap/scss/bootstrap-reboot";
@import "~bootstrap/scss/type";
h1,
h2,
h3,
h4,
h5,
h6,
p,
ul,
ul li,
ol,
ol li,
a,
blockquote {
all: revert;
font-family: $al-font-family-accent;
}
a {
color: #c4e1ff !important;
text-decoration: underline;
}
a:hover,
a:active {
color: #9db4cc !important;
}
ul, ol {
padding-left: revert;
margin-left: revert;
li {
padding-left: revert !important;
margin-left: revert !important;
&:before {
display: none;
}
}
}
}
overflow: auto;
min-height: 600px;
}

55
page_blog_dump.sql

File diff suppressed because one or more lines are too long

19
www/management/commands/migrate_quill.py

@ -0,0 +1,19 @@
from django.core.management.base import BaseCommand
from markdownify import markdownify as md
from www.models import BlogPost, Page
class Command(BaseCommand):
def handle(self, *args, **options):
posts = BlogPost.objects.all()
for post in posts:
post.content_md = md(post.content.html)
post.save()
pages = Page.objects.all()
for page in pages:
page.content_md = md(page.content.html)
page.save()

52
www/migrations/0005_auto_20210912_1242.py

@ -0,0 +1,52 @@
# Generated by Django 3.2.7 on 2021-09-12 12:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('www', '0004_add_featured_image_to_blog'),
]
operations = [
migrations.AddField(
model_name='blogpost',
name='content_html',
field=models.TextField(blank=True, editable=False),
),
migrations.AddField(
model_name='blogpost',
name='content_md',
field=models.TextField(blank=True, help_text='Markdown content of the blog entry', verbose_name='Content (Markdown)'),
),
migrations.AddField(
model_name='page',
name='content_html',
field=models.TextField(blank=True, editable=False),
),
migrations.AddField(
model_name='page',
name='content_md',
field=models.TextField(blank=True, help_text='Markdown content of the page content', verbose_name='Content (Markdown)'),
),
migrations.AlterField(
model_name='blogpost',
name='lang',
field=models.CharField(choices=[('en', 'English'), ('es', 'Español'), ('fr', 'Français'), ('it', 'Italiano'), ('ja', '日本語'), ('lv', 'Latviešu'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português Brasileiro'), ('ru', 'Русский'), ('tr', 'Türkçe'), ('uk', 'Украї́нська'), ('zh-hans', 'Chinese (Simplified)')], db_index=True, default='en', max_length=7, verbose_name='Content language'),
),
migrations.AlterField(
model_name='faqentry',
name='lang',
field=models.CharField(choices=[('en', 'English'), ('es', 'Español'), ('fr', 'Français'), ('it', 'Italiano'), ('ja', '日本語'), ('lv', 'Latviešu'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português Brasileiro'), ('ru', 'Русский'), ('tr', 'Türkçe'), ('uk', 'Украї́нська'), ('zh-hans', 'Chinese (Simplified)')], db_index=True, default='en', max_length=7, verbose_name='Content language'),
),
migrations.AlterField(
model_name='page',
name='lang',
field=models.CharField(choices=[('en', 'English'), ('es', 'Español'), ('fr', 'Français'), ('it', 'Italiano'), ('ja', '日本語'), ('lv', 'Latviešu'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português Brasileiro'), ('ru', 'Русский'), ('tr', 'Türkçe'), ('uk', 'Украї́нська'), ('zh-hans', 'Chinese (Simplified)')], db_index=True, default='en', max_length=7, verbose_name='Content language'),
),
migrations.AlterField(
model_name='showcasefeature',
name='lang',
field=models.CharField(choices=[('en', 'English'), ('es', 'Español'), ('fr', 'Français'), ('it', 'Italiano'), ('ja', '日本語'), ('lv', 'Latviešu'), ('pl', 'Polski'), ('pt', 'Português'), ('pt-br', 'Português Brasileiro'), ('ru', 'Русский'), ('tr', 'Türkçe'), ('uk', 'Украї́нська'), ('zh-hans', 'Chinese (Simplified)')], db_index=True, default='en', max_length=7, verbose_name='Content language'),
),
]

29
www/models.py

@ -2,6 +2,7 @@ from django.core.validators import FileExtensionValidator
from django.db import models
from django.utils.text import slugify
from django_quill.fields import QuillField # type: ignore
from markdown import markdown
from almalinux.settings import LANGUAGES
from commons.uploads import segmented_upload_to
@ -143,10 +144,24 @@ class Page(models.Model):
content: QuillField = QuillField()
content_md: models.TextField = models.TextField(
verbose_name='Content (Markdown)',
help_text='Markdown content of the page content',
blank=True,
)
content_html: models.TextField = models.TextField(
editable=False,
blank=True,
)
def save(self, *args, **kwargs) -> None: # type: ignore
if 0 == len(self.slug):
# noinspection PyTypeChecker
self.slug = slugify(self.title, allow_unicode=False)
self.content_html = markdown(self.content_md, extensions=['extra'])
super().save(*args, **kwargs)
def __str__(self) -> str:
@ -200,10 +215,24 @@ class BlogPost(models.Model):
content: QuillField = QuillField()
content_md: models.TextField = models.TextField(
verbose_name='Content (Markdown)',
help_text='Markdown content of the blog entry',
blank=True,
)
content_html: models.TextField = models.TextField(
editable=False,
blank=True,
)
def save(self, *args, **kwargs) -> None: # type: ignore
if 0 == len(self.slug):
# noinspection PyTypeChecker
self.slug = slugify(self.title, allow_unicode=False)
self.content_html = markdown(self.content_md, extensions=['extra'])
super().save(*args, **kwargs)
def __str__(self) -> str:

6
www/templates/blog/post.html

@ -32,7 +32,11 @@
</div>
{% endif %}
<div class="al-article-content pb-5 al-wysiwyg">
{{ post.content.html|safe }}
{% if post.content_html %}
{{ post.content_html|safe }}
{% else %}
{{ post.content.html|safe }}
{% endif %}
</div>
</article>
</div>

6
www/templates/page/page.html

@ -19,7 +19,11 @@
<h1 class="al-section-title mb-4">{{ page.title }}</h1>
<article>
<div class="al-page-content pb-5 al-wysiwyg">
{{ page.content.html|safe }}
{% if page.content_html %}
{{ page.content_html|safe }}
{% else %}
{{ page.content.html|safe }}
{% endif %}
</div>
<div class="al-page-date d-flex align-items-center"
title="{{ page.date|date }} {{ page.date|time }}">

Loading…
Cancel
Save