From c65377ffc0ed1cbdc3cf634d0813284804b6aa86 Mon Sep 17 00:00:00 2001 From: Patrick Neff Date: Sat, 2 Mar 2019 18:10:19 +0100 Subject: [PATCH] Add Django Admin UI --- .editorconfig | 9 + .gitignore | 116 ++++++++++ .vscode/settings.json | 3 + Pipfile | 6 +- Pipfile.lock | 202 ++++++++++++++++++ .../34dc940c-f5a2-43dc-b1e6-f8db2c8e2482.jpg | Bin 0 -> 48256 bytes social_scheduler.egg-info/PKG-INFO | 11 - social_scheduler.egg-info/SOURCES.txt | 11 - .../dependency_links.txt | 1 - social_scheduler.egg-info/top_level.txt | 1 - .../__pycache__/__init__.cpython-37.pyc | Bin 155 -> 0 bytes .../__pycache__/__main__.cpython-37.pyc | Bin 203 -> 0 bytes .../__pycache__/main.cpython-37.pyc | Bin 350 -> 0 bytes .../__pycache__/scheduler.cpython-37.pyc | Bin 448 -> 0 bytes social_scheduler/manage.py | 15 ++ social_scheduler/web/__init__.py | 0 social_scheduler/web/admin.py | 8 + social_scheduler/web/posts/__init__.py | 0 social_scheduler/web/posts/admin.py | 23 ++ social_scheduler/web/posts/apps.py | 5 + .../web/posts/management/commands/post.py | 20 ++ .../web/posts/migrations/0001_initial.py | 30 +++ .../web/posts/migrations/0002_image_post.py | 19 ++ .../migrations/0003_auto_20190302_1500.py | 18 ++ .../migrations/0004_auto_20190302_1622.py | 46 ++++ .../migrations/0005_auto_20190302_1644.py | 18 ++ .../web/posts/migrations/__init__.py | 0 social_scheduler/web/posts/models.py | 41 ++++ social_scheduler/web/posts/tests.py | 3 + social_scheduler/web/posts/urls.py | 8 + social_scheduler/web/posts/views.py | 7 + social_scheduler/web/settings.py | 119 +++++++++++ social_scheduler/web/urls.py | 26 +++ social_scheduler/web/wsgi.py | 16 ++ .../__pycache__/instagram.cpython-37.pyc | Bin 705 -> 0 bytes 35 files changed, 757 insertions(+), 25 deletions(-) create mode 100644 .editorconfig create mode 100644 .gitignore create mode 100644 .vscode/settings.json create mode 100644 Pipfile.lock create mode 100644 media/2019/3/34dc940c-f5a2-43dc-b1e6-f8db2c8e2482.jpg delete mode 100644 social_scheduler.egg-info/PKG-INFO delete mode 100644 social_scheduler.egg-info/SOURCES.txt delete mode 100644 social_scheduler.egg-info/dependency_links.txt delete mode 100644 social_scheduler.egg-info/top_level.txt delete mode 100644 social_scheduler/__pycache__/__init__.cpython-37.pyc delete mode 100644 social_scheduler/__pycache__/__main__.cpython-37.pyc delete mode 100644 social_scheduler/__pycache__/main.cpython-37.pyc delete mode 100644 social_scheduler/__pycache__/scheduler.cpython-37.pyc create mode 100755 social_scheduler/manage.py create mode 100644 social_scheduler/web/__init__.py create mode 100644 social_scheduler/web/admin.py create mode 100644 social_scheduler/web/posts/__init__.py create mode 100644 social_scheduler/web/posts/admin.py create mode 100644 social_scheduler/web/posts/apps.py create mode 100644 social_scheduler/web/posts/management/commands/post.py create mode 100644 social_scheduler/web/posts/migrations/0001_initial.py create mode 100644 social_scheduler/web/posts/migrations/0002_image_post.py create mode 100644 social_scheduler/web/posts/migrations/0003_auto_20190302_1500.py create mode 100644 social_scheduler/web/posts/migrations/0004_auto_20190302_1622.py create mode 100644 social_scheduler/web/posts/migrations/0005_auto_20190302_1644.py create mode 100644 social_scheduler/web/posts/migrations/__init__.py create mode 100644 social_scheduler/web/posts/models.py create mode 100644 social_scheduler/web/posts/tests.py create mode 100644 social_scheduler/web/posts/urls.py create mode 100644 social_scheduler/web/posts/views.py create mode 100644 social_scheduler/web/settings.py create mode 100644 social_scheduler/web/urls.py create mode 100644 social_scheduler/web/wsgi.py delete mode 100644 social_scheduler/workers/__pycache__/instagram.cpython-37.pyc diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..edb33ca --- /dev/null +++ b/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0447b8b --- /dev/null +++ b/.gitignore @@ -0,0 +1,116 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# celery beat schedule file +celerybeat-schedule + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3d7a01d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "python.pythonPath": "/home/odie/.virtualenvs/social-scheduler-BIGBnu0C/bin/python" +} \ No newline at end of file diff --git a/Pipfile b/Pipfile index 7cddf06..84af4fc 100644 --- a/Pipfile +++ b/Pipfile @@ -4,8 +4,12 @@ url = "https://pypi.org/simple" verify_ssl = true [dev-packages] +flake8 = "*" +autopep8 = "*" [packages] facebook-sdk = "*" -social-scheduler = {editable = true,path = "."} instagramapi = "*" +django = "*" +social-scheduler = {editable = true,path = "."} +pillow = "*" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..a296e90 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,202 @@ +{ + "_meta": { + "hash": { + "sha256": "e2f708932f4a52135061cf56ff125977a6e74cab2448464de0000ffdd1274ffe" + }, + "pipfile-spec": 6, + "requires": {}, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "decorator": { + "hashes": [ + "sha256:73cbaadb8bc4e3c65fe1100773d56331a2d756cc0f5c7b9d8d5d5223fe04f600", + "sha256:953d6bf082b100f43229cf547f4f97f97e970f5ad645ee7601d55ff87afdfe76" + ], + "version": "==4.0.11" + }, + "django": { + "hashes": [ + "sha256:275bec66fd2588dd517ada59b8bfb23d4a9abc5a362349139ddda3c7ff6f5ade", + "sha256:939652e9d34d7d53d74d5d8ef82a19e5f8bb2de75618f7e5360691b6e9667963" + ], + "index": "pypi", + "version": "==2.1.7" + }, + "facebook-sdk": { + "hashes": [ + "sha256:2e987b3e0f466a6f4ee77b935eb023dba1384134f004a2af21f1cfff7fe0806e", + "sha256:cabcd2e69ea3d9f042919c99b353df7aa1e2be86d040121f6e9f5e63c1cf0f8d" + ], + "index": "pypi", + "version": "==3.1.0" + }, + "imageio": { + "hashes": [ + "sha256:89d7692d9f513aa21665af7de94948bc1ef110d812fa66c34bfd486590d986bb" + ], + "version": "==2.1.2" + }, + "instagramapi": { + "hashes": [ + "sha256:a8dfcb7bd25d8eecefacc2b872d464888535c8ee0a99c8a5b81066fdc953e64f" + ], + "index": "pypi", + "version": "==1.0.2" + }, + "moviepy": { + "hashes": [ + "sha256:59d550a81ed1c9f6cf167da6d0707cea52ab250ddc2bc6d48b14ab1fc0ea4a0d", + "sha256:c733967656fa4be4c37ec48af72b63ab2991455aa862321437a013705797c4ab" + ], + "version": "==0.2.3.2" + }, + "numpy": { + "hashes": [ + "sha256:1980f8d84548d74921685f68096911585fee393975f53797614b34d4f409b6da", + "sha256:22752cd809272671b273bb86df0f505f505a12368a3a5fc0aa811c7ece4dfd5c", + "sha256:23cc40313036cffd5d1873ef3ce2e949bdee0646c5d6f375bf7ee4f368db2511", + "sha256:2b0b118ff547fecabc247a2668f48f48b3b1f7d63676ebc5be7352a5fd9e85a5", + "sha256:3a0bd1edf64f6a911427b608a894111f9fcdb25284f724016f34a84c9a3a6ea9", + "sha256:3f25f6c7b0d000017e5ac55977a3999b0b1a74491eacb3c1aa716f0e01f6dcd1", + "sha256:4061c79ac2230594a7419151028e808239450e676c39e58302ad296232e3c2e8", + "sha256:560ceaa24f971ab37dede7ba030fc5d8fa173305d94365f814d9523ffd5d5916", + "sha256:62be044cd58da2a947b7e7b2252a10b42920df9520fc3d39f5c4c70d5460b8ba", + "sha256:6c692e3879dde0b67a9dc78f9bfb6f61c666b4562fd8619632d7043fb5b691b0", + "sha256:6f65e37b5a331df950ef6ff03bd4136b3c0bbcf44d4b8e99135d68a537711b5a", + "sha256:7a78cc4ddb253a55971115f8320a7ce28fd23a065fc33166d601f51760eecfa9", + "sha256:80a41edf64a3626e729a62df7dd278474fc1726836552b67a8c6396fd7e86760", + "sha256:893f4d75255f25a7b8516feb5766c6b63c54780323b9bd4bc51cdd7efc943c73", + "sha256:972ea92f9c1b54cc1c1a3d8508e326c0114aaf0f34996772a30f3f52b73b942f", + "sha256:9f1d4865436f794accdabadc57a8395bd3faa755449b4f65b88b7df65ae05f89", + "sha256:9f4cd7832b35e736b739be03b55875706c8c3e5fe334a06210f1a61e5c2c8ca5", + "sha256:adab43bf657488300d3aeeb8030d7f024fcc86e3a9b8848741ea2ea903e56610", + "sha256:bd2834d496ba9b1bdda3a6cf3de4dc0d4a0e7be306335940402ec95132ad063d", + "sha256:d20c0360940f30003a23c0adae2fe50a0a04f3e48dc05c298493b51fd6280197", + "sha256:d3b3ed87061d2314ff3659bb73896e622252da52558f2380f12c421fbdee3d89", + "sha256:dc235bf29a406dfda5790d01b998a1c01d7d37f449128c0b1b7d1c89a84fae8b", + "sha256:fb3c83554f39f48f3fa3123b9c24aecf681b1c289f9334f8215c1d3c8e2f6e5b" + ], + "version": "==1.16.2" + }, + "pillow": { + "hashes": [ + "sha256:051de330a06c99d6f84bcf582960487835bcae3fc99365185dc2d4f65a390c0e", + "sha256:0ae5289948c5e0a16574750021bd8be921c27d4e3527800dc9c2c1d2abc81bf7", + "sha256:0b1efce03619cdbf8bcc61cfae81fcda59249a469f31c6735ea59badd4a6f58a", + "sha256:163136e09bd1d6c6c6026b0a662976e86c58b932b964f255ff384ecc8c3cefa3", + "sha256:18e912a6ccddf28defa196bd2021fe33600cbe5da1aa2f2e2c6df15f720b73d1", + "sha256:24ec3dea52339a610d34401d2d53d0fb3c7fd08e34b20c95d2ad3973193591f1", + "sha256:267f8e4c0a1d7e36e97c6a604f5b03ef58e2b81c1becb4fccecddcb37e063cc7", + "sha256:3273a28734175feebbe4d0a4cde04d4ed20f620b9b506d26f44379d3c72304e1", + "sha256:4c678e23006798fc8b6f4cef2eaad267d53ff4c1779bd1af8725cc11b72a63f3", + "sha256:4d4bc2e6bb6861103ea4655d6b6f67af8e5336e7216e20fff3e18ffa95d7a055", + "sha256:505738076350a337c1740a31646e1de09a164c62c07db3b996abdc0f9d2e50cf", + "sha256:5233664eadfa342c639b9b9977190d64ad7aca4edc51a966394d7e08e7f38a9f", + "sha256:5d95cb9f6cced2628f3e4de7e795e98b2659dfcc7176ab4a01a8b48c2c2f488f", + "sha256:7eda4c737637af74bac4b23aa82ea6fbb19002552be85f0b89bc27e3a762d239", + "sha256:801ddaa69659b36abf4694fed5aa9f61d1ecf2daaa6c92541bbbbb775d97b9fe", + "sha256:825aa6d222ce2c2b90d34a0ea31914e141a85edefc07e17342f1d2fdf121c07c", + "sha256:9c215442ff8249d41ff58700e91ef61d74f47dfd431a50253e1a1ca9436b0697", + "sha256:a3d90022f2202bbb14da991f26ca7a30b7e4c62bf0f8bf9825603b22d7e87494", + "sha256:a631fd36a9823638fe700d9225f9698fb59d049c942d322d4c09544dc2115356", + "sha256:a6523a23a205be0fe664b6b8747a5c86d55da960d9586db039eec9f5c269c0e6", + "sha256:a756ecf9f4b9b3ed49a680a649af45a8767ad038de39e6c030919c2f443eb000", + "sha256:b117287a5bdc81f1bac891187275ec7e829e961b8032c9e5ff38b70fd036c78f", + "sha256:ba04f57d1715ca5ff74bb7f8a818bf929a204b3b3c2c2826d1e1cc3b1c13398c", + "sha256:cd878195166723f30865e05d87cbaf9421614501a4bd48792c5ed28f90fd36ca", + "sha256:cee815cc62d136e96cf76771b9d3eb58e0777ec18ea50de5cfcede8a7c429aa8", + "sha256:d1722b7aa4b40cf93ac3c80d3edd48bf93b9208241d166a14ad8e7a20ee1d4f3", + "sha256:d7c1c06246b05529f9984435fc4fa5a545ea26606e7f450bdbe00c153f5aeaad", + "sha256:e9c8066249c040efdda84793a2a669076f92a301ceabe69202446abb4c5c5ef9", + "sha256:f227d7e574d050ff3996049e086e1f18c7bd2d067ef24131e50a1d3fe5831fbc", + "sha256:fc9a12aad714af36cf3ad0275a96a733526571e52710319855628f476dcb144e" + ], + "index": "pypi", + "version": "==5.4.1" + }, + "pytz": { + "hashes": [ + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" + ], + "version": "==2018.9" + }, + "requests": { + "hashes": [ + "sha256:545c4855cd9d7c12671444326337013766f4eea6068c3f0307fb2dc2696d580e", + "sha256:5acf980358283faba0b897c73959cecf8b841205bb4b2ad3ef545f46eae1a133" + ], + "version": "==2.11.1" + }, + "requests-toolbelt": { + "hashes": [ + "sha256:33899d4a559c3f0f5e9fbc115d337c4236febdc083755a160a4132d92fc3c91a", + "sha256:a0432b1124e6b33151ecf694497b4808690dd94ce68c6648c1daa63b771278c4" + ], + "version": "==0.7.0" + }, + "social-scheduler": { + "editable": true, + "path": "." + }, + "tqdm": { + "hashes": [ + "sha256:14baa7a9ea7723d46f60de5f8c6f20e840baa7e3e193bf0d9ec5fe9103a15254", + "sha256:1621b3476c2224045d8bd57209aab006612a46ae2cc518b4a92ad988983e4c3d" + ], + "version": "==4.11.2" + } + }, + "develop": { + "autopep8": { + "hashes": [ + "sha256:33d2b5325b7e1afb4240814fe982eea3a92ebea712869bfd08b3c0393404248c" + ], + "index": "pypi", + "version": "==1.4.3" + }, + "entrypoints": { + "hashes": [ + "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", + "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" + ], + "version": "==0.3" + }, + "flake8": { + "hashes": [ + "sha256:859996073f341f2670741b51ec1e67a01da142831aa1fdc6242dbf88dffbe661", + "sha256:a796a115208f5c03b18f332f7c11729812c8c3ded6c46319c59b53efd3819da8" + ], + "index": "pypi", + "version": "==3.7.7" + }, + "mccabe": { + "hashes": [ + "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", + "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" + ], + "version": "==0.6.1" + }, + "pycodestyle": { + "hashes": [ + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" + ], + "version": "==2.5.0" + }, + "pyflakes": { + "hashes": [ + "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", + "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2" + ], + "version": "==2.1.1" + } + } +} diff --git a/media/2019/3/34dc940c-f5a2-43dc-b1e6-f8db2c8e2482.jpg b/media/2019/3/34dc940c-f5a2-43dc-b1e6-f8db2c8e2482.jpg new file mode 100644 index 0000000000000000000000000000000000000000..5347143dae75bcd0d658ca419de892b3222cbe29 GIT binary patch literal 48256 zcmeFZc{tSX|35n3WM}MT8)YYyCA*`6u0 zmzqr}OJ*wLrCFR;-}AeE=UnHnbIu>X&-c21Ufiy^F0a?zulspFp4;Po-uLd@E)gPf z%Fe+K!ok4-xd{G1c1e(fw#cwx2*k+=q6L9Kc)|aPK{&xr9N^D?UAt_E#qo2tHWysZ znJI+?>V#hj3Q>wXqI+0LBQ_>1Dn!ZQl)ciaGq(0haYywv4=G)Z^}if;JweG*$<&A+ zvbzX54*7?Ja_kO5VBkpif%5n( zlK*jW{KLt$j~jd?egW`?HWBdkIXV9UUv?iC7kKv#@c$4l(S2eEj@WREpY`WCcvV9G zW?>bt^0B5q$#Wm5Dh8LXrSS1fNz3e)RaH~h(9|+CI%;fUYIgjDt)2Zzhg0V-xVpJ} zczOi{1_g(NhK0vmkBy5*CM2fbN=whkyq#54{BKEV*`2%P533(Neo|9g_q4gCwXMD5 zMQ2z4z~IpE$m`KJA19}#XJ+T-7f58v@|UkG-@dQXe*XHsMc)Q?{`?&m2ZZzg9M=CF z+5cl)qTsmx0q1~==kK^U{)q=0rzqFH14p>UY|irdUll*7f0I|@SYcIDAD^u!n&?4D4ZG4+DD`*u%gc2KF$phk-o|>|tOJ1A7?Q!@wQ}_As!AfjtcD zVPFpfdl=Zmz#aznFtCS#Jq+w&U=IU(7}&$W9tQR>u!n&?4D4axKZAkBd=jP~Cx(ik zz06NX!75ijtI>pO*{)A2o_M`{_ii9jOG)KV@q}>OpJIj*rmqSH>ou5LSlxw4wh@Gw z(i2}fa-h%oLv)sC1YV>U=EXb* zxJShNT=PP8Xg*#Q4J7Hx@_25jXmJdPbdo$@8EuC!#VGXtT}X-#Gw7q?E<_k*0|<~1 zxBPShJuEiG-dW)uf9jBL_?>e)K^fkAf%6G{)f&$C4Y%HX9DGQhJ&51W)F@lf>%-jY z`cZtnawOr=aI+mnUb0Af#O1i3I<1T?WW&nsHJJCYN+s<=#E^>Hhn`RdJ|8GOVXsiG zovJUW__WI9MJ05Zp2g~A;qb&UmrOstrmm@80p_U>%xJ-j&7ps`I_N<(&WH7@@5GDQ z6FKh79UJEv;wU%PZHw^Fia;IFMFgpL{?M58B9S#T;nyJe#!J(kRr@K!kmJjRv$hb4 zz4qTq2I!PsNFOJj*dmKzibYdOR)OrkMBSG}f~=EJZ`;$MaPH1WgTkDBx_rno^K#DQ zxz}2sFtNK3;tLq{)F)%MKqNy6a2Y}fqRxi*9-3$nZX#)u%rU`h^o}FX?x>h@SiBM~ zI>%=xqbxYbKDqWscNdasiXlFBq7c&klvwvrXX_HmvA0UL#`zLHGC$6lLt7U$EKzkH zCn2Vb2DDq1(099#xp6lC7{eZXQ*pG#Dn<}}z#~FYiJEu!%4G{j>gJGG!o-d}|JMb3 z;e&5NBJ8`=1^L{$WLdnl5vJ%Y-3Zi=b(GdUGGe`r%rYjy2eoV2AL@`O^*@HjDnSps zo*$AW9E#hS*~wuMamCm=Jn_pWp!^uel+dGJdI4k*Kj|I?@YI>nACZEZj893<*5f+2 z*}rmHh6unk=-#Ci5oVk|u1JRSM?*YB6E?l42~x&>!mRk?^pbdV&)N&u)KN2mXJn^=~C zvTY1C%Q+#@HHrJucK76O>Q3QoWy#H5AZ`zl44<2+BR2p zUnTIxRr+X-aK?1ybvvQoqhG_Q2*kWPTR@V^U`uukH7MIs(_c0`9Dt|w1S-Fn#QCNZ zetXZj=H8b&5T9@^ro`_B`$DL?AqS%q91t3W$H^Zk*pqOKC_JdWYsRqEt*eu&Gxa%g zN^?xA=|$YzH`0&vgQ!;S*N)AS&~4SeK+J{C=TkaShj8`Fp}IONIU|R}G!K-NBx}7& z;k8K7UU!+(W(yD)r!ak1!`LT4z(^Tdi5h!PBU%V~)0S0M`Uq8M@bx73hnru_ZhpI> z{kxj}kyT>F2cm5h-y&5-qtLH<>p{^UKFhRt_M9bd2c~a&XjRHQKArs0-+Q$4Z2M`h z%f?F(CeOo$@N(bb+jUExpS|CO#fK>$w=l2^D3U&RTw4?J>>pmGpS(|7A!ltR_S%0F z8Mr@TzlOEhXW=j9FC6cOOIS$9(-9&_JC@!7H}$bDo56yU9CFn~`mYB*jRN0Ks9DcjL>~PpjD6uf53m&&IkpZN|0=9HUHwOzj&&WYGdkVBAn)N1<8)X z5Wm9#m09ND&5clk1WNfy0!)y7$k!pZSz^%3s@@?f8_g{lI9kHflf^C8dm2icG^f=v-&5UudQjiJ~UE+fXjBA}l;q&j?|$kZ(eKGjbtfZ%^IVKZhzAPOBOuoHw7EoSJ#_T`)X5vMVs^>|i z)D$6%CyaUmwy-#Wr+VuFDh=B=(OSnN$&oR~+N?xq6>XDzDtMqRQBmHYvnf@l~6pM_|oqnpu=!L zc~he|pj3B{4!jvhH7-;CY3jH;baHIRqx1C$TFP>N*OEeV04{wH`QOyW1Fl!ro? za&=^!xLtuS7{&py@$oTHmEzG29w*+@ZZg$3+;$w>xk>gF7O`Yd)ZUOSviG^>uoZ3GbUL+^Mf zEBy!|Bw@ffyB3)=RDM~uvEmy3=L}zgnfSLW1IkUWE1_RwhIS#;VC;tdLvIJQGO}Kp z?4;7`+p$Ua;xT88y*I|ElW`Bwhe2Q34tCpzTrU4boO#^nJyg6BYL@oo$$q;80g1snA}Q{1|vE>g%cdfZ2} z)T-CbDU>qlrI&ArZOXFrjf0-Wk^Qgc-;8MTzP;ZF3?WmhpsKbuhne^qSqF1Waqg~xwQ2F+WltCi{!(;N&F-lO0hX-nP!)@j->qU}7p z*|;s?0?c3KNC%Ugewhl^`g8R&1-D^t?&Mxo)(BJnN>)?qG zu`SpQBSmb8(RhBZJaB1j5H0o7v%^Wt>Bxh{P?Kmg6|KtD3|>1^Tm>csJ~vLT*@&h< z*J0_OAvBkqHp9rGk(#hgmADZVH2pMJPM~O6(DEgGr3+x>$ma8;O|tp6X)y9grj;&I z%Y|nSc;?X5GI?Tl=9iOUp_BFtO}Q2g{;|MRYZI;wWZL{Wg?{)_Y@01eqY|hi3&HBBL&q=X zTukTU=7K^i|H;zWYyWW>K;EGrV)|6z#LtrqXQswIO3j8S+0;rD#qseW!=tOStpz8MSe``?*|DIq+o^Wd?BDep&fit8 zxpY=S3A>O5V>UE|8hpFf$BU^6n3JI*_HvSWjKQv)#Bj&d+y*5i7m{ zY^Xo5qe?l7rQ(RJw(bzVtBTd;dB~m8FB}wDKfICx_eTJR1{A`ELXF27R>H_hkN7$D zniQhh&n~*H=6LEZMDbhSK^5`ABJT6kW;f|VIHpJqn-9y7>RLeg1B(&3wE|K|#|$bu z`l4}OcVt7{sh$V*g`21Z+5CKpfE+!IgEAF4}Q6@XV2fJD-49+DF zT$OM#S(vkQy_cjdn0}5|MI>V99U#XDL0N<5NtZpd?T+9=A3?^Dg|h{4iz*+{GoN8J z3C~@Kt7Xr3acR!n*L+R{?FSLtV{|#tA2z{*u?xn1aS=3_JC?YaJ!9lOX6eQkWw;ag zYRSLzw#Q|aB8!Pz0X!CB9DfRzbKGg&pfEqPa`i9)ctG2JFkg7d%hxANQD;VO$jtuV zTWwz&m<>lx0$)n)N)JKFr`>;#k>P+|{CW&2@}T1)c0ru9{=9P3(Y&VT4sF4t@IG4r z0YNVks4->hz9BSkCmKH8N^}Vo1(cAogIhlst+5of5je;Y&5kqn|FFE+-0dF6Td8J`KKLs1Pk{Co)9EN%vIv-7+>Ir1! z?Ls2F6&y#7CNFsa0mGt3C0mmxku08|Fk2girQ zB$(Q?m$;I8WE?TGQAAX@`ZB@L_=xzl%IU*DgfIN$#liL*-ha~JCF_UcLP7jt(8CXu zSa^H{feWQUCHKUmHSs4KqxygNntebgWtYr%v?+p~ zgta;idO_Do)P@Dmp$R2q;~xvr&@A4NT#wp|m1S`rBW{Z;V4~u&3Fu%!uB=YcBL8HQ zLyt5ydf*ywk2y)(oloS1+_|KJ%0opPoC4d*JmGougfpOZpY#(33K@qHOdSCB5C~oy zfVb$~yzU*!)K7XAAt!lEy46i zt&SWmjTot!vwkUH`sL2ATegC4Kb3gUE1{s*ObNjB9b&6v`Yu?R;%=chFSY-POdpNi z6!EQNaHnyKXB6alE=F+WqJx!wpLq*M_Sn?3M-bHTnm!qw$jj%!%%m+z=MAr?(Zgn}@FBy`}BvsEOzD zIn@^?CRPEGCM2m|?McH$g4mkK!u;Z=aOv&l`m4tUBMm3J<@dSn55APhG5XYqQ4G=? zXPD+x^~_!q)Fm2sU4(xujniiGvbe3m)7F`|qMm;8Nt0jYoda629v@bkvq;HHuClggyrWIz$uG>+Q{6-b>n^^-a#3*(u8B8e~y#kz9GdIq1;?goQ;H zRvyap>9?+Jrr7MjLP`3)B-PgQqmROMEDE1BKl%Qn;YZ0_En}eWYp*m2sZ#d*XGvBK zJUrK6*pCyC2A7+YuZG55=`&8RJQ+nSUo}-cZqa1as^Q3Ot3eZSwYw&Se(eXCvju!9 zPGa`aqDb|D$ZK~F+o4R|>Po|=D)38m<9g}a>% zGnTc&3S(JM$_(nyEsV;adZu>au0(<7X?vM-^AL8Jg(Vrx#(CH1iBHOI#6DR~ygnKe z5g)0Ul@xY1Rk^xOu)dyyOFqQ_@eKl%cJ9TRM7oe}SSh8T0<7;K)%RB&1&cnsU`uZ-HER%AF#G8Ah&B2Ji>KeT}w=g_&w0!laYl_V5vu=^6Je?~1>{76L00;6qOfzw| zPzTkeUx6P1E)0nxyPYPP(y=N$fkp2upfOM14fA^PJJ(E{ewsMJ^TCXVDV;=@WW8*2 z+)PW{&h0UN>KXp=-qB`Sdai0?S#3M{S-bZwQF&~a=f6LBSG8y10Z`!JE@XX?A%F^+ zW-Fr(Q571C$qI?e^2RPnI_rs-g=-SM5^_GDdkuYip~xPRM#g7fW={XP37P;fSxEgC ztptMEtj!nx3VgdK)4c~!a>1fE${lhRYBHp;&cCyg(};APQY%3@;$p58nDtPYTj!GJcC z_y8vMl{!8I=Lz=`yg46fB$+ezWHpOVZsP}JUTHHY-6!`=O%{6s9zzt#*WfTaE~p~ZO6+(n8Br@3_!H^n^CJz^EKHa2Q( zqxL&$?muS+GIB#0XF{7hQ}zHumzjv~oI)LB>jExyK4Sfr{50L`8zYvHKO|qD#dgbQ zn&5J+K!ej)@IX6@w%CtVw6Khcem^+f%2$bs8?#r=|CkJy--U!B79GhW8~Kf1s|bnS z1ITA1?rs;e1D+vzXbY)1J6DUFEhrUF4g7o&9iR7u)1r*lT=K!uXNL(H^fN18k9zrj znhap`e94)eCNz&Q_hYH*q^QS{bpw%OdFs6)O9Mg(FUZB z2b_SbWTAk*?av3=CStQeLx1g&boqU^b1y3%;I>WDgm@9cuJT?R3vT|CN+OsR(12o^%Ld@Lu=~Iw z3m+i*65swWQzNp>aRD*OlN{Z%sl7tSD1=WoWEN1(DpzcN6?y|Ef@_2F=K(UC!ljb z48%Wb{gW}E;AmauIji%fq$gK*)i_t_Mb0&@BB`HmXr0b3OEN4vs{-pk*USYar<&Dbom)Tos<`9-W7vo_}{~*d@zP z%ew*QP%u{W%`5gr>*VF7oc&x8MLz?SQE7Mnu~rh({$mY*Zhqfs7Fhd4Y%=Q)wK~{D z)!Dp#XXi{PMvQ405{=P(|LJ)TgHp&oo0fHqGMSox6`a!)82h!`?6X+d`X;pjtNQAO zl&P}mF2uk2QOu-FC6wYwB7g;aVkkeFQ)31R4qfw8o5A_mNBckabV!IX5KopenZARq z#4SPrwH2l)bOc6qBFx28W;aY}>C=W#*|1%R;MN>UhctX;TQ;QP5~)%56t(C%YhjpA zOCj4oQ-JY>no5rZ5*St<0xleYc;9D%wqb(yu@4Que=mN|EVMI`PjZ8A)KFFN;V$z6 zNJX)7<^Jqy22)yXge_;x z=G$PXvu9?WcF5Lb8t%8?qnM}p;OV)k`X_!Q{)o$4|I##4mM4ohK&zpQX4t~0<1;;) zWGAZ?2O3XCbkJm*fcY&=oz@Rc_HO44`nd6~aN@s-E=*%^JyU?*4oG~bH^h)~hiV34 z!d0fRCSif1c`lBcXP=w-deL z!{DKXjN71AHWn>>^7gX{0W$}l?}UJ?;%oRqP6$nmb>hTCDx^wMH+v+Y_6I_Uj{y07@! zaX=XiC^kv6Ov#9WD?s8-WREy4ahUM7m%2O&)jrE_m9Xw}e-w5tW5t<~yo9-f15`r> zb|FGc56}=~p%kgO9K(AzV*1(YG@bV1x;bazu{%+Gx672$&;MFJtW*a{Eks-fy&srj z6H~C_7-Akl+#mQr^>&?YL!@^({ULaU)2~TRqZBkQKU|VD4ecX3L(Uh}OBBA~{F6n? z$T7rauw{B@jozIavH#HeLUEN&{~472c}8_##izM6S4d#dRYV@VV}+?`OdTUOc3?<^ zn{0^}Kvms>!HL+#o!q=E88HK~b)-L1~ZC!h1Qvw`yBs>BmUU-~E9Y zDq$FHIJT}IW_Eg3q>hqaXg9QKPzqY;&n|$zH?haeeVszPM;7;1( zP7e0j8eV&B^2hy$++cH+o9~+eE=3zjaGgvpi6Mp@pbLW&?;mO>&nLnP+76C^kQQ4qTzmitV51c=b|ULjVc1+4OW?|z#6 zpSg*iW7iq69Zufw(jKKGNJ6+n-yZ7z)BJ*~;#vL(JPkv=0ADaCmfn-hPeYrbTtEC~ z#0p5>_fzYR@JL>7GWZwKXN$Rjp(3IIwX)lIVlCl$$@opCLjA(`2kH~CCT%RU&l^{x zpN>gfQ=k9zXV^0^68BmVqRdsuyvaNRAjr@ZtVmlvAJAgoJ7M8KV$`%uU1z+08{_ph zL$Drx#-2;WMk&=Ab|I8Ny`r~KQd#m76AG0(DY;FK;o7mvKm}43A1B4Xf&%91^e(^@ z=k0(4Q$vjC^*eKX^|9|{H5P0)+as>ZXANFgd9E-u`_%~&oD9E=Cq5>$;6bDiyJ63b zwl`i|}MWoUQ*R#~AcJo<~5Mqj!k@AWe`!IdoUFa5y z#=(x3DGQxv$VG3@seR?zkBU5|Z?1LCS@%*D+nDp_P^Pf}iZr!pODvN8A6v zvg`f6o+jEytMqHOu*b`kmlK1NO~)5;^y~NN4y`v|QFIo&c{xi8zM1dE ztlr~*|07AZ)=c)}cen_t_M_hdU-aC)c-!7B_`n5p;2EARFxTK7K=PboW#Wk$3pGR0 zVjKY>WPu9r5wnuPR4$JN+vU1Zwx~k&bH&D!^1lYz?+H{Nmw6txz&+w7Z~@<1mU11= z1El|n&u~ihx!;yMc4Q$xtX9Lm?S6`tTcD|od*W{>pfi!r=KBtIwP;ISaltg5zHSM9 z75X%;HK!lmnzK?gD)^=QemhvH=>Cn99>L}Z!Ngqv{3059W#qy`lGbpy9|)b9)gyh+ z%8ho;Z#;PMm~W-b@I-R};4PO=dC*x&K!$j9PPS>AH^9#{7goJ!@4Wr6oacPHy&Ff# zO=60^_9p1rW|{Kwv_&@GE4m`AYf6rc7;wB)2XazhJFW~n%8bagcJ>v?3ungLk1Xw1 z!@F&5nA4%4MpiJ@SG-n5Q6|9Z4B#nm8$g!1!!dBc%B@;NV6Nrq?;}N_oYYh{-|5QphQ8*MrU=Q@(SyB#wJ zpDzs(pH)A*^5)G+C8`Z>8AfM=x^#d&L7<+5-Im4VG`5z~+*5xGol-dNOhc!MJB0}h z9UR@?d0M(X@{JX+;KEUkuX6#^5gP>JUzQlZ{)~jV{Q%nARuStM=;St}B6Kt#C6O@m zvGH0x?taLorrUl&AqZNUO+Yj~?qJG&03)GD07E<9_xv-AhXG6+>8NQusT>{%&y}4iyzv;wA0$8PV%HV}kzF36Rmj^pBDUmuI+HXzZrWzS7 ziY4@TrW^)@*_SYIRt$BdDZ7x7chVbv3SEn_Bt1SqyJO*}_!g7mGUOhraLU_faK;3k zN@r&rs=qWDd7z^s%S4A{BY*YbK98v@5YA)>k;59sfgT`GBVp@p44FBP&pv>Tl^U{n zN%Ka;P{>9qa#NuZJuWk@yd11xTn;gQF8mGh$j%TwaC$==vJWPQUa{=jK(EzZTpwwE<_;ZqesxC(I~dahqz;W@23w=m~vKvP>mfo znhe8G;|LoSH9vm!coG*sy@IGy8)_HxC>Ig4M!#@OQLuU(ug;XzqrYhdykhHm%!B_} z((7VtZAD5N1`lJkzgUO_hk^`LU^}k~4$C$~sn1w(qI_xa6qF5gK9<0@T4rX;^dSYO z*yU1_>aY?0Pr+01)GPMu-H(`;z+wj>Q50&1+lh0q{Z*#XqcfNZz1j40 zGLeE~y=t$O8r|>}a6mJfDLyuYp`OlPaP5@?+JBB;=q`3>p3%WYx|V8ZHXallYyByB zjZfL?iRD1Low3ewJ+rG0c#Y^mD+=dZaX2I-?CLh^#qwXCOW(?w&`Y+4CL0qw>${v|cTX`_3}O zljzoXRu4RqkOAjk4=Ajr+2JG-Z`HynGegk3F`D0VpH~--t3$5YV%!mJgmnQ1m}K;U z1zbTGC^8-Jj*#l=z2AYBrj-`B8tEAMh)E(~`p*oaQ_fs4xp?gP>m7SG-w}|H&;<$0 z6h)wnf*+2Sj#!Y+ZEQsd`>Nmiu|YxJJyf0hLp`iIO1b3i*(&}Y|D+F~2G8(}!>MsD zOi6nes(Q+G!aNVD;q4V~&qc3M%6^?YTpb;`XB!NsUs2K=d^lfu%y#oL1+wDOg9?#> z2Qr!zv>yQ@G;c3ph2}l@K%b_%UY`DvTyg5gIri7%rKMr_U$4vsJ%5Td)DHEcqi zDUYqx+o%EG^c1TcAKHy%Pv3Yva51_DW}sqLa{tn~k>`xlqIH{{$y>OUANXn*pq5vF zr=A%H3|B_Lv_|Gew>#A`y~RIb|IX68up`rv*4tylS?2x`JMZ^mlmA3)(hIuBl*1@~ z#KLhl|2?X4f6H-twnLA5Sgo&`euGf;jk*EhRW~tclhIEWx)#%i#S5Gtfm7XOwnnS< zU@1)Hy4AD2`eI?IXSU2!J`Ou)cs{|XNiM^&A2GqWR5&!?o>)Y$a@XwFOju8Q>F_?2 z&D6MQCS`UF&s21!_5Iy^a*BC`$Vf}iJP^V68wn_wL2P%2r zG(rv@EOd0XA0w?3$u>b*1xihh)Z>}X{}1+t2Pof^iFY zvLQhXr1h}5BJ6hH1InRD`Yeq3)Jk}J+X`o?Zfrl7JMkS1f8V5kT# zND7`>IK?!frP$wB&_jgY9cf+~5?%S&i=mA(Ma1b7faMMPZIC=(4b$;{n@2hEvrTQE z^Kte0NAWzCCfv#JYHb*B$o)1ZNXVIB&1yu80jZ=5LxX%2yzt^!BT|vol1m7)4sO#K zMH2YUzhXp98IK zInNaX9Avwi&WXTj5N+xj-31g;87QI?cz*?bxBxIhiXOyeDe~~^G+MwxpU)RAJu=F8 zV)!EP*9HGmY1h7)$_aB@4YLZ_YA7LKo2E+`^n(Ji3_CPPdP?K&@Bd+8ROt)9wG|dq z)FJguz}rF8qNGUX>MUkoE$24R>B-37xn`d~&hTzDLWwg0<_e|^Z7 z>>~D^Eiw_+=H$g5cbvQ&VBquV)7$5LQK>~g){i~STfXn!kD$730$Lc*)fK|1E*r+f zvRk-xi&&bv-_+!>55aBi<>RNiORB@r(-x}p6TFmb0S>&u!wNS2Y!R>s=fBJ&j|LNs z?LQAJdf=%W&mO;jE;wETAO+urQYbz&CuWKu33N|ji1UbBW{8ad&<^{to?D5r z9vq#qus0gi0>;v@rv!rMHouH>9^S^aw(0@KE2R8&WAM&mV3P>v_3#D8$m%&g(AtJw zNM=;zal&fZRqvh|I{jN!&Y2zBleyv;gNsdZoG@ch+2PHY;pqANA-r^>)d7?Vtt_QS zkKAD3a_@BKOzZbUZa6kEgi!MT3&*$R<{rF!~G+fG3`u!H4N z4G+0cQQ|6>Zr~BW^FU{F+Oq#HBofuP z#obE)K=^Qpu^#twWBTI00!>6L*ZczNFm-dVgCuN2iN=79_zTh{~X#;Qp4Mr9RYa@G6%@7dEdWErJdf zd!&e=_5pB(#+z4ZEyVT0Lc#JZ)w-Jt9$(U;WFmJig+i+iQyyqP0WD87hM0?x1UJ3; z@c`dRxV+Db)VJk4gLBsxk?a2WjPogfG)ige4rgsRPAzey_6gq5;QR${zfS=B7$0Lu zqLA%?CXLfA2ymtGZv{-&be3(S<)iQ<0to0v1!a>92^*g9YAn#j z872Qj)Q59vD<6Ja<|uMj(`l_UUdlWdf>B`WQioPjQ0`AdyKd=wBfd*toA*7j)mYC}LbfVe* zU#kFd{a?i|M_kqL`rkOWDQv-VU|OompGG0MuHPhec|%3Lk9qIsa)`WUy;(^2A93oT zkWys*8BF_{~{TBJhM8Nmy3I`F3P^?M|Y**KAqOiAgt{I!Z!RX<-0xwfgZXmWOm z5}x;pAHqKR+gEsdFtJ|B>_){jYisgy`sW3yQcv#>t~M$R4#dPZQ#Kw{qiGRJaAG^`IhHBj zHT+}t6iq$((R7s@cOh6UXP5pX%;WmLjRI>d{iChoUEJ{B9eR391%Mi4e^7{Os~USF#!=a`464L>uo&(Kb%%iS&b)p=;b5ExN0uz%p^lYgcg*?%SV3ETV2d5n-Rr`g5LyV2ZC0U0xN-KM(_sQwak<7b#;8 zW(Q`T86v-(NE66^p9~k-g@lX)rfc-C02O2hNYbqPt#F0M1G&xL*s{~7&!uofVoSx{eVQ$E-HybA)a=g8Myc+X5< zl1{#HkBr?gppMYdO}{LHDC7H(R+2tx(?&^2`gZU%-AWgMWB!ITeT=wkY8z!*ATmZ?l-7t^%Q zO&j?O%@o$P-;;d&vf;N_eW7_qSwhZ6pnr$C?{j?)m@=jh2X^K>o&u+y!7L06xxr<0 z;q7YRDIZdgs{z|(Gc`wP_}>`W=E~v5Dr)#r>8Uvu&Ss8k}rw>xD2@` zLuZZM+4LJXyr99kZ9agZCXMI&D>DL!F1MoWO&N;aS2;HFd-6B^Zj-QpmGtp~r{JMO zExpg6^`+>;d8dD|hFkpz8`o}V?`%{zKrkmh|1IwOjFPKG_RcI`U}2d~0T16Dte-9Y ztdYLDs;csj8|US$<(QH3P8{gwQrj#}vrSl?V50N)2%zRkL^knjCrM75&{7hr?xMf7 zj6aR))7{sy_>Za5%~{E>;FLseGetrM;q4j2mYfvh!FN&=C%~BG{b}~@TY3ay-EZf*h6VQTXz{J2p5a{BXY)GcgZ{K4{GFz5r$5o$HHgzkN zt0{@)aep!S7V!fQXn{U;5}6ctFdCCk)HpREok;?>d9r(v2&(L6!&~ zwZ+&6GKDWu`Yj+&nB1%H>N=&8f8oPpr5Ke{7w>XdWxWMQRk7nk)a% zd{Y#W-u}^$guTKsr;w&Z3Emx^#EQQ#sQ zxjHJ^rKv6*s#!%g0?#eR^Iq)O5tx$a*#a1?YR@-dwwF3Wv>S_+6L9YBs+r4Ga~I(EKn`sPi<}uWeUf=H_AL487tC z<>YtVCIaij%|c3}>fa`SmJSMN+A|ex8Y1FnKg+W2GU1B(HC3T_k{)f}^U_sxrBPee z8@rbSPA?wlXTL+6u|Hzl!McvkMFHR9Ge8ARZs>vG-K96mQ*As+$b5!KigJ!{p9IH* z`@d(cxmS(B^T8xp{FuIn;OS`?{%|b+6V?-EOtsgV+15OwPk$&xDKizh)8h?o7FH(reV;q&gVjk9N#271FYyIgMh7f5P8L?*rywtNs+GQ~)NzC?A?Qo+66j1#D&1PnHl;j}O%Th!4ar zlnr5TF1J7P^fI8CJ?h8~x8;?wiYsm>17Sn*g)Pd$t0ONH8YDPa2yjE3Dp=Pb z?+VIEg=W=8Wd*#TNxm$Y*)V)a`tdt5Zb&dc@RRV$ag|eZ93Nx-`zSm1ogGCp@p%_Q zmvghs4j=e8HHCMJr|rf~@EiQW0HYoGjLm1taP|h$KQzWhLx7vrtu((B6?47F4oqXN z1HbOUeOX7=ifYnLe!z*n@FqkCTNFLvg&E#V)3>ij39u>;MvDVU=UROhJ$>JL{-~Fe zxBIsIJm=@rp~Pwk2USS2nuHe$S2UPi|6QRr{OiKBk!I<_$B#2={v5O~t`OnIUV>9E=*?r; zLOXyC?54$j5*~`n=7N0h<)-!zNh~(~9LFe)-gaK!EW4gxhv7$ZpDv6RkPn-+}%wi19>`Kjq3Z=}KM?6&ytxO3*IR4~h=118$5vPO_bh1DX9hh&Ez zlZ7yDcN_I$1sLfsUUU`aIhr@Al=rKv{f~;Y_n{Ay`8D?1{|XtHN6(Lt)$W1Sp2<{~ zY@-Uz*mueUW*en72{q5T{00QSE03i1Ej_h^%KsX|*kY(2qw4ny)GI=L)Yt1YdNVc13~u`6)+V3+f&n&3Cwvt%{If4vApTJRAc27%`0d8L{APayG=gCucCxDKCE z#;rB0S~wp3hAK2mELocM>b>aQJ?8ECc|-JDtG(+?ug{&V_KicCCqhF{dL4c*5hW2d zh}`6Yb$AoZ{t(DV999+Yc4BSat0dad2~w9@w+*(sA{w{mCvy8;Mm^(>I#H%y$2aec z=}<+1fR;jqn78|@wuRPeagwkB8)DXO+>~B)9WPNo!F+oqm3qkHiQIE^zUGPKp70uv zCdyYW*!Xe>1!7udh^;u{Wk&UFKy+_qB^kM)j9!mbu`3s~nlV@rj*)FgeB0V#Mk{O| zNG2a3o@KStO`7N%QvOYM=O1t`L>}c8M~5AWyoCv$d22JmME-mbAYgic=(A|$Nk=6& z`~>o4@yh_0%D#{&2)Z*aV|b@YCl7o2Xf-!$2oR`U*rl17Nt8vd~qVe~dm z$^(^MhHg8Ylw&SJkeGtWzbbw>~syS=iib*1i{ck%v7w_R+)dd*Rh2gh^7SX0B~_Fzh`n8K zepAjs$j_&Ih9rOlQB0m5NNT>MJ!NL|%c`}Fo2V$Vs!D->OPU|N_LjXww~sV+lsUl^I` zLuI4^Y0u;|dyVB2XY3FX@Z5&wX%TPpE~xB!c~Ia7AIlrm*rf{6Tx95l_tk`t;=H{U zEc9YT8+g;>D=d%>xeNB8&S?(Lxc&a|Zfn27=XVaNaTDj?xO-4`o6iUe5X zi%SQWV;#uXH(F z?wJX82bU(a10)4zDxKwQgm$AG|!0bXrHBiW`Tx^gzR_^G?zS(Q>e25~5T zbDLZlkQc;}*y8PW5b0%O8&LOoK)wB_Z93}ZZ^@?=iZ+g_q~CtE4iXxBxMUP9234=c z+3!R1$DM~WJr*39y(344y&jv7;wM!k-^dn)PBfccefcT!uxB0^-M9#dvKN0En7{G+ z{YiSToA^DiccFn6^%dDatDHO^_g@=2*AQ;t6hJUq%j0G9j;^#o9O-G^ZlBPxn(2W^ zmVMhw^v$GHmo+YZ%AIacvw;ZG5!_QC;g=pBLSlj(?<-y_se zR2{Xk9>dU1!Vk(ZBsH497>3E8a`FagXW}5c^gNTwkyxf0kfkv10*#&MqDt*UV?%}_ zbpcWI=tkOSvs32NiRaBMx)6|ZD8Enoe@vfrsqg#2R0Y|Mlp{oNBoqnMJjf2b0n0Gi zST|rnURu<8%1wf@Wc}Id!z1XFp`7Xa>w*QF-x%m3V7=O)oN;C6bL)YtBe6w`s+EM= zu^AZBk?roXY9i6PZQRo8+9#)9N!H0xa3!XUb6stbtB(>n2i=&u7UYE0ar##G>8J`H zXOA2sy|36@^COS$H=fne8g)U zuD50Rq}jQcY3J{B@(F$XTQrj;0K@*)Jysq2xY(FTP zF89K_iEOCd$zr6Nm6}<}rT;+OC4s3Gmk3c5$iAppRP}Oa;V;-A_5`=o*s}^opU<}E zb-f;2N}sn)S0WgD7eB^w2OqwWH%Bn75O@QK(q16Nw24R2YEW_-9D$?pzQ@a5XD;Vl zup%1PPEPk?lbzBvT>{&p$7Wtve7^zjf)>rbBMF>iTHFqO{3&qGU=5~?kww7KIh2Ru z9*#e&sY_f2>w1-yKQ}9^Zn<0a>`tdEZCQ0a5z^Uje0tYA#+t~q6jTkNI|DxUDTS5N z!Q_o8DuDi|mJ5B$oFj7zmdD*KltvlJJqgnHdOv6c+^o6fu()4s#Z(c1TCB~}02N}xxD&Uks0;}~3>6VYvECRI@#^^UJV!E$ZOtkJbvxVVu_^6^ zhe$>^tJmm6ynLXORm*E)pvyJqPdAbl?QVA}J#BkR%qrFs;O+r84FYS_Bz19X{gpm> zof^Q+W^T1lRgP(u=37)*rFAf#vJO@DOTEpH?cZ}eJpt%B;xPCgh}k`V0P+(R>+h?= zq3A&mKv!JZd((21D9=ER*puCoAv&JijJx0D*wJ8*aSkGTO^aGjFJv$xS<`I>-~TRY zV)-7Ik8`WtvG1v8n8;OaL_y3r5{%VPAKe+=lp=z(JHTBJHrn>X-C=DGBnB#c-#9xO z_IGQ*bkDi0l}E)#e#{%CXzsXc>~Ot3D^6 zQIFj`saeleJ&bg{TA-?ZvGdkM8RChEh`_f*u#bQsAWj7Pg(n=wTv}v5fJa$%U1N9r zozgr?&_;na*G7b%E9)A6LG?UXt3k}*FK#y<CDpF1}Q%duw zJ|H5%YZ|mgE`pjXRq)v;82I&eLW87(ZdlbWk~T{hOOJwICNu^JzkxZ&H|yRcNY#yir!rew0O76<|k$)F3bNUtoa58rOFOAFl6Gr~}!X@)i} z4c}z`O@@a5Q4zwoV*Kx89tGSK%j}|jwhjOzj&l@FtwH>zaK8;PW=jglQ*rQC!v&_qn!oGUX7_I7}!AzsbqG;vwA|zdKsKeX0 zs-O$!(xSz?@*I<-6DwR+zi&2_P8JMs<=%Q_j*_u870a@xKdUd3CqO0X*#&VK@HU{g z@EZ^fm@{HBGCKOuHr0*Hxw1%LAA5os8a#J69piCOGWWynv)>v;Ffk_e+y>2hG%$m4 z_UU#vn*7q7B`lu6Lq-c<%rld=*DF7M-7{5m$vLxmb+iMbNSO$OQW}aj&~ePkkL&+! zbYujzpwP--%#)Yvq~xfNl%d35tlS(S6g(~Fd6&&y!tGF74;RG)OXAm2uKf}-6=)v6TMAb&Qd za>edC9o{r_{HyfHS8rv(bs3km*ImsDMORF7H_y4JfW-hTIq}bMs@o7JY@8^=5^v}2 zhfn0(J?)mZc&L-sS$%0S`Fnv@5+o2xhSjoh{&jE{Gsj3j zC~d$FzTgbk|X#6f^)m4NeZMShW08KCyT$oEJ*cIB?;$ z0qg5WElhs{-7qh*B;i18frYfnTuoy5uMeKy-Z7p8h7AMJUbD&7;*21sVrQWk$9aLA zq#!uL2s>@_i?53bL5P+o&wg$sRgBqZog04fq=?}$T9!#BYXgKF*U9j)fqOXB#UBWH z|M{Ib&!v^g;eW8CO9KL5IJYl{n6Y}5%TNj?T ztsC6@7^a?PNvVBHKN+Ui9HKIIxs!IeRyq{D=ycu49S=6T_*A?Yez-suJ{!!cU`N7~ z#UQaMSk=mhrFE}<<&jd}(3wwLgB}qFmF*v2v9^oQ-1~4A^xA~HfOvZ&*4Vym?XF4w zw!t<3mJ4qqaw4FjfP!%AfJ?}qme@;A8WT=iRyYfqpiWco8=hv$Lm;m|! U|HlmfUho;0QxccFCsxJ!~g&Q literal 0 HcmV?d00001 diff --git a/social_scheduler.egg-info/PKG-INFO b/social_scheduler.egg-info/PKG-INFO deleted file mode 100644 index 393b6ba..0000000 --- a/social_scheduler.egg-info/PKG-INFO +++ /dev/null @@ -1,11 +0,0 @@ -Metadata-Version: 1.2 -Name: social-scheduler -Version: 0.0.1 -Summary: Posts to social media on a schedule -Home-page: UNKNOWN -Author: Patrick Neff -Author-email: odie86@gmail.com -License: BSD -Description: UNKNOWN -Platform: UNKNOWN -Requires-Python: >= 3.6 diff --git a/social_scheduler.egg-info/SOURCES.txt b/social_scheduler.egg-info/SOURCES.txt deleted file mode 100644 index d3e51e7..0000000 --- a/social_scheduler.egg-info/SOURCES.txt +++ /dev/null @@ -1,11 +0,0 @@ -README.md -setup.cfg -setup.py -social_scheduler/__init__.py -social_scheduler/__main__.py -social_scheduler/main.py -social_scheduler/scheduler.py -social_scheduler.egg-info/PKG-INFO -social_scheduler.egg-info/SOURCES.txt -social_scheduler.egg-info/dependency_links.txt -social_scheduler.egg-info/top_level.txt \ No newline at end of file diff --git a/social_scheduler.egg-info/dependency_links.txt b/social_scheduler.egg-info/dependency_links.txt deleted file mode 100644 index 8b13789..0000000 --- a/social_scheduler.egg-info/dependency_links.txt +++ /dev/null @@ -1 +0,0 @@ - diff --git a/social_scheduler.egg-info/top_level.txt b/social_scheduler.egg-info/top_level.txt deleted file mode 100644 index 4efeb2f..0000000 --- a/social_scheduler.egg-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -social_scheduler diff --git a/social_scheduler/__pycache__/__init__.cpython-37.pyc b/social_scheduler/__pycache__/__init__.cpython-37.pyc deleted file mode 100644 index 9eccf0339c823ea41656fcb96c9d7b4547900ea6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmZ?b<>g`kf``*9V?gv{5CH>>K!yVl7qb9~6oz01O-8?!3`HPe1o6v7KO;XkRX;x^ zGgaR?KP6Sapt2+*KTp3nKRGioN4GdRBQ>QoC$$JF5RVXukI&4@EQycTE2zB1VUwE= MQf3D-y%>lY0JSwI3jhEB diff --git a/social_scheduler/__pycache__/__main__.cpython-37.pyc b/social_scheduler/__pycache__/__main__.cpython-37.pyc deleted file mode 100644 index 4de5be332d7f81897a43f3c9d0c929000837a772..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 203 zcmZ?b<>g`k0)e@eF@8Y$F^B^LOhASM5Eshh z21bSy=3oX*mX|;^44RC$SaK6H^KNm($Ajqjct1_%DAD5lB^l?+9!KmjoEO9owsKFmD5g34PQHo5sAbL<#_8j4wf1P>DjBLJ}e BF#-Sp diff --git a/social_scheduler/__pycache__/main.cpython-37.pyc b/social_scheduler/__pycache__/main.cpython-37.pyc deleted file mode 100644 index 9bd597d986219cbfd1e49fd8455393b37385777e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 350 zcmYjMOHRW;4E22aRl_ORWI^Ww2vzOA8+H*AiZUY-HIu2vsno2?F}MI54wNmcUV#;M zpan~Q{>XmMUMI;M$Ufe>rya#lE-of1S&`!{fdwmS@FEiethB0@US*1MZAY(=X*+&| zbaJLiNJX#Rv1-rar%2+VdB&o2_E5W6aF>lEOKiyThM-n&F0FVvzp_6WZ#h_df7<5BwDJy$iWe-}~ zK7py{w1Hl9@6OL>zZYMI;gDc_el+(#Sijt&4~oqNra49sL_k4G-~g_t1uYq8*fZh1 z6YdHBmPCVZz|jcW!<)+3ozioukvh0eQu(OVe8Z$T*o9MJm{Ux1f?!cez>>ZZ zi?!>((pR!XWvt+;AgD%XEs2&9lPij7M1q&PKcCdHzVdP_X)5dGGqZrV^Us{cJ7Z#Dq}fgyeYXt$U}J|Dky o4`3#LMmn$jsONjDoBwdfI-fhRhg=(+mCE@#cQ0%_gb|F`8XuW#W&i*H diff --git a/social_scheduler/manage.py b/social_scheduler/manage.py new file mode 100755 index 0000000..e677349 --- /dev/null +++ b/social_scheduler/manage.py @@ -0,0 +1,15 @@ +#!/usr/bin/env python +import os +import sys + +if __name__ == '__main__': + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'web.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) diff --git a/social_scheduler/web/__init__.py b/social_scheduler/web/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/social_scheduler/web/admin.py b/social_scheduler/web/admin.py new file mode 100644 index 0000000..f4899dd --- /dev/null +++ b/social_scheduler/web/admin.py @@ -0,0 +1,8 @@ +from django.contrib.admin import AdminSite + + +class SocialSchedulerAdmimSite(AdminSite): + site_header = 'Social Scheduler' + + +admin_site = SocialSchedulerAdmimSite(name='Social Scheduler Administration') diff --git a/social_scheduler/web/posts/__init__.py b/social_scheduler/web/posts/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/social_scheduler/web/posts/admin.py b/social_scheduler/web/posts/admin.py new file mode 100644 index 0000000..f74cb4c --- /dev/null +++ b/social_scheduler/web/posts/admin.py @@ -0,0 +1,23 @@ +from django.contrib import admin + +from ..admin import admin_site + +from .models import Post, Image + + +class ImageInline(admin.TabularInline): + model = Image + extra = 1 + + +class PostAdmin(admin.ModelAdmin): + fieldsets = [ + ('Publikationsdatum', {'fields': ['publication_date']}), + ('Nachricht', {'fields': ['message', 'posted']}), + ] + readonly_fields = ['posted'] + list_display = ['message', 'posted'] + inlines = [ImageInline] + + +admin_site.register(Post, PostAdmin) diff --git a/social_scheduler/web/posts/apps.py b/social_scheduler/web/posts/apps.py new file mode 100644 index 0000000..2c2b982 --- /dev/null +++ b/social_scheduler/web/posts/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class PostsConfig(AppConfig): + name = 'posts' diff --git a/social_scheduler/web/posts/management/commands/post.py b/social_scheduler/web/posts/management/commands/post.py new file mode 100644 index 0000000..260fdd9 --- /dev/null +++ b/social_scheduler/web/posts/management/commands/post.py @@ -0,0 +1,20 @@ +from datetime import datetime + +from django.core.management.base import BaseCommand + +from social_scheduler.web.posts.models import Post, Image + + +class Command(BaseCommand): + help = 'Post all scheduled posts.' + + def handle(self, *args, **options): + posts = Post.objects.filter( + publication_date__lte=datetime.now().astimezone(), + posted=False) + for post in posts: + print(post.id) + images = Image.objects.filter(post_id=post.id) + self.stdout.write(self.style.SUCCESS(post.message)) + imgs = {img.path.path: img.caption for img in images} + self.stdout.write(self.style.SUCCESS(imgs)) diff --git a/social_scheduler/web/posts/migrations/0001_initial.py b/social_scheduler/web/posts/migrations/0001_initial.py new file mode 100644 index 0000000..3142990 --- /dev/null +++ b/social_scheduler/web/posts/migrations/0001_initial.py @@ -0,0 +1,30 @@ +# Generated by Django 2.1.7 on 2019-03-02 13:30 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Image', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('path', models.CharField(max_length=4096)), + ('caption', models.CharField(max_length=2048)), + ], + ), + migrations.CreateModel( + name='Post', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('message', models.CharField(max_length=4096)), + ('publication_date', models.DateTimeField()), + ], + ), + ] diff --git a/social_scheduler/web/posts/migrations/0002_image_post.py b/social_scheduler/web/posts/migrations/0002_image_post.py new file mode 100644 index 0000000..4ddbf73 --- /dev/null +++ b/social_scheduler/web/posts/migrations/0002_image_post.py @@ -0,0 +1,19 @@ +# Generated by Django 2.1.7 on 2019-03-02 13:36 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('posts', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='image', + name='post', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='posts.Post'), + ), + ] diff --git a/social_scheduler/web/posts/migrations/0003_auto_20190302_1500.py b/social_scheduler/web/posts/migrations/0003_auto_20190302_1500.py new file mode 100644 index 0000000..bcc974f --- /dev/null +++ b/social_scheduler/web/posts/migrations/0003_auto_20190302_1500.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-03-02 14:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('posts', '0002_image_post'), + ] + + operations = [ + migrations.AlterField( + model_name='image', + name='path', + field=models.FileField(default=None, upload_to='media/'), + ), + ] diff --git a/social_scheduler/web/posts/migrations/0004_auto_20190302_1622.py b/social_scheduler/web/posts/migrations/0004_auto_20190302_1622.py new file mode 100644 index 0000000..348b746 --- /dev/null +++ b/social_scheduler/web/posts/migrations/0004_auto_20190302_1622.py @@ -0,0 +1,46 @@ +# Generated by Django 2.1.7 on 2019-03-02 15:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('posts', '0003_auto_20190302_1500'), + ] + + operations = [ + migrations.AlterModelOptions( + name='image', + options={'verbose_name': 'Bild', 'verbose_name_plural': 'Bilder'}, + ), + migrations.AlterModelOptions( + name='post', + options={'verbose_name': 'Post'}, + ), + migrations.AddField( + model_name='post', + name='posted', + field=models.BooleanField(default=False, verbose_name='Gepostet'), + ), + migrations.AlterField( + model_name='image', + name='caption', + field=models.CharField(max_length=2048, verbose_name='Beschreibung'), + ), + migrations.AlterField( + model_name='image', + name='path', + field=models.FileField(default=None, upload_to='media/', verbose_name='Bild'), + ), + migrations.AlterField( + model_name='post', + name='message', + field=models.CharField(max_length=4096, verbose_name='Nachricht'), + ), + migrations.AlterField( + model_name='post', + name='publication_date', + field=models.DateTimeField(verbose_name='Publizieren am'), + ), + ] diff --git a/social_scheduler/web/posts/migrations/0005_auto_20190302_1644.py b/social_scheduler/web/posts/migrations/0005_auto_20190302_1644.py new file mode 100644 index 0000000..110070e --- /dev/null +++ b/social_scheduler/web/posts/migrations/0005_auto_20190302_1644.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.7 on 2019-03-02 15:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('posts', '0004_auto_20190302_1622'), + ] + + operations = [ + migrations.AlterField( + model_name='image', + name='path', + field=models.ImageField(default=None, upload_to='media/', verbose_name='Bild'), + ), + ] diff --git a/social_scheduler/web/posts/migrations/__init__.py b/social_scheduler/web/posts/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/social_scheduler/web/posts/models.py b/social_scheduler/web/posts/models.py new file mode 100644 index 0000000..abddbdf --- /dev/null +++ b/social_scheduler/web/posts/models.py @@ -0,0 +1,41 @@ +from datetime import datetime +from os.path import basename, join +from uuid import uuid4 + +from django.db import models + + +def change_upload_path(instance, filename): + ext = filename.split('.')[-1] + now = datetime.now() + return join(str(now.year), str(now.month), + f'{uuid4()}.{ext}') + + +class Post(models.Model): + message = models.CharField('Nachricht', max_length=4096) + posted = models.BooleanField('Gepostet', default=False) + publication_date = models.DateTimeField('Publizieren am') + + class Meta(): + verbose_name = 'Post' + + def __str__(self): + date = self.publication_date.strftime('%d.%m.%Y %H:%M') + return f'{date}: {self.message[0:50]}' + + +class Image(models.Model): + path = models.ImageField('Bild', upload_to=change_upload_path, + default=None) + caption = models.CharField('Beschreibung', max_length=2048) + + post = models.ForeignKey(Post, on_delete=models.CASCADE, default=None) + + class Meta(): + verbose_name = 'Bild' + verbose_name_plural = 'Bilder' + + def __str__(self): + path = basename(str(self.path)) + return f'{path}: {self.caption[0:50]}' diff --git a/social_scheduler/web/posts/tests.py b/social_scheduler/web/posts/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/social_scheduler/web/posts/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/social_scheduler/web/posts/urls.py b/social_scheduler/web/posts/urls.py new file mode 100644 index 0000000..33dd132 --- /dev/null +++ b/social_scheduler/web/posts/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from . import views + +urlpatterns = [ + path('', views.index), +] + diff --git a/social_scheduler/web/posts/views.py b/social_scheduler/web/posts/views.py new file mode 100644 index 0000000..f7058f8 --- /dev/null +++ b/social_scheduler/web/posts/views.py @@ -0,0 +1,7 @@ +from django.shortcuts import render +from django.http import HttpResponse + +# Create your views here. + +def index(request): + return HttpResponse("Hello, World") \ No newline at end of file diff --git a/social_scheduler/web/settings.py b/social_scheduler/web/settings.py new file mode 100644 index 0000000..4719c2d --- /dev/null +++ b/social_scheduler/web/settings.py @@ -0,0 +1,119 @@ +""" +Django settings for social_scheduler.web project. + +Generated by 'django-admin startproject' using Django 2.1.7. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/2.1/ref/settings/ +""" + +import os + +# Build paths inside the project like this: os.path.join(BASE_DIR, ...) +BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/ + +# SECURITY WARNING: keep the secret key used in production secret! +SECRET_KEY = '$oyqqo98y5^biuhhexa7%l-8aq_kj+jv$3*+9i1^-$$gk6cp#v' + +# SECURITY WARNING: don't run with debug turned on in production! +DEBUG = True + +ALLOWED_HOSTS = ['10.0.0.144', '127.0.0.1', 'localhost'] + + +# Application definition + +INSTALLED_APPS = [ + 'social_scheduler.web.posts', + 'django.contrib.admin', + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.messages', + 'django.contrib.staticfiles', +] + +MIDDLEWARE = [ + 'django.middleware.security.SecurityMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.middleware.common.CommonMiddleware', + 'django.middleware.csrf.CsrfViewMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.contrib.messages.middleware.MessageMiddleware', + 'django.middleware.clickjacking.XFrameOptionsMiddleware', +] + +ROOT_URLCONF = 'social_scheduler.web.urls' + +TEMPLATES = [ + { + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'DIRS': [], + 'APP_DIRS': True, + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.debug', + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + }, + }, +] + +WSGI_APPLICATION = 'social_scheduler.web.wsgi.application' + + +# Database +# https://docs.djangoproject.com/en/2.1/ref/settings/#databases + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', + 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + } +} + + +# Password validation +# https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators + +AUTH_PASSWORD_VALIDATORS = [ + {'NAME': ('django.contrib.auth.password_validation.' + 'UserAttributeSimilarityValidator')}, + {'NAME': ('django.contrib.auth.password_validation.' + 'MinimumLengthValidator')}, + {'NAME': ('django.contrib.auth.password_validation.' + 'CommonPasswordValidator')}, + {'NAME': ('django.contrib.auth.password_validation.' + 'NumericPasswordValidator')}, +] + +# Internationalization +# https://docs.djangoproject.com/en/2.1/topics/i18n/ + +LANGUAGE_CODE = 'de-de' + +TIME_ZONE = 'Europe/Berlin' + +USE_I18N = True + +USE_L10N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/2.1/howto/static-files/ + +STATIC_URL = '/static/' + +MEDIA_URL = '/media/' +MEDIA_ROOT = 'media/' diff --git a/social_scheduler/web/urls.py b/social_scheduler/web/urls.py new file mode 100644 index 0000000..97968d4 --- /dev/null +++ b/social_scheduler/web/urls.py @@ -0,0 +1,26 @@ +"""social_scheduler_web URL Configuration + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/2.1/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" +from django.conf import settings +from django.conf.urls.static import static +from django.urls import path + +from .admin import admin_site + +urlpatterns = [ + path('', admin_site.urls), +] + \ + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) + \ + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/social_scheduler/web/wsgi.py b/social_scheduler/web/wsgi.py new file mode 100644 index 0000000..bf6e3c1 --- /dev/null +++ b/social_scheduler/web/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for social_scheduler_web project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'social_scheduler_web.settings') + +application = get_wsgi_application() diff --git a/social_scheduler/workers/__pycache__/instagram.cpython-37.pyc b/social_scheduler/workers/__pycache__/instagram.cpython-37.pyc deleted file mode 100644 index 3822b0eb5b013bf21a5ba636365b23e63048c26d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 705 zcmZuv%}(4f5FXpflF~($P!Cnbfol$s7eI)XL&c#838_dHlI6x`*EES!JF9BZ-rzw% zJ@u7x<{>`}l2gdj-&Hh;?DQn)`oqalNx_wHbPiDC78(nZ8Ngy@_zg&5 zgh}vBOp47${hP-wXFhzhp%hp{LMQ1VYJ88Tg9TggYrX)*7I4XK`5j_3fNj`uE&@&M zg>IcpD?f2fF8UOy9-XhWlGE3;O|_`?VD3&IG~|9mc{zP5!o&K8H>*rJ_xQ{NQP zmrhqZv7A~nt8DliP)`Buf@ovmR!i7z=Y6J>Yh0&PN}y@4z{c$A-3yMptF(W}Qu;u4 z6CET7w~Pqi@h6fzP?CH-Yb&qK$<%iqiPJEdx>`@HTq||kIo}NQmSzpF`=s@;dxc)4 zH37SN`w|l+9Oo%tmGL|Jn dzNM