| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 | 
							- import logging
 
- import time
 
- from collections import defaultdict
 
- import click
 
- from flask import render_template  # type: ignore
 
- import app
 
- from configs import dify_config
 
- from extensions.ext_database import db
 
- from extensions.ext_mail import mail
 
- from models.account import Account, Tenant, TenantAccountJoin
 
- from models.dataset import Dataset, DatasetAutoDisableLog
 
- from services.feature_service import FeatureService
 
- @app.celery.task(queue="dataset")
 
- def send_document_clean_notify_task():
 
-     """
 
-     Async Send document clean notify mail
 
-     Usage: send_document_clean_notify_task.delay()
 
-     """
 
-     if not mail.is_inited():
 
-         return
 
-     logging.info(click.style("Start send document clean notify mail", fg="green"))
 
-     start_at = time.perf_counter()
 
-     # send document clean notify mail
 
-     try:
 
-         dataset_auto_disable_logs = DatasetAutoDisableLog.query.filter(DatasetAutoDisableLog.notified == False).all()
 
-         # group by tenant_id
 
-         dataset_auto_disable_logs_map: dict[str, list[DatasetAutoDisableLog]] = defaultdict(list)
 
-         for dataset_auto_disable_log in dataset_auto_disable_logs:
 
-             if dataset_auto_disable_log.tenant_id not in dataset_auto_disable_logs_map:
 
-                 dataset_auto_disable_logs_map[dataset_auto_disable_log.tenant_id] = []
 
-             dataset_auto_disable_logs_map[dataset_auto_disable_log.tenant_id].append(dataset_auto_disable_log)
 
-         url = f"{dify_config.CONSOLE_WEB_URL}/datasets"
 
-         for tenant_id, tenant_dataset_auto_disable_logs in dataset_auto_disable_logs_map.items():
 
-             features = FeatureService.get_features(tenant_id)
 
-             plan = features.billing.subscription.plan
 
-             if plan != "sandbox":
 
-                 knowledge_details = []
 
-                 # check tenant
 
-                 tenant = Tenant.query.filter(Tenant.id == tenant_id).first()
 
-                 if not tenant:
 
-                     continue
 
-                 # check current owner
 
-                 current_owner_join = TenantAccountJoin.query.filter_by(tenant_id=tenant.id, role="owner").first()
 
-                 if not current_owner_join:
 
-                     continue
 
-                 account = Account.query.filter(Account.id == current_owner_join.account_id).first()
 
-                 if not account:
 
-                     continue
 
-                 dataset_auto_dataset_map = {}  # type: ignore
 
-                 for dataset_auto_disable_log in tenant_dataset_auto_disable_logs:
 
-                     if dataset_auto_disable_log.dataset_id not in dataset_auto_dataset_map:
 
-                         dataset_auto_dataset_map[dataset_auto_disable_log.dataset_id] = []
 
-                     dataset_auto_dataset_map[dataset_auto_disable_log.dataset_id].append(
 
-                         dataset_auto_disable_log.document_id
 
-                     )
 
-                 for dataset_id, document_ids in dataset_auto_dataset_map.items():
 
-                     dataset = Dataset.query.filter(Dataset.id == dataset_id).first()
 
-                     if dataset:
 
-                         document_count = len(document_ids)
 
-                         knowledge_details.append(rf"Knowledge base {dataset.name}: {document_count} documents")
 
-                 if knowledge_details:
 
-                     html_content = render_template(
 
-                         "clean_document_job_mail_template-US.html",
 
-                         userName=account.email,
 
-                         knowledge_details=knowledge_details,
 
-                         url=url,
 
-                     )
 
-                     mail.send(
 
-                         to=account.email, subject="Dify Knowledge base auto disable notification", html=html_content
 
-                     )
 
-             # update notified to True
 
-             for dataset_auto_disable_log in tenant_dataset_auto_disable_logs:
 
-                 dataset_auto_disable_log.notified = True
 
-             db.session.commit()
 
-         end_at = time.perf_counter()
 
-         logging.info(
 
-             click.style("Send document clean notify mail succeeded: latency: {}".format(end_at - start_at), fg="green")
 
-         )
 
-     except Exception:
 
-         logging.exception("Send document clean notify mail failed")
 
 
  |