diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index d7eeadd..c9e1d56 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -7,7 +7,7 @@ stages: test: stage: test script: - - pip install --no-cache-dir --require-hashes --no-deps -r requirements/dev.txt + - pip install --no-cache-dir -r requirements/dev.txt - cp env-dist .env - flake8 . - pytest diff --git a/auth0login/__init__.py b/auth0login/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/auth0login/admin.py b/auth0login/admin.py new file mode 100644 index 0000000..a3846a1 --- /dev/null +++ b/auth0login/admin.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +# from django.contrib import admin + +# Register your models here. diff --git a/auth0login/apps.py b/auth0login/apps.py new file mode 100644 index 0000000..513c748 --- /dev/null +++ b/auth0login/apps.py @@ -0,0 +1,8 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.apps import AppConfig + + +class Auth0LoginConfig(AppConfig): + name = 'auth0login' diff --git a/auth0login/auth0backend.py b/auth0login/auth0backend.py new file mode 100644 index 0000000..72a217e --- /dev/null +++ b/auth0login/auth0backend.py @@ -0,0 +1,35 @@ +import requests +from social_core.backends.oauth import BaseOAuth2 + + +class Auth0(BaseOAuth2): + """Auth0 OAuth authentication backend""" + name = 'auth0' + SCOPE_SEPARATOR = ' ' + ACCESS_TOKEN_METHOD = 'POST' + EXTRA_DATA = [ + ('email', 'email') + ] + + def authorization_url(self): + """Return the authorization endpoint.""" + return "https://" + self.setting('DOMAIN') + "/authorize" + + def access_token_url(self): + """Return the token endpoint.""" + return "https://" + self.setting('DOMAIN') + "/oauth/token" + + def get_user_id(self, details, response): + """Return current user id.""" + return details['user_id'] + + def get_user_details(self, response): + url = 'https://' + self.setting('DOMAIN') + '/userinfo' + headers = {'authorization': 'Bearer ' + response['access_token']} + resp = requests.get(url, headers=headers) + userinfo = resp.json() + + return {'username': userinfo['nickname'], + 'email': userinfo['email'], + # 'first_name': userinfo['name'], + 'user_id': userinfo['sub']} diff --git a/auth0login/migrations/__init__.py b/auth0login/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/auth0login/models.py b/auth0login/models.py new file mode 100644 index 0000000..1e8e4e1 --- /dev/null +++ b/auth0login/models.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +# from django.db import models + +# Create your models here. diff --git a/auth0login/tests.py b/auth0login/tests.py new file mode 100644 index 0000000..c2de5b3 --- /dev/null +++ b/auth0login/tests.py @@ -0,0 +1,6 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +# from django.test import TestCase + +# Create your tests here. diff --git a/auth0login/urls.py b/auth0login/urls.py new file mode 100644 index 0000000..2272e71 --- /dev/null +++ b/auth0login/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls import url, include +from . import views + +urlpatterns = [ + url('^$', views.index), + url(r'^', include('django.contrib.auth.urls', namespace='auth')), + url(r'^', include('social_django.urls', namespace='social')), +] diff --git a/auth0login/views.py b/auth0login/views.py new file mode 100644 index 0000000..a08b706 --- /dev/null +++ b/auth0login/views.py @@ -0,0 +1,7 @@ +from __future__ import unicode_literals + +from django.shortcuts import render + + +def index(request): + return render(request, 'index.html') diff --git a/docker/dev b/docker/dev index c3e560b..99bcf83 100644 --- a/docker/dev +++ b/docker/dev @@ -7,7 +7,7 @@ RUN yum -y clean all RUN pip install --upgrade pip COPY ./requirements/ /tmp/requirements/ -RUN pip install --no-cache-dir --require-hashes --no-deps --ignore-installed -r /tmp/requirements/dev.txt +RUN pip install --no-cache-dir --ignore-installed -r /tmp/requirements/dev.txt WORKDIR /app EXPOSE 80 diff --git a/docs/installation-virtualenv.rst b/docs/installation-virtualenv.rst index 3071f8f..55e11c8 100644 --- a/docs/installation-virtualenv.rst +++ b/docs/installation-virtualenv.rst @@ -3,13 +3,13 @@ VirtualEnv Installation #. **Install the requirements** - Generic requirements which you will need:: + Generic requirements which you will need:: python, python-virtualenvwrapper, pip and git, libmysqlclient-dev (mysql_config) Debian Stretch (9) specific requirements :: - $ sudo apt-get install libmariadbclient-dev python-pip virtualenvwrapper + $ sudo apt-get install libmariadbclient-dev python-pip virtualenvwrapper #. **Build the environment** @@ -32,7 +32,7 @@ VirtualEnv Installation Install local development requirements:: - $ (satnogs-network)$ pip install --require-hashes --no-deps -r requirements/dev.txt + $ (satnogs-network)$ pip install -r requirements/dev.txt #. **Database** diff --git a/network/base/context_processors.py b/network/base/context_processors.py index 29751f1..ace4969 100644 --- a/network/base/context_processors.py +++ b/network/base/context_processors.py @@ -29,3 +29,11 @@ def user_processor(request): return {'owner_vetting_count': owner_vetting_count} else: return {'owner_vetting_count': ''} + + +def auth_block(request): + """Displays auth links local vs auth0.""" + if settings.AUTH0: + return {'auth_block': render_to_string('includes/auth_auth0.html')} + else: + return {'auth_block': render_to_string('includes/auth_local.html')} diff --git a/network/settings.py b/network/settings.py index 174a144..883e9ff 100644 --- a/network/settings.py +++ b/network/settings.py @@ -8,6 +8,7 @@ ROOT = Path(__file__).parent.parent ENVIRONMENT = config('ENVIRONMENT', default='dev') DEBUG = config('DEBUG', default=True, cast=bool) +AUTH0 = config('AUTH0', default=False, cast=bool) # Apps DJANGO_APPS = ( @@ -38,6 +39,10 @@ LOCAL_APPS = ( 'network.api', ) +if AUTH0: + THIRD_PARTY_APPS += ('social_django',) + LOCAL_APPS += ('auth0login',) + INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS # Middlware @@ -110,6 +115,7 @@ TEMPLATES = [ 'network.base.context_processors.analytics', 'network.base.context_processors.stage_notice', 'network.base.context_processors.user_processor', + 'network.base.context_processors.auth_block', ], 'loaders': [ ('django.template.loaders.cached.Loader', [ @@ -157,8 +163,10 @@ TEST_RUNNER = 'django.test.runner.DiscoverRunner' # Auth AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', - 'allauth.account.auth_backends.AuthenticationBackend', ) +if AUTH0: + AUTHENTICATION_BACKENDS += ('auth0login.auth0backend.Auth0',) + ACCOUNT_ADAPTER = 'allauth.account.adapter.DefaultAccountAdapter' ACCOUNT_AUTHENTICATION_METHOD = 'username' ACCOUNT_EMAIL_REQUIRED = True @@ -166,6 +174,8 @@ ACCOUNT_EMAIL_VERIFICATION = 'mandatory' AUTH_USER_MODEL = 'users.User' LOGIN_REDIRECT_URL = 'users:redirect_user' LOGIN_URL = 'account_login' +LOGIN_URL = "/login/auth0" +LOGOUT_REDIRECT_URL = "/" AUTOSLUG_SLUGIFY_FUNCTION = 'slugify.slugify' # Logging @@ -354,6 +364,33 @@ S3_SECRET_KEY = config('S3_SECRET_KEY', default='') ARCHIVE_COLLECTION = config('ARCHIVE_COLLECTION', default='test_collection') ARCHIVE_URL = 'https://archive.org/download/' +if AUTH0: + SOCIAL_AUTH_TRAILING_SLASH = False # Remove end slash from routes + SOCIAL_AUTH_AUTH0_DOMAIN = config('SOCIAL_AUTH_AUTH0_DOMAIN', default='YOUR_AUTH0_DOMAIN') + SOCIAL_AUTH_AUTH0_KEY = config('SOCIAL_AUTH_AUTH0_KEY', default='YOUR_CLIENT_ID') + SOCIAL_AUTH_AUTH0_SECRET = config('SOCIAL_AUTH_AUTH0_SECRET', default='YOUR_CLIENT_SECRET') + SOCIAL_AUTH_REDIRECT_IS_HTTPS = True + SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['email', 'first_name', 'last_name'] + + SOCIAL_AUTH_PIPELINE = ( + 'social_core.pipeline.social_auth.social_details', + 'social_core.pipeline.social_auth.social_uid', + 'social_core.pipeline.social_auth.auth_allowed', + 'social_core.pipeline.social_auth.social_user', + 'social_core.pipeline.social_auth.associate_by_email', + 'social_core.pipeline.user.get_username', + 'social_core.pipeline.user.create_user', + 'social_core.pipeline.social_auth.associate_user', + 'social_core.pipeline.social_auth.load_extra_data', + 'social_core.pipeline.user.user_details', + ) + + SOCIAL_AUTH_AUTH0_SCOPE = [ + 'openid', + 'email', + 'profile', + ] + if ENVIRONMENT == 'dev': # Disable template caching for backend in TEMPLATES: diff --git a/network/templates/base.html b/network/templates/base.html index 22f65c3..1bde3cc 100644 --- a/network/templates/base.html +++ b/network/templates/base.html @@ -78,8 +78,7 @@ {% else %} -
  • Sign Up
  • -
  • Log In
  • + {{ auth_block }} {% endif %} diff --git a/network/templates/includes/auth_auth0.html b/network/templates/includes/auth_auth0.html new file mode 100644 index 0000000..e26810d --- /dev/null +++ b/network/templates/includes/auth_auth0.html @@ -0,0 +1 @@ +
  • Sign Up / Log In
  • diff --git a/network/templates/includes/auth_local.html b/network/templates/includes/auth_local.html new file mode 100644 index 0000000..304bb86 --- /dev/null +++ b/network/templates/includes/auth_local.html @@ -0,0 +1,2 @@ +
  • Sign Up
  • +
  • Log In
  • diff --git a/network/urls.py b/network/urls.py index 8a082af..04e9ea7 100644 --- a/network/urls.py +++ b/network/urls.py @@ -25,6 +25,12 @@ urlpatterns = [ url(r'^api/', include(api_urlpatterns)) ] +# Auth0 +if settings.AUTH0: + urlpatterns += [ + url(r'^', include('auth0login.urls')) + ] + if settings.DEBUG: urlpatterns += [ url(r'^media/(?P.*)$', serve, diff --git a/requirements/dev.txt b/requirements/dev.txt index c194d7c..486b100 100644 --- a/requirements/dev.txt +++ b/requirements/dev.txt @@ -2,140 +2,42 @@ -r production.txt # Debug & Testing -sqlparse==0.2.4 \ - --hash=sha256:d9cf190f51cbb26da0412247dfe4fb5f4098edb73db84e02f9fc21fdca31fed4 \ - --hash=sha256:ce028444cfab83be538752a2ffdb56bc417b7784ff35bb9a3062413717807dec -flake8==3.5.0 \ - --hash=sha256:c7841163e2b576d435799169b78703ad6ac1bbb0f199994fc05f700b2a90ea37 \ - --hash=sha256:7253265f7abd8b313e3892944044a365e3f4ac3fcdcfb4298f55ee9ddf188ba0 -factory_boy==2.10.0 \ - --hash=sha256:be2abc8092294e4097935a29b4e37f5b9ed3e4205e2e32df215c0315b625995e \ - --hash=sha256:bd5a096d0f102d79b6c78cef1c8c0b650f2e1a3ecba351c735c6d2df8dabd29c -pytest==3.4.2 \ - --hash=sha256:062027955bccbc04d2fcd5d79690947e018ba31abe4c90b2c6721abec734261b \ - --hash=sha256:117bad36c1a787e1a8a659df35de53ba05f9f3398fb9e4ac17e80ad5903eb8c5 -pytest-cov==2.5.1 \ - --hash=sha256:03aa752cf11db41d281ea1d807d954c4eda35cfa1b21d6971966cc041bbf6e2d \ - --hash=sha256:890fe5565400902b0c78b5357004aab1c814115894f4f21370e2433256a3eeec -pytest-django==3.1.2 \ - --hash=sha256:038ccc5a9daa1b1b0eb739ab7dce54e495811eca5ea3af4815a2a3ac45152309 \ - --hash=sha256:00995c2999b884a38ae9cd30a8c00ed32b3d38c1041250ea84caf18085589662 -coverage==4.5.1 \ - --hash=sha256:7608a3dd5d73cb06c531b8925e0ef8d3de31fed2544a7de6c63960a1e73ea4bc \ - --hash=sha256:3a2184c6d797a125dca8367878d3b9a178b6fdd05fdc2d35d758c3006a1cd694 \ - --hash=sha256:f3f501f345f24383c0000395b26b726e46758b71393267aeae0bd36f8b3ade80 \ - --hash=sha256:0b136648de27201056c1869a6c0d4e23f464750fd9a9ba9750b8336a244429ed \ - --hash=sha256:337ded681dd2ef9ca04ef5d93cfc87e52e09db2594c296b4a0a3662cb1b41249 \ - --hash=sha256:69bf008a06b76619d3c3f3b1983f5145c75a305a0fea513aca094cae5c40a8f5 \ - --hash=sha256:2eb564bbf7816a9d68dd3369a510be3327f1c618d2357fa6b1216994c2e3d508 \ - --hash=sha256:3eb42bf89a6be7deb64116dd1cc4b08171734d721e7a7e57ad64cc4ef29ed2f1 \ - --hash=sha256:be6cfcd8053d13f5f5eeb284aa8a814220c3da1b0078fa859011c7fffd86dab9 \ - --hash=sha256:9d6dd10d49e01571bf6e147d3b505141ffc093a06756c60b053a859cb2128b1f \ - --hash=sha256:701cd6093d63e6b8ad7009d8a92425428bc4d6e7ab8d75efbb665c806c1d79ba \ - --hash=sha256:5a13ea7911ff5e1796b6d5e4fbbf6952381a611209b736d48e675c2756f3f74e \ - --hash=sha256:c1bb572fab8208c400adaf06a8133ac0712179a334c09224fb11393e920abcdd \ - --hash=sha256:03481e81d558d30d230bc12999e3edffe392d244349a90f4ef9b88425fac74ba \ - --hash=sha256:28b2191e7283f4f3568962e373b47ef7f0392993bb6660d079c62bd50fe9d162 \ - --hash=sha256:de4418dadaa1c01d497e539210cb6baa015965526ff5afc078c57ca69160108d \ - --hash=sha256:8c3cb8c35ec4d9506979b4cf90ee9918bc2e49f84189d9bf5c36c0c1119c6558 \ - --hash=sha256:7e1fe19bd6dce69d9fd159d8e4a80a8f52101380d5d3a4d374b6d3eae0e5de9c \ - --hash=sha256:6bc583dc18d5979dc0f6cec26a8603129de0304d5ae1f17e57a12834e7235062 \ - --hash=sha256:198626739a79b09fa0a2f06e083ffd12eb55449b5f8bfdbeed1df4910b2ca640 \ - --hash=sha256:7aa36d2b844a3e4a4b356708d79fd2c260281a7390d678a10b91ca595ddc9e99 \ - --hash=sha256:3d72c20bd105022d29b14a7d628462ebdc61de2f303322c0212a054352f3b287 \ - --hash=sha256:4635a184d0bbe537aa185a34193898eee409332a8ccb27eea36f262566585000 \ - --hash=sha256:e05cb4d9aad6233d67e0541caa7e511fa4047ed7750ec2510d466e806e0255d6 \ - --hash=sha256:76ecd006d1d8f739430ec50cc872889af1f9c1b6b8f48e29941814b09b0fd3cc \ - --hash=sha256:7d3f553904b0c5c016d1dad058a7554c7ac4c91a789fca496e7d8347ad040653 \ - --hash=sha256:3c79a6f7b95751cdebcd9037e4d06f8d5a9b60e4ed0cd231342aa8ad7124882a \ - --hash=sha256:56e448f051a201c5ebbaa86a5efd0ca90d327204d8b059ab25ad0f35fbfd79f1 \ - --hash=sha256:9e112fcbe0148a6fa4f0a02e8d58e94470fc6cb82a5481618fea901699bf34c4 \ - --hash=sha256:15b111b6a0f46ee1a485414a52a7ad1d703bdf984e9ed3c288a4414d3871dcbd \ - --hash=sha256:e4d96c07229f58cb686120f168276e434660e4358cc9cf3b0464210b04913e77 \ - --hash=sha256:f8a923a85cb099422ad5a2e345fe877bbc89a8a8b23235824a93488150e45f6e \ - --hash=sha256:ac4fef68da01116a5c117eba4dd46f2e06847a497de5ed1d64bb99a5fda1ef91 \ - --hash=sha256:1c383d2ef13ade2acc636556fd544dba6e14fa30755f26812f54300e401f98f2 \ - --hash=sha256:b8815995e050764c8610dbc82641807d196927c3dbed207f0a079833ffcf588d \ - --hash=sha256:104ab3934abaf5be871a583541e8829d6c19ce7bde2923b2751e0d3ca44db60a -Faker==0.8.11 \ - --hash=sha256:732ae449678a5c205ebc99e7e816f12eba6d6d1b02bd04d27ccf7edb2f4e6250 \ - --hash=sha256:0857a92773c9cc6356c4c0c2aaa6f6ec83be94fc14fc0fd9e31904498d6fd388 -docopts==0.6.1 \ - --hash=sha256:ea8d6b03a0931c75a0e4919a0b0856f1c187c38a96174a750c86b41b903a693a -mock==2.0.0 \ - --hash=sha256:5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1 +sqlparse==0.2.4 +flake8==3.5.0 +factory_boy==2.10.0 +pytest==3.4.2 +pytest-cov==2.5.1 +pytest-django==3.1.2 +coverage==4.5.1 +Faker==0.8.11 +docopts==0.6.1 +mock==2.0.0 # Deps -configparser==3.5.0 \ - --hash=sha256:5308b47021bc2340965c371f0f058cc6971a04502638d4244225c49d80db273a -pycodestyle==2.3.1 \ - --hash=sha256:6c4245ade1edfad79c3446fadfc96b0de2759662dc29d07d80a6f27ad1ca6ba9 -pyflakes==1.6.0 \ - --hash=sha256:08bd6a50edf8cffa9fa09a463063c425ecaaf10d1eb0335a7e8b1401aef89e6f \ - --hash=sha256:8d616a382f243dbf19b54743f280b80198be0bca3a5396f1d2e1fca6223e8805 -mccabe==0.6.1 \ - --hash=sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42 -enum34==1.1.6 \ - --hash=sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79 -ipaddress==1.0.19 \ - --hash=sha256:200d8686011d470b5e4de207d803445deee427455cd0cb7c982b68cf82524f81 -python-dateutil==2.6.1 \ - --hash=sha256:891c38b2a02f5bb1be3e4793866c8df49c7d19baabf9c1bad62547e0b4866aca \ - --hash=sha256:95511bae634d69bc7329ba55e646499a842bc4ec342ad54a8cdb65645a0aad3c -appdirs==1.4.3 \ - --hash=sha256:d8b24664561d0d34ddfaec54636d502d7cea6e29c3eaf68f3df6180863e2166e \ - --hash=sha256:9e5896d1372858f8dd3344faf4e5014d21849c756c8d5701f78f8a103b372d92 -packaging==16.8 \ - --hash=sha256:99276dc6e3a7851f32027a68f1095cd3f77c148091b092ea867a351811cfe388 -py==1.5.2 \ - --hash=sha256:8cca5c229d225f8c1e3085be4fcf306090b00850fefad892f9d96c7b6e2f310f \ - --hash=sha256:ca18943e28235417756316bfada6cd96b23ce60dd532642690dcfdaba988a76d -pyparsing==2.2.0 \ - --hash=sha256:fee43f17a9c4087e7ed1605bd6df994c6173c1e977d7ade7b651292fab2bd010 \ - --hash=sha256:0832bcf47acd283788593e7a0f542407bd9550a55a8a8435214a1960e04bcb04 \ - --hash=sha256:9e8143a3e15c13713506886badd96ca4b579a87fbdf49e550dbfc057d6cb218e \ - --hash=sha256:281683241b25fe9b80ec9d66017485f6deff1af5cde372469134b56ca8447a07 \ - --hash=sha256:b8b3117ed9bdf45e14dcc89345ce638ec7e0e29b2b579fa1ecf32ce45ebac8a5 \ - --hash=sha256:8f1e18d3fd36c6795bb7e02a39fd05c611ffc2596c1e0d995d34d67630426c18 \ - --hash=sha256:e4d45427c6e20a59bf4f88c639dcc03ce30d193112047f94012102f235853a58 -setuptools==38.5.2 \ - --hash=sha256:a69c829c65d733197ab410accbc9f6817bfda52b092217a5e873850e536c6b6b \ - --hash=sha256:8246123e984cadf687163bdcd1bb58eb325e2891b066e1f0224728a41c8d9064 -apipkg==1.4 \ - --hash=sha256:65d2aa68b28e7d31233bb2ba8eb31cda40e4671f8ac2d6b241e358c9652a74b9 -execnet==1.5.0 \ - --hash=sha256:fc155a6b553c66c838d1a22dba1dc9f5f505c43285a878c6f74a79c024750b83 \ - --hash=sha256:a7a84d5fa07a089186a329528f127c9d73b9de57f1a1131b82bb5320ee651f6a -pytest-xdist==1.22.2 \ - --hash=sha256:e8f5744acc270b3e7d915bdb4d5f471670f049b6fbd163d4cbd52203b075d30f \ - --hash=sha256:be2662264b035920ba740ed6efb1c816a83c8a22253df7766d129f6a7bfdbd35 -docopt==0.6.2 \ - --hash=sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491 -funcsigs==1.0.2 \ - --hash=sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca \ - --hash=sha256:a7bb0f2cf3a3fd1ab2732cb49eba4252c2af4240442415b4abce3b87022a8f50 -pbr==3.1.1 \ - --hash=sha256:60c25b7dfd054ef9bb0ae327af949dd4676aa09ac3a9471cdc871d8a9213f9ac \ - --hash=sha256:05f61c71aaefc02d8e37c0a3eeb9815ff526ea28b3b76324769e6158d7f95be1 -PyYAML==3.12 \ - --hash=sha256:592766c6303207a20efc445587778322d7f73b161bd994f227adaa341ba212ab -pytest-forked==0.2 \ - --hash=sha256:e4500cd0509ec4a26535f7d4112a8cc0f17d3a41c29ffd4eab479d2a55b30805 \ - --hash=sha256:f275cb48a73fc61a6710726348e1da6d68a978f0ec0c54ece5a5fae5977e5a08 -dnspython==1.15.0 \ - --hash=sha256:861e6e58faa730f9845aaaa9c6c832851fbf89382ac52915a51f89c71accdd31 -pur==4.0.3 \ - --hash=sha256:693b443b238dbc962121145e1408b3b4246c7deefc1a6acc979e2434dad6047a -email_validator==1.0.3 \ - --hash=sha256:ddc4b5b59fa699bb10127adcf7ad4de78fde4ec539a072b104b8bb16da666ae5 -text-unidecode==1.1 \ - --hash=sha256:d0afd5e8a7ac69bfb1372e1bbfa3c63c22e3db8ae1284690e96b45c4430d08d0 \ - --hash=sha256:02efd86b9c0f489f858d8cead62e94d3760dab444054b258734716f7602330a3 -click==6.7 \ - --hash=sha256:29f99fc6125fbc931b758dc053b3114e55c77a6e4c6c3a2674a2dc986016381d \ - --hash=sha256:f15516df478d5a56180fbf80e68f206010e6d160fc39fa508b65e035fd75130b -attrs==17.4.0 \ - --hash=sha256:a17a9573a6f475c99b551c0e0a812707ddda1ec9653bed04c13841404ed6f450 \ - --hash=sha256:1c7960ccfd6a005cd9f7ba884e6316b5e430a3f1a6c37c5f87d8b43f83b54ec9 -pluggy==0.6.0 \ - --hash=sha256:d345c8fe681115900d6da8d048ba67c25df42973bda370783cd58826442dcd7c +configparser==3.5.0 +pycodestyle==2.3.1 +pyflakes==1.6.0 +mccabe==0.6.1 +enum34==1.1.6 +ipaddress==1.0.19 +python-dateutil==2.6.1 +appdirs==1.4.3 +packaging==16.8 +py==1.5.2 +pyparsing==2.2.0 +setuptools==38.5.2 +apipkg==1.4 +execnet==1.5.0 +pytest-xdist==1.22.2 +docopt==0.6.2 +funcsigs==1.0.2 +pbr==3.1.1 +PyYAML==3.12 +pytest-forked==0.2 +dnspython==1.15.0 +pur==4.0.3 +email_validator==1.0.3 +text-unidecode==1.1 +click==6.7 +attrs==17.4.0 +pluggy==0.6.0 diff --git a/requirements/production.txt b/requirements/production.txt index 2f6ef4f..9df6f1a 100644 --- a/requirements/production.txt +++ b/requirements/production.txt @@ -1,240 +1,80 @@ # Basic -Django==1.11.11 \ - --hash=sha256:fd186d544c7c2f835668cf11f77be071307c9eb22615a5b3a16bdb14c8357f41 \ - --hash=sha256:74077d7309b48b97dacdac2dfb35c968028becf00a7a684e7f29b2af1b980edc -django-shortuuidfield==0.1.3 \ - --hash=sha256:a292c0fe5538abe947b131e2b914edd9ac44afcc6a40eaec71448e6231a3ef00 -celery==4.1.0 \ - --hash=sha256:81a67f0d53a688ec2bc8557bd5d6d7218f925a6f2e6df80e01560de9e28997ec \ - --hash=sha256:77ff3730198d6a17b3c1f05579ebe570b579efb35f6d7e13dba3b1368d068b35 -internetarchive==1.7.7 \ - --hash=sha256:25ed27f694c5a4ef5421fa3402d9e2aa6bfa0325bcc605b0a6f8b59afc860a17 \ - --hash=sha256:4497c9a2e49373ab8a987efb544f881b102f0a11dac2a0685fb5f75f07072c41 +Django==1.11.11 +django-shortuuidfield==0.1.3 +celery==4.1.0 +internetarchive==1.7.7 # Configuration -unicode-slugify==0.1.3 \ - --hash=sha256:34cf3afefa6480efe705a4fc0eaeeaf7f49754aec322ba3e8b2f27dc1cbcf650 -django-autoslug==1.9.3 \ - --hash=sha256:d466a68e87d076f0d0d6ffe51ff70fa22ae4ca2f7717d769feb6265ef68c50f8 -python-decouple==3.1 \ - --hash=sha256:1317df14b43efee4337a4aa02914bf004f010cd56d6c4bd894e6474ec8c4fe2d -dj-database-url==0.5.0 \ - --hash=sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163 \ - --hash=sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9 +unicode-slugify==0.1.3 +django-autoslug==1.9.3 +python-decouple==3.1 +dj-database-url==0.5.0 # Cache -redis==2.10.6 \ - --hash=sha256:8a1900a9f2a0a44ecf6e8b5eb3e967a9909dfed219ad66df094f27f7d6f330fb \ - --hash=sha256:a22ca993cea2962dbb588f9f30d0015ac4afcc45bee27d3978c0dbe9e97c6c0f -django-redis-cache==1.7.1 \ - --hash=sha256:2b4e3510bbcaf3d331975717afd6f15a36fbaf7622504599d2727dc99f90c64d +redis==2.10.6 +django-redis-cache==1.7.1 # Logging -raven==6.9.0 \ - --hash=sha256:95f44f3ea2c1b176d5450df4becdb96c15bf2632888f9ab193e9dd22300ce46a +raven==6.9.0 # Security -django-braces==1.12.0 \ - --hash=sha256:7c5b91c75240ccf2eb124fe3b09dd4978e8f4d412b553bb791920bd55839159c \ - --hash=sha256:7e0cb698f3cd17cc58d50aea4a663233f44228144b81d85e1b9bad05aa7f3f80 -django-csp==3.3 \ - --hash=sha256:a95eeeb04df155b6270612238700f16abd2b0cc3d32dbcfca8c7fd06d26dacba \ - --hash=sha256:db082b75075672fb9cf4a622c75c94ee624cb566ffe9d2a645687e58598b6d39 +django-braces==1.12.0 +django-csp==3.3 # Images -Pillow==5.0.0 \ - --hash=sha256:718ec7a122b28d64afc5fbc3a9b99bb0545ef511373cac06fe7624520e82cb20 \ - --hash=sha256:801cca8923508311bf5d6d0f7da5362552e8208ebd8ec0d7b9f2cd2ff5705734 \ - --hash=sha256:43334f9581cd067945b8898cef9eb5714ee4883f8de0304c011f1dbdb1d4e2aa \ - --hash=sha256:b85f703c2ffe539313e39ce0676bed0f355cec45a16e58c9ab7417445843047c \ - --hash=sha256:8580fc58074a16b749905b26cf8363f7b628dd167ba0130f5382cdc91c86b509 \ - --hash=sha256:153ec6f18f7b61641e0e6e502acfaf4a06c9aba2ea11c0b4b3578ea9f13a4a4a \ - --hash=sha256:25193f934d37d836a6b1f4c062ce574a96cbca7c6d9dc8ddfbbac7f9c54deaa4 \ - --hash=sha256:2fcde9954c8882d1c7f93bb828caa34a4c5e3ee69dbc7895dc8652ad972b455a \ - --hash=sha256:1a5b93084e01328a1cb1ecdad99d11d75e881e89a95f88d85b523646553b36c2 \ - --hash=sha256:b2240f298482f823576f397bb9f32ea913ad9456c526e141bc6f0a022b37a3e8 \ - --hash=sha256:b1d33c63a55d0d85df0ad02b2c16158fb4d8153afa7b908f1a67330fac694cd6 \ - --hash=sha256:6977cf073d83358b34f93abf5c1f1193b88675fe0e4441e0e28318bc3dcba7a0 \ - --hash=sha256:1912b7230459fd53682dae32b83cbd8e5d642ba36d4be18566f00a9c063aa13d \ - --hash=sha256:4bd4a71501b6d51db4abc07e1f43f5a6fed0a1a9583cca0b401d6af50284b0db \ - --hash=sha256:0013f590a8f260df60bcfd65db19d18efc04e7f046c3c82a40e2e2b3292a937c \ - --hash=sha256:a224651a81e45ef4f1d0164e256c5f6b4abb49f2ae8f22ba2f3a9d0ff338e608 \ - --hash=sha256:c793dfaa130847ccff958492b76ae8b9304e60b8a79a92962cb19e368276a22b \ - --hash=sha256:0b899ee80920bb533f26581af9b4660bc12aff4562555afe74e429101ebf3c94 \ - --hash=sha256:9525cd680a6f9e80c6c0af03cf973e6505c59f60b4745f682cd1a449e54b31bb \ - --hash=sha256:35f7d998b8e82fb3fb51ff88b30485eb81cd7dd56ec7e1a8deba23eb88532d44 \ - --hash=sha256:5b0d657460d9f3615876fec6306e97ca15a471f6169b622d76a47e270998acf1 \ - --hash=sha256:ddd16ab250b4fc97db1c47407e78c25216a75c29d29d10ad37e51b7a2ec7b2c3 \ - --hash=sha256:b9f63451084a718eccdeb1e382768c94647915653af4d6019f64560d9e98642b \ - --hash=sha256:a370d1c570f1d72e877099651e752332444b1c5009381f043c9da5fd47f3ebae \ - --hash=sha256:e126ff4fed71e78333840c07279e1617f63cfca76d63ad5b27d65a7277206a3d \ - --hash=sha256:dc4b018d5c9b636f7546583c5591b9ea00c328c3e5871992ef5b95bac353f097 \ - --hash=sha256:2c042352b430d678db50c78c5214e19638eff8b688941271da2de21fd298dfe5 \ - --hash=sha256:fcf64c91fd44485100a2965d23bb0e227d093e91f7e776c5ca3b32574766eb56 \ - --hash=sha256:2e818dbe445e86fc6c266973fe540c35125c42eb2cf13a6095e9adaa89c0deb5 \ - --hash=sha256:17fe25efc785194d48c38fad85dce470013ba19d2fb66639e149f14bccf1327f \ - --hash=sha256:7dfbefdb3fb911ca9faed307bf309861e9995e36cca6b761c7ba6d9b77a9744a \ - --hash=sha256:135e9aa65150c53f7db85bf2bebb8a0e1a48ea850e80cf66e16dd04fa09d309c \ - --hash=sha256:12f29d6c23424f704c66b5b68c02fe0b571504459605cfe36ab8158359b0e1bb \ - --hash=sha256:82d1ff571489765df2816785d532e243bde213752156c227fca595723ec5ff42 \ - --hash=sha256:37cc0339abfa9e295c75d9a7f227d35cb44716feb95057f9449c4a9e9a17daf7 \ - --hash=sha256:931030d1d6282b7900e6b0a7ff9ecdb503b5e1e6781800dab2b71a9f39405bff \ - --hash=sha256:5cd36804f9f06a914a883fe682df5711d16d7b4f44d43189c5f013e7cd91e149 \ - --hash=sha256:f8d49be8c282df8d2e1ab6ab53ab8abd859b1fa6fed384457ee85c9eff64ef97 \ - --hash=sha256:82b172e3264e62372c01b5b009b5b1a02fbb9276cbe5cc57ab00a6d6e5ed9a18 \ - --hash=sha256:57aa6198ba8acba1313c3b743e267d821a60cac77e6026caf0b55ca58d3d23be \ - --hash=sha256:d60c1625b108432ace8b1fa1a584017e5efa73f107d0f493c7f39c79bebf1d41 -django_compressor==2.2 \ - --hash=sha256:7732676cfb9d58498dfb522b036f75f3f253f72ea1345ac036434fdc418c2e57 \ - --hash=sha256:9616570e5b08e92fa9eadc7a1b1b49639cce07ef392fc27c74230ab08075b30f +Pillow==5.0.0 +django_compressor==2.2 # Users -django-allauth==0.35.0 \ - --hash=sha256:7b31526cccd1c46f9f09acf0703068e8a9669337d29eb065f7e8143c2d897339 -django-avatar==4.1.0 \ - --hash=sha256:19f1a536d226e311da949b726583345a352dc00aec37ff660b974876ab64e9f6 -django-crispy-forms==1.7.1 \ - --hash=sha256:5ecb13b19f867f45f5120d7e869de0ede19fa04555b04c8a7f7bbac14d739e50 \ - --hash=sha256:fda07e532835faae1de96aad47faa0cc29bdd6ff2464a475d035fdb9b58e2fa4 +django-allauth==0.35.0 +django-avatar==4.1.0 +django-crispy-forms==1.7.1 # Astronomy -https://gitlab.com/librespacefoundation/orbit/-/archive/master/orbit-master.zip \ - --hash=sha256:c83a69991f13992c2864323caaf410474211f1bc8e53f2d6439d949211e9b29a +https://gitlab.com/librespacefoundation/orbit/-/archive/master/orbit-master.zip # API -djangorestframework==3.7.7 \ - --hash=sha256:1f6baf40ed456ed2af6bd1a4ff8bbc3503cebea16509993aea2b7085bc097766 \ - --hash=sha256:9f9e94e8d22b100ed3a43cee8c47a7ff7b185e778a1f2da9ec5c73fc4e081b87 -Markdown==2.6.11 \ - --hash=sha256:9ba587db9daee7ec761cfc656272be6aabe2ed300fece21208e4aab2e457bc8f \ - --hash=sha256:a856869c7ff079ad84a3e19cd87a64998350c2b94e9e08e44270faef33400f81 -django-filter==1.1.0 \ - --hash=sha256:ec0ef1ba23ef95b1620f5d481334413700fb33f45cd76d56a63f4b0b1d76976a \ - --hash=sha256:ea204242ea83790e1512c9d0d8255002a652a6f4986e93cee664f28955ba0c22 +djangorestframework==3.7.7 +Markdown==2.6.11 +django-filter==1.1.0 # Deployment -MySQL-python==1.2.5 \ - --hash=sha256:811040b647e5d5686f84db415efd697e6250008b112b6909ba77ac059e140c74 -gunicorn==19.7.1 \ - --hash=sha256:75af03c99389535f218cc596c7de74df4763803f7b63eb09d77e92b3956b36c6 \ - --hash=sha256:eee1169f0ca667be05db3351a0960765620dad53f53434262ff8901b68a1b622 +MySQL-python==1.2.5 +gunicorn==19.7.1 # Deps -shortuuid==0.5.0 \ - --hash=sha256:d08fd398f40f8baf87e15eef8355e92fa541bca4eb8465fefab7ee22f92711b9 -six==1.11.0 \ - --hash=sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb \ - --hash=sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9 -Unidecode==1.0.22 \ - --hash=sha256:72f49d3729f3d8f5799f710b97c1451c5163102e76d64d20e170aedbbd923582 \ - --hash=sha256:8c33dd588e0c9bc22a76eaa0c715a5434851f726131bd44a6c26471746efabf5 -urllib3==1.22 \ - --hash=sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b \ - --hash=sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f -certifi==2018.1.18 \ - --hash=sha256:14131608ad2fd56836d33a71ee60fa1c82bc9d2c8d98b7bdbc631fe1b3cd1296 \ - --hash=sha256:edbc3f203427eef571f79a7692bb160a2b0f7ccaa31953e99bd17e307cf63f7d -olefile==0.45.1 \ - --hash=sha256:2b6575f5290de8ab1086f8c5490591f7e0885af682c7c1793bdaf6e64078d385 -django-appconf==1.0.2 \ - --hash=sha256:ddab987d14b26731352c01ee69c090a4ebfc9141ed223bef039d79587f22acd9 -rcssmin==1.0.6 \ - --hash=sha256:ca87b695d3d7864157773a61263e5abb96006e9ff0e021eff90cbe0e1ba18270 -rjsmin==1.0.12 \ - --hash=sha256:dd9591aa73500b08b7db24367f8d32c6470021f39d5ab4e50c7c02e4401386f1 -requests==2.18.4 \ - --hash=sha256:6a1b267aa90cac58ac3a765d067950e7dbbf75b1da07e895d1f594193a40a38b \ - --hash=sha256:9c443e7324ba5b85070c4a818ade28bfabedf16ea10206da1132edaa6dda237e -requests_cache==0.4.13 \ - --hash=sha256:e9270030becc739b0a7f7f834234c73a878b2d794122bf76f40055a22419eb67 -requests-oauthlib==0.8.0 \ - --hash=sha256:50a8ae2ce8273e384895972b56193c7409601a66d4975774c60c2aed869639ca -oauthlib==2.0.6 \ - --hash=sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 \ - --hash=sha256:ce57b501e906ff4f614e71c36a3ab9eacbb96d35c24d1970d2539bbc3ec70ce1 -python-openid==2.2.5 \ - --hash=sha256:92c51c3ecec846cbec4aeff11f9ff47303d4a63f93b0e6ac0ec02a091fed70ef -lxml==4.1.1 \ - --hash=sha256:41f59cbdab232f11680d5d4dec9f2e6782fd24d78e37ee833447702e34e675f4 \ - --hash=sha256:e7e41d383f19bab9d57f5f3b18d158655bcd682e7e723f441b9e183e1e35a6b5 \ - --hash=sha256:155521c337acecf8202091cff85bb9f709f238130ebadf04280fb1db11f5ad8b \ - --hash=sha256:470d7ce41e8047208ba1a376560bad17f1468df1f3097bc83902b26cfafdbb0c \ - --hash=sha256:e608839a5ee2180164424ccf279c8e2d9bbe8816d002c58fd97d6b621ba4aa94 \ - --hash=sha256:d2c985d2460b81c6ca5feb8b86f1bc594ad59405d0bdf68626b85852b701553c \ - --hash=sha256:950e63387514aa1b881eba5ac6cb2ec51a118b3dafe99dd80ca19d8fb0142f30 \ - --hash=sha256:87a66bcadac270fc010cb029022a93fc722bf1204a8b03e782d4c790f0edf7ca \ - --hash=sha256:2dedfeeecc2d5a939cf622602f5a1ce443ca82407f386880f739f1a9f08053ad \ - --hash=sha256:ba05732e4bcf59e948f61588851dcf620fd60d5bbd9d704203e5f59bbaa60219 \ - --hash=sha256:2190266059fec3c5a55f9d6c30532c64c6d414d3228909c0af573fe4907e78d1 \ - --hash=sha256:dd291debfaa535d9cb6cee8d7aca2328775e037d02d13f1634e57f49bc302cc4 \ - --hash=sha256:29a36e354c39b2e24bc4ee103de53417ebb80f976a6ab9e8d093d559e2ac03e1 \ - --hash=sha256:e37427d5a27eefbcfc48847e0b37f348113fac7280bc857421db39ffc6372570 \ - --hash=sha256:b106d4d2383382399ad82108fd187e92f40b1c90f55c2d36bbcb1c44bcf940fc \ - --hash=sha256:0ee07da52d240f1dc3c83eef5cd5f1b7f018226c1121f2a54d446645779a6d17 \ - --hash=sha256:3b33549fb8f91b38a7500078242b03cca513f3412a2cdae722e89bf83f95971d \ - --hash=sha256:4c12e90886d9c53ab434c8d0cebea122321cce19614c3c6b6d1a7700d7cc6212 \ - --hash=sha256:79322000279cda10b53c374d53ca632ead3bc51c6aebf8e62c8fa93a4d08b750 \ - --hash=sha256:6cba398eb37e0631e60e0e080c101cfe91769b2c8267105b64b4625e2581ea21 \ - --hash=sha256:49a655956f8de69e1258bc0fcfc43eb3bd1e038655784d77d1869b4b81444e37 \ - --hash=sha256:af8a5373241d09b8fc53e0490e1719ce5dc90a21b19db89b6596c1adcdd52270 \ - --hash=sha256:e6b6698415c7e8d227a47a3b1038e1b37c2b438a1b48c2db7ad9e74ddbcd1149 \ - --hash=sha256:155c916cf2645b4a8f2bd5d09065e92d1b67b8d464bdc001e0b524af84bedf6f \ - --hash=sha256:fa7320679ced5e25b20203d157280680fc84eb783b6cc650cb0c98e1858b7dd3 \ - --hash=sha256:4187c4b0cefc3353181db048c51f42c489d9ac51e40b86c4851dc0671372971d \ - --hash=sha256:d5d29663e979e83b3fc361e97200f959cddb3a14797391d15273d84a5a8ae44b \ - --hash=sha256:940caef1ec7c78e0c34b0f6b94fe42d0f2022915ffc78643d28538a5cfd0f40e -pyephem==3.7.6.0 \ - --hash=sha256:143146da32a07a4cf9725b5656ba095d24978c22a0363414203e72c39bae52bd -olefile==0.45.1 \ - --hash=sha256:2b6575f5290de8ab1086f8c5490591f7e0885af682c7c1793bdaf6e64078d385 -pytz==2018.3 \ - --hash=sha256:ed6509d9af298b7995d69a440e2822288f2eca1681b8cce37673dbb10091e5fe \ - --hash=sha256:f93ddcdd6342f94cea379c73cddb5724e0d6d0a1c91c9bdef364dc0368ba4fda \ - --hash=sha256:61242a9abc626379574a166dc0e96a66cd7c3b27fc10868003fa210be4bff1c9 \ - --hash=sha256:ba18e6a243b3625513d85239b3e49055a2f0318466e0b8a92b8fb8ca7ccdf55f \ - --hash=sha256:07edfc3d4d2705a20a6e99d97f0c4b61c800b8232dc1c04d87e8554f130148dd \ - --hash=sha256:3a47ff71597f821cd84a162e71593004286e5be07a340fd462f0d33a760782b5 \ - --hash=sha256:5bd55c744e6feaa4d599a6cbd8228b4f8f9ba96de2c38d56f08e534b3c9edf0d \ - --hash=sha256:887ab5e5b32e4d0c86efddd3d055c1f363cbaa583beb8da5e22d2fa2f64d51ef \ - --hash=sha256:410bcd1d6409026fbaa65d9ed33bf6dd8b1e94a499e32168acfc7b332e4095c0 -chardet==3.0.4 \ - --hash=sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691 \ - --hash=sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae -idna==2.6 \ - --hash=sha256:8c7309c718f94b3a625cb648ace320157ad16ff131ae0af362c9f21b80ef6ec4 \ - --hash=sha256:2c6a5de3089009e3da7c5dde64a141dbc8551d5b7f6cf4ed7c2568d0cc520a8f -Unipath==1.1 \ - --hash=sha256:e6257e508d8abbfb6ddd8ec357e33589f1f48b1599127f23b017124d90b0fff7 \ - --hash=sha256:09839adcc72e8a24d4f76d63656f30b5a1f721fc40c9bcd79d8c67bdd8b47dae -amqp==2.2.2 \ - --hash=sha256:4e28d3ea61a64ae61830000c909662cb053642efddbe96503db0e7783a6ee85b \ - --hash=sha256:cba1ace9d4ff6049b190d8b7991f9c1006b443a5238021aca96dd6ad2ac9da22 -billiard==3.5.0.3 \ - --hash=sha256:abd9ce008c9a71ccde2c816f8daa36246e92a21e6a799831b887d88277187ecd \ - --hash=sha256:1d7b22bdc47aa52841120fcd22a74ae4fc8c13e9d3935643098184f5788c3ce6 -kombu==4.1.0 \ - --hash=sha256:01f0da9fe222a2183345004243d1518c0fbe5875955f1b24842f2d9c65709ade \ - --hash=sha256:4249d9dd9dbf1fcec471d1c2def20653c9310dd1a217272d77e4844f9d5273cb -vine==1.1.4 \ - --hash=sha256:6849544be74ec3638e84d90bc1cf2e1e9224cc10d96cd4383ec3f69e9bce077b \ - --hash=sha256:52116d59bc45392af9fdd3b75ed98ae48a93e822cee21e5fda249105c59a7a72 -args==0.1.0 \ - --hash=sha256:a785b8d837625e9b61c39108532d95b85274acd679693b71ebb5156848fcf814 -docopt==0.6.2 \ - --hash=sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491 -schema==0.6.7 \ - --hash=sha256:a058daf5d926e4ece9f13c4c2366a836143ca7913ef053c5023c569e00175b2a \ - --hash=sha256:410f44cb025384959d20deef00b4e1595397fa30959947a4f0d92e9c84616f35 -jsonpointer==2.0 \ - --hash=sha256:ff379fa021d1b81ab539f5ec467c7745beb1a5671463f9dcc2b2d458bd361c1e \ - --hash=sha256:c192ba86648e05fdae4f08a17ec25180a9aef5008d973407b581798a83975362 -jsonpatch==1.21 \ - --hash=sha256:404811758da710e58d703adf74f1935c59f8d9450137f971765931083042ee45 \ - --hash=sha256:11f5ffdf543a83047a2f54ac28f8caad7f34724cb1ea26b27547fd974f1a2153 -clint==0.5.1 \ - --hash=sha256:05224c32b1075563d0b16d0015faaf9da43aa214e4a2140e51f08789e7a4c5aa -backports.csv==1.0.5 \ - --hash=sha256:d3b0cefaaca92be3d2d4ceec140827cae1d871da7fff5db70697d72328357d65 \ - --hash=sha256:8c421385cbc6042ba90c68c871c5afc13672acaf91e1508546d6cda6725ebfc6 -contextlib2==0.5.5 \ - --hash=sha256:f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00 +shortuuid==0.5.0 +six==1.11.0 +Unidecode==1.0.22 +urllib3==1.22 +certifi==2018.1.18 +olefile==0.45.1 +django-appconf==1.0.2 +rcssmin==1.0.6 +rjsmin==1.0.12 +requests==2.18.4 +requests_cache==0.4.13 +requests-oauthlib==0.8.0 +oauthlib==2.0.6 +python-openid==2.2.5 +lxml==4.1.1 +pyephem==3.7.6.0 +olefile==0.45.1 +pytz==2018.3 +chardet==3.0.4 +idna==2.6 +Unipath==1.1 +amqp==2.2.2 +billiard==3.5.0.3 +kombu==4.1.0 +vine==1.1.4 +args==0.1.0 +docopt==0.6.2 +schema==0.6.7 +jsonpointer==2.0 +jsonpatch==1.21 +clint==0.5.1 +backports.csv==1.0.5 +contextlib2==0.5.5 +python-dotenv==0.6.5 +social-auth-app-django==1.2.0