Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

mail_clean_document_notify_task.py 4.3KB

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