From dfad93fce6324140a3e217f330d0b687c539d2be Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 11:08:20 +0300 Subject: [PATCH 01/13] Use os.path.join to get shapefile path --- tasking/serializers/location.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tasking/serializers/location.py b/tasking/serializers/location.py index bee925a..e05b479 100644 --- a/tasking/serializers/location.py +++ b/tasking/serializers/location.py @@ -6,6 +6,7 @@ import zipfile from io import BytesIO +from os import path from django.contrib.gis.gdal import DataSource from django.contrib.gis.geos import MultiPolygon, Point @@ -65,7 +66,7 @@ def to_internal_value(self, value): zip_file.extractall(tpath) # concatenate Shapefile path - shp_path = "{tpath}/{shp}".format(tpath=tpath, shp=shpfile) + shp_path = path.join(tpath, shpfile) # Make the shapefile a DataSource data_source = DataSource(shp_path) From ac4161ac5c4aa8775ad633f904d4152ef0793b72 Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 11:32:16 +0300 Subject: [PATCH 02/13] Optimize tox.ini file --- tox.ini | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/tox.ini b/tox.ini index f245551..0df9156 100644 --- a/tox.ini +++ b/tox.ini @@ -5,17 +5,6 @@ envlist = py36 flake8 pylint - coverage - -[testenv] -deps = - pipenv -basepython = - py35: python3.5 - py36: python3.6 -commands = - pipenv install --dev - python manage.py test {toxinidir}/tests -v 2 --parallel 2 [testenv:py27] deps = @@ -42,13 +31,15 @@ commands = pipenv install --dev pylint --rcfile={toxinidir}/.pylintrc {toxinidir}/tasking -[testenv:coverage] +[testenv] deps = - coverage pipenv -basepython = python3.6 + coverage +basepython = + py35: python3.5 + py36: python3.6 commands = - pipenv install --dev + pipenv sync --dev coverage erase coverage run --include="tasking/**.*" --omit="tests/**.*,tasking/migrations/**.*" manage.py test {toxinidir}/tests -v 2 coverage report From 134be1ca4d99730a1bdbbc4e693e94e0091d10eb Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:03:17 +0300 Subject: [PATCH 03/13] Add mock library --- Pipfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Pipfile b/Pipfile index 4fb6d99..f468044 100644 --- a/Pipfile +++ b/Pipfile @@ -17,6 +17,7 @@ model-mommy = "*" "pep8" = "*" "autopep8" = "*" tblib = "*" +mock = "*" [packages] "e1839a8" = {path = ".", editable = true} From 70e0fba632d2d3ea373ad5b3b83d852a8148c664 Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:03:38 +0300 Subject: [PATCH 04/13] Add InvalidShapefile --- tasking/common_tags.py | 1 + tasking/exceptions.py | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/tasking/common_tags.py b/tasking/common_tags.py index af925a5..5ffedfa 100644 --- a/tasking/common_tags.py +++ b/tasking/common_tags.py @@ -23,3 +23,4 @@ INVALID_END_DATE = _('The end date cannnot be lesser than the start date.') MISSING_START_DATE = _('Cannot determine the start date. Please provide ' 'either the start date or timing rule(s)') +INVALID_SHAPEFILE = _("Invalid shapefile") diff --git a/tasking/exceptions.py b/tasking/exceptions.py index a22a7ba..f781992 100644 --- a/tasking/exceptions.py +++ b/tasking/exceptions.py @@ -4,8 +4,8 @@ """ from __future__ import unicode_literals -from tasking.common_tags import TARGET_DOES_NOT_EXIST, NO_SHAPEFILE -from tasking.common_tags import MISSING_FILE, UNNECESSARY_FILE +from tasking.common_tags import (INVALID_SHAPEFILE, MISSING_FILE, NO_SHAPEFILE, + TARGET_DOES_NOT_EXIST, UNNECESSARY_FILE) class TargetDoesNotExist(Exception): @@ -24,6 +24,14 @@ class ShapeFileNotFound(Exception): message = NO_SHAPEFILE +class InvalidShapeFile(Exception): + """ + Custom Exception raised when the shapefile is not valid + """ + + message = INVALID_SHAPEFILE + + class MissingFiles(Exception): """ Custom Exception raised when a file is missing for shapefile From 440196bb9aad9d0da5e7402f102d420470c27abf Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:04:14 +0300 Subject: [PATCH 05/13] Raise serializer validation error for invalid shapefiles --- tasking/serializers/location.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/tasking/serializers/location.py b/tasking/serializers/location.py index e05b479..2d0c4ec 100644 --- a/tasking/serializers/location.py +++ b/tasking/serializers/location.py @@ -7,6 +7,7 @@ import zipfile from io import BytesIO from os import path +import logging from django.contrib.gis.gdal import DataSource from django.contrib.gis.geos import MultiPolygon, Point @@ -19,13 +20,16 @@ from rest_framework_gis.serializers import GeometryField from tasking.common_tags import (GEODETAILS_ONLY, GEOPOINT_MISSING, - RADIUS_MISSING) + RADIUS_MISSING, INVALID_SHAPEFILE) from tasking.exceptions import (MissingFiles, ShapeFileNotFound, UnnecessaryFiles) from tasking.models import Location from tasking.utils import get_shapefile +logger = logging.getLogger(__name__) + + class ShapeFileField(GeometryField): """ Custom Field for Shapefile @@ -79,7 +83,12 @@ def to_internal_value(self, value): for polygon in polygon_data: polygons.append(polygon.geos) - multipolygon = MultiPolygon(polygons) + try: + multipolygon = MultiPolygon(polygons) + except TypeError as e: + # this shapefile is just not valid for some reason + logger.exception(e) + raise serializers.ValidationError(INVALID_SHAPEFILE) return multipolygon From a87a58d694463f82e18255592e260865dc00905b Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:04:28 +0300 Subject: [PATCH 06/13] Code cleanup --- tests/serializers/test_contenttype.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/serializers/test_contenttype.py b/tests/serializers/test_contenttype.py index 4d273a5..baf37b8 100644 --- a/tests/serializers/test_contenttype.py +++ b/tests/serializers/test_contenttype.py @@ -32,6 +32,7 @@ def test_serializer_output(self): self.assertEqual(set(expected_fields), set(list(serializer_data.keys()))) - self.assertEqual(mocked_contenttype.app_label, serializer_data['app_label']) + self.assertEqual( + mocked_contenttype.app_label, serializer_data['app_label']) self.assertEqual(mocked_contenttype.model, serializer_data['model']) self.assertEqual(mocked_contenttype.id, serializer_data['id']) From 6dd0d6fc1cbaadce2c2e2695dc0a863d5df52f5a Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:04:45 +0300 Subject: [PATCH 07/13] Test for invalid shapefile --- tests/serializers/test_location.py | 47 +++++++++++++++++++++++------- 1 file changed, 37 insertions(+), 10 deletions(-) diff --git a/tests/serializers/test_location.py b/tests/serializers/test_location.py index 1c238da..945afdc 100644 --- a/tests/serializers/test_location.py +++ b/tests/serializers/test_location.py @@ -5,23 +5,25 @@ from __future__ import unicode_literals import os - from collections import OrderedDict from django.test import TestCase from django.utils import six - -from rest_framework.exceptions import ValidationError -from rest_framework_gis.fields import GeoJsonDict from model_mommy import mommy +from rest_framework.exceptions import ErrorDetail, ValidationError +from rest_framework_gis.fields import GeoJsonDict +from tasking.common_tags import (GEODETAILS_ONLY, GEOPOINT_MISSING, + RADIUS_MISSING) +from tasking.exceptions import (InvalidShapeFile, MissingFiles, + ShapeFileNotFound, UnnecessaryFiles) from tasking.serializers import LocationSerializer -from tasking.common_tags import RADIUS_MISSING, GEOPOINT_MISSING -from tasking.common_tags import GEODETAILS_ONLY -from tasking.exceptions import (MissingFiles, - ShapeFileNotFound, - UnnecessaryFiles) -from rest_framework.exceptions import ErrorDetail + +try: + from unittest.mock import patch +except ImportError: + from mock import patch + BASE_DIR = os.path.dirname(os.path.dirname(__file__)) @@ -407,3 +409,28 @@ def test_bad_shapefile_data(self): serializer_instance.errors, {"shapefile": [ErrorDetail(string=UnnecessaryFiles().message, code="invalid")]}) + + @patch('tasking.serializers.location.MultiPolygon') + def test_invalid_shapefile(self, mock): + """ + Test invalid shapefile + The appropriate exception is raised when we encounter an invalid + shapefile + """ + mock.side_effect = TypeError + + path = os.path.join( + BASE_DIR, 'fixtures', 'test_shapefile.zip') + + with open(path, 'r+b') as shapefile: + data = OrderedDict( + name='Nairobi', + country='KE', + shapefile=shapefile + ) + serializer_instance = LocationSerializer(data=data) + self.assertFalse(serializer_instance.is_valid()) + self.assertEqual( + serializer_instance.errors, + {"shapefile": [ErrorDetail(string=InvalidShapeFile().message, + code="invalid")]}) From f07ad915311a15b1144e1ff460903110429df7f2 Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:08:22 +0300 Subject: [PATCH 08/13] Fix django vulnerability See: https://nvd.nist.gov/vuln/detail/CVE-2019-6975 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index f182bc9..ff33e8b 100644 --- a/setup.py +++ b/setup.py @@ -14,7 +14,7 @@ url='https://github.com/onaio/tasking', packages=find_packages(exclude=['docs', 'tests']), install_requires=[ - 'Django >= 1.11, < 2.1', + 'Django >= 1.11.19, < 2.1', 'python-dateutil', 'markdown', # adds markdown support for browsable REST API 'django-filter < 2', # for filtering in the API From db2f9122cd500cb809612273ab183a950bc0cc3b Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:08:48 +0300 Subject: [PATCH 09/13] Update packages --- Pipfile | 3 +- Pipfile.lock | 381 +++++++++++++++++++++++++++------------------------ 2 files changed, 201 insertions(+), 183 deletions(-) diff --git a/Pipfile b/Pipfile index f468044..95956a1 100644 --- a/Pipfile +++ b/Pipfile @@ -20,5 +20,6 @@ tblib = "*" mock = "*" [packages] -"e1839a8" = {path = ".", editable = true} +e1839a8 = {editable = true,path = "."} future = "*" +ona-tasking = {editable = true,path = "."} diff --git a/Pipfile.lock b/Pipfile.lock index 008c1ab..0361ff7 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "a0e641d75c616b17602cf5934feeb3ecf95a88a6dff5bfd489ec755071448c3e" + "sha256": "83d978c0c7c2543f48b8e480090a02572b982f8989e2ac3472a46f6fdf8e492b" }, "pipfile-spec": 6, "requires": {}, @@ -30,17 +30,17 @@ }, "django": { "hashes": [ - "sha256:25df265e1fdb74f7e7305a1de620a84681bcc9c05e84a3ed97e4a1a63024f18d", - "sha256:d6d94554abc82ca37e447c3d28958f5ac39bd7d4adaa285543ae97fb1129fd69" + "sha256:665457d4146bbd34ae9d2970fa3b37082d7b225b0671bfd24c337458f229db78", + "sha256:bde46d4dbc410678e89bc95ea5d312dd6eb4c37d0fa0e19c9415cad94addf22f" ], - "version": "==2.0.9" + "version": "==2.0.13" }, "django-countries": { "hashes": [ - "sha256:2f684e2c2b8afdfd80137c8bcbb2d75f62a4a7863101cc62b4d84d3c9f27fdab", - "sha256:74ebe919aeccea818dafea17b0b243fb1280c55226cb315b9622f0c0416536d2" + "sha256:5307a61172eee5740720e44ea08721858b7d8bf8509ec7701ccd7a8d21120b9a", + "sha256:e4eaaec9bddb9365365109f833d1fd0ecc0cfee3348bf5441c0ccefb2d6917cd" ], - "version": "==5.3.2" + "version": "==5.3.3" }, "django-filter": { "hashes": [ @@ -51,10 +51,10 @@ }, "django-js-asset": { "hashes": [ - "sha256:30149158206f693a5d027fe590096fc84495486bd11cd77d395b4f2ec27fc1d0", - "sha256:a395d8d19eb201ea8d2bd4f145b38f1717cd74c0f609f040141d8724c5a27f36" + "sha256:33684c322db4fdec7cbd854fa8af527a9d2a4ef302c11263c18a9e19b3c4bd24", + "sha256:613e177fc6946497ed5ab09de95e3152d66264dbdcccc680ae3830e75b347184" ], - "version": "==1.1.0" + "version": "==1.2.1" }, "django-mptt": { "hashes": [ @@ -65,17 +65,17 @@ }, "djangorestframework": { "hashes": [ - "sha256:b6714c3e4b0f8d524f193c91ecf5f5450092c2145439ac2769711f7eba89a9d9", - "sha256:c375e4f95a3a64fccac412e36fb42ba36881e52313ec021ef410b40f67cddca4" + "sha256:79c6efbb2514bc50cf25906d7c0a5cfead714c7af667ff4bd110312cd380ae66", + "sha256:a4138613b67e3a223be6c97f53b13d759c5b90d2b433bad670b8ebf95402075f" ], - "version": "==3.8.2" + "version": "==3.9.1" }, "djangorestframework-gis": { "hashes": [ - "sha256:018200f8ac8e4babd04001e86ce8df5ad86057d1e7438558b7c9ce24b532ea20", - "sha256:94901389f32f0b8cdd1133e581f81c745c903449a08c2ddff0fcb2645cca846c" + "sha256:35527c51e083ccc93f6e6d90a6515c132bbeb2c5648b166ac5b1a48c4ea8e2a4", + "sha256:e645c6c8aedee53ac0a4851abcdf8121fff66813eebae1b040b1ccb941cb248b" ], - "version": "==0.13" + "version": "==0.14" }, "e1839a8": { "editable": true, @@ -83,55 +83,58 @@ }, "future": { "hashes": [ - "sha256:eb6d4df04f1fb538c99f69c9a28b255d1ee4e825d479b9c62fc38c0cf38065a4" + "sha256:67045236dcfd6816dc439556d009594abf643e5eb48992e36beac09c2ca659b8" ], "index": "pypi", - "version": "==0.17.0" + "version": "==0.17.1" }, "markdown": { "hashes": [ "sha256:c00429bd503a47ec88d5e30a751e147dcb4c6889663cd3e2ba0afe858e009baa", "sha256:d02e0f9b04c500cde6637c11ad7c72671f359b87b9fe924b2383649d8841db7c" ], - "markers": "python_version != '3.1.*' and python_version != '3.2.*' and python_version != '3.0.*' and python_version >= '2.7' and python_version != '3.3.*'", "version": "==3.0.1" }, + "ona-tasking": { + "editable": true, + "path": "." + }, "python-dateutil": { "hashes": [ - "sha256:063df5763652e21de43de7d9e00ccf239f953a832941e37be541614732cdfc93", - "sha256:88f9287c0174266bb0d8cedd395cfba9c58e87e5ad86b2ce58859bc11be3cf02" + "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", + "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" ], - "version": "==2.7.5" + "version": "==2.8.0" }, "pytz": { "hashes": [ - "sha256:31cb35c89bd7d333cd32c5f278fca91b523b0834369e757f4c5641ea252236ca", - "sha256:8e0f8568c118d3077b46be7d654cc8167fa916092e28320cde048e54bfc9f1e6" + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" ], - "version": "==2018.7" + "version": "==2018.9" }, "six": { "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" ], - "version": "==1.11.0" + "version": "==1.12.0" } }, "develop": { "astroid": { "hashes": [ - "sha256:292fa429e69d60e4161e7612cb7cc8fa3609e2e309f80c224d93a76d5e7b58be", - "sha256:c7013d119ec95eb626f7a2011f0b63d0c9a095df9ad06d8507b37084eada1a8d" + "sha256:35b032003d6a863f5dcd7ec11abd5cd5893428beaa31ab164982403bcb311f22", + "sha256:6a5d668d7dc69110de01cdf7aeec69a679ef486862a0850cc0fd5571505b6b7e" ], - "version": "==2.0.4" + "version": "==2.1.0" }, "autopep8": { "hashes": [ - "sha256:1b8d42ebba751a91090d3adb5c06840b1151d71ed43e1c7a9ed6911bfe8ebe6c" + "sha256:33d2b5325b7e1afb4240814fe982eea3a92ebea712869bfd08b3c0393404248c" ], "index": "pypi", - "version": "==1.4.2" + "version": "==1.4.3" }, "backcall": { "hashes": [ @@ -142,71 +145,76 @@ }, "coverage": { "hashes": [ - "sha256:03481e81d558d30d230bc12999e3edffe392d244349a90f4ef9b88425fac74ba", - "sha256:0b136648de27201056c1869a6c0d4e23f464750fd9a9ba9750b8336a244429ed", - "sha256:0bf8cbbd71adfff0ef1f3a1531e6402d13b7b01ac50a79c97ca15f030dba6306", - "sha256:10a46017fef60e16694a30627319f38a2b9b52e90182dddb6e37dcdab0f4bf95", - "sha256:198626739a79b09fa0a2f06e083ffd12eb55449b5f8bfdbeed1df4910b2ca640", - "sha256:23d341cdd4a0371820eb2b0bd6b88f5003a7438bbedb33688cd33b8eae59affd", - "sha256:28b2191e7283f4f3568962e373b47ef7f0392993bb6660d079c62bd50fe9d162", - "sha256:2a5b73210bad5279ddb558d9a2bfedc7f4bf6ad7f3c988641d83c40293deaec1", - "sha256:2eb564bbf7816a9d68dd3369a510be3327f1c618d2357fa6b1216994c2e3d508", - "sha256:337ded681dd2ef9ca04ef5d93cfc87e52e09db2594c296b4a0a3662cb1b41249", - "sha256:3a2184c6d797a125dca8367878d3b9a178b6fdd05fdc2d35d758c3006a1cd694", - "sha256:3c79a6f7b95751cdebcd9037e4d06f8d5a9b60e4ed0cd231342aa8ad7124882a", - "sha256:3d72c20bd105022d29b14a7d628462ebdc61de2f303322c0212a054352f3b287", - "sha256:3eb42bf89a6be7deb64116dd1cc4b08171734d721e7a7e57ad64cc4ef29ed2f1", - "sha256:4635a184d0bbe537aa185a34193898eee409332a8ccb27eea36f262566585000", - "sha256:56e448f051a201c5ebbaa86a5efd0ca90d327204d8b059ab25ad0f35fbfd79f1", - "sha256:5a13ea7911ff5e1796b6d5e4fbbf6952381a611209b736d48e675c2756f3f74e", - "sha256:69bf008a06b76619d3c3f3b1983f5145c75a305a0fea513aca094cae5c40a8f5", - "sha256:6bc583dc18d5979dc0f6cec26a8603129de0304d5ae1f17e57a12834e7235062", - "sha256:701cd6093d63e6b8ad7009d8a92425428bc4d6e7ab8d75efbb665c806c1d79ba", - "sha256:7608a3dd5d73cb06c531b8925e0ef8d3de31fed2544a7de6c63960a1e73ea4bc", - "sha256:76ecd006d1d8f739430ec50cc872889af1f9c1b6b8f48e29941814b09b0fd3cc", - "sha256:7aa36d2b844a3e4a4b356708d79fd2c260281a7390d678a10b91ca595ddc9e99", - "sha256:7d3f553904b0c5c016d1dad058a7554c7ac4c91a789fca496e7d8347ad040653", - "sha256:7e1fe19bd6dce69d9fd159d8e4a80a8f52101380d5d3a4d374b6d3eae0e5de9c", - "sha256:8c3cb8c35ec4d9506979b4cf90ee9918bc2e49f84189d9bf5c36c0c1119c6558", - "sha256:9d6dd10d49e01571bf6e147d3b505141ffc093a06756c60b053a859cb2128b1f", - "sha256:be6cfcd8053d13f5f5eeb284aa8a814220c3da1b0078fa859011c7fffd86dab9", - "sha256:c1bb572fab8208c400adaf06a8133ac0712179a334c09224fb11393e920abcdd", - "sha256:de4418dadaa1c01d497e539210cb6baa015965526ff5afc078c57ca69160108d", - "sha256:e05cb4d9aad6233d67e0541caa7e511fa4047ed7750ec2510d466e806e0255d6", - "sha256:f05a636b4564104120111800021a92e43397bc12a5c72fed7036be8556e0029e", - "sha256:f3f501f345f24383c0000395b26b726e46758b71393267aeae0bd36f8b3ade80" + "sha256:09e47c529ff77bf042ecfe858fb55c3e3eb97aac2c87f0349ab5a7efd6b3939f", + "sha256:0a1f9b0eb3aa15c990c328535655847b3420231af299386cfe5efc98f9c250fe", + "sha256:0cc941b37b8c2ececfed341444a456912e740ecf515d560de58b9a76562d966d", + "sha256:10e8af18d1315de936d67775d3a814cc81d0747a1a0312d84e27ae5610e313b0", + "sha256:1b4276550b86caa60606bd3572b52769860a81a70754a54acc8ba789ce74d607", + "sha256:1e8a2627c48266c7b813975335cfdea58c706fe36f607c97d9392e61502dc79d", + "sha256:2b224052bfd801beb7478b03e8a66f3f25ea56ea488922e98903914ac9ac930b", + "sha256:447c450a093766744ab53bf1e7063ec82866f27bcb4f4c907da25ad293bba7e3", + "sha256:46101fc20c6f6568561cdd15a54018bb42980954b79aa46da8ae6f008066a30e", + "sha256:4710dc676bb4b779c4361b54eb308bc84d64a2fa3d78e5f7228921eccce5d815", + "sha256:510986f9a280cd05189b42eee2b69fecdf5bf9651d4cd315ea21d24a964a3c36", + "sha256:5535dda5739257effef56e49a1c51c71f1d37a6e5607bb25a5eee507c59580d1", + "sha256:5a7524042014642b39b1fcae85fb37556c200e64ec90824ae9ecf7b667ccfc14", + "sha256:5f55028169ef85e1fa8e4b8b1b91c0b3b0fa3297c4fb22990d46ff01d22c2d6c", + "sha256:6694d5573e7790a0e8d3d177d7a416ca5f5c150742ee703f3c18df76260de794", + "sha256:6831e1ac20ac52634da606b658b0b2712d26984999c9d93f0c6e59fe62ca741b", + "sha256:77f0d9fa5e10d03aa4528436e33423bfa3718b86c646615f04616294c935f840", + "sha256:828ad813c7cdc2e71dcf141912c685bfe4b548c0e6d9540db6418b807c345ddd", + "sha256:85a06c61598b14b015d4df233d249cd5abfa61084ef5b9f64a48e997fd829a82", + "sha256:8cb4febad0f0b26c6f62e1628f2053954ad2c555d67660f28dfb1b0496711952", + "sha256:a5c58664b23b248b16b96253880b2868fb34358911400a7ba39d7f6399935389", + "sha256:aaa0f296e503cda4bc07566f592cd7a28779d433f3a23c48082af425d6d5a78f", + "sha256:ab235d9fe64833f12d1334d29b558aacedfbca2356dfb9691f2d0d38a8a7bfb4", + "sha256:b3b0c8f660fae65eac74fbf003f3103769b90012ae7a460863010539bb7a80da", + "sha256:bab8e6d510d2ea0f1d14f12642e3f35cefa47a9b2e4c7cea1852b52bc9c49647", + "sha256:c45297bbdbc8bb79b02cf41417d63352b70bcb76f1bbb1ee7d47b3e89e42f95d", + "sha256:d19bca47c8a01b92640c614a9147b081a1974f69168ecd494687c827109e8f42", + "sha256:d64b4340a0c488a9e79b66ec9f9d77d02b99b772c8b8afd46c1294c1d39ca478", + "sha256:da969da069a82bbb5300b59161d8d7c8d423bc4ccd3b410a9b4d8932aeefc14b", + "sha256:ed02c7539705696ecb7dc9d476d861f3904a8d2b7e894bd418994920935d36bb", + "sha256:ee5b8abc35b549012e03a7b1e86c09491457dba6c94112a2482b18589cc2bdb9" ], "index": "pypi", - "version": "==4.5.1" + "version": "==4.5.2" }, "decorator": { "hashes": [ - "sha256:2c51dff8ef3c447388fe5e4453d24a2bf128d3a4c32af3fabef1f01c6851ab82", - "sha256:c39efa13fbdeb4506c476c9b3babf6a718da943dab7811c206005a4a956c080c" + "sha256:33cd704aea07b4c28b3eb2c97d288a06918275dac0ecebdaf1bc8a48d98adb9e", + "sha256:cabb249f4710888a2fc0e13e9a16c343d932033718ff62e1e9bc93a9d3a9122b" ], - "version": "==4.3.0" + "version": "==4.3.2" }, "django": { "hashes": [ - "sha256:25df265e1fdb74f7e7305a1de620a84681bcc9c05e84a3ed97e4a1a63024f18d", - "sha256:d6d94554abc82ca37e447c3d28958f5ac39bd7d4adaa285543ae97fb1129fd69" + "sha256:665457d4146bbd34ae9d2970fa3b37082d7b225b0671bfd24c337458f229db78", + "sha256:bde46d4dbc410678e89bc95ea5d312dd6eb4c37d0fa0e19c9415cad94addf22f" ], - "version": "==2.0.9" + "version": "==2.0.13" + }, + "entrypoints": { + "hashes": [ + "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", + "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451" + ], + "version": "==0.3" }, "filelock": { "hashes": [ - "sha256:86fe6af56ae08ebc9c66d54ba3398c35b98916d0862d782b276a65816ff39392", - "sha256:97694f181bdf58f213cca0a7cb556dc7bf90e2f8eb9aa3151260adac56701afb" + "sha256:b8d5ca5ca1c815e1574aee746650ea7301de63d87935b3463d26368b76e31633", + "sha256:d610c1bb404daf85976d7a82eb2ada120f04671007266b708606565dd03b5be6" ], - "version": "==3.0.9" + "version": "==3.0.10" }, "flake8": { "hashes": [ - "sha256:6a35f5b8761f45c5513e3405f110a86bea57982c3b75b766ce7b65217abe1670", - "sha256:c01f8a3963b3571a8e6bd7a4063359aff90749e160778e03817cd9b71c9e07d2" + "sha256:c3ba1e130c813191db95c431a18cb4d20a468e98af7a77e2181b68574481ad36", + "sha256:fd9ddf503110bf3d8b1d270e8c673aab29ccb3dd6abf29bae1f54e5116ab4a91" ], "index": "pypi", - "version": "==3.6.0" + "version": "==3.7.5" }, "ipdb": { "hashes": [ @@ -217,10 +225,11 @@ }, "ipython": { "hashes": [ - "sha256:a5781d6934a3341a1f9acb4ea5acdc7ea0a0855e689dbe755d070ca51e995435", - "sha256:b10a7ddd03657c761fc503495bc36471c8158e3fc948573fb9fe82a7029d8efd" + "sha256:6a9496209b76463f1dec126ab928919aaf1f55b38beb9219af3fe202f6bbdd12", + "sha256:f69932b1e806b38a7818d9a1e918e5821b685715040b48e59c657b3c7961b742" ], - "version": "==7.1.1" + "markers": "python_version >= '3.3'", + "version": "==7.2.0" }, "ipython-genutils": { "hashes": [ @@ -240,10 +249,10 @@ }, "jedi": { "hashes": [ - "sha256:0191c447165f798e6a730285f2eee783fff81b0d3df261945ecb80983b5c3ca7", - "sha256:b7493f73a2febe0dc33d51c99b474547f7f6c0b2c8fb2b21f453eef204c12148" + "sha256:571702b5bd167911fe9036e5039ba67f820d6502832285cde8c881ab2b2149fd", + "sha256:c8481b5e59d34a5c7c42e98f6625e633f6ef59353abea6437472c7ec2093f191" ], - "version": "==0.13.1" + "version": "==0.13.2" }, "lazy-object-proxy": { "hashes": [ @@ -286,6 +295,14 @@ ], "version": "==0.6.1" }, + "mock": { + "hashes": [ + "sha256:5ce3c71c5545b472da17b72268978914d0252980348636840bd34a00b5cc96c1", + "sha256:b158b6df76edd239b8208d481dc46b6afd45a846b7812ff0ce58971cf5bc8bba" + ], + "index": "pypi", + "version": "==2.0.0" + }, "model-mommy": { "hashes": [ "sha256:0e42c8f4a37c874dd81675ef8a385d3a25877082565e0d213022898c637f6f25", @@ -296,10 +313,17 @@ }, "parso": { "hashes": [ - "sha256:35704a43a3c113cce4de228ddb39aab374b8004f4f2407d070b6a2ca784ce8a2", - "sha256:895c63e93b94ac1e1690f5fdd40b65f07c8171e3e53cbd7793b5b96c0e0a7f24" + "sha256:4580328ae3f548b358f4901e38c0578229186835f0fa0846e47369796dd5bcc9", + "sha256:68406ebd7eafe17f8e40e15a84b56848eccbf27d7c1feb89e93d8fca395706db" ], - "version": "==0.3.1" + "version": "==0.3.4" + }, + "pbr": { + "hashes": [ + "sha256:a7953f66e1f82e4b061f43096a4bcc058f7d3d41de9b94ac871770e8bdd831a2", + "sha256:d717573351cfe09f49df61906cd272abaa759b3e91744396b804965ff7bff38b" + ], + "version": "==5.1.2" }, "pep8": { "hashes": [ @@ -326,55 +350,54 @@ }, "pluggy": { "hashes": [ - "sha256:447ba94990e8014ee25ec853339faf7b0fc8050cdc3289d4d71f7f410fb90095", - "sha256:bde19360a8ec4dfd8a20dcb811780a30998101f078fc7ded6162f0076f50508f" + "sha256:8ddc32f03971bfdf900a81961a48ccf2fb677cf7715108f85295c67405798616", + "sha256:980710797ff6a041e9a73a5787804f848996ecaa6f8a1b1e08224a5894f2074a" ], - "markers": "python_version >= '2.7' and python_version != '3.3.*' and python_version != '3.0.*' and python_version != '3.2.*' and python_version != '3.1.*'", - "version": "==0.8.0" + "version": "==0.8.1" }, "prompt-toolkit": { "hashes": [ - "sha256:646b3401b3b0bb7752100bc9b7aeecb36cb09cdfc63652b5856708b5ba8db7da", - "sha256:82766ffd7397e6661465e20bd1390db0781ca4fbbab4cf6c2578cacdd8b09754", - "sha256:ccad8461b5d912782726af17122113e196085e7e11d57cf0c9b982bf1ab2c7be" + "sha256:88002cc618cacfda8760c4539e76c3b3f148ecdb7035a3d422c7ecdc90c2a3ba", + "sha256:c6655a12e9b08edb8cf5aeab4815fd1e1bdea4ad73d3bbf269cf2e0c4eb75d5e", + "sha256:df5835fb8f417aa55e5cafadbaeb0cf630a1e824aad16989f9f0493e679ec010" ], - "version": "==2.0.6" + "version": "==2.0.8" }, "psycopg2-binary": { "hashes": [ - "sha256:04afb59bbbd2eab3148e6816beddc74348078b8c02a1113ea7f7822f5be4afe3", - "sha256:098b18f4d8857a8f9b206d1dc54db56c2255d5d26458917e7bcad61ebfe4338f", - "sha256:0bf855d4a7083e20ead961fda4923887094eaeace0ab2d76eb4aa300f4bbf5bd", - "sha256:197dda3ffd02057820be83fe4d84529ea70bf39a9a4daee1d20ffc74eb3d042e", - "sha256:278ef63afb4b3d842b4609f2c05ffbfb76795cf6a184deeb8707cd5ed3c981a5", - "sha256:3cbf8c4fc8f22f0817220891cf405831559f4d4c12c4f73913730a2ea6c47a47", - "sha256:4305aed922c4d9d6163ab3a41d80b5a1cfab54917467da8168552c42cad84d32", - "sha256:47ee296f704fb8b2a616dec691cdcfd5fa0f11943955e88faa98cbd1dc3b3e3d", - "sha256:4a0e38cb30457e70580903367161173d4a7d1381eb2f2cfe4e69b7806623f484", - "sha256:4d6c294c6638a71cafb82a37f182f24321f1163b08b5d5ca076e11fe838a3086", - "sha256:4f3233c366500730f839f92833194fd8f9a5c4529c8cd8040aa162c3740de8e5", - "sha256:5221f5a3f4ca2ddf0d58e8b8a32ca50948be9a43351fda797eb4e72d7a7aa34d", - "sha256:5c6ca0b507540a11eaf9e77dee4f07c131c2ec80ca0cffa146671bf690bc1c02", - "sha256:789bd89d71d704db2b3d5e67d6d518b158985d791d3b2dec5ab85457cfc9677b", - "sha256:7b94d29239efeaa6a967f3b5971bd0518d2a24edd1511edbf4a2c8b815220d07", - "sha256:89bc65ef3301c74cf32db25334421ea6adbe8f65601ea45dcaaf095abed910bb", - "sha256:89d6d3a549f405c20c9ae4dc94d7ed2de2fa77427a470674490a622070732e62", - "sha256:97521704ac7127d7d8ba22877da3c7bf4a40366587d238ec679ff38e33177498", - "sha256:a395b62d5f44ff6f633231abe568e2203b8fabf9797cd6386aa92497df912d9a", - "sha256:a6d32c37f714c3f34158f3fa659f3a8f2658d5f53c4297d45579b9677cc4d852", - "sha256:a89ee5c26f72f2d0d74b991ce49e42ddeb4ac0dc2d8c06a0f2770a1ab48f4fe0", - "sha256:b4c8b0ef3608e59317bfc501df84a61e48b5445d45f24d0391a24802de5f2d84", - "sha256:b5fcf07140219a1f71e18486b8dc28e2e1b76a441c19374805c617aa6d9a9d55", - "sha256:b86f527f00956ecebad6ab3bb30e3a75fedf1160a8716978dd8ce7adddedd86f", - "sha256:be4c4aa22ba22f70de36c98b06480e2f1697972d49eb20d525f400d204a6d272", - "sha256:c2ac7aa1a144d4e0e613ac7286dae85671e99fe7a1353954d4905629c36b811c", - "sha256:de26ef4787b5e778e8223913a3e50368b44e7480f83c76df1f51d23bd21cea16", - "sha256:e70ebcfc5372dc7b699c0110454fc4263967f30c55454397e5769eb72c0eb0ce", - "sha256:eadbd32b6bc48b67b0457fccc94c86f7ccc8178ab839f684eb285bb592dc143e", - "sha256:ecbc6dfff6db06b8b72ae8a2f25ff20fbdcb83cb543811a08f7cb555042aa729" + "sha256:19a2d1f3567b30f6c2bb3baea23f74f69d51f0c06c2e2082d0d9c28b0733a4c2", + "sha256:2b69cf4b0fa2716fd977aa4e1fd39af6110eb47b2bb30b4e5a469d8fbecfc102", + "sha256:2e952fa17ba48cbc2dc063ddeec37d7dc4ea0ef7db0ac1eda8906365a8543f31", + "sha256:348b49dd737ff74cfb5e663e18cb069b44c64f77ec0523b5794efafbfa7df0b8", + "sha256:3d72a5fdc5f00ca85160915eb9a973cf9a0ab8148f6eda40708bf672c55ac1d1", + "sha256:4957452f7868f43f32c090dadb4188e9c74a4687323c87a882e943c2bd4780c3", + "sha256:5138cec2ee1e53a671e11cc519505eb08aaaaf390c508f25b09605763d48de4b", + "sha256:587098ca4fc46c95736459d171102336af12f0d415b3b865972a79c03f06259f", + "sha256:5b79368bcdb1da4a05f931b62760bea0955ee2c81531d8e84625df2defd3f709", + "sha256:5cf43807392247d9bc99737160da32d3fa619e0bfd85ba24d1c78db205f472a4", + "sha256:676d1a80b1eebc0cacae8dd09b2fde24213173bf65650d22b038c5ed4039f392", + "sha256:6b0211ecda389101a7d1d3df2eba0cf7ffbdd2480ca6f1d2257c7bd739e84110", + "sha256:79cde4660de6f0bb523c229763bd8ad9a93ac6760b72c369cf1213955c430934", + "sha256:7aba9786ac32c2a6d5fb446002ed936b47d5e1f10c466ef7e48f66eb9f9ebe3b", + "sha256:7c8159352244e11bdd422226aa17651110b600d175220c451a9acf795e7414e0", + "sha256:945f2eedf4fc6b2432697eb90bb98cc467de5147869e57405bfc31fa0b824741", + "sha256:96b4e902cde37a7fc6ab306b3ac089a3949e6ce3d824eeca5b19dc0bedb9f6e2", + "sha256:9a7bccb1212e63f309eb9fab47b6eaef796f59850f169a25695b248ca1bf681b", + "sha256:a3bfcac727538ec11af304b5eccadbac952d4cca1a551a29b8fe554e3ad535dc", + "sha256:b19e9f1b85c5d6136f5a0549abdc55dcbd63aba18b4f10d0d063eb65ef2c68b4", + "sha256:b664011bb14ca1f2287c17185e222f2098f7b4c857961dbcf9badb28786dbbf4", + "sha256:bde7959ef012b628868d69c474ec4920252656d0800835ed999ba5e4f57e3e2e", + "sha256:cb095a0657d792c8de9f7c9a0452385a309dfb1bbbb3357d6b1e216353ade6ca", + "sha256:d16d42a1b9772152c1fe606f679b2316551f7e1a1ce273e7f808e82a136cdb3d", + "sha256:d444b1545430ffc1e7a24ce5a9be122ccd3b135a7b7e695c5862c5aff0b11159", + "sha256:d93ccc7bf409ec0a23f2ac70977507e0b8a8d8c54e5ee46109af2f0ec9e411f3", + "sha256:df6444f952ca849016902662e1a47abf4fa0678d75f92fd9dd27f20525f809cd", + "sha256:e63850d8c52ba2b502662bf3c02603175c2397a9acc756090e444ce49508d41e", + "sha256:ec43358c105794bc2b6fd34c68d27f92bea7102393c01889e93f4b6a70975728", + "sha256:f4c6926d9c03dadce7a3b378b40d2fea912c1344ef9b29869f984fb3d2a2420b" ], "index": "pypi", - "version": "==2.7.5" + "version": "==2.7.7" }, "ptyprocess": { "hashes": [ @@ -388,53 +411,51 @@ "sha256:bf92637198836372b520efcba9e020c330123be8ce527e535d185ed4b6f45694", "sha256:e76826342cefe3c3d5f7e8ee4316b80d1dd8a300781612ddbc765c17ba25a6c6" ], - "markers": "python_version >= '2.7' and python_version != '3.3.*' and python_version != '3.0.*' and python_version != '3.2.*' and python_version != '3.1.*'", "version": "==1.7.0" }, "pycodestyle": { "hashes": [ - "sha256:cbc619d09254895b0d12c2c691e237b2e91e9b2ecf5e84c26b35400f93dcfb83", - "sha256:cbfca99bd594a10f674d0cd97a3d802a1fdef635d4361e1a2658de47ed261e3a" + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" ], "index": "pypi", - "version": "==2.4.0" + "version": "==2.5.0" }, "pyflakes": { "hashes": [ - "sha256:9a7662ec724d0120012f6e29d6248ae3727d821bba522a0e6b356eff19126a49", - "sha256:f661252913bc1dbe7fcfcbf0af0db3f42ab65aabd1a6ca68fe5d466bace94dae" + "sha256:5e8c00e30c464c99e0b501dc160b13a14af7f27d4dffb529c556e30a159e231d", + "sha256:f277f9ca3e55de669fba45b7393a1449009cff5a37d1af10ebb76c52765269cd" ], - "markers": "python_version != '3.0.*' and python_version != '3.1.*' and python_version >= '2.7' and python_version != '3.2.*' and python_version != '3.3.*'", - "version": "==2.0.0" + "version": "==2.1.0" }, "pygments": { "hashes": [ - "sha256:78f3f434bcc5d6ee09020f92ba487f95ba50f1e3ef83ae96b9d5ffa1bab25c5d", - "sha256:dbae1046def0efb574852fab9e90209b23f556367b5a320c0bcb871c77c3e8cc" + "sha256:5ffada19f6203563680669ee7f53b64dabbeb100eb51b61996085e99c03b284a", + "sha256:e8218dd399a61674745138520d0d4cf2621d7e032439341bc3f647bff125818d" ], - "version": "==2.2.0" + "version": "==2.3.1" }, "pylint": { "hashes": [ - "sha256:1d6d3622c94b4887115fe5204982eee66fdd8a951cf98635ee5caee6ec98c3ec", - "sha256:31142f764d2a7cd41df5196f9933b12b7ee55e73ef12204b648ad7e556c119fb" + "sha256:689de29ae747642ab230c6d37be2b969bf75663176658851f456619aacf27492", + "sha256:771467c434d0d9f081741fec1d64dfb011ed26e65e12a28fe06ca2f61c4d556c" ], "index": "pypi", - "version": "==2.1.1" + "version": "==2.2.2" }, "pytz": { "hashes": [ - "sha256:31cb35c89bd7d333cd32c5f278fca91b523b0834369e757f4c5641ea252236ca", - "sha256:8e0f8568c118d3077b46be7d654cc8167fa916092e28320cde048e54bfc9f1e6" + "sha256:32b0891edff07e28efe91284ed9c31e123d84bea3fd98e1f72be2508f43ef8d9", + "sha256:d5f05e487007e29e03409f9398d074e158d920d36eb82eaf66fb1136b0c5374c" ], - "version": "==2018.7" + "version": "==2018.9" }, "six": { "hashes": [ - "sha256:70e8a77beed4562e7f14fe23a786b54f6296e34344c23bc42f07b15018ff98e9", - "sha256:832dc0e10feb1aa2c68dcc57dbb658f1c7e65b9b61af69048abc87a2db00a0eb" + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" ], - "version": "==1.11.0" + "version": "==1.12.0" }, "tblib": { "hashes": [ @@ -453,11 +474,11 @@ }, "tox": { "hashes": [ - "sha256:513e32fdf2f9e2d583c2f248f47ba9886428c949f068ac54a0469cac55df5862", - "sha256:75fa30e8329b41b664585f5fb837e23ce1d7e6fa1f7811f2be571c990f9d911b" + "sha256:04f8f1aa05de8e76d7a266ccd14e0d665d429977cd42123bc38efa9b59964e9e", + "sha256:25ef928babe88c71e3ed3af0c464d1160b01fca2dd1870a5bb26c2dea61a17fc" ], "index": "pypi", - "version": "==3.5.3" + "version": "==3.7.0" }, "traitlets": { "hashes": [ @@ -468,39 +489,35 @@ }, "typed-ast": { "hashes": [ - "sha256:0948004fa228ae071054f5208840a1e88747a357ec1101c17217bfe99b299d58", - "sha256:10703d3cec8dcd9eef5a630a04056bbc898abc19bac5691612acba7d1325b66d", - "sha256:1f6c4bd0bdc0f14246fd41262df7dfc018d65bb05f6e16390b7ea26ca454a291", - "sha256:25d8feefe27eb0303b73545416b13d108c6067b846b543738a25ff304824ed9a", - "sha256:29464a177d56e4e055b5f7b629935af7f49c196be47528cc94e0a7bf83fbc2b9", - "sha256:2e214b72168ea0275efd6c884b114ab42e316de3ffa125b267e732ed2abda892", - "sha256:3e0d5e48e3a23e9a4d1a9f698e32a542a4a288c871d33ed8df1b092a40f3a0f9", - "sha256:519425deca5c2b2bdac49f77b2c5625781abbaf9a809d727d3a5596b30bb4ded", - "sha256:57fe287f0cdd9ceaf69e7b71a2e94a24b5d268b35df251a88fef5cc241bf73aa", - "sha256:668d0cec391d9aed1c6a388b0d5b97cd22e6073eaa5fbaa6d2946603b4871efe", - "sha256:68ba70684990f59497680ff90d18e756a47bf4863c604098f10de9716b2c0bdd", - "sha256:6de012d2b166fe7a4cdf505eee3aaa12192f7ba365beeefaca4ec10e31241a85", - "sha256:79b91ebe5a28d349b6d0d323023350133e927b4de5b651a8aa2db69c761420c6", - "sha256:8550177fa5d4c1f09b5e5f524411c44633c80ec69b24e0e98906dd761941ca46", - "sha256:898f818399cafcdb93cbbe15fc83a33d05f18e29fb498ddc09b0214cdfc7cd51", - "sha256:94b091dc0f19291adcb279a108f5d38de2430411068b219f41b343c03b28fb1f", - "sha256:a26863198902cda15ab4503991e8cf1ca874219e0118cbf07c126bce7c4db129", - "sha256:a8034021801bc0440f2e027c354b4eafd95891b573e12ff0418dec385c76785c", - "sha256:bc978ac17468fe868ee589c795d06777f75496b1ed576d308002c8a5756fb9ea", - "sha256:c05b41bc1deade9f90ddc5d988fe506208019ebba9f2578c622516fd201f5863", - "sha256:c9b060bd1e5a26ab6e8267fd46fc9e02b54eb15fffb16d112d4c7b1c12987559", - "sha256:edb04bdd45bfd76c8292c4d9654568efaedf76fe78eb246dde69bdb13b2dad87", - "sha256:f19f2a4f547505fe9072e15f6f4ae714af51b5a681a97f187971f50c283193b6" + "sha256:035a54ede6ce1380599b2ce57844c6554666522e376bd111eb940fbc7c3dad23", + "sha256:037c35f2741ce3a9ac0d55abfcd119133cbd821fffa4461397718287092d9d15", + "sha256:049feae7e9f180b64efacbdc36b3af64a00393a47be22fa9cb6794e68d4e73d3", + "sha256:19228f7940beafc1ba21a6e8e070e0b0bfd1457902a3a81709762b8b9039b88d", + "sha256:2ea681e91e3550a30c2265d2916f40a5f5d89b59469a20f3bad7d07adee0f7a6", + "sha256:3a6b0a78af298d82323660df5497bcea0f0a4a25a0b003afd0ce5af049bd1f60", + "sha256:5385da8f3b801014504df0852bf83524599df890387a3c2b17b7caa3d78b1773", + "sha256:606d8afa07eef77280c2bf84335e24390055b478392e1975f96286d99d0cb424", + "sha256:69245b5b23bbf7fb242c9f8f08493e9ecd7711f063259aefffaeb90595d62287", + "sha256:6f6d839ab09830d59b7fa8fb6917023d8cb5498ee1f1dbd82d37db78eb76bc99", + "sha256:730888475f5ac0e37c1de4bd05eeb799fdb742697867f524dc8a4cd74bcecc23", + "sha256:9819b5162ffc121b9e334923c685b0d0826154e41dfe70b2ede2ce29034c71d8", + "sha256:9e60ef9426efab601dd9aa120e4ff560f4461cf8442e9c0a2b92548d52800699", + "sha256:af5fbdde0690c7da68e841d7fc2632345d570768ea7406a9434446d7b33b0ee1", + "sha256:b64efdbdf3bbb1377562c179f167f3bf301251411eb5ac77dec6b7d32bcda463", + "sha256:bac5f444c118aeb456fac1b0b5d14c6a71ea2a42069b09c176f75e9bd4c186f6", + "sha256:bda9068aafb73859491e13b99b682bd299c1b5fd50644d697533775828a28ee0", + "sha256:d659517ca116e6750101a1326107d3479028c5191f0ecee3c7203c50f5b915b0", + "sha256:eddd3fb1f3e0f82e5915a899285a39ee34ce18fd25d89582bc89fc9fb16cd2c6" ], "markers": "python_version < '3.7' and implementation_name == 'cpython'", - "version": "==1.1.0" + "version": "==1.3.1" }, "virtualenv": { "hashes": [ - "sha256:2ce32cd126117ce2c539f0134eb89de91a8413a29baac49cbab3eb50e2026669", - "sha256:ca07b4c0b54e14a91af9f34d0919790b016923d157afda5efdde55c96718f752" + "sha256:8b9abfc51c38b70f61634bf265e5beacf6fae11fc25d355d1871f49b8e45f0db", + "sha256:cceab52aa7d4df1e1871a70236eb2b89fcfe29b6b43510d9738689787c513261" ], - "version": "==16.0.0" + "version": "==16.4.0" }, "wcwidth": { "hashes": [ @@ -511,17 +528,17 @@ }, "wrapt": { "hashes": [ - "sha256:d4d560d479f2c21e1b5443bbd15fe7ec4b37fe7e53d335d3b9b0a7b1226fe3c6" + "sha256:4aea003270831cceb8a90ff27c4031da6ead7ec1886023b80ce0dfe0adf61533" ], - "version": "==1.10.11" + "version": "==1.11.1" }, "yapf": { "hashes": [ - "sha256:b96815bd0bbd2ab290f2ae9e610756940b17a0523ef2f6b2d31da749fc395137", - "sha256:cebb6faf35c9027c08996c07831b8971f3d67c0eb615269f66dfd7e6815fdc2a" + "sha256:edb47be90a56ca6f3075fe24f119a22225fbd62c66777b5d3916a7e9e793891b", + "sha256:f58069d5e0df60c078f3f986b8a63acfda73aa6ebb7cd423f6eabd1cb06420ba" ], "index": "pypi", - "version": "==0.24.0" + "version": "==0.26.0" } } } From a295681307af7793bd37b00a211a3c2f04ec4681 Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:39:00 +0300 Subject: [PATCH 10/13] Fix pylint issues --- tasking/serializers/location.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tasking/serializers/location.py b/tasking/serializers/location.py index 2d0c4ec..14d3a00 100644 --- a/tasking/serializers/location.py +++ b/tasking/serializers/location.py @@ -27,7 +27,7 @@ from tasking.utils import get_shapefile -logger = logging.getLogger(__name__) +LOGGER = logging.getLogger(__name__) class ShapeFileField(GeometryField): @@ -35,7 +35,7 @@ class ShapeFileField(GeometryField): Custom Field for Shapefile """ - def to_internal_value(self, value): + def to_internal_value(self, value): # pylint: disable=too-many-locals """ Custom Conversion for shapefile field """ @@ -85,9 +85,9 @@ def to_internal_value(self, value): try: multipolygon = MultiPolygon(polygons) - except TypeError as e: + except TypeError as exc: # this shapefile is just not valid for some reason - logger.exception(e) + LOGGER.exception(exc) raise serializers.ValidationError(INVALID_SHAPEFILE) return multipolygon From 8bbf079189923f1f108608775daa967201e06283 Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:45:52 +0300 Subject: [PATCH 11/13] Use pipenv sync command --- tox.ini | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tox.ini b/tox.ini index 0df9156..47ab70a 100644 --- a/tox.ini +++ b/tox.ini @@ -28,7 +28,7 @@ deps = pipenv basepython = python3.6 commands = - pipenv install --dev + pipenv sync --dev pylint --rcfile={toxinidir}/.pylintrc {toxinidir}/tasking [testenv] From 8e1338f0e75c7ee1ef589258582f09ecea12d809 Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 12:49:16 +0300 Subject: [PATCH 12/13] Cleanup travis config --- .travis.yml | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/.travis.yml b/.travis.yml index 2460b44..eb8c015 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,12 +13,10 @@ matrix: env: TOXENV=flake8 - python: 3.6 env: TOXENV=pylint - - python: 3.6 - env: TOXENV=coverage services: - postgresql addons: - postgresql: 9.6 + postgresql: "9.6" apt: packages: - postgresql-9.6-postgis-2.3 @@ -30,5 +28,4 @@ install: - pip install tox script: tox notifications: - slack: - - onaio:snkNXgprD498qQv4DgRREKJF + slack: onaio:snkNXgprD498qQv4DgRREKJF From f757fd5c4d7fddc8c8581d8b5680f724eb63e720 Mon Sep 17 00:00:00 2001 From: Kelvin Jayanoris Date: Mon, 18 Feb 2019 14:18:46 +0300 Subject: [PATCH 13/13] =?UTF-8?q?=E2=86=91=20bump=20to=20version=200.2.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tasking/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tasking/__init__.py b/tasking/__init__.py index 983e776..1bc0c02 100644 --- a/tasking/__init__.py +++ b/tasking/__init__.py @@ -4,5 +4,5 @@ """ from __future__ import unicode_literals -VERSION = (0, 2, 0) +VERSION = (0, 2, 1) __version__ = '.'.join(str(v) for v in VERSION)