Exemple #1
0
 def get(self):  # TODO: cleanup
     db = get_connection()
     if db:
         db.begin()
     try:
         clear_cache()
         ctx = {
             "request": self.request,
             "request_handler": self,
             "dbname": get_active_db(),
         }
         data = self.get_cookies()
         if data:
             ctx.update(data)
         action_vals = parse_args(self)
         ctx.update(action_vals)
         name = action_vals.get("name")
         if name:
             action_ctx = action_vals
             action = get_action(name, action_ctx)
             for k, v in action.items():
                 if k not in action_vals:
                     action_vals[k] = v
         if "context" in action_vals:
             ctx.update(action_vals["context"])
         action_vals["context"] = ctx
         self.clear_flash()
         type = action_vals.get("type", "view")
         if type == "report":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             refer_id = action_vals.get("refer_id")
             format = action_vals.get("format", "pdf")
             if action_vals.get("ids") and isinstance(action_vals["ids"], str):
                 ids = json.loads(action_vals["ids"])
                 action_vals["ids"] = ids
             m = get_model(model)
             f = getattr(m, method, None)
             if action_vals.get("multi_page"):
                 datas = []
                 if "ids" in action_vals:
                     ids = action_vals["ids"]
                 else:
                     ids = [int(action_vals["refer_id"])]
                 for obj_id in ids:
                     ctx = action_vals.copy()
                     ctx["refer_id"] = obj_id
                     data = f(context=ctx)
                     datas.append(data)
             else:
                 data = f(context=action_vals)
             template = action_vals.get("template")
             if not template and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 template = f(ids, context=action_vals)
             if action_vals.get("multi_page"):
                 out = get_report_jasper_multi_page(template, datas, format=format)
             elif "pages" in data:
                 datas = []
                 for obj in data["pages"]:
                     d = data.copy()
                     d.update(obj)
                     datas.append(d)
                 out = get_report_jasper_multi_page(template, datas, format=format)
             else:
                 out = get_report_jasper(template, data, format=format)
             db = get_connection()
             if db:
                 db.commit()
             if format == "pdf":
                 fname = template + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             elif format == "xls":
                 fname = template + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".xls"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.ms-excel")
             elif format == "ods":
                 fname = template + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".ods"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.oasis.opendocument.spreadsheet")
             else:
                 raise Exception("Invalid format: %s" % format)
             self.write(out)
         elif type == "report_jasper":  # new jasper
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             refer_id = action_vals.get("refer_id")
             if refer_id:
                 refer_id = int(refer_id)
                 ids = [refer_id]
             else:
                 ids = json.loads(action_vals.get("ids"))
             format = action_vals.get("format", "pdf")
             m = get_model(model)
             f = getattr(m, method, None)
             data = f(ids, context=action_vals)
             if not data:
                 raise Exception("Missing report data")
             template = action_vals.get("template")
             if not template and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 template = f(ids, context=action_vals)
             if action_vals.get("multi_page"):
                 datas = []
                 for obj in data["objs"]:
                     d = data.copy()
                     d["obj"] = obj
                     datas.append(d)
                 out = get_report_jasper_multi_page(template, datas, format=format)
             else:
                 out = get_report_jasper(template, data, format=format)
             db = get_connection()
             if db:
                 db.commit()
             if format == "pdf":
                 fname = template + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             elif format == "xls":
                 fname = template + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".xls"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.ms-excel")
             elif format == "ods":
                 fname = template + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".ods"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.oasis.opendocument.spreadsheet")
             else:
                 raise Exception("Invalid format: %s" % format)
             self.write(out)
         elif type == "report_html":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals["method"]
             m = get_model(model)
             f = getattr(m, method, None)
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             data = f(context=ctx2)
             tmpl_name = action_vals.get("template")
             tmpl = netforce.template.get_template(tmpl_name)
             ctx2["data"] = data
             html = tmpl.render({"context": ctx2})
             out = netforce.report.html2pdf(html)
             db = get_connection()
             if db:
                 db.commit()
             fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".pdf"
             self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
             self.set_header("Content-Type", "application/pdf")
             self.write(out)
         elif type == "report_xls":
             model = action_vals["model"]
             method = action_vals["method"]
             m = get_model(model)
             f = getattr(m, method, None)
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             data = f(context=ctx2)
             tmpl_name = action_vals.get("template")
             if not tmpl_name and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 tmpl_name = f(context=action_vals)
             out = report_render_xls(tmpl_name, data)
             db = get_connection()
             if db:
                 db.commit()
             fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".xlsx"
             self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
             self.set_header("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
             self.write(out)
         elif type == "report_doc":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals["method"]
             convert = action_vals.get("convert")
             m = get_model(model)
             f = getattr(m, method, None)
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             data = f(context=ctx2)
             tmpl_name = action_vals.get("template")
             if not tmpl_name and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 tmpl_name = f(context=action_vals)
             out = report_render_doc(tmpl_name, data)
             db = get_connection()
             if db:
                 db.commit()
             if convert == "pdf":
                 fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
                 out = convert_to_pdf(out, "docx")
             else:
                 fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".docx"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header(
                     "Content-Type", "application/vnd.openxmlformats-officedocument.wordprocessingml.document")
             self.write(out)
         elif type == "report_odt":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             convert = action_vals.get("convert")
             m = get_model(model)
             f = getattr(m, method, None)
             if action_vals.get("ids") and isinstance(action_vals["ids"], str):
                 ids = json.loads(action_vals["ids"])
                 action_vals["ids"] = ids
                 print("ids", ids)
             if action_vals.get("ids") and convert == "pdf":  # FIXME
                 outs = []
                 for id in ids:
                     ctx = action_vals.copy()
                     ctx["refer_id"] = str(id)
                     data = f(context=ctx)
                     tmpl_name = action_vals.get("template")
                     if not tmpl_name and action_vals.get("template_method"):
                         f = getattr(m, action_vals["template_method"])
                         tmpl_name = f(context=action_vals)
                     out_odt = report_render_odt(tmpl_name, data)
                     out_pdf = convert_to_pdf(out_odt, "odt")  # XXX
                     outs.append(out_pdf)
                 out = merge_pdf(outs)
             else:
                 ctx2 = ctx.copy()  # XXX
                 ctx2.update(action_vals)
                 data = f(context=ctx2)
                 tmpl_name = action_vals.get("template")
                 if not tmpl_name and action_vals.get("template_method"):
                     f = getattr(m, action_vals["template_method"])
                     tmpl_name = f(context=action_vals)
                 out = report_render_odt(tmpl_name, data)
                 if convert == "pdf":
                     out = convert_to_pdf(out, "odt")
             db = get_connection()
             if db:
                 db.commit()
             if convert == "pdf":
                 fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             else:
                 fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".odt"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.oasis.opendocument.text")
             self.write(out)
         elif type == "report_odt2":  # XXX: use this instead of report_odt later
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             convert = action_vals.get("convert")
             refer_id = action_vals.get("refer_id")
             m = get_model(model)
             f = getattr(m, method, None)
             if "ids" in action_vals:
                 ids = json.loads(action_vals["ids"])
             elif "refer_id" in action_vals:
                 ids = [int(action_vals["refer_id"])]
             else:
                 raise Exception("Missing report ids")
             print("ids", ids)
             ctx = action_vals.copy()
             data = f(ids, context=ctx)
             tmpl_name = action_vals.get("template")
             if not tmpl_name and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 tmpl_name = f(ids, context=action_vals)
             out = report_render_odt(tmpl_name, data)
             db = get_connection()
             if db:
                 db.commit()
             if convert == "pdf":
                 out = convert_to_pdf(out, "odt")
                 fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             else:
                 fname = tmpl_name + "-" + time.strftime("%Y-%m-%dT%H:%M:%S") + ".odt"
                 self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.oasis.opendocument.text")
             self.write(out)
         elif type == "report_txt":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals["method"]
             m = get_model(model)
             f = getattr(m, method, None)
             if not f:
                 raise Exception("method %s of %s doesn't exist" % (method, m._name))
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             res = f(context=ctx2)
             if isinstance(res, str):
                 res = {
                     "data": res,
                 }
             out = res.get("data", "").encode(action_vals.get("encoding", "utf-8"))
             filename = res.get("filename", "report.txt")
             db = get_connection()
             if db:
                 db.commit()
             self.set_header("Content-Disposition", "attachment; filename=%s" % filename)
             self.set_header("Content-Type", "text/plain")
             self.write(out)
         elif type == "report_file":
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             m = get_model(model)
             f = getattr(m, method, None)
             if "ids" in action_vals:
                 ids = json.loads(action_vals["ids"])
             else:
                 ids = None
             print("ids", ids)
             ctx = action_vals.copy()
             if ids is not None:
                 res = f(ids, context=ctx)
             else:
                 res = f(context=ctx)
             db = get_connection()
             if db:
                 db.commit()
             out = res["data"]
             fname = res["filename"]
             mtype = res["mimetype"]
             self.set_header("Content-Disposition", "attachment; filename=%s" % fname)
             self.set_header("Content-Type", mtype)
             self.write(out)
         else:
             raise Exception("Invalid report type: %s" % type)
     except Exception as e:
         import traceback
         traceback.print_exc(file=sys.stdout)
         db = get_connection()
         if db:
             db.rollback()
         html = netforce.template.render("report_error", {"error": str(e)})
         self.write(html)
Exemple #2
0
 def get(self):  # TODO: cleanup
     db = get_connection()
     if db:
         db.begin()
     try:
         clear_cache()
         ctx = {
             "request": self.request,
             "request_handler": self,
             "dbname": get_active_db(),
         }
         data = self.get_cookies()
         if data:
             ctx.update(data)
         action_vals = parse_args(self)
         ctx.update(action_vals)
         name = action_vals.get("name")
         if name:
             action_ctx = action_vals
             action = get_action(name, action_ctx)
             for k, v in action.items():
                 if k not in action_vals:
                     action_vals[k] = v
         if "context" in action_vals:
             ctx.update(action_vals["context"])
         action_vals["context"] = ctx
         self.clear_flash()
         type = action_vals.get("type", "view")
         if type == "report":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             refer_id = action_vals.get("refer_id")
             format = action_vals.get("format", "pdf")
             if action_vals.get("ids") and isinstance(
                     action_vals["ids"], str):
                 ids = json.loads(action_vals["ids"])
                 action_vals["ids"] = ids
             m = get_model(model)
             f = getattr(m, method, None)
             if action_vals.get("multi_page"):
                 datas = []
                 if "ids" in action_vals:
                     ids = action_vals["ids"]
                 else:
                     ids = [int(action_vals["refer_id"])]
                 for obj_id in ids:
                     ctx = action_vals.copy()
                     ctx["refer_id"] = obj_id
                     data = f(context=ctx)
                     datas.append(data)
             else:
                 data = f(context=action_vals)
             template = action_vals.get("template")
             if not template and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 template = f(ids, context=action_vals)
             if action_vals.get("multi_page"):
                 out = get_report_jasper_multi_page(template,
                                                    datas,
                                                    format=format)
             elif "pages" in data:
                 datas = []
                 for obj in data["pages"]:
                     d = data.copy()
                     d.update(obj)
                     datas.append(d)
                 out = get_report_jasper_multi_page(template,
                                                    datas,
                                                    format=format)
             else:
                 out = get_report_jasper(template, data, format=format)
             db = get_connection()
             if db:
                 db.commit()
             if format == "pdf":
                 fname = template + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             elif format == "xls":
                 fname = template + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".xls"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.ms-excel")
             elif format == "ods":
                 fname = template + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".ods"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header(
                     "Content-Type",
                     "application/vnd.oasis.opendocument.spreadsheet")
             else:
                 raise Exception("Invalid format: %s" % format)
             self.write(out)
         elif type == "report_jasper":  # new jasper
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             refer_id = action_vals.get("refer_id")
             if refer_id:
                 refer_id = int(refer_id)
                 ids = [refer_id]
             else:
                 ids = json.loads(action_vals.get("ids"))
             format = action_vals.get("format", "pdf")
             m = get_model(model)
             f = getattr(m, method, None)
             data = f(ids, context=action_vals)
             if not data:
                 raise Exception("Missing report data")
             template = action_vals.get("template")
             if not template and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 template = f(ids, context=action_vals)
             if action_vals.get("multi_page"):
                 datas = []
                 for obj in data["objs"]:
                     d = data.copy()
                     d["obj"] = obj
                     datas.append(d)
                 out = get_report_jasper_multi_page(template,
                                                    datas,
                                                    format=format)
             else:
                 out = get_report_jasper(template, data, format=format)
             db = get_connection()
             if db:
                 db.commit()
             if format == "pdf":
                 fname = template + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             elif format == "xls":
                 fname = template + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".xls"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/vnd.ms-excel")
             elif format == "ods":
                 fname = template + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".ods"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header(
                     "Content-Type",
                     "application/vnd.oasis.opendocument.spreadsheet")
             else:
                 raise Exception("Invalid format: %s" % format)
             self.write(out)
         elif type == "report_html":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals["method"]
             m = get_model(model)
             f = getattr(m, method, None)
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             data = f(context=ctx2)
             tmpl_name = action_vals.get("template")
             tmpl = netforce.template.get_template(tmpl_name)
             ctx2["data"] = data
             html = tmpl.render({"context": ctx2})
             out = netforce.report.html2pdf(html)
             db = get_connection()
             if db:
                 db.commit()
             fname = tmpl_name + "-" + time.strftime(
                 "%Y-%m-%dT%H:%M:%S") + ".pdf"
             self.set_header("Content-Disposition",
                             "attachment; filename=%s" % fname)
             self.set_header("Content-Type", "application/pdf")
             self.write(out)
         elif type == "report_xls":
             model = action_vals["model"]
             method = action_vals["method"]
             m = get_model(model)
             f = getattr(m, method, None)
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             data = f(context=ctx2)
             tmpl_name = action_vals.get("template")
             if not tmpl_name and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 tmpl_name = f(context=action_vals)
             out = report_render_xls(tmpl_name, data)
             db = get_connection()
             if db:
                 db.commit()
             fname = tmpl_name + "-" + time.strftime(
                 "%Y-%m-%dT%H:%M:%S") + ".xlsx"
             self.set_header("Content-Disposition",
                             "attachment; filename=%s" % fname)
             self.set_header(
                 "Content-Type",
                 "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
             )
             self.write(out)
         elif type == "report_doc":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals["method"]
             convert = action_vals.get("convert")
             m = get_model(model)
             f = getattr(m, method, None)
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             data = f(context=ctx2)
             tmpl_name = action_vals.get("template")
             if not tmpl_name and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 tmpl_name = f(context=action_vals)
             out = report_render_doc(tmpl_name, data)
             db = get_connection()
             if db:
                 db.commit()
             if convert == "pdf":
                 fname = tmpl_name + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
                 out = convert_to_pdf(out, "docx")
             else:
                 fname = tmpl_name + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".docx"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header(
                     "Content-Type",
                     "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
                 )
             self.write(out)
         elif type == "report_odt":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             convert = action_vals.get("convert")
             m = get_model(model)
             f = getattr(m, method, None)
             if action_vals.get("ids") and isinstance(
                     action_vals["ids"], str):
                 ids = json.loads(action_vals["ids"])
                 action_vals["ids"] = ids
                 print("ids", ids)
             if action_vals.get("ids") and convert == "pdf":  # FIXME
                 outs = []
                 for id in ids:
                     ctx = action_vals.copy()
                     ctx["refer_id"] = str(id)
                     data = f(context=ctx)
                     tmpl_name = action_vals.get("template")
                     if not tmpl_name and action_vals.get(
                             "template_method"):
                         f = getattr(m, action_vals["template_method"])
                         tmpl_name = f(context=action_vals)
                     out_odt = report_render_odt(tmpl_name, data)
                     out_pdf = convert_to_pdf(out_odt, "odt")  # XXX
                     outs.append(out_pdf)
                 out = merge_pdf(outs)
             else:
                 ctx2 = ctx.copy()  # XXX
                 ctx2.update(action_vals)
                 data = f(context=ctx2)
                 tmpl_name = action_vals.get("template")
                 if not tmpl_name and action_vals.get("template_method"):
                     f = getattr(m, action_vals["template_method"])
                     tmpl_name = f(context=action_vals)
                 out = report_render_odt(tmpl_name, data)
                 if convert == "pdf":
                     out = convert_to_pdf(out, "odt")
             db = get_connection()
             if db:
                 db.commit()
             if convert == "pdf":
                 fname = tmpl_name + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             else:
                 fname = tmpl_name + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".odt"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type",
                                 "application/vnd.oasis.opendocument.text")
             self.write(out)
         elif type == "report_odt2":  # XXX: use this instead of report_odt later
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             convert = action_vals.get("convert")
             refer_id = action_vals.get("refer_id")
             m = get_model(model)
             f = getattr(m, method, None)
             if "ids" in action_vals:
                 ids = json.loads(action_vals["ids"])
             elif "refer_id" in action_vals:
                 ids = [int(action_vals["refer_id"])]
             else:
                 raise Exception("Missing report ids")
             print("ids", ids)
             ctx = action_vals.copy()
             data = f(ids, context=ctx)
             tmpl_name = action_vals.get("template")
             if not tmpl_name and action_vals.get("template_method"):
                 f = getattr(m, action_vals["template_method"])
                 tmpl_name = f(ids, context=action_vals)
             out = report_render_odt(tmpl_name, data)
             db = get_connection()
             if db:
                 db.commit()
             if convert == "pdf":
                 out = convert_to_pdf(out, "odt")
                 fname = tmpl_name + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".pdf"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type", "application/pdf")
             else:
                 fname = tmpl_name + "-" + time.strftime(
                     "%Y-%m-%dT%H:%M:%S") + ".odt"
                 self.set_header("Content-Disposition",
                                 "attachment; filename=%s" % fname)
                 self.set_header("Content-Type",
                                 "application/vnd.oasis.opendocument.text")
             self.write(out)
         elif type == "report_txt":  # XXX: deprecated
             model = action_vals["model"]
             method = action_vals["method"]
             m = get_model(model)
             f = getattr(m, method, None)
             if not f:
                 raise Exception("method %s of %s doesn't exist" %
                                 (method, m._name))
             ctx2 = ctx.copy()  # XXX
             ctx2.update(action_vals)
             res = f(context=ctx2)
             if isinstance(res, str):
                 res = {
                     "data": res,
                 }
             out = res.get("data",
                           "").encode(action_vals.get("encoding", "utf-8"))
             filename = res.get("filename", "report.txt")
             db = get_connection()
             if db:
                 db.commit()
             self.set_header("Content-Disposition",
                             "attachment; filename=%s" % filename)
             self.set_header("Content-Type", "text/plain")
             self.write(out)
         elif type == "report_file":
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             m = get_model(model)
             f = getattr(m, method, None)
             if "ids" in action_vals:
                 ids = json.loads(action_vals["ids"])
             else:
                 ids = None
             print("ids", ids)
             ctx = action_vals.copy()
             if ids is not None:
                 res = f(ids, context=ctx)
             else:
                 res = f(context=ctx)
             db = get_connection()
             if db:
                 db.commit()
             out = res["data"]
             fname = res["filename"]
             mtype = res["mimetype"]
             self.set_header("Content-Disposition",
                             "attachment; filename=%s" % fname)
             self.set_header("Content-Type", mtype)
             self.write(out)
         elif type == "report_jsx":
             model = action_vals["model"]
             method = action_vals.get("method", "get_report_data")
             m = get_model(model)
             f = getattr(m, method, None)
             if "ids" in action_vals:
                 ids = json.loads(action_vals["ids"])
             else:
                 ids = None
             print("ids", ids)
             ctx = action_vals.copy()
             data = f(ids, context=ctx)
             tmpl_name = action_vals.get("template")
             tmpl_body = get_report_template(tmpl_name, "jsx")
             out = report_render_jsx(tmpl_body, data)
             db = get_connection()
             if db:
                 db.commit()
             fname = tmpl_name + "-" + time.strftime(
                 "%Y-%m-%dT%H:%M:%S") + ".pdf"
             self.set_header("Content-Disposition",
                             "attachment; filename=%s" % fname)
             self.set_header("Content-Type", "application/pdf")
             self.write(out)
         else:
             raise Exception("Invalid report type: %s" % type)
     except Exception as e:
         import traceback
         traceback.print_exc(file=sys.stdout)
         db = get_connection()
         if db:
             db.rollback()
         html = netforce.template.render("report_error", {"error": str(e)})
         self.write(html)
Exemple #3
0
 def get(self):
     db=get_connection()
     if db:
         db.begin()
     try:
         clear_cache()
         ctx={
             "request": self.request,
             "request_handler": self,
             "dbname": get_active_db(),
         }
         data=self.get_cookies()
         if data:
             ctx.update(data)
         action_vals=parse_args(self)
         ctx.update(action_vals)
         name=action_vals.get("name")
         if name:
             action_ctx=action_vals
             action=get_action(name,action_ctx)
             for k,v in action.items():
                 if k not in action_vals:
                     action_vals[k]=v
         if "context" in action_vals:
             ctx.update(action_vals["context"])
         action_vals["context"]=ctx
         self.clear_flash()
         type=action_vals.get("type","view")
         if type=="export":
             print("XXX export")
             model=action_vals["model"]
             m=get_model(model)
             ids=action_vals.get("ids")
             if ids:
                 if ids[0]=="[": # XXX
                     ids=ids[1:-1]
                 ids=[int(x) for x in ids.split(",")]
             else:
                 condition=action_vals.get("condition")
                 if condition:
                     print("condition",condition)
                     condition=json.loads(condition)
                     ids=m.search(condition)
                 else:
                     ids=m.search([]) # XXX
             ctx=action_vals.copy()
             if ctx.get("export_fields"):
                 if isinstance(ctx["export_fields"],str):
                     ctx["export_fields"]=json.loads(ctx["export_fields"])
             else:
                 try:
                     view=get_xml_view(model=model,type="export")
                     doc=etree.fromstring(view["layout"])
                     field_names=[]
                     for el in doc.iterfind(".//field"):
                         name=el.attrib["name"]
                         field_names.append(name)
                     ctx["export_fields"]=field_names
                 except: # default export fields
                     req_field_names=[]
                     other_field_names=[]
                     for n,f in m._fields.items():
                         if isinstance(f,(fields.One2Many,fields.Many2Many)):
                             continue
                         if isinstance(f,fields.Json):
                             continue
                         if not f.store and not f.function:
                             continue
                         if f.required:
                             req_field_names.append(n)
                         else:
                             other_field_names.append(n)
                     ctx["export_fields"]=sorted(req_field_names)+sorted(other_field_names)
             data=m.export_data(ids,context=ctx)
             db=get_connection()
             if db:
                 db.commit()
             filename=action_vals.get("filename","export.csv")
             self.set_header("Content-Disposition","attachment; filename=%s"%filename)
             self.set_header("Content-Type","text/csv")
             self.write(data)
         else:
             raise Exception("Invalid action type: %s"%type)
     except Exception as e:
         import traceback
         traceback.print_exc(file=sys.stdout)
         db=get_connection()
         if db:
             db.rollback()
         raise e