From 2d5eb05b173d3e28e1d9352108f62bb08dfde653 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozman?= <tomas.hozman@pm.me> Date: Mon, 1 Aug 2022 14:58:59 +0200 Subject: [PATCH] updated requirements, working on dockerfile --- Dockerfile | 4 +- Pipfile | 8 +- Pipfile.lock | 351 +++++++---------- config.example.json | 12 +- docker-compose.yml | 20 +- env.example | 10 + generator/__init__.py | 8 +- generator/authentication/__init__.py | 52 +-- generator/static/js/concept.js | 6 +- generator/templates/avatar.html | 298 +++++++------- generator/templates/generator.html | 558 +++++++++++++-------------- generator/views/concept.py | 1 - generator/views/generator.py | 9 - generator/views/oidc.py | 21 +- 14 files changed, 639 insertions(+), 719 deletions(-) create mode 100644 env.example diff --git a/Dockerfile b/Dockerfile index 483ee8bb..29a4c1f4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -39,5 +39,5 @@ USER appuser # Install application into container COPY . . -# Expose 1337 + 1 port -EXPOSE 1338 +# Expose 1337 +EXPOSE 1337 diff --git a/Pipfile b/Pipfile index 447e8d82..6028696a 100644 --- a/Pipfile +++ b/Pipfile @@ -1,17 +1,13 @@ [[source]] -url = "https://pypi.python.org/simple" +url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] flask = "*" -gunicorn = "*" authlib = "*" -flask-babel = "*" -requests = "*" -flask-httpauth = "*" -psycopg2-binary = "*" sqlalchemy = "*" +psycopg2-binary = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 9bcf2d9a..fbdee4f5 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "3b565a4738e47a7d0e247e78e9c2eb85638cc0965424ef39a2283297bde83fa3" + "sha256": "f6a2608ecef298aa46ce56f1e53a35321a979bb1f04e7d0258c3ea855b6ba7d0" }, "pipfile-spec": 6, "requires": { @@ -10,7 +10,7 @@ "sources": [ { "name": "pypi", - "url": "https://pypi.python.org/simple", + "url": "https://pypi.org/simple", "verify_ssl": true } ] @@ -24,84 +24,74 @@ "index": "pypi", "version": "==1.0.1" }, - "babel": { - "hashes": [ - "sha256:3f349e85ad3154559ac4930c3918247d319f21910d5ce4b25d439ed8693b98d2", - "sha256:98aeaca086133efb3e1e2aad0396987490c8425929ddbcfe0550184fdc54cd13" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.1" - }, - "certifi": { - "hashes": [ - "sha256:9c5705e395cd70084351dd8ad5c41e65655e08ce46f2ec9cf6c2c08390f71eb7", - "sha256:f1d53542ee8cbedbe2118b5686372fb33c297fcd6379b050cca0ef13a597382a" - ], - "markers": "python_version >= '3.6'", - "version": "==2022.5.18.1" - }, "cffi": { "hashes": [ - "sha256:00c878c90cb53ccfaae6b8bc18ad05d2036553e6d9d1d9dbcf323bbe83854ca3", - "sha256:0104fb5ae2391d46a4cb082abdd5c69ea4eab79d8d44eaaf79f1b1fd806ee4c2", - "sha256:06c48159c1abed75c2e721b1715c379fa3200c7784271b3c46df01383b593636", - "sha256:0808014eb713677ec1292301ea4c81ad277b6cdf2fdd90fd540af98c0b101d20", - "sha256:10dffb601ccfb65262a27233ac273d552ddc4d8ae1bf93b21c94b8511bffe728", - "sha256:14cd121ea63ecdae71efa69c15c5543a4b5fbcd0bbe2aad864baca0063cecf27", - "sha256:17771976e82e9f94976180f76468546834d22a7cc404b17c22df2a2c81db0c66", - "sha256:181dee03b1170ff1969489acf1c26533710231c58f95534e3edac87fff06c443", - "sha256:23cfe892bd5dd8941608f93348c0737e369e51c100d03718f108bf1add7bd6d0", - "sha256:263cc3d821c4ab2213cbe8cd8b355a7f72a8324577dc865ef98487c1aeee2bc7", - "sha256:2756c88cbb94231c7a147402476be2c4df2f6078099a6f4a480d239a8817ae39", - "sha256:27c219baf94952ae9d50ec19651a687b826792055353d07648a5695413e0c605", - "sha256:2a23af14f408d53d5e6cd4e3d9a24ff9e05906ad574822a10563efcef137979a", - "sha256:31fb708d9d7c3f49a60f04cf5b119aeefe5644daba1cd2a0fe389b674fd1de37", - "sha256:3415c89f9204ee60cd09b235810be700e993e343a408693e80ce7f6a40108029", - "sha256:3773c4d81e6e818df2efbc7dd77325ca0dcb688116050fb2b3011218eda36139", - "sha256:3b96a311ac60a3f6be21d2572e46ce67f09abcf4d09344c49274eb9e0bf345fc", - "sha256:3f7d084648d77af029acb79a0ff49a0ad7e9d09057a9bf46596dac9514dc07df", - "sha256:41d45de54cd277a7878919867c0f08b0cf817605e4eb94093e7516505d3c8d14", - "sha256:4238e6dab5d6a8ba812de994bbb0a79bddbdf80994e4ce802b6f6f3142fcc880", - "sha256:45db3a33139e9c8f7c09234b5784a5e33d31fd6907800b316decad50af323ff2", - "sha256:45e8636704eacc432a206ac7345a5d3d2c62d95a507ec70d62f23cd91770482a", - "sha256:4958391dbd6249d7ad855b9ca88fae690783a6be9e86df65865058ed81fc860e", - "sha256:4a306fa632e8f0928956a41fa8e1d6243c71e7eb59ffbd165fc0b41e316b2474", - "sha256:57e9ac9ccc3101fac9d6014fba037473e4358ef4e89f8e181f8951a2c0162024", - "sha256:59888172256cac5629e60e72e86598027aca6bf01fa2465bdb676d37636573e8", - "sha256:5e069f72d497312b24fcc02073d70cb989045d1c91cbd53979366077959933e0", - "sha256:64d4ec9f448dfe041705426000cc13e34e6e5bb13736e9fd62e34a0b0c41566e", - "sha256:6dc2737a3674b3e344847c8686cf29e500584ccad76204efea14f451d4cc669a", - "sha256:74fdfdbfdc48d3f47148976f49fab3251e550a8720bebc99bf1483f5bfb5db3e", - "sha256:75e4024375654472cc27e91cbe9eaa08567f7fbdf822638be2814ce059f58032", - "sha256:786902fb9ba7433aae840e0ed609f45c7bcd4e225ebb9c753aa39725bb3e6ad6", - "sha256:8b6c2ea03845c9f501ed1313e78de148cd3f6cad741a75d43a29b43da27f2e1e", - "sha256:91d77d2a782be4274da750752bb1650a97bfd8f291022b379bb8e01c66b4e96b", - "sha256:91ec59c33514b7c7559a6acda53bbfe1b283949c34fe7440bcf917f96ac0723e", - "sha256:920f0d66a896c2d99f0adbb391f990a84091179542c205fa53ce5787aff87954", - "sha256:a5263e363c27b653a90078143adb3d076c1a748ec9ecc78ea2fb916f9b861962", - "sha256:abb9a20a72ac4e0fdb50dae135ba5e77880518e742077ced47eb1499e29a443c", - "sha256:c2051981a968d7de9dd2d7b87bcb9c939c74a34626a6e2f8181455dd49ed69e4", - "sha256:c21c9e3896c23007803a875460fb786118f0cdd4434359577ea25eb556e34c55", - "sha256:c2502a1a03b6312837279c8c1bd3ebedf6c12c4228ddbad40912d671ccc8a962", - "sha256:d4d692a89c5cf08a8557fdeb329b82e7bf609aadfaed6c0d79f5a449a3c7c023", - "sha256:da5db4e883f1ce37f55c667e5c0de439df76ac4cb55964655906306918e7363c", - "sha256:e7022a66d9b55e93e1a845d8c9eba2a1bebd4966cd8bfc25d9cd07d515b33fa6", - "sha256:ef1f279350da2c586a69d32fc8733092fd32cc8ac95139a00377841f59a3f8d8", - "sha256:f54a64f8b0c8ff0b64d18aa76675262e1700f3995182267998c31ae974fbc382", - "sha256:f5c7150ad32ba43a07c4479f40241756145a1f03b43480e058cfd862bf5041c7", - "sha256:f6f824dc3bce0edab5f427efcfb1d63ee75b6fcb7282900ccaf925be84efb0fc", - "sha256:fd8a250edc26254fe5b33be00402e6d287f562b6a5b2152dec302fa15bb3e997", - "sha256:ffaa5c925128e29efbde7301d8ecaf35c8c60ffbcd6a1ffd3a552177c8e5e796" - ], - "version": "==1.15.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:2857e29ff0d34db842cd7ca3230549d1a697f96ee6d3fb071cfa6c7393832597", - "sha256:6881edbebdb17b39b4eaaa821b438bf6eddffb4468cf344f09f89def34a8b1df" + "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5", + "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef", + "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104", + "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426", + "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405", + "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375", + "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a", + "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e", + "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc", + "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf", + "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185", + "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497", + "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3", + "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35", + "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c", + "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83", + "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21", + "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca", + "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984", + "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac", + "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd", + "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee", + "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a", + "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2", + "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192", + "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7", + "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585", + "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f", + "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e", + "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27", + "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b", + "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e", + "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e", + "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d", + "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c", + "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415", + "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82", + "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02", + "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314", + "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325", + "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c", + "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3", + "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914", + "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045", + "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d", + "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9", + "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5", + "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2", + "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c", + "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3", + "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2", + "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8", + "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d", + "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d", + "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9", + "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162", + "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76", + "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4", + "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e", + "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9", + "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6", + "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b", + "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01", + "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0" ], - "markers": "python_version >= '3'", - "version": "==2.0.12" + "version": "==1.15.1" }, "click": { "hashes": [ @@ -113,55 +103,39 @@ }, "cryptography": { "hashes": [ - "sha256:093cb351031656d3ee2f4fa1be579a8c69c754cf874206be1d4cf3b542042804", - "sha256:0cc20f655157d4cfc7bada909dc5cc228211b075ba8407c46467f63597c78178", - "sha256:1b9362d34363f2c71b7853f6251219298124aa4cc2075ae2932e64c91a3e2717", - "sha256:1f3bfbd611db5cb58ca82f3deb35e83af34bb8cf06043fa61500157d50a70982", - "sha256:2bd1096476aaac820426239ab534b636c77d71af66c547b9ddcd76eb9c79e004", - "sha256:31fe38d14d2e5f787e0aecef831457da6cec68e0bb09a35835b0b44ae8b988fe", - "sha256:3b8398b3d0efc420e777c40c16764d6870bcef2eb383df9c6dbb9ffe12c64452", - "sha256:3c81599befb4d4f3d7648ed3217e00d21a9341a9a688ecdd615ff72ffbed7336", - "sha256:419c57d7b63f5ec38b1199a9521d77d7d1754eb97827bbb773162073ccd8c8d4", - "sha256:46f4c544f6557a2fefa7ac8ac7d1b17bf9b647bd20b16decc8fbcab7117fbc15", - "sha256:471e0d70201c069f74c837983189949aa0d24bb2d751b57e26e3761f2f782b8d", - "sha256:59b281eab51e1b6b6afa525af2bd93c16d49358404f814fe2c2410058623928c", - "sha256:731c8abd27693323b348518ed0e0705713a36d79fdbd969ad968fbef0979a7e0", - "sha256:95e590dd70642eb2079d280420a888190aa040ad20f19ec8c6e097e38aa29e06", - "sha256:a68254dd88021f24a68b613d8c51d5c5e74d735878b9e32cc0adf19d1f10aaf9", - "sha256:a7d5137e556cc0ea418dca6186deabe9129cee318618eb1ffecbd35bee55ddc1", - "sha256:aeaba7b5e756ea52c8861c133c596afe93dd716cbcacae23b80bc238202dc023", - "sha256:dc26bb134452081859aa21d4990474ddb7e863aa39e60d1592800a8865a702de", - "sha256:e53258e69874a306fcecb88b7534d61820db8a98655662a3dd2ec7f1afd9132f", - "sha256:ef15c2df7656763b4ff20a9bc4381d8352e6640cfeb95c2972c38ef508e75181", - "sha256:f224ad253cc9cea7568f49077007d2263efa57396a2f2f78114066fd54b5c68e", - "sha256:f8ec91983e638a9bcd75b39f1396e5c0dc2330cbd9ce4accefe68717e6779e0a" + "sha256:190f82f3e87033821828f60787cfa42bff98404483577b591429ed99bed39d59", + "sha256:2be53f9f5505673eeda5f2736bea736c40f051a739bfae2f92d18aed1eb54596", + "sha256:30788e070800fec9bbcf9faa71ea6d8068f5136f60029759fd8c3efec3c9dcb3", + "sha256:3d41b965b3380f10e4611dbae366f6dc3cefc7c9ac4e8842a806b9672ae9add5", + "sha256:4c590ec31550a724ef893c50f9a97a0c14e9c851c85621c5650d699a7b88f7ab", + "sha256:549153378611c0cca1042f20fd9c5030d37a72f634c9326e225c9f666d472884", + "sha256:63f9c17c0e2474ccbebc9302ce2f07b55b3b3fcb211ded18a42d5764f5c10a82", + "sha256:6bc95ed67b6741b2607298f9ea4932ff157e570ef456ef7ff0ef4884a134cc4b", + "sha256:7099a8d55cd49b737ffc99c17de504f2257e3787e02abe6d1a6d136574873441", + "sha256:75976c217f10d48a8b5a8de3d70c454c249e4b91851f6838a4e48b8f41eb71aa", + "sha256:7bc997818309f56c0038a33b8da5c0bfbb3f1f067f315f9abd6fc07ad359398d", + "sha256:80f49023dd13ba35f7c34072fa17f604d2f19bf0989f292cedf7ab5770b87a0b", + "sha256:91ce48d35f4e3d3f1d83e29ef4a9267246e6a3be51864a5b7d2247d5086fa99a", + "sha256:a958c52505c8adf0d3822703078580d2c0456dd1d27fabfb6f76fe63d2971cd6", + "sha256:b62439d7cd1222f3da897e9a9fe53bbf5c104fff4d60893ad1355d4c14a24157", + "sha256:b7f8dd0d4c1f21759695c05a5ec8536c12f31611541f8904083f3dc582604280", + "sha256:d204833f3c8a33bbe11eda63a54b1aad7aa7456ed769a982f21ec599ba5fa282", + "sha256:e007f052ed10cc316df59bc90fbb7ff7950d7e2919c9757fd42a2b8ecf8a5f67", + "sha256:f2dcb0b3b63afb6df7fd94ec6fbddac81b5492513f7b0436210d390c14d46ee8", + "sha256:f721d1885ecae9078c3f6bbe8a88bc0786b6e749bf32ccec1ef2b18929a05046", + "sha256:f7a6de3e98771e183645181b3627e2563dcde3ce94a9e42a3f427d2255190327", + "sha256:f8c0a6e9e1dd3eb0414ba320f85da6b0dcbd543126e30fcc546e7372a7fbf3b9" ], "markers": "python_version >= '3.6'", - "version": "==37.0.2" + "version": "==37.0.4" }, "flask": { "hashes": [ - "sha256:315ded2ddf8a6281567edb27393010fe3406188bafbfe65a3339d5787d89e477", - "sha256:fad5b446feb0d6db6aec0c3184d16a8c1f6c3e464b511649c8918a9be100b4fe" + "sha256:15972e5017df0575c3d6c090ba168b6db90259e620ac8d7ea813a396bad5b6cb", + "sha256:9013281a7402ad527f8fd56375164f3aa021ecfaff89bfe3825346c24f87e04c" ], "index": "pypi", - "version": "==2.1.2" - }, - "flask-babel": { - "hashes": [ - "sha256:e6820a052a8d344e178cdd36dd4bb8aea09b4bda3d5f9fa9f008df2c7f2f5468", - "sha256:f9faf45cdb2e1a32ea2ec14403587d4295108f35017a7821a2b1acb8cfd9257d" - ], - "index": "pypi", - "version": "==2.0.0" - }, - "flask-httpauth": { - "hashes": [ - "sha256:2076cf86e84c6aa442ee03344bff751eae133d35a1a48931e6f99f147161b55b", - "sha256:29191747bd6a6e81980fd9c415ec1279612b06ee4a7cad8463856f2ed571ec77" - ], - "index": "pypi", - "version": "==4.6.0" + "version": "==2.1.3" }, "greenlet": { "hashes": [ @@ -224,29 +198,13 @@ "markers": "python_version >= '3' and platform_machine == 'aarch64' or (platform_machine == 'ppc64le' or (platform_machine == 'x86_64' or (platform_machine == 'amd64' or (platform_machine == 'AMD64' or (platform_machine == 'win32' or platform_machine == 'WIN32')))))", "version": "==1.1.2" }, - "gunicorn": { - "hashes": [ - "sha256:9dcc4547dbb1cb284accfb15ab5667a0e5d1881cc443e0677b4882a4067a807e", - "sha256:e0a968b5ba15f8a328fdfd7ab1fcb5af4470c28aaf7e55df02a99bc13138e6e8" - ], - "index": "pypi", - "version": "==20.1.0" - }, - "idna": { - "hashes": [ - "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff", - "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d" - ], - "markers": "python_version >= '3'", - "version": "==3.3" - }, "importlib-metadata": { "hashes": [ - "sha256:5d26852efe48c0a32b0509ffbc583fda1a2266545a78d104a6f4aff3db17d700", - "sha256:c58c8eb8a762858f49e18436ff552e83914778e50e9d2f1660535ffb364552ec" + "sha256:637245b8bab2b6502fcbc752cc4b7a6f6243bb02b31c5c26156ad103d3d45670", + "sha256:7401a975809ea1fdc658c3aa4f78cc2195a0e019c5cbc4c06122884e9ae80c23" ], "markers": "python_version < '3.10'", - "version": "==4.11.4" + "version": "==4.12.0" }, "itsdangerous": { "hashes": [ @@ -379,94 +337,63 @@ ], "version": "==2.21" }, - "pytz": { - "hashes": [ - "sha256:1e760e2fe6a8163bc0b3d9a19c4f84342afa0a2affebfaa84b01b978a02ecaa7", - "sha256:e68985985296d9a66a881eb3193b0906246245294a881e7c8afe623866ac6a5c" - ], - "version": "==2022.1" - }, - "requests": { - "hashes": [ - "sha256:68d7c56fd5a8999887728ef304a6d12edc7be74f1cfa47714fc8b414525c9a61", - "sha256:f22fa1e554c9ddfd16e6e41ac79759e17be9e492b3587efa038054674760e72d" - ], - "index": "pypi", - "version": "==2.27.1" - }, - "setuptools": { - "hashes": [ - "sha256:68e45d17c9281ba25dc0104eadd2647172b3472d9e01f911efa57965e8d51a36", - "sha256:a43bdedf853c670e5fed28e5623403bad2f73cf02f9a2774e91def6bda8265a7" - ], - "markers": "python_version >= '3.7'", - "version": "==62.3.2" - }, "sqlalchemy": { "hashes": [ - "sha256:09c606d8238feae2f360b8742ffbe67741937eb0a05b57f536948d198a3def96", - "sha256:166a3887ec355f7d2f12738f7fa25dc8ac541867147a255f790f2f41f614cb44", - "sha256:16abf35af37a3d5af92725fc9ec507dd9e9183d261c2069b6606d60981ed1c6e", - "sha256:2e885548da361aa3f8a9433db4cfb335b2107e533bf314359ae3952821d84b3e", - "sha256:2ec89bf98cc6a0f5d1e28e3ad28e9be6f3b4bdbd521a4053c7ae8d5e1289a8a1", - "sha256:2ecac4db8c1aa4a269f5829df7e706639a24b780d2ac46b3e485cbbd27ec0028", - "sha256:316c7e5304dda3e3ad711569ac5d02698bbc71299b168ac56a7076b86259f7ea", - "sha256:5041474dcab7973baa91ec1f3112049a9dd4652898d6a95a6a895ff5c58beb6b", - "sha256:53d2d9ee93970c969bc4e3c78b1277d7129554642f6ffea039c282c7dc4577bc", - "sha256:5864a83bd345871ad9699ce466388f836db7572003d67d9392a71998092210e3", - "sha256:5c90ef955d429966d84326d772eb34333178737ebb669845f1d529eb00c75e72", - "sha256:5d50cb71c1dbed70646d521a0975fb0f92b7c3f84c61fa59e07be23a1aaeecfc", - "sha256:64678ac321d64a45901ef2e24725ec5e783f1f4a588305e196431447e7ace243", - "sha256:64d796e9af522162f7f2bf7a3c5531a0a550764c426782797bbeed809d0646c5", - "sha256:6cb4c4f57a20710cea277edf720d249d514e587f796b75785ad2c25e1c0fed26", - "sha256:6e1fe00ee85c768807f2a139b83469c1e52a9ffd58a6eb51aa7aeb524325ab18", - "sha256:6e859fa96605027bd50d8e966db1c4e1b03e7b3267abbc4b89ae658c99393c58", - "sha256:7a052bd9f53004f8993c624c452dfad8ec600f572dd0ed0445fbe64b22f5570e", - "sha256:81e53bd383c2c33de9d578bfcc243f559bd3801a0e57f2bcc9a943c790662e0c", - "sha256:83cf3077712be9f65c9aaa0b5bc47bc1a44789fd45053e2e3ecd59ff17c63fe9", - "sha256:8b20c4178ead9bc398be479428568ff31b6c296eb22e75776273781a6551973f", - "sha256:8d07fe2de0325d06e7e73281e9a9b5e259fbd7cbfbe398a0433cbb0082ad8fa7", - "sha256:a0ae3aa2e86a4613f2d4c49eb7da23da536e6ce80b2bfd60bbb2f55fc02b0b32", - "sha256:af2587ae11400157753115612d6c6ad255143efba791406ad8a0cbcccf2edcb3", - "sha256:b3db741beaa983d4cbf9087558620e7787106319f7e63a066990a70657dd6b35", - "sha256:be094460930087e50fd08297db9d7aadaed8408ad896baf758e9190c335632da", - "sha256:cb441ca461bf97d00877b607f132772644b623518b39ced54da433215adce691", - "sha256:ce20f5da141f8af26c123ebaa1b7771835ca6c161225ce728962a79054f528c3", - "sha256:d57ac32f8dc731fddeb6f5d1358b4ca5456e72594e664769f0a9163f13df2a31", - "sha256:dce3468bf1fc12374a1a732c9efd146ce034f91bb0482b602a9311cb6166a920", - "sha256:e12532c4d3f614678623da5d852f038ace1f01869b89f003ed6fe8c793f0c6a3", - "sha256:e74ce103b81c375c3853b436297952ef8d7863d801dcffb6728d01544e5191b5", - "sha256:f0394a3acfb8925db178f7728adb38c027ed7e303665b225906bfa8099dc1ce8", - "sha256:f522214f6749bc073262529c056f7dfd660f3b5ec4180c5354d985eb7219801e", - "sha256:fbf8c09fe9728168f8cc1b40c239eab10baf9c422c18be7f53213d70434dea43", - "sha256:fca8322e04b2dde722fcb0558682740eebd3bd239bea7a0d0febbc190e99dc15" + "sha256:047ef5ccd8860f6147b8ac6c45a4bc573d4e030267b45d9a1c47b55962ff0e6f", + "sha256:05a05771617bfa723ba4cef58d5b25ac028b0d68f28f403edebed5b8243b3a87", + "sha256:0ec54460475f0c42512895c99c63d90dd2d9cbd0c13491a184182e85074b04c5", + "sha256:107df519eb33d7f8e0d0d052128af2f25066c1a0f6b648fd1a9612ab66800b86", + "sha256:14ea8ff2d33c48f8e6c3c472111d893b9e356284d1482102da9678195e5a8eac", + "sha256:1745987ada1890b0e7978abdb22c133eca2e89ab98dc17939042240063e1ef21", + "sha256:1962dfee37b7fb17d3d4889bf84c4ea08b1c36707194c578f61e6e06d12ab90f", + "sha256:20bf65bcce65c538e68d5df27402b39341fabeecf01de7e0e72b9d9836c13c52", + "sha256:26146c59576dfe9c546c9f45397a7c7c4a90c25679492ff610a7500afc7d03a6", + "sha256:365b75938049ae31cf2176efd3d598213ddb9eb883fbc82086efa019a5f649df", + "sha256:4770eb3ba69ec5fa41c681a75e53e0e342ac24c1f9220d883458b5596888e43a", + "sha256:50e7569637e2e02253295527ff34666706dbb2bc5f6c61a5a7f44b9610c9bb09", + "sha256:5c2d19bfb33262bf987ef0062345efd0f54c4189c2d95159c72995457bf4a359", + "sha256:621f050e72cc7dfd9ad4594ff0abeaad954d6e4a2891545e8f1a53dcdfbef445", + "sha256:6d81de54e45f1d756785405c9d06cd17918c2eecc2d4262dc2d276ca612c2f61", + "sha256:6f95706da857e6e79b54c33c1214f5467aab10600aa508ddd1239d5df271986e", + "sha256:752ef2e8dbaa3c5d419f322e3632f00ba6b1c3230f65bc97c2ff5c5c6c08f441", + "sha256:7b2785dd2a0c044a36836857ac27310dc7a99166253551ee8f5408930958cc60", + "sha256:7f13644b15665f7322f9e0635129e0ef2098409484df67fcd225d954c5861559", + "sha256:8194896038753b46b08a0b0ae89a5d80c897fb601dd51e243ed5720f1f155d27", + "sha256:864d4f89f054819cb95e93100b7d251e4d114d1c60bc7576db07b046432af280", + "sha256:8b773c9974c272aae0fa7e95b576d98d17ee65f69d8644f9b6ffc90ee96b4d19", + "sha256:8f901be74f00a13bf375241a778455ee864c2c21c79154aad196b7a994e1144f", + "sha256:91d2b89bb0c302f89e753bea008936acfa4e18c156fb264fe41eb6bbb2bbcdeb", + "sha256:b0538b66f959771c56ff996d828081908a6a52a47c5548faed4a3d0a027a5368", + "sha256:b30e70f1594ee3c8902978fd71900d7312453922827c4ce0012fa6a8278d6df4", + "sha256:b71be98ef6e180217d1797185c75507060a57ab9cd835653e0112db16a710f0d", + "sha256:c6d00cb9da8d0cbfaba18cad046e94b06de6d4d0ffd9d4095a3ad1838af22528", + "sha256:d1f665e50592caf4cad3caed3ed86f93227bffe0680218ccbb293bd5a6734ca8", + "sha256:e6e2c8581c6620136b9530137954a8376efffd57fe19802182c7561b0ab48b48", + "sha256:e7a7667d928ba6ee361a3176e1bef6847c1062b37726b33505cc84136f657e0d", + "sha256:ec3985c883d6d217cf2013028afc6e3c82b8907192ba6195d6e49885bfc4b19d", + "sha256:ede13a472caa85a13abe5095e71676af985d7690eaa8461aeac5c74f6600b6c0", + "sha256:f24d4d6ec301688c59b0c4bb1c1c94c5d0bff4ecad33bb8f5d9efdfb8d8bc925", + "sha256:f2a42acc01568b9701665e85562bbff78ec3e21981c7d51d56717c22e5d3d58b", + "sha256:fbc076f79d830ae4c9d49926180a1140b49fa675d0f0d555b44c9a15b29f4c80" ], "index": "pypi", - "version": "==1.4.36" - }, - "urllib3": { - "hashes": [ - "sha256:44ece4d53fb1706f667c9bd1c648f5469a2ec925fcf3a776667042d645472c14", - "sha256:aabaf16477806a5e1dd19aa41f8c2b7950dd3c746362d7e3223dbe6de6ac448e" - ], - "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.9" + "version": "==1.4.39" }, "werkzeug": { "hashes": [ - "sha256:1ce08e8093ed67d638d63879fd1ba3735817f7a80de3674d293f5984f25fb6e6", - "sha256:72a4b735692dd3135217911cbeaa1be5fa3f62bffb8745c5215420a03dc55255" + "sha256:4d7013ef96fd197d1cdeb03e066c6c5a491ccb44758a5b2b91137319383e5a5a", + "sha256:7e1db6a5ba6b9a8be061e47e900456355b8714c0f238b0313f53afce1a55a79a" ], "markers": "python_version >= '3.7'", - "version": "==2.1.2" + "version": "==2.2.1" }, "zipp": { "hashes": [ - "sha256:56bf8aadb83c24db6c4b577e13de374ccfb67da2078beba1d037c17980bf43ad", - "sha256:c4f6e5bbf48e74f7a38e7cc5b0480ff42b0ae5178957d564d18932525d5cf099" + "sha256:05b45f1ee8f807d0cc928485ca40a07cb491cf092ff587c0df9cb1fd154848d2", + "sha256:47c40d7fe183a6f21403a199b3e4192cca5774656965b0a4988ad2f8feb5f009" ], "markers": "python_version >= '3.7'", - "version": "==3.8.0" + "version": "==3.8.1" } }, "develop": {} diff --git a/config.example.json b/config.example.json index 67ebe0dc..e0a10de5 100644 --- a/config.example.json +++ b/config.example.json @@ -1,14 +1,4 @@ { - "OIDC": { - "client_id": "generator-grafiky", - "client_secret": "248f960e-7717-4a0e-9bfa-eb7cf1fd26ae", - "authorization_endpoint": "http://localhost:8080/auth/realms/master/protocol/openid-connect/auth", - "token_endpoint": "http://localhost:8080/auth/realms/master/protocol/openid-connect/token", - "userinfo_endpoint": "http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo", - "jwks_uri": "http://localhost:8080/auth/realms/master/protocol/openid-connect/certs", - "scope": "openid" - }, - "SECRET_KEY": "Pusťte nás na ně", - "JWT_SECRET_KEY": "Energie a zkušenosti", + "OIDC_BASE_URL": "http://localhost:8080/auth/realms/master/", "JWT_EXPIRES_AFTER": 604800 } diff --git a/docker-compose.yml b/docker-compose.yml index 209d2a8c..bf1cdf10 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,24 +1,18 @@ version: "3" services: - database: - image: "postgres:latest" - - environment: - POSTGRES_DB: generator - POSTGRES_PASSWORD: generator - POSTGRES_USER: generator - - expose: - - "5432" - - restart: always web: build: "." environment: FLASK_APP: generator - DATABASE_URL: "postgresql://generator:generator@database/generator" + DATABASE_URL: "postgresql://username:password@host/database_name" + + SECRET_KEY: "Åìo«ÑÚ2ûÁn-Û?bV4«Û©ä´ó>°yÆvw7°Ôa" + JWT_SECRET_KEY: "¤2¯µ&ñðxÈF?a^µ#udbLxgЧ?ÅÏARA®D" + + OIDC_CLIENT_ID: generator + OIDC_CLIENT_SECRET: "a11a5557-d486-429c-8c8c-7afa0bf1b0be" ports: - "1337:1337" diff --git a/env.example b/env.example new file mode 100644 index 00000000..1f9acee5 --- /dev/null +++ b/env.example @@ -0,0 +1,10 @@ +DATABASE_URL=postgresql://username:password@localhost/database_name + +SECRET_KEY=Åìo«ÑÚ2ûÁn-Û?bV4«Û©ä´ó>°yÆvw7°Ôa + +JWT_SECRET_KEY=¤2¯µ&ñðxÈF?a^µ#udbLxgЧ?ÅÏARA®D + +OIDC_CLIENT_ID=generator +OIDC_CLIENT_SECRET=a11a5557-d486-429c-8c8c-7afa0bf1b0be + +FLASK_APP=generator diff --git a/generator/__init__.py b/generator/__init__.py index 5ea1f656..5e8c4ad1 100644 --- a/generator/__init__.py +++ b/generator/__init__.py @@ -4,7 +4,6 @@ import os import typing import flask -import flask_babel import sqlalchemy import sqlalchemy.orm @@ -39,6 +38,9 @@ def create_app() -> flask.Flask: app.logger.debug("Loading config file") + app.config["SECRET_KEY"] = os.environ.get("SECRET_KEY", "dev_secret_key") + app.config["JWT_SECRET_KEY"] = os.environ.get("JWT_SECRET_KEY", "dev_secret_key") + with open( os.environ.get( "CONFIG_LOCATION", @@ -69,10 +71,6 @@ def create_app() -> flask.Flask: ) ) - app.logger.debug("Setting up extensions") - - babel = flask_babel.Babel(app) - @app.before_request def before_request() -> None: """TODO: doc""" diff --git a/generator/authentication/__init__.py b/generator/authentication/__init__.py index bef728c1..115c26dc 100644 --- a/generator/authentication/__init__.py +++ b/generator/authentication/__init__.py @@ -17,32 +17,32 @@ def authenticate_via_jwt( @functools.wraps(func) def decorator(*args, **kwargs) -> typing.Any: - #if "token" not in flask.request.cookies: - #return flask.redirect( - #flask.url_for("oidc.login") - #) - - #try: - #claims = authlib.jose.jwt.decode( - #flask.request.cookies["token"], - #flask.current_app.config["JWT_SECRET_KEY"] - #) - #except authlib.jose.JoseError as exception: - #raise werkzeug.exceptions.BadRequest from exception - - #try: - #claims.validate() - #except authlib.jose.JoseError as exception: - #flask.current_app.logger.debug( - #"Claim validation failed: %s", - #exception - #) - - #return flask.redirect( - #flask.url_for("oidc.login") - #) - - flask.g.user_id = "1" + if "token" not in flask.request.cookies: + return flask.redirect( + flask.url_for("oidc.login") + ) + + try: + claims = authlib.jose.jwt.decode( + flask.request.cookies["token"], + flask.current_app.config["JWT_SECRET_KEY"] + ) + except authlib.jose.JoseError as exception: + raise werkzeug.exceptions.BadRequest from exception + + try: + claims.validate() + except authlib.jose.JoseError as exception: + flask.current_app.logger.debug( + "Claim validation failed: %s", + exception + ) + + return flask.redirect( + flask.url_for("oidc.login") + ) + + flask.g.user_id = claims["sub"] return func(*args, **kwargs) return decorator diff --git a/generator/static/js/concept.js b/generator/static/js/concept.js index a06f8c2a..0db61ea4 100644 --- a/generator/static/js/concept.js +++ b/generator/static/js/concept.js @@ -68,7 +68,7 @@ $("#concept-selection").on( currentConcept = null; $("#concept-name").val(""); - // TODO + window.location.reload(true); return; } @@ -82,7 +82,7 @@ $("#concept-selection").on( const canvasData = JSON.parse(unescapeHTML(element.dataset.json)); - const templateName = canvasData.templateName; + templateName = canvasData.templateName; template = new templateTypes[templateName]("graphicsCanvas"); template.redrawing = true; @@ -423,7 +423,7 @@ async function getCanvasData() { $("#concept-name").val() : null ), templateName: templateName, - templateHumanName: $("#template-selection").select2("data")[0].element.innerHTML, + templateHumanName: $("#template-selection").select2("data")[0].text, primaryText: $("#primary-text").val(), secondaryText: $("#secondary-text").val(), terciaryText: $("#terciary-text").val(), diff --git a/generator/templates/avatar.html b/generator/templates/avatar.html index 9c219207..52365af7 100644 --- a/generator/templates/avatar.html +++ b/generator/templates/avatar.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <html> <head> - <title>{{ gettext("Generátor profilových obrázků") }}</title> + <title>Generátor profilových obrázků</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script @@ -42,11 +42,11 @@ <h1> <img src="{{ url_for('static', filename='images/badges/default-light.png') }}" - alt="{{ gettext('Pirátské logo') }}" + alt="Pirátské logo" height="40" width="40" > - {{ gettext('Generátor profilových obrázků') }} + Generátor profilových obrázků </h1> </header> @@ -58,28 +58,28 @@ height="2000" ></canvas> - <button id="download">{{ gettext('Stáhnout') }}</button> + <button id="download">Stáhnout</button> <br> <small> - {{ gettext('Generátor s ♥ vytvořil ') }}<a href="https://toho.neocities.org" target="_blank" rel="nofollow">{{ gettext('Tomáš Valenta') }}</a> - {{ gettext(' pod svobodnou licencí ') }}<a href="https://www.gnu.org/licenses/agpl-3.0.en.html" target="_blank">{{ gettext('AGPLv3') }}</a>{{ gettext('.') }} + Generátor s ♥ vytvořil <a href="https://toho.neocities.org" target="_blank" rel="nofollow">Tomáš Valenta</a> + pod svobodnou licencí <a href="https://www.gnu.org/licenses/agpl-3.0.en.html" target="_blank">AGPLv3</a>. </small> </section> <section class="controls-primary"> - <h2>{{ gettext('Základní nastavení') }}</h1> + <h2>Základní nastavení</h1> - <h2>{{ gettext('Tvůj obrázek') }}</h2> + <h2>Tvůj obrázek</h2> <section id="image-wrapper"> <input type="file" accept="image/*" id="image" name="image"> - <button id="reset-image">{{ gettext('Reset') }}</button> + <button id="reset-image">Reset</button> </section> - <h2>{{ gettext('Ikona') }}</h2> + <h2>Ikona</h2> <section id="icon-selection-wrapper"> <select id="icon-selection"> @@ -89,7 +89,7 @@ data-icon-light-source="{{ url_for('static', filename='images/badges/default-light.png') }}" data-icon-height-multiplier="1" data-icon-offset-bottom-multiplier="1" - >{{ gettext('Základní ikona') }}</option> + >Základní ikona</option> <option data-image-source="{{ url_for('static', filename='images/badges/cz_ua-light.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/cz_ua-dark.png') }}" @@ -98,7 +98,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='ukrajina-cz', _external=true) }}" value="ukrajina-cz" - >{{ gettext('Česko + Ukrajina') }}</option> + >Česko + Ukrajina</option> <option data-image-source="{{ url_for('static', filename='images/badges/eu_ua-light.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/eu_ua-dark.png') }}" @@ -107,7 +107,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='ukrajina-eu', _external=true) }}" value="ukrajina-eu" - >{{ gettext('EU + Ukrajina') }}</option> + >EU + Ukrajina</option> <option data-image-source="{{ url_for('static', filename='images/badges/Benesov-1-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Benesov-1-dark.png') }}" @@ -116,7 +116,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='benesov-1', _external=true) }}" value="benesov-1" - >{{ gettext('Benešov 1') }}</option> + >Benešov 1</option> <option data-image-source="{{ url_for('static', filename='images/badges/Benesov-2-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Benesov-2-dark.png') }}" @@ -125,7 +125,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='benesov-2', _external=true) }}" value="benesov-2" - >{{ gettext('Benešov 2') }}</option> + >Benešov 2</option> <option data-image-source="{{ url_for('static', filename='images/badges/Benesov-3-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Benesov-3-dark.png') }}" @@ -134,7 +134,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='benesov-3', _external=true) }}" value="benesov-3" - >{{ gettext('Benešov 3') }}</option> + >Benešov 3</option> <option data-image-source="{{ url_for('static', filename='images/badges/Beroun-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Beroun-dark.png') }}" @@ -143,7 +143,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='beroun', _external=true) }}" value="beroun" - >{{ gettext('Beroun') }}</option> + >Beroun</option> <option data-image-source="{{ url_for('static', filename='images/badges/Bilina-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Bilina-dark.png') }}" @@ -152,7 +152,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='bilina', _external=true) }}" value="bilina" - >{{ gettext('Bílina') }}</option> + >Bílina</option> <option data-image-source="{{ url_for('static', filename='images/badges/Bohumin-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Bohumin-dark.png') }}" @@ -161,7 +161,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='bohumin', _external=true) }}" value="bohumin" - >{{ gettext('Bohumín') }}</option> + >Bohumín</option> <option data-image-source="{{ url_for('static', filename='images/badges/Brandys-nad-labem-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Brandys-nad-labem-dark.png') }}" @@ -170,7 +170,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='brandys-nad-labem', _external=true) }}" value="brandys-nad-labem" - >{{ gettext('Brandýs nad Labem') }}</option> + >Brandýs nad Labem</option> <option data-image-source="{{ url_for('static', filename='images/badges/Caslav-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Caslav-dark.png') }}" @@ -179,7 +179,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='caslav', _external=true) }}" value="caslav" - >{{ gettext('Čáslav') }}</option> + >Čáslav</option> <option data-image-source="{{ url_for('static', filename='images/badges/Ceska-trebova-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Ceska-trebova-dark.png') }}" @@ -188,7 +188,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='ceska-trebova', _external=true) }}" value="ceska-trebova" - >{{ gettext('Česká Třebová') }}</option> + >Česká Třebová</option> <option data-image-source="{{ url_for('static', filename='images/badges/Ceske-budejovice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Ceske-budejovice-dark.png') }}" @@ -197,7 +197,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='ceske-budejovice', _external=true) }}" value="ceske-budejovice" - >{{ gettext('České Budějovice') }}</option> + >České Budějovice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Cheb-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Cheb-dark.png') }}" @@ -206,7 +206,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='cheb', _external=true) }}" value="cheb" - >{{ gettext('Cheb') }}</option> + >Cheb</option> <option data-image-source="{{ url_for('static', filename='images/badges/Chudova-plana-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Chudova-plana-dark.png') }}" @@ -215,7 +215,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='chudova-plana', _external=true) }}" value="chudova-plana" - >{{ gettext('Chudová Planá') }}</option> + >Chudová Planá</option> <option data-image-source="{{ url_for('static', filename='images/badges/Chomutov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Chomutov-dark.png') }}" @@ -224,7 +224,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='chomutov', _external=true) }}" value="chomutov" - >{{ gettext('Chomutov') }}</option> + >Chomutov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Chrast-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Chrast-dark.png') }}" @@ -233,7 +233,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='chrast', _external=true) }}" value="chrast" - >{{ gettext('Chrást') }}</option> + >Chrást</option> <option data-image-source="{{ url_for('static', filename='images/badges/Chrudim-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Chrudim-dark.png') }}" @@ -242,7 +242,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='chrudim', _external=true) }}" value="chrudim" - >{{ gettext('Chrudim') }}</option> + >Chrudim</option> <option data-image-source="{{ url_for('static', filename='images/badges/Cesky-tesin-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Cesky-tesin-dark.png') }}" @@ -251,7 +251,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='cesky-tesin', _external=true) }}" value="cesky-tesin" - >{{ gettext('Český Těšín') }}</option> + >Český Těšín</option> <option data-image-source="{{ url_for('static', filename='images/badges/Decin-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Decin-dark.png') }}" @@ -260,7 +260,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='decin', _external=true) }}" value="decin" - >{{ gettext('Děčín') }}</option> + >Děčín</option> <option data-image-source="{{ url_for('static', filename='images/badges/Domazlice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Domazlice-dark.png') }}" @@ -269,7 +269,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='domazlice', _external=true) }}" value="domazlice" - >{{ gettext('Domažlice') }}</option> + >Domažlice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Frydek-mistek-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Frydek-mistek-dark.png') }}" @@ -278,7 +278,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='frydek-mistek', _external=true) }}" value="frydek-mistek" - >{{ gettext('Frýdek-Místek') }}</option> + >Frýdek-Místek</option> <option data-image-source="{{ url_for('static', filename='images/badges/Havirov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Havirov-dark.png') }}" @@ -287,7 +287,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='havirov', _external=true) }}" value="havirov" - >{{ gettext('Havířov') }}</option> + >Havířov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Havlickuv-brod-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Havlickuv-brod-dark.png') }}" @@ -296,7 +296,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='havlickuv-brod', _external=true) }}" value="havlickuv-brod" - >{{ gettext('Havlíčkův Brod') }}</option> + >Havlíčkův Brod</option> <option data-image-source="{{ url_for('static', filename='images/badges/Hermanuv-mestec-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Hermanuv-mestec-dark.png') }}" @@ -305,7 +305,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='hermanuv-mestec', _external=true) }}" value="hermanuv-mestec" - >{{ gettext('Heřmanův Městec') }}</option> + >Heřmanův Městec</option> <option data-image-source="{{ url_for('static', filename='images/badges/Holesov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Holesov-dark.png') }}" @@ -314,7 +314,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='holesov', _external=true) }}" value="holesov" - >{{ gettext('Holešov') }}</option> + >Holešov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Holysov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Holysov-dark.png') }}" @@ -323,7 +323,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='holysov', _external=true) }}" value="holysov" - >{{ gettext('Holyšov') }}</option> + >Holyšov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Hradec-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Hradec-dark.png') }}" @@ -332,7 +332,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='hradec', _external=true) }}" value="hradec" - >{{ gettext('Hradec') }}</option> + >Hradec</option> <option data-image-source="{{ url_for('static', filename='images/badges/Jesenice-jilove-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Jesenice-jilove-dark.png') }}" @@ -341,7 +341,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='jesenice-jilove', _external=true) }}" value="jesenice-jilove" - >{{ gettext('Jesenice - Jílové') }}</option> + >Jesenice - Jílové</option> <option data-image-source="{{ url_for('static', filename='images/badges/Jihlava-dark.png') }}" @@ -352,7 +352,7 @@ data-special-number-function="jihlava" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='jihlava', _external=true) }}" value="jihlava" - >{{ gettext('Jihlava') }}</option> + >Jihlava</option> <option data-image-source="{{ url_for('static', filename='images/badges/Jindrichuv-hradec-dark.png') }}" @@ -362,7 +362,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='jindrichuv-hradec', _external=true) }}" value="jindrichuv-hradec" - >{{ gettext('Jindřichův Hradec') }}</option> + >Jindřichův Hradec</option> <option data-image-source="{{ url_for('static', filename='images/badges/Kadan-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Kadan-dark.png') }}" @@ -371,7 +371,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='kadan', _external=true) }}" value="kadan" - >{{ gettext('Kadaň') }}</option> + >Kadaň</option> <option data-image-source="{{ url_for('static', filename='images/badges/Karlovy-vary-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Karlovy-vary-dark.png') }}" @@ -380,7 +380,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='karlovy-vary', _external=true) }}" value="karlovy-vary" - >{{ gettext('Karlovy Vary') }}</option> + >Karlovy Vary</option> <option data-image-source="{{ url_for('static', filename='images/badges/Karvina-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Karvina-dark.png') }}" @@ -389,7 +389,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='karvina', _external=true) }}" value="karvina" - >{{ gettext('Karviná') }}</option> + >Karviná</option> <option data-image-source="{{ url_for('static', filename='images/badges/Kutna-hora-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Kutna-hora-dark.png') }}" @@ -398,7 +398,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='kutna-hora', _external=true) }}" value="kutna-hora" - >{{ gettext('Kutná Hora') }}</option> + >Kutná Hora</option> <option data-image-source="{{ url_for('static', filename='images/logos/kladno.png') }}" @@ -409,7 +409,7 @@ data-special-number-function="kladno" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='kladno', _external=true) }}" value="kladno" - >{{ gettext('Kladno') }}</option> + >Kladno</option> <option data-image-source="{{ url_for('static', filename='images/badges/Klatovy-dark.png') }}" @@ -419,7 +419,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='klatovy', _external=true) }}" value="klatovy" - >{{ gettext('Klatovy') }}</option> + >Klatovy</option> <option data-image-source="{{ url_for('static', filename='images/badges/Kolin-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Kolin-dark.png') }}" @@ -428,7 +428,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='kolin', _external=true) }}" value="kolin" - >{{ gettext('Kolín') }}</option> + >Kolín</option> <option data-image-source="{{ url_for('static', filename='images/badges/Kralupy-nad-vltavou-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Kralupy-nad-vltavou-dark.png') }}" @@ -437,7 +437,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='kralupy-nad-vltavou', _external=true) }}" value="kralupy-nad-vltavou" - >{{ gettext('Kralupy nad Vltavou') }}</option> + >Kralupy nad Vltavou</option> <option data-image-source="{{ url_for('static', filename='images/badges/Kutna-hora-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Kutna-hora-dark.png') }}" @@ -446,7 +446,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='kutna-hora', _external=true) }}" value="kutna-hora" - >{{ gettext('Kutná Hora') }}</option> + >Kutná Hora</option> <option data-image-source="{{ url_for('static', filename='images/badges/Litomerice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Litomerice-dark.png') }}" @@ -455,7 +455,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='litomerice', _external=true) }}" value="litomerice" - >{{ gettext('Litoměřice') }}</option> + >Litoměřice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Loket-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Loket-dark.png') }}" @@ -464,7 +464,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='loket', _external=true) }}" value="loket" - >{{ gettext('Loket') }}</option> + >Loket</option> <option data-image-source="{{ url_for('static', filename='images/badges/Lysa-nad-labem-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Lysa-nad-labem-dark.png') }}" @@ -473,7 +473,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='lysa-nad-labem', _external=true) }}" value="lysa-nad-labem" - >{{ gettext('Lysá nad Labem') }}</option> + >Lysá nad Labem</option> <option data-image-source="{{ url_for('static', filename='images/badges/Louny-white-on-purple.png') }}" @@ -484,7 +484,7 @@ data-special-number-function="louny" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='louny-bila-na-fialove', _external=true) }}" value="louny-bila-na-fialove" - >{{ gettext('Louny Spolu - bílá na fialové') }}</option> + >Louny Spolu - bílá na fialové</option> <option data-image-source="{{ url_for('static', filename='images/badges/Louny-gold-on-purple.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Louny-gold-on-purple.png') }}" @@ -494,7 +494,7 @@ data-special-number-function="louny" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='louny-zlata-na-fialove', _external=true) }}" value="louny-zlata-na-fialove" - >{{ gettext('Louny Spolu - zlatá na fialové') }}</option> + >Louny Spolu - zlatá na fialové</option> <option data-image-source="{{ url_for('static', filename='images/badges/Louny-purple-on-white.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Louny-purple-on-white.png') }}" @@ -504,7 +504,7 @@ data-special-number-function="louny" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='louny-fialova-na-bile', _external=true) }}" value="louny-fialova-na-bile" - >{{ gettext('Louny Spolu - fialová na bílé') }}</option> + >Louny Spolu - fialová na bílé</option> <option data-image-source="{{ url_for('static', filename='images/badges/Louny-purple-on-gold.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Louny-purple-on-gold.png') }}" @@ -514,7 +514,7 @@ data-special-number-function="louny" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='louny-fialova-na-zlate', _external=true) }}" value="louny-fialova-na-zlate" - >{{ gettext('Louny Spolu - fialová na zlaté') }}</option> + >Louny Spolu - fialová na zlaté</option> <option data-image-source="{{ url_for('static', filename='images/badges/Marianske-lazne-dark.png') }}" @@ -524,7 +524,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='marianske-lazne', _external=true) }}" value="marianske-lazne" - >{{ gettext('Mariánské Lázně') }}</option> + >Mariánské Lázně</option> <option data-image-source="{{ url_for('static', filename='images/badges/Moravska-trebova-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Moravska-trebova-dark.png') }}" @@ -533,7 +533,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='moravska-trebova', _external=true) }}" value="moravska-trebova" - >{{ gettext('Moravská Třebová') }}</option> + >Moravská Třebová</option> <option data-image-source="{{ url_for('static', filename='images/badges/Melnik-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Melnik-dark.png') }}" @@ -542,7 +542,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='melnik', _external=true) }}" value="melnik" - >{{ gettext('Mělník') }}</option> + >Mělník</option> <option data-image-source="{{ url_for('static', filename='images/badges/Milovice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Milovice-dark.png') }}" @@ -551,7 +551,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='milovice', _external=true) }}" value="milovice" - >{{ gettext('Milovice') }}</option> + >Milovice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Mlada-boleslav-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Mlada-boleslav-dark.png') }}" @@ -560,7 +560,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='mlada-boleslav', _external=true) }}" value="mlada-boleslav" - >{{ gettext('Mladá Boleslav') }}</option> + >Mladá Boleslav</option> <option data-image-source="{{ url_for('static', filename='images/badges/Mnisecko-a-dolni-berounka-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Mnisecko-a-dolni-berounka-dark.png') }}" @@ -569,7 +569,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='mnisecko-a-dolni-berounka', _external=true) }}" value="mnisecko-a-dolni-berounka" - >{{ gettext('Mnisecko a Dolní Berounka') }}</option> + >Mnisecko a Dolní Berounka</option> <option data-image-source="{{ url_for('static', filename='images/badges/Most-dark.png') }}" @@ -580,7 +580,7 @@ data-special-number-function="most" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='most', _external=true) }}" value="most" - >{{ gettext('Most') }}</option> + >Most</option> <option data-image-source="{{ url_for('static', filename='images/badges/Napajedla-dark.png') }}" @@ -590,7 +590,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='napajedla', _external=true) }}" value="napajedla" - >{{ gettext('Napajedla') }}</option> + >Napajedla</option> <option data-image-source="{{ url_for('static', filename='images/badges/Neratovice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Neratovice-dark.png') }}" @@ -599,7 +599,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='neratovice', _external=true) }}" value="neratovice" - >{{ gettext('Neratovice') }}</option> + >Neratovice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Nova-role-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Nova-role-dark.png') }}" @@ -608,7 +608,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='nova-role', _external=true) }}" value="nova-role" - >{{ gettext('Nová Role') }}</option> + >Nová Role</option> <option data-image-source="{{ url_for('static', filename='images/badges/Nymburk-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Nymburk-dark.png') }}" @@ -617,7 +617,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='nymburk', _external=true) }}" value="nymburk" - >{{ gettext('Nymburk') }}</option> + >Nymburk</option> <option data-image-source="{{ url_for('static', filename='images/badges/Olomouc-light.png') }}" @@ -628,7 +628,7 @@ data-special-number-function="olomouc" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='olomouc', _external=true) }}" value="olomouc" - >{{ gettext('Olomouc') }}</option> + >Olomouc</option> <option data-image-source="{{ url_for('static', filename='images/badges/Opava-dark.png') }}" @@ -638,7 +638,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='opava', _external=true) }}" value="opava" - >{{ gettext('Opava') }}</option> + >Opava</option> <option data-image-source="{{ url_for('static', filename='images/badges/Orlova-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Orlova-dark.png') }}" @@ -647,7 +647,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='orlova', _external=true) }}" value="orlova" - >{{ gettext('Orlová') }}</option> + >Orlová</option> <option data-image-source="{{ url_for('static', filename='images/badges/Ostrava-Poruba-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Ostrava-Poruba-dark.png') }}" @@ -656,7 +656,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='ostrava-poruba', _external=true) }}" value="ostrava-poruba" - >{{ gettext('Ostrava-Poruba') }}</option> + >Ostrava-Poruba</option> <option data-image-source="{{ url_for('static', filename='images/badges/Ostrava-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Ostrava-dark.png') }}" @@ -665,7 +665,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='ostrava', _external=true) }}" value="ostrava" - >{{ gettext('Ostrava') }}</option> + >Ostrava</option> <option data-image-source="{{ url_for('static', filename='images/badges/Ostrava-jih-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Ostrava-jih-dark.png') }}" @@ -674,7 +674,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='ostrava-jih', _external=true) }}" value="ostrava-jih" - >{{ gettext('Ostrava-Jih') }}</option> + >Ostrava-Jih</option> <option data-image-source="{{ url_for('static', filename='images/badges/Otrokovice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Otrokovice-dark.png') }}" @@ -683,7 +683,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='otrokovice', _external=true) }}" value="otrokovice" - >{{ gettext('Otrokovice') }}</option> + >Otrokovice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Pardubice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Pardubice-dark.png') }}" @@ -692,7 +692,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='pardubice', _external=true) }}" value="pardubice" - >{{ gettext('Pardubice') }}</option> + >Pardubice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Pisek-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Pisek-dark.png') }}" @@ -701,7 +701,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='pisek', _external=true) }}" value="pisek" - >{{ gettext('Písek') }}</option> + >Písek</option> <option data-image-source="{{ url_for('static', filename='images/badges/Plzen-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Plzen-dark.png') }}" @@ -710,7 +710,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='plzen', _external=true) }}" value="plzen" - >{{ gettext('Plzeň') }}</option> + >Plzeň</option> <option data-image-source="{{ url_for('static', filename='images/badges/Podebrady-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Podebrady-dark.png') }}" @@ -719,7 +719,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='podebrady', _external=true) }}" value="podebrady" - >{{ gettext('Poděbrady') }}</option> + >Poděbrady</option> <option data-image-source="{{ url_for('static', filename='images/badges/Policka-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Policka-dark.png') }}" @@ -728,7 +728,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='policka', _external=true) }}" value="policka" - >{{ gettext('Polička') }}</option> + >Polička</option> <option data-image-source="{{ url_for('static', filename='images/badges/Poruba-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Poruba-dark.png') }}" @@ -737,7 +737,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='poruba', _external=true) }}" value="poruba" - >{{ gettext('Poruba') }}</option> + >Poruba</option> <option data-image-source="{{ url_for('static', filename='images/badges/Prachatice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Prachatice-dark.png') }}" @@ -746,7 +746,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='prachatice', _external=true) }}" value="prachatice" - >{{ gettext('Prachatice') }}</option> + >Prachatice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-1-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-1-dark.png') }}" @@ -755,7 +755,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-1', _external=true) }}" value="praha-1" - >{{ gettext('Praha 1') }}</option> + >Praha 1</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-2-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-2-dark.png') }}" @@ -764,7 +764,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-2', _external=true) }}" value="praha-2" - >{{ gettext('Praha 2') }}</option> + >Praha 2</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-3-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-3-dark.png') }}" @@ -773,7 +773,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-3', _external=true) }}" value="praha-3" - >{{ gettext('Praha 3') }}</option> + >Praha 3</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-4-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-4-dark.png') }}" @@ -782,7 +782,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-4', _external=true) }}" value="praha-4" - >{{ gettext('Praha 4') }}</option> + >Praha 4</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-5-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-5-dark.png') }}" @@ -791,7 +791,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-5', _external=true) }}" value="praha-5" - >{{ gettext('Praha 5') }}</option> + >Praha 5</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-6-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-6-dark.png') }}" @@ -800,7 +800,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-6', _external=true) }}" value="praha-6" - >{{ gettext('Praha 6') }}</option> + >Praha 6</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-7-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-7-dark.png') }}" @@ -809,7 +809,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-7', _external=true) }}" value="praha-7" - >{{ gettext('Praha 7') }}</option> + >Praha 7</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-8-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-8-dark.png') }}" @@ -818,7 +818,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-8', _external=true) }}" value="praha-8" - >{{ gettext('Praha 8') }}</option> + >Praha 8</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-9-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-9-dark.png') }}" @@ -827,7 +827,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-9', _external=true) }}" value="praha-9" - >{{ gettext('Praha 9') }}</option> + >Praha 9</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-10-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-10-dark.png') }}" @@ -836,7 +836,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-10', _external=true) }}" value="praha-10" - >{{ gettext('Praha 10') }}</option> + >Praha 10</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-11-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-11-dark.png') }}" @@ -845,7 +845,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-11', _external=true) }}" value="praha-11" - >{{ gettext('Praha 11') }}</option> + >Praha 11</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-12-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-12-dark.png') }}" @@ -854,7 +854,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-12', _external=true) }}" value="praha-12" - >{{ gettext('Praha 12') }}</option> + >Praha 12</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-13-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-13-dark.png') }}" @@ -863,7 +863,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-13', _external=true) }}" value="praha-13" - >{{ gettext('Praha 13') }}</option> + >Praha 13</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-14-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-14-dark.png') }}" @@ -872,7 +872,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-14', _external=true) }}" value="praha-14" - >{{ gettext('Praha 14') }}</option> + >Praha 14</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-15-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-15-dark.png') }}" @@ -881,7 +881,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-15', _external=true) }}" value="praha-15" - >{{ gettext('Praha 15') }}</option> + >Praha 15</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-18-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-18-dark.png') }}" @@ -890,7 +890,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-18', _external=true) }}" value="praha-18" - >{{ gettext('Praha 18') }}</option> + >Praha 18</option> <option data-image-source="{{ url_for('static', filename='images/badges/Praha-21-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Praha-21-dark.png') }}" @@ -899,7 +899,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='praha-21', _external=true) }}" value="praha-21" - >{{ gettext('Praha 21') }}</option> + >Praha 21</option> <option data-image-source="{{ url_for('static', filename='images/badges/Prerov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Prerov-dark.png') }}" @@ -908,7 +908,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='prerov', _external=true) }}" value="prerov" - >{{ gettext('Přerov') }}</option> + >Přerov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Pribor-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Pribor-dark.png') }}" @@ -917,7 +917,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='pribor', _external=true) }}" value="pribor" - >{{ gettext('Příbor') }}</option> + >Příbor</option> <option data-image-source="{{ url_for('static', filename='images/badges/Pribram-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Pribram-dark.png') }}" @@ -926,7 +926,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='pribram', _external=true) }}" value="pribram" - >{{ gettext('Příbram') }}</option> + >Příbram</option> <option data-image-source="{{ url_for('static', filename='images/badges/Prostejov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Prostejov-dark.png') }}" @@ -935,7 +935,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='prostejov', _external=true) }}" value="prostejov" - >{{ gettext('Prostějov') }}</option> + >Prostějov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Rotava-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Rotava-dark.png') }}" @@ -944,7 +944,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='rotava', _external=true) }}" value="rotava" - >{{ gettext('Rotava') }}</option> + >Rotava</option> <option data-image-source="{{ url_for('static', filename='images/badges/Roudnice-nad-labem-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Roudnice-nad-labem-dark.png') }}" @@ -953,7 +953,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='roudnice-nad-labem', _external=true) }}" value="roudnice-nad-labem" - >{{ gettext('Roudnice nad Labem') }}</option> + >Roudnice nad Labem</option> <option data-image-source="{{ url_for('static', filename='images/badges/Roznov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Roznov-dark.png') }}" @@ -962,7 +962,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='roznov', _external=true) }}" value="roznov" - >{{ gettext('Rožnov') }}</option> + >Rožnov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Rudoltice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Rudoltice-dark.png') }}" @@ -971,7 +971,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='rudoltice', _external=true) }}" value="rudoltice" - >{{ gettext('Rudoltice') }}</option> + >Rudoltice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Sobeslav-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Sobeslav-dark.png') }}" @@ -980,7 +980,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='sobeslav', _external=true) }}" value="sobeslav" - >{{ gettext('Soběslav') }}</option> + >Soběslav</option> <option data-image-source="{{ url_for('static', filename='images/badges/Sokolov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Sokolov-dark.png') }}" @@ -989,7 +989,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='sokolov', _external=true) }}" value="sokolov" - >{{ gettext('Sokolov') }}</option> + >Sokolov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Strakonice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Strakonice-dark.png') }}" @@ -998,7 +998,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='strakonice', _external=true) }}" value="strakonice" - >{{ gettext('Strakonice') }}</option> + >Strakonice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Susice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Susice-dark.png') }}" @@ -1007,7 +1007,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='susice', _external=true) }}" value="susice" - >{{ gettext('Sušice') }}</option> + >Sušice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Sumperk-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Sumperk-dark.png') }}" @@ -1016,7 +1016,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='sumperk', _external=true) }}" value="sumperk" - >{{ gettext('Šumperk') }}</option> + >Šumperk</option> <option data-image-source="{{ url_for('static', filename='images/badges/Svitavy-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Svitavy-dark.png') }}" @@ -1025,7 +1025,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='svitavy', _external=true) }}" value="svitavy" - >{{ gettext('Svitavy') }}</option> + >Svitavy</option> <option data-image-source="{{ url_for('static', filename='images/badges/Tachov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Tachov-dark.png') }}" @@ -1034,7 +1034,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='tachov', _external=true) }}" value="tachov" - >{{ gettext('Tachov') }}</option> + >Tachov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Tabor-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Tabor-dark.png') }}" @@ -1043,7 +1043,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='tabor', _external=true) }}" value="tabor" - >{{ gettext('Tábor') }}</option> + >Tábor</option> <option data-image-source="{{ url_for('static', filename='images/badges/Telc-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Telc-dark.png') }}" @@ -1052,7 +1052,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='telc', _external=true) }}" value="telc" - >{{ gettext('Telč') }}</option> + >Telč</option> <option data-image-source="{{ url_for('static', filename='images/badges/Teplice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Teplice-dark.png') }}" @@ -1061,7 +1061,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='teplice', _external=true) }}" value="teplice" - >{{ gettext('Teplice') }}</option> + >Teplice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Terezin-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Terezin-dark.png') }}" @@ -1070,7 +1070,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='terezin', _external=true) }}" value="terezin" - >{{ gettext('Terezín') }}</option> + >Terezín</option> <option data-image-source="{{ url_for('static', filename='images/badges/Trutnov-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Trutnov-dark.png') }}" @@ -1079,7 +1079,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='trutnov', _external=true) }}" value="trutnov" - >{{ gettext('Trutnov') }}</option> + >Trutnov</option> <option data-image-source="{{ url_for('static', filename='images/badges/Trebic-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Trebic-dark.png') }}" @@ -1088,7 +1088,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='trebic', _external=true) }}" value="trebic" - >{{ gettext('Třebíč') }}</option> + >Třebíč</option> <option data-image-source="{{ url_for('static', filename='images/badges/Tyn-nad-vltavou-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Tyn-nad-vltavou-dark.png') }}" @@ -1097,7 +1097,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='tyn-nad-vltavou', _external=true) }}" value="tyn-nad-vltavou" - >{{ gettext('Týn nad Vltavou') }}</option> + >Týn nad Vltavou</option> <option data-image-source="{{ url_for('static', filename='images/badges/Uherske-hradiste-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Uherske-hradiste-dark.png') }}" @@ -1106,7 +1106,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='uherske-hradiste', _external=true) }}" value="uherske-hradiste" - >{{ gettext('Uherské Hradiště') }}</option> + >Uherské Hradiště</option> <option data-image-source="{{ url_for('static', filename='images/badges/Usti-nad-labem-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Usti-nad-labem-dark.png') }}" @@ -1115,7 +1115,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='usti-nad-labem', _external=true) }}" value="usti-nad-labem" - >{{ gettext('Ustí nad Labem') }}</option> + >Ustí nad Labem</option> <option data-image-source="{{ url_for('static', filename='images/badges/Valec-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Valec-dark.png') }}" @@ -1124,7 +1124,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='valec', _external=true) }}" value="valec" - >{{ gettext('Valeč') }}</option> + >Valeč</option> <option data-image-source="{{ url_for('static', filename='images/badges/Valmez-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Valmez-dark.png') }}" @@ -1133,7 +1133,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='valmez', _external=true) }}" value="valmez" - >{{ gettext('Valašské Meziříčí') }}</option> + >Valašské Meziříčí</option> <option data-image-source="{{ url_for('static', filename='images/badges/Vejprtice-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Vejprtice-dark.png') }}" @@ -1142,7 +1142,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='vejprtice', _external=true) }}" value="vejprtice" - >{{ gettext('Vejprtice') }}</option> + >Vejprtice</option> <option data-image-source="{{ url_for('static', filename='images/badges/Volary-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Volary-dark.png') }}" @@ -1151,7 +1151,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='volary', _external=true) }}" value="volary" - >{{ gettext('Volary') }}</option> + >Volary</option> <option data-image-source="{{ url_for('static', filename='images/badges/Zatec-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Zatec-dark.png') }}" @@ -1160,7 +1160,7 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='zatec', _external=true) }}" value="zatec" - >{{ gettext('Žatec') }}</option> + >Žatec</option> <option data-image-source="{{ url_for('static', filename='images/badges/Zlin-dark.png') }}" data-icon-dark-source="{{ url_for('static', filename='images/badges/Zlin-dark.png') }}" @@ -1169,21 +1169,21 @@ data-icon-offset-bottom-multiplier="1" data-url="{{ url_for('generator.view_avatar_generator_with_localization', localization='zlin', _external=true) }}" value="zlin" - >{{ gettext('Zlín') }}</option> + >Zlín</option> </select> <section id="icon-permalink-wrapper" style="display:none"> - <b>{{ gettext('Permanentní odkaz na nastavenou ikonu:') }}</b> + <b>Permanentní odkaz na nastavenou ikonu:</b> <a id="icon-permalink" href="#"></a> </section> </section> <section> - <h2>{{ gettext('Lokalizace') }}</h2> + <h2>Lokalizace</h2> <section id="localization-selection-wrapper"> <select id="localization-selection"> - <option>{{ gettext('Žádná lokalizace') }}</option> + <option>Žádná lokalizace</option> <option data-image-source="{{ url_for('static', filename='images/locations/Benesov-1-dark.png') }}" data-image-location-source="{{ url_for('static', filename='images/locations/Benesov-1.png') }}" @@ -1693,17 +1693,17 @@ <section id="own-icon-wrapper"> <label for="own-icon-image"> - <h3>{{ gettext('Vlastní ikona') }}</h3> + <h3>Vlastní ikona</h3> </label> <input type="file" accept="image/*" id="own-icon-image" name="own-icon-image"> - <button id="reset-own-icon">{{ gettext('Reset') }}</button> + <button id="reset-own-icon">Reset</button> </section> </section> <section id="text-wrapper"> - <h2>{{ gettext('Text') }}</h2> + <h2>Text</h2> <textarea id="text" placeholder="Text vedle loga"></textarea> @@ -1715,36 +1715,36 @@ </section> <section id="gradient-wrapper"> - <h2>{{ gettext('Stín na pozadí') }}</h2> + <h2>Stín na pozadí</h2> <input type="checkbox" id="show-gradient" name="show-gradient"> - <label for="show-gradient">{{ gettext("Zobrazit") }}</label> + <label for="show-gradient">Zobrazit</label> </section> </section> <section class="controls-secondary"> - <h2>{{ gettext('Detaily') }}</h2> + <h2>Detaily</h2> <section> - <h2>{{ gettext('Tvůj obrázek') }}</h2> + <h2>Tvůj obrázek</h2> - <b>{{ gettext('Pozice: ') }} + <b>Pozice: <button id="move-image-left">←</button> <button id="move-image-up">↑</button> <button id="move-image-right">→</button> <button id="move-image-down">↓</button> - <button id="move-image-reset">{{ gettext("Reset") }}</button> + <button id="move-image-reset">Reset</button> <br> - <small>{{ gettext('(Také možno změnit tažením obrázku)') }}</small> + <small>(Také možno změnit tažením obrázku)</small> </b> <br> <b> - {{ gettext('Přiblížení: ') }} + Přiblížení: <input type="range" @@ -1755,28 +1755,28 @@ id="zoom-image-input" autocomplete="off" > - <button id="zoom-image-reset">{{ gettext("Reset") }}</button> + <button id="zoom-image-reset">Reset</button> </b> </section> - <h2>{{ gettext('Barevné schéma') }}</h2> + <h2>Barevné schéma</h2> <section id="color-scheme-wrapper"> <select id="color-scheme-selection"> <option data-image-source="{{ url_for('static', filename='images/black-on-white.png') }}" data-color-scheme="black-on-white" - >{{ gettext('Černá na bílém pozadí') }}</option> + >Černá na bílém pozadí</option> <!--<option data-image-source="{{ url_for('static', filename='images/white-on-black.png') }}" data-color-scheme="white-on-black" - >{{ gettext('Bílá na černém pozadí') }}</option>--> + >Bílá na černém pozadí</option>--> </select> <br><br> <section id="localization-color-wrapper"> - <label style="text-align:center;display:block" for="localization-color">{{ gettext('Barva lokalizace') }}</label> + <label style="text-align:center;display:block" for="localization-color">Barva lokalizace</label> <select id="localization-color" @@ -1787,7 +1787,7 @@ </section> <section id="color-filter-wrapper"> - <h2>{{ gettext('Barevný filtr') }}</h2> + <h2>Barevný filtr</h2> <select id="filter-color" class="colorPickSelector"></select> </section> diff --git a/generator/templates/generator.html b/generator/templates/generator.html index 5c8c5ad8..82b3a8e4 100644 --- a/generator/templates/generator.html +++ b/generator/templates/generator.html @@ -1,7 +1,7 @@ <!DOCTYPE html> <html> <head> - <title>{{ gettext("Generátor grafiky") }}</title> + <title>Generátor grafiky</title> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <script @@ -304,32 +304,32 @@ <h1> <img src="{{ url_for('static', filename='images/badges/default-light.png') }}" - alt="{{ gettext('Pirátské logo') }}" + alt="Pirátské logo" height="40" width="40" > - {{ gettext('Generátor grafiky') }} + Generátor grafiky </h1> - <small>{{ gettext('Tentokrát ty volby vyhrajeme! :)') }}</small> + <small>Tentokrát ty volby vyhrajeme! :)</small> </header> <main class="container"> <div class="canvas-container"> <section class="position-top"> <section id="primary-image-position-wrapper-upper"> - <b>{{ gettext('Pozice: ') }} + <b>Pozice: <button class="move-primary-image-left">←</button> <button class="move-primary-image-up">↑</button> <button class="move-primary-image-right">→</button> <button class="move-primary-image-down">↓</button> - <button class="move-primary-image-reset">{{ gettext("Reset") }}</button> + <button class="move-primary-image-reset">Reset</button> </b> <br> <b> - {{ gettext('Přiblížení: ') }} + Přiblížení: <input type="range" @@ -339,7 +339,7 @@ class="zoom-primary-image-input slider" autocomplete="off" > - <button class="zoom-primary-image-reset">{{ gettext("Reset") }}</button> + <button class="zoom-primary-image-reset">Reset</button> </b> </section> </section> @@ -354,23 +354,21 @@ ></canvas> </section> <section class="settings"> - <button id="download">{{ gettext('Stáhnout') }}</button> + <button id="download">Stáhnout</button> <section id="printing-wrapper"> <br> - <button id="pdf-a4">{{ gettext("PDF - A4") }}</button> - <button id="pdf-a3">{{ gettext("PDF - A3") }}</button> - <button id="pdf-a2">{{ gettext("PDF - A2") }}</button> - <button id="pdf-a1">{{ gettext("PDF - A1") }}</button> - <button id="pdf-a0">{{ gettext("PDF - A0") }}</button> + <button id="pdf-a4">PDF - A4</button> + <button id="pdf-a3">PDF - A3</button> + <button id="pdf-a2">PDF - A2</button> + <button id="pdf-a1">PDF - A1</button> + <button id="pdf-a0">PDF - A0</button> </section> <br> - <h3>{{ gettext("Koncepty") }}</h3> - - <b style="color:red">CHYSTÁ SE! Koncepty budou v budoucnu fungovat přes Pirátskou Identitu a nejsou dokončené. Prosím, zatím je nepoužívej.</b> + <h3>Koncepty</h3> <section> <select id="concept-selection"> @@ -383,287 +381,287 @@ class="inline" type="text" id="concept-name" - placeholder="{{ gettext('Jméno konceptu') }}" + placeholder="Jméno konceptu" autocomplete="off" required > - <button id="concept-save">{{ gettext('Uložit') }}</button> + <button id="concept-save">Uložit</button> <span id="concept-settings-wrapper" style="display:none"> - <button id="concept-delete">{{ gettext('Smazat') }}</button> + <button id="concept-delete">Smazat</button> </span> </div> <br> <small> - {{ gettext('Generátor s ♥ vytvořil ') }}<a href="https://toho.neocities.org" target="_blank" rel="nofollow">{{ gettext('Tomáš Valenta') }}</a> - {{ gettext(' pod svobodnou licencí ') }}<a href="https://www.gnu.org/licenses/agpl-3.0.en.html" target="_blank">{{ gettext('AGPLv3') }}</a>{{ gettext('.') }} + Generátor s ♥ vytvořil <a href="https://toho.neocities.org" target="_blank" rel="nofollow">Tomáš Valenta</a> + pod svobodnou licencí <a href="https://www.gnu.org/licenses/agpl-3.0.en.html" target="_blank">AGPLv3</a>. </small> </section> </div> <section class="controls-primary"> <section> - <h2>{{ gettext('Typ šablony') }}</h2> + <h2>Typ šablony</h2> <select id="template-selection"> <option data-image-source="static/images/examples/bottom-slogan.png" data-template-type="bottom-slogan" - >{{ gettext('Velký spodní slogan') }}</option> + >Velký spodní slogan</option> <option data-image-source="static/images/examples/bottom_slogan_full_width.png" data-template-type="bottom-slogan-full-width" - >{{ gettext('Velký spodní slogan, obdélník zabírající celou šířku') }}</option> + >Velký spodní slogan, obdélník zabírající celou šířku</option> <option data-image-source="static/images/examples/bottom-slogan-gradient.png" data-template-type="bottom-slogan-gradient" - >{{ gettext('Velký spodní slogan, gradient na pozadí') }}</option> + >Velký spodní slogan, gradient na pozadí</option> <option data-image-source="static/images/examples/bottom-slogan-person.png" data-template-type="bottom-slogan-person" - >{{ gettext('Velký spodní slogan, podobný nalodění') }}</option> + >Velký spodní slogan, podobný nalodění</option> <option data-image-source="static/images/examples/left-long-text.png" data-template-type="left-long-text" - >{{ gettext('Dlouhý text vlevo') }}</option> + >Dlouhý text vlevo</option> <option data-image-source="static/images/examples/right-long-text.png" data-template-type="right-long-text" - >{{ gettext('Dlouhý text vpravo') }}</option> + >Dlouhý text vpravo</option> <option data-image-source="static/images/examples/right-big-text.png" data-template-type="right-big-text" - >{{ gettext('Velký text vpravo') }}</option> + >Velký text vpravo</option> <option data-image-source="static/images/examples/left_corner_slogan.png" data-template-type="left-corner-slogan" - >{{ gettext('Slogan v levém rohu, možnost koláže') }}</option> + >Slogan v levém rohu, možnost koláže</option> <option data-image-source="static/images/examples/story_with_rectangle.png" data-template-type="story-with-rectangle" - >{{ gettext('Story - s obdélníkem') }}</option> + >Story - s obdélníkem</option> <option data-image-source="static/images/examples/story_full_width_rectangle.png" data-template-type="story-with-full-width-rectangle" - >{{ gettext('Story - obdélník zabírající celou šířku') }}</option> + >Story - obdélník zabírající celou šířku</option> <option data-image-source="static/images/examples/poll.png" data-template-type="poll" - >{{ gettext('Anketa') }}</option> + >Anketa</option> <option data-image-source="static/images/examples/cover.png" data-template-type="cover-static-name-and-logo" - >{{ gettext('Cover - pevné jméno a logo') }}</option> + >Cover - pevné jméno a logo</option> <option data-image-source="static/images/examples/cover-left.png" data-template-type="cover-static-name-and-logo-left" - >{{ gettext('Cover - pevné jméno a logo, obsah vlevo') }}</option> + >Cover - pevné jméno a logo, obsah vlevo</option> <option data-image-source="static/images/examples/cover.png" data-template-type="cover" - >{{ gettext('Cover') }}</option> + >Cover</option> <option data-image-source="static/images/examples/no_image_icon_text.png" data-template-type="no-image-icon-text" - >{{ gettext('Bez obrázku - ikona, text') }}</option> + >Bez obrázku - ikona, text</option> <option data-image-source="static/images/examples/no_image_text_more_info.png" data-template-type="no-image-text-more-info" - >{{ gettext('Bez obrázku - text, více informací') }}</option> + >Bez obrázku - text, více informací</option> <option data-image-source="static/images/examples/no_image_quote.png" data-template-type="no-image-quote" - >{{ gettext('Bez obrázku - citát') }}</option> + >Bez obrázku - citát</option> <option data-image-source="static/images/examples/no_image_big_text_and_icon.png" data-template-type="no-image-big-text-icon" - >{{ gettext('Bez obrázku - velký slogan, ikona') }}</option> + >Bez obrázku - velký slogan, ikona</option> <option data-image-source="static/images/examples/no_image_big_text_and_icon_with_terciary.png" data-template-type="no-image-big-text-icon-with-terciary" - >{{ gettext('Bez obrázku - velký slogan, ikona a delší spodní text') }}</option> + >Bez obrázku - velký slogan, ikona a delší spodní text</option> <option data-image-source="static/images/examples/poster_bottom_slogan.png" data-template-type="poster-bottom-slogan-printable" - >{{ gettext('NA TISK: Plakát - velký spodní slogan') }}</option> + >NA TISK: Plakát - velký spodní slogan</option> <option data-image-source="static/images/examples/poster_bottom_slogan_no_icon.png" data-template-type="poster-bottom-slogan-no-icon-printable" - >{{ gettext('NA TISK: Plakát - velký spodní slogan, bez ikony') }}</option> + >NA TISK: Plakát - velký spodní slogan, bez ikony</option> <option data-image-source="static/images/examples/poster_center_slogan_no_image.png" data-template-type="poster-center-slogan-no-image-printable" - >{{ gettext('NA TISK: Plakát - pouze velký slogan uprostřed, bez obrázku') }}</option> + >NA TISK: Plakát - pouze velký slogan uprostřed, bez obrázku</option> <option data-image-source="static/images/examples/poster_center_slogan_icons_no_image.png" data-template-type="poster-center-slogan-icons-no-image-printable" - >{{ gettext('NA TISK: Plakát - velký slogan a ikony, bez obrázku') }}</option> + >NA TISK: Plakát - velký slogan a ikony, bez obrázku</option> <option data-image-source="static/images/examples/poster_event.png" data-template-type="poster-event" - >{{ gettext('NA TISK: Plakát - událost') }}</option> + >NA TISK: Plakát - událost</option> <option data-image-source="static/images/examples/banner_name_left.png" data-template-type="banner-name-left" - >{{ gettext('Banner - jméno vlevo') }}</option> + >Banner - jméno vlevo</option> <option data-image-source="static/images/examples/banner_name_right.png" data-template-type="banner-name-right" - >{{ gettext('Banner - jméno vpravo') }}</option> + >Banner - jméno vpravo</option> <option data-image-source="static/images/examples/billboard.png" data-template-type="billboard" - >{{ gettext('Billboard') }}</option> + >Billboard</option> <option data-image-source="static/images/examples/event_text_right.png" data-template-type="event-text-right" - >{{ gettext('Událost - text vpravo') }}</option> + >Událost - text vpravo</option> <option data-image-source="static/images/examples/event_text_bottom.png" data-template-type="event-text-bottom" - >{{ gettext('Událost - text dole') }}</option> + >Událost - text dole</option> <option data-image-source="static/images/examples/eu_image_slogan.png" data-template-type="eu-image-slogan" - >{{ gettext('EU - obrázek + slogan') }}</option> + >EU - obrázek + slogan</option> <option data-image-source="static/images/examples/eu_image_long_text.png" data-template-type="eu-big-text-image" - >{{ gettext('EU - dlouhý text, možnost obrázku') }}</option> + >EU - dlouhý text, možnost obrázku</option> <option data-image-source="static/images/examples/eu_icons_image.png" data-template-type="eu-icons-image" - >{{ gettext('EU - text, ikony, možnost obrázku') }}</option> + >EU - text, ikony, možnost obrázku</option> <option data-image-source="static/images/examples/nalodeni.png" data-template-type="nalodeni" - >{{ gettext('Nalodění') }}</option> + >Nalodění</option> <option data-image-source="static/images/examples/nalodeni_story.png" data-template-type="nalodeni-story" - >{{ gettext('Nalodění - story') }}</option> + >Nalodění - story</option> <option data-image-source="static/images/examples/rollup_big_logo_short_text.png" data-template-type="rollup-big-logo-short-text" - >{{ gettext('Rollup - nutná lokalizace, velké pirátské logo, krátký text') }}</option> + >Rollup - nutná lokalizace, velké pirátské logo, krátký text</option> <option data-image-source="static/images/examples/rollup_points.png" data-template-type="rollup-points" - >{{ gettext('Rollup - nutná lokalizace, max. 5 bodů') }}</option> + >Rollup - nutná lokalizace, max. 5 bodů</option> <option data-image-source="static/images/examples/rollup_short_and_long_text.png" data-template-type="rollup-short-and-long-text" - >{{ gettext('Rollup - nutná lokalizace, krátký text a slogan') }}</option> + >Rollup - nutná lokalizace, krátký text a slogan</option> <option data-image-source="static/images/examples/koneckorupci.png" data-template-type="koneckorupci-poll" - >{{ gettext('Konec korupci - anketa') }}</option> + >Konec korupci - anketa</option> <option data-image-source="static/images/examples/humans.png" data-template-type="humans" - >{{ gettext('Humans of Piráti') }}</option> + >Humans of Piráti</option> <option data-image-source="static/images/examples/bottom-slogan-vertical-logo.png" data-template-type="bottom-slogan-vertical-logo" - >{{ gettext('Velký spodní slogan, vertikální logo') }}</option> + >Velký spodní slogan, vertikální logo</option> <option data-image-source="static/images/examples/bottom-slogan-gradient-vertical-logo.png" data-template-type="bottom-slogan-gradient-vertical-logo" - >{{ gettext('Velký spodní slogan, gradient na pozadí, vertikální logo') }}</option> + >Velký spodní slogan, gradient na pozadí, vertikální logo</option> <option data-image-source="static/images/examples/no-image-text-icon-vertical-logo.png" data-template-type="no-image-text-icon-vertical-logo" - >{{ gettext('Bez obrázku - text, ikona, vertikální logo') }}</option> + >Bez obrázku - text, ikona, vertikální logo</option> <option data-image-source="static/images/examples/pro-usti-poster.png" data-template-type="pro-usti-poster" - >{{ gettext('PRO! Ústí - plakát') }}</option> + >PRO! Ústí - plakát</option> <option data-image-source="static/images/examples/pro-usti-slogan-icon-bubble.png" data-template-type="pro-usti-slogan-icon-bubble" - >{{ gettext('PRO! Ústí - krátký slogan, ikona, bublina') }}</option> + >PRO! Ústí - krátký slogan, ikona, bublina</option> <option data-image-source="static/images/examples/pro-usti-slogan-bubble.png" data-template-type="pro-usti-slogan-bubble" - >{{ gettext('PRO! Ústí - krátký slogan, bublina') }}</option> + >PRO! Ústí - krátký slogan, bublina</option> <option data-image-source="static/images/examples/sticker-number.png" data-template-type="sticker-number" - >{{ gettext('Samolepka s číslem kandidátky') }}</option> + >Samolepka s číslem kandidátky</option> <option data-image-source="static/images/examples/poster_bottom_slogan.png" data-template-type="poster-bottom-slogan" - >{{ gettext('NETISKNOUT: Plakát - velký spodní slogan') }}</option> + >NETISKNOUT: Plakát - velký spodní slogan</option> <option data-image-source="static/images/examples/poster_bottom_slogan_no_icon.png" data-template-type="poster-bottom-slogan-no-icon" - >{{ gettext('NETISKNOUT: Plakát - velký spodní slogan, bez ikony') }}</option> + >NETISKNOUT: Plakát - velký spodní slogan, bez ikony</option> <option data-image-source="static/images/examples/poster_center_slogan_no_image.png" data-template-type="poster-center-slogan-no-image" - >{{ gettext('NETISKNOUT: Plakát - pouze velký slogan uprostřed, bez obrázku') }}</option> + >NETISKNOUT: Plakát - pouze velký slogan uprostřed, bez obrázku</option> <option data-image-source="static/images/examples/poster_center_slogan_icons_no_image.png" data-template-type="poster-center-slogan-icons-no-image" - >{{ gettext('NETISKNOUT: Plakát - velký slogan a ikony, bez obrázku') }}</option> + >NETISKNOUT: Plakát - velký slogan a ikony, bez obrázku</option> </select> <p id="template-description"></p> </section> - <h2>{{ gettext('Hlavní nastavení') }}</h2> + <h2>Hlavní nastavení</h2> <section id="5-point-set-wrapper"> - <h3>{{ gettext('Set pěti bodů') }}</h3> + <h3>Set pěti bodů</h3> <textarea id="5-point-set-text-1" - placeholder="{{ gettext('První bod') }}" + placeholder="První bod" ></textarea> <textarea id="5-point-set-text-2" - placeholder="{{ gettext('Druhý bod') }}" + placeholder="Druhý bod" ></textarea> <textarea id="5-point-set-text-3" - placeholder="{{ gettext('Třetí bod') }}" + placeholder="Třetí bod" ></textarea> <textarea id="5-point-set-text-4" - placeholder="{{ gettext('Čtvrtý bod') }}" + placeholder="Čtvrtý bod" ></textarea> <textarea id="5-point-set-text-5" - placeholder="{{ gettext('Pátý bod') }}" + placeholder="Pátý bod" ></textarea> </section> - <h3>{{ gettext('Text') }}</h3> + <h3>Text</h3> <small> - {{ gettext('Pro zvýraznění některých slov platí syntaxe: ') }}<tt>{{ gettext('*slovo*') }}</tt>{{ gettext('.') }}<br> - {{ gettext('Prosím, neplýtvej zvýrazňovačem a zvýrazni jen jedno slovo.') }} + Pro zvýraznění některých slov platí syntaxe: <tt>*slovo*</tt>.<br> + Prosím, neplýtvej zvýrazňovačem a zvýrazni jen jedno slovo. </small> <section id="primary-text-wrapper"> <textarea id="primary-text" - placeholder="{{ gettext('Primární text') }}" + placeholder="Primární text" ></textarea> </section> @@ -671,14 +669,14 @@ <input type="text" id="name-text" - placeholder="{{ gettext('Jméno') }}" + placeholder="Jméno" > </section> <section id="under-name-text-wrapper"> <textarea id="under-name-text" - placeholder="{{ gettext('Text pod jménem') }}" + placeholder="Text pod jménem" ></textarea> </section> @@ -686,28 +684,28 @@ <input type="text" id="secondary-name-text" - placeholder="{{ gettext('Jméno 2') }}" + placeholder="Jméno 2" > </section> <section id="secondary-under-name-text-wrapper"> <textarea id="secondary-under-name-text" - placeholder="{{ gettext('Text pod 2. jménem') }}" + placeholder="Text pod 2. jménem" ></textarea> </section> <section id="secondary-text-wrapper"> <textarea id="secondary-text" - placeholder="{{ gettext('Sekundární text') }}" + placeholder="Sekundární text" ></textarea> </section> <section id="terciary-text-wrapper"> <textarea id="terciary-text" - placeholder="{{ gettext('Terciární text') }}" + placeholder="Terciární text" ></textarea> </section> @@ -715,7 +713,7 @@ <input type="text" id="date-text" - placeholder="{{ gettext('Datum') }}" + placeholder="Datum" > </section> @@ -723,7 +721,7 @@ <input type="text" id="time-text" - placeholder="{{ gettext('Čas') }}" + placeholder="Čas" > </section> @@ -731,14 +729,14 @@ <input type="text" id="location-text" - placeholder="{{ gettext('Místo') }}" + placeholder="Místo" > </section> <section id="icon-text-wrapper"> <textarea id="icon-text" - placeholder="{{ gettext('Text vedle ikony, bez ikony vyplňuje její prostor') }}" + placeholder="Text vedle ikony, bez ikony vyplňuje její prostor" ></textarea> </section> @@ -750,7 +748,7 @@ id="show-requester" name="show-requester" > - <label for="show-requester">{{ gettext('Zobrazit zadavatele a zpracovatele') }}</label> + <label for="show-requester">Zobrazit zadavatele a zpracovatele</label> <br> @@ -758,8 +756,8 @@ style="display:none" type="text" id="requester-text" - placeholder="{{ gettext('Zadavatel a zpracovatel') }}" - value="{{ gettext('Zadavatel a zpracovatel: Piráti') }}" + placeholder="Zadavatel a zpracovatel" + value="Zadavatel a zpracovatel: Piráti" > </section> @@ -770,237 +768,237 @@ name="show-gradient" checked > - <label for="show-gradient">{{ gettext('Zobrazit gradient') }}</label> + <label for="show-gradient">Zobrazit gradient</label> </section> <section id="primary-image-wrapper"> - <h3>{{ gettext('Hlavní obrázek') }}</h3> + <h3>Hlavní obrázek</h3> <input type="file" accept="image/*" id="primary-image" name="primary-image"> <section id="additional-3-primary-images-wrapper"> - <h4>{{ gettext('Vedlejší obrázky do koláže') }}</h4> + <h4>Vedlejší obrázky do koláže</h4> <input type="file" accept="image/*" id="additional-primary-image-0" name="additional-primary-image-0"> - <button id="reset-additional-primary-image-0">{{ gettext('Resetovat') }}</button> + <button id="reset-additional-primary-image-0">Resetovat</button> <input type="file" accept="image/*" id="additional-primary-image-1" name="additional-primary-image-1"> - <button id="reset-additional-primary-image-1">{{ gettext('Resetovat') }}</button> + <button id="reset-additional-primary-image-1">Resetovat</button> <input type="file" accept="image/*" id="additional-primary-image-2" name="additional-primary-image-2"> - <button id="reset-additional-primary-image-2">{{ gettext('Resetovat') }}</button> + <button id="reset-additional-primary-image-2">Resetovat</button> </section> </section> <section id="secondary-image-wrapper"> - <h3>{{ gettext('Sekundární obrázek') }}</h3> + <h3>Sekundární obrázek</h3> <input type="file" accept="image/*" id="secondary-image" name="secondary-image"> </section> <section id="2-reaction-set-wrapper"> - <h3>{{ gettext('Reakce') }}</h3> + <h3>Reakce</h3> - <h4>{{ gettext('Vlevo') }}</h4> + <h4>Vlevo</h4> <select id="2-reaction-set-image-1-selection"> - <option>{{ gettext('Žádná reakce') }}</option> + <option>Žádná reakce</option> <option data-image-source="{{ url_for('static', filename='images/reactions/like.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/like.png') }}" - >{{ gettext('Like') }}</option> + >Like</option> <option data-image-source="{{ url_for('static', filename='images/reactions/laugh.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/laugh.png') }}" - >{{ gettext('Smích') }}</option> + >Smích</option> <option data-image-source="{{ url_for('static', filename='images/reactions/heart.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/heart.png') }}" - >{{ gettext('Srdce') }}</option> + >Srdce</option> <option data-image-source="{{ url_for('static', filename='images/reactions/angry.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/angry.png') }}" - >{{ gettext('Naštvaný') }}</option> + >Naštvaný</option> <option data-image-source="{{ url_for('static', filename='images/reactions/sad.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/sad.png') }}" - >{{ gettext('Smutný') }}</option> + >Smutný</option> <option data-image-source="{{ url_for('static', filename='images/reactions/surprised.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/surprised.png') }}" - >{{ gettext('Překvapený') }}</option> + >Překvapený</option> <option data-image-source="{{ url_for('static', filename='images/reactions/care.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/care.png') }}" - >{{ gettext('Péče') }}</option> + >Péče</option> </select> <textarea id="2-reaction-set-text-1" type="text" - placeholder="{{ gettext('Text') }}" + placeholder="Text" ></textarea> - <h4>{{ gettext('Vpravo') }}</h4> + <h4>Vpravo</h4> <select id="2-reaction-set-image-2-selection"> - <option>{{ gettext('Žádná reakce') }}</option> + <option>Žádná reakce</option> <option data-image-source="{{ url_for('static', filename='images/reactions/like.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/like.png') }}" - >{{ gettext('Like') }}</option> + >Like</option> <option data-image-source="{{ url_for('static', filename='images/reactions/laugh.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/laugh.png') }}" - >{{ gettext('Smích') }}</option> + >Smích</option> <option data-image-source="{{ url_for('static', filename='images/reactions/heart.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/heart.png') }}" - >{{ gettext('Srdce') }}</option> + >Srdce</option> <option data-image-source="{{ url_for('static', filename='images/reactions/angry.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/angry.png') }}" - >{{ gettext('Naštvaný') }}</option> + >Naštvaný</option> <option data-image-source="{{ url_for('static', filename='images/reactions/sad.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/sad.png') }}" - >{{ gettext('Smutný') }}</option> + >Smutný</option> <option data-image-source="{{ url_for('static', filename='images/reactions/surprised.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/surprised.png') }}" - >{{ gettext('Překvapený') }}</option> + >Překvapený</option> <option data-image-source="{{ url_for('static', filename='images/reactions/care.png') }}" data-image-reaction-source="{{ url_for('static', filename='images/reactions/care.png') }}" - >{{ gettext('Péče') }}</option> + >Péče</option> </select> <textarea id="2-reaction-set-text-2" type="text" - placeholder="{{ gettext('Text') }}" + placeholder="Text" ></textarea> </section> <section id="4-icon-group-wrapper"> - <h3>{{ gettext('Set čtyřech ikon') }}</h3> + <h3>Set čtyřech ikon</h3> - <h4>{{ gettext('První ikona') }}</h4> + <h4>První ikona</h4> <select id="4-icon-group-image-1-selection" class="icon-selection"></select> <textarea id="4-icon-group-text-1" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> - <h4>{{ gettext('Druhá ikona') }}</h4> + <h4>Druhá ikona</h4> <select id="4-icon-group-image-2-selection" class="icon-selection"></select> <textarea id="4-icon-group-text-2" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> - <h4>{{ gettext('Třetí ikona') }}</h4> + <h4>Třetí ikona</h4> <select id="4-icon-group-image-3-selection" class="icon-selection"></select> <textarea id="4-icon-group-text-3" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> - <h4>{{ gettext('Čtvrtá ikona') }}</h4> + <h4>Čtvrtá ikona</h4> <select id="4-icon-group-image-4-selection" class="icon-selection"></select> <textarea id="4-icon-group-text-4" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> </section> <section id="5-icon-group-wrapper"> - <h3>{{ gettext('Set pěti ikon') }}</h3> + <h3>Set pěti ikon</h3> - <h4>{{ gettext('První ikona') }}</h4> + <h4>První ikona</h4> <select id="5-icon-group-image-1-selection" class="icon-selection"></select> <textarea id="5-icon-group-text-1" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> - <h4>{{ gettext('Druhá ikona') }}</h4> + <h4>Druhá ikona</h4> <select id="5-icon-group-image-2-selection" class="icon-selection"></select> <textarea id="5-icon-group-text-2" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> - <h4>{{ gettext('Třetí ikona') }}</h4> + <h4>Třetí ikona</h4> <select id="5-icon-group-image-3-selection" class="icon-selection"></select> <textarea id="5-icon-group-text-3" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> - <h4>{{ gettext('Čtvrtá ikona') }}</h4> + <h4>Čtvrtá ikona</h4> <select id="5-icon-group-image-4-selection" class="icon-selection"></select> <textarea id="5-icon-group-text-4" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> - <h4>{{ gettext('Pátá ikona') }}</h4> + <h4>Pátá ikona</h4> <select id="5-icon-group-image-5-selection" class="icon-selection"></select> <textarea id="5-icon-group-text-5" rows="2" - placeholder="{{ gettext('Text vedle ikony') }}" + placeholder="Text vedle ikony" ></textarea> </section> <section id="icon-image-wrapper"> - <h3>{{ gettext('Ikony') }}</h3> + <h3>Ikony</h3> - <small>{{ gettext('(Vyhledávání podle textu je možné)') }}</small><br> + <small>(Vyhledávání podle textu je možné)</small><br> <select id="icon-image-selection" class="icon-selection"></select> <br><br> <b> - {{ gettext('Nebo nahraj vlastní: ') }} + Nebo nahraj vlastní: <input type="file" id="icon-image-input"> </b> - <button id="icon-image-reset">{{ gettext('Resetovat') }}</button> + <button id="icon-image-reset">Resetovat</button> </section> <section id="pro-usti-icon-image-wrapper"> - <h3>{{ gettext('PRO! Ústí - Ikona') }}</h3> + <h3>PRO! Ústí - Ikona</h3> - <small>{{ gettext('(Vyhledávání podle textu je možné)') }}</small><br> + <small>(Vyhledávání podle textu je možné)</small><br> <select id="pro-usti-icon-image-selection"> <option @@ -1037,20 +1035,20 @@ <br><br> <b> - {{ gettext('Nebo nahraj vlastní: ') }} + Nebo nahraj vlastní: <input type="file" id="pro-usti-icon-image-input"> </b> - <button id="pro-usti-icon-image-reset">{{ gettext('Resetovat') }}</button> + <button id="pro-usti-icon-image-reset">Resetovat</button> </section> <section id="location-image-wrapper"> - <h3>{{ gettext('Lokalizace') }}</h3> + <h3>Lokalizace</h3> - <small>{{ gettext('(Vyhledávání podle textu je možné)') }}</small><br> + <small>(Vyhledávání podle textu je možné)</small><br> <select id="location-image-selection"> - <option>{{ gettext('Žádná lokalizace') }}</option> + <option>Žádná lokalizace</option> <option data-image-source="{{ url_for('static', filename='images/locations/Benesov-1-dark.png') }}" data-image-location-source="{{ url_for('static', filename='images/locations/Benesov-1.png') }}" @@ -1575,65 +1573,65 @@ name="location-to-top" id="location-to-top" > - <label for="location-to-top">{{ gettext('Zobrazit nahoře') }}</label> + <label for="location-to-top">Zobrazit nahoře</label> </section> </section> <section id="qr-code-wrapper"> - <h3>{{ gettext('QR kód') }}</h3> + <h3>QR kód</h3> <input type="text" id="qr-code-source" - placeholder="{{ gettext('Adresa stránek') }}" + placeholder="Adresa stránek" > </section> <section id="selectable-rollup-background-wrapper"> - <h3>{{ gettext('Pozadí rollupu') }}</h3> + <h3>Pozadí rollupu</h3> <select id="selectable-rollup-background"> <option data-image-source="{{ url_for('static', filename='images/scroll-backgrounds/prerov-dark.png') }}" data-color-scheme="white-on-black-prerov" - >{{ gettext("Přerov - tmavé pozadí") }}</option> + >Přerov - tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/scroll-backgrounds/prerov-light.png') }}" data-color-scheme="black-on-white-prerov" - >{{ gettext("Přerov - světlé pozadí") }}</option> + >Přerov - světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/scroll-backgrounds/pardubice-dark.png') }}" data-color-scheme="white-on-black-pardubice" - >{{ gettext("Pardubice - tmavé pozadí") }}</option> + >Pardubice - tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/scroll-backgrounds/pardubice-light.png') }}" data-color-scheme="black-on-white-pardubice" - >{{ gettext("Pardubice - světlé pozadí") }}</option> + >Pardubice - světlé pozadí</option> </select> </section> </section> <section class="controls-secondary"> <section id="primary-image-position-wrapper-lower"> - <h2>{{ gettext('Detaily') }}</h2> - <h3>{{ gettext('Hlavní obrázek') }}</h3> - <b>{{ gettext('Pozice: ') }} + <h2>Detaily</h2> + <h3>Hlavní obrázek</h3> + <b>Pozice: <button class="move-primary-image-left">←</button> <button class="move-primary-image-up">↑</button> <button class="move-primary-image-right">→</button> <button class="move-primary-image-down">↓</button> - <button class="move-primary-image-reset">{{ gettext("Reset") }}</button> + <button class="move-primary-image-reset">Reset</button> <br> - <small>{{ gettext('(Také možno změnit tažením obrázku)') }}</small> + <small>(Také možno změnit tažením obrázku)</small> </b> <br> <b> - {{ gettext('Přiblížení: ') }} + Přiblížení: <input type="range" @@ -1643,34 +1641,34 @@ class="zoom-primary-image-input slider" autocomplete="off" > - <button class="zoom-primary-image-reset">{{ gettext("Reset") }}</button> + <button class="zoom-primary-image-reset">Reset</button> </b> </section> <section id="logo-image-wrapper"> - <h3>{{ gettext('Logo') }}</h3> + <h3>Logo</h3> <div id="logo-is-center-wrapper"> <input type="checkbox" id="logo-is-center" name="logo-is-center"> - <label for="logo-is-center">{{ gettext("Na střed") }}</label> + <label for="logo-is-center">Na střed</label> <br><br> </div> <div id="logo-additional-image-wrapper"> <label for="logo-additional-image"> - <b>{{ gettext('Prosím, nepoužívej jiné varianty pirátského loga! U svého vlastního pamatuj na průhledné pozadí.') }}</b><br> - {{ gettext('Přidat vlastní: ') }} + <b>Prosím, nepoužívej jiné varianty pirátského loga! U svého vlastního pamatuj na průhledné pozadí.</b><br> + Přidat vlastní: </label> <input type="file" accept="image/*" id="logo-additional-image" name="logo-additional-image"> <br> - <button id="logo-additional-image-reset">{{ gettext("Resetovat") }}</button> + <button id="logo-additional-image-reset">Resetovat</button> </div> <div id="logo-size-wrapper"> - <label for="logo-image-zoom"><b>{{ gettext('Velikost loga:') }}</b></label> + <label for="logo-image-zoom"><b>Velikost loga:</b></label> <input type="range" @@ -1682,21 +1680,21 @@ class="slider" autocomplete="off" > - <button id="logo-image-zoom-reset">{{ gettext("Reset") }}</button> + <button id="logo-image-zoom-reset">Reset</button> </div> </section> <section id="background-has-pattern-wrapper"> - <h3>{{ gettext('Vzor na pozadí') }}</h3> + <h3>Vzor na pozadí</h3> <input type="checkbox" id="background-has-pattern" name="background-has-pattern"> - <label for="background-has-pattern" checked>{{ gettext("Zobrazit") }}</label> + <label for="background-has-pattern" checked>Zobrazit</label> </section> - <h3>{{ gettext('Nastavení barev') }}</h3> + <h3>Nastavení barev</h3> <section id="pro-usti-color-scheme-wrapper"> - <h4>{{ gettext('Barvy PRO! Ústí') }}</h4> + <h4>Barvy PRO! Ústí</h4> <select id="pro-usti-color-scheme-selection"> <option @@ -1728,436 +1726,436 @@ <section id="primary-color-scheme-wrapper"> <section id="coalition-wrapper"> - <h4>{{ gettext('Podle koalice') }}</h4> + <h4>Podle koalice</h4> <select id="coalition-selection"> - <option>{{ gettext('Žádná koalice') }}</option> + <option>Žádná koalice</option> <option data-image-source="{{ url_for('static', filename='images/examples/forum_jihlava_purple_dark.png') }}" data-coalition="forum-jihlava-purple-dark" - >{{ gettext('Piráti a Fórum Jihlava - fialové barvy, tmavé pozadí') }}</option> + >Piráti a Fórum Jihlava - fialové barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/forum_jihlava_purple_light.png') }}" data-coalition="forum-jihlava-purple-light" - >{{ gettext('Piráti a Fórum Jihlava - fialové barvy, světlé pozadí') }}</option> + >Piráti a Fórum Jihlava - fialové barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/forum_jihlava.png') }}" data-coalition="forum-jihlava-dark" - >{{ gettext('Piráti a Fórum Jihlava - původní barvy') }}</option> + >Piráti a Fórum Jihlava - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_most_green_dark.png') }}" data-coalition="zeleni-most-green-dark" - >{{ gettext('Piráti a Zelení pro Most - zelené barvy, tmavé pozadí') }}</option> + >Piráti a Zelení pro Most - zelené barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_most_green_light.png') }}" data-coalition="zeleni-most-green-light" - >{{ gettext('Piráti a Zelení pro Most - zelené barvy, světlé pozadí') }}</option> + >Piráti a Zelení pro Most - zelené barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_most.png') }}" data-coalition="zeleni-most-dark" - >{{ gettext('Piráti a Zelení pro Most - původní barvy') }}</option> + >Piráti a Zelení pro Most - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_praha14_green_dark.png') }}" data-coalition="zeleni-praha14-green-dark" - >{{ gettext('Piráti, Nezávislí a Zelení, Praha 14 - zelené barvy, tmavé pozadí') }}</option> + >Piráti, Nezávislí a Zelení, Praha 14 - zelené barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_praha14_green_light.png') }}" data-coalition="zeleni-praha14-green-light" - >{{ gettext('Piráti, Nezávislí a Zelení, Praha 14 - zelené barvy, světlé pozadí') }}</option> + >Piráti, Nezávislí a Zelení, Praha 14 - zelené barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni14_praha.png') }}" data-coalition="zeleni-praha14-dark" - >{{ gettext('Piráti, Nezávislí a Zelení, Praha 14 - původní barvy') }}</option> + >Piráti, Nezávislí a Zelení, Praha 14 - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_praha13_green_dark.png') }}" data-coalition="zeleni-praha13-green-dark" - >{{ gettext('Piráti a Zelení, Praha 13 - zelené barvy, tmavé pozadí') }}</option> + >Piráti a Zelení, Praha 13 - zelené barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_praha13_green_light.png') }}" data-coalition="zeleni-praha13-green-light" - >{{ gettext('Piráti a Zelení, Praha 13 - zelené barvy, světlé pozadí') }}</option> + >Piráti a Zelení, Praha 13 - zelené barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/zeleni_praha13.png') }}" data-coalition="zeleni-praha13-dark" - >{{ gettext('Piráti a Zelení, Praha 13 - původní barvy') }}</option> + >Piráti a Zelení, Praha 13 - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/volary_green_dark.png') }}" data-coalition="volary-green-dark" - >{{ gettext('Odvážně pro Volary - zelené barvy, tmavé pozadí') }}</option> + >Odvážně pro Volary - zelené barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/volary_green_light.png') }}" data-coalition="volary-green-light" - >{{ gettext('Odvážně pro Volary - zelené barvy, světlé pozadí') }}</option> + >Odvážně pro Volary - zelené barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/volary.png') }}" data-coalition="volary-dark" - >{{ gettext('Odvážně pro Volary - původní barvy') }}</option> + >Odvážně pro Volary - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/louny_spolecne_purple_dark.png') }}" data-coalition="louny-spolecne-purple-dark" - >{{ gettext('Louny Společně - fialové barvy, tmavé pozadí') }}</option> + >Louny Společně - fialové barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/louny_spolecne_purple_light.png') }}" data-coalition="louny-spolecne-purple-light" - >{{ gettext('Louny Společně - fialové barvy, světlé pozadí') }}</option> + >Louny Společně - fialové barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/louny_spolecne.png') }}" data-coalition="spolecne-s-piraty-dark" - >{{ gettext('Louny Společně - původní barvy') }}</option> + >Louny Společně - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/vice_litomerice_blue_dark.png') }}" data-coalition="vice-litomerice-blue-dark" - >{{ gettext('Více pro Litoměřice - modré barvy, tmavé pozadí') }}</option> + >Více pro Litoměřice - modré barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/vice_litomerice_blue_light.png') }}" data-coalition="vice-litomerice-blue-light" - >{{ gettext('Více pro Litoměřice - modré barvy, světlé pozadí') }}</option> + >Více pro Litoměřice - modré barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/vice_litomerice.png') }}" data-coalition="vice-litomerice-dark" - >{{ gettext('Více pro Litoměřice - původní barvy') }}</option> + >Více pro Litoměřice - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/stranane_yellow_white.png') }}" data-coalition="stranane-yellow-white" - >{{ gettext('Straňané - žlutá na bílé') }}</option> + >Straňané - žlutá na bílé</option> <option data-image-source="{{ url_for('static', filename='images/examples/stranane_white_yellow.png') }}" data-coalition="stranane-white-yellow" - >{{ gettext('Straňané - bílá na žluté') }}</option> + >Straňané - bílá na žluté</option> <option data-image-source="{{ url_for('static', filename='images/examples/stranane_gray_yellow.png') }}" data-coalition="stranane-gray-yellow" - >{{ gettext('Straňané - šedá na žluté') }}</option> + >Straňané - šedá na žluté</option> <option data-image-source="{{ url_for('static', filename='images/examples/stranane_base.png') }}" data-coalition="stranane-base" - >{{ gettext('Straňané - původní barvy') }}</option> + >Straňané - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/prusanky_yellow_white.png') }}" data-coalition="prusanky-yellow-white" - >{{ gettext('Mladí pro Prušánky - žlutá na bílé') }}</option> + >Mladí pro Prušánky - žlutá na bílé</option> <option data-image-source="{{ url_for('static', filename='images/examples/prusanky_white_yellow.png') }}" data-coalition="prusanky-white-yellow" - >{{ gettext('Mladí pro Prušánky - bílá na žluté') }}</option> + >Mladí pro Prušánky - bílá na žluté</option> <option data-image-source="{{ url_for('static', filename='images/examples/prusanky_black_yellow.png') }}" data-coalition="prusanky-black-yellow" - >{{ gettext('Mladí pro Prušánky - černá na žluté') }}</option> + >Mladí pro Prušánky - černá na žluté</option> <option data-image-source="{{ url_for('static', filename='images/examples/prusanky_base.png') }}" data-coalition="prusanky-base" - >{{ gettext('Mladí pro Prušánky - původní barvy') }}</option> + >Mladí pro Prušánky - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/ujezd_white_green.png') }}" data-coalition="ujezd-white-green" - >{{ gettext('Újezd Žije - bílá na zelené') }}</option> + >Újezd Žije - bílá na zelené</option> <option data-image-source="{{ url_for('static', filename='images/examples/ujezd_green_white.png') }}" data-coalition="ujezd-green-white" - >{{ gettext('Újezd Žije - zelená na bílé') }}</option> + >Újezd Žije - zelená na bílé</option> <option data-image-source="{{ url_for('static', filename='images/examples/ujezd_base.png') }}" data-coalition="ujezd-base" - >{{ gettext('Újezd Žije - původní barvy') }}</option> + >Újezd Žije - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/cssd_black_red.png') }}" data-coalition="cssd-rychnov-black-red" - >{{ gettext('Piráti a ČSSD Rychnov - černá na červené') }}</option> + >Piráti a ČSSD Rychnov - černá na červené</option> <option data-image-source="{{ url_for('static', filename='images/examples/cssd_red_black.png') }}" data-coalition="cssd-rychnov-red-black" - >{{ gettext('Piráti a ČSSD Rychnov - červená na černé') }}</option> + >Piráti a ČSSD Rychnov - červená na černé</option> <option data-image-source="{{ url_for('static', filename='images/examples/cssd_base.png') }}" data-coalition="cssd-rychnov-base" - >{{ gettext('Piráti a ČSSD Rychnov - původní barvy') }}</option> + >Piráti a ČSSD Rychnov - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/jilemnice_purple_black.png') }}" data-coalition="jilemnice-black-purple" - >{{ gettext('Jílemnice Budoucnosti - černá na fialové') }}</option> + >Jílemnice Budoucnosti - černá na fialové</option> <option data-image-source="{{ url_for('static', filename='images/examples/jilemnice_black_purple.png') }}" data-coalition="jilemnice-purple-black" - >{{ gettext('Jílemnice Budoucnosti - fialová na černé') }}</option> + >Jílemnice Budoucnosti - fialová na černé</option> <option data-image-source="{{ url_for('static', filename='images/examples/jilemnice_base.png') }}" data-coalition="jilemnice-base" - >{{ gettext('Jílemnice Budoucnosti - původní barvy') }}</option> + >Jílemnice Budoucnosti - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/novarole_white_green.png') }}" data-coalition="novarole-white-green" - >{{ gettext('Novorolští Piráti - bílá na zelené') }}</option> + >Novorolští Piráti - bílá na zelené</option> <option data-image-source="{{ url_for('static', filename='images/examples/novarole_green_white.png') }}" data-coalition="novarole-green-white" - >{{ gettext('Novorolští Piráti - zelená na bílé') }}</option> + >Novorolští Piráti - zelená na bílé</option> <option data-image-source="{{ url_for('static', filename='images/examples/novarole_green_black.png') }}" data-coalition="novarole-green-black" - >{{ gettext('Novorolští Piráti - zelená na černé') }}</option> + >Novorolští Piráti - zelená na černé</option> <option data-image-source="{{ url_for('static', filename='images/examples/novarole_base.png') }}" data-coalition="novarole-base" - >{{ gettext('Novorolští Piráti - původní barvy') }}</option> + >Novorolští Piráti - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/pirati_spolecne_blue_dark.png') }}" data-coalition="spolecne-s-piraty-blue-dark" - >{{ gettext('Společně s Piráty - modré barvy, tmavé pozadí') }}</option> + >Společně s Piráty - modré barvy, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/pirati_spolecne_blue_light.png') }}" data-coalition="spolecne-s-piraty-blue-light" - >{{ gettext('Společně s Piráty - modré barvy, světlé pozadí') }}</option> + >Společně s Piráty - modré barvy, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/pirati_spolecne.png') }}" data-coalition="spolecne-s-piraty-dark" - >{{ gettext('Společně s Piráty - původní barvy') }}</option> + >Společně s Piráty - původní barvy</option> <option data-image-source="{{ url_for('static', filename='images/examples/nezavisli_light.png') }}" data-coalition="nezavisli-light" - >{{ gettext('Piráti a Nezávislí kandidáti, světlé pozadí') }}</option> + >Piráti a Nezávislí kandidáti, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/nezavisli_dark.png') }}" data-coalition="nezavisli-dark" - >{{ gettext('Piráti a Nezávislí kandidáti, tmavé pozadí') }}</option> + >Piráti a Nezávislí kandidáti, tmavé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/dana_balcarova_light.png') }}" data-coalition="balcarova-light" - >{{ gettext('Dana Balcarová - fialové logo, světlé pozadí') }}</option> + >Dana Balcarová - fialové logo, světlé pozadí</option> <option data-image-source="{{ url_for('static', filename='images/examples/dana_balcarova_dark.png') }}" data-coalition="balcarova-dark" - >{{ gettext('Dana Balcarová - fialové logo, tmavé pozadí') }}</option> + >Dana Balcarová - fialové logo, tmavé pozadí</option> </select> <section id="litomerice-corner" style="display:none"> - <h4>{{ gettext("Typ rohu") }}</h4> + <h4>Typ rohu</h4> <select id="litomerice-corner-type-selection"> - <option value="none">{{ gettext('Žádný roh') }}</option> + <option value="none">Žádný roh</option> - <option value="#000000">{{ gettext('Piráti - černá') }}</option> - <option value="#a22de6">{{ gettext('TOP 09 - fialová') }}</option> - <option value="#ffe05d">{{ gettext('KDU-ČSL - žlutá') }}</option> - <option value="#94da58">{{ gettext('Zelení - zelená') }}</option> + <option value="#000000">Piráti - černá</option> + <option value="#a22de6">TOP 09 - fialová</option> + <option value="#ffe05d">KDU-ČSL - žlutá</option> + <option value="#94da58">Zelení - zelená</option> </select> </section> </section> - <h4>{{ gettext('Hlavní barvy') }}</h4> + <h4>Hlavní barvy</h4> <select id="primary-color-scheme-selection"> <option data-image-source="{{ url_for('static', filename='images/black-on-white.png') }}" data-color-scheme="black-on-white" - >{{ gettext('Černý text na bílém pozadí') }}</option> + >Černý text na bílém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/white-on-black.png') }}" data-color-scheme="white-on-black" - >{{ gettext('Bílý text na černém pozadí') }}</option> + >Bílý text na černém pozadí</option> </select> </section> <section id="name-color-scheme-wrapper"> - <h4>{{ gettext('Barvy boxu se jménem') }}</h4> + <h4>Barvy boxu se jménem</h4> <select id="name-color-scheme-selection"> <option data-image-source="{{ url_for('static', filename='images/white-on-black.png') }}" data-color-scheme="white-on-black" value="white-on-black" - >{{ gettext('Bílý text na černém pozadí') }}</option> + >Bílý text na černém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-white.png') }}" data-color-scheme="black-on-white" value="black-on-white" - >{{ gettext('Černý text na bílém pozadí') }}</option> + >Černý text na bílém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-gold.png') }}" data-color-scheme="black-on-gold" value="black-on-gold" - >{{ gettext('Černý text na zlatém pozadí') }}</option> + >Černý text na zlatém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-blue.png') }}" data-color-scheme="black-on-blue" value="black-on-blue" - >{{ gettext('Černý text na modrém pozadí') }}</option> + >Černý text na modrém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-gray.png') }}" data-color-scheme="black-on-gray" value="black-on-gray" - >{{ gettext('Černý text na šedém pozadí') }}</option> + >Černý text na šedém pozadí</option> </select> </section> <section id="secondary-color-scheme-wrapper"> - <h4>{{ gettext('Barvy boxu se sekundárním textem') }}</h4> + <h4>Barvy boxu se sekundárním textem</h4> <select id="secondary-color-scheme-selection"> <option data-image-source="{{ url_for('static', filename='images/black-on-gray.png') }}" data-color-scheme="black-on-gray" value="black-on-gray" - >{{ gettext('Černý text na šedém pozadí') }}</option> + >Černý text na šedém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/white-on-black.png') }}" data-color-scheme="white-on-black" value="white-on-black" - >{{ gettext('Bílý text na černém pozadí') }}</option> + >Bílý text na černém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-white.png') }}" data-color-scheme="black-on-white" value="black-on-white" - >{{ gettext('Černý text na bílém pozadí') }}</option> + >Černý text na bílém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-blue.png') }}" data-color-scheme="black-on-blue" value="black-on-blue" - >{{ gettext('Černý text na modrém pozadí') }}</option> + >Černý text na modrém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-gold.png') }}" data-color-scheme="black-on-gold" value="black-on-gold" - >{{ gettext('Černý text na zlatém pozadí') }}</option> + >Černý text na zlatém pozadí</option> </select> </section> <section id="terciary-color-scheme-wrapper"> - <h4>{{ gettext('Barvy boxu s terciárním textem') }}</h4> + <h4>Barvy boxu s terciárním textem</h4> <select id="terciary-color-scheme-selection"> <option data-image-source="{{ url_for('static', filename='images/white-on-black.png') }}" data-color-scheme="white-on-black" value="white-on-black" - >{{ gettext('Bílý text na černém pozadí') }}</option> + >Bílý text na černém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-white.png') }}" data-color-scheme="black-on-white" value="black-on-white" - >{{ gettext('Černý text na bílém pozadí') }}</option> + >Černý text na bílém pozadí</option> <option data-image-source="{{ url_for('static', filename='images/black-on-gold.png') }}" data-color-scheme="black-on-gold" value="black-on-gold" - >{{ gettext('Černý text na zlatém pozadí') }}</option> + >Černý text na zlatém pozadí</option> </select> </section> <section id="color-palette-wrapper"> - <h4>{{ gettext('Paleta - vlastní barvy') }}</h4> + <h4>Paleta - vlastní barvy</h4> <div id="primary-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Primární text') }} + Primární text <select class="colorPickSelector" id="primary-text-color"></select> </div> <div id="icon-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Text u ikon') }} + Text u ikon <select class="colorPickSelector" id="icon-text-color"></select> </div> <div id="background-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Pozadí') }} + Pozadí <select class="colorPickSelector" id="background-color"></select> </div> <div id="foreground-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Popředí') }} + Popředí <select class="colorPickSelector" id="foreground-color"></select> </div> <div id="background-gradient-color1-wrapper" class="color-picker-wrapper"> - {{ gettext('První barva gradientu na pozadí') }} + První barva gradientu na pozadí <select class="colorPickSelector" id="background-gradient-color1"></select> </div> <div id="background-gradient-color2-wrapper" class="color-picker-wrapper"> - {{ gettext('Druhá barva gradientu na pozadí') }} + Druhá barva gradientu na pozadí <select class="colorPickSelector" id="background-gradient-color2"></select> </div> <div id="name-background-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Pozadí jména') }} + Pozadí jména <select class="colorPickSelector" id="name-background-color"></select> </div> <div id="name-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Jméno') }} + Jméno <select class="colorPickSelector" id="name-text-color"></select> </div> <div id="under-name-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Text pod jménem') }} + Text pod jménem <select class="colorPickSelector" id="under-name-text-color"></select> </div> <div id="secondary-text-background-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Pozadí sekundárního textu') }} + Pozadí sekundárního textu <select class="colorPickSelector" id="secondary-text-background-color"></select> </div> <div id="secondary-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Sekundární text') }} + Sekundární text <select class="colorPickSelector" id="secondary-text-color"></select> </div> <div id="terciary-text-background-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Pozadí terciárního textu') }} + Pozadí terciárního textu <select class="colorPickSelector" id="terciary-text-background-color"></select> </div> <div id="terciary-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Terciární text') }} + Terciární text <select class="colorPickSelector" id="terciary-text-color"></select> </div> <div id="primary-text-highlight-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Zvýraznění primárního textu') }} + Zvýraznění primárního textu <select class="colorPickSelector" id="primary-text-highlight-color"></select> </div> <div id="secondary-text-highlight-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Zvýraznění sekundárního textu') }} + Zvýraznění sekundárního textu <select class="colorPickSelector" id="secondary-text-highlight-color"></select> </div> <div id="reaction-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Text u reakcí') }} + Text u reakcí <select class="colorPickSelector" id="reaction-text-color"></select> </div> <div id="qr-code-color-wrapper" class="color-picker-wrapper"> - {{ gettext('QR Kód') }} + QR Kód <select class="colorPickSelector" id="qr-code-color"></select> </div> <div id="quote-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Uvozovky') }} + Uvozovky <select class="colorPickSelector" id="quote-color"></select> </div> <div id="requester-text-color-wrapper" class="color-picker-wrapper"> - {{ gettext('Zadavatel a zpracovatel') }} + Zadavatel a zpracovatel <select class="colorPickSelector" id="requester-text-color"></select> </div> </section> - <h3>{{ gettext('Pokročilé nastavení') }}</h3> + <h3>Pokročilé nastavení</h3> <input type="number" id="resolution" - placeholder="{{ gettext('Rozlišení, v pixelech - běžně 2000') }}" + placeholder="Rozlišení, v pixelech - běžně 2000" > </section> </main> diff --git a/generator/views/concept.py b/generator/views/concept.py index fbbb8f2b..bf3e63da 100644 --- a/generator/views/concept.py +++ b/generator/views/concept.py @@ -7,7 +7,6 @@ import uuid import werkzeug.exceptions import flask -import flask_httpauth import sqlalchemy from .. import authentication, database diff --git a/generator/views/generator.py b/generator/views/generator.py index 5a790e6d..7c40b7bd 100644 --- a/generator/views/generator.py +++ b/generator/views/generator.py @@ -5,7 +5,6 @@ import typing import werkzeug.exceptions import flask -import flask_httpauth from .. import authentication @@ -20,16 +19,8 @@ generator_blueprint = flask.Blueprint( __name__ ) -auth = flask_httpauth.HTTPBasicAuth() - - -@auth.verify_password -def verify_password(username, password): - if username == "papouch" and password == "jestetonepouzivejte": - return "papouch" @generator_blueprint.route("/") -@auth.login_required @authentication.authenticate_via_jwt def view() -> typing.Tuple[flask.Response, int]: return flask.render_template("generator.html"), http.client.OK diff --git a/generator/views/oidc.py b/generator/views/oidc.py index fb4adbe3..2c4d3b67 100644 --- a/generator/views/oidc.py +++ b/generator/views/oidc.py @@ -6,6 +6,7 @@ """ import datetime +import os import authlib.integrations.requests_client import authlib.jose @@ -34,8 +35,16 @@ def login() -> flask.Response: :returns: A response with the redirect URL. """ + oidc_url = flask.current_app.config["OIDC_BASE_URL"] + with authlib.integrations.requests_client.OAuth2Session( - **flask.current_app.config["OIDC"] + client_id=os.environ["OIDC_CLIENT_ID"], + client_secret=os.environ["OIDC_CLIENT_SECRET"], + authorization_endpoint=f"{oidc_url}protocol/openid-connect/auth", + token_endpoint=f"{oidc_url}protocol/openid-connect/token", + userinfo_endpoint=f"{oidc_url}protocol/openid-connect/userinfo", + jwks_uri=f"{oidc_url}protocol/openid-connect/certs", + scope="openid" ) as session: url, state = session.create_authorization_url( session.metadata["authorization_endpoint"], @@ -61,8 +70,16 @@ def authenticate() -> flask.Response: if code is None or state is None: raise werkzeug.exceptions.BadRequest + oidc_url = flask.current_app.config["OIDC_BASE_URL"] + with authlib.integrations.requests_client.OAuth2Session( - **flask.current_app.config["OIDC"] + client_id=os.environ["OIDC_CLIENT_ID"], + client_secret=os.environ["OIDC_CLIENT_SECRET"], + authorization_endpoint=f"{oidc_url}protocol/openid-connect/auth", + token_endpoint=f"{oidc_url}protocol/openid-connect/token", + userinfo_endpoint=f"{oidc_url}protocol/openid-connect/userinfo", + jwks_uri=f"{oidc_url}protocol/openid-connect/certs", + scope="openid" ) as session: try: token = session.fetch_token( -- GitLab