def update_avatar(cls, user_sub: str, avatar: dict):
        interface = cls.get_interface()

        parts_ids = [part_id for part_id in set(avatar.values()) if part_id is not None]
        if len(parts_ids) > 0:
            logs = LogsService.batch_get(
                [LogKey(sub=user_sub, tag=join_key('REWARD', 'AVATAR', part_id)) for part_id in
                 parts_ids],
                attributes=['data', 'tag'])
            if len(logs) != len(parts_ids):
                raise NotFoundException("An avatar part was not found")
        else:
            logs = []

        avatar_parts = {int(split_key(log.tag)[-1]): Reward.from_api_map(log.data).to_api_map() for log in logs}
        new_avatar = {
            'left_eye': avatar_parts.get(avatar.get('left_eye')),
            'right_eye': avatar_parts.get(avatar.get('right_eye')),
            "mouth": avatar_parts.get(avatar.get('mouth')),
            "top": avatar_parts.get(avatar.get('top')),
            "bottom": avatar_parts.get(avatar.get('bottom')),
            "neckerchief": avatar_parts.get(avatar.get('neckerchief'))
        }
        interface.update(user_sub, updates={'avatar': new_avatar})
        return new_avatar
 def to_db_dict(self):
     return {
         "user": self.user_sub,
         "group": join_key(self.district, self.group),
         "unit-user": join_key(self.unit, self.user_sub),
         "profile_picture": self.profile_picture,
         "full-name": self.full_name,
         "nickname": self.nickname,
         "birthdate": self.birthdate.strftime("%d-%m-%Y"),
         "target": self.target.to_db_dict() if self.target is not None else None,
         "completed": None,
         "score": {area: self.score.get(area, 0) for area in VALID_AREAS} if self.score is not None else None,
         "n_tasks": {area: self.n_tasks.get(area, 0) for area in VALID_AREAS} if self.n_tasks is not None else None,
         "set_base_tasks": self.set_base_tasks,
         "bought_items": {},
         "generated_token_last": self.generated_token_last,
         "n_claimed_tokens": self.n_claimed_tokens
     }
Exemplo n.º 3
0
def create_log(event: HTTPEvent):
    user_sub: str = event.params['sub']
    tag: str = event.params['tag'].upper()

    if event.authorizer.sub != user_sub:
        raise ForbiddenException("Only the same user can create logs")
    parent_tag = LogTag.from_short(split_key(tag)[0])
    if parent_tag not in USER_VALID_TAGS:
        raise ForbiddenException(f"A user can only create logs with the following tags: {USER_VALID_TAGS}")

    body = event.json

    log = body['log']
    data = body.get('data')

    if len(body) > 1024:
        raise InvalidException(f"A log can't have more than 1024 characters")

    if data is not None:
        if len(json.dumps(data)) > 2048:
            raise InvalidException(f"Log data is too big")

    response_body = {}

    if parent_tag == LogTag.PROGRESS:
        if tag != parent_tag.short:
            raise InvalidException(f"A progress log tag can't be compound")
        if body.get('token') is None:
            raise InvalidException(f"To post a PROGRESS log you must provide the task token")

        objective = TasksService.get_task_token_objective(body['token'], authorizer=event.authorizer)
        tag = join_key(LogTag.PROGRESS.value, objective).upper()

        now = int(datetime.now(timezone.utc).timestamp() * 1000)
        last_progress_log = LogsService.get_last_log_with_tag(event.authorizer.sub, tag.upper())

        if last_progress_log is None or now - last_progress_log.timestamp > 24 * 60 * 60 * 1000:
            response_body['token'] = RewardsFactory.get_reward_token_by_reason(authorizer=event.authorizer,
                                                                               area=split_key(objective)[1],
                                                                               reason=RewardReason.PROGRESS_LOG)

    log = LogsService.create(user_sub, tag, log_text=log, data=body.get('data'), append_timestamp_to_tag=True)
    response_body['item'] = log.to_api_map()

    return JSONResponse(body=response_body)
 def query_group(cls, district: str, group: str, attributes: List[str] = None) -> List[Beneficiary]:
     interface = cls.get_interface("ByGroup")
     return [Beneficiary.from_db_map(item) for item in
             interface.query(join_key(district, group), attributes=attributes).items]
 def query_unit(cls, district: str, group: str, unit: str, attributes: List[str] = None):
     interface = cls.get_interface("ByGroup")
     result = interface.query(join_key(district, group), (Operator.BEGINS_WITH, join_key(unit, '')),
                              attributes=attributes)
     result.items = [Beneficiary.from_db_map(item) for item in result.items]
     return result
 def generate_code(d_date: datetime, nick: str):
     nick = clean_text(nick, remove_spaces=True, lower=True)
     s_date = date_to_text(d_date).replace('-', '')
     return join_key(nick, s_date).replace('::', '')