From 4bca2152407505e9a7538a04e80adf9146fba1fa Mon Sep 17 00:00:00 2001
From: Raphael Das Gupta <raphael.das.gupta@hsr.ch>
Date: Tue, 2 May 2017 13:16:56 +0200
Subject: [PATCH] refactoring: use furl instead of urllib.parse

---
 osmaxx/profile/email_confirmation.py | 10 ++++------
 requirements-all.txt                 |  4 +++-
 requirements.in                      |  1 +
 requirements.txt                     |  4 +++-
 4 files changed, 11 insertions(+), 8 deletions(-)

diff --git a/osmaxx/profile/email_confirmation.py b/osmaxx/profile/email_confirmation.py
index c6f5d2b93..f7df70360 100644
--- a/osmaxx/profile/email_confirmation.py
+++ b/osmaxx/profile/email_confirmation.py
@@ -1,5 +1,3 @@
-from urllib.parse import urlsplit, urlunsplit, parse_qs, urlencode
-
 from django.conf import settings
 from django.contrib import messages
 from django.core.cache import cache
@@ -7,6 +5,7 @@ from django.core.mail import send_mail
 from django.template.loader import render_to_string
 from django.urls import reverse
 from django.utils.translation import ugettext as _
+from furl import furl
 
 RATE_LIMIT_SECONDS = 30
 
@@ -22,10 +21,9 @@ def send_email_confirmation(profile, request):
         user_administrator_email = settings.OSMAXX['ACCOUNT_MANAGER_EMAIL']
         token = profile.activation_key()
         activation_base_uri = request.build_absolute_uri(reverse('profile:activation'))
-        uri_components = urlsplit(activation_base_uri)
-        query_dict = parse_qs(uri_components.query)
-        query_dict['token'] = token
-        token_url = urlunsplit(uri_components._replace(query=urlencode(query_dict)))
+        f = furl(activation_base_uri)
+        f.args['token'] = token
+        token_url = f.url
         subject = render_to_string('profile/verification_email/subject.txt', context={}).strip()
         subject = ''.join(subject.splitlines())
         message = render_to_string(
diff --git a/requirements-all.txt b/requirements-all.txt
index 6d4d76e6d..8b8ddfd42 100644
--- a/requirements-all.txt
+++ b/requirements-all.txt
@@ -28,6 +28,7 @@ docutils==0.13.1          # via pyroma
 dodgy==0.1.9              # via prospector
 drf-extensions==0.3.1
 flake8==3.3.0
+furl==1.0.0
 geoalchemy2==0.4.0
 geometalab.drf-utm-zone-info==0.2.0
 geometalab.osm-pbf-file-size-estimation-service==1.1.0
@@ -49,6 +50,7 @@ mkdocs==0.16.3
 multidict==2.1.4          # via yarl
 numpy==1.12.1
 oauthlib==2.0.2           # via requests-oauthlib, social-auth-core
+orderedmultidict==0.7.11  # via furl
 pep8-naming==0.4.1        # via prospector
 pexpect==4.2.1            # via ipython
 pickleshare==0.7.4        # via ipython
@@ -96,7 +98,7 @@ scipy==0.19.0
 selenium==3.4.1           # via pytest-selenium
 setoptconf==0.2.0         # via prospector
 simplegeneric==0.8.1      # via ipython
-six==1.10.0               # via astroid, django-downloadview, django-environ, django-extensions, livereload, prompt-toolkit, pyhamcrest, pylint, requests-mock, social-auth-app-django, social-auth-core, sqlalchemy-utils, traitlets, vcrpy
+six==1.10.0               # via astroid, django-downloadview, django-environ, django-extensions, furl, livereload, orderedmultidict, prompt-toolkit, pyhamcrest, pylint, requests-mock, social-auth-app-django, social-auth-core, sqlalchemy-utils, traitlets, vcrpy
 social-auth-app-django==1.1.0  # via python-social-auth
 social-auth-core==1.2.0   # via python-social-auth, social-auth-app-django
 sqlalchemy-utils==0.32.14
diff --git a/requirements.in b/requirements.in
index ea024f5b9..581a74af2 100644
--- a/requirements.in
+++ b/requirements.in
@@ -30,6 +30,7 @@ SQLAlchemy
 SQLAlchemy-Utils
 sqlalchemy-views
 GeoAlchemy2
+furl
 # fallback for python < 3.5
 scandir
 
diff --git a/requirements.txt b/requirements.txt
index 176541c93..4689294d3 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -28,6 +28,7 @@ docutils==0.13.1          # via pyroma
 dodgy==0.1.9              # via prospector
 drf-extensions==0.3.1
 flake8==3.3.0
+furl==1.0.0
 geoalchemy2==0.4.0
 geometalab.drf-utm-zone-info==0.2.0
 geometalab.osm-pbf-file-size-estimation-service==1.1.0
@@ -49,6 +50,7 @@ mkdocs==0.16.3
 multidict==2.1.4          # via yarl
 numpy==1.12.1
 oauthlib==2.0.2           # via requests-oauthlib, social-auth-core
+orderedmultidict==0.7.11  # via furl
 pep8-naming==0.4.1        # via prospector
 pexpect==4.2.1            # via ipython
 pickleshare==0.7.4        # via ipython
@@ -94,7 +96,7 @@ scipy==0.19.0
 selenium==3.4.1           # via pytest-selenium
 setoptconf==0.2.0         # via prospector
 simplegeneric==0.8.1      # via ipython
-six==1.10.0               # via astroid, django-downloadview, django-environ, django-extensions, livereload, prompt-toolkit, pyhamcrest, pylint, requests-mock, social-auth-app-django, social-auth-core, sqlalchemy-utils, traitlets, vcrpy
+six==1.10.0               # via astroid, django-downloadview, django-environ, django-extensions, furl, livereload, orderedmultidict, prompt-toolkit, pyhamcrest, pylint, requests-mock, social-auth-app-django, social-auth-core, sqlalchemy-utils, traitlets, vcrpy
 social-auth-app-django==1.1.0  # via python-social-auth
 social-auth-core==1.2.0   # via python-social-auth, social-auth-app-django
 sqlalchemy-utils==0.32.14
-- 
GitLab