import frappe @frappe.whitelist(allow_guest=True) def fetch_data( doctype : str, fields= None, filters=None, order_by=None, page_length=20): records = frappe.get_list('optlistdata', filters=filters, limit_page_length = page_length) return [{ "kol_id" : str(client["kol_id"]), "kol_name" : str(client["kol_name"]), "project_name" : str(client["project_name"]), "client_name" : str(client["client_name"]), "client_poc" : str(client["client_poc"]), "optin_received_date" : str(client["optin_recieived_date"]), "optin_approved_date" : str(client["optin_approved_date"]), "status" : str(client["status"]), "instance" : str(client["instance"]), "npi_id": str(client["npi_id"]), "country" : str(client["country"]), "data_processed_date" : str(client["data_processed_date"]), "user_name": str(client["user_name"]), } for client in records] @frappe.whitelist() def get_list_data( doctype: str, filters: dict, order_by: str, page_length=20, page_length_count=20, columns=None, rows=None, view=None, default_filters=None, ): custom_view = False filters = frappe._dict(filters) custom_view_name = view.get('custom_view_name') if view else None view_type = view.get('view_type') if view else None group_by_field = view.get('group_by_field') if view else None for key in filters: value = filters[key] if isinstance(value, list): if "@me" in value: value[value.index("@me")] = frappe.session.user elif "%@me%" in value: index = [i for i, v in enumerate(value) if v == "%@me%"] for i in index: value[i] = "%" + frappe.session.user + "%" elif value == "@me": filters[key] = frappe.session.user if default_filters: default_filters = frappe.parse_json(default_filters) filters.update(default_filters) is_default = True if columns or rows: custom_view = True is_default = False columns = frappe.parse_json(columns) rows = frappe.parse_json(rows) if not columns: columns = [ {"label": "Name", "type": "Data", "key": "name", "width": "16rem"}, {"label": "Last Modified", "type": "Datetime", "key": "modified", "width": "8rem"}, ] if not rows: rows = ["name"] default_view_filters = { "dt": doctype, "type": view_type or 'list', "is_default": 1, "user": frappe.session.user, } _list = get_controller(doctype) if not custom_view : list_view_settings = frappe.get_doc("optlistdata", default_view_filters) columns = frappe.parse_json(list_view_settings.columns) rows = frappe.parse_json(list_view_settings.rows) is_default = False elif not custom_view or is_default and hasattr(_list, "default_list_data"): columns = _list.default_list_data().get("columns") if hasattr(_list, "default_list_data"): rows = _list.default_list_data().get("rows") # check if rows has all keys from columns if not add them for column in columns: if column.get("key") not in rows: rows.append(column.get("key")) column["label"] = _(column.get("label")) if column.get("key") == "_liked_by" and column.get("width") == "10rem": column["width"] = "50px" # check if rows has group_by_field if not add it if group_by_field and group_by_field not in rows: rows.append(group_by_field) data = fetch_data( doctype, fields=rows, filters=filters, order_by=order_by, page_length=page_length, ) or [] fields = frappe.get_meta(doctype).fields fields = [field for field in fields if field.fieldtype not in no_value_fields] fields = [ { "label": _(field.label), "type": field.fieldtype, "value": field.fieldname, "options": field.options, } for field in fields if field.label and field.fieldname ] std_fields = [ {"label": "Name", "type": "Data", "value": "name"}, {"label": "Created On", "type": "Datetime", "value": "creation"}, {"label": "Last Modified", "type": "Datetime", "value": "modified"}, { "label": "Modified By", "type": "Link", "value": "modified_by", "options": "User", }, {"label": "Assigned To", "type": "Text", "value": "_assign"}, {"label": "Owner", "type": "Link", "value": "owner", "options": "User"}, {"label": "Like", "type": "Data", "value": "_liked_by"}, ] for field in std_fields: if field.get('value') not in rows: rows.append(field.get('value')) if field not in fields: field["label"] = _(field["label"]) fields.append(field) if not is_default and custom_view_name: is_default = frappe.db.get_value("optlistdata", custom_view_name, "load_default_columns") if group_by_field and view_type == "group_by": def get_options(type, options): if type == "Select": return [option for option in options.split("\n")] else: has_empty_values = any([not d.get(group_by_field) for d in data]) options = list(set([d.get(group_by_field) for d in data])) options = [u for u in options if u] if has_empty_values: options.append("") if order_by and group_by_field in order_by: order_by_fields = order_by.split(",") order_by_fields = [(field.split(" ")[0], field.split(" ")[1]) for field in order_by_fields] if (group_by_field, "asc") in order_by_fields: options.sort() elif (group_by_field, "desc") in order_by_fields: options.sort(reverse=True) else: options.sort() return options for field in fields: if field.get("value") == group_by_field: group_by_field = { "label": field.get("label"), "name": field.get("value"), "type": field.get("type"), "options": get_options(field.get("type"), field.get("options")), } return { # "data": data, "columns": columns, "rows": rows, "fields": fields, "group_by_field": group_by_field, "page_length": page_length, "page_length_count": page_length_count, "is_default": is_default, "views": get_views(doctype), "total_count": len(frappe.get_list(doctype, filters=filters)), "row_count": len(data), "form_script": get_form_script(doctype), "list_script": get_form_script(doctype, "List"), }