Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion apps/admission/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
from rest_framework.views import APIView

from django.conf import settings
from django.contrib.sites.models import Site
from django.db.models import Q
from django.http import Http404

Expand Down Expand Up @@ -133,7 +134,7 @@ def post(self, request: HttpRequest, *args, **kwargs):

send_email_verification_code(
email_to=serializer.validated_data["email"],
site=request.site,
site=Site.objects.get(pk=settings.SITE_ID),
applicant=acceptance.applicant,
)

Expand Down
22 changes: 11 additions & 11 deletions apps/admission/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -620,18 +620,18 @@ class RegisterApplicantsForOlympiadView(CuratorOnlyMixin, generic.View):
"""
Register applicants with status PERMIT_TO_OLYMPIAD in the olympiad contest.
"""

def get_campaign(self, campaign_id):
"""Get campaign by ID."""
return get_object_or_404(Campaign, pk=campaign_id)

def get_applicants(self, campaign):
"""Get applicants with status PERMIT_TO_OLYMPIAD."""
return Applicant.objects.filter(
campaign=campaign,
status=ApplicantStatuses.PERMIT_TO_OLYMPIAD
)

def create_olympiad_records(self, applicants):
"""Create Olympiad records for applicants who don't have one."""
created_count = 0
Expand All @@ -643,7 +643,7 @@ def create_olympiad_records(self, applicants):
Olympiad.objects.create(applicant=applicant)
created_count += 1
return created_count

def register_in_contest(self, api, applicants, request):
"""Register applicants in the contest."""
registered_count = 0
Expand All @@ -661,24 +661,24 @@ def register_in_contest(self, api, applicants, request):
f"Error registering applicant {olympiad.applicant_id} in olympiad contest: {e}"
)
return registered_count

def get(self, request, campaign_id):
campaign = self.get_campaign(campaign_id)

# Get applicants and create Olympiad records
applicants = self.get_applicants(campaign)
created_count = self.create_olympiad_records(applicants)

# Register applicants in the contest
api = YandexContestAPI(access_token=campaign.access_token, refresh_token=campaign.refresh_token)
registered_count = self.register_in_contest(api, applicants, request)

# Add success message
messages.success(
request,
_("Created {} olympiad records and registered {} applicants in the contest.").format(created_count, registered_count)
)

return redirect("admission:applicants:list")


Expand Down Expand Up @@ -1124,7 +1124,7 @@ def get_redirect_url(self, *args, **kwargs):
class BranchFromURLViewMixin:
"""
This view mixin sets `branch` attribute to the request object based on
`request.site` and non-empty `branch_code` url named argument
`settings.SITE_ID` and non-empty `branch_code` url named argument
"""

def setup(self, request, *args, **kwargs):
Expand All @@ -1135,7 +1135,7 @@ def setup(self, request, *args, **kwargs):
f"{self.__class__} is subclass of {self.__class__.__name__} but "
f"`branch_code` view keyword argument is not specified or empty"
)
request.branch = Branch.objects.get_by_natural_key(branch_code, request.site.id)
request.branch = Branch.objects.get_by_natural_key(branch_code, settings.SITE_ID)


class InterviewResultsView(
Expand Down
8 changes: 8 additions & 0 deletions apps/core/context_processors.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django.conf import settings
from django.contrib.sites.models import Site


def common_context(request):
Expand All @@ -19,3 +20,10 @@ def js_config(request):
"CSRF_COOKIE_NAME": settings.CSRF_COOKIE_NAME,
"SENTRY_DSN": settings.SENTRY_DSN,
}


def site_context(request):
"""Add site object to the context for all views."""
return {
"site": Site.objects.get(pk=settings.SITE_ID)
}
7 changes: 7 additions & 0 deletions apps/core/jinja2/globals.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
from crispy_forms.utils import render_crispy_form

from django.conf import settings
from django.contrib.messages import DEFAULT_LEVELS, get_messages
from django.contrib.sites.models import Site

from core.menu import Menu
from jinja2 import pass_context
Expand Down Expand Up @@ -40,3 +42,8 @@ def generate_menu(menu_name, request, root_id=None):
@pass_context
def crispy(context, form):
return render_crispy_form(form, context=context)


def site_context():
"""Returns the site object based on settings.SITE_ID."""
return Site.objects.get(pk=settings.SITE_ID)
11 changes: 6 additions & 5 deletions apps/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from django.utils.encoding import force_bytes, force_str, smart_str
from django.utils.functional import cached_property
from django.utils.translation import gettext_lazy as _
from django.contrib.sites.models import Site

from core.db.fields import TimeZoneField
from core.db.models import ConfigurationModel
Expand Down Expand Up @@ -63,15 +64,15 @@ def get_current(self, request=None) -> "SiteConfiguration":
"""
Return the current site configuration based on the SITE_ID in the
project's settings. If SITE_ID isn't defined, return the site
configuration matching ``request.site``.
configuration matching ``settings.SITE_ID``.

The ``SiteConfiguration`` object is cached the
first time it's retrieved from the database.
"""
if getattr(settings, 'SITE_ID', None):
site_id = settings.SITE_ID
elif request:
site_id = request.site.pk
site_id = settings.SITE_ID
else:
raise ImproperlyConfigured(
"Set the SITE_ID setting or pass a request to "
Expand Down Expand Up @@ -231,16 +232,16 @@ def for_site(self, site_id: int, all=False) -> List["Branch"]:

def get_current(self, request, site_id: int = settings.SITE_ID):
"""
Returns the Branch based on the subdomain of the `request.site`, where
Returns the Branch based on the subdomain of the `settings.SITE_ID`, where
subdomain is a branch code (e.g. nsk.example.com)
If request is not provided, returns the Branch based on the
DEFAULT_BRANCH_CODE value in the project's settings.
"""
sub_domain = request.get_host().lower().rsplit(request.site.domain, 1)[0][:-1]
sub_domain = request.get_host().lower().rsplit(Site.objects.get(id=settings.SITE_ID).domain, 1)[0][:-1]
branch_code = sub_domain or settings.DEFAULT_BRANCH_CODE
if branch_code == "www":
branch_code = settings.DEFAULT_BRANCH_CODE
key = BranchNaturalKey(code=branch_code, site_id=request.site.id)
key = BranchNaturalKey(code=branch_code, site_id=settings.SITE_ID)
if key not in BRANCH_CACHE:
BRANCH_CACHE[key] = self.get(code=key.code, site_id=key.site_id)
return BRANCH_CACHE[key]
Expand Down
2 changes: 0 additions & 2 deletions apps/core/tests/test_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,8 +47,6 @@ def test_manager_site_configuration_get_current(rf, settings):
request.path = '/'
assert SiteConfiguration.objects.get_current() == site_configuration2
assert SiteConfiguration.objects.get_current(request) == site_configuration2
settings.SITE_ID = None
assert SiteConfiguration.objects.get_current(request) == site_configuration1


@pytest.mark.django_db
Expand Down
4 changes: 3 additions & 1 deletion apps/courses/views/meta_course.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import generic
from django.conf import settings
from django.contrib.sites.models import Site

from auth.mixins import PermissionRequiredMixin
from courses.forms import MetaCourseForm
Expand All @@ -17,7 +19,7 @@ class MetaCourseDetailView(LoginRequiredMixin, generic.DetailView):
def get_context_data(self, **kwargs):
courses = (Course.objects
.filter(meta_course=self.object)
.available_on_site(self.request.site)
.available_on_site(Site.objects.get(pk=settings.SITE_ID))
.select_related("meta_course", "semester", "main_branch")
.order_by('-semester__index'))
context = {
Expand Down
7 changes: 4 additions & 3 deletions apps/courses/views/misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from django.contrib.auth.mixins import LoginRequiredMixin
from django.views import generic
from django.conf import settings

from core.models import Branch, Location
from courses.models import Course, CourseTeacher
Expand All @@ -19,7 +20,7 @@ def get_queryset(self, *args, **kwargs):

def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
branches = Branch.objects.for_site(site_id=self.request.site.pk)
branches = Branch.objects.for_site(site_id=settings.SITE_ID)
min_established = min(b.established for b in branches)
# FIXME: move to service method and test
courses = (Course.objects
Expand All @@ -32,10 +33,10 @@ def get_context_data(self, **kwargs):
teachers=self.object.pk)
.select_related('semester', 'meta_course', 'main_branch')
.order_by('-semester__index'))

if not self.request.user.has_permission_to_drafts:
courses = courses.is_published()

context['courses'] = courses
return context

Expand Down
7 changes: 4 additions & 3 deletions apps/courses/views/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
from django.conf import settings
from django.http import Http404
from django.shortcuts import get_object_or_404
from django.contrib.sites.models import Site

from core.exceptions import Redirect
from core.urls import reverse
Expand Down Expand Up @@ -39,7 +40,7 @@ def setup(self, request, *args, **kwargs):
meta_course__slug=kwargs['course_slug'],
semester__type=kwargs['semester_type'],
semester__year=kwargs['semester_year'])
.available_on_site(request.site)
.available_on_site(Site.objects.get(pk=settings.SITE_ID))
.order_by('pk')
)

Expand All @@ -52,7 +53,7 @@ def get_course_queryset(self):
class CoursePublicURLParamsMixin(CourseURLParamsMixinBase):
"""
This mixin helps to retrieve course made by the current site (where
main branch is related to the `request.site`), `RE_COURSE_PUBLIC_URI`
main branch is related to the `settings.SITE_ID`), `RE_COURSE_PUBLIC_URI`
friendly URL prefix contains all the required parameters for this.
Returns 404 in case course is not found, otherwise sets `course`
attribute to the view instance.
Expand Down Expand Up @@ -103,7 +104,7 @@ def setup(self, request, *args, **kwargs):
courses = list(self.get_course_queryset()
.filter(main_branch__code=main_branch_code,
main_branch__active=True,
main_branch__site=request.site)
main_branch__site=Site.objects.get(pk=settings.SITE_ID))
.order_by('pk'))
if not courses:
raise Http404
Expand Down
4 changes: 3 additions & 1 deletion apps/learning/api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@
from rest_framework.response import Response

from django.utils.translation import gettext_lazy as _
from django.conf import settings
from django.contrib.sites.models import Site

from api.authentication import TokenAuthentication
from api.mixins import ApiErrorsMixin
Expand Down Expand Up @@ -109,7 +111,7 @@ def get(self, request: AuthenticatedAPIRequest, **kwargs: Any):
queryset = (Enrollment.active
.select_related('student')
.filter(course=self.course,
course__main_branch__site=request.site))
course__main_branch__site=Site.objects.get(pk=settings.SITE_ID)))
data = self.OutputSerializer(queryset, many=True).data
return Response(data)

Expand Down
6 changes: 4 additions & 2 deletions apps/learning/gradebook/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from rest_framework.response import Response

from django.contrib import messages
from django.conf import settings
from django.core.exceptions import PermissionDenied, ValidationError
from django.db.models import Prefetch, Q, Count
from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseRedirect
Expand All @@ -14,6 +15,7 @@
from django.utils.translation import gettext_lazy as _
from django.views import View, generic
from django.views.generic.base import TemplateResponseMixin
from django.contrib.sites.models import Site

from api.views import APIBaseView
from auth.mixins import PermissionRequiredMixin, RolePermissionRequiredMixin
Expand Down Expand Up @@ -58,7 +60,7 @@ class GradeBookListBaseView(generic.ListView):

def get_course_queryset(self):
return (Course.objects
.available_on_site(self.request.site)
.available_on_site(Site.objects.get(pk=settings.SITE_ID))
.select_related("meta_course", "main_branch")
.order_by("meta_course__name"))

Expand Down Expand Up @@ -202,7 +204,7 @@ def get_context_data(self, form: BaseGradebookForm,
.select_related('semester', 'meta_course', 'main_branch'))
context['course_offering_list'] = courses
context['user_type'] = self.user_type

is_recredited_filter = Q(grade=GradeTypes.RE_CREDIT) | Q(is_grade_recredited=True)
context.update(
Enrollment.active.filter(course=self.course).aggregate(
Expand Down
9 changes: 5 additions & 4 deletions apps/learning/invitation/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from django.http import Http404, HttpResponseRedirect, HttpResponseForbidden
from django.shortcuts import get_object_or_404
from django.utils.translation import gettext_lazy as _
from django.contrib.sites.models import Site


from courses.models import Semester
Expand Down Expand Up @@ -95,7 +96,7 @@ def dispatch(self, request, *args, **kwargs):
return super().dispatch(request, *args, **kwargs)
elif self.invitation.semester != Semester.get_current():
return HttpResponseForbidden(_("Invitation is outdated"))
elif has_other_active_invited_profile(request.user, request.site, self.invitation):
elif has_other_active_invited_profile(request.user, Site.objects.get(pk=settings.SITE_ID), self.invitation):
return HttpResponseForbidden(_("You already have other active invitation in this semester"))
return super().dispatch(request, *args, **kwargs)

Expand All @@ -106,7 +107,7 @@ def get(self, request, *args, **kwargs):
kwargs={"token": self.invitation.token},
subdomain=settings.LMS_SUBDOMAIN)
return HttpResponseRedirect(redirect_to=login_url)
if not is_student_profile_valid(request.user, request.site):
if not is_student_profile_valid(request.user, Site.objects.get(pk=settings.SITE_ID)):
redirect_to = reverse("invitation:complete_profile",
kwargs={"token": self.invitation.token},
subdomain=settings.LMS_SUBDOMAIN)
Expand Down Expand Up @@ -237,7 +238,7 @@ class InvitationCompleteProfileView(InvitationURLParamsMixin,
def dispatch(self, request, *args, **kwargs):
if not request.user.is_authenticated:
return self.handle_no_permission()
if is_student_profile_valid(request.user, request.site):
if is_student_profile_valid(request.user, Site.objects.get(pk=settings.SITE_ID)):
return HttpResponseRedirect(self.invitation.get_absolute_url())
return super().dispatch(request, *args, **kwargs)

Expand All @@ -254,7 +255,7 @@ def get_object(self):

def form_valid(self, form):
self.object = form.save(commit=False)
complete_student_profile(self.object, self.request.site, self.invitation)
complete_student_profile(self.object, Site.objects.get(pk=settings.SITE_ID), self.invitation)
return HttpResponseRedirect(self.invitation.get_absolute_url())

def get_context_data(self, **kwargs):
Expand Down
Loading
Loading