Ejemplo n.º 1
0
 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
             ]
         )
Ejemplo n.º 2
0
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()()