def write_data(self, data): if not hasattr(self, "formatter"): self.formatter = CSVFormatter(self) if data: self.formatter.write( [ field.encode(getattr(self, "encoding", "utf8")) if hasattr(field, "encode") else field for field in data ] )
class Report(object): __metaclass__ = ReportMetaClass __abstract__ = True NO_RUN, RUNNING, DONE, FAILED = 0, 1, 2, -1 status_description = {0: "No run", 1: "Running", 2: "Done", -1: "Failed"} def __init__(self, parameters=None, report_handler=ReportHandler()): self._data = [] self.output = StringIO.StringIO() self.content = None self.asynchronous = getattr(self, "asynch", False) self.run = False self.report_handler = report_handler self.report_handler.add_report(self) self.status = self.NO_RUN self.parameters = parameters or {} @classmethod def abstract(cls): return getattr(cls, "__abstract__", False) @classmethod def get_verbose_name(self): return getattr(self, "verbose_name", self.name) def populate(self): raise NotImplementedError() def _populate(self, **kwargs): self.report_handler.pre_run(report=self, **kwargs) self.populate() self.post_populate() self.status = self.DONE self.report_handler.post_run(report=self, **kwargs) def _status(self): if not self.run: return self.NO_RUN if self.asynchronous: if self._status.ready(): if self._status.successful(): return self.DONE else: return self.FAILED else: return self.RUNNING else: return self.DONE def produce(self, **kwargs): self.run = True if self.asynchronous: async_populate.delay(self, **kwargs) self.status = self.RUNNING else: self._populate(**kwargs) return self.status def get_data(self): header = self.get_header() if header: self.write_header(header) for line in self._data: self.write_line(line) self.content = self.output.getvalue() return self.content def post_populate(self): now_ = datetime.datetime.now().strftime("%Y%M%d_%H%m%s") self.filename = "/tmp/%s_%s_%d" % (self.name, now_, id(self)) self.as_file(self.filename) def as_file(self, filename): file_ = open(filename, "wb") if not self.content: self.get_data() file_.write(self.content) return file_ def write_data(self, data): if not hasattr(self, "formatter"): self.formatter = CSVFormatter(self) if data: self.formatter.write( [ field.encode(getattr(self, "encoding", "utf8")) if hasattr(field, "encode") else field for field in data ] ) def write_line(self, line): self.write_data(line) def get_header(self): return getattr(self, "header", []) def write_header(self, header): self.write_data(header) @classmethod def get_form_class(cls): return Form @classmethod def get_form(cls): if cls.get_form_class(): return cls.get_form_class()()