Exemple #1
0
    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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
 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 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)
Exemple #7
0
    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)