206 lines
5.9 KiB
Python
206 lines
5.9 KiB
Python
|
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"),
|
||
|
}
|