From 7cb5ba4a78008b0c663e1a647eb35a30d5609c85 Mon Sep 17 00:00:00 2001 From: YuehuCao Date: Sat, 9 Aug 2025 11:47:38 +0800 Subject: [PATCH] refactor(version): replace legacy version with HTML update --- .../backend/scripts/init_message_template.py | 116 -- apps/notification/create_global_templates.py | 1008 +++++++++++++++++ 2 files changed, 1008 insertions(+), 116 deletions(-) delete mode 100644 apps/notification/backend/scripts/init_message_template.py create mode 100644 apps/notification/create_global_templates.py diff --git a/apps/notification/backend/scripts/init_message_template.py b/apps/notification/backend/scripts/init_message_template.py deleted file mode 100644 index 3f83243..0000000 --- a/apps/notification/backend/scripts/init_message_template.py +++ /dev/null @@ -1,116 +0,0 @@ -import asyncio -from datetime import datetime -from backend.models.models import MessageTemplateDoc -from beanie import init_beanie -from motor.motor_asyncio import AsyncIOMotorClient -from common.constants.region import UserRegion - -async def main(): - # connect to MongoDB - client = AsyncIOMotorClient("mongodb://localhost:27017") - db = client["freeleaps2"] ##name needed to be renamed:: templates? magicleaps? - await init_beanie(database=db, document_models=[MessageTemplateDoc]) - - - templates = [ - ## English Version - # evaluation result template - MessageTemplateDoc( - template_id="evaluation_result", - tenant_id=None, - region=UserRegion.OTHER, - subject="Interview Evaluation Result", - body="Your interview evaluation result is: {result}", - created_at=datetime.utcnow() - ), - # Deadline Reminder - automated reminders before interview deadlines - MessageTemplateDoc( - template_id="deadline_reminder", - tenant_id=None, - region=UserRegion.OTHER, - subject="Interview Deadline Reminder", - body="Reminder: Your {position} interview will end on {deadline}. Please take action.", - created_at=datetime.utcnow() - ), - # Deadline Reminder - notifications when interviews are about to expire - MessageTemplateDoc( - template_id="interview_expiring", - tenant_id=None, - region=UserRegion.OTHER, - subject="Interview Expiring", - body="Reminder: Your {position} interview will expire on {expire_time}. Please take action.", - created_at=datetime.utcnow() - ), - # Status Update Notification - status changes - MessageTemplateDoc( - template_id="status_update", - tenant_id=None, - region=UserRegion.OTHER, - subject="Interview Status Update", - body="Your {position} interview status has been updated to: {status}", - created_at=datetime.utcnow() - ), - # Status Update Notification - interview cancelled - MessageTemplateDoc( - template_id="interview_cancelled", - tenant_id=None, - region=UserRegion.OTHER, - subject="Interview Cancelled", - body="Your {position} interview has been cancelled.", - created_at=datetime.utcnow() - ), - ## Chinese Version - # Evaluation Result Notification - MessageTemplateDoc( - template_id="evaluation_result", - tenant_id="tenantA", - region=UserRegion.ZH_CN, - subject="面试评估结果通知", - body="您的面试评估结果为:{result}", - created_at=datetime.utcnow() - ), - # Deadline Reminder - automated reminders before interview deadlines - MessageTemplateDoc( - template_id="deadline_reminder", - tenant_id="tenantA", - region=UserRegion.ZH_CN, - subject="面试截止提醒", - body="提醒:您申请的 {position} 面试将于 {deadline} 截止,请及时处理。", - created_at=datetime.utcnow() - ), - # Deadline Reminder - notifications when interviews are about to expire - MessageTemplateDoc( - template_id="interview_expiring", - tenant_id="tenantA", - region=UserRegion.ZH_CN, - subject="面试即将过期", - body="您的 {position} 面试将在 {expire_time} 过期,请尽快完成相关操作。", - created_at=datetime.utcnow() - ), - # Status Update Notification - status changes - MessageTemplateDoc( - template_id="status_update", - tenant_id="tenantA", - region=UserRegion.ZH_CN, - subject="面试状态更新", - body="您的 {position} 面试状态已变更为:{status}", - created_at=datetime.utcnow() - ), - # Status Update Notification - interview cancelled - MessageTemplateDoc( - template_id="interview_cancelled", - tenant_id="tenantA", - region=UserRegion.ZH_CN, - subject="面试已取消", - body="您的 {position} 面试已被取消。", - created_at=datetime.utcnow() - ), - ] - - # Insert templates - for template in templates: - await template.create() - print("Templates inserted successfully.") - -if __name__ == "__main__": - asyncio.run(main()) \ No newline at end of file diff --git a/apps/notification/create_global_templates.py b/apps/notification/create_global_templates.py new file mode 100644 index 0000000..7adca6a --- /dev/null +++ b/apps/notification/create_global_templates.py @@ -0,0 +1,1008 @@ +#!/usr/bin/env python3 +""" +global template creator +""" + +import asyncio +import aiohttp +import json +import os +import sys +from datetime import datetime + +# import existing token retrieval logic +sys.path.append('.') +from test_config import get_tokens_with_fallback + +class GlobalTemplateCreator: + def __init__(self): + self.base_url = "http://localhost:8103/api/notification" + self.admin_token = None + self.templates = [] + + async def get_admin_token(self): + """get admin token""" + print("🔑 get admin token...") + + try: + # use existing token retrieval logic + admin_token, tenant_token = get_tokens_with_fallback() + self.admin_token = admin_token + + if self.admin_token: + print("✅ admin token retrieved successfully") + return True + else: + print("❌ admin token retrieval failed") + return False + except Exception as e: + print(f"❌ error getting token: {e}") + return False + + async def create_template(self, template_data): + """create template""" + if not self.admin_token: + print("❌ no valid admin token") + return False + + headers = {"Authorization": f"Bearer {self.admin_token}"} + + async with aiohttp.ClientSession() as session: + async with session.post( + f"{self.base_url}/templates/admin/global_templates/create", + json=template_data, + headers=headers + ) as response: + print(f"status code: {response.status}") + response_text = await response.text() + print(f"response: {response_text}") + + if response.status == 201: + print(f"✅ template '{template_data['template_id']}' created successfully") + return True + else: + print(f"❌ template '{template_data['template_id']}' creation failed: {response_text}") + return False + + async def create_assessment_result_template(self): + """create assessment result notification template""" + print("\n📝 create assessment result notification template...") + + # Chinese version (region: 1) + template_data_cn = { + "template_id": "assessment_result_notification", + "region": 1, + "subject": "笔试结果 - {candidate_name}", + "body": """
+
+ {company_name} Logo +
+ +

尊敬的 {candidate_name},

+ +

感谢您参加我们的笔试考核。以下是您的评估结果:

+ +
+

📊 评估详情

+
    +
  • 候选人姓名:{candidate_name}
  • +
  • 评估日期:{assessment_date}
  • +
  • 评估时长:{duration_minutes} 分钟
  • +
+
+ +
+

🔍 执行结果

+
    +
  • 执行状态:{execution_status}
  • +
  • 执行时间:{execution_time} 毫秒
  • +
  • 测试用例通过率:{test_cases_passed}/{total_test_cases} ({pass_rate}%)
  • +
+
+ +
+

⚠️ 执行错误信息

+

{execution_errors}

+
+ +
+

📈 详细结果

+

{detailed_results}

+
+ +
+

🎯 评估结论

+

{assessment_conclusion}

+
+ +
+

如有任何疑问,请联系我们的技术团队:

+

邮箱:{tech_support_email}

+

电话:{tech_support_phone}

+
+ +
+

祝好!
{company_name} 技术团队

+
+
""" + } + + # English version (region: 0) + template_data_en = { + "template_id": "assessment_result_notification", + "region": 0, + "subject": "Assessment Result - {candidate_name}", + "body": """
+
+ {company_name} Logo +
+ +

Dear {candidate_name},

+ +

Thank you for participating in our assessment. Here are your evaluation results:

+ +
+

📊 Assessment Details

+
    +
  • Candidate Name: {candidate_name}
  • +
  • Assessment Date: {assessment_date}
  • +
  • Duration: {duration_minutes} minutes
  • +
+
+ +
+

🔍 Execution Results

+
    +
  • Execution Status: {execution_status}
  • +
  • Execution Time: {execution_time} milliseconds
  • +
  • Test Cases Passed: {test_cases_passed}/{total_test_cases} ({pass_rate}%)
  • +
+
+ +
+

⚠️ Execution Errors

+

{execution_errors}

+
+ +
+

📈 Detailed Results

+

{detailed_results}

+
+ +
+

🎯 Assessment Conclusion

+

{assessment_conclusion}

+
+ +
+

If you have any questions, please contact our technical team:

+

Email: {tech_support_email}

+

Phone: {tech_support_phone}

+
+ +
+

Best regards,
{company_name} Technical Team

+
+
""" + } + + success_cn = await self.create_template(template_data_cn) + success_en = await self.create_template(template_data_en) + + return success_cn and success_en + + async def create_deadline_reminder_template(self): + """create deadline reminder template""" + print("\n📝 create deadline reminder template...") + + # Chinese version (region: 1) + template_data_cn = { + "template_id": "deadline_reminder", + "region": 1, + "subject": "截止期限提醒 - {task_name}", + "body": """
+
+ {company_name} Logo +
+ +

尊敬的 {recipient_name},

+ +
+

⚠️ 截止期限提醒

+

您有一个任务即将到期:

+
+ +
+

📋 任务详情

+
    +
  • 任务名称:{task_name}
  • +
  • 任务描述:{task_description}
  • +
  • 截止日期:{deadline_date}
  • +
  • 剩余时间:{remaining_time}
  • +
+
+ +
+

⏰ 时间信息

+
    +
  • 当前时间:{current_time}
  • +
  • 截止时间:{deadline_time}
  • +
  • 剩余天数:{days_remaining} 天
  • +
+
+ +
+

📝 任务要求

+

{task_requirements}

+
+ +
+

🔗 相关链接

+ +
+ +
+

请务必在截止日期前完成相关任务。如有任何问题,请联系:

+

邮箱:{contact_email}

+
+ +
+

谢谢!
{company_name} 团队

+
+
""" + } + + # English version (region: 0) + template_data_en = { + "template_id": "deadline_reminder", + "region": 0, + "subject": "Deadline Reminder - {task_name}", + "body": """
+
+ {company_name} Logo +
+ +

Dear {recipient_name},

+ +
+

⚠️ Deadline Reminder

+

You have a task that is approaching its deadline:

+
+ +
+

📋 Task Details

+
    +
  • Task Name: {task_name}
  • +
  • Task Description: {task_description}
  • +
  • Deadline Date: {deadline_date}
  • +
  • Time Remaining: {remaining_time}
  • +
+
+ +
+

⏰ Time Information

+
    +
  • Current Time: {current_time}
  • +
  • Deadline Time: {deadline_time}
  • +
  • Days Remaining: {days_remaining} days
  • +
+
+ +
+

📝 Task Requirements

+

{task_requirements}

+
+ +
+

🔗 Related Links

+ +
+ +
+

Please ensure to complete the related task before the deadline. If you have any questions, please contact:

+

Email: {contact_email}

+
+ +
+

Thank you!
{company_name} Team

+
+
""" + } + + success_cn = await self.create_template(template_data_cn) + success_en = await self.create_template(template_data_en) + + return success_cn and success_en + + async def create_interview_status_update_template(self): + """create interview status update template""" + print("\n📝 create interview status update template...") + + # Chinese version (region: 1) + template_data_cn = { + "template_id": "interview_status_update", + "region": 1, + "subject": "面试状态更新 - {candidate_name}", + "body": """
+
+ {company_name} Logo +
+ +

尊敬的 {candidate_name},

+ +

您的面试状态已更新:

+ +
+

👤 候选人信息

+
    +
  • 姓名:{candidate_name}
  • +
  • 应聘职位:{position_name}
  • +
  • 申请编号:{application_id}
  • +
+
+ +
+

📊 状态更新

+
    +
  • 当前状态:{current_status}
  • +
  • 更新日期:{update_date}
  • +
  • 更新时间:{update_time}
  • +
+
+ +
+

📋 状态详情

+

{status_details}

+
+ +
+

📅 下一步安排

+

{next_steps}

+
+ +
+

⏰ 重要时间

+
    +
  • 面试时间:{interview_time}
  • +
  • 面试地点:{interview_location}
  • +
  • 面试官:{interviewer_name}
  • +
+
+ +
+

📞 联系方式

+
    +
  • 面试官邮箱:{interviewer_email}
  • +
  • 面试官电话:{interviewer_phone}
  • +
  • 公司地址:{company_address}
  • +
+
+ +
+

请及时查看并准备相关材料。

+
+ +
+

祝面试顺利!
{company_name} 人力资源部

+
+
""" + } + + # English version (region: 0) + template_data_en = { + "template_id": "interview_status_update", + "region": 0, + "subject": "Interview Status Update - {candidate_name}", + "body": """
+
+ {company_name} Logo +
+ +

Dear {candidate_name},

+ +

Your interview status has been updated:

+ +
+

👤 Candidate Information

+
    +
  • Name: {candidate_name}
  • +
  • Position Applied: {position_name}
  • +
  • Application ID: {application_id}
  • +
+
+ +
+

📊 Status Update

+
    +
  • Current Status: {current_status}
  • +
  • Update Date: {update_date}
  • +
  • Update Time: {update_time}
  • +
+
+ +
+

📋 Status Details

+

{status_details}

+
+ +
+

📅 Next Steps

+

{next_steps}

+
+ +
+

⏰ Important Times

+
    +
  • Interview Time: {interview_time}
  • +
  • Interview Location: {interview_location}
  • +
  • Interviewer: {interviewer_name}
  • +
+
+ +
+

📞 Contact Information

+
    +
  • Interviewer Email: {interviewer_email}
  • +
  • Interviewer Phone: {interviewer_phone}
  • +
  • Company Address: {company_address}
  • +
+
+ +
+

Please review and prepare relevant materials in a timely manner.

+
+ +
+

Good luck with your interview!
{company_name} Human Resources Department

+
+
""" + } + + success_cn = await self.create_template(template_data_cn) + success_en = await self.create_template(template_data_en) + + return success_cn and success_en + + async def create_welcome_email_template(self): + """create welcome email template""" + print("\n📝 create welcome email template...") + + # Chinese version (region: 1) + template_data_cn = { + "template_id": "welcome_email", + "region": 1, + "subject": "欢迎加入 {company_name} - {new_employee_name}", + "body": """
+
+ {company_name} Logo +
+ +

亲爱的 {new_employee_name},

+ +
+

🎉 欢迎加入 {company_name}!

+
+ +

我们很高兴地通知您,您已成功加入我们的团队。以下是您的入职信息:

+ +
+

👤 员工信息

+
    +
  • 姓名:{new_employee_name}
  • +
  • 员工编号:{employee_id}
  • +
  • 部门:{department}
  • +
  • 职位:{position}
  • +
  • 入职日期:{start_date}
  • +
+
+ +
+

🏢 公司信息

+
    +
  • 公司名称:{company_name}
  • +
  • 公司地址:{company_address}
  • +
  • 联系电话:{company_phone}
  • +
+
+ +
+

📋 入职安排

+

{onboarding_schedule}

+
+ +
+

🔑 系统访问信息

+
    +
  • 邮箱:{email_address}
  • +
  • 初始密码:{initial_password}
  • +
  • 系统登录地址:{system_login_url}
  • +
+
+ +
+

📚 重要资源

+ +
+ +
+

👥 联系人

+
    +
  • 直属经理:{manager_name} ({manager_email})
  • +
  • HR联系人:{hr_contact_name} ({hr_contact_email})
  • +
  • IT支持:{it_support_email}
  • +
+
+ +
+

🎯 第一周安排

+

{first_week_schedule}

+
+ +
+

如有任何问题,请随时联系我们。

+
+ +
+

再次欢迎您的加入!
{company_name} 团队

+
+
""" + } + + # English version (region: 0) + template_data_en = { + "template_id": "welcome_email", + "region": 0, + "subject": "Welcome to {company_name} - {new_employee_name}", + "body": """
+
+ {company_name} Logo +
+ +

Dear {new_employee_name},

+ +
+

🎉 Welcome to {company_name}!

+
+ +

We are pleased to inform you that you have successfully joined our team. Here is your onboarding information:

+ +
+

👤 Employee Information

+
    +
  • Name: {new_employee_name}
  • +
  • Employee ID: {employee_id}
  • +
  • Department: {department}
  • +
  • Position: {position}
  • +
  • Start Date: {start_date}
  • +
+
+ +
+

🏢 Company Information

+
    +
  • Company Name: {company_name}
  • +
  • Company Address: {company_address}
  • +
  • Contact Phone: {company_phone}
  • +
+
+ +
+

📋 Onboarding Schedule

+

{onboarding_schedule}

+
+ +
+

🔑 System Access Information

+
    +
  • Email: {email_address}
  • +
  • Initial Password: {initial_password}
  • +
  • System Login URL: {system_login_url}
  • +
+
+ +
+

📚 Important Resources

+ +
+ +
+

👥 Contacts

+
    +
  • Direct Manager: {manager_name} ({manager_email})
  • +
  • HR Contact: {hr_contact_name} ({hr_contact_email})
  • +
  • IT Support: {it_support_email}
  • +
+
+ +
+

🎯 First Week Schedule

+

{first_week_schedule}

+
+ +
+

If you have any questions, please feel free to contact us.

+
+ +
+

Welcome aboard!
{company_name} Team

+
+
""" + } + + success_cn = await self.create_template(template_data_cn) + success_en = await self.create_template(template_data_en) + + return success_cn and success_en + + async def create_password_reset_template(self): + """create password reset email template""" + print("\n📝 create password reset email template...") + + # Chinese version (region: 1) + template_data_cn = { + "template_id": "password_reset_email", + "region": 1, + "subject": "密码重置请求 - {user_name}", + "body": """
+
+ {company_name} Logo +
+ +

尊敬的 {user_name},

+ +

我们收到了您的密码重置请求。

+ +
+

🔐 重置信息

+
    +
  • 用户名:{user_name}
  • +
  • 邮箱:{email_address}
  • +
  • 请求时间:{request_time}
  • +
  • 请求IP:{request_ip}
  • +
+
+ +
+

🔗 重置链接

+

点击重置密码

+

或复制链接:{reset_link}

+
+ +
+

⚠️ 重要提醒

+
    +
  • • 此链接将在 {expiry_hours} 小时后失效
  • +
  • • 请勿将此链接分享给他人
  • +
  • • 如果您没有请求重置密码,请忽略此邮件
  • +
+
+ +
+

📱 验证码

+

{verification_code}

+
+ +
+

🔒 安全提示

+
    +
  • • 请使用强密码(包含大小写字母、数字和特殊字符)
  • +
  • • 不要使用与其他账户相同的密码
  • +
  • • 定期更换密码以确保账户安全
  • +
+
+ +
+

如有任何问题,请联系技术支持:

+

邮箱:{support_email}

+

电话:{support_phone}

+
+ +
+

谢谢!
{company_name} 技术支持团队

+
+
""" + } + + # English version (region: 0) + template_data_en = { + "template_id": "password_reset_email", + "region": 0, + "subject": "Password Reset Request - {user_name}", + "body": """
+
+ {company_name} Logo +
+ +

Dear {user_name},

+ +

We have received your password reset request.

+ +
+

🔐 Reset Information

+
    +
  • Username: {user_name}
  • +
  • Email: {email_address}
  • +
  • Request Time: {request_time}
  • +
  • Request IP: {request_ip}
  • +
+
+ +
+

🔗 Reset Link

+

Click to Reset Password

+

Or copy the link: {reset_link}

+
+ +
+

⚠️ Important Reminder

+
    +
  • • This link will expire in {expiry_hours} hours
  • +
  • • Please do not share this link with others
  • +
  • • If you did not request a password reset, please ignore this email
  • +
+
+ +
+

📱 Verification Code

+

{verification_code}

+
+ +
+

🔒 Security Tips

+
    +
  • • Please use a strong password (containing uppercase and lowercase letters, numbers, and special characters)
  • +
  • • Do not use the same password as other accounts
  • +
  • • Change your password regularly to ensure account security
  • +
+
+ +
+

If you have any questions, please contact technical support:

+

Email: {support_email}

+

Phone: {support_phone}

+
+ +
+

Thank you!
{company_name} Technical Support Team

+
+
""" + } + + success_cn = await self.create_template(template_data_cn) + success_en = await self.create_template(template_data_en) + + return success_cn and success_en + + async def create_account_verification_template(self): + """create account verification email template""" + print("\n📝 create account verification email template...") + + # Chinese version (region: 1) + template_data_cn = { + "template_id": "account_verification_email", + "region": 1, + "subject": "账号验证 - {user_name}", + "body": """
+
+ {company_name} Logo +
+ +

尊敬的 {user_name},

+ +

感谢您注册 {company_name} 的账户。请验证您的邮箱地址以完成注册。

+ +
+

👤 账户信息

+
    +
  • 用户名:{user_name}
  • +
  • 邮箱地址:{email_address}
  • +
  • 注册时间:{registration_time}
  • +
+
+ +
+

🔗 验证链接

+

点击验证邮箱

+

或复制链接:{verification_link}

+
+ +
+

📱 验证码

+

{verification_code}

+
+ +
+

⏰ 验证期限

+
    +
  • 验证链接有效期:{expiry_hours} 小时
  • +
  • 请在 {expiry_time} 前完成验证
  • +
+
+ +
+

✅ 验证步骤

+
    +
  1. 点击上面的验证链接,或
  2. +
  3. 在登录页面输入验证码:{verification_code}
  4. +
+
+ +
+

⚠️ 安全提醒

+
    +
  • • 请勿将验证码分享给他人
  • +
  • • 如果您没有注册账户,请忽略此邮件
  • +
  • • 验证完成后,请立即登录并修改初始密码
  • +
+
+ +
+

📞 需要帮助?

+
    +
  • 技术支持:{support_email}
  • +
  • 客服热线:{support_phone}
  • +
+
+ +
+

🎯 验证完成后,您将可以:

+
    +
  • • 访问所有功能
  • +
  • • 接收重要通知
  • +
  • • 管理个人信息
  • +
+
+ +
+

谢谢!
{company_name} 团队

+
+
""" + } + + # English version (region: 0) + template_data_en = { + "template_id": "account_verification_email", + "region": 0, + "subject": "Account Verification - {user_name}", + "body": """
+
+ {company_name} Logo +
+ +

Dear {user_name},

+ +

Thank you for registering an account with {company_name}. Please verify your email address to complete your registration.

+ +
+

👤 Account Information

+
    +
  • Username: {user_name}
  • +
  • Email Address: {email_address}
  • +
  • Registration Time: {registration_time}
  • +
+
+ +
+

🔗 Verification Link

+

Click to Verify Email

+

Or copy the link: {verification_link}

+
+ +
+

📱 Verification Code

+

{verification_code}

+
+ +
+

⏰ Verification Period

+
    +
  • Verification Link Valid: {expiry_hours} hours
  • +
  • Please complete verification before {expiry_time}
  • +
+
+ +
+

✅ Verification Steps

+
    +
  1. Click the verification link above, or
  2. +
  3. Enter the verification code on the login page: {verification_code}
  4. +
+
+ +
+

⚠️ Security Reminder

+
    +
  • • Please do not share the verification code with others
  • +
  • • If you did not register an account, please ignore this email
  • +
  • • After verification, please log in immediately and change your initial password
  • +
+
+ +
+

📞 Need Help?

+
    +
  • Technical Support: {support_email}
  • +
  • Customer Service: {support_phone}
  • +
+
+ +
+

🎯 After verification, you will be able to:

+
    +
  • • Access all features
  • +
  • • Receive important notifications
  • +
  • • Manage personal information
  • +
+
+ +
+

Thank you!
{company_name} Team

+
+
""" + } + + success_cn = await self.create_template(template_data_cn) + success_en = await self.create_template(template_data_en) + + return success_cn and success_en + + async def create_all_templates(self): + """create all templates""" + print("🚀 start creating global templates...") + print("=" * 60) + + # get admin token + await self.get_admin_token() + + # create all templates + templates_to_create = [ + self.create_assessment_result_template, + self.create_deadline_reminder_template, + self.create_interview_status_update_template, + self.create_welcome_email_template, + self.create_password_reset_template, + self.create_account_verification_template + ] + + success_count = 0 + for create_func in templates_to_create: + if await create_func(): + success_count += 1 + + print(f"\n✅ templates created successfully! created {success_count}/{len(templates_to_create)} templates") + + # display created template list + print("\n📋 created templates list:") + template_names = [ + "assessment_result_notification - 评估结果通知", + "deadline_reminder - 截止期限提醒", + "interview_status_update - 面试状态更新", + "welcome_email - 欢迎邮件", + "password_reset_email - 密码重置邮件", + "account_verification_email - 账号验证邮件" + ] + + for i, name in enumerate(template_names, 1): + print(f"{i}. {name}") + +async def main(): + """main function""" + creator = GlobalTemplateCreator() + await creator.create_all_templates() + +if __name__ == "__main__": + asyncio.run(main()) \ No newline at end of file