Пример #1
0
 def get_queryset(self):
     user = self.request.user if self.request.user.is_authenticated else None
     return Contest.objects.get_status_list(show_all=is_admin_or_root(
         self.request.user),
                                            filter_user=user,
                                            sorting_by_id=True,
                                            contest_type=1)
Пример #2
0
    def get_queryset(self):
        if 'exact' in self.request.GET:
            self.search_text = q = self.request.GET['exact']
            query = Q(pk__exact=q)
        elif 'q' in self.request.GET:
            self.search_text = q = self.request.GET['q']
            query = Q(title__icontains=q) | Q(alias__icontains=q) | Q(
                source__icontains=q)
            if q.isdigit():
                query |= Q(pk__exact=q)
                self.id_searching_recommendation = q
        else:
            self.search_text = ''
            query = None

        if is_admin_or_root(self.request.user):
            qs = Problem.objects.all()
        else:
            qs = self.request.user.managing_problems.all()
        if query:
            qs = qs.filter(query)
        qs = qs.only("update_time", "title", "id", "create_time", "source", "alias") \
          .order_by("-update_time").prefetch_related("revisions").annotate(Count('revisions'))
        favorite_problems = set(
            FavoriteProblem.objects.filter(user=self.request.user).values_list(
                "problem_id", flat=True))
        if favorite_problems:
            for p in qs:
                p.liked = p.id in favorite_problems
            qs = sorted(list(qs), key=lambda p: not p.liked)
        return qs
Пример #3
0
 def post(self, request, pk):
     if 'text' in request.POST and request.POST['text'] \
         and (is_admin_or_root(self.request.user) or not review_requested()):
         Comment.objects.create(text=request.POST['text'],
                                author=request.user,
                                blog_id=pk)
     return redirect(reverse('blog:detail', kwargs={'pk': pk}))
Пример #4
0
    def post(self, request, pk):
        def get_next_identifier(identifiers):
            from collections import deque
            q = deque()
            q.append('')
            while q:
                u = q.popleft()
                if u and u not in identifiers:
                    return u
                for i in range(ord('A'), ord('Z') + 1):
                    q.append(u + chr(i))

        problems = list(
            filter(
                lambda x: x,
                map(lambda x: x.strip(), request.POST['problems'].split(','))))
        for problem in problems:
            if not Problem.objects.filter(id=problem, visible=True).exists() and \
                not is_admin_or_root(request.user) and \
                not request.user.managing_problems.filter(id=problem).exists():
                raise PermissionDenied
        for problem in problems:
            if self.contest.contestproblem_set.filter(
                    problem_id=problem).exists():
                continue
            identifier = get_next_identifier(
                [x.identifier for x in self.contest.contestproblem_set.all()])
            self.contest.contestproblem_set.create(problem_id=problem,
                                                   identifier=identifier)
        reorder_contest_problem_identifiers(self.contest)
        return HttpResponse()
Пример #5
0
 def test_func(self):
     if not is_admin_or_root(self.request.user):
         return False
     if path.commonpath([self.root, settings.MIRROR_DIR
                         ]) != settings.MIRROR_DIR:
         return False
     return True
Пример #6
0
def is_site_closed(request):
    if is_admin_or_root(request.user):
        return False
    if request.META.get("HTTP_HOST",
                        '').split(":")[0] in settings.WHITE_LIST_HOST:
        return False
    return True
Пример #7
0
    def get_queryset(self):
        try:
            queryset = self.get_selected_from().select_related('problem', 'author'). \
                only('pk', 'contest_id', 'create_time', 'author_id', 'author__username',
                     'author__magic', 'problem_id', 'problem__title', 'lang', 'status', 'status_time', 'status_percent',
                     'code_length', 'ip', 'cheat_tag', 'status_test', 'judge_server')
            if not self.privileged and not self.contest_submission_visible and not is_admin_or_root(self.request.user):
                queryset = queryset.filter(contest__isnull=True, problem__visible=True)

            if 'user' in self.request.GET:
                queryset = queryset.filter(author_id=self.request.GET['user'])
            if self.allow_problem_query and 'problem' in self.request.GET:
                queryset = queryset.filter(problem_id=self.reinterpret_problem_identifier(self.request.GET['problem']))
            if 'lang' in self.request.GET:
                queryset = queryset.filter(lang=self.request.GET['lang'])
            if self.allow_verdict_query and 'verdict' in self.request.GET:
                queryset = queryset.filter(status=int(self.request.GET['verdict'][1:]))

            if self.distinct_by_author:
                author_set = set()
                res = []
                for submission in queryset.all():
                    if submission.author_id not in author_set:
                        author_set.add(submission.author_id)
                        res.append(submission)
                        if self.query_number and len(res) >= self.query_number:
                            break
                return res
            else:
                return queryset.all()[:self.query_number]
        except Exception as e:
            raise Http404(e)
Пример #8
0
 def get_context_data(self, **kwargs):
     context = super(BlogView, self).get_context_data(**kwargs)
     context['blog'] = self.blog
     context['is_privileged'] = is_admin_or_root(self.request.user) or self.request.user == self.blog.author
     if context['is_privileged'] or not self.blog.hide_revisions:
         context['blog_revisions'] = self.blog.revisions.select_related("author").all()[1:]
     context['action_path'] = reverse('comments-post-comment')
     return context
Пример #9
0
 def form_valid(self, form):
     instance = form.save(commit=False)
     if not is_admin_or_root(
             self.request.user) and instance.author != self.request.user:
         raise PermissionDenied(_("You don't have the access."))
     instance.save()
     return HttpResponseRedirect(
         reverse('blog:detail', kwargs={'pk': self.kwargs.get('pk')}))
Пример #10
0
 def get_context_data(self, **kwargs):
     context = super(BlogView, self).get_context_data(**kwargs)
     context['blog'] = self.blog
     context['action_path'] = reverse('comments-post-comment')
     if is_admin_or_root(
             self.request.user) or self.request.user == self.blog.author:
         context['is_privileged'] = True
     return context
Пример #11
0
 def form_valid(self, form):
     instance = form.save(commit=False)
     if not is_admin_or_root(self.request.user) and instance.author != self.request.user:
         raise PermissionDenied(_("You don't have the access."))
     with transaction.atomic():
         instance.save()
         instance.revisions.create(title=instance.title, text=instance.text, author=self.request.user)
     return redirect(reverse('blog:detail', kwargs=self.kwargs))
Пример #12
0
def remove_flag(request, **kwargs):
    if kwargs['created'] and kwargs['flag'].flag == CommentFlag.SUGGEST_REMOVAL:
        comment = kwargs['comment']
        if is_admin_or_root(
                request.user
        ) or request.user.is_authenticated and comment.user == request.user:
            comment.is_removed = True
            comment.save(update_fields=['is_removed'])
Пример #13
0
 def get_queryset(self):
     self.user = get_object_or_404(User, pk=self.kwargs.get('pk'))
     qs = self.user.blog_set.all().with_likes().with_likes_flag(
         self.request.user)
     if not is_admin_or_root(
             self.request.user) and not self.request.user == self.user:
         qs = qs.filter(visible=True)
     return qs
Пример #14
0
 def get_context_data(self, **kwargs):
     res = super(GenericView, self).get_context_data(**kwargs)
     res['profile'] = self.user
     res['solved'] = get_accept_problem_count(self.user.pk)
     if is_admin_or_root(self.request.user):
         res['is_privileged'] = True
     if self.request.user == self.user:
         res['is_author'] = res['is_privileged'] = True
     return res
Пример #15
0
 def get_context_data(self, **kwargs):  # pylint: disable=arguments-differ
     res = super(GetRewardsView, self).get_context_data(**kwargs)
     res['profile'] = self.user
     res['solved'] = get_accept_problem_count(self.user.pk)
     if is_admin_or_root(self.request.user):
         res['is_privileged'] = True
     if self.request.user == self.user:
         res['is_author'] = res['is_privileged'] = True
     return res
Пример #16
0
 def get_context_data(self, **kwargs):
   data = super().get_context_data(**kwargs)
   data["activity"] = get_object_or_404(Activity, id=self.kwargs["pk"])
   data["registered"] = ActivityParticipant.objects.filter(activity_id=self.kwargs["pk"],
                                                           user_id=self.request.user.id,
                                                           is_deleted=False).exists()
   data["register_open"] = data["activity"].register_start_time <= datetime.now() <= data["activity"].register_end_time
   data["privileged"] = is_admin_or_root(self.request.user)
   return data
Пример #17
0
 def post(self, request, pk, comment_id):
     instance = get_object_or_404(Comment, pk=comment_id)
     if is_admin_or_root(request.user) or request.user == instance.author:
         instance.delete()
     elif instance.blog is not None and instance.blog.author == request.author:
         instance.delete()
     else:
         return PermissionDenied(_("You don't have the access."))
     return HttpResponseRedirect(reverse('blog:detail', kwargs={'pk': self.kwargs.get('pk')}))
Пример #18
0
 def get(self, request):
     kw = request.GET.get('kw')
     results = dict()
     if kw:
         results['user'] = query_user(kw)
         results['problem'] = query_problem(kw,
                                            all=is_admin_or_root(
                                                request.user))
     return Response(dict(results=results))
Пример #19
0
 def get(self, request):
     kw = request.GET.get('kw')
     managing = request.user if request.GET.get('managing') else None
     results = list()
     q = get_problem_q_object(kw, is_admin_or_root(request.user), managing)
     if q:
         for problem in Problem.objects.filter(q).distinct().all()[:5]:
             results.append(dict(name=str(problem), value=problem.pk))
     return Response(dict(success=True, results=results))
Пример #20
0
 def post(self, request, pk):
   if request.POST.get("answer") and is_admin_or_root(self.request.user):
     activity = get_object_or_404(Activity, pk=request.POST["answer"])
     with transaction.atomic():
       for participant in activity.activityparticipant_set.filter(is_deleted=False):
         p, _ = self.contest.contestparticipant_set.get_or_create(user=participant.user)
         if not p.comment:
           p.comment = participant.real_name
           p.save(update_fields=['comment'])
   return redirect(reverse('polygon:contest_participant', kwargs={"pk": self.contest.id}))
Пример #21
0
 def form_valid(self, form):
     instance = form.save(commit=False)
     instance.author = self.request.user
     if not is_admin_or_root(self.request.user) and review_requested():
         instance.visible = False
     instance.save()
     instance.revisions.create(title=instance.title,
                               text=instance.text,
                               author=self.request.user)
     return HttpResponseRedirect(
         reverse('blog:index', kwargs={'pk': self.request.user.pk}))
Пример #22
0
 def get_context_data(self, **kwargs):
     context = super(BlogView, self).get_context_data(**kwargs)
     if self.blog.is_reward:
         context['submission'] = Submission.objects.get(
             pk=self.blog.submission_id)
         if self.blog.contest:
             if self.request.user.id in self.blog.contest.participants_ids or \
               self.request.user.id in self.blog.contest.managers or \
               self.request.user.id in self.blog.contest.authors or is_admin_or_root(self.request.user):
                 pass
             else:
                 raise PermissionDenied
     context['blog'] = self.blog
     context['is_privileged'] = is_admin_or_root(
         self.request.user) or self.request.user == self.blog.author
     if context['is_privileged'] or not self.blog.hide_revisions:
         context['blog_revisions'] = self.blog.revisions.select_related(
             "author").all()[1:]
     context['action_path'] = reverse('comments-post-comment')
     return context
Пример #23
0
 def form_valid(self, form):
   activity = get_object_or_404(Activity, id=self.kwargs["pk"])
   if not (activity.register_start_time <= datetime.now() <= activity.register_end_time) and \
       not is_admin_or_root(self.request.user):
     raise PermissionDenied
   if form.instance.activity_id is None:
     form.instance.activity = activity
   if form.instance.user_id is None:
     form.instance.user = self.request.user
   form.instance.is_deleted = False
   return super().form_valid(form)
Пример #24
0
 def get_context_data(self, **kwargs):
     data = super().get_context_data(**kwargs)
     for problem in data['problem_list']:
         problem.latest_revision = self.get_problem_latest_revision(problem)
     data['search_text'] = self.search_text
     if hasattr(self, "id_searching_recommendation"):
         pid = self.id_searching_recommendation
         if Problem.objects.filter(id=pid).exists() and \
                 is_admin_or_root(self.request.user) or self.request.user.managing_problems.filter(id=pid).exists():
             data["suggest_problem"] = Problem.objects.get(id=pid)
             data["suggest_problem"].latest_revision = self.get_problem_latest_revision(data["suggest_problem"])
     return data
Пример #25
0
    def get_queryset(self):
        try:
            queryset = self.get_selected_from().select_related('problem', 'author'). \
              only('pk', 'contest_id', 'create_time', 'author_id', 'author__username',
                   'author__magic', 'problem_id', 'problem__title', 'lang', 'status', 'status_time', 'status_percent',
                   'code_length', 'ip', 'status_test', 'status_memory', 'visible', 'judge_server', 'contest_time')

            if 'user' in self.request.GET:
                queryset = queryset.filter(author_id=self.request.GET['user'])
            if self.allow_problem_query and 'problem' in self.request.GET:
                problem_id = self.reinterpret_problem_identifier(
                    self.request.GET['problem'])
                try:
                    if is_problem_manager(self.request.user,
                                          Problem.objects.get(pk=problem_id)):
                        self.privileged = True
                    queryset = queryset.filter(problem_id=problem_id)
                except:
                    pass
            if 'lang' in self.request.GET:
                queryset = queryset.filter(lang=self.request.GET['lang'])
            if self.allow_verdict_query and 'verdict' in self.request.GET:
                queryset = queryset.filter(
                    status=int(self.request.GET['verdict'][1:]))

            if is_admin_or_root(self.request.user):
                self.privileged = True
            if not self.privileged:
                queryset = queryset.filter(visible=True)
            if not self.privileged and not self.contest_submission_visible:
                queryset = queryset.filter(contest__isnull=True)

            ordering = self.get_ordering()
            if ordering is not None:
                if isinstance(ordering, str):
                    ordering = (ordering, )
                queryset = queryset.order_by(*ordering)

            if self.distinct_by_author:
                author_set = set()
                res = []
                for submission in queryset.all():
                    if submission.author_id not in author_set:
                        author_set.add(submission.author_id)
                        res.append(submission)
                        if self.query_number and len(res) >= self.query_number:
                            break
                return res
            else:
                return queryset.all()[:self.query_number]
        except Exception as e:
            raise Http404(e)
Пример #26
0
 def get(self, request):
   kw = request.GET.get('kw')
   results = dict()
   if kw:
     results['user'] = query_user(kw)
     results['problem'] = query_problem(kw, all=is_admin_or_root(request.user))
     results['tag'] = query_tag(kw)
     results['blog'] = query_blog(kw)
     results['contest'] = query_contest(kw)
     return JsonResponse(dict(results=results, action={
       "url": reverse('search') + '?q=%s' % kw,
       "text": "View all results"
     }))
   return JsonResponse(dict(results=results))
Пример #27
0
    def get_context_data(self, **kwargs):
        data = super(StatusList, self).get_context_data(**kwargs)
        user = self.request.user
        data['keyword'] = self.request.GET.get('keyword')
        data['param_verdict'], data['param_lang'], data['param_user'], data['param_problem'] = \
            self.request.GET.get('verdict', ''), self.request.GET.get('lang', ''),\
            self.request.GET.get('user', ''), self.request.GET.get('problem', '')
        data['allow_verdict_query'] = self.allow_verdict_query
        data['lang_choices'] = LANG_CHOICE
        data['verdict_choices'] = STATUS_CHOICE

        if user.is_authenticated:
            for submission in data['submission_list']:
                if is_admin_or_root(user) or submission.author == user:
                    submission.is_privileged = True
        return data
Пример #28
0
def proxy_file_downloader(request):
    if not is_admin_or_root(request.user):
        raise PermissionDenied

    def download_file(url):
        local_filename = url.split('/')[-1]
        if local_filename == '':
            local_filename = random_string()
        r = requests.get(url, stream=True, timeout=30)
        with open(path.join(settings.UPLOAD_DIR, local_filename), 'wb') as f:
            for chunk in r.iter_content(chunk_size=1024):
                if chunk:
                    f.write(chunk)

    if request.method == 'POST':
        try:
            url = request.POST['url']
            Thread(target=download_file, args=(url, )).start()
        except Exception as e:
            raise PermissionDenied(repr(e))
    return redirect(reverse('filemanager'))
Пример #29
0
 def test_func(self):
   if self.blog.is_reward:
     if self.privileged:
       return True
     if self.contest.access_level == 0:
       self.permission_denied_message = "比赛只对管理员可见。"
       return False
     if self.participate_contest_status < 0:
       self.permission_denied_message = "尚未开始。"
       return False
     if self.registered or self.volunteer:
       return True
     else:
       self.permission_denied_message = "你是不是忘了注册?"
       return False
   else:
     if is_admin_or_root(self.user):
       return True
     if self.user == self.blog.author or self.blog.visible:
       return True
   return False
Пример #30
0
def file_manager(request):
    def slugify(text):
        import re
        return re.sub(r'[ /"#!:]+', '_', text)

    if not is_admin_or_root(request.user):
        raise PermissionDenied
    if request.method == 'POST':
        try:
            file = request.FILES['file']
            save_uploaded_file_to(file,
                                  settings.UPLOAD_DIR,
                                  filename=slugify(file.name))
        except Exception as e:
            raise PermissionDenied(repr(e))
    return render(
        request,
        'filemanager.jinja2',
        context={
            'file_list':
            list(
                map(
                    lambda x: {
                        'name':
                        x,
                        'modified_time':
                        datetime.fromtimestamp(
                            path.getmtime(path.join(settings.UPLOAD_DIR, x))).
                        strftime(settings.DATETIME_FORMAT_TEMPLATE),
                        'size':
                        str(
                            path.getsize(path.join(settings.UPLOAD_DIR, x)) //
                            1024) + "K"
                    },
                    filter(
                        lambda x: path.isfile(path.join(
                            settings.UPLOAD_DIR, x)),
                        listdir(settings.UPLOAD_DIR))))
        })