diff --git a/Pipfile b/Pipfile index fa305bd..7216f05 100644 --- a/Pipfile +++ b/Pipfile @@ -24,6 +24,8 @@ gunicorn = "*" dj-database-url = "*" slack-sdk = "*" sentry-sdk = "*" +wagtail = "*" +wagtail-factories = "*" [dev-packages] pytest = "*" diff --git a/Pipfile.lock b/Pipfile.lock index 8c0871f..b0d74c7 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "90e54360b80000f245d490faa9a00c6b9ffdaeb0707d9ed298e8bd99262349e4" + "sha256": "eed4aae258b322b7d356dbc71a8f8a73765b5001266dbe73e50b517f96e19628" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,14 @@ ] }, "default": { + "anyascii": { + "hashes": [ + "sha256:8707d3185017435933360462a65e2c70a4818490745804f38a5ca55e59eb56a0", + "sha256:dedf57728206e286c91eed7c759505a5e45c8cd01367dd40c2f7248bb15c11f6" + ], + "markers": "python_version >= '3.3'", + "version": "==0.3.1" + }, "asgiref": { "hashes": [ "sha256:1d2880b792ae8757289136f1db2b7b99100ce959b2aa57fd69dab783d05afac4", @@ -24,6 +32,14 @@ "markers": "python_version >= '3.7'", "version": "==3.5.2" }, + "beautifulsoup4": { + "hashes": [ + "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30", + "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==4.11.1" + }, "certifi": { "hashes": [ "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14", @@ -58,11 +74,11 @@ }, "django": { "hashes": [ - "sha256:26dc24f99c8956374a054bcbf58aab8dc0cad2e6ac82b0fe036b752c00eee793", - "sha256:b8d843714810ab88d59344507d4447be8b2cf12a49031363b6eed9f1b9b2280f" + "sha256:0b223bfa55511f950ff741983d408d78d772351284c75e9f77d2b830b6b4d148", + "sha256:d38a4e108d2386cb9637da66a82dc8d0733caede4c83c4afdbda78af4214211b" ], "index": "pypi", - "version": "==4.1.2" + "version": "==4.1.4" }, "django-appconf": { "hashes": [ @@ -95,6 +111,14 @@ "index": "pypi", "version": "==0.9.0" }, + "django-filter": { + "hashes": [ + "sha256:ed429e34760127e3520a67f415bec4c905d4649fbe45d0d6da37e6ff5e0287eb", + "sha256:ed473b76e84f7e83b2511bb2050c3efb36d135207d0128dfe3ae4b36e3594ba5" + ], + "markers": "python_version >= '3.7'", + "version": "==22.1" + }, "django-formtools": { "hashes": [ "sha256:deb932be55b1d9419e37dc4d65dfbfeb8d307b71c8c11fd52f159aba5fc0deed", @@ -111,6 +135,22 @@ "index": "pypi", "version": "==0.9" }, + "django-modelcluster": { + "hashes": [ + "sha256:4ae46f86c43702020f24f212222eef0a2588df937bbb523a5447da247b5fb130", + "sha256:cdcffef5baf5d3759ee04c5b60ffaf1a0c95fc0f265e762f3ddfadde3394e5db" + ], + "markers": "python_version >= '3.7'", + "version": "==6.0" + }, + "django-permissionedforms": { + "hashes": [ + "sha256:4340bb20c4477fffb13b4cc5cccf9f1b1010b64f79956c291c72d2ad2ed243f8", + "sha256:d341a961a27cc77fde8cc42141c6ab55cc1f0cb886963cc2d6967b9674fa47d6" + ], + "markers": "python_version >= '3.7'", + "version": "==0.1" + }, "django-polymorphic": { "hashes": [ "sha256:08bc4f4f4a773a19b2deced5a56deddd1ef56ebd15207bf4052e2901c25ef57e", @@ -127,6 +167,22 @@ "index": "pypi", "version": "==1.3.1" }, + "django-taggit": { + "hashes": [ + "sha256:543218ac346fbe02a65733e0341c91b57a3e0f7a41568966b26f1cea9edc4805", + "sha256:c8f2e4eae387939089b3d75d1d8649e008880970c068ce9d0e82f87fd5e29508" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==3.1.0" + }, + "django-treebeard": { + "hashes": [ + "sha256:7c2b1cdb1e9b46d595825186064a1228bc4d00dbbc186db5b0b9412357fba91c", + "sha256:80150017725239702054e5fa64dc66e383dc13ac262c8d47ee5a82cb005969da" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==4.5.1" + }, "djangorestframework": { "hashes": [ "sha256:579a333e6256b09489cbe0a067e66abe55c6595d8926be6b99423786334350c8", @@ -135,6 +191,13 @@ "index": "pypi", "version": "==3.14.0" }, + "draftjs-exporter": { + "hashes": [ + "sha256:5839cbc29d7bce2fb99837a404ca40c3a07313f2a20e2700de7ad6aa9a9a18fb", + "sha256:d415a9964690a2cddb66a31ef32dd46c277e9b80434b94e39e3043188ed83e33" + ], + "version": "==2.1.7" + }, "environ": { "hashes": [ "sha256:052ded34331655b9c7982abd5681a066b9aaf9adf33b3412c7e842ce959e40b0", @@ -144,6 +207,22 @@ "index": "pypi", "version": "==1.0" }, + "et-xmlfile": { + "hashes": [ + "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c", + "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==1.1.0" + }, + "factory-boy": { + "hashes": [ + "sha256:a98d277b0c047c75eb6e4ab8508a7f81fb03d2cb21986f627913546ef7a2a55e", + "sha256:eb02a7dd1b577ef606b75a253b9818e6f9eaf996d94449c9d5ebb124f90dc795" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==3.2.1" + }, "faker": { "hashes": [ "sha256:1dc2811f20e163892fefe7006f2ce00778f8099a40aee265bfa60a13400de63d", @@ -160,13 +239,21 @@ "index": "pypi", "version": "==20.1.0" }, + "html5lib": { + "hashes": [ + "sha256:0d78f8fde1c230e99fe37986a60526d7049ed4bf8a9fadbad5f00e22e58e041d", + "sha256:b2e5b40261e20f354d198eae92afc10d750afb487ed5e50f9c4eaf07c184146f" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.1" + }, "hubspot-api-client": { "hashes": [ - "sha256:18716e41c979a3053d6e49c6ea944cddb5b7fd5db9a51ce8259442baf3924b81", - "sha256:855d3507e72224eae5e15943615b0c8f9aa5ea746ccd2016e8190afb3250e848" + "sha256:7cab89f76076f9da083f18addae65312fc5261dd2da455e1bb7cf076617f986d", + "sha256:7fc46d4c37cba4171ee16b90d749d41b4bdd4f24ca957a535ad5f2112efce31a" ], "index": "pypi", - "version": "==6.0.0" + "version": "==7.0.0" }, "idna": { "hashes": [ @@ -176,20 +263,23 @@ "markers": "python_version >= '3.5'", "version": "==3.4" }, + "l18n": { + "hashes": [ + "sha256:1956e890d673d17135cc20913253c154f6bc1c00266c22b7d503cc1a5a42d848", + "sha256:78495d1df95b6f7dcc694d1ba8994df709c463a1cbac1bf016e1b9a5ce7280b9" + ], + "version": "==2021.3" + }, "libsass": { "hashes": [ - "sha256:06c8776417fe930714bdc930a3d7e795ae3d72be6ac883ff72a1b8f7c49e5ffb", - "sha256:12f39712de38689a8b785b7db41d3ba2ea1d46f9379d81ea4595802d91fa6529", - "sha256:1e25dd9047a9392d3c59a0b869e0404f2b325a03871ee45285ee33b3664f5613", - "sha256:659ae41af8708681fa3ec73f47b9735a6725e71c3b66ff570bfce78952f2314e", - "sha256:6b984510ed94993708c0d697b4fef2d118929bbfffc3b90037be0f5ccadf55e7", - "sha256:a005f298f64624f313a3ac618ab03f844c71d84ae4f4a4aec4b68d2a4ffe75eb", - "sha256:abc29357ee540849faf1383e1746d40d69ed5cb6d4c346df276b258f5aa8977a", - "sha256:c9ec490609752c1d81ff6290da33485aa7cb6d7365ac665b74464c1b7d97f7da", - "sha256:d5ba529d9ce668be9380563279f3ffe988f27bc5b299c5a28453df2e0b0fbaf2", - "sha256:e2b1a7d093f2e76dc694c17c0c285e846d0b0deb0e8b21dc852ba1a3a4e2f1d6" + "sha256:081e256ab3c5f3f09c7b8dea3bf3bf5e64a97c6995fd9eea880639b3f93a9f9a", + "sha256:3ab5ad18e47db560f4f0c09e3d28cf3bb1a44711257488ac2adad69f4f7f8425", + "sha256:65455a2728b696b62100eb5932604aa13a29f4ac9a305d95773c14aaa7200aaf", + "sha256:89c5ce497fcf3aba1dd1b19aae93b99f68257e5f2026b731b00a872f13324c7f", + "sha256:f1efc1b612299c88aec9e39d6ca0c266d360daa5b19d9430bdeaffffa86993f9" ], - "version": "==0.21.0" + "markers": "python_full_version >= '3.6.0'", + "version": "==0.22.0" }, "mixer": { "hashes": [ @@ -199,22 +289,99 @@ "index": "pypi", "version": "==7.2.2" }, + "openpyxl": { + "hashes": [ + "sha256:0ab6d25d01799f97a9464630abacbb34aafecdcaa0ef3cba6d6b3499867d0355", + "sha256:e47805627aebcf860edb4edf7987b1309c1b3632f3750538ed962bbcc3bd7449" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==3.0.10" + }, + "pillow": { + "hashes": [ + "sha256:03150abd92771742d4a8cd6f2fa6246d847dcd2e332a18d0c15cc75bf6703040", + "sha256:073adb2ae23431d3b9bcbcff3fe698b62ed47211d0716b067385538a1b0f28b8", + "sha256:0b07fffc13f474264c336298d1b4ce01d9c5a011415b79d4ee5527bb69ae6f65", + "sha256:0b7257127d646ff8676ec8a15520013a698d1fdc48bc2a79ba4e53df792526f2", + "sha256:12ce4932caf2ddf3e41d17fc9c02d67126935a44b86df6a206cf0d7161548627", + "sha256:15c42fb9dea42465dfd902fb0ecf584b8848ceb28b41ee2b58f866411be33f07", + "sha256:18498994b29e1cf86d505edcb7edbe814d133d2232d256db8c7a8ceb34d18cef", + "sha256:1c7c8ae3864846fc95f4611c78129301e203aaa2af813b703c55d10cc1628535", + "sha256:22b012ea2d065fd163ca096f4e37e47cd8b59cf4b0fd47bfca6abb93df70b34c", + "sha256:276a5ca930c913f714e372b2591a22c4bd3b81a418c0f6635ba832daec1cbcfc", + "sha256:2e0918e03aa0c72ea56edbb00d4d664294815aa11291a11504a377ea018330d3", + "sha256:3033fbe1feb1b59394615a1cafaee85e49d01b51d54de0cbf6aa8e64182518a1", + "sha256:3168434d303babf495d4ba58fc22d6604f6e2afb97adc6a423e917dab828939c", + "sha256:32a44128c4bdca7f31de5be641187367fe2a450ad83b833ef78910397db491aa", + "sha256:3dd6caf940756101205dffc5367babf288a30043d35f80936f9bfb37f8355b32", + "sha256:40e1ce476a7804b0fb74bcfa80b0a2206ea6a882938eaba917f7a0f004b42502", + "sha256:41e0051336807468be450d52b8edd12ac60bebaa97fe10c8b660f116e50b30e4", + "sha256:4390e9ce199fc1951fcfa65795f239a8a4944117b5935a9317fb320e7767b40f", + "sha256:502526a2cbfa431d9fc2a079bdd9061a2397b842bb6bc4239bb176da00993812", + "sha256:51e0e543a33ed92db9f5ef69a0356e0b1a7a6b6a71b80df99f1d181ae5875636", + "sha256:57751894f6618fd4308ed8e0c36c333e2f5469744c34729a27532b3db106ee20", + "sha256:5d77adcd56a42d00cc1be30843d3426aa4e660cab4a61021dc84467123f7a00c", + "sha256:655a83b0058ba47c7c52e4e2df5ecf484c1b0b0349805896dd350cbc416bdd91", + "sha256:68943d632f1f9e3dce98908e873b3a090f6cba1cbb1b892a9e8d97c938871fbe", + "sha256:6c738585d7a9961d8c2821a1eb3dcb978d14e238be3d70f0a706f7fa9316946b", + "sha256:73bd195e43f3fadecfc50c682f5055ec32ee2c933243cafbfdec69ab1aa87cad", + "sha256:772a91fc0e03eaf922c63badeca75e91baa80fe2f5f87bdaed4280662aad25c9", + "sha256:77ec3e7be99629898c9a6d24a09de089fa5356ee408cdffffe62d67bb75fdd72", + "sha256:7db8b751ad307d7cf238f02101e8e36a128a6cb199326e867d1398067381bff4", + "sha256:801ec82e4188e935c7f5e22e006d01611d6b41661bba9fe45b60e7ac1a8f84de", + "sha256:82409ffe29d70fd733ff3c1025a602abb3e67405d41b9403b00b01debc4c9a29", + "sha256:828989c45c245518065a110434246c44a56a8b2b2f6347d1409c787e6e4651ee", + "sha256:829f97c8e258593b9daa80638aee3789b7df9da5cf1336035016d76f03b8860c", + "sha256:871b72c3643e516db4ecf20efe735deb27fe30ca17800e661d769faab45a18d7", + "sha256:89dca0ce00a2b49024df6325925555d406b14aa3efc2f752dbb5940c52c56b11", + "sha256:90fb88843d3902fe7c9586d439d1e8c05258f41da473952aa8b328d8b907498c", + "sha256:97aabc5c50312afa5e0a2b07c17d4ac5e865b250986f8afe2b02d772567a380c", + "sha256:9aaa107275d8527e9d6e7670b64aabaaa36e5b6bd71a1015ddd21da0d4e06448", + "sha256:9f47eabcd2ded7698106b05c2c338672d16a6f2a485e74481f524e2a23c2794b", + "sha256:a0a06a052c5f37b4ed81c613a455a81f9a3a69429b4fd7bb913c3fa98abefc20", + "sha256:ab388aaa3f6ce52ac1cb8e122c4bd46657c15905904b3120a6248b5b8b0bc228", + "sha256:ad58d27a5b0262c0c19b47d54c5802db9b34d38bbf886665b626aff83c74bacd", + "sha256:ae5331c23ce118c53b172fa64a4c037eb83c9165aba3a7ba9ddd3ec9fa64a699", + "sha256:af0372acb5d3598f36ec0914deed2a63f6bcdb7b606da04dc19a88d31bf0c05b", + "sha256:afa4107d1b306cdf8953edde0534562607fe8811b6c4d9a486298ad31de733b2", + "sha256:b03ae6f1a1878233ac620c98f3459f79fd77c7e3c2b20d460284e1fb370557d4", + "sha256:b0915e734b33a474d76c28e07292f196cdf2a590a0d25bcc06e64e545f2d146c", + "sha256:b4012d06c846dc2b80651b120e2cdd787b013deb39c09f407727ba90015c684f", + "sha256:b472b5ea442148d1c3e2209f20f1e0bb0eb556538690fa70b5e1f79fa0ba8dc2", + "sha256:b59430236b8e58840a0dfb4099a0e8717ffb779c952426a69ae435ca1f57210c", + "sha256:b90f7616ea170e92820775ed47e136208e04c967271c9ef615b6fbd08d9af0e3", + "sha256:b9a65733d103311331875c1dca05cb4606997fd33d6acfed695b1232ba1df193", + "sha256:bac18ab8d2d1e6b4ce25e3424f709aceef668347db8637c2296bcf41acb7cf48", + "sha256:bca31dd6014cb8b0b2db1e46081b0ca7d936f856da3b39744aef499db5d84d02", + "sha256:be55f8457cd1eac957af0c3f5ece7bc3f033f89b114ef30f710882717670b2a8", + "sha256:c7025dce65566eb6e89f56c9509d4f628fddcedb131d9465cacd3d8bac337e7e", + "sha256:c935a22a557a560108d780f9a0fc426dd7459940dc54faa49d83249c8d3e760f", + "sha256:dbb8e7f2abee51cef77673be97760abff1674ed32847ce04b4af90f610144c7b", + "sha256:e6ea6b856a74d560d9326c0f5895ef8050126acfdc7ca08ad703eb0081e82b74", + "sha256:ebf2029c1f464c59b8bdbe5143c79fa2045a581ac53679733d3a91d400ff9efb", + "sha256:f1ff2ee69f10f13a9596480335f406dd1f70c3650349e2be67ca3139280cade0" + ], + "markers": "python_version >= '3.7'", + "version": "==9.3.0" + }, "psycopg2": { "hashes": [ - "sha256:07b90a24d5056687781ddaef0ea172fd951f2f7293f6ffdd03d4f5077801f426", - "sha256:1da77c061bdaab450581458932ae5e469cc6e36e0d62f988376e9f513f11cb5c", - "sha256:46361c054df612c3cc813fdb343733d56543fb93565cff0f8ace422e4da06acb", - "sha256:839f9ea8f6098e39966d97fcb8d08548fbc57c523a1e27a1f0609addf40f777c", - "sha256:849bd868ae3369932127f0771c08d1109b254f08d48dc42493c3d1b87cb2d308", - "sha256:8de6a9fc5f42fa52f559e65120dcd7502394692490c98fed1221acf0819d7797", - "sha256:a11946bad3557ca254f17357d5a4ed63bdca45163e7a7d2bfb8e695df069cc3a", - "sha256:aa184d551a767ad25df3b8d22a0a62ef2962e0e374c04f6cbd1204947f540d61", - "sha256:aafa96f2da0071d6dd0cbb7633406d99f414b40ab0f918c9d9af7df928a1accb", - "sha256:c7fa041b4acb913f6968fce10169105af5200f296028251d817ab37847c30184", - "sha256:d529926254e093a1b669f692a3aa50069bc71faf5b0ecd91686a78f62767d52f" + "sha256:093e3894d2d3c592ab0945d9eba9d139c139664dcf83a1c440b8a7aa9bb21955", + "sha256:190d51e8c1b25a47484e52a79638a8182451d6f6dff99f26ad9bd81e5359a0fa", + "sha256:1a5c7d7d577e0eabfcf15eb87d1e19314c8c4f0e722a301f98e0e3a65e238b4e", + "sha256:1e5a38aa85bd660c53947bd28aeaafb6a97d70423606f1ccb044a03a1203fe4a", + "sha256:322fd5fca0b1113677089d4ebd5222c964b1760e361f151cbb2706c4912112c5", + "sha256:4cb9936316d88bfab614666eb9e32995e794ed0f8f6b3b718666c22819c1d7ee", + "sha256:920bf418000dd17669d2904472efeab2b20546efd0548139618f8fa305d1d7ad", + "sha256:922cc5f0b98a5f2b1ff481f5551b95cd04580fd6f0c72d9b22e6c0145a4840e0", + "sha256:a5246d2e683a972e2187a8714b5c2cf8156c064629f9a9b1a873c1730d9e245a", + "sha256:b9ac1b0d8ecc49e05e4e182694f418d27f3aedcfca854ebd6c05bb1cffa10d6d", + "sha256:d3ef67e630b0de0779c42912fe2cbae3805ebaba30cda27fea2a3de650a9414f", + "sha256:f5b6320dbc3cf6cfb9f25308286f9f7ab464e65cfb105b64cc9c52831748ced2", + "sha256:fc04dd5189b90d825509caa510f20d1d504761e78b8dfb95a0ede180f71d50e5" ], "index": "pypi", - "version": "==2.9.4" + "version": "==2.9.5" }, "python-dateutil": { "hashes": [ @@ -234,10 +401,10 @@ }, "pytz": { "hashes": [ - "sha256:2c0784747071402c6e99f0bafdb7da0fa22645f06554c7ae06bf6358897e9c91", - "sha256:48ce799d83b6f8aab2020e369b627446696619e79645419610b9facd909b3174" + "sha256:222439474e9c98fced559f1709d89e6c9cbf8d79c794ff3eb9f8800064291427", + "sha256:e89512406b793ca39f5971bc999cc538ce125c0e51c27941bef4568b460095e2" ], - "version": "==2022.4" + "version": "==2022.6" }, "rcssmin": { "hashes": [ @@ -269,7 +436,7 @@ "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983", "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349" ], - "markers": "python_version >= '3.0'", + "markers": "python_version >= '3.7' and python_version < '4'", "version": "==2.28.1" }, "rjsmin": { @@ -307,19 +474,19 @@ }, "sentry-sdk": { "hashes": [ - "sha256:2469240f6190aaebcb453033519eae69cfe8cc602065b4667e18ee14fc1e35dc", - "sha256:4fbace9a763285b608c06f01a807b51acb35f6059da6a01236654e08b0ee81ff" + "sha256:675f6279b6bb1fea09fd61751061f9a90dca3b5929ef631dd50dc8b3aeb245e9", + "sha256:8b4ff696c0bdcceb3f70bbb87a57ba84fd3168b1332d493fcd16c137f709578c" ], "index": "pypi", - "version": "==1.9.10" + "version": "==1.11.1" }, "setuptools": { "hashes": [ - "sha256:1b6bdc6161661409c5f21508763dc63ab20a9ac2f8ba20029aaaa7fdb9118012", - "sha256:3050e338e5871e70c72983072fe34f6032ae1cdeeeb67338199c2f74e083a80e" + "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54", + "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75" ], "markers": "python_version >= '3.7'", - "version": "==65.4.1" + "version": "==65.6.3" }, "six": { "hashes": [ @@ -331,11 +498,19 @@ }, "slack-sdk": { "hashes": [ - "sha256:5db78a3ed3c58b3b0a2bdbe40bac43c7b00edcbc12ff6a7778ac5cbe3a3a2899", - "sha256:a0bafb9e53ffbc408a8b5a42443525aac2c0c7347223d9373dd9d41cf90c9343" + "sha256:0b52bb32a87c71f638b9eb47e228dffeebf89de5e762684ef848276f9f186c84", + "sha256:47fb4af596243fe6585a92f3034de21eb2104a55cc9fd59a92ef3af17cf9ddd8" ], "index": "pypi", - "version": "==3.19.1" + "version": "==3.19.5" + }, + "soupsieve": { + "hashes": [ + "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759", + "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d" + ], + "markers": "python_full_version >= '3.6.0'", + "version": "==2.3.2.post1" }, "sqlparse": { "hashes": [ @@ -347,25 +522,56 @@ }, "starkbank-ecdsa": { "hashes": [ - "sha256:24422395e8682ac22a5b20ba3d7418d62e1a927aef29e8ddb5e678662be6b643" + "sha256:9399c3371b899d4a235b68a1ed7919d202fbf024bd2c863ae8ebdad343c2a63a" ], - "version": "==2.1.0" + "version": "==2.2.0" }, "stripe": { "hashes": [ - "sha256:8ce03bfc099465740e33890000c454e79316c8730e45ad1efbaec3d52a019d05", - "sha256:f0134704bd4e9410fae25034836dc6f5849d92c0f9083d58d43e01b3e631ac4c" + "sha256:50f69a5fc9cd6f7629861b80ea70a3c6da0c76401ddc159474f2d45fab9215d6", + "sha256:bdc8c5ee8e6b53c4767bbe720752cedb8af91db46ad96e511edd0fb74964ac5d" ], "index": "pypi", - "version": "==4.2.0" + "version": "==5.0.0" + }, + "telepath": { + "hashes": [ + "sha256:54f4b57232461bc67c54f63f437cb6d26843c189bae6b7ba8e4457f98d78e515", + "sha256:fbdbc6bdd9a4a5c2b230caae242fa6ba4994c9dbcfd780df9be63f2966feb034" + ], + "markers": "python_version >= '3.5'", + "version": "==0.3" }, "urllib3": { "hashes": [ - "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e", - "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997" + "sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc", + "sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8" ], "markers": "python_full_version >= '3.6.0'", - "version": "==1.26.12" + "version": "==1.26.13" + }, + "wagtail": { + "hashes": [ + "sha256:9df6bfe5637ebe5b9e96cd0174cb812d3bb9200913100b6f8007ef31bdc02f70", + "sha256:fe164fa5bb5f62fa8fa35cb456d523b3f263b6bcc0a5e0b688e2c6c1760bc095" + ], + "index": "pypi", + "version": "==4.1.1" + }, + "wagtail-factories": { + "hashes": [ + "sha256:3e39ec1cc13b61c6e467f1bf223ce2d134e823fa9fe4dc7e32d0222cc8d350ec", + "sha256:f59f9af283da79b3ddab7b2ca95d6a14b5bbbb929a697563e4f7143948693f53" + ], + "index": "pypi", + "version": "==4.0.0" + }, + "webencodings": { + "hashes": [ + "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", + "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923" + ], + "version": "==0.5.1" }, "whitenoise": { "hashes": [ @@ -374,6 +580,14 @@ ], "index": "pypi", "version": "==6.2.0" + }, + "willow": { + "hashes": [ + "sha256:0df8ff528531e00b48d40bf72ed81beac1dc82f2d42e5bbed4aff0218bef8c0d", + "sha256:fc4042696d090e75aef922fa1ed26d483c764f005b36cf523cf7c34e69d5dd7a" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", + "version": "==1.4.1" } }, "develop": { @@ -444,12 +658,20 @@ "markers": "python_version >= '3.7'", "version": "==6.5.0" }, + "exceptiongroup": { + "hashes": [ + "sha256:542adf9dea4055530d6e1279602fa5cb11dab2395fa650b8674eaec35fc4a828", + "sha256:bd14967b79cd9bdb54d97323216f8fdf533e278df937aa2a90089e7d6e06e5ec" + ], + "markers": "python_version < '3.11'", + "version": "==1.0.4" + }, "factory-boy": { "hashes": [ "sha256:a98d277b0c047c75eb6e4ab8508a7f81fb03d2cb21986f627913546ef7a2a55e", "sha256:eb02a7dd1b577ef606b75a253b9818e6f9eaf996d94449c9d5ebb124f90dc795" ], - "markers": "python_version >= '3.6'", + "markers": "python_full_version >= '3.6.0'", "version": "==3.2.1" }, "faker": { @@ -462,11 +684,11 @@ }, "flake8": { "hashes": [ - "sha256:6fbe320aad8d6b95cec8b8e47bc933004678dc63095be98528b7bdd2a9f510db", - "sha256:7a1cf6b73744f5806ab95e526f6f0d8c01c66d7bbe349562d22dfca20610b248" + "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", + "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" ], "index": "pypi", - "version": "==5.0.4" + "version": "==6.0.0" }, "freezegun": { "hashes": [ @@ -517,92 +739,96 @@ }, "psycopg2-binary": { "hashes": [ - "sha256:02cde837df012fa5d579b9cf4bc8e1feb460f38d61f7a4ab4a919d55a9f6eeef", - "sha256:044b6ab68613de7ea1e63856627deea091bfea09dea5ab4f050b13250fd18cab", - "sha256:0a9465f0aa36480c8e7614991cbe8ca8aa16b0517c5398a49648ce345e446c19", - "sha256:0d8e0c9eec79fe1ae66691e06e3cc714da6fbd77981209bf32fa823c03dbaff8", - "sha256:0eae72190be519bf2629062eab7ac8d4ceec5bd132953cefa1596584d86964fe", - "sha256:15e0ac0ed8a85f6049e836e95ddee627766561c85be8d23f4b3edb6ddbaa7310", - "sha256:161dc52a617f0bb610a87d391cb2e77fe65b89ebfbd752f4f3217dde701ea196", - "sha256:181ac372a5a5308b4076933601a9b5f0cd139b389b0aa5e164786a2abbcdb978", - "sha256:1c22c59ab7d9dc110d409445f111f58556bf699b0548f3fc5176684a29c629c4", - "sha256:226f11be577b70a57f4910c0ee28591d4d9fcb3d455e966267179156ae2e0c41", - "sha256:24d627ed69e754c48dd142a914124858c600b4108c92546eb0ba822e63c0c6e2", - "sha256:2535f44b00f26f6af0e949c825e6aecb9adcb56c965c17af5b97137fb69f00c0", - "sha256:25e0517ad7ee3c5c3c69dbe3c1d95504c811e42f452b39a3505d0763b1f6caa0", - "sha256:2903bf90b1e6bfc9bbfc94a1db0b50ffa9830a0ca4c042fbc38d93890c02ce08", - "sha256:2f1ded23d17af0d738e7e78087f0b88a53228887845b1989b03af4dfd3fef703", - "sha256:30200b07779446760813eef06098ec6d084131e4365b4e023eb43100de758b11", - "sha256:33ac8b4754e6b6b21f3ee180da169d8526d91aee9408ec1fc573c16ab32b0207", - "sha256:34fd249275faa782c3a2016e86ac2330636ac58d731a1580e7d686e3976b9536", - "sha256:44f5dc9b4384bafca8429759ce76c8960ffc2b583fcad9e5dfb3e5f4894269e4", - "sha256:451550e0bb5889bbabbf92575a6d6eafced941cc28c86be6ae4667f81bf32d67", - "sha256:52383e932e6de5595963f9178cf2af7b9e1f3daacf5135b9c0e21aabbc5bf7c4", - "sha256:55137faec669c4277c5687c6ce7c1fbc4dece0e2f14256ee808f4a652f0a2170", - "sha256:576b9dfbcd154a0e8b5d9dae6316d037450e64a3b31df87dec71d88e2a2d5e5f", - "sha256:59a3010d566a48b919490a982f6807f68842686941dc12d568e129d9cd7703d6", - "sha256:61c6a258469c66412ae8358a0501df6ccb3bb48aa9c43b56624571ff9767f91d", - "sha256:63edc507f8cbfbb5903adb75bad8a99f9798981c854df9119dbebab2ec3ee0e1", - "sha256:65d5f4e70a2d3fbaa1349236968792611088f3f2dccead36c1626e1d183cc327", - "sha256:6a1618260a112a9c93504511f0b6254b4402a8c41b7130dc6d4c9e39aff3aa0c", - "sha256:704f1fcdc5b606b70563ea696c69bda90caee3a2f45ffc9cee60a901b394a79f", - "sha256:7751b11cd7f6b952b4b5ec5b93b5be9ce20faba786c18c25c354f5d8717a173c", - "sha256:7ad9d032dc1a31a86ca7b059f43554a049a2bfda8fe32d1492ad25f6686aff03", - "sha256:7b01d07006a0ac2216921b69a220b9f0974345d0b1b36efaeabdc7550b1cc4f8", - "sha256:7b47643c45e7619788c081d42e1d9d98c7c8a4933010a9967d097cc3c4c29f41", - "sha256:80ed219ce6cb21a5b53ead0edf5b56b6d23de4cb95389ac606f47670474f4816", - "sha256:82df4a8600999c4c0cb7d6614df1bbdb3c74732f63e79f78487893ffbed3d083", - "sha256:8660112e9127a019969a23c878e1b4a419e8a6427f9a9050c19830f152628c8a", - "sha256:89a86c2b35460700d04b4d6461153ab39ee85af5a5385acac9563a8310e6320a", - "sha256:8d7bc25729bb6d96b44f49ad78fde0e27a1a867cb205322b7e5f5b49e04d6f1f", - "sha256:97e4f3d9b17d12e7c00cb1c29c0040044135cd5146838da4274615dbe0baae78", - "sha256:a431deb6ffdfa551f7400b3a94fa4b964837e67f49e3c37aa26d90dc75970816", - "sha256:a6a2d3d75d8698dee492f4af7ad07606d0734e581edf9e2ce2f74b6fce90f42e", - "sha256:ae5b41dbf7731b838021923edfbe3b5ccdec84d92d5795f5229c0d08d32509d9", - "sha256:aff258af03dda9a990960a53759d10c3a9b936837c71fe2f3b581acd356b9121", - "sha256:b216a15e13f6e763db40ac3beb74b588650bc030d10a78fde182b88d273b82b5", - "sha256:b23b25b1243576b952689966205ef7d4285688068b966a1ca0e620bcb390d483", - "sha256:b896637091cde69d170a89253dde9aee814b25ca204b7e213fd0a6462e666638", - "sha256:d5f27b1d1b56470385faa2b2636fcb823e7ac5b5b734e0aa76b14637c66eb3b7", - "sha256:d6ba33f39436191ece7ea2b3d0b4dff00af71acd5c6e6f1d6b7563aa7286e9f2", - "sha256:d6c5e1df6f427d7a82606cf8f07cf3ba9fb3f366804b01e65f1f00f8df6b54f1", - "sha256:e02f77b620ad6b36564fe41980865436912e21a3b1138cdde175cf24afde1bc5", - "sha256:e72491d72870c3cb2f0d6f4174485533caec0e9ed7e717e2859b7cc7ff2ae1c4", - "sha256:ea8d5cd689fa7225d81ae0a049ba03e0165f4ed9ca083b19a405be9ad0b36845", - "sha256:eb5341fc7c53fdd95ac2415be77b1de854ab266488cff71174ebb007baf0e675", - "sha256:edf0a66ce9517365c7dcfed597894d8dd1f27b59e550b77a089054101435213b", - "sha256:f225784812b2b57d340f2eb0d2cebef989dcc82c288f5553e28ee9767c7c8344", - "sha256:f5fbb3b325c65010e04af206a9243e2df8606736c510c7f268aca6a93e5294a9", - "sha256:f78cafa25731e0b5aa16fe20bea1abf643d4e853f6bfb8a64421b06b878e2b88", - "sha256:fb639a0e65dce4a9cccbcbdd8ddd0c8c6ab10bca317b827a5c52ac3c3a4ad60a", - "sha256:ffb2f288f577a748cc23c65a818290755a4c2da1f87a40d7055b61a096d31e20" + "sha256:00475004e5ed3e3bf5e056d66e5dcdf41a0dc62efcd57997acd9135c40a08a50", + "sha256:01ad49d68dd8c5362e4bfb4158f2896dc6e0c02e87b8a3770fc003459f1a4425", + "sha256:024030b13bdcbd53d8a93891a2cf07719715724fc9fee40243f3bd78b4264b8f", + "sha256:02551647542f2bf89073d129c73c05a25c372fc0a49aa50e0de65c3c143d8bd0", + "sha256:043a9fd45a03858ff72364b4b75090679bd875ee44df9c0613dc862ca6b98460", + "sha256:05b3d479425e047c848b9782cd7aac9c6727ce23181eb9647baf64ffdfc3da41", + "sha256:0775d6252ccb22b15da3b5d7adbbf8cfe284916b14b6dc0ff503a23edb01ee85", + "sha256:1764546ffeaed4f9428707be61d68972eb5ede81239b46a45843e0071104d0dd", + "sha256:1e491e6489a6cb1d079df8eaa15957c277fdedb102b6a68cfbf40c4994412fd0", + "sha256:212757ffcecb3e1a5338d4e6761bf9c04f750e7d027117e74aa3cd8a75bb6fbd", + "sha256:215d6bf7e66732a514f47614f828d8c0aaac9a648c46a831955cb103473c7147", + "sha256:25382c7d174c679ce6927c16b6fbb68b10e56ee44b1acb40671e02d29f2fce7c", + "sha256:2abccab84d057723d2ca8f99ff7b619285d40da6814d50366f61f0fc385c3903", + "sha256:2d964eb24c8b021623df1c93c626671420c6efadbdb8655cb2bd5e0c6fa422ba", + "sha256:2ec46ed947801652c9643e0b1dc334cfb2781232e375ba97312c2fc256597632", + "sha256:2ef892cabdccefe577088a79580301f09f2a713eb239f4f9f62b2b29cafb0577", + "sha256:33e632d0885b95a8b97165899006c40e9ecdc634a529dca7b991eb7de4ece41c", + "sha256:3520d7af1ebc838cc6084a3281145d5cd5bdd43fdef139e6db5af01b92596cb7", + "sha256:3d790f84201c3698d1bfb404c917f36e40531577a6dda02e45ba29b64d539867", + "sha256:3fc33295cfccad697a97a76dec3f1e94ad848b7b163c3228c1636977966b51e2", + "sha256:422e3d43b47ac20141bc84b3d342eead8d8099a62881a501e97d15f6addabfe9", + "sha256:426c2ae999135d64e6a18849a7d1ad0e1bd007277e4a8f4752eaa40a96b550ff", + "sha256:46512486be6fbceef51d7660dec017394ba3e170299d1dc30928cbedebbf103a", + "sha256:46850a640df62ae940e34a163f72e26aca1f88e2da79148e1862faaac985c302", + "sha256:484405b883630f3e74ed32041a87456c5e0e63a8e3429aa93e8714c366d62bd1", + "sha256:4e7904d1920c0c89105c0517dc7e3f5c20fb4e56ba9cdef13048db76947f1d79", + "sha256:56b2957a145f816726b109ee3d4e6822c23f919a7d91af5a94593723ed667835", + "sha256:5c6527c8efa5226a9e787507652dd5ba97b62d29b53c371a85cd13f957fe4d42", + "sha256:5cbc554ba47ecca8cd3396ddaca85e1ecfe3e48dd57dc5e415e59551affe568e", + "sha256:5d28ecdf191db558d0c07d0f16524ee9d67896edf2b7990eea800abeb23ebd61", + "sha256:5fc447058d083b8c6ac076fc26b446d44f0145308465d745fba93a28c14c9e32", + "sha256:63e318dbe52709ed10d516a356f22a635e07a2e34c68145484ed96a19b0c4c68", + "sha256:68d81a2fe184030aa0c5c11e518292e15d342a667184d91e30644c9d533e53e1", + "sha256:6e63814ec71db9bdb42905c925639f319c80e7909fb76c3b84edc79dadef8d60", + "sha256:6f8a9bcab7b6db2e3dbf65b214dfc795b4c6b3bb3af922901b6a67f7cb47d5f8", + "sha256:70831e03bd53702c941da1a1ad36c17d825a24fbb26857b40913d58df82ec18b", + "sha256:74eddec4537ab1f701a1647214734bc52cee2794df748f6ae5908e00771f180a", + "sha256:7b3751857da3e224f5629400736a7b11e940b5da5f95fa631d86219a1beaafec", + "sha256:7cf1d44e710ca3a9ce952bda2855830fe9f9017ed6259e01fcd71ea6287565f5", + "sha256:7d07f552d1e412f4b4e64ce386d4c777a41da3b33f7098b6219012ba534fb2c2", + "sha256:7d88db096fa19d94f433420eaaf9f3c45382da2dd014b93e4bf3215639047c16", + "sha256:7ee3095d02d6f38bd7d9a5358fcc9ea78fcdb7176921528dd709cc63f40184f5", + "sha256:902844f9c4fb19b17dfa84d9e2ca053d4a4ba265723d62ea5c9c26b38e0aa1e6", + "sha256:937880290775033a743f4836aa253087b85e62784b63fd099ee725d567a48aa1", + "sha256:95076399ec3b27a8f7fa1cc9a83417b1c920d55cf7a97f718a94efbb96c7f503", + "sha256:9c38d3869238e9d3409239bc05bc27d6b7c99c2a460ea337d2814b35fb4fea1b", + "sha256:9e32cedc389bcb76d9f24ea8a012b3cb8385ee362ea437e1d012ffaed106c17d", + "sha256:9ffdc51001136b699f9563b1c74cc1f8c07f66ef7219beb6417a4c8aaa896c28", + "sha256:a0adef094c49f242122bb145c3c8af442070dc0e4312db17e49058c1702606d4", + "sha256:a36a0e791805aa136e9cbd0ffa040d09adec8610453ee8a753f23481a0057af5", + "sha256:a7e518a0911c50f60313cb9e74a169a65b5d293770db4770ebf004245f24b5c5", + "sha256:af0516e1711995cb08dc19bbd05bec7dbdebf4185f68870595156718d237df3e", + "sha256:b8104f709590fff72af801e916817560dbe1698028cd0afe5a52d75ceb1fce5f", + "sha256:b911dfb727e247340d36ae20c4b9259e4a64013ab9888ccb3cbba69b77fd9636", + "sha256:b9a794cef1d9c1772b94a72eec6da144c18e18041d294a9ab47669bc77a80c1d", + "sha256:b9c33d4aef08dfecbd1736ceab8b7b3c4358bf10a0121483e5cd60d3d308cc64", + "sha256:b9d38a4656e4e715d637abdf7296e98d6267df0cc0a8e9a016f8ba07e4aa3eeb", + "sha256:bcda1c84a1c533c528356da5490d464a139b6e84eb77cc0b432e38c5c6dd7882", + "sha256:bef7e3f9dc6f0c13afdd671008534be5744e0e682fb851584c8c3a025ec09720", + "sha256:c15ba5982c177bc4b23a7940c7e4394197e2d6a424a2d282e7c236b66da6d896", + "sha256:c5254cbd4f4855e11cebf678c1a848a3042d455a22a4ce61349c36aafd4c2267", + "sha256:c5682a45df7d9642eff590abc73157c887a68f016df0a8ad722dcc0f888f56d7", + "sha256:c5e65c6ac0ae4bf5bef1667029f81010b6017795dcb817ba5c7b8a8d61fab76f", + "sha256:d4c7b3a31502184e856df1f7bbb2c3735a05a8ce0ade34c5277e1577738a5c91", + "sha256:d892bfa1d023c3781a3cab8dd5af76b626c483484d782e8bd047c180db590e4c", + "sha256:dbc332beaf8492b5731229a881807cd7b91b50dbbbaf7fe2faf46942eda64a24", + "sha256:dc85b3777068ed30aff8242be2813038a929f2084f69e43ef869daddae50f6ee", + "sha256:e59137cdb970249ae60be2a49774c6dfb015bd0403f05af1fe61862e9626642d", + "sha256:e67b3c26e9b6d37b370c83aa790bbc121775c57bfb096c2e77eacca25fd0233b", + "sha256:e72c91bda9880f097c8aa3601a2c0de6c708763ba8128006151f496ca9065935", + "sha256:f95b8aca2703d6a30249f83f4fe6a9abf2e627aa892a5caaab2267d56be7ab69" ], "index": "pypi", - "version": "==2.9.4" - }, - "py": { - "hashes": [ - "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", - "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.11.0" + "version": "==2.9.5" }, "pycodestyle": { "hashes": [ - "sha256:2c9607871d58c76354b697b42f5d57e1ada7d261c261efac224b664affdc5785", - "sha256:d1735fc58b418fd7c5f658d28d943854f8a849b01a5d0a1e6f3f3fdd0166804b" + "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", + "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" ], "markers": "python_version >= '3.6'", - "version": "==2.9.1" + "version": "==2.10.0" }, "pyflakes": { "hashes": [ - "sha256:4579f67d887f804e67edb544428f264b7b24f435b263c4614f384135cea553d2", - "sha256:491feb020dca48ccc562a8c0cbe8df07ee13078df59813b83959cbdada312ea3" + "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", + "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" ], "markers": "python_version >= '3.6'", - "version": "==2.5.0" + "version": "==3.0.1" }, "pyparsing": { "hashes": [ @@ -614,11 +840,11 @@ }, "pytest": { "hashes": [ - "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7", - "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39" + "sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71", + "sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59" ], "index": "pypi", - "version": "==7.1.3" + "version": "==7.2.0" }, "pytest-cov": { "hashes": [ @@ -638,11 +864,11 @@ }, "pytest-factoryboy": { "hashes": [ - "sha256:37c6b3a17689b197025260ad06047d0dd8ec54a70556995b22617e9df1fd8797", - "sha256:8abcfe5396a2cadf0b2d6fc1ba607d05f191db915eac95733ab741cb30968a46" + "sha256:41e3465935322188daefc8720f83cebb16bf3d3a430356dc91151c55f31d99c7", + "sha256:7275a52299b20c0f58b63fdf7326b3fd2b7cbefbdaa90fdcfc776bbe92197484" ], "index": "pypi", - "version": "==2.5.0" + "version": "==2.5.1" }, "pytest-mock": { "hashes": [ @@ -673,7 +899,7 @@ "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" ], - "markers": "python_version >= '3.7'", + "markers": "python_version < '3.11'", "version": "==2.0.1" }, "typing-extensions": { diff --git a/conftest.py b/conftest.py index 4945b11..2c00ceb 100644 --- a/conftest.py +++ b/conftest.py @@ -4,24 +4,31 @@ from django.test import Client import pytest from pytest_factoryboy import register +from wagtail.models import Locale, Site from authentication.tests.factories.student_user_factory import StudentUserFactory from authentication.tests.factories.user_factory import UserFactory from payment.tests.factories.referral_coupon_factory import ReferralCouponFactory from payment.tests.factories.coupon_effect_factory import CouponEffectFactory from staff.tests.factories.batch_factory import BatchFactory +from staff.tests.factories.batch_page_factory import BatchPageFactory from staff.tests.factories.batch_schedule_factory import BatchScheduleFactory from staff.tests.factories.course_factory import CourseFactory +from staff.tests.factories.course_page_factory import CoursePageFactory +from staff.tests.factories.day_page_factory import DayPageFactory from staff.tests.factories.section_factory import SectionFactory from student.tests.factories.certificate_factory import CertificateFactory from student.tests.factories.enrolment_factory import EnrolmentFactory from student.tests.factories.registration_factory import RegistrationFactory register(BatchFactory) +register(BatchPageFactory) register(BatchScheduleFactory) register(CertificateFactory) register(CouponEffectFactory) register(CourseFactory) +register(CoursePageFactory) +register(DayPageFactory) register(EnrolmentFactory) register(ReferralCouponFactory) register(RegistrationFactory) @@ -147,3 +154,14 @@ def swe_fundamentals_registration_early_bird(swe_fundamentals_batch, registratio ) yield swe_fundamentals_registration_early_bird + +########### +# WAGTAIL # +########### + +@pytest.fixture() +def wagtail_site(): + Locale.objects.create(language_code='en') + wagtail_site = Site(is_default_site=True) + + yield wagtail_site diff --git a/learn/settings.py b/learn/settings.py index 79ff69e..d9e06c9 100644 --- a/learn/settings.py +++ b/learn/settings.py @@ -83,6 +83,19 @@ 'student', 'payment', 'emails', + 'wagtail.contrib.forms', + 'wagtail.contrib.redirects', + 'wagtail.embeds', + 'wagtail.sites', + 'wagtail.users', + 'wagtail.snippets', + 'wagtail.documents', + 'wagtail.images', + 'wagtail.search', + 'wagtail.admin', + 'wagtail', + 'modelcluster', + 'taggit' ] # AUTHENTICATION @@ -120,6 +133,7 @@ MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'whitenoise.middleware.WhiteNoiseMiddleware', + 'wagtail.contrib.redirects.middleware.RedirectMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', @@ -282,3 +296,8 @@ COUPON_CODE_NOTIFICATION_TEMPLATE_ID = env('COUPON_CODE_NOTIFICATION_TEMPLATE_ID') SWE_FUNDAMENTALS_GRADUATION_NOTIFICATION_TEMPLATE_ID = env('SWE_FUNDAMENTALS_GRADUATION_NOTIFICATION_TEMPLATE_ID') SWE_FUNDAMENTALS_REGISTRATION_CONFIRMATION_TEMPLATE_ID = env('SWE_FUNDAMENTALS_REGISTRATION_CONFIRMATION_TEMPLATE_ID') + +# WAGTAIL # +WAGTAIL_SITE_NAME = ROCKET_ACADEMY +WAGTAILADMIN_RECENT_EDITS_LIMIT = 5 +WAGTAILEMBEDS_RESPONSIVE_HTML = True diff --git a/staff/migrations/0016_coursepage_batchpage.py b/staff/migrations/0016_coursepage_batchpage.py new file mode 100644 index 0000000..6edea70 --- /dev/null +++ b/staff/migrations/0016_coursepage_batchpage.py @@ -0,0 +1,40 @@ +# Generated by Django 4.1.3 on 2022-12-06 13:42 + +from django.db import migrations, models +import django.db.models.deletion +import wagtail.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0078_referenceindex'), + ('staff', '0015_alter_course_name'), + ] + + operations = [ + migrations.CreateModel( + name='CoursePage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('intro', wagtail.fields.RichTextField(blank=True)), + ('course', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='staff.course')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + migrations.CreateModel( + name='BatchPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('intro', wagtail.fields.RichTextField(blank=True)), + ('batch', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='staff.batch')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + ] diff --git a/staff/migrations/0017_daypage.py b/staff/migrations/0017_daypage.py new file mode 100644 index 0000000..3eed906 --- /dev/null +++ b/staff/migrations/0017_daypage.py @@ -0,0 +1,28 @@ +# Generated by Django 4.1.4 on 2023-01-03 08:17 + +from django.db import migrations, models +import django.db.models.deletion +import wagtail.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('wagtailcore', '0078_referenceindex'), + ('staff', '0016_coursepage_batchpage'), + ] + + operations = [ + migrations.CreateModel( + name='DayPage', + fields=[ + ('page_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='wagtailcore.page')), + ('body', wagtail.fields.RichTextField(blank=True)), + ('batch_page', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='staff.batchpage')), + ], + options={ + 'abstract': False, + }, + bases=('wagtailcore.page',), + ), + ] diff --git a/staff/models/__init__.py b/staff/models/__init__.py index 44b4d72..e129b0e 100644 --- a/staff/models/__init__.py +++ b/staff/models/__init__.py @@ -1,5 +1,8 @@ from .batch import Batch +from .batch_page import BatchPage from .batch_schedule import BatchSchedule from .certificate import Certificate from .course import Course +from .course_page import CoursePage +from .day_page import DayPage from .section import Section diff --git a/staff/models/batch.py b/staff/models/batch.py index 3c9b07a..e1bc2fd 100644 --- a/staff/models/batch.py +++ b/staff/models/batch.py @@ -62,7 +62,7 @@ def save(self, *args, **kwargs): return super().save(*args, **kwargs) def __str__(self): - return f"Batch {self.number}" + return f"{self.course.get_name_display()} Batch {self.number}" @classmethod def next_number(self, course_id, type): diff --git a/staff/models/batch_page.py b/staff/models/batch_page.py new file mode 100644 index 0000000..323b32e --- /dev/null +++ b/staff/models/batch_page.py @@ -0,0 +1,30 @@ +from django import forms +from django.db import models +from wagtail.admin.panels import FieldPanel +from wagtail.fields import RichTextField +from wagtail.models import Page +from wagtail.search import index + +from staff.models import Batch + + +class BatchPage(Page): + intro = RichTextField(blank=True) + batch = models.ForeignKey(Batch, on_delete=models.PROTECT) + + search_fields = Page.search_fields + [ + index.FilterField('intro'), + index.SearchField('intro'), + ] + + content_panels = Page.content_panels + [ + FieldPanel('batch', widget=forms.Select), + FieldPanel('intro') + ] + + def save(self, *args, **kwargs): + # slug does not appear above as an attribute + # because it is an attribute on Wagtail's Page model + self.slug = self.batch.number + + return super().save(*args, **kwargs) diff --git a/staff/models/course.py b/staff/models/course.py index a96d80a..3ae517c 100644 --- a/staff/models/course.py +++ b/staff/models/course.py @@ -18,3 +18,6 @@ class Course(SafeDeleteModel): name = models.CharField(max_length=255, choices=NAME_CHOICES) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) + + def __str__(self): + return self.get_name_display() diff --git a/staff/models/course_page.py b/staff/models/course_page.py new file mode 100644 index 0000000..234430a --- /dev/null +++ b/staff/models/course_page.py @@ -0,0 +1,23 @@ +from django import forms +from django.db import models +from wagtail.admin.panels import FieldPanel +from wagtail.fields import RichTextField +from wagtail.models import Page +from wagtail.search import index + +from staff.models import Course + + +class CoursePage(Page): + intro = RichTextField(blank=True) + course = models.ForeignKey(Course, on_delete=models.PROTECT) + + search_fields = Page.search_fields + [ + index.FilterField('intro'), + index.SearchField('intro'), + ] + + content_panels = Page.content_panels + [ + FieldPanel('course', widget=forms.Select), + FieldPanel('intro') + ] diff --git a/staff/models/day_page.py b/staff/models/day_page.py new file mode 100644 index 0000000..9412daa --- /dev/null +++ b/staff/models/day_page.py @@ -0,0 +1,23 @@ +from django import forms +from django.db import models +from wagtail.admin.panels import FieldPanel +from wagtail.fields import RichTextField +from wagtail.models import Page +from wagtail.search import index + +from staff.models import BatchPage + + +class DayPage(Page): + batch_page = models.ForeignKey(BatchPage, on_delete=models.PROTECT) + body = RichTextField(blank=True) + + search_fields = Page.search_fields + [ + index.FilterField('body'), + index.SearchField('body'), + ] + + content_panels = Page.content_panels + [ + FieldPanel('batch_page', widget=forms.Select), + FieldPanel('body') + ] diff --git a/staff/templates/staff/batch_page.html b/staff/templates/staff/batch_page.html new file mode 100644 index 0000000..85e73a6 --- /dev/null +++ b/staff/templates/staff/batch_page.html @@ -0,0 +1,20 @@ +{% extends "staff_base.html" %} + +{% load wagtailcore_tags %} + +{% block body_class %}template-blogindexpage{% endblock %} + +{% block content %} +