You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

mail_clean_document_notify_task.py 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. import logging
  2. import time
  3. from collections import defaultdict
  4. import click
  5. import app
  6. from configs import dify_config
  7. from extensions.ext_database import db
  8. from extensions.ext_mail import mail
  9. from libs.email_i18n import EmailType, get_email_i18n_service
  10. from models.account import Account, Tenant, TenantAccountJoin
  11. from models.dataset import Dataset, DatasetAutoDisableLog
  12. from services.feature_service import FeatureService
  13. logger = logging.getLogger(__name__)
  14. @app.celery.task(queue="dataset")
  15. def mail_clean_document_notify_task():
  16. """
  17. Async Send document clean notify mail
  18. Usage: mail_clean_document_notify_task.delay()
  19. """
  20. if not mail.is_inited():
  21. return
  22. logger.info(click.style("Start send document clean notify mail", fg="green"))
  23. start_at = time.perf_counter()
  24. # send document clean notify mail
  25. try:
  26. dataset_auto_disable_logs = (
  27. db.session.query(DatasetAutoDisableLog).where(DatasetAutoDisableLog.notified == False).all()
  28. )
  29. # group by tenant_id
  30. dataset_auto_disable_logs_map: dict[str, list[DatasetAutoDisableLog]] = defaultdict(list)
  31. for dataset_auto_disable_log in dataset_auto_disable_logs:
  32. if dataset_auto_disable_log.tenant_id not in dataset_auto_disable_logs_map:
  33. dataset_auto_disable_logs_map[dataset_auto_disable_log.tenant_id] = []
  34. dataset_auto_disable_logs_map[dataset_auto_disable_log.tenant_id].append(dataset_auto_disable_log)
  35. url = f"{dify_config.CONSOLE_WEB_URL}/datasets"
  36. for tenant_id, tenant_dataset_auto_disable_logs in dataset_auto_disable_logs_map.items():
  37. features = FeatureService.get_features(tenant_id)
  38. plan = features.billing.subscription.plan
  39. if plan != "sandbox":
  40. knowledge_details = []
  41. # check tenant
  42. tenant = db.session.query(Tenant).where(Tenant.id == tenant_id).first()
  43. if not tenant:
  44. continue
  45. # check current owner
  46. current_owner_join = (
  47. db.session.query(TenantAccountJoin).filter_by(tenant_id=tenant.id, role="owner").first()
  48. )
  49. if not current_owner_join:
  50. continue
  51. account = db.session.query(Account).where(Account.id == current_owner_join.account_id).first()
  52. if not account:
  53. continue
  54. dataset_auto_dataset_map = {} # type: ignore
  55. for dataset_auto_disable_log in tenant_dataset_auto_disable_logs:
  56. if dataset_auto_disable_log.dataset_id not in dataset_auto_dataset_map:
  57. dataset_auto_dataset_map[dataset_auto_disable_log.dataset_id] = []
  58. dataset_auto_dataset_map[dataset_auto_disable_log.dataset_id].append(
  59. dataset_auto_disable_log.document_id
  60. )
  61. for dataset_id, document_ids in dataset_auto_dataset_map.items():
  62. dataset = db.session.query(Dataset).where(Dataset.id == dataset_id).first()
  63. if dataset:
  64. document_count = len(document_ids)
  65. knowledge_details.append(rf"Knowledge base {dataset.name}: {document_count} documents")
  66. if knowledge_details:
  67. email_service = get_email_i18n_service()
  68. email_service.send_email(
  69. email_type=EmailType.DOCUMENT_CLEAN_NOTIFY,
  70. language_code="en-US",
  71. to=account.email,
  72. template_context={
  73. "userName": account.email,
  74. "knowledge_details": knowledge_details,
  75. "url": url,
  76. },
  77. )
  78. # update notified to True
  79. for dataset_auto_disable_log in tenant_dataset_auto_disable_logs:
  80. dataset_auto_disable_log.notified = True
  81. db.session.commit()
  82. end_at = time.perf_counter()
  83. logger.info(click.style(f"Send document clean notify mail succeeded: latency: {end_at - start_at}", fg="green"))
  84. except Exception:
  85. logger.exception("Send document clean notify mail failed")