seitime-frappe/frappe/desk/page/user_profile/user_profile.py
2023-01-09 12:05:52 +05:30

112 lines
2.6 KiB
Python

from datetime import datetime
import frappe
from frappe.query_builder import Interval, Order
from frappe.query_builder.functions import Date, Sum, UnixTimestamp
from frappe.utils import getdate
@frappe.whitelist()
def get_energy_points_heatmap_data(user, date):
try:
date = getdate(date)
except Exception:
date = getdate()
eps_log = frappe.qb.DocType("Energy Point Log")
return dict(
frappe.qb.from_(eps_log)
.select(UnixTimestamp(Date(eps_log.creation)), Sum(eps_log.points))
.where(eps_log.user == user)
.where(eps_log["type"] != "Review")
.where(Date(eps_log.creation) > Date(date) - Interval(years=1))
.where(Date(eps_log.creation) < Date(date) + Interval(years=1))
.groupby(Date(eps_log.creation))
.orderby(Date(eps_log.creation), order=Order.asc)
.run()
)
@frappe.whitelist()
def get_energy_points_percentage_chart_data(user, field):
result = frappe.get_all(
"Energy Point Log",
filters={"user": user, "type": ["!=", "Review"]},
group_by=field,
order_by=field,
fields=[field, "ABS(sum(points)) as points"],
as_list=True,
)
return {
"labels": [r[0] for r in result if r[0] is not None],
"datasets": [{"values": [r[1] for r in result]}],
}
@frappe.whitelist()
def get_user_rank(user):
month_start = datetime.today().replace(day=1)
monthly_rank = frappe.get_all(
"Energy Point Log",
group_by="`tabEnergy Point Log`.`user`",
filters={"creation": [">", month_start], "type": ["!=", "Review"]},
fields=["user", "sum(points)"],
order_by="sum(points) desc",
as_list=True,
)
all_time_rank = frappe.get_all(
"Energy Point Log",
group_by="`tabEnergy Point Log`.`user`",
filters={"type": ["!=", "Review"]},
fields=["user", "sum(points)"],
order_by="sum(points) desc",
as_list=True,
)
return {
"monthly_rank": [i + 1 for i, r in enumerate(monthly_rank) if r[0] == user],
"all_time_rank": [i + 1 for i, r in enumerate(all_time_rank) if r[0] == user],
}
@frappe.whitelist()
def update_profile_info(profile_info):
profile_info = frappe.parse_json(profile_info)
keys = ["location", "interest", "user_image", "bio"]
for key in keys:
if key not in profile_info:
profile_info[key] = None
user = frappe.get_doc("User", frappe.session.user)
user.update(profile_info)
user.save()
return user
@frappe.whitelist()
def get_energy_points_list(start, limit, user):
return frappe.db.get_list(
"Energy Point Log",
filters={"user": user, "type": ["!=", "Review"]},
fields=[
"name",
"user",
"points",
"reference_doctype",
"reference_name",
"reason",
"type",
"seen",
"rule",
"owner",
"creation",
"revert_of",
],
start=start,
limit=limit,
order_by="creation desc",
)