def create_email_digest(): from frappe.utils.user import get_system_managers system_managers = get_system_managers(only_name=True) if not system_managers: return companies = frappe.db.sql_list("select name FROM `tabCompany`") for company in companies: if not frappe.db.exists("Email Digest", "Default Weekly Digest - " + company): edigest = frappe.get_doc({ "doctype": "Email Digest", "name": "Default Weekly Digest - " + company, "company": company, "frequency": "Weekly", "recipient_list": "\n".join(system_managers) }) for df in edigest.meta.get("fields", {"fieldtype": "Check"}): if df.fieldname != "scheduler_errors": edigest.set(df.fieldname, 1) edigest.insert() # scheduler errors digest if companies: edigest = frappe.new_doc("Email Digest") edigest.update({ "name": "Scheduler Errors", "company": companies[0], "frequency": "Daily", "recipient_list": "\n".join(system_managers), "scheduler_errors": 1, "enabled": 1 }) edigest.insert()
def get_site_info(): from frappe.utils.user import get_system_managers from frappe.core.doctype.user.user import STANDARD_USERS from frappe.email.queue import get_emails_sent_this_month # only get system users users = frappe.get_all('User', filters={ 'user_type': 'System User', 'name': ('not in', STANDARD_USERS) }, fields=[ 'name', 'enabled', 'last_login', 'last_active', 'language', 'time_zone' ]) system_managers = get_system_managers(only_name=True) for u in users: # tag system managers u.is_system_manager = 1 if u.name in system_managers else 0 u.full_name = get_fullname(u.name) u.email = u.name del u['name'] system_settings = frappe.db.get_singles_dict('System Settings') space_usage = frappe._dict((frappe.local.conf.limits or {}).get('space_usage', {})) kwargs = { "fields": ["user", "creation", "full_name"], "filters": { "Operation": "Login", "Status": "Success" }, "limit": "10" } site_info = { 'installed_apps': get_installed_apps_info(), 'users': users, 'country': system_settings.country, 'language': system_settings.language or 'english', 'time_zone': system_settings.time_zone, 'setup_complete': cint(system_settings.setup_complete), 'scheduler_enabled': system_settings.enable_scheduler, # usage 'emails_sent': get_emails_sent_this_month(), 'space_used': flt((space_usage.total or 0) / 1024.0, 2), 'database_size': space_usage.database_size, 'backup_size': space_usage.backup_size, 'files_size': space_usage.files_size, 'last_logins': frappe.get_all("Activity Log", **kwargs) } # from other apps for method_name in frappe.get_hooks('get_site_info'): site_info.update(frappe.get_attr(method_name)(site_info) or {}) # dumps -> loads to prevent datatype conflicts return json.loads(frappe.as_json(site_info))
def notify_admin_access_to_system_manager(login_manager=None): if (login_manager and login_manager.user == "Administrator" and frappe.local.conf.notify_admin_access_to_system_manager): message = """<p> {dear_system_manager} <br><br> {access_message} <br><br> {is_it_unauthorized} </p>""".format( dear_system_manager=_("Dear System Manager,"), access_message=_( """Administrator accessed {0} on {1} via IP Address {2}.""" ).format( """<a href="{site}" target="_blank">{site}</a>""".format( site=frappe.local.request.host_url), """<b>{date_and_time}</b>""".format( date_and_time=format_datetime(now_datetime(), format_string="medium")), frappe.local.request_ip), is_it_unauthorized= _("If you think this is unauthorized, please change the Administrator password." )) frappe.sendmail(recipients=get_system_managers(), subject=_("Administrator Logged In"), message=message)
def notify_system_managers(self): system_managers = get_system_managers(only_name=True) frappe.sendmail( recipients=system_managers, subject=_("User {0} has requested for data deletion").format(self.email), template="data_deletion_approval", args={"user": self.email, "url": frappe.utils.get_url(self.get_url())}, header=[_("Approval Required"), "green"], )
def send_update_email(successful, failed): if len(successful) and len(failed): frappe.sendmail( subject='E Mandate Payments Summary', recipients=get_system_managers(), template="emandate", args={ 'successful': successful, 'failed': failed } )
def notify_errors(doc, doctype, party, owner, name): recipients = get_system_managers(only_name=True) frappe.sendmail(recipients + [frappe.db.get_value("User", owner, "email")], subject=_("[Urgent] Error while creating recurring %s for %s" % (doctype, doc)), message = frappe.get_template("templates/emails/recurring_document_failed.html").render({ "type": _(doctype), "name": doc, "party": party or "", "subscription": name })) assign_task_to_owner(name, "Recurring Documents Failed", recipients)
def handle_incoming_connect_error(self, description): self.db_set("enable_incoming", 0) for user in get_system_managers(only_name=True): assign_to.add({ 'assign_to': user, 'doctype': self.doctype, 'name': self.name, 'description': description, 'priority': 'High', 'notify': 1 })
def notify_errors(inv, customer, owner): from frappe.utils.user import get_system_managers recipients=get_system_managers() frappe.sendmail(recipients + [frappe.db.get_value("User", owner, "email")], subject="[Urgent] Error while creating recurring invoice for %s" % inv, message = frappe.get_template("template/emails/recurring_invoice_failed.html").render({ "name": inv, "customer": customer })) assign_task_to_owner(inv, "Recurring Invoice Failed", recipients)
def notify_errors(doc, doctype, party, owner): from frappe.utils.user import get_system_managers recipients = get_system_managers(only_name=True) frappe.sendmail(recipients + [frappe.db.get_value("User", owner, "email")], subject="[Urgent] Error while creating recurring %s for %s" % (doctype, doc), message = frappe.get_template("templates/emails/recurring_document_failed.html").render({ "type": doctype, "name": doc, "party": party })) assign_task_to_owner(doc, doctype, "Recurring Invoice Failed", recipients)
def get_site_info(): from frappe.core.doctype.user.user import STANDARD_USERS from frappe.email.queue import get_emails_sent_this_month from frappe.utils.user import get_system_managers # only get system users users = frappe.get_all( "User", filters={"user_type": "System User", "name": ("not in", STANDARD_USERS)}, fields=["name", "enabled", "last_login", "last_active", "language", "time_zone"], ) system_managers = get_system_managers(only_name=True) for u in users: # tag system managers u.is_system_manager = 1 if u.name in system_managers else 0 u.full_name = get_fullname(u.name) u.email = u.name del u["name"] system_settings = frappe.db.get_singles_dict("System Settings") space_usage = frappe._dict((frappe.local.conf.limits or {}).get("space_usage", {})) kwargs = { "fields": ["user", "creation", "full_name"], "filters": {"Operation": "Login", "Status": "Success"}, "limit": "10", } site_info = { "installed_apps": get_installed_apps_info(), "users": users, "country": system_settings.country, "language": system_settings.language or "english", "time_zone": system_settings.time_zone, "setup_complete": cint(system_settings.setup_complete), "scheduler_enabled": system_settings.enable_scheduler, # usage "emails_sent": get_emails_sent_this_month(), "space_used": flt((space_usage.total or 0) / 1024.0, 2), "database_size": space_usage.database_size, "backup_size": space_usage.backup_size, "files_size": space_usage.files_size, "last_logins": frappe.get_all("Activity Log", **kwargs), } # from other apps for method_name in frappe.get_hooks("get_site_info"): site_info.update(frappe.get_attr(method_name)(site_info) or {}) # dumps -> loads to prevent datatype conflicts return json.loads(frappe.as_json(site_info))
def handle_incoming_connect_error(self, description): self.db_set("enable_incoming", 0) for user in get_system_managers(only_name=True): try: assign_to.add({ 'assign_to': user, 'doctype': self.doctype, 'name': self.name, 'description': description, 'priority': 'High', 'notify': 1 }) except assign_to.DuplicateToDoError: frappe.message_log.pop() pass
def notify_errors(exceptions_list): subject = "[Important] [ERPNext] Error(s) while creating Material Requests based on Re-order Levels" msg = """Dear System Manager, An error occured for certain Items while creating Material Requests based on Re-order level. Please rectify these issues: --- <pre> %s </pre> --- Regards, Administrator""" % ("\n\n".join(exceptions_list), ) from frappe.utils.user import get_system_managers sendmail(get_system_managers(), subject=subject, msg=msg)
def notify_errors(exceptions_list): subject = "[Important] [ERPNext] Error(s) while creating Material Requests based on Re-order Levels" msg = """Dear System Manager, An error occured for certain Items while creating Material Requests based on Re-order level. Please rectify these issues: --- <pre> %s </pre> --- Regards, Administrator""" % ("\n\n".join(exceptions_list),) from frappe.utils.user import get_system_managers sendmail(get_system_managers(), subject=subject, msg=msg)
def handle_incoming_connect_error(self, description): self.db_set("enable_incoming", 0) for user in get_system_managers(only_name=True): try: assign_to.add( { "assign_to": user, "doctype": self.doctype, "name": self.name, "description": description, "priority": "High", "notify": 1, } ) except assign_to.DuplicateToDoError: frappe.message_log.pop() pass
def notify_error_to_user(self, error_log): recipients = list(get_system_managers(only_name=True)) recipients.append(self.owner) subject = _("Auto Repeat Document Creation Failed") form_link = frappe.utils.get_link_to_form(self.reference_doctype, self.reference_document) auto_repeat_failed_for = _("Auto Repeat failed for {0}").format(form_link) error_log_link = frappe.utils.get_link_to_form("Error Log", error_log.name) error_log_message = _("Check the Error Log for more information: {0}").format(error_log_link) frappe.sendmail( recipients=recipients, subject=subject, template="auto_repeat_fail", args={"auto_repeat_failed_for": auto_repeat_failed_for, "error_log_message": error_log_message}, header=[subject, "red"], )
def get_site_info(): from frappe.utils.user import get_system_managers from frappe.core.doctype.user.user import STANDARD_USERS from frappe.email.queue import get_emails_sent_this_month # only get system users users = frappe.get_all( "User", filters={"user_type": "System User", "name": ("not in", STANDARD_USERS)}, fields=["name", "enabled", "last_login", "last_active", "language", "time_zone"], ) system_managers = get_system_managers(only_name=True) for u in users: # tag system managers u.is_system_manager = 1 if u.name in system_managers else 0 u.full_name = get_fullname(u.name) u.email = u.name del u["name"] system_settings = frappe.db.get_singles_dict("System Settings") space_usage = frappe._dict((frappe.local.conf.limits or {}).get("space_usage", {})) site_info = { "installed_apps": get_installed_apps_info(), "users": users, "country": system_settings.country, "language": system_settings.language or "english", "time_zone": system_settings.time_zone, "setup_complete": cint(system_settings.setup_complete), "scheduler_enabled": system_settings.enable_scheduler, # usage "emails_sent": get_emails_sent_this_month(), "space_used": flt((space_usage.total or 0) / 1024.0, 2), "database_size": space_usage.database_size, "backup_size": space_usage.backup_size, "files_size": space_usage.files_size, } # from other apps for method_name in frappe.get_hooks("get_site_info"): site_info.update(frappe.get_attr(method_name)(site_info) or {}) # dumps -> loads to prevent datatype conflicts return json.loads(frappe.as_json(site_info))
def notify_admin_access_to_system_manager(login_manager=None): if (login_manager and login_manager.user == "Administrator" and frappe.local.conf.notify_admin_access_to_system_manager): site = '<a href="{0}" target="_blank">{0}</a>'.format( frappe.local.request.host_url) date_and_time = '<b>{0}</b>'.format( format_datetime(now_datetime(), format_string="medium")) ip_address = frappe.local.request_ip access_message = _( 'Administrator accessed {0} on {1} via IP Address {2}.').format( site, date_and_time, ip_address) frappe.sendmail(recipients=get_system_managers(), subject=_("Administrator Logged In"), template="administrator_logged_in", args={'access_message': access_message}, header=['Access Notification', 'orange'])
def notify_admin_access_to_system_manager(login_manager=None): if (login_manager and login_manager.user == "Administrator" and frappe.local.conf.notify_admin_access_to_system_manager): site = '<a href="{0}" target="_blank">{0}</a>'.format(frappe.local.request.host_url) date_and_time = '<b>{0}</b>'.format(format_datetime(now_datetime(), format_string="medium")) ip_address = frappe.local.request_ip access_message = _('Administrator accessed {0} on {1} via IP Address {2}.').format( site, date_and_time, ip_address) frappe.sendmail( recipients=get_system_managers(), subject=_("Administrator Logged In"), template="administrator_logged_in", args={'access_message': access_message}, header=['Access Notification', 'orange'] )
def get_site_info(): from frappe.utils.user import get_system_managers from frappe.core.doctype.user.user import STANDARD_USERS from frappe.email.queue import get_emails_sent_this_month # only get system users users = frappe.get_all('User', filters={'user_type': 'System User', 'name': ('not in', STANDARD_USERS)}, fields=['name', 'enabled', 'last_login', 'last_active', 'language', 'time_zone']) system_managers = get_system_managers(only_name=True) for u in users: # tag system managers u.is_system_manager = 1 if u.name in system_managers else 0 u.full_name = get_fullname(u.name) u.email = u.name del u['name'] system_settings = frappe.db.get_singles_dict('System Settings') space_usage = frappe._dict((frappe.local.conf.limits or {}).get('space_usage', {})) site_info = { 'installed_apps': get_installed_apps_info(), 'users': users, 'country': system_settings.country, 'language': system_settings.language or 'english', 'time_zone': system_settings.time_zone, 'setup_complete': cint(system_settings.setup_complete), 'scheduler_enabled': system_settings.enable_scheduler, # usage 'emails_sent': get_emails_sent_this_month(), 'space_used': flt((space_usage.total or 0) / 1024.0, 2), 'database_size': space_usage.database_size, 'backup_size': space_usage.backup_size, 'files_size': space_usage.files_size } # from other apps for method_name in frappe.get_hooks('get_site_info'): site_info.update(frappe.get_attr(method_name)(site_info) or {}) # dumps -> loads to prevent datatype conflicts return json.loads(frappe.as_json(site_info))
def handle_incoming_connect_error(self, description): '''Disable email account if 3 failed attempts found''' if self.get_failed_attempts_count() == 3: self.db_set("enable_incoming", 0) for user in get_system_managers(only_name=True): try: assign_to.add({ 'assign_to': user, 'doctype': self.doctype, 'name': self.name, 'description': description, 'priority': 'High', 'notify': 1 }) except assign_to.DuplicateToDoError: frappe.message_log.pop() pass else: self.set_failed_attempts_count(self.get_failed_attempts_count() + 1)
def handle_incoming_connect_error(self, description): if test_internet(): if self.get_failed_attempts_count() > 2: self.db_set("enable_incoming", 0) for user in get_system_managers(only_name=True): try: assign_to.add({ 'assign_to': user, 'doctype': self.doctype, 'name': self.name, 'description': description, 'priority': 'High', 'notify': 1 }) except assign_to.DuplicateToDoError: frappe.message_log.pop() pass else: self.set_failed_attempts_count(self.get_failed_attempts_count() + 1) else: frappe.cache().set_value("workers:no-internet", True)
def sync_shopify(): shopify_settings = frappe.get_doc("Shopify Settings", "Shopify Settings") if shopify_settings.enable_shopify: if not frappe.session.user: frappe.set_user("Administrator") try : sync_products(shopify_settings.price_list, shopify_settings.warehouse) sync_customers() sync_orders() update_item_stock_qty() frappe.db.set_value("Shopify Settings", None, "last_sync_datetime", frappe.utils.now()) except ShopifyError: disable_shopify_sync_on_exception() except requests.exceptions.HTTPError, e: #HTTPError: 402 Client Error: Payment Required if e.args[0] and e.args[0].startswith("402"): disable_shopify_sync_on_exception() content = _("""Shopify has suspended your account till you complete the payment. We have disabled ERPNext Shopify Sync. Please enable it once your complete the payment at Shopify.""") frappe.sendmail(get_system_managers(), subject=_("Shopify Sync has been disabled"), content=content)
def notifify_admin_access_to_system_manager(login_manager=None): if (login_manager and login_manager.user == "Administrator" and frappe.local.conf.notifify_admin_access_to_system_manager): message = """<p> {dear_system_manager} <br><br> {access_message} <br><br> {is_it_unauthorized} </p>""".format( dear_system_manager=_("Dear System Manager,"), access_message=_("""Administrator accessed {0} on {1} via IP Address {2}.""").format( """<a href="{site}" target="_blank">{site}</a>""".format(site=frappe.local.request.host_url), """<b>{date_and_time}</b>""".format(date_and_time=format_datetime(now_datetime(), format_string="medium")), frappe.local.request_ip ), is_it_unauthorized=_("If you think this is unauthorized, please change the Administrator password.") ) frappe.sendmail(recipients=get_system_managers(), subject=_("Administrator Logged In"), message=message, bulk=True)
def get_site_status(verbose=False): import frappe import frappe.utils from frappe.utils.user import get_system_managers from frappe.core.doctype.user.user import get_total_users, get_active_users, \ get_website_users, get_active_website_users import json frappe.connect() ret = { 'last_backup_on': frappe.local.conf.last_backup_on, 'active_users': get_active_users(), 'total_users': get_total_users(), 'active_website_users': get_active_website_users(), 'website_users': get_website_users(), 'system_managers': "\n".join(get_system_managers()), 'default_company': frappe.db.get_default("company"), 'disk_usage': frappe.utils.get_disk_usage(), 'working_directory': frappe.local.site_path } # country, timezone, industry for key in ["country", "time_zone", "industry"]: ret[key] = frappe.db.get_default(key) # basic usage/progress analytics for doctype in ("Company", "Customer", "Item", "Quotation", "Sales Invoice", "Journal Voucher", "Stock Ledger Entry"): key = doctype.lower().replace(" ", "_") + "_exists" ret[key] = 1 if frappe.db.count(doctype) else 0 frappe.destroy() if verbose: print json.dumps(ret, indent=1, sort_keys=True) return ret
def sync_shopify_resources(): shopify_settings = frappe.get_doc("Shopify Settings") if shopify_settings.enable_shopify: try : validate_shopify_settings(shopify_settings) sync_products(shopify_settings.price_list, shopify_settings.warehouse) sync_customers() sync_orders() update_item_stock_qty() frappe.db.set_value("Shopify Settings", None, "last_sync_datetime", frappe.utils.now()) except Exception, e: disable_shopify_sync_on_exception() if e.args[0] and e.args[0].startswith("402"): content = _("""Shopify has suspended your account till you complete the payment. We have disabled ERPNext Shopify Sync. Please enable it once your complete the payment at Shopify.""") else: content = _("""Unfortunately shopify sync has terminated. Please check Scheduler Log for more details.""") frappe.sendmail(get_system_managers(), subject=_("Shopify Sync has been disabled"), content=content)
def on_update(self): users = get_system_managers(True) if self.flags.in_insert: if users: for user in users: user_lang = get_user_lang(user) email_subject = _( "A New Application : %(name)s is created", user_lang) % { "name": self.name, "status": self.status } email_content = _( """ A new application is created """, user_lang) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=user, subject=email_subject, content=email_content) if self.email: email_subject = _("We have received your Application : " + self.name) email_content = _(""" Your application was received! """) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=self.email, subject=email_subject, content=email_content) return if users: for user in users: user_lang = get_user_lang(user) email_subject = _(self.name + " have new updates", user_lang) email_content = _( """ %(name)s status was changed to : %(status)s """, user_lang) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=user, subject=email_subject, content=email_content) if self.email: email_subject = _(self.name + " have new updates") email_content = _(""" %(name)s status was changed to : %(status)s """) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=self.email, subject=email_subject, content=email_content) return
def on_update(self): users = get_system_managers(True) if self.flags.in_insert: if users: for user in users: user_lang = get_user_lang(user) email_subject = _( "A New Document Tracker Request : %(name)s is created", user_lang) % { "name": self.name, "status": self.status } email_content = _( """ A new Document Tracker Request is created """, user_lang) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=user, subject=email_subject, content=email_content) if self.user: email_subject = _( "We have received your Document Tracker Request : " + self.name) email_content = _(""" Your Document Tracker Request was received! """) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=self.user, subject=email_subject, content=email_content) return if users: for user in users: user_lang = get_user_lang(user) email_subject = _( "Document Tracker Request " + self.name + " have new updates", user_lang) email_content = _( """ Document Tracker Request %(name)s status was changed to : %(status)s """, user_lang) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=user, subject=email_subject, content=email_content) if self.user: email_subject = _("Document Tracker Request " + self.name + " have new updates") email_content = _(""" Document Tracker Request %(name)s status was changed to : %(status)s """) % { "name": self.name, "status": self.status } frappe.sendmail(recipients=self.user, subject=email_subject, content=email_content) return