Commit 91d05f8c authored by Michal Čihař's avatar Michal Čihař

Make download work in different formats

Signed-off-by: default avatarMichal Čihař <michal@cihar.com>
parent b8f654a4
...@@ -116,3 +116,16 @@ class TranslationAPITest(APIBaseTest): ...@@ -116,3 +116,16 @@ class TranslationAPITest(APIBaseTest):
self.assertContains( self.assertContains(
response, 'Project-Id-Version: Weblate Hello World 2012' response, 'Project-Id-Version: Weblate Hello World 2012'
) )
def test_download_format(self):
args = {'format': 'xliff'}
args.update(self.translation_kwargs)
response = self.client.get(
reverse(
'api:translation-download',
kwargs=args
)
)
self.assertContains(
response, '<xliff'
)
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
# #
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.http import Http404
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.decorators import detail_route from rest_framework.decorators import detail_route
...@@ -27,6 +28,7 @@ from weblate.api.serializers import ( ...@@ -27,6 +28,7 @@ from weblate.api.serializers import (
ProjectSerializer, ComponentSerializer, TranslationSerializer, ProjectSerializer, ComponentSerializer, TranslationSerializer,
LanguageSerializer, LanguageSerializer,
) )
from weblate.trans.exporters import EXPORTERS
from weblate.trans.models import Project, SubProject, Translation from weblate.trans.models import Project, SubProject, Translation
from weblate.lang.models import Language from weblate.lang.models import Language
from weblate.trans.views.helper import download_translation_file from weblate.trans.views.helper import download_translation_file
...@@ -50,6 +52,25 @@ class MultipleFieldMixin(object): ...@@ -50,6 +52,25 @@ class MultipleFieldMixin(object):
return get_object_or_404(queryset, **lookup) return get_object_or_404(queryset, **lookup)
class RawFileMixin(object):
"""
Allows to skip content negotiation for certain requests.
"""
raw_urls = ()
def perform_content_negotiation(self, request, force=False):
"""Custom content negotiation"""
if request.resolver_match.url_name in self.raw_urls:
fmt = self.format_kwarg or request.query_params.get('format')
if fmt is None or fmt in EXPORTERS:
renderers = self.get_renderers()
return (renderers[0], renderers[0].media_type)
raise Http404('Not supported exporter')
return super(TranslationViewSet, self).perform_content_negotiation(
request, force
)
class ProjectViewSet(viewsets.ReadOnlyModelViewSet): class ProjectViewSet(viewsets.ReadOnlyModelViewSet):
"""Translation projects API. """Translation projects API.
""" """
...@@ -84,7 +105,7 @@ class ComponentViewSet(MultipleFieldMixin, viewsets.ReadOnlyModelViewSet): ...@@ -84,7 +105,7 @@ class ComponentViewSet(MultipleFieldMixin, viewsets.ReadOnlyModelViewSet):
) )
class TranslationViewSet(MultipleFieldMixin, viewsets.ReadOnlyModelViewSet): class TranslationViewSet(RawFileMixin, MultipleFieldMixin, viewsets.ReadOnlyModelViewSet):
"""Translation components API. """Translation components API.
""" """
queryset = Translation.objects.none() queryset = Translation.objects.none()
...@@ -92,6 +113,9 @@ class TranslationViewSet(MultipleFieldMixin, viewsets.ReadOnlyModelViewSet): ...@@ -92,6 +113,9 @@ class TranslationViewSet(MultipleFieldMixin, viewsets.ReadOnlyModelViewSet):
lookup_fields = ( lookup_fields = (
'subproject__project__slug', 'subproject__slug', 'language__code', 'subproject__project__slug', 'subproject__slug', 'language__code',
) )
raw_urls = (
'translation-download',
)
def get_queryset(self): def get_queryset(self):
acl_projects, filtered = Project.objects.get_acl_status( acl_projects, filtered = Project.objects.get_acl_status(
...@@ -116,9 +140,7 @@ class TranslationViewSet(MultipleFieldMixin, viewsets.ReadOnlyModelViewSet): ...@@ -116,9 +140,7 @@ class TranslationViewSet(MultipleFieldMixin, viewsets.ReadOnlyModelViewSet):
@detail_route(methods=['get']) @detail_route(methods=['get'])
def download(self, request, **kwargs): def download(self, request, **kwargs):
obj = self.get_object() obj = self.get_object()
fmt = None fmt = self.format_kwarg or request.query_params.get('format')
if 'format' in request.GET:
fmt = request.GET['format']
return download_translation_file(obj, fmt) return download_translation_file(obj, fmt)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment