share make_url() with fargo, simplify URL building code (#22717)

This commit is contained in:
Benjamin Dauvergne 2018-03-22 00:20:41 +01:00
parent ab4a137c09
commit fc6119683b
3 changed files with 36 additions and 35 deletions

View File

@ -1,4 +1,3 @@
import urlparse
import urllib
import logging
from json import dumps
@ -11,7 +10,7 @@ from django.core.urlresolvers import reverse
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404, resolve_url
from django.http import (HttpResponse, HttpResponseRedirect,
HttpResponseForbidden, Http404)
HttpResponseBadRequest, HttpResponseForbidden, Http404)
from django.core import signing
from django.contrib import messages
from django.contrib.auth import get_user_model, REDIRECT_FIELD_NAME
@ -23,7 +22,8 @@ from django.conf import settings
from django_tables2 import SingleTableMixin
from . import models, forms, tables, utils
from ..utils import make_url
from . import models, forms, tables
try:
from mellon.utils import get_idps
@ -92,18 +92,20 @@ class Homepage(Documents, SingleTableMixin, CommonUpload):
return ''
class PickList(Homepage):
class PickView(object):
def dispatch(self, request, *args, **kwargs):
self.pick_url = request.GET.get('pick')
if not self.pick_url:
return HttpResponseBadRequest('missing pick parameter')
return super(PickView, self).dispatch(request, *args, **kwargs)
class PickList(PickView, Homepage):
template_name = 'fargo/pick.html'
def post(self, request, *args, **kwargs):
if 'cancel' in request.POST:
url = request.GET['pick']
scheme, netloc, path, query, fragment = urlparse.urlsplit(url)
query = urlparse.parse_qs(query)
query['cancel'] = ['']
query = urllib.urlencode(query)
url = urlparse.urlunsplit((scheme, netloc, path, query, fragment))
return HttpResponseRedirect(url)
return HttpResponseRedirect(make_url(self.pick_url, cancel=''))
return super(PickList, self).post(request, *args, **kwargs)
@ -140,27 +142,21 @@ class Edit(Logger, UpdateView):
return '../..?%s' % self.request.META['QUERY_STRING']
class Pick(Documents, Logger, View):
class Pick(PickView, Documents, Logger, View):
http_method_allowed = ['post']
def post(self, request, pk):
user_document = get_object_or_404(self.get_queryset(), pk=pk,
user=request.user)
pick = self.request.GET['pick']
token = signing.dumps(user_document.pk)
url = reverse('remote_download',
kwargs={'filename': user_document.filename})
url += '?%s' % urllib.urlencode({'token': token})
url = request.build_absolute_uri(url)
scheme, netloc, path, qs, fragment = urlparse.urlsplit(pick)
qs = urlparse.parse_qs(qs)
qs['url'] = url
qs = urllib.urlencode(qs, True)
redirect = urlparse.urlunsplit((scheme, netloc, path, qs, fragment))
download_url = make_url(
reverse('remote_download', kwargs={'filename': user_document.filename}),
token=token,
request=request)
self.logger.info(u'user picked file %s sha256 %s returned to %s',
user_document.filename,
user_document.document.content_hash, pick)
return HttpResponseRedirect(redirect)
return HttpResponseRedirect(make_url(self.pick_url, url=download_url))
class Download(Documents, View):

View File

@ -14,11 +14,9 @@
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import urlparse
from urllib import quote
from django.utils.translation import ugettext as _
from django.utils.http import urlencode
from django.utils.timezone import now
from django.core.files.base import ContentFile
from django.core.urlresolvers import reverse
@ -38,16 +36,7 @@ from .models import OAuth2Authorize, OAuth2Client, OAuth2TempFile
from .utils import authenticate_bearer, get_content_disposition_value
from fargo.fargo.models import UserDocument, Document
def make_url(url, **kwargs):
parsed = urlparse.urlparse(url)
query = urlparse.parse_qs(parsed.query)
for key, value in kwargs.iteritems():
if value is not None:
query[key] = value
parsed = parsed[:4] + (urlencode(query),) + parsed[5:]
return urlparse.urlunparse(parsed)
from fargo.utils import make_url
class OAuth2Exception(Exception):

16
fargo/utils.py Normal file
View File

@ -0,0 +1,16 @@
import urlparse
from django.utils.http import urlencode
def make_url(url, **kwargs):
request = kwargs.pop('request', None)
parsed = urlparse.urlparse(url)
query = urlparse.parse_qs(parsed.query)
for key, value in kwargs.iteritems():
if value is not None:
query[key] = value
parsed = parsed[:4] + (urlencode(query),) + parsed[5:]
url = urlparse.urlunparse(parsed)
if request:
return request.build_absolute_uri(url)
return url