Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ services:
- postgres
- redis
ports:
- "5000:5000"
- "8000:5000"
- "5678:5678"
environment:
<<: *redash-environment
Expand Down Expand Up @@ -62,6 +62,8 @@ services:
restart: unless-stopped
environment:
POSTGRES_HOST_AUTH_METHOD: "trust"
volumes:
- ./postgres_data:/var/lib/postgresql/data
email:
image: djfarrelly/maildev
ports:
Expand Down
6 changes: 4 additions & 2 deletions redash/handlers/query_results.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import logging
import os
import time

import unicodedata
Expand Down Expand Up @@ -37,6 +38,7 @@
serialize_job,
)

WRITER_ENCODING = os.environ.get("REDASH_CSV_WRITER_ENCODING", "utf-8")

def error_response(message, http_status=400):
return {"job": {"status": 4, "error": message}}, http_status
Expand Down Expand Up @@ -431,9 +433,9 @@ def make_json_response(query_result):

@staticmethod
def make_csv_response(query_result):
headers = {"Content-Type": "text/csv; charset=UTF-8"}
headers = {"Content-Type": f"text/csv; charset={WRITER_ENCODING.upper()}"}
return make_response(
serialize_query_result_to_dsv(query_result, ","), 200, headers
serialize_query_result_to_dsv(query_result, ",").encode(WRITER_ENCODING), 200, headers
)

@staticmethod
Expand Down
2 changes: 1 addition & 1 deletion redash/serializers/query_result.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import xlsxwriter
from funcy import rpartial, project
from dateutil.parser import isoparse as parse_date
from redash.utils import json_loads, UnicodeWriter
from redash.utils import json_loads
from redash.query_runner import TYPE_BOOLEAN, TYPE_DATE, TYPE_DATETIME
from redash.authentication.org_resolving import current_org

Expand Down
36 changes: 0 additions & 36 deletions redash/utils/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -135,42 +135,6 @@ def build_url(request, host, path):
return "{}://{}{}".format(request.scheme, host, path)


class UnicodeWriter:
"""
A CSV writer which will write rows to CSV file "f",
which is encoded in the given encoding.
"""

def __init__(self, f, dialect=csv.excel, encoding=WRITER_ENCODING, **kwds):
# Redirect output to a queue
self.queue = io.StringIO()
self.writer = csv.writer(self.queue, dialect=dialect, **kwds)
self.stream = f
self.encoder = codecs.getincrementalencoder(encoding)()

def _encode_utf8(self, val):
if isinstance(val, str):
return val.encode(WRITER_ENCODING, WRITER_ERRORS)

return val

def writerow(self, row):
self.writer.writerow([self._encode_utf8(s) for s in row])
# Fetch UTF-8 output from the queue ...
data = self.queue.getvalue()
data = data.decode(WRITER_ENCODING)
# ... and reencode it into the target encoding
data = self.encoder.encode(data)
# write to the target stream
self.stream.write(data)
# empty queue
self.queue.truncate(0)

def writerows(self, rows):
for row in rows:
self.writerow(row)


def collect_parameters_from_request(args):
parameters = {}

Expand Down