share make_url() with fargo, simplify URL building code (#22717)
This commit is contained in:
parent
ab4a137c09
commit
fc6119683b
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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
|
Loading…
Reference in New Issue