def get_context(context): """Build context for print""" if not ((frappe.form_dict.doctype and frappe.form_dict.name) or frappe.form_dict.doc): return { "body": """<h1>Error</h1> <p>Parameters doctype and name required</p> <pre>%s</pre>""" % repr(frappe.form_dict) } if frappe.form_dict.doc: doc = frappe.form_dict.doc else: doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name) meta = frappe.get_meta(doc.doctype) print_format = get_print_format_doc(None, meta = meta) make_access_log(doctype=frappe.form_dict.doctype, document=frappe.form_dict.name, file_type='PDF', method='Print') return { "body": get_rendered_template(doc, print_format = print_format, meta=meta, trigger_print = frappe.form_dict.trigger_print, no_letterhead=frappe.form_dict.no_letterhead), "css": get_print_style(frappe.form_dict.style, print_format), "comment": frappe.session.user, "title": doc.get(meta.title_field) if meta.title_field else doc.name, "has_rtl": True if frappe.local.lang in ["ar", "he", "fa"] else False }
def export_data( doctype=None, parent_doctype=None, all_doctypes=True, with_data=False, select_columns=None, file_type="CSV", template=False, filters=None, ): _doctype = doctype if isinstance(_doctype, list): _doctype = _doctype[0] make_access_log( doctype=_doctype, file_type=file_type, columns=select_columns, filters=filters, method=parent_doctype, ) exporter = DataExporter( doctype=doctype, parent_doctype=parent_doctype, all_doctypes=all_doctypes, with_data=with_data, select_columns=select_columns, file_type=file_type, template=template, filters=filters, ) exporter.build_response()
def download_backup(path): try: frappe.only_for(("System Manager", "Administrator")) make_access_log(report_name='Backup') except frappe.PermissionError: raise Forbidden(_("You need to be logged in and have System Manager Role to be able to access backups.")) return send_private_file(path)
def get_context(context): """Build context for print""" if not ((frappe.form_dict.doctype and frappe.form_dict.name) or frappe.form_dict.doc): return { "body": sanitize_html("""<h1>Error</h1> <p>Parameters doctype and name required</p> <pre>%s</pre>""" % repr(frappe.form_dict)) } if frappe.form_dict.doc: doc = frappe.form_dict.doc else: doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name) settings = frappe.parse_json(frappe.form_dict.settings) letterhead = frappe.form_dict.letterhead or None #For setting print datetime if it's pick_list if doc.doctype=="Pick List": if doc.print_date_time or doc.amended_from: doc.pl_text = "REPRINTED" doc.print_date_time = datetime.datetime.now(timezone('US/Pacific')).strftime("%Y-%m-%d %H:%M:%S") doc.track_print_user = frappe.db.get_value("User", frappe.session.user, "full_name") #Get the doc gain in case it is loaded from frappe.form_dict sdoc = frappe.get_doc(doc.doctype, doc.name) sdoc.update({ "print_date_time": doc.print_date_time, "track_print_user": doc.track_print_user, "pl_text": doc.pl_text, }) sdoc.save() meta = frappe.get_meta(doc.doctype) print_format = get_print_format_doc(None, meta = meta) make_access_log(doctype=frappe.form_dict.doctype, document=frappe.form_dict.name, file_type='PDF', method='Print') return { "body": get_rendered_template(doc, print_format = print_format, meta=meta, trigger_print = frappe.form_dict.trigger_print, no_letterhead=frappe.form_dict.no_letterhead, letterhead=letterhead, settings=settings), "css": get_print_style(frappe.form_dict.style, print_format), "comment": frappe.session.user, "title": doc.get(meta.title_field) if meta.title_field else doc.name, "lang": frappe.local.lang, "layout_direction": "rtl" if is_rtl() else "ltr" }
def get_context(context): """Build context for print""" if not ((frappe.form_dict.doctype and frappe.form_dict.name) or frappe.form_dict.doc): return { "body": sanitize_html("""<h1>Error</h1> <p>Parameters doctype and name required</p> <pre>%s</pre>""" % repr(frappe.form_dict)) } if frappe.form_dict.doc: doc = frappe.form_dict.doc else: doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name) settings = frappe.parse_json(frappe.form_dict.settings) letterhead = frappe.form_dict.letterhead or None meta = frappe.get_meta(doc.doctype) print_format = get_print_format_doc(None, meta=meta) make_access_log(doctype=frappe.form_dict.doctype, document=frappe.form_dict.name, file_type='PDF', method='Print') return { "body": get_rendered_template(doc, print_format=print_format, meta=meta, trigger_print=frappe.form_dict.trigger_print, no_letterhead=frappe.form_dict.no_letterhead, letterhead=letterhead, settings=settings), "css": get_print_style(frappe.form_dict.style, print_format), "comment": frappe.session.user, "title": doc.get(meta.title_field) if meta.title_field else doc.name, "lang": frappe.local.lang, "layout_direction": "rtl" if is_rtl() else "ltr" }
def test_make_full_access_log(self): self.maxDiff = None # test if all fields maintain data: html page and filters are converted? make_access_log(doctype=self.test_doctype, document=self.test_document, report_name=self.test_report_name, page=self.test_html_template, file_type=self.test_file_type, method=self.test_method, filters=self.test_filters) last_doc = frappe.get_last_doc('Access Log') self.assertEqual(last_doc.filters, cstr(self.test_filters)) self.assertEqual(self.test_doctype, last_doc.export_from) self.assertEqual(self.test_document, last_doc.reference_document)
def download_private_file(path): """Checks permissions and sends back private file""" files = frappe.db.get_all('File', {'file_url': path}) can_access = False # this file might be attached to multiple documents # if the file is accessible from any one of those documents # then it should be downloadable for f in files: _file = frappe.get_doc("File", f) can_access = _file.is_downloadable() if can_access: make_access_log(doctype='File', document=_file.name, file_type=os.path.splitext(path)[-1][1:]) break if not can_access: raise Forbidden(_("You don't have permission to access this file")) return send_private_file(path.split("/private", 1)[1])
def export_query(): """export from report builder""" title = frappe.form_dict.title frappe.form_dict.pop('title', None) form_params = get_form_params() form_params["limit_page_length"] = None form_params["as_list"] = True doctype = form_params.doctype add_totals_row = None file_format_type = form_params["file_format_type"] title = title or doctype del form_params["doctype"] del form_params["file_format_type"] if 'add_totals_row' in form_params and form_params['add_totals_row']=='1': add_totals_row = 1 del form_params["add_totals_row"] frappe.permissions.can_export(doctype, raise_exception=True) if 'selected_items' in form_params: si = json.loads(frappe.form_dict.get('selected_items')) form_params["filters"] = {"name": ("in", si)} del form_params["selected_items"] make_access_log(doctype=doctype, file_type=file_format_type, report_name=form_params.report_name, filters=form_params.filters) db_query = DatabaseQuery(doctype) ret = db_query.execute(**form_params) if add_totals_row: ret = append_totals_row(ret) data = [['Sr'] + get_labels(db_query.fields, doctype)] for i, row in enumerate(ret): data.append([i+1] + list(row)) data = handle_duration_fieldtype_values(doctype, data, db_query.fields) if file_format_type == "CSV": # convert to csv import csv from frappe.utils.xlsxutils import handle_html f = StringIO() writer = csv.writer(f) for r in data: # encode only unicode type strings and not int, floats etc. writer.writerow([handle_html(frappe.as_unicode(v)) \ if isinstance(v, string_types) else v for v in r]) f.seek(0) frappe.response['result'] = cstr(f.read()) frappe.response['type'] = 'csv' frappe.response['doctype'] = title elif file_format_type == "Excel": from frappe.utils.xlsxutils import make_xlsx xlsx_file = make_xlsx(data, doctype) frappe.response['filename'] = title + '.xlsx' frappe.response['filecontent'] = xlsx_file.getvalue() frappe.response['type'] = 'binary'
def report_to_pdf(html, orientation="Landscape"): make_access_log(file_type="PDF", method="PDF", page=html) frappe.local.response.filename = "report.pdf" frappe.local.response.filecontent = get_pdf(html, {"orientation": orientation}) frappe.local.response.type = "pdf"