if field_value: value = "\r\n".join(to_utf8(key) + ":" + to_utf8(value) for key, value in field_value.items()) else: value = to_utf8(record[key]) ws.write(row, col, value ) col = col + 1 row = row + 1 wb.save(stream) return stream.getvalue() # TODO # Works only for outputting handlers extending the ModelHandler class # Doesn't really work with outputing nested fields Emitter.register('excel', ExcelEmitter, 'application/vnd.ms-excel') class HTMLEmitter(Emitter): def render(self, request): construct = self.construct() if 'data' in construct: # Correct response return construct['data'] elif 'errors' in construct: # Validation was raised return construct['errors'] return None
""" native_render = klass.render def render(self, request): """ We need *request* in (our monkey-patched) :meth:`pistoff.emitters.Emitter.construct`, and this method is the only instance method on the emitter that is being invoked with a *request* argument. """ if isinstance(self.data, HttpResponse): return self.data self.request = request return native_render(self, request) klass.render = render return native_register(name, klass, content_type) Emitter.register = classmethod(register) # Register response formats. Is guaranteed to use the monkey-patched # *Emitter.register*, which means the registered emitter type classes will be # fully monkey-patched as well. for format in set(getattr(settings, "PISTON_FORMATS", ("json", "excel", "html"))).intersection(ALL_FORMATS.keys()): Emitter.register(format, *ALL_FORMATS.get(format))