def put(self, request): data = request.data try: contest = Contest.objects.get(id=data.pop("id")) ensure_created_by(contest, request.user) except Contest.DoesNotExist: return self.error("Contest does not exist") data["start_time"] = dateutil.parser.parse(data["start_time"]) data["end_time"] = dateutil.parser.parse(data["end_time"]) if data["end_time"] <= data["start_time"]: return self.error("Start time must occur earlier than end time") if not data["password"]: data["password"] = None for ip_range in data["allowed_ip_ranges"]: try: ip_network(ip_range, strict=False) except ValueError: return self.error(f"{ip_range} is not a valid cidr network") if not contest.real_time_rank and data.get("real_time_rank"): cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}" cache.delete(cache_key) for k, v in data.items(): setattr(contest, k, v) contest.save() return self.success(ContestAdminSerializer(contest).data)
def update_contest_rank(self): if self.contest.rule_type == ContestRuleType.OI or self.contest.real_time_rank: cache.delete(f"{CacheKey.contest_rank_cache}:{self.contest.id}") def get_rank(model): return model.objects.select_for_update().get( user_id=self.submission.user_id, contest=self.contest) if self.contest.rule_type == ContestRuleType.ACM: model = ACMContestRank func = self._update_acm_contest_rank else: model = OIContestRank func = self._update_oi_contest_rank try: rank = get_rank(model) except model.DoesNotExist: try: model.objects.create(user_id=self.submission.user_id, contest=self.contest) rank = get_rank(model) except IntegrityError: rank = get_rank(model) func(rank)
def put(self, request): data = request.data try: contest = Contest.objects.get(id=data.pop("id")) ensure_created_by(contest, request.user) except Contest.DoesNotExist: return self.error("Соревнование не существует") data["start_time"] = dateutil.parser.parse(data["start_time"]) data["end_time"] = dateutil.parser.parse(data["end_time"]) if data["end_time"] <= data["start_time"]: return self.error( "Время начала должно быть раньше времени окончания") if not data["password"]: data["password"] = None for ip_range in data["allowed_ip_ranges"]: try: ip_network(ip_range, strict=False) except ValueError as e: return self.error(f"{ip_range} не подходит для cidr сети") if not contest.real_time_rank and data.get("real_time_rank"): cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}" cache.delete(cache_key) for k, v in data.items(): setattr(contest, k, v) contest.save() return self.success(ContestAdminSerializer(contest).data)
def put(self, request): data = request.data try: contest = Contest.objects.get(id=data.pop("id")) ensure_created_by(contest, request.user) except Contest.DoesNotExist: return self.error("Contest does not exist") data["start_time"] = dateutil.parser.parse(data["start_time"]) data["end_time"] = dateutil.parser.parse(data["end_time"]) if data["end_time"] <= data["start_time"]: return self.error("Start time must occur earlier than end time") if not data["password"]: data["password"] = None for ip_range in data["allowed_ip_ranges"]: try: ip_network(ip_range, strict=False) except ValueError as e: return self.error(f"{ip_range} is not a valid cidr network") if not contest.real_time_rank and data.get("real_time_rank"): cache_key = f"{CacheKey.contest_rank_cache}:{contest.id}" cache.delete(cache_key) for k, v in data.items(): setattr(contest, k, v) contest.save() return self.success(ContestAdminSerializer(contest).data)
def update_contest_rank(self): if self.contest.rule_type == ContestRuleType.OI or self.contest.real_time_rank: cache.delete(f"{CacheKey.contest_rank_cache}:{self.contest.id}") with transaction.atomic(): if self.contest.rule_type == ContestRuleType.ACM: acm_rank, _ = ACMContestRank.objects.select_for_update(). \ get_or_create(user_id=self.submission.user_id, contest=self.contest) self._update_acm_contest_rank(acm_rank) else: oi_rank, _ = OIContestRank.objects.select_for_update(). \ get_or_create(user_id=self.submission.user_id, contest=self.contest) self._update_oi_contest_rank(oi_rank)
def get(self, request): code = request.GET.get("code") username = request.GET.get("username") if not username: username = request.user.username try: user = User.objects.get(username=username, is_disabled=False) except User.DoesNotExist: return self.error("user does not exist") if not code: return self.error("code not exist") result = cache.ttl(code) if result == 0: return self.error("未能找到激活码") else: cache.delete(code) user.set_paid(True) return self.success()
def invalidate(self, func, *args, **kwargs): key = self.get_slot_name(func, args, kwargs) if self.is_sync: cache.delete(key) else: async_cache.delete(key)