diff --git a/apps/common/drf/api.py b/apps/common/drf/api.py index 6a3c3c3e2..22b1321d5 100644 --- a/apps/common/drf/api.py +++ b/apps/common/drf/api.py @@ -3,7 +3,7 @@ from rest_framework_bulk import BulkModelViewSet from ..mixins.api import ( SerializerMixin2, QuerySetMixin, ExtraFilterFieldsMixin, PaginatedResponseMixin, - RelationMixin, AllowBulkDestoryMixin, ParseToJsonMixin, + RelationMixin, AllowBulkDestoryMixin, RenderToJsonMixin, ) @@ -11,7 +11,7 @@ class CommonMixin(SerializerMixin2, QuerySetMixin, ExtraFilterFieldsMixin, PaginatedResponseMixin, - ParseToJsonMixin): + RenderToJsonMixin): pass diff --git a/apps/common/drf/parsers/base.py b/apps/common/drf/parsers/base.py index 4bfde5ed3..9b9379b3e 100644 --- a/apps/common/drf/parsers/base.py +++ b/apps/common/drf/parsers/base.py @@ -112,11 +112,13 @@ class BaseFileParser(BaseParser): return data def parse(self, stream, media_type=None, parser_context=None): - parser_context = parser_context or {} + assert parser_context is not None, '`parser_context` should not be `None`' + + view = parser_context['view'] + request = view.request try: - view = parser_context['view'] - meta = view.request.META + meta = request.META self.serializer_cls = view.get_serializer_class() self.serializer_fields = self.serializer_cls().fields except Exception as e: @@ -130,6 +132,13 @@ class BaseFileParser(BaseParser): rows = self.generate_rows(stream_data) column_titles = self.get_column_titles(rows) field_names = self.convert_to_field_names(column_titles) + + # 给 `common.mixins.api.RenderToJsonMixin` 提供,暂时只能耦合 + column_title_field_pairs = list(zip(column_titles, field_names)) + if not hasattr(request, 'jms_context'): + request.jms_context = {} + request.jms_context['column_title_field_pairs'] = column_title_field_pairs + data = self.generate_data(field_names, rows) return data except Exception as e: diff --git a/apps/common/mixins/api.py b/apps/common/mixins/api.py index 8fbaf39c5..7078b70b7 100644 --- a/apps/common/mixins/api.py +++ b/apps/common/mixins/api.py @@ -20,7 +20,7 @@ from ..utils import lazyproperty __all__ = [ 'JSONResponseMixin', 'CommonApiMixin', 'AsyncApiMixin', 'RelationMixin', - 'SerializerMixin2', 'QuerySetMixin', 'ExtraFilterFieldsMixin', 'ParseToJsonMixin', + 'SerializerMixin2', 'QuerySetMixin', 'ExtraFilterFieldsMixin', 'RenderToJsonMixin', ] @@ -35,10 +35,19 @@ class JSONResponseMixin(object): # ---------------------- -class ParseToJsonMixin: +class RenderToJsonMixin: @action(methods=[POST], detail=False, url_path='render-to-json') def render_to_json(self, request: Request): - return Response(data=request.data) + data = { + 'title': (), + 'data': request.data, + } + + jms_context = getattr(request, 'jms_context', {}) + column_title_field_pairs = jms_context.get('column_title_field_pairs', ()) + data['title'] = column_title_field_pairs + + return Response(data=data) class SerializerMixin: @@ -107,7 +116,7 @@ class PaginatedResponseMixin: return Response(serializer.data) -class CommonApiMixin(SerializerMixin, ExtraFilterFieldsMixin, ParseToJsonMixin): +class CommonApiMixin(SerializerMixin, ExtraFilterFieldsMixin, RenderToJsonMixin): pass