Files
2026-08-05 23:59:15 +08:00

76 lines
2.1 KiB
Python

import logging
from django.utils import timezone
from .models import TaskDefinition, UserTaskProgress
logger = logging.getLogger(__name__)
def get_or_create_progress(user, task, period_key):
progress, created = UserTaskProgress.objects.get_or_create(
user=user,
task=task,
period_key=period_key,
defaults={'current_count': 0}
)
return progress
def track_task(user, action_type, count=1):
"""跟踪用户任务进度
Args:
user: 用户实例
action_type: 行为类型,如 'post', 'browse', 'learn' 等
count: 行为次数,默认1
Returns:
list: 更新的任务列表
"""
try:
now = timezone.localtime(timezone.now())
daily_period = now.strftime('%Y-%m-%d')
weekly_period = now.strftime('%Y-W%W')
tasks = TaskDefinition.objects.filter(
action_type=action_type,
is_active=True,
)
updated_tasks = []
for task in tasks:
if task.task_type == 'daily':
period_key = daily_period
elif task.task_type == 'weekly':
period_key = weekly_period
else:
period_key = 'permanent'
progress = get_or_create_progress(user, task, period_key)
if progress.is_completed and progress.is_claimed:
continue
progress.current_count = min(
progress.current_count + count,
task.target_count
)
if progress.current_count >= task.target_count and not progress.is_completed:
progress.is_completed = True
progress.completed_at = now
progress.save()
updated_tasks.append({
'id': task.id,
'name': task.name,
'current_count': progress.current_count,
'target_count': task.target_count,
'is_completed': progress.is_completed,
})
return updated_tasks
except Exception as e:
logger.error(f'任务跟踪失败: user={user.id}, action={action_type}, error={e}')
return []