diff --git a/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/INSTALLER b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/LICENSE b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/LICENSE new file mode 100644 index 0000000..279c6da --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2007 Michael Trier + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/METADATA b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/METADATA new file mode 100644 index 0000000..c1bd714 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/METADATA @@ -0,0 +1,160 @@ +Metadata-Version: 2.1 +Name: django-extensions +Version: 3.1.0 +Summary: Extensions for Django +Home-page: http://github.com/django-extensions/django-extensions +Author: Michael Trier +Author-email: mtrier@gmail.com +Maintainer: Bas van Oostveen +Maintainer-email: v.oostveen@gmail.com +License: MIT License +Platform: any +Classifier: Development Status :: 5 - Production/Stable +Classifier: Environment :: Web Environment +Classifier: Framework :: Django +Classifier: Framework :: Django :: 2.2 +Classifier: Framework :: Django :: 3.0 +Classifier: Framework :: Django :: 3.1 +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Utilities +Requires-Python: >=3.5 + +=================== + Django Extensions +=================== + +.. image:: https://img.shields.io/pypi/l/django-extensions.svg + :target: https://raw.githubusercontent.com/django-extensions/django-extensions/master/LICENSE + +.. image:: https://secure.travis-ci.org/django-extensions/django-extensions.svg?branch=master + :alt: Build Status + :target: http://travis-ci.org/django-extensions/django-extensions + +.. image:: https://img.shields.io/pypi/v/django-extensions.svg + :target: https://pypi.python.org/pypi/django-extensions/ + :alt: Latest PyPI version + +.. image:: https://img.shields.io/pypi/wheel/django-extensions.svg + :target: https://pypi.python.org/pypi/django-extensions/ + :alt: Supports Wheel format + +.. image:: https://coveralls.io/repos/django-extensions/django-extensions/badge.svg?branch=master + :target: https://coveralls.io/r/django-extensions/django-extensions?branch=master + :alt: Coverage + +Django Extensions is a collection of custom extensions for the Django Framework. + + +Getting Started +=============== + +The easiest way to figure out what Django Extensions are all about is to watch the +`excellent screencast by Eric Holscher`__ (`watch the video on vimeo`__). In a couple +minutes Eric walks you through a half a dozen command extensions. There is also a +`short screencast on GoDjango's Youtube Channel`__ to help show you even more. + + +Requirements +============ + +Django Extensions requires Django 2.2 or later. + + +Getting It +========== + +You can get Django Extensions by using pip:: + + $ pip install django-extensions + +If you want to install it from source, grab the git repository from GitHub and run setup.py:: + + $ git clone git://github.com/django-extensions/django-extensions.git + $ cd django-extensions + $ python setup.py install + + +Installing It +============= + +To enable `django_extensions` in your project you need to add it to `INSTALLED_APPS` in your projects +`settings.py` file:: + + INSTALLED_APPS = ( + ... + 'django_extensions', + ... + ) + + +Using It +======== + +Generate (and view) a graphviz graph of app models:: + + $ python manage.py graph_models -a -o myapp_models.png + +Produce a tab-separated list of `(url_pattern, view_function, name)` tuples for a project:: + + $ python manage.py show_urls + +Check templates for rendering errors:: + + $ python manage.py validate_templates + +Run the enhanced django shell:: + + $ python manage.py shell_plus + +Run the enhanced django runserver, (requires Werkzeug install):: + + $ python manage.py runserver_plus + + +Getting Involved +================ + +Open Source projects can always use more help. Fixing a problem, documenting a feature, adding +translation in your language. If you have some time to spare and like to help us, here are the places to do so: + +- GitHub: https://github.com/django-extensions/django-extensions +- Mailing list: http://groups.google.com/group/django-extensions +- Translations: https://www.transifex.net/projects/p/django-extensions/ + + +Documentation +============= + +You can view documentation online at: + +- https://django-extensions.readthedocs.io + +Or you can look at the docs/ directory in the repository. + + +Support +======= + +Django Extensions is free and always will be. It is development and maintained by developers in an Open Source manner. +Any support is welcome. You could help by writing documentation, pull-requests, report issues and/or translations. + +Please remember that nobody is paid directly to develop or maintain Django Extensions so we do have to divide our time +between putting food on the table, family, this project and the rest of life :-) + + +__ http://ericholscher.com/blog/2008/sep/12/screencast-django-command-extensions/ +__ http://vimeo.com/1720508 +__ https://www.youtube.com/watch?v=1F6G3ONhr4k + + diff --git a/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/RECORD b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/RECORD new file mode 100644 index 0000000..e721c19 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/RECORD @@ -0,0 +1,269 @@ +django_extensions-3.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +django_extensions-3.1.0.dist-info/LICENSE,sha256=hfh-J08r7s6vlJVWdNgyPZ_B69b8NdSvzdOLVEygyyA,1057 +django_extensions-3.1.0.dist-info/METADATA,sha256=s6kXf5nBkTspRmS5YFVVQvDe724Mhvw3heUNnWWS24E,5017 +django_extensions-3.1.0.dist-info/RECORD,, +django_extensions-3.1.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions-3.1.0.dist-info/WHEEL,sha256=EVRjI69F5qVjm_YgqcTXPnTAv3BfSUr0WVAHuSP3Xoo,92 +django_extensions-3.1.0.dist-info/top_level.txt,sha256=a-Shg8eC0Rl6_AoTRvqIUhzOFzQeCFU1Z7ee7myIYMg,18 +django_extensions/__init__.py,sha256=UgrVIRBD1b4giDXwgcRs3XYQEKTuc9by2RG1QFSGCnc,533 +django_extensions/__pycache__/__init__.cpython-37.pyc,, +django_extensions/__pycache__/apps.cpython-37.pyc,, +django_extensions/__pycache__/collision_resolvers.cpython-37.pyc,, +django_extensions/__pycache__/compat.cpython-37.pyc,, +django_extensions/__pycache__/import_subclasses.cpython-37.pyc,, +django_extensions/__pycache__/models.cpython-37.pyc,, +django_extensions/__pycache__/settings.cpython-37.pyc,, +django_extensions/__pycache__/validators.cpython-37.pyc,, +django_extensions/admin/__init__.py,sha256=-gJP3Ttnx-bAFgZLo7zguKH2FlSFNfL99hrpj4eysxc,6853 +django_extensions/admin/__pycache__/__init__.cpython-37.pyc,, +django_extensions/admin/__pycache__/filter.cpython-37.pyc,, +django_extensions/admin/__pycache__/widgets.cpython-37.pyc,, +django_extensions/admin/filter.py,sha256=1MFZ71zlx1fp5QdKxOe3GpTu2yMKWeHOPxObLAk1JjU,1819 +django_extensions/admin/widgets.py,sha256=7Auq1-VIsdbLW20tpVjEB2cAfL6YqDteHEwXr0gYcKE,3191 +django_extensions/apps.py,sha256=oJlK-RUVkhL9ZKtjS3vKsEJJc17UmYbQMEdS8Ocbf3s,171 +django_extensions/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/auth/__pycache__/__init__.cpython-37.pyc,, +django_extensions/auth/__pycache__/mixins.cpython-37.pyc,, +django_extensions/auth/mixins.py,sha256=t55Wjt2B0tSaW10liVHj8NSJb6yyKbmcGCJv8sQP89o,488 +django_extensions/collision_resolvers.py,sha256=roO-zKNAt6PEcN6FZVl4scP6ujM73ppZw48dLMLUJrQ,10644 +django_extensions/compat.py,sha256=xQT_I6tUhWYRvupMj10gxo9fvkwE47iZ0L_Ee0MKQXs,1930 +django_extensions/conf/app_template/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/app_template/forms.py.tmpl,sha256=_K9nXjI1BEn-aPQYmNM9mcBwp21EnzAvtHF6lXeLQmY,55 +django_extensions/conf/app_template/migrations/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/app_template/models.py.tmpl,sha256=Vjc0p2XbAPgE6HyTF6vll98A4eDhA5AvaQqsc4kQ9AQ,57 +django_extensions/conf/app_template/urls.py.tmpl,sha256=nzK9G5Qi-8ECvgQ-5A5UhVYB9nmKTuWxKkrqWYgSzS4,69 +django_extensions/conf/app_template/views.py.tmpl,sha256=F42JXgnqFqK0fajXeutyJJxwOszRxoLMNkIhfc4Z7KI,26 +django_extensions/conf/command_template/management/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/command_template/management/commands/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/command_template/management/commands/sample.py.tmpl,sha256=VWqndBmkpZ5jw_3DrisYjXD76Si5lVSVcZlkifG57gs,306 +django_extensions/conf/jobs_template/jobs/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/jobs_template/jobs/daily/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/jobs_template/jobs/hourly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/jobs_template/jobs/monthly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/jobs_template/jobs/sample.py.tmpl,sha256=r2cd8E0jNTKIJYQmPULuxjZFxzg1yrv72IHsipWkWtY,178 +django_extensions/conf/jobs_template/jobs/weekly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/jobs_template/jobs/yearly/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/template_tags_template/templatetags/__init__.py.tmpl,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/conf/template_tags_template/templatetags/sample.py.tmpl,sha256=IOMcdXaX3IBAawoGoteRYqF5Y2ggxsLweR5XZqxfpMk,59 +django_extensions/db/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/db/__pycache__/__init__.cpython-37.pyc,, +django_extensions/db/__pycache__/models.cpython-37.pyc,, +django_extensions/db/fields/__init__.py,sha256=sd1YBoBKQOQNPmzT4dbnvL6zgnMN2l9PwOzkQCGFKbg,20607 +django_extensions/db/fields/__pycache__/__init__.cpython-37.pyc,, +django_extensions/db/fields/__pycache__/json.cpython-37.pyc,, +django_extensions/db/fields/json.py,sha256=WfaRzlIwxCHgppPMAI1QOlq2WfDr5rsUMlFkpy6peTY,2862 +django_extensions/db/models.py,sha256=i2Aa72Driz1LSf1ed4kFZqKK18ZZd8pkCAurUPQw6bg,3811 +django_extensions/import_subclasses.py,sha256=sPRpMDQDobPnefJq7M9_B0Gn7-VcXofaWi4Maee7XFE,2291 +django_extensions/jobs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/jobs/__pycache__/__init__.cpython-37.pyc,, +django_extensions/jobs/daily/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/jobs/daily/__pycache__/__init__.cpython-37.pyc,, +django_extensions/jobs/daily/__pycache__/cache_cleanup.cpython-37.pyc,, +django_extensions/jobs/daily/__pycache__/daily_cleanup.cpython-37.pyc,, +django_extensions/jobs/daily/cache_cleanup.py,sha256=KcT78D0Y3a4orSlG0eTfh1HqebRn48iYXCxUkyuiww0,646 +django_extensions/jobs/daily/daily_cleanup.py,sha256=r_NSWoDPWlR2GvubWt4GZIgjx24GBeNOfOlIRpRu1wI,388 +django_extensions/jobs/hourly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/jobs/hourly/__pycache__/__init__.cpython-37.pyc,, +django_extensions/jobs/minutely/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/jobs/minutely/__pycache__/__init__.cpython-37.pyc,, +django_extensions/jobs/monthly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/jobs/monthly/__pycache__/__init__.cpython-37.pyc,, +django_extensions/jobs/weekly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/jobs/weekly/__pycache__/__init__.cpython-37.pyc,, +django_extensions/jobs/yearly/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/jobs/yearly/__pycache__/__init__.cpython-37.pyc,, +django_extensions/locale/da/LC_MESSAGES/django.mo,sha256=R7WNKaXc0q4iM1cUsgzdbdRZ08r7m14EmM1znFTo1FI,797 +django_extensions/locale/da/LC_MESSAGES/django.po,sha256=Zl33Wn5Sz6JsDUcbR_2aMtFCTqmDYz1XpXXsrY2GBl0,1667 +django_extensions/locale/de/LC_MESSAGES/django.mo,sha256=kuhHiXWrfazxsvFzvENWfY5sN3XpLvy1-AKQ0jKOnAs,1227 +django_extensions/locale/de/LC_MESSAGES/django.po,sha256=OLFLDJbZLPk3oK5DUcJ-V7eeBKZcHjlu_Vl0WTHW9F4,1755 +django_extensions/locale/el/LC_MESSAGES/django.mo,sha256=0CafRFBnuy4QdqtoaipoKpONaVMvtfP1J_4eMBB2gAg,1581 +django_extensions/locale/el/LC_MESSAGES/django.po,sha256=UC2b1GCXVnUteg1ZFqooRp6wkcxBufQGWCSZW8Hxndw,2116 +django_extensions/locale/en/LC_MESSAGES/django.mo,sha256=9JJOWscsqQUH_P7IWH5P5MEJPDJjDGzGl-Zz5-xGDFo,367 +django_extensions/locale/en/LC_MESSAGES/django.po,sha256=l27VRI3peRt_aKdlaQ7zVXj03wR2PfIex2X3SWrrSBc,2229 +django_extensions/locale/es/LC_MESSAGES/django.mo,sha256=SH8ojro4wqhcR8yKM2vn9JVxTMbke7zwUjsc_W60jfA,1260 +django_extensions/locale/es/LC_MESSAGES/django.po,sha256=euh9NBu3f-f-CuNgPGaJDebN0TbalfKKJ_X5q55VqA8,1788 +django_extensions/locale/fr/LC_MESSAGES/django.mo,sha256=XIMBOSYt8pHAhP3pUBs1N-iKLn3e0LRgTNYe_ippr58,743 +django_extensions/locale/fr/LC_MESSAGES/django.po,sha256=kU4F92g2mcd5y73onqKOM5F3V1YkIUk9ezu1OrKiQi0,1930 +django_extensions/locale/hu/LC_MESSAGES/django.mo,sha256=7rWzOkIurHDcvi4uCgh4hkQjUpV182FSyjKZz6mIBFU,1242 +django_extensions/locale/hu/LC_MESSAGES/django.po,sha256=SOHXX186PGybAII05VA5QRZvSjtXR9fLJpgS2acxwt8,1770 +django_extensions/locale/id/LC_MESSAGES/django.mo,sha256=X3tKDCM5qiuVi5dYOnzxAxx6mQ3w-wTJBvP7_ENnHhg,1508 +django_extensions/locale/id/LC_MESSAGES/django.po,sha256=a4dguUsySnXLdDDafyXcq2lXFmYN-DS6uoEOQQJGEV4,2243 +django_extensions/locale/it/LC_MESSAGES/django.mo,sha256=y3dS8jT30b2P9il5kxQaCj_JgaLLCCkR_vLEllX8L0g,1247 +django_extensions/locale/it/LC_MESSAGES/django.po,sha256=AENMGV_gkuUqp2gVWnENI5hlCtJipNykZkAWcvlRia0,1775 +django_extensions/locale/ja/LC_MESSAGES/django.mo,sha256=5fTQjN83bExfQbkaAMq3zve2B3fEWkf6rF-QYGZf9fA,1397 +django_extensions/locale/ja/LC_MESSAGES/django.po,sha256=CGrMk9hH64qBE_6NF-qPMwHpdfW57FwY3PlF0g0_g0M,1925 +django_extensions/locale/pl/LC_MESSAGES/django.mo,sha256=G3yZYzIwUHJ0PK14VhRXxJaYSXRkBQWa4yfFwJyhSBs,2002 +django_extensions/locale/pl/LC_MESSAGES/django.po,sha256=hVRdMxQmgRhtruCm66bZQVY-OIfSSYVBSJViuZNHB_4,2788 +django_extensions/locale/pt/LC_MESSAGES/django.mo,sha256=F_q92e6dFwPbjvYWHNBvCjgd5mIj3_ezrHvCOFeUZCw,1262 +django_extensions/locale/pt/LC_MESSAGES/django.po,sha256=oKucDPxqIFZAOeVa_mbvOsmXXwyTydd82_Z_pXpkfvI,1790 +django_extensions/locale/pt_BR/LC_MESSAGES/django.mo,sha256=bN2RG97zI3S6qEuMmvbDvPCo4YSZ_KEY5UxviD9WzlA,1310 +django_extensions/locale/pt_BR/LC_MESSAGES/django.po,sha256=VDIRUodyxJr4PDcgiOuR6o3k1Ss_4ge5rx0DZgk5QwY,2082 +django_extensions/locale/ro/LC_MESSAGES/django.mo,sha256=8-8B-I7iFCGZKBj1XKMbMqQLl6Yg2W1IEG39miSI8Hk,1352 +django_extensions/locale/ro/LC_MESSAGES/django.po,sha256=CWaWS2C08-8lNWMCtPSPvDj4xONYrD3UGx4QSWXuWgg,1891 +django_extensions/locale/ru/LC_MESSAGES/django.mo,sha256=C_kjCXvZuZ2ZdiU8ffcjKwcnA-d5IiUTgpglX7JdD-U,2009 +django_extensions/locale/ru/LC_MESSAGES/django.po,sha256=luenXP4hypDODQUVWowDSCkYW9VMF_9NBlTUVkAmB3o,3820 +django_extensions/logging/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/logging/__pycache__/__init__.cpython-37.pyc,, +django_extensions/logging/__pycache__/filters.cpython-37.pyc,, +django_extensions/logging/filters.py,sha256=02Yp6Xmcp5ORr-JweyG6xHBZZsOKD0DnqbgXHVewGSI,1126 +django_extensions/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/management/__pycache__/__init__.cpython-37.pyc,, +django_extensions/management/__pycache__/base.cpython-37.pyc,, +django_extensions/management/__pycache__/color.cpython-37.pyc,, +django_extensions/management/__pycache__/debug_cursor.cpython-37.pyc,, +django_extensions/management/__pycache__/email_notifications.cpython-37.pyc,, +django_extensions/management/__pycache__/jobs.cpython-37.pyc,, +django_extensions/management/__pycache__/modelviz.cpython-37.pyc,, +django_extensions/management/__pycache__/mysql.cpython-37.pyc,, +django_extensions/management/__pycache__/notebook_extension.cpython-37.pyc,, +django_extensions/management/__pycache__/shells.cpython-37.pyc,, +django_extensions/management/__pycache__/signals.cpython-37.pyc,, +django_extensions/management/__pycache__/technical_response.cpython-37.pyc,, +django_extensions/management/__pycache__/utils.cpython-37.pyc,, +django_extensions/management/base.py,sha256=onLx3r71rBL0Io91s05V9yvXg4BGxvd9o3sYaMn4CIA,1431 +django_extensions/management/color.py,sha256=rQcRJBfXdsV4LlM15dONb_n_rzRL2qXH1c1-WljiNcM,907 +django_extensions/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/management/commands/__pycache__/__init__.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/admin_generator.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/clean_pyc.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/clear_cache.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/compile_pyc.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/create_command.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/create_jobs.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/create_template_tags.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/delete_squashed_migrations.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/describe_form.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/drop_test_database.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/dumpscript.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/export_emails.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/find_template.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/generate_password.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/generate_secret_key.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/graph_models.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/list_model_info.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/list_signals.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/mail_debug.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/merge_model_instances.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/notes.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/pipchecker.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/print_settings.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/print_user_for_session.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/reset_db.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/reset_schema.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/runjob.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/runjobs.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/runprofileserver.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/runscript.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/runserver_plus.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/set_default_site.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/set_fake_emails.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/set_fake_passwords.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/shell_plus.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/show_template_tags.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/show_urls.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/sqlcreate.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/sqldiff.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/sqldsn.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/sync_s3.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/syncdata.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/unreferenced_files.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/update_permissions.cpython-37.pyc,, +django_extensions/management/commands/__pycache__/validate_templates.cpython-37.pyc,, +django_extensions/management/commands/admin_generator.py,sha256=TAGUX36o-wxVmfXOzDhSuSqJcByjkNNR7BudhbKUQlk,11791 +django_extensions/management/commands/clean_pyc.py,sha256=dArLJ7HXcJHoaXdfMAzNpQgcpMPGVQzAuDWLBDEChgU,1523 +django_extensions/management/commands/clear_cache.py,sha256=y44-TSpULDtIwhpCsV7Ii2ofsYjNIgHrEPUixoDepsU,1486 +django_extensions/management/commands/compile_pyc.py,sha256=YrXmZO2MNFkNfcCb4CAnppRR4_Ggkv_r76raA77xVxE,1241 +django_extensions/management/commands/create_command.py,sha256=L9h1R2NlVK0C74dPXymaI7wmkWwh9piNEDKiUIEZPKk,3748 +django_extensions/management/commands/create_jobs.py,sha256=d6-wAaKtes7A3GkJwxVso89PBuYnuiiT-XZyZcOU8YQ,2425 +django_extensions/management/commands/create_template_tags.py,sha256=qQ32iY08O8yYjcXwyS2MQZGKbwr1lPL20itakud66K4,2823 +django_extensions/management/commands/delete_squashed_migrations.py,sha256=_Ktv14Yw-w0YvmitUR-1TqZEJjP3uMEt-rDf8pVvV0A,7241 +django_extensions/management/commands/describe_form.py,sha256=LSgGaFjL2mGs5aWoqQefaPXAvhmHoFGTLK5OX9kmpss,2737 +django_extensions/management/commands/drop_test_database.py,sha256=SdsUMoJs-qlcy6umERHQ3B6p7eO4UDPYo6XTA4RAScI,5805 +django_extensions/management/commands/dumpscript.py,sha256=yBec7XSgpkBHMX4Nas6usYHlXTtM5_wdzYYQGtbkJJQ,27651 +django_extensions/management/commands/export_emails.py,sha256=AzR__ZLuVMBR0ZHtLIKI9FCwrjU9QBa5sJA3az-0uSk,5565 +django_extensions/management/commands/find_template.py,sha256=k9Nj_Ll_LdL8dWz-n3eZV7XeYO8h-hRxCIb6ZkiQu-4,695 +django_extensions/management/commands/generate_password.py,sha256=9IYh3FUVGucb2xJOPn4hZutkupPXVkZhwRXop0e_FT4,938 +django_extensions/management/commands/generate_secret_key.py,sha256=83xqSJ7FQQJ04Psl5BnYj4RwG0cUUeqnvMKopk8QXo0,451 +django_extensions/management/commands/graph_models.py,sha256=k9vpQZxxkCwUDRe5_UOkq-ATdWBdWyAIjFuetOUojmo,13180 +django_extensions/management/commands/list_model_info.py,sha256=cfDVmVGNAUDLvgC0rSjRHhK4SX2ALofw6yhHXwVYr-A,6038 +django_extensions/management/commands/list_signals.py,sha256=LIWtwMeJz8Pg1-JPSv9NNi4tsQc0xLr64bWlt7TazwE,2602 +django_extensions/management/commands/mail_debug.py,sha256=9FeOfB5opR1IXbkHqPx6JriQq3qWbSzzofX-D-WVeX8,2894 +django_extensions/management/commands/merge_model_instances.py,sha256=DeoGYz6OnVgprhx3O1gfB9egZ6HYqKk0jJSnFst616w,9552 +django_extensions/management/commands/notes.py,sha256=3sEUcMYk2sNFlbVomXHBJajoQdpRFKlm2IC6AInXhx0,2716 +django_extensions/management/commands/pipchecker.py,sha256=V5p9S9u0FN68buQCOeGr3g6zW-94ki3tVfzetW0bvko,14292 +django_extensions/management/commands/print_settings.py,sha256=pEiCq41QZuoVg4_XtmXabrQquTBJX0TRGeLm1V8N3SM,2640 +django_extensions/management/commands/print_user_for_session.py,sha256=r1Ot7yBsxOwYv8trFuKQVwBXTIUl3m-wyc-Hx_HZ1lA,2144 +django_extensions/management/commands/reset_db.py,sha256=tSXzyMEiAJA6vU_o8wpMOINnjPcLZlAtd70G81dLdMw,7734 +django_extensions/management/commands/reset_schema.py,sha256=aumuxdXbJanxllbulRBbl-OLNvRsxvWLraTUmHJ_a1g,2845 +django_extensions/management/commands/runjob.py,sha256=OMeFDVJgYlTc7NO8aWS-2QgE3pPIwtd8tGrelviGVhE,1987 +django_extensions/management/commands/runjobs.py,sha256=k3Um1dlGPuWIs7P9MPxNDNcCNq3pAdH7cV4xmmcJMRQ,3384 +django_extensions/management/commands/runprofileserver.py,sha256=XBfJqovLmWnXUhdgprBbM8-vgOTm7dM2tZo3Z6OiTFk,11625 +django_extensions/management/commands/runscript.py,sha256=-0nR_Kqs10V3ToB6w4YCTO4igKmmkBhNya__sXpNXlc,12005 +django_extensions/management/commands/runserver_plus.py,sha256=wxZQVWMa0gbbEkG33iUk4PeJQAJSUF_yoHOXEM7GiLQ,21850 +django_extensions/management/commands/set_default_site.py,sha256=LmNNKP84iryahh7cMAVwPlRcJ7EpFsoWTKUpjSxCezQ,2800 +django_extensions/management/commands/set_fake_emails.py,sha256=fZtLNjEFHVre2XZOcbAHRM-C6_o-Zb7_FuQd9vPNLCs,3841 +django_extensions/management/commands/set_fake_passwords.py,sha256=T3TlDt-z0VYAyoq0js7cWLqWqRy2_RZsRvq5t-l1e6Q,1731 +django_extensions/management/commands/shell_plus.py,sha256=Q4itLhgf-GmbBMGndNRpVPi8uH9Mrdv7yAYNLrWo1Wc,21659 +django_extensions/management/commands/show_template_tags.py,sha256=NAiUI80ak_4-szlphl-13RRVv__9MdyO52ELFqDnVvk,3909 +django_extensions/management/commands/show_urls.py,sha256=uz5WNQcykAcmeOf70DDCi-AAUvMkLcmcT1BQ9oAtmi4,9135 +django_extensions/management/commands/sqlcreate.py,sha256=iZ1nsCePzIbPlJKircrAJw_lFNTpAr8pkYwfC9QvqP8,4230 +django_extensions/management/commands/sqldiff.py,sha256=B04cQQT-byyU7J9vtzKzV32GJdvrLlSFzAZRQFN6SSM,63193 +django_extensions/management/commands/sqldsn.py,sha256=DB8W2v3D7wcXeGfCKSaAWyPLFnTYpd5aNW63fWt4dJw,5268 +django_extensions/management/commands/sync_s3.py,sha256=mpz4BjbWJIgSpGKnGbovwzudr0agsErx19aBZfJ1iuY,15720 +django_extensions/management/commands/syncdata.py,sha256=h7QKa0A2HSoTbWpS5U920B02l-Ou-bPr9d-a417ZPFI,9771 +django_extensions/management/commands/unreferenced_files.py,sha256=SMQG4SXhSEkjxSuUteaXVTyJ4StmC9A9mZwYOQBzaco,1787 +django_extensions/management/commands/update_permissions.py,sha256=0KDqKHO5ynSNYtyWkWC9K2uinuSsiAU-hJTy7XO3rnU,3033 +django_extensions/management/commands/validate_templates.py,sha256=GrkhQJQBlGuNI634BLfBToSCirl3b4rh1EzL3OlNyg4,3627 +django_extensions/management/debug_cursor.py,sha256=8f-JS1rt3O-EksKs5hIPB27xlAHQSmaj5icWCeOWqzw,4391 +django_extensions/management/email_notifications.py,sha256=hHPG_1mzJDYf5jchevEOC-rAzhJGM5EOkgYmaRFpk_M,5360 +django_extensions/management/jobs.py,sha256=nPYJH2n2jrjt38TMxBuftvMSHFpgn2hZSa_2XW4mw90,5043 +django_extensions/management/modelviz.py,sha256=kOmEJ8m0EJGcq47hhdsBel6dHaCzIIUAYD-28pY0-go,17254 +django_extensions/management/mysql.py,sha256=xUBDaNhnoGbOPjRtq5zkd5Z8NtmJLdS8MTlHVPigeHQ,1506 +django_extensions/management/notebook_extension.py,sha256=h5-bWrDK8RkoblyiprJZjFRRqbin3Vj8W6PmBWI2KpM,324 +django_extensions/management/shells.py,sha256=2eTZ6s9bSHAtR7u6-IroDuUQAcBGNYxBEhJAPCsxN_8,15410 +django_extensions/management/signals.py,sha256=yWTcyz8hhcB-PLJKeH2UWOAypCIvaeijKy3CfNJ3ZhU,307 +django_extensions/management/technical_response.py,sha256=FbMGGbFMHpwjc6SEQ3vZ0lNmIGL5TnCQzAeDzJzVqBQ,1758 +django_extensions/management/utils.py,sha256=vEWTbV3PrUJwh4r5VK8WGkICTZlAx6uXqo2wypDFAVY,2259 +django_extensions/models.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/mongodb/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/mongodb/__pycache__/__init__.cpython-37.pyc,, +django_extensions/mongodb/__pycache__/models.cpython-37.pyc,, +django_extensions/mongodb/fields/__init__.py,sha256=a9HmyN0YjPG3MN9kM_m79l0fwVaIKWNXa6h3E2PdnvM,9341 +django_extensions/mongodb/fields/__pycache__/__init__.cpython-37.pyc,, +django_extensions/mongodb/fields/__pycache__/json.cpython-37.pyc,, +django_extensions/mongodb/fields/json.py,sha256=ep3CuSkBE5LyixMbmFo2u_jK2D4J9aziIlCra5Fb-w8,2158 +django_extensions/mongodb/models.py,sha256=BVvXqlgVEfWNUy19ykvlwD0qXv0B3gGcIiPi7RBcJjc,2405 +django_extensions/settings.py,sha256=CdN-y7loiLzEyIicwj1OQPViTFZZQdXHNTnKxMipzg8,1079 +django_extensions/static/django_extensions/css/jquery.autocomplete.css,sha256=3yUz9XJFKdXHv34Xe4QNWjA9ghEr2ieEoQ0KaO3e49Q,740 +django_extensions/static/django_extensions/img/indicator.gif,sha256=0-OUTUZJRQ3uZqVcae7O0tgltsoaNJ9yx1_TeArj8AY,1553 +django_extensions/static/django_extensions/js/jquery.ajaxQueue.js,sha256=IVCgQ2MMHxrmrHMc4Pu0TxdEaVhuQSofxotZgEffUdk,2911 +django_extensions/static/django_extensions/js/jquery.autocomplete.js,sha256=5DV9zxN6TgVpbkscqlkoiK5qhEEGdmxV2v7d265QQog,36679 +django_extensions/static/django_extensions/js/jquery.bgiframe.js,sha256=JLLyZyn1DRAFry-ikBRSrf0qfX6PsqTFkwnPu9jj68k,1820 +django_extensions/templates/django_extensions/graph_models/django2018/digraph.dot,sha256=dqhYYv2LnG31IFxqooP5zplpABcQKxgSkLDdX1rL6EI,818 +django_extensions/templates/django_extensions/graph_models/django2018/label.dot,sha256=vsKxchMm6DQVTPx8gFxijpHOGNJuqdItN2WEI8mvc14,1875 +django_extensions/templates/django_extensions/graph_models/django2018/relation.dot,sha256=6KlECRFCmCmTTOQs5vYEr2sPWdDgiUbgH4ZkWLt_SjE,589 +django_extensions/templates/django_extensions/graph_models/original/digraph.dot,sha256=D2Kh5rWOJcIFeXChDHm7hotL0sTqgnGQpghWDHkUyZM,823 +django_extensions/templates/django_extensions/graph_models/original/label.dot,sha256=0-UHhFDl-XTkOr1wUAoEBd-xSfnAea922vUX0N1cCeQ,1697 +django_extensions/templates/django_extensions/graph_models/original/relation.dot,sha256=Y-wvocs_14QreSILBv9ESWvnF6B3pUcrRrjx_q0oINk,591 +django_extensions/templates/django_extensions/widgets/foreignkey_searchinput.html,sha256=8DhLt6B0oUlpVq1gSoPy4uImyJxUueUczwYHraZeKNg,2032 +django_extensions/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +django_extensions/templatetags/__pycache__/__init__.cpython-37.pyc,, +django_extensions/templatetags/__pycache__/debugger_tags.cpython-37.pyc,, +django_extensions/templatetags/__pycache__/highlighting.cpython-37.pyc,, +django_extensions/templatetags/__pycache__/indent_text.cpython-37.pyc,, +django_extensions/templatetags/__pycache__/syntax_color.cpython-37.pyc,, +django_extensions/templatetags/__pycache__/widont.cpython-37.pyc,, +django_extensions/templatetags/debugger_tags.py,sha256=M6RUSObtGln_LQXDeu8m396auIOAsxdnJQa3AeV5T1I,596 +django_extensions/templatetags/highlighting.py,sha256=v94urI9kE6-Z-2Cm0F5glgY-crh89fp0jdKsFNl_FOk,3224 +django_extensions/templatetags/indent_text.py,sha256=ByaKtl7VaPBx_4PB3V-Bg9foY1zvraZ2VNHBh5gBdek,1751 +django_extensions/templatetags/syntax_color.py,sha256=X6aMvDIxHHBt_AFaR4qXHAmafpPsitZshUN4_FiJ1Pc,3171 +django_extensions/templatetags/widont.py,sha256=6uTu7oGT98rPy1TaTRUOE3A6LkLell_XyVIWPmt_uZo,1925 +django_extensions/utils/__init__.py,sha256=Xb0RrRwc1dqCwkASV8I2MSLy14c_FhmE1HeaxxaeO1E,70 +django_extensions/utils/__pycache__/__init__.cpython-37.pyc,, +django_extensions/utils/__pycache__/deprecation.cpython-37.pyc,, +django_extensions/utils/__pycache__/dia2django.cpython-37.pyc,, +django_extensions/utils/__pycache__/internal_ips.cpython-37.pyc,, +django_extensions/utils/deprecation.py,sha256=XfN9X_w6PGMvQ5JldtdYZyqSNvO5w9TTaST8nZvQl2U,155 +django_extensions/utils/dia2django.py,sha256=YWerQ-Fh5qgH5C72riN3jrqT64BEF3u0L0H2dbUMgx0,10177 +django_extensions/utils/internal_ips.py,sha256=O8XzFk_In7xSaSAtTjKMorSyib7GxiPTVeAapad80QM,1952 +django_extensions/validators.py,sha256=mTPGQ5xVqo8ei4Zmuz8uusaI-sjVa2qLrPZpG_iB__g,3754 diff --git a/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/REQUESTED b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/WHEEL b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/WHEEL new file mode 100644 index 0000000..83ff02e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.35.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/top_level.txt b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/top_level.txt new file mode 100644 index 0000000..ee49386 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions-3.1.0.dist-info/top_level.txt @@ -0,0 +1 @@ +django_extensions diff --git a/venv/lib/python3.7/site-packages/django_extensions/__init__.py b/venv/lib/python3.7/site-packages/django_extensions/__init__.py new file mode 100644 index 0000000..0330155 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/__init__.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +VERSION = (3, 1, 0) + + +def get_version(version): + """Dynamically calculate the version based on VERSION tuple.""" + if len(version) > 2 and version[2] is not None: + if isinstance(version[2], int): + str_version = "%s.%s.%s" % version[:3] + else: + str_version = "%s.%s_%s" % version[:3] + else: + str_version = "%s.%s" % version[:2] + + return str_version + + +__version__ = get_version(VERSION) + +default_app_config = 'django_extensions.apps.DjangoExtensionsConfig' diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..f8ea9f8 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/__init__.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/apps.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/apps.cpython-37.pyc new file mode 100644 index 0000000..7f77170 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/apps.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/collision_resolvers.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/collision_resolvers.cpython-37.pyc new file mode 100644 index 0000000..07fdfff Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/collision_resolvers.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/compat.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/compat.cpython-37.pyc new file mode 100644 index 0000000..10f5f9e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/compat.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/import_subclasses.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/import_subclasses.cpython-37.pyc new file mode 100644 index 0000000..8565da1 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/import_subclasses.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/models.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/models.cpython-37.pyc new file mode 100644 index 0000000..b37251e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/models.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/settings.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/settings.cpython-37.pyc new file mode 100644 index 0000000..1a1a371 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/settings.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/__pycache__/validators.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/validators.cpython-37.pyc new file mode 100644 index 0000000..1d54168 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/__pycache__/validators.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/admin/__init__.py b/venv/lib/python3.7/site-packages/django_extensions/admin/__init__.py new file mode 100644 index 0000000..01bd709 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/admin/__init__.py @@ -0,0 +1,165 @@ +# -*- coding: utf-8 -*- +# +# Autocomplete feature for admin panel +# +import operator +from functools import update_wrapper, reduce +from typing import Tuple, Dict, Callable # NOQA + +from django.apps import apps +from django.http import HttpResponse, HttpResponseNotFound +from django.conf import settings +from django.db import models +from django.db.models.query import QuerySet +from django.utils.encoding import smart_str +from django.utils.translation import gettext as _ +from django.utils.text import get_text_list +from django.contrib import admin + +from django_extensions.admin.widgets import ForeignKeySearchInput + + +class ForeignKeyAutocompleteAdminMixin: + """ + Admin class for models using the autocomplete feature. + + There are two additional fields: + - related_search_fields: defines fields of managed model that + have to be represented by autocomplete input, together with + a list of target model fields that are searched for + input string, e.g.: + + related_search_fields = { + 'author': ('first_name', 'email'), + } + + - related_string_functions: contains optional functions which + take target model instance as only argument and return string + representation. By default __unicode__() method of target + object is used. + + And also an optional additional field to set the limit on the + results returned by the autocomplete query. You can set this integer + value in your settings file using FOREIGNKEY_AUTOCOMPLETE_LIMIT or + you can set this per ForeignKeyAutocompleteAdmin basis. If any value + is set the results will not be limited. + """ + + related_search_fields = {} # type: Dict[str, Tuple[str]] + related_string_functions = {} # type: Dict[str, Callable] + autocomplete_limit = getattr(settings, 'FOREIGNKEY_AUTOCOMPLETE_LIMIT', None) + + def get_urls(self): + from django.urls import path + + def wrap(view): + def wrapper(*args, **kwargs): + return self.admin_site.admin_view(view)(*args, **kwargs) + return update_wrapper(wrapper, view) + + return [ + path('foreignkey_autocomplete/', wrap(self.foreignkey_autocomplete), + name='%s_%s_autocomplete' % (self.model._meta.app_label, self.model._meta.model_name)) + ] + super().get_urls() + + def foreignkey_autocomplete(self, request): + """ + Search in the fields of the given related model and returns the + result as a simple string to be used by the jQuery Autocomplete plugin + """ + query = request.GET.get('q', None) + app_label = request.GET.get('app_label', None) + model_name = request.GET.get('model_name', None) + search_fields = request.GET.get('search_fields', None) + object_pk = request.GET.get('object_pk', None) + + try: + to_string_function = self.related_string_functions[model_name] + except KeyError: + to_string_function = lambda x: x.__str__() + + if search_fields and app_label and model_name and (query or object_pk): + def construct_search(field_name): + # use different lookup methods depending on the notation + if field_name.startswith('^'): + return "%s__istartswith" % field_name[1:] + elif field_name.startswith('='): + return "%s__iexact" % field_name[1:] + elif field_name.startswith('@'): + return "%s__search" % field_name[1:] + else: + return "%s__icontains" % field_name + + model = apps.get_model(app_label, model_name) + + queryset = model._default_manager.all() + data = '' + if query: + for bit in query.split(): + or_queries = [models.Q(**{construct_search(smart_str(field_name)): smart_str(bit)}) for field_name in search_fields.split(',')] + other_qs = QuerySet(model) + other_qs.query.select_related = queryset.query.select_related + other_qs = other_qs.filter(reduce(operator.or_, or_queries)) + queryset = queryset & other_qs + + additional_filter = self.get_related_filter(model, request) + if additional_filter: + queryset = queryset.filter(additional_filter) + + if self.autocomplete_limit: + queryset = queryset[:self.autocomplete_limit] + + data = ''.join([str('%s|%s\n') % (to_string_function(f), f.pk) for f in queryset]) + elif object_pk: + try: + obj = queryset.get(pk=object_pk) + except Exception: # FIXME: use stricter exception checking + pass + else: + data = to_string_function(obj) + return HttpResponse(data, content_type='text/plain') + return HttpResponseNotFound() + + def get_related_filter(self, model, request): + """ + Given a model class and current request return an optional Q object + that should be applied as an additional filter for autocomplete query. + If no additional filtering is needed, this method should return + None. + """ + return None + + def get_help_text(self, field_name, model_name): + searchable_fields = self.related_search_fields.get(field_name, None) + if searchable_fields: + help_kwargs = { + 'model_name': model_name, + 'field_list': get_text_list(searchable_fields, _('and')), + } + return _('Use the left field to do %(model_name)s lookups in the fields %(field_list)s.') % help_kwargs + return '' + + def formfield_for_dbfield(self, db_field, **kwargs): + """ + Override the default widget for Foreignkey fields if they are + specified in the related_search_fields class attribute. + """ + if isinstance(db_field, models.ForeignKey) and db_field.name in self.related_search_fields: + help_text = self.get_help_text(db_field.name, db_field.remote_field.model._meta.object_name) + if kwargs.get('help_text'): + help_text = str('%s %s') % (kwargs['help_text'], help_text) + kwargs['widget'] = ForeignKeySearchInput(db_field.remote_field, self.related_search_fields[db_field.name]) + kwargs['help_text'] = help_text + return super().formfield_for_dbfield(db_field, **kwargs) + + +class ForeignKeyAutocompleteAdmin(ForeignKeyAutocompleteAdminMixin, admin.ModelAdmin): + pass + + +class ForeignKeyAutocompleteTabularInline(ForeignKeyAutocompleteAdminMixin, admin.TabularInline): + pass + + +class ForeignKeyAutocompleteStackedInline(ForeignKeyAutocompleteAdminMixin, admin.StackedInline): + pass diff --git a/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..d8f166d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/__init__.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/filter.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/filter.cpython-37.pyc new file mode 100644 index 0000000..2a9764c Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/filter.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/widgets.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/widgets.cpython-37.pyc new file mode 100644 index 0000000..53c504e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/admin/__pycache__/widgets.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/admin/filter.py b/venv/lib/python3.7/site-packages/django_extensions/admin/filter.py new file mode 100644 index 0000000..cc9a67a --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/admin/filter.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +from django.contrib.admin import FieldListFilter +from django.contrib.admin.utils import prepare_lookup_value +from django.utils.translation import gettext_lazy as _ + + +class NullFieldListFilter(FieldListFilter): + def __init__(self, field, request, params, model, model_admin, field_path): + self.lookup_kwarg = '{0}__isnull'.format(field_path) + super().__init__(field, request, params, model, model_admin, field_path) + lookup_choices = self.lookups(request, model_admin) + self.lookup_choices = () if lookup_choices is None else list(lookup_choices) + + def expected_parameters(self): + return [self.lookup_kwarg] + + def value(self): + return self.used_parameters.get(self.lookup_kwarg, None) + + def lookups(self, request, model_admin): + return ( + ('1', _('Yes')), + ('0', _('No')), + ) + + def choices(self, cl): + yield { + 'selected': self.value() is None, + 'query_string': cl.get_query_string({}, [self.lookup_kwarg]), + 'display': _('All'), + } + for lookup, title in self.lookup_choices: + yield { + 'selected': self.value() == prepare_lookup_value(self.lookup_kwarg, lookup), + 'query_string': cl.get_query_string({ + self.lookup_kwarg: lookup, + }, []), + 'display': title, + } + + def queryset(self, request, queryset): + if self.value() is not None: + kwargs = {self.lookup_kwarg: self.value()} + return queryset.filter(**kwargs) + return queryset + + +class NotNullFieldListFilter(NullFieldListFilter): + def lookups(self, request, model_admin): + return ( + ('0', _('Yes')), + ('1', _('No')), + ) diff --git a/venv/lib/python3.7/site-packages/django_extensions/admin/widgets.py b/venv/lib/python3.7/site-packages/django_extensions/admin/widgets.py new file mode 100644 index 0000000..816fb4e --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/admin/widgets.py @@ -0,0 +1,90 @@ +# -*- coding: utf-8 -*- +import urllib + +from django import forms +from django.contrib.admin.sites import site +from django.contrib.admin.widgets import ForeignKeyRawIdWidget +from django.template.loader import render_to_string +from django.templatetags.static import static +from django.urls import reverse +from django.utils.safestring import mark_safe +from django.utils.text import Truncator + + +class ForeignKeySearchInput(ForeignKeyRawIdWidget): + """ + Widget for displaying ForeignKeys in an autocomplete search input + instead in a + + diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/__init__.py b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..d56110a Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/__init__.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/debugger_tags.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/debugger_tags.cpython-37.pyc new file mode 100644 index 0000000..b418e81 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/debugger_tags.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/highlighting.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/highlighting.cpython-37.pyc new file mode 100644 index 0000000..f5f379e Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/highlighting.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/indent_text.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/indent_text.cpython-37.pyc new file mode 100644 index 0000000..630d5ed Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/indent_text.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/syntax_color.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/syntax_color.cpython-37.pyc new file mode 100644 index 0000000..74b4bac Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/syntax_color.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/widont.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/widont.cpython-37.pyc new file mode 100644 index 0000000..f12b967 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/templatetags/__pycache__/widont.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/debugger_tags.py b/venv/lib/python3.7/site-packages/django_extensions/templatetags/debugger_tags.py new file mode 100644 index 0000000..93f2ddc --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/templatetags/debugger_tags.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +""" +Make debugging Django templates easier. + +Example: + + {% load debugger_tags %} + + {{ object|ipdb }} + +""" + +from django import template + + +register = template.Library() + + +@register.filter +def ipdb(obj): # pragma: no cover + """Interactive Python debugger filter.""" + __import__('ipdb').set_trace() + return obj + + +@register.filter +def pdb(obj): + """Python debugger filter.""" + __import__('pdb').set_trace() + return obj + + +@register.filter +def wdb(obj): # pragma: no cover + """Web debugger filter.""" + __import__('wdb').set_trace() + return obj diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/highlighting.py b/venv/lib/python3.7/site-packages/django_extensions/templatetags/highlighting.py new file mode 100644 index 0000000..a38d39d --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/templatetags/highlighting.py @@ -0,0 +1,102 @@ +# -*- coding: utf-8 -*- +""" +Similar to syntax_color.py but this is intended more for being able to +copy+paste actual code into your Django templates without needing to +escape or anything crazy. + +http://lobstertech.com/2008/aug/30/django_syntax_highlight_template_tag/ + +Example: + + {% load highlighting %} + + + +

check out this code

+ + {% highlight 'python' 'Excerpt: blah.py' %} + def need_food(self): + print("Love is than &death&") + {% endhighlight %} +""" + +from django import template +from django.template import ( + Context, Node, Template, TemplateSyntaxError, Variable, +) +from django.template.defaultfilters import stringfilter +from django.utils.safestring import mark_safe + +try: + from pygments import highlight as pyghighlight + from pygments.lexers import get_lexer_by_name + from pygments.formatters import HtmlFormatter + HAS_PYGMENTS = True +except ImportError: # pragma: no cover + HAS_PYGMENTS = False + +register = template.Library() + + +@register.filter(is_safe=True) +@stringfilter +def parse_template(value): + return mark_safe(Template(value).render(Context())) + + +class CodeNode(Node): + def __init__(self, language, nodelist, name=''): + self.language = Variable(language) + self.nodelist = nodelist + if name: + self.name = Variable(name) + else: + self.name = None + + def render(self, context): + code = self.nodelist.render(context).strip() + lexer = get_lexer_by_name(self.language.resolve(context)) + formatter = HtmlFormatter(linenos=False) + html = "" + if self.name: + name = self.name.resolve(context) + html = '
%s
' % name + return html + pyghighlight(code, lexer, formatter) + + +@register.tag +def highlight(parser, token): + """ + Tag to put a highlighted source code
 block in your code.
+    This takes two arguments, the language and a little explaination message
+    that will be generated before the code.  The second argument is optional.
+
+    Your code will be fed through pygments so you can use any language it
+    supports.
+
+    Usage::
+
+      {% load highlighting %}
+      {% highlight 'python' 'Excerpt: blah.py' %}
+      def need_food(self):
+          print("Love is colder than death")
+      {% endhighlight %}
+
+    """
+    if not HAS_PYGMENTS:  # pragma: no cover
+        raise ImportError("Please install 'pygments' library to use highlighting.")
+    nodelist = parser.parse(('endhighlight',))
+    parser.delete_first_token()
+    bits = token.split_contents()[1:]
+    if len(bits) < 1:
+        raise TemplateSyntaxError("'highlight' statement requires an argument")
+    return CodeNode(bits[0], nodelist, *bits[1:])
diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/indent_text.py b/venv/lib/python3.7/site-packages/django_extensions/templatetags/indent_text.py
new file mode 100644
index 0000000..cb9f1a7
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/django_extensions/templatetags/indent_text.py
@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+from django import template
+
+register = template.Library()
+
+
+class IndentByNode(template.Node):
+    def __init__(self, nodelist, indent_level, if_statement):
+        self.nodelist = nodelist
+        self.indent_level = template.Variable(indent_level)
+        if if_statement:
+            self.if_statement = template.Variable(if_statement)
+        else:
+            self.if_statement = None
+
+    def render(self, context):
+        indent_level = self.indent_level.resolve(context)
+        if self.if_statement:
+            try:
+                if_statement = bool(self.if_statement.resolve(context))
+            except template.VariableDoesNotExist:
+                if_statement = False
+        else:
+            if_statement = True
+        output = self.nodelist.render(context)
+        if if_statement:
+            indent = " " * indent_level
+            output = indent + indent.join(output.splitlines(True))
+        return output
+
+
+@register.tag
+def indentby(parser, token):
+    """
+    Add indentation to text between the tags by the given indentation level.
+
+    {% indentby  [if ] %}
+    ...
+    {% endindentby %}
+
+    Arguments:
+      indent_level - Number of spaces to indent text with.
+      statement - Only apply indent_level if the boolean statement evalutates to True.
+    """
+    args = token.split_contents()
+    largs = len(args)
+    if largs not in (2, 4):
+        raise template.TemplateSyntaxError("indentby tag requires 1 or 3 arguments")
+    indent_level = args[1]
+    if_statement = None
+    if largs == 4:
+        if_statement = args[3]
+    nodelist = parser.parse(('endindentby', ))
+    parser.delete_first_token()
+    return IndentByNode(nodelist, indent_level, if_statement)
diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/syntax_color.py b/venv/lib/python3.7/site-packages/django_extensions/templatetags/syntax_color.py
new file mode 100644
index 0000000..986b5a9
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/django_extensions/templatetags/syntax_color.py
@@ -0,0 +1,111 @@
+# -*- coding: utf-8 -*-
+r"""
+Template filter for rendering a string with syntax highlighting.
+It relies on Pygments to accomplish this.
+
+Some standard usage examples (from within Django templates).
+Coloring a string with the Python lexer:
+
+    {% load syntax_color %}
+    {{ code_string|colorize:"python" }}
+
+You may use any lexer in Pygments. The complete list of which
+can be found [on the Pygments website][1].
+
+[1]: http://pygments.org/docs/lexers/
+
+You may also have Pygments attempt to guess the correct lexer for
+a particular string. However, if may not be able to choose a lexer,
+in which case it will simply return the string unmodified. This is
+less efficient compared to specifying the lexer to use.
+
+    {{ code_string|colorize }}
+
+You may also render the syntax highlighed text with line numbers.
+
+    {% load syntax_color %}
+    {{ some_code|colorize_table:"html+django" }}
+    {{ let_pygments_pick_for_this_code|colorize_table }}
+
+Please note that before you can load the ``syntax_color`` template filters
+you will need to add the ``django_extensions.utils`` application to the
+``INSTALLED_APPS``setting in your project's ``settings.py`` file.
+"""
+import os
+
+from django import template
+from django.template.defaultfilters import stringfilter
+from django.utils.safestring import mark_safe
+
+try:
+    from pygments import highlight
+    from pygments.formatters import HtmlFormatter
+    from pygments.lexers import get_lexer_by_name, guess_lexer, ClassNotFound
+    HAS_PYGMENTS = True
+except ImportError:  # pragma: no cover
+    HAS_PYGMENTS = False
+
+__author__ = 'Will Larson '
+
+
+register = template.Library()
+
+
+def pygments_required(func):
+    """Raise ImportError if pygments is not installed."""
+    def wrapper(*args, **kwargs):
+        if not HAS_PYGMENTS:  # pragma: no cover
+            raise ImportError(
+                "Please install 'pygments' library to use syntax_color.")
+        rv = func(*args, **kwargs)
+        return rv
+    return wrapper
+
+
+@pygments_required
+@register.simple_tag
+def pygments_css():
+    return HtmlFormatter().get_style_defs('.highlight')
+
+
+def generate_pygments_css(path=None):
+    path = os.path.join(path or os.getcwd(), 'pygments.css')
+    f = open(path, 'w')
+    f.write(pygments_css())
+    f.close()
+
+
+def get_lexer(value, arg):
+    if arg is None:
+        return guess_lexer(value)
+    return get_lexer_by_name(arg)
+
+
+@pygments_required
+@register.filter(name='colorize')
+@stringfilter
+def colorize(value, arg=None):
+    try:
+        return mark_safe(highlight(value, get_lexer(value, arg), HtmlFormatter()))
+    except ClassNotFound:
+        return value
+
+
+@pygments_required
+@register.filter(name='colorize_table')
+@stringfilter
+def colorize_table(value, arg=None):
+    try:
+        return mark_safe(highlight(value, get_lexer(value, arg), HtmlFormatter(linenos='table')))
+    except ClassNotFound:
+        return value
+
+
+@pygments_required
+@register.filter(name='colorize_noclasses')
+@stringfilter
+def colorize_noclasses(value, arg=None):
+    try:
+        return mark_safe(highlight(value, get_lexer(value, arg), HtmlFormatter(noclasses=True)))
+    except ClassNotFound:
+        return value
diff --git a/venv/lib/python3.7/site-packages/django_extensions/templatetags/widont.py b/venv/lib/python3.7/site-packages/django_extensions/templatetags/widont.py
new file mode 100644
index 0000000..8bc9315
--- /dev/null
+++ b/venv/lib/python3.7/site-packages/django_extensions/templatetags/widont.py
@@ -0,0 +1,64 @@
+# -*- coding: utf-8 -*-
+import re
+
+from django.template import Library
+from django.utils.encoding import force_str
+
+
+register = Library()
+re_widont = re.compile(r'\s+(\S+\s*)$')
+re_widont_html = re.compile(r'([^<>\s])\s+([^<>\s]+\s*)(]*>|$)', re.IGNORECASE)
+
+
+@register.filter
+def widont(value, count=1):
+    """
+    Add an HTML non-breaking space between the final two words of the string to
+    avoid "widowed" words.
+
+    Examples:
+
+    >>> print(widont('Test   me   out'))
+    Test   me out
+
+    >>> print("'",widont('It works with trailing spaces too  '), "'")
+    ' It works with trailing spaces too   '
+
+    >>> print(widont('NoEffect'))
+    NoEffect
+    """
+    def replace(matchobj):
+        return force_str(' %s' % matchobj.group(1))
+    for i in range(count):
+        value = re_widont.sub(replace, force_str(value))
+    return value
+
+
+@register.filter
+def widont_html(value):
+    """
+    Add an HTML non-breaking space between the final two words at the end of
+    (and in sentences just outside of) block level tags to avoid "widowed"
+    words.
+
+    Examples:
+
+    >>> print(widont_html('

Here is a simple example

Single

')) +

Here is a simple example

Single

+ + >>> print(widont_html('

test me
out

Ok?

Not in a p

and this

')) +

test me
out

Ok?

Not in a p

and this

+ + >>> print(widont_html('leading text

test me out

trailing text')) + leading text

test me out

trailing text + """ + def replace(matchobj): + return force_str('%s %s%s' % matchobj.groups()) + return re_widont_html.sub(replace, force_str(value)) + + +if __name__ == "__main__": + def _test(): + import doctest + doctest.testmod() + _test() diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/__init__.py b/venv/lib/python3.7/site-packages/django_extensions/utils/__init__.py new file mode 100644 index 0000000..a5923e8 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/utils/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from .internal_ips import InternalIPS # NOQA diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/__init__.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/__init__.cpython-37.pyc new file mode 100644 index 0000000..989bb30 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/__init__.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/deprecation.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/deprecation.cpython-37.pyc new file mode 100644 index 0000000..64cb89d Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/deprecation.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/dia2django.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/dia2django.cpython-37.pyc new file mode 100644 index 0000000..0b50263 Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/dia2django.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/internal_ips.cpython-37.pyc b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/internal_ips.cpython-37.pyc new file mode 100644 index 0000000..6b2729f Binary files /dev/null and b/venv/lib/python3.7/site-packages/django_extensions/utils/__pycache__/internal_ips.cpython-37.pyc differ diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/deprecation.py b/venv/lib/python3.7/site-packages/django_extensions/utils/deprecation.py new file mode 100644 index 0000000..e5542c6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/utils/deprecation.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- + +class MarkedForDeprecationWarning(DeprecationWarning): + pass + + +class RemovedInNextVersionWarning(DeprecationWarning): + pass diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/dia2django.py b/venv/lib/python3.7/site-packages/django_extensions/utils/dia2django.py new file mode 100644 index 0000000..d2e5ba3 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/utils/dia2django.py @@ -0,0 +1,217 @@ +# -*- coding: utf-8 -*- +""" +Author Igor Támara igor@tamarapatino.org +Use this little program as you wish, if you +include it in your work, let others know you +are using it preserving this note, you have +the right to make derivative works, Use it +at your own risk. +Tested to work on(etch testing 13-08-2007): + Python 2.4.4 (#2, Jul 17 2007, 11:56:54) + [GCC 4.1.3 20070629 (prerelease) (Debian 4.1.2-13)] on linux2 +""" + +import codecs +import gzip +import re +import sys +from xml.dom.minidom import Node, parseString + +dependclasses = ["User", "Group", "Permission", "Message"] + +# Type dictionary translation types SQL -> Django +tsd = { + "text": "TextField", + "date": "DateField", + "varchar": "CharField", + "int": "IntegerField", + "float": "FloatField", + "serial": "AutoField", + "boolean": "BooleanField", + "numeric": "FloatField", + "timestamp": "DateTimeField", + "bigint": "IntegerField", + "datetime": "DateTimeField", + "time": "TimeField", + "bool": "BooleanField", +} + +# convert varchar -> CharField +v2c = re.compile(r'varchar\((\d+)\)') + + +def find_index(fks, id_): + """ + Look for the id on fks, fks is an array of arrays, each array has on [1] + the id of the class in a dia diagram. When not present returns None, else + it returns the position of the class with id on fks + """ + for i, _ in fks.items(): + if fks[i][1] == id_: + return i + return None + + +def addparentstofks(rels, fks): + """ + Get a list of relations, between parents and sons and a dict of + clases named in dia, and modifies the fks to add the parent as fk to get + order on the output of classes and replaces the base class of the son, to + put the class parent name. + """ + for j in rels: + son = find_index(fks, j[1]) + parent = find_index(fks, j[0]) + fks[son][2] = fks[son][2].replace("models.Model", parent) + if parent not in fks[son][0]: + fks[son][0].append(parent) + + +def dia2django(archivo): + models_txt = '' + f = codecs.open(archivo, "rb") + # dia files are gzipped + data = gzip.GzipFile(fileobj=f).read() + ppal = parseString(data) + # diagram -> layer -> object -> UML - Class -> name, (attribs : composite -> name,type) + datos = ppal.getElementsByTagName("dia:diagram")[0].getElementsByTagName("dia:layer")[0].getElementsByTagName("dia:object") + clases = {} + herit = [] + imports = str("") + for i in datos: + # Look for the classes + if i.getAttribute("type") == "UML - Class": + myid = i.getAttribute("id") + for j in i.childNodes: + if j.nodeType == Node.ELEMENT_NODE and j.hasAttributes(): + if j.getAttribute("name") == "name": + actclas = j.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] + myname = "\nclass %s(models.Model) :\n" % actclas + clases[actclas] = [[], myid, myname, 0] + if j.getAttribute("name") == "attributes": + for ll in j.getElementsByTagName("dia:composite"): + if ll.getAttribute("type") == "umlattribute": + # Look for the attribute name and type + for k in ll.getElementsByTagName("dia:attribute"): + if k.getAttribute("name") == "name": + nc = k.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] + elif k.getAttribute("name") == "type": + tc = k.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] + elif k.getAttribute("name") == "value": + val = k.getElementsByTagName("dia:string")[0].childNodes[0].data[1:-1] + if val == '##': + val = '' + elif k.getAttribute("name") == "visibility" and k.getElementsByTagName("dia:enum")[0].getAttribute("val") == "2": + if tc.replace(" ", "").lower().startswith("manytomanyfield("): + # If we find a class not in our model that is marked as being to another model + newc = tc.replace(" ", "")[16:-1] + if dependclasses.count(newc) == 0: + dependclasses.append(newc) + if tc.replace(" ", "").lower().startswith("foreignkey("): + # If we find a class not in our model that is marked as being to another model + newc = tc.replace(" ", "")[11:-1] + if dependclasses.count(newc) == 0: + dependclasses.append(newc) + + # Mapping SQL types to Django + varch = v2c.search(tc) + if tc.replace(" ", "").startswith("ManyToManyField("): + myfor = tc.replace(" ", "")[16:-1] + if actclas == myfor: + # In case of a recursive type, we use 'self' + tc = tc.replace(myfor, "'self'") + elif clases[actclas][0].count(myfor) == 0: + # Adding related class + if myfor not in dependclasses: + # In case we are using Auth classes or external via protected dia visibility + clases[actclas][0].append(myfor) + tc = "models." + tc + if len(val) > 0: + tc = tc.replace(")", "," + val + ")") + elif tc.find("Field") != -1: + if tc.count("()") > 0 and len(val) > 0: + tc = "models.%s" % tc.replace(")", "," + val + ")") + else: + tc = "models.%s(%s)" % (tc, val) + elif tc.replace(" ", "").startswith("ForeignKey("): + myfor = tc.replace(" ", "")[11:-1] + if actclas == myfor: + # In case of a recursive type, we use 'self' + tc = tc.replace(myfor, "'self'") + elif clases[actclas][0].count(myfor) == 0: + # Adding foreign classes + if myfor not in dependclasses: + # In case we are using Auth classes + clases[actclas][0].append(myfor) + tc = "models." + tc + if len(val) > 0: + tc = tc.replace(")", "," + val + ")") + elif varch is None: + tc = "models." + tsd[tc.strip().lower()] + "(" + val + ")" + else: + tc = "models.CharField(max_length=" + varch.group(1) + ")" + if len(val) > 0: + tc = tc.replace(")", ", " + val + " )") + if not (nc == "id" and tc == "AutoField()"): + clases[actclas][2] += " %s = %s\n" % (nc, tc) + elif i.getAttribute("type") == "UML - Generalization": + mycons = ['A', 'A'] + a = i.getElementsByTagName("dia:connection") + for j in a: + if len(j.getAttribute("to")): + mycons[int(j.getAttribute("handle"))] = j.getAttribute("to") + print(mycons) + if 'A' not in mycons: + herit.append(mycons) + elif i.getAttribute("type") == "UML - SmallPackage": + a = i.getElementsByTagName("dia:string") + for j in a: + if len(j.childNodes[0].data[1:-1]): + imports += str("from %s.models import *" % j.childNodes[0].data[1:-1]) + + addparentstofks(herit, clases) + # Ordering the appearance of classes + # First we make a list of the classes each classs is related to. + ordered = [] + for j, k in clases.items(): + k[2] += "\n def __str__(self):\n return u\"\"\n" + for fk in k[0]: + if fk not in dependclasses: + clases[fk][3] += 1 + ordered.append([j] + k) + + i = 0 + while i < len(ordered): + mark = i + j = i + 1 + while j < len(ordered): + if ordered[i][0] in ordered[j][1]: + mark = j + j += 1 + if mark == i: + i += 1 + else: + # swap %s in %s" % ( ordered[i] , ordered[mark]) to make ordered[i] to be at the end + if ordered[i][0] in ordered[mark][1] and ordered[mark][0] in ordered[i][1]: + # Resolving simplistic circular ForeignKeys + print("Not able to resolve circular ForeignKeys between %s and %s" % (ordered[i][1], ordered[mark][0])) + break + a = ordered[i] + ordered[i] = ordered[mark] + ordered[mark] = a + if i == len(ordered) - 1: + break + ordered.reverse() + if imports: + models_txt = str(imports) + for i in ordered: + models_txt += '%s\n' % str(i[3]) + + return models_txt + + +if __name__ == '__main__': + if len(sys.argv) == 2: + dia2django(sys.argv[1]) + else: + print(" Use:\n \n " + sys.argv[0] + " diagram.dia\n\n") diff --git a/venv/lib/python3.7/site-packages/django_extensions/utils/internal_ips.py b/venv/lib/python3.7/site-packages/django_extensions/utils/internal_ips.py new file mode 100644 index 0000000..b72e713 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/utils/internal_ips.py @@ -0,0 +1,70 @@ +# -*- coding: utf-8 -*- +from collections.abc import Container +import ipaddress +import itertools + + +class InternalIPS(Container): + """ + InternalIPS allows to specify CIDRs for INTERNAL_IPS. + + It takes an iterable of ip addresses or ranges. + + Inspiration taken from netaddr.IPSet, please use it if you can since + it support more advanced features like optimizing ranges and lookups. + """ + + __slots__ = ["_cidrs"] + + def __init__(self, iterable, sort_by_size=False): + """ + Constructor. + + :param iterable: (optional) an iterable containing IP addresses and + subnets. + + :param sort_by_size: sorts internal list according to size of ip + ranges, largest first. + """ + self._cidrs = [] + for address in iterable: + self._cidrs.append(ipaddress.ip_network(address)) + + if sort_by_size: + self._cidrs = sorted(self._cidrs) + + def __contains__(self, address): + """ + :param ip: An IP address or subnet. + + :return: ``True`` if IP address or subnet is a member of this InternalIPS set. + """ + address = ipaddress.ip_address(address) + for cidr in self._cidrs: + if address in cidr: + return True + return False + + def __hash__(self): + """ + Raises ``TypeError`` if this method is called. + """ + raise TypeError('InternalIPS containers are unhashable!') + + def __len__(self): + """ + :return: the cardinality of this InternalIPS set. + """ + return sum(cidr.num_addresses for cidr in self._cidrs) + + def __iter__(self): + """ + :return: an iterator over the IP addresses within this IP set. + """ + return itertools.chain(*self._cidrs) + + def iter_cidrs(self): + """ + :return: an iterator over individual IP subnets within this IP set. + """ + return sorted(self._cidrs) diff --git a/venv/lib/python3.7/site-packages/django_extensions/validators.py b/venv/lib/python3.7/site-packages/django_extensions/validators.py new file mode 100644 index 0000000..5bddff6 --- /dev/null +++ b/venv/lib/python3.7/site-packages/django_extensions/validators.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +import unicodedata +import binascii + +from django.core.exceptions import ValidationError +from django.utils.deconstruct import deconstructible +from django.utils.encoding import force_str +from django.utils.translation import gettext_lazy as _ + + +@deconstructible +class NoControlCharactersValidator: + message = _("Control Characters like new lines or tabs are not allowed.") + code = "no_control_characters" + whitelist = None + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + if whitelist: + self.whitelist = whitelist + + def __call__(self, value): + value = force_str(value) + whitelist = self.whitelist + category = unicodedata.category + for character in value: + if whitelist and character in whitelist: + continue + if category(character)[0] == "C": + params = {'value': value, 'whitelist': whitelist} + raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoControlCharactersValidator) and + (self.whitelist == other.whitelist) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class NoWhitespaceValidator: + message = _("Leading and Trailing whitespaces are not allowed.") + code = "no_whitespace" + + def __init__(self, message=None, code=None, whitelist=None): + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): + value = force_str(value) + if value != value.strip(): + params = {'value': value} + raise ValidationError(self.message, code=self.code, params=params) + + def __eq__(self, other): + return ( + isinstance(other, NoWhitespaceValidator) and + (self.message == other.message) and + (self.code == other.code) + ) + + +@deconstructible +class HexValidator: + messages = { + 'invalid': _("Only a hex string is allowed."), + 'length': _("Invalid length. Must be %(length)d characters."), + 'min_length': _("Ensure that there are more than %(min)s characters."), + 'max_length': _("Ensure that there are no more than %(max)s characters."), + } + code = "hex_only" + + def __init__(self, length=None, min_length=None, max_length=None, message=None, code=None): + self.length = length + self.min_length = min_length + self.max_length = max_length + if message: + self.message = message + if code: + self.code = code + + def __call__(self, value): + value = force_str(value) + if self.length and len(value) != self.length: + raise ValidationError(self.messages['length'], code='hex_only_length', params={'length': self.length}) + if self.min_length and len(value) < self.min_length: + raise ValidationError(self.messages['min_length'], code='hex_only_min_length', params={'min': self.min_length}) + if self.max_length and len(value) < self.max_length: + raise ValidationError(self.messages['max_length'], code='hex_only_max_length', params={'max': self.max_length}) + + try: + binascii.unhexlify(value) + except (TypeError, binascii.Error): + raise ValidationError(self.messages['invalid'], code='hex_only') + + def __eq__(self, other): + return ( + isinstance(other, HexValidator) and + (self.message == other.message) and + (self.code == other.code) + )