Initial subdomain implementation
This commit is contained in:
parent
dea24f7f71
commit
1628e63084
17 changed files with 194 additions and 46 deletions
|
@ -76,6 +76,10 @@ class FeedView(ListView):
|
|||
.filter(is_visible=True)
|
||||
.order_by("start_time")
|
||||
)
|
||||
if self.request.organization:
|
||||
visible_contests = visible_contests.filter(
|
||||
is_organization_private=True, organizations=self.request.organization
|
||||
)
|
||||
|
||||
context["current_contests"] = visible_contests.filter(
|
||||
start_time__lte=now, end_time__gt=now
|
||||
|
@ -84,10 +88,14 @@ class FeedView(ListView):
|
|||
context[
|
||||
"recent_organizations"
|
||||
] = OrganizationProfile.get_most_recent_organizations(self.request.profile)
|
||||
context["top_rated"] = Profile.objects.filter(is_unlisted=False).order_by(
|
||||
|
||||
profile_queryset = Profile.objects
|
||||
if self.request.organization:
|
||||
profile_queryset = self.request.organization.members
|
||||
context["top_rated"] = profile_queryset.filter(is_unlisted=False).order_by(
|
||||
"-rating"
|
||||
)[:10]
|
||||
context["top_scorer"] = Profile.objects.filter(is_unlisted=False).order_by(
|
||||
context["top_scorer"] = profile_queryset.filter(is_unlisted=False).order_by(
|
||||
"-performance_points"
|
||||
)[:10]
|
||||
|
||||
|
@ -108,6 +116,8 @@ class PostList(FeedView, PageVoteListView, BookMarkListView):
|
|||
filter = Q(is_organization_private=False)
|
||||
if self.request.user.is_authenticated:
|
||||
filter |= Q(organizations__in=self.request.profile.organizations.all())
|
||||
if self.request.organization:
|
||||
filter &= Q(organizations=self.request.organization)
|
||||
queryset = queryset.filter(filter)
|
||||
return queryset
|
||||
|
||||
|
@ -184,7 +194,9 @@ class CommentFeed(FeedView):
|
|||
paginate_by = 50
|
||||
|
||||
def get_queryset(self):
|
||||
return Comment.most_recent(self.request.user, 1000)
|
||||
return Comment.most_recent(
|
||||
self.request.user, 1000, organization=self.request.organization
|
||||
)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(CommentFeed, self).get_context_data(**kwargs)
|
||||
|
|
|
@ -179,6 +179,8 @@ class ContestList(
|
|||
queryset = queryset.filter(
|
||||
Q(key__icontains=query) | Q(name__icontains=query)
|
||||
)
|
||||
if not self.org_query and self.request.organization:
|
||||
self.org_query = [self.request.organization.id]
|
||||
if self.org_query:
|
||||
queryset = queryset.filter(organizations__in=self.org_query)
|
||||
|
||||
|
@ -404,6 +406,15 @@ class ContestDetail(
|
|||
def get_title(self):
|
||||
return self.object.name
|
||||
|
||||
def get_editable_organizations(self):
|
||||
if not self.request.profile:
|
||||
return []
|
||||
res = []
|
||||
for organization in self.object.organizations.all():
|
||||
if self.request.profile.can_edit_organization(organization):
|
||||
res.append(organization)
|
||||
return res
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(ContestDetail, self).get_context_data(**kwargs)
|
||||
context["contest_problems"] = (
|
||||
|
@ -421,6 +432,7 @@ class ContestDetail(
|
|||
)
|
||||
.add_i18n_name(self.request.LANGUAGE_CODE)
|
||||
)
|
||||
context["editable_organizations"] = self.get_editable_organizations()
|
||||
return context
|
||||
|
||||
|
||||
|
|
|
@ -35,6 +35,7 @@ from django.views.generic.detail import (
|
|||
SingleObjectTemplateResponseMixin,
|
||||
)
|
||||
from django.core.paginator import Paginator
|
||||
from django.contrib.sites.shortcuts import get_current_site
|
||||
from reversion import revisions
|
||||
|
||||
from judge.forms import (
|
||||
|
@ -68,12 +69,13 @@ from judge.utils.views import (
|
|||
DiggPaginatorMixin,
|
||||
)
|
||||
from judge.utils.problems import user_attempted_ids, user_completed_ids
|
||||
from judge.views.problem import ProblemList
|
||||
from judge.views.problem import ProblemList, get_problems_in_organization
|
||||
from judge.views.contests import ContestList
|
||||
from judge.views.submission import AllSubmissions, SubmissionsListBase
|
||||
from judge.views.pagevote import PageVoteListView
|
||||
from judge.views.bookmark import BookMarkListView
|
||||
|
||||
|
||||
__all__ = [
|
||||
"OrganizationList",
|
||||
"OrganizationHome",
|
||||
|
@ -96,14 +98,9 @@ class OrganizationBase(object):
|
|||
def can_edit_organization(self, org=None):
|
||||
if org is None:
|
||||
org = self.object
|
||||
if not self.request.user.is_authenticated:
|
||||
return False
|
||||
profile_id = self.request.profile.id
|
||||
return (
|
||||
org.admins.filter(id=profile_id).exists()
|
||||
or org.registrant_id == profile_id
|
||||
or self.request.user.is_superuser
|
||||
)
|
||||
if self.request.profile:
|
||||
return self.request.profile.can_edit_organization(org)
|
||||
return False
|
||||
|
||||
def is_member(self, org=None):
|
||||
if org is None:
|
||||
|
@ -293,6 +290,9 @@ class OrganizationHome(OrganizationDetailView, PageVoteListView, BookMarkListVie
|
|||
def get_context_data(self, **kwargs):
|
||||
context = super(OrganizationHome, self).get_context_data(**kwargs)
|
||||
context["title"] = self.object.name
|
||||
context["organization_subdomain"] = (
|
||||
self.object.slug + "." + get_current_site(self.request).domain
|
||||
)
|
||||
context["posts"], context["page_obj"] = self.get_posts_and_page_obj()
|
||||
context = self.add_pagevote_context_data(context, "posts")
|
||||
context = self.add_bookmark_context_data(context, "posts")
|
||||
|
@ -378,6 +378,7 @@ class OrganizationUsers(QueryStringSortMixin, OrganizationDetailView):
|
|||
|
||||
class OrganizationProblems(LoginRequiredMixin, MemberOrganizationMixin, ProblemList):
|
||||
template_name = "organization/problems.html"
|
||||
filter_organization = True
|
||||
|
||||
def get_queryset(self):
|
||||
self.org_query = [self.organization_id]
|
||||
|
@ -387,17 +388,6 @@ class OrganizationProblems(LoginRequiredMixin, MemberOrganizationMixin, ProblemL
|
|||
self.setup_problem_list(request)
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
def get_latest_attempted_problems(self, limit=None):
|
||||
if not self.profile:
|
||||
return ()
|
||||
problems = set(self.get_queryset().values_list("code", flat=True))
|
||||
result = list(user_attempted_ids(self.profile).values())
|
||||
result = [i for i in result if i["code"] in problems]
|
||||
result = sorted(result, key=lambda d: -d["last_submission"])
|
||||
if limit:
|
||||
result = result[:limit]
|
||||
return result
|
||||
|
||||
def get_completed_problems(self):
|
||||
return user_completed_ids(self.profile) if self.profile is not None else ()
|
||||
|
||||
|
@ -478,10 +468,11 @@ class OrganizationSubmissions(
|
|||
return None
|
||||
|
||||
def _get_queryset(self):
|
||||
problems = get_problems_in_organization(self.request, self.organization)
|
||||
return (
|
||||
super()
|
||||
._get_entire_queryset()
|
||||
.filter(contest_object__organizations=self.organization)
|
||||
.filter(user__organizations=self.organization, problem__in=problems)
|
||||
)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
|
|
|
@ -105,6 +105,14 @@ def get_contest_submission_count(problem, profile, virtual):
|
|||
)
|
||||
|
||||
|
||||
def get_problems_in_organization(request, organization):
|
||||
problem_list = ProblemList(request=request)
|
||||
problem_list.setup_problem_list(request)
|
||||
problem_list.org_query = [organization.id]
|
||||
problems = problem_list.get_normal_queryset()
|
||||
return problems
|
||||
|
||||
|
||||
class ProblemMixin(object):
|
||||
model = Problem
|
||||
slug_url_kwarg = "problem"
|
||||
|
@ -145,10 +153,13 @@ class SolvedProblemMixin(object):
|
|||
else:
|
||||
return user_attempted_ids(self.profile) if self.profile is not None else ()
|
||||
|
||||
def get_latest_attempted_problems(self, limit=None):
|
||||
def get_latest_attempted_problems(self, limit=None, queryset=None):
|
||||
if self.in_contest or not self.profile:
|
||||
return ()
|
||||
result = list(user_attempted_ids(self.profile).values())
|
||||
if queryset:
|
||||
queryset_ids = set([i.code for i in queryset])
|
||||
result = filter(lambda i: i["code"] in queryset_ids, result)
|
||||
result = sorted(result, key=lambda d: -d["last_submission"])
|
||||
if limit:
|
||||
result = result[:limit]
|
||||
|
@ -454,6 +465,7 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView
|
|||
default_desc = frozenset(("date", "points", "ac_rate", "user_count"))
|
||||
default_sort = "-date"
|
||||
first_page_href = None
|
||||
filter_organization = False
|
||||
|
||||
def get_paginator(
|
||||
self, queryset, per_page, orphans=0, allow_empty_first_page=True, **kwargs
|
||||
|
@ -592,6 +604,8 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView
|
|||
user=self.profile, points=F("problem__points")
|
||||
).values_list("problem__id", flat=True)
|
||||
)
|
||||
if not self.org_query and self.request.organization:
|
||||
self.org_query = [self.request.organization.id]
|
||||
if self.org_query:
|
||||
self.org_query = self.get_org_query(self.org_query)
|
||||
queryset = queryset.filter(
|
||||
|
@ -652,6 +666,8 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView
|
|||
def get_context_data(self, **kwargs):
|
||||
context = super(ProblemList, self).get_context_data(**kwargs)
|
||||
|
||||
if self.request.organization:
|
||||
self.filter_organization = True
|
||||
context["hide_solved"] = 0 if self.in_contest else int(self.hide_solved)
|
||||
context["show_types"] = 0 if self.in_contest else int(self.show_types)
|
||||
context["full_text"] = 0 if self.in_contest else int(self.full_text)
|
||||
|
@ -676,7 +692,9 @@ class ProblemList(QueryStringSortMixin, TitleMixin, SolvedProblemMixin, ListView
|
|||
context["search_query"] = self.search_query
|
||||
context["completed_problem_ids"] = self.get_completed_problems()
|
||||
context["attempted_problems"] = self.get_attempted_problems()
|
||||
context["last_attempted_problems"] = self.get_latest_attempted_problems(15)
|
||||
context["last_attempted_problems"] = self.get_latest_attempted_problems(
|
||||
15, context["problems"] if self.filter_organization else None
|
||||
)
|
||||
context["page_type"] = "list"
|
||||
context.update(self.get_sort_paginate_context())
|
||||
if not self.in_contest:
|
||||
|
|
|
@ -49,6 +49,7 @@ from judge.utils.raw_sql import join_sql_subquery, use_straight_join
|
|||
from judge.utils.views import DiggPaginatorMixin
|
||||
from judge.utils.views import TitleMixin
|
||||
from judge.utils.timedelta import nice_repr
|
||||
from judge.views.problem import get_problems_in_organization
|
||||
|
||||
|
||||
MAX_NUMBER_OF_QUERY_SUBMISSIONS = 50000
|
||||
|
@ -414,6 +415,13 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView):
|
|||
def _get_queryset(self):
|
||||
queryset = self._get_entire_queryset()
|
||||
if not self.in_contest:
|
||||
if self.request.organization:
|
||||
problems = get_problems_in_organization(
|
||||
self.request, self.request.organization
|
||||
)
|
||||
queryset = queryset.filter(
|
||||
user__organizations=self.request.organization, problem__in=problems
|
||||
)
|
||||
join_sql_subquery(
|
||||
queryset,
|
||||
subquery=str(
|
||||
|
@ -785,7 +793,12 @@ class AllSubmissions(SubmissionsListBase):
|
|||
return context
|
||||
|
||||
def _get_result_data(self):
|
||||
if self.in_contest or self.selected_languages or self.selected_statuses:
|
||||
if (
|
||||
self.request.organization
|
||||
or self.in_contest
|
||||
or self.selected_languages
|
||||
or self.selected_statuses
|
||||
):
|
||||
return super(AllSubmissions, self)._get_result_data()
|
||||
|
||||
key = "global_submission_result_data"
|
||||
|
|
|
@ -454,7 +454,7 @@ class UserList(QueryStringSortMixin, DiggPaginatorMixin, TitleMixin, ListView):
|
|||
return ret
|
||||
|
||||
def get_queryset(self):
|
||||
ret = (
|
||||
queryset = (
|
||||
Profile.objects.filter(is_unlisted=False)
|
||||
.order_by(self.order, "id")
|
||||
.select_related("user")
|
||||
|
@ -467,11 +467,13 @@ class UserList(QueryStringSortMixin, DiggPaginatorMixin, TitleMixin, ListView):
|
|||
"problem_count",
|
||||
)
|
||||
)
|
||||
|
||||
if self.request.organization:
|
||||
queryset = queryset.filter(organizations=self.request.organization)
|
||||
if (self.request.GET.get("friend") == "true") and self.request.profile:
|
||||
ret = self.filter_friend_queryset(ret)
|
||||
queryset = self.filter_friend_queryset(queryset)
|
||||
self.filter_friend = True
|
||||
return ret
|
||||
|
||||
return queryset
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super(UserList, self).get_context_data(**kwargs)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue