76 lines
2.1 KiB
Python
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 []
|