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 }
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('::', '')