Exemple #1
0
    def get_resource_objects(self):
        super().get_resource_objects()
        user = self.request.user
        instance = self.get_course_instance_object()
        if instance is not None:
            self.instance = instance
            self.course = self.instance.course
            self.content = CachedContent(self.instance)
            self.user_course_data = None
            is_real_user = user.is_authenticated and not user.is_anonymous
            if is_real_user:
                self.user_course_data = self.instance.get_enrollment_for(user)
            self.is_student = self.instance.is_student(user)
            self.is_assistant = self.instance.is_assistant(user)
            self.is_teacher = self.course.is_teacher(user)
            self.is_course_staff = self.is_teacher or self.is_assistant
            self.get_taggings = lambda: CachedStudent(instance, user.id).data['tag_slugs']
            self.url_without_language = remove_query_param_from_url(self.request.get_full_path(), 'hl')
            self.query_language = None
            self.user_language = None

            self.note(
                "course", "instance", "content", "user_course_data", "is_student", "is_assistant",
                "is_teacher", "is_course_staff", "get_taggings", "url_without_language",
                "query_language", "user_language"
            )

            # Try to find a language that is defined for this course instance
            # and apply it
            if self.instance.language:
                instance_languages = self.instance.language.strip('|').split('|')
                instance_def_language = instance_languages[0]
                instance_languages = set(instance_languages)

                languages = []
                if self.user_course_data and self.user_course_data.language:
                    languages.append(self.user_course_data.language)
                if is_real_user and user.userprofile.language:
                    languages.append(user.userprofile.language)
                languages.append(get_language())

                query_language = self.request.GET.get('hl')
                if query_language:
                    if query_language[:2] in instance_languages:
                        language = query_language
                        if languages:
                            self.user_language = languages[0]
                            if self.user_language[:2] != query_language[:2]:
                                self.query_language = query_language
                    else:
                        raise TranslationNotFound
                else:
                    for lang in languages:
                        if lang[:2] in instance_languages:
                            language = lang
                            break
                    else:
                        language = instance_def_language

                translation.activate(language)
Exemple #2
0
 def handle_exception(self, exc):
     if isinstance(exc, TranslationNotFound):
         instance_languages = self.instance.language.strip("|").split("|")
         url = remove_query_param_from_url(self.request.get_full_path(), 'hl')
         for i, lang in enumerate(instance_languages):
             instance_languages[i] = {"name": get_language_info(lang)['name'], "url": update_url_params(url, {'hl' : lang})}
         return render_to_response('404.html', {'error_msg': str(exc), 'languages': instance_languages}, status=404)
     return super().handle_exception(exc)
Exemple #3
0
    def post(self, request, *args, **kwargs):
        LANGUAGE_PARAMETER = 'language'

        next = remove_query_param_from_url(
            request.POST.get('next', request.GET.get('next')), 'hl')
        if ((next or not request.is_ajax())
                and not is_safe_url(url=next,
                                    allowed_hosts={request.get_host()},
                                    require_https=request.is_secure())):
            next = remove_query_param_from_url(
                request.META.get('HTTP_REFERER'), 'hl')
            next = next and unquote(next)  # HTTP_REFERER may be encoded.
            if not is_safe_url(url=next,
                               allowed_hosts={request.get_host()},
                               require_https=request.is_secure()):
                next = '/'
        response = HttpResponseRedirect(next) if next else HttpResponse(
            status=204)
        if request.method == 'POST':
            lang_code = request.POST.get(LANGUAGE_PARAMETER)
            if lang_code and check_for_language(lang_code):
                if next:
                    next_trans = translate_url(next, lang_code)
                    if next_trans != next:
                        response = HttpResponseRedirect(next_trans)
                if request.user.is_authenticated:
                    enrollment = self.user_course_data
                    if enrollment:
                        enrollment.language = lang_code
                        enrollment.save()
                    else:
                        userprofile = request.user.userprofile
                        userprofile.language = lang_code
                        userprofile.save()
                else:
                    if hasattr(request, 'session'):
                        request.session[LANGUAGE_SESSION_KEY] = lang_code
                    response.set_cookie(
                        settings.LANGUAGE_COOKIE_NAME,
                        lang_code,
                        max_age=settings.LANGUAGE_COOKIE_AGE,
                        path=settings.LANGUAGE_COOKIE_PATH,
                        domain=settings.LANGUAGE_COOKIE_DOMAIN,
                    )
                request.REQUEST_LANG = lang_code
        return response
Exemple #4
0
def localized_url(path, language=None):
    base_url = settings.BASE_URL
    if base_url.endswith('/'):
        base_url = base_url[:-1]
    path = remove_query_param_from_url(path, 'hl')
    if not language:
        language = settings.LANGUAGE_CODE.split('-')[0]
    path = update_url_params(path, {'hl': language})
    return base_url + path
Exemple #5
0
 def process_request(self, request):
     query_language = request.GET.get('hl')
     if query_language:
         language = query_language
         lang_codes = set(lang[0][:2] for lang in settings.LANGUAGES)
         if language[:2] not in lang_codes:
             url = remove_query_param_from_url(request.get_full_path(), 'hl')
             return render(request, '404.html', {'url_without_language': url}, status=404)
     elif hasattr(request, 'user') and request.user.is_authenticated and not request.user.is_anonymous:
         language = request.user.userprofile.language
     else:
         language = translation.get_language_from_request(request)
     language = language[:2]
     translation.activate(language)
     request.LANGUAGE_CODE = translation.get_language()