import jingrow
from bs4 import BeautifulSoup
from jingrow.config import get_modules_from_all_apps_for_user
from jingrow.core.api.file import get_max_file_size
from jingrow.translate import get_all_translations
from jingrow.utils import cstr, split_emails, validate_email_address
from jingrow.utils.telemetry import POSTHOG_HOST_FIELD, POSTHOG_PROJECT_FIELD
@jingrow.whitelist(allow_guest=True)
def get_translations():
if jingrow.session.user != "Guest":
language = jingrow.db.get_value("User", jingrow.session.user, "language")
else:
language = jingrow.db.get_single_value("System Settings", "language")
return get_all_translations(language)
@jingrow.whitelist()
def get_user_signature():
user = jingrow.session.user
user_email_signature = (
jingrow.db.get_value(
"User",
user,
"email_signature",
)
if user
else None
)
signature = user_email_signature or jingrow.db.get_value(
"Email Account",
{"default_outgoing": 1, "add_signature": 1},
"signature",
)
if not signature:
return
soup = BeautifulSoup(signature, "html.parser")
html_signature = soup.find("div", {"class": "ql-editor read-mode"})
_signature = None
if html_signature:
_signature = html_signature.renderContents()
content = ""
if cstr(_signature) or signature:
content = f'
{signature}
' return content @jingrow.whitelist() def get_posthog_settings(): return { "posthog_project_id": jingrow.conf.get(POSTHOG_PROJECT_FIELD), "posthog_host": jingrow.conf.get(POSTHOG_HOST_FIELD), "enable_telemetry": jingrow.get_system_settings("enable_telemetry"), "telemetry_site_age": jingrow.utils.telemetry.site_age(), } def check_app_permission(): if jingrow.session.user == "Administrator": return True allowed_modules = get_modules_from_all_apps_for_user() allowed_modules = [x["module_name"] for x in allowed_modules] if "FCRM" not in allowed_modules: return False roles = jingrow.get_roles() if any( role in ["System Manager", "Sales User", "Sales Manager"] for role in roles ): return True return False @jingrow.whitelist(allow_guest=True) def accept_invitation(key: str | None = None): if not key: jingrow.throw("Invalid or expired key") result = jingrow.db.get_all("CRM Invitation", filters={"key": key}, pluck="name") if not result: jingrow.throw("Invalid or expired key") invitation = jingrow.get_pg("CRM Invitation", result[0]) invitation.accept() invitation.reload() if invitation.status == "Accepted": jingrow.local.login_manager.login_as(invitation.email) jingrow.local.response["type"] = "redirect" jingrow.local.response["location"] = "/crm" @jingrow.whitelist() def invite_by_email(emails: str, role: str): jingrow.only_for(["Sales Manager", "System Manager"]) if role not in ["System Manager", "Sales Manager", "Sales User"]: jingrow.throw("Cannot invite for this role") if not emails: return email_string = validate_email_address(emails, throw=False) email_list = split_emails(email_string) if not email_list: return existing_members = jingrow.db.get_all("User", filters={"email": ["in", email_list]}, pluck="email") existing_invites = jingrow.db.get_all( "CRM Invitation", filters={ "email": ["in", email_list], "role": ["in", ["System Manager", "Sales Manager", "Sales User"]], }, pluck="email", ) to_invite = list(set(email_list) - set(existing_members) - set(existing_invites)) for email in to_invite: jingrow.get_pg(pagetype="CRM Invitation", email=email, role=role).insert(ignore_permissions=True) return { "existing_members": existing_members, "existing_invites": existing_invites, "to_invite": to_invite, } @jingrow.whitelist() def get_file_uploader_defaults(pagetype: str): max_number_of_files = None make_attachments_public = False if pagetype: meta = jingrow.get_meta(pagetype) max_number_of_files = meta.get("max_attachments") make_attachments_public = meta.get("make_attachments_public") return { "allowed_file_types": jingrow.get_system_settings("allowed_file_extensions"), "max_file_size": get_max_file_size(), "max_number_of_files": max_number_of_files, "make_attachments_public": bool(make_attachments_public), }