Source code for vulyk.blueprints.gamification.models.task_types
# -*- coding: utf-8 -*-
from typing import Dict, Optional, Union
from vulyk.models.task_types import AbstractTaskType
from vulyk.models.tasks import Batch
POINTS_PER_TASK_KEY = 'points_per_task'
COINS_PER_TASK_KEY = 'coins_per_task'
IMPORTANT_KEY = 'is_important'
[docs]class AbstractGamifiedTaskType(AbstractTaskType):
_task_type_meta = {
POINTS_PER_TASK_KEY: 1.0,
COINS_PER_TASK_KEY: 1.0,
IMPORTANT_KEY: False
}
def _get_next_open_batch(self) -> Optional[Batch]:
"""
:return: Next open batch for this task type
:rtype: Optional[Batch]
"""
for batch in Batch.objects.filter(
task_type=self.type_name,
closed__ne=True).order_by('id'):
if batch.tasks_count == batch.tasks_processed:
continue
return batch
return None
[docs] def to_dict(self) -> Dict[str, Union[str, Optional[Dict]]]:
"""
Prepare simplified dict that contains basic info about the task type +
information on next open batch
:return: distilled dict with basic info
:rtype: Dict[str, Union[str, Optional[Dict]]]
"""
resp = super(AbstractGamifiedTaskType, self).to_dict()
batch = self._get_next_open_batch()
resp['batch_info'] = batch.batch_meta if batch else None
return resp