def add_direction(value, arg=u"rtl_only"):
    """Adds direction to the element

    :arguments:
        arg
            * rtl_only: Add the direction only in case of a
              right-to-left language (default)
            * both: add the direction in both case
            * ltr_only: Add the direction only in case of a
              left-to-right language

    {{image_name|add_direction}} when image_name is 'start_arrow.png'
    results in 'start_arrow_rtl.png' in case of RTL language, and
    'start_arrow.png' or 'start_arrow_ltr.png' depends on `arg` value.

    """

    if arg == u'rtl_only':
        directions = (u'', u'_rtl')
    elif arg == u'both':
        directions = (u'_ltr', u'_rtl')
    elif arg == u'ltr_only':
        directions = (u'_ltr', u'')
    else:
        raise template.TemplateSyntaxError('add_direction can use arg with one of ["rtl_only", "both", "ltr_only"]')

    parts = value.rsplit('.', 1)
    if not len(parts):
        return value
    elif len(parts) == 1:
        return value + directions[translation.get_language_bidi()]
    else:
        return '.'.join((parts[0]+directions[translation.get_language_bidi()],parts[1]))
Example #2
0
    def render(self, name, value, attrs=None):
        # If a string reaches here (via a validation error on another
        # field) then just reconstruct the Geometry.
        if isinstance(value, six.string_types):
            value = self.deserialize(value)

        if value:
            # Check that srid of value and map match
            if value.srid != self.map_srid:
                try:
                    ogr = value.ogr
                    ogr.transform(self.map_srid)
                    value = ogr
                except gdal.OGRException as err:
                    logger.error(
                        "Error transforming geometry from srid '%s' to srid '%s' (%s)" % (
                            value.srid, self.map_srid, err)
                    )

        context = self.build_attrs(attrs,
            name=name,
            module='geodjango_%s' % name.replace('-', '_'),  # JS-safe
            serialized=self.serialize(value),
            geom_type=gdal.OGRGeomType(self.attrs['geom_type']),
            STATIC_URL=settings.STATIC_URL,
            LANGUAGE_BIDI=translation.get_language_bidi(),
        )
        return loader.render_to_string(self.template_name, context)
Example #3
0
    def get_context(self, name, value, attrs):
        context = super().get_context(name, value, attrs)
        # If a string reaches here (via a validation error on another
        # field) then just reconstruct the Geometry.
        if value and isinstance(value, str):
            value = self.deserialize(value)

        if value:
            # Check that srid of value and map match
            if value.srid and value.srid != self.map_srid:
                try:
                    ogr = value.ogr
                    ogr.transform(self.map_srid)
                    value = ogr
                except gdal.GDALException as err:
                    logger.error(
                        "Error transforming geometry from srid '%s' to srid '%s' (%s)",
                        value.srid, self.map_srid, err
                    )

        if attrs is None:
            attrs = {}

        build_attrs_kwargs = {
            'name': name,
            'module': 'geodjango_%s' % name.replace('-', '_'),  # JS-safe
            'serialized': self.serialize(value),
            'geom_type': gdal.OGRGeomType(self.attrs['geom_type']),
            'STATIC_URL': settings.STATIC_URL,
            'LANGUAGE_BIDI': translation.get_language_bidi(),
        }
        build_attrs_kwargs.update(attrs)
        context.update(self.build_attrs(self.attrs, build_attrs_kwargs))
        return context
Example #4
0
def i18n(request):
    from django.utils import translation
    return {
        'LANGUAGES': settings.LANGUAGES,
        'LANGUAGE_CODE': translation.get_language(),
        'LANGUAGE_BIDI': translation.get_language_bidi(),
    }
    def get_context(self, name, value, attrs=None, extra_context={}):
        # If a string reaches here (via a validation error on another
        # field) then just reconstruct the Geometry.
        if isinstance(value, six.text_type):
            try:
                value = geos.GEOSGeometry(value)
            except (geos.GEOSException, ValueError):
                value = None

            value = None

        # Defaulting the WKT value to a blank string
        wkt = ''
        if value:
            srid = self.map_srid
            if value.srid != srid:
                try:
                    ogr = value.ogr
                    ogr.transform(srid)
                    wkt = ogr.wkt
                except gdal.OGRException:
                    pass  # wkt left as an empty string
            else:
                wkt = value.wkt
        context = super(BaseGeometryWidget, self).get_context(name, wkt, attrs)
        context['module'] = 'map_%s' % name.replace('-', '_')
        context['name'] = name
        # Django >= 1.4 doesn't have ADMIN_MEDIA_PREFIX anymore, we must
        # rely on contrib.staticfiles.
        if hasattr(settings, 'ADMIN_MEDIA_PREFIX'):
            context['ADMIN_MEDIA_PREFIX'] = settings.ADMIN_MEDIA_PREFIX
        else:
            context['ADMIN_MEDIA_PREFIX'] = settings.STATIC_URL + 'admin/'
        context['LANGUAGE_BIDI'] = translation.get_language_bidi()
        return context
Example #6
0
 def get_context(self, name, value, attrs=None, extra_context={}):
     # Defaulting the WKT value
     wkt, location = '', None
     if value:
         try:
             location = Area.objects.get(pk=int(value))
             wkt = location.polygon.wkt
         except ObjectDoesNotExist:
             pass
     context = super(ChooseAreaWidget, self).get_context(name, wkt,
                                                         attrs)
     context['location'] = ""
     context['value_pk'] = ""
     if location:
         context['location'] = unicode(location)
         context['value_pk'] = location.pk
     context['wkt'] = wkt
     context['parent_table_name'] = '-'.join(name.split('-')[:-2] + ['group'])
     context['module'] = 'map_%s' % name.replace('-', '_')
     context['name'] = name
     # context['ADMIN_MEDIA_PREFIX'] = settings.ADMIN_MEDIA_PREFIX
     context['LANGUAGE_BIDI'] = translation.get_language_bidi()
     context['area_types'] = AreaType.objects.exclude(txt_idx='circle').all()
     context['available_locations'] = self.available_locations
     return context
Example #7
0
def marketing_link(name):
    """Returns the correct URL for a link to the marketing site
    depending on if the marketing site is enabled

    Since the marketing site is enabled by a setting, we have two
    possible URLs for certain links. This function is to decides
    which URL should be provided.
    """

    # link_map maps URLs from the marketing site to the old equivalent on
    # the Django site
    link_map = settings.MKTG_URL_LINK_MAP
    enable_mktg_site = microsite.get_value(
        'ENABLE_MKTG_SITE',
        settings.FEATURES.get('ENABLE_MKTG_SITE', False)
    )

    if enable_mktg_site and name in settings.MKTG_URLS:
        # special case for when we only want the root marketing URL
        if name == 'ROOT':
            return settings.MKTG_URLS.get('ROOT')

        if get_language_bidi():
            return settings.MKTG_URLS.get('ROOT') + settings.MKTG_URLS.get(name)
        else:
            return settings.MKTG_URLS.get('ROOT') + 'en/' + settings.MKTG_URLS.get(name)

    # only link to the old pages when the marketing site isn't on
    elif not enable_mktg_site and name in link_map:
        # don't try to reverse disabled marketing links
        if link_map[name] is not None:
            return reverse(link_map[name])
    else:
        log.debug("Cannot find corresponding link for name: %s", name)
        return '#'
Example #8
0
def i18n(request):
    return {
        'LANGUAGES': settings.LANGUAGES,
        'LANG': (settings.LANGUAGE_URL_MAP.get(translation.get_language())
                 or translation.get_language()),
        'DIR': 'rtl' if translation.get_language_bidi() else 'ltr',
    }
def bidi(request):
    """Adds to the context BiDi related variables

    LANGUAGE_DIRECTION -- Direction of current language ('ltr' or 'rtl')
    LANGUAGE_START -- Start of language layout ('right' for rtl, 'left'
                      for 'ltr')
    LANGUAGE_END -- End of language layout ('left' for rtl, 'right'
                      for 'ltr')
    LANGUAGE_MARKER -- Language marker entity ('‏' for rtl, '&lrm'
                       for ltr)

    """
    from django.utils import translation
    from django.utils.safestring import mark_safe

    if translation.get_language_bidi():
        extra_context = {
            'LANGUAGE_DIRECTION':'rtl',
            'LANGUAGE_START':'right',
            'LANGUAGE_END':'left',
            'LANGUAGE_MARKER': mark_safe('‏'),
        }
    else:
        extra_context = {
            'LANGUAGE_DIRECTION':'ltr',
            'LANGUAGE_START':'left',
            'LANGUAGE_END':'right',
            'LANGUAGE_MARKER': mark_safe('‎'),
        }

    return extra_context
def get_language_config():
    """
    Creates a language configuration for TinyMCE4 based on Django project settings

    :return: language- and locale-related parameters for TinyMCE 4
    :rtype: dict
    """
    config = {"language": get_language()[:2]}
    if get_language_bidi():
        config["directionality"] = "rtl"
    else:
        config["directionality"] = "ltr"
    if mce_settings.USE_SPELLCHECKER:
        from enchant import list_languages

        enchant_languages = list_languages()
        logger.debug("Enchant languages: {0}".format(enchant_languages))
        lang_names = []
        for lang, name in settings.LANGUAGES:
            lang = convert_language_code(lang)
            if lang not in enchant_languages:
                lang = lang[:2]
            if lang not in enchant_languages:
                logger.error("Missing {0} spellchecker dictionary!".format(lang))
                continue
            if config.get("spellchecker_language") is None:
                config["spellchecker_language"] = lang
            lang_names.append("{0}={1}".format(name, lang))
        config["spellchecker_languages"] = ",".join(lang_names)
    return config
Example #11
0
def _render_footer_html(request, show_openedx_logo, include_dependencies):
    """Render the footer as HTML.

    Arguments:
        show_openedx_logo (bool): If True, include the OpenEdX logo in the rendered HTML.
        include_dependencies (bool): If True, include JavaScript and CSS dependencies.

    Returns: unicode

    """
    bidi = "rtl" if translation.get_language_bidi() else "ltr"
    version = "edx" if settings.FEATURES.get("IS_EDX_DOMAIN") else "openedx"
    css_name = settings.FOOTER_CSS[version][bidi]

    context = {
        "hide_openedx_link": not show_openedx_logo,
        "footer_js_url": _footer_static_url(request, "js/footer-edx.js"),
        "footer_css_urls": _footer_css_urls(request, css_name),
        "bidi": bidi,
        "include_dependencies": include_dependencies,
    }

    return (
        render_to_response("footer-edx-v3.html", context)
        if settings.FEATURES.get("IS_EDX_DOMAIN", False)
        else render_to_response("footer.html", context)
    )
Example #12
0
 def get_context(self, change=None):
     """Return context for rendering mail"""
     result = {
         'LANGUAGE_CODE': get_language(),
         'LANGUAGE_BIDI': get_language_bidi(),
         'current_site_url': get_site_url(),
         'site_title': settings.SITE_TITLE,
         'notification_name': self.verbose,
     }
     if not change:
         return result
     result['change'] = change
     # Extract change attributes
     attribs = (
         'unit', 'translation', 'component', 'project', 'dictionary',
         'comment', 'suggestion', 'whiteboard', 'alert',
         'user',
         'target', 'old', 'details',
     )
     for attrib in attribs:
         result[attrib] = getattr(change, attrib)
     if result['translation']:
         result['translation_url'] = get_site_url(
             result['translation'].get_absolute_url()
         )
     return result
Example #13
0
    def get_context(self, name, value, attrs=None, extra_context={}):
        # If a string reaches here (via a validation error on another
        # field) then just reconstruct the Geometry.
        if isinstance(value, basestring):
            try:
                value = geos.GEOSGeometry(value)
            except (geos.GEOSException, ValueError):
                value = None

        if (value and
            value.geom_type.upper() != self.geom_type and
            self.geom_type != 'GEOMETRY'):
            value = None

        # Defaulting the WKT value to a blank string
        wkt = ''
        if value:
            srid = self.map_srid
            if value.srid != srid:
                try:
                    ogr = value.ogr
                    ogr.transform(srid)
                    wkt = ogr.wkt
                except gdal.OGRException:
                    pass  # wkt left as an empty string
            else:
                wkt = value.wkt
        context = super(BaseGeometryWidget, self).get_context(name, wkt, attrs)
        context['module'] = 'map_%s' % name.replace('-', '_')
        context['name'] = name
        context['ADMIN_MEDIA_PREFIX'] = settings.ADMIN_MEDIA_PREFIX
        context['LANGUAGE_BIDI'] = translation.get_language_bidi()
        return context
Example #14
0
def _render_footer_html(request, show_openedx_logo, include_dependencies, include_language_selector, language):
    """Render the footer as HTML.

    Arguments:
        show_openedx_logo (bool): If True, include the OpenEdX logo in the rendered HTML.
        include_dependencies (bool): If True, include JavaScript and CSS dependencies.
        include_language_selector (bool): If True, include a language selector with all supported languages.

    Returns: unicode

    """
    bidi = 'rtl' if translation.get_language_bidi() else 'ltr'
    css_name = settings.FOOTER_CSS['openedx'][bidi]

    context = {
        'hide_openedx_link': not show_openedx_logo,
        'footer_js_url': _footer_static_url(request, 'js/footer-edx.js'),
        'footer_css_urls': _footer_css_urls(request, css_name),
        'bidi': bidi,
        'include_dependencies': include_dependencies,
        'include_language_selector': include_language_selector,
        'language': language
    }

    return render_to_response("footer.html", context)
Example #15
0
def _render_footer_html(request, show_openedx_logo, include_dependencies):
    """Render the footer as HTML.

    Arguments:
        show_openedx_logo (bool): If True, include the OpenEdX logo in the rendered HTML.
        include_dependencies (bool): If True, include JavaScript and CSS dependencies.

    Returns: unicode

    """
    bidi = 'rtl' if translation.get_language_bidi() else 'ltr'
    version = 'edx' if settings.FEATURES.get('IS_EDX_DOMAIN') else 'openedx'
    css_name = settings.FOOTER_CSS[version][bidi]

    context = {
        'hide_openedx_link': not show_openedx_logo,
        'footer_js_url': _footer_static_url(request, 'js/footer-edx.js'),
        'footer_css_urls': _footer_css_urls(request, css_name),
        'bidi': bidi,
        'include_dependencies': include_dependencies,
    }

    return (
        render_to_response("footer-edx-v3.html", context)
        if settings.FEATURES.get("IS_EDX_DOMAIN", False)
        else render_to_response("footer.html", context)
    )
def i18n(request):
    from django.utils import translation
    context_extras = {}
    context_extras['LANGUAGES'] = settings.LANGUAGES
    context_extras['LANGUAGE_CODE'] = translation.get_language()
    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()

    return context_extras
Example #17
0
 def __init__(self, attrs={}, *args, **kwargs):
     attrs['data-placeholder'] = kwargs.pop('overlay', None)
     attrs['data-chosen-options'] = json.dumps(kwargs.pop('chosen_options', {'search_contains': True}))
     attrs['class'] = "class" in attrs and self.add_to_css_class(
         attrs['class'], 'chosen-select') or "chosen-select"
     if get_language_bidi():
         attrs['class'] = self.add_to_css_class(attrs['class'], 'chosen-rtl')
     super(ChosenWidgetMixin, self).__init__(attrs, *args, **kwargs)
Example #18
0
    def __init__(self, attrs={}, *args, **kwargs):

        attrs['data-placeholder'] = kwargs.pop('overlay', None)
        attrs['class'] = "class" in attrs and self.add_to_css_class(
            attrs['class'], 'chosen-select') or "chosen-select"
        if get_language_bidi():
            attrs['class'] = self.add_to_css_class(attrs['class'], 'chosen-rtl')
        super(ChosenWidgetMixin, self).__init__(attrs, *args, **kwargs)
Example #19
0
def i18n(request):
    from django.utils import translation

    return {
        "LANGUAGES": settings.LANGUAGES,
        "LANGUAGE_CODE": translation.get_language(),
        "LANGUAGE_BIDI": translation.get_language_bidi(),
    }
Example #20
0
def get_notification_email(language, email, notification,
                           context=None, info=None):
    """Render notification email."""
    context = context or {}
    headers = {}

    LOGGER.info(
        'sending notification %s on %s to %s',
        notification,
        info,
        email
    )

    with override('en' if language is None else language):
        # Template name
        context['subject_template'] = 'mail/{0}_subject.txt'.format(
            notification
        )
        context['LANGUAGE_CODE'] = get_language()
        context['LANGUAGE_BIDI'] = get_language_bidi()

        # Adjust context
        context['current_site_url'] = get_site_url()
        context['site_title'] = settings.SITE_TITLE

        # Render subject
        subject = render_to_string(
            context['subject_template'],
            context
        ).strip()

        # Render body
        html_body = render_to_string(
            'mail/{0}.html'.format(notification),
            context
        )
        body = html2text(html_body)

        # Define headers
        headers['Auto-Submitted'] = 'auto-generated'
        headers['X-AutoGenerated'] = 'yes'
        headers['Precedence'] = 'bulk'
        headers['X-Mailer'] = 'Weblate {0}'.format(VERSION)

        # List of recipients
        if email == 'ADMINS':
            emails = [a[1] for a in settings.ADMINS]
        else:
            emails = [email]

        # Return the mail content
        return {
            'subject': subject,
            'body': body,
            'to': emails,
            'headers': headers,
            'html_body': html_body,
        }
Example #21
0
    def get_context(self, name, value, attrs=None, extra_context={}):
        # If a string reaches here (via a validation error on another
        # field) then just reconstruct the Geometry.
        if isinstance(value, six.text_type):
            try:
                value = geos.GEOSGeometry(value)
            except (geos.GEOSException, ValueError):
                value = None

        if (
            value and value.geom_type.upper() != self.geom_type and
            self.geom_type != 'GEOMETRY'
        ):
            value = None

        # Defaulting the WKT value to a blank string
        wkt = ''
        geojson = ''
        if value:
            srid = self.map_srid
            if not value.srid:
                # If we're processing a form with errors, for some reason the
                # SRID doesn't get set on the value, and the below
                # ogr.transform always throws an exception (presumably because
                # you can't transform from no SRID to self.map_srid). This just
                # assumes it /should/ have been set the same as self.map_srid
                # and proceeds appropriately.
                ogr = value.ogr
                value.srid = srid
                wkt = ogr.wkt
                geojson = ogr.geojson
            elif value.srid != srid:
                try:
                    ogr = value.ogr
                    ogr.transform(srid)
                    wkt = ogr.wkt
                    geojson = ogr.geojson
                except gdal.OGRException:
                    pass  # wkt left as an empty string
            else:
                wkt = value.wkt
                geojson = value.geojson
        if hasattr(self, 'as_geojson') and self.as_geojson:
            context = super(BaseGeometryWidget, self).get_context(
                name, geojson, attrs)
        else:
            context = super(BaseGeometryWidget, self).get_context(
                name, wkt, attrs)
        context['module'] = 'map_%s' % name.replace('-', '_')
        context['name'] = name
        # Django >= 1.4 doesn't have ADMIN_MEDIA_PREFIX anymore, we must
        # rely on contrib.staticfiles.
        if hasattr(settings, 'ADMIN_MEDIA_PREFIX'):
            context['ADMIN_MEDIA_PREFIX'] = settings.ADMIN_MEDIA_PREFIX
        else:
            context['ADMIN_MEDIA_PREFIX'] = settings.STATIC_URL + 'admin/'
        context['LANGUAGE_BIDI'] = translation.get_language_bidi()
        return context
Example #22
0
def i18n(request):
    return {
        'LANGUAGES':
        get_language_mapping(),
        'LANG': (settings.LANGUAGE_URL_MAP.get(translation.get_language())
                 or translation.get_language()),
        'DIR':
        'rtl' if translation.get_language_bidi() else 'ltr',
    }
Example #23
0
def i18n(request):
    from django.utils import translation

    context_extras = {}
    context_extras['LANGUAGES'] = settings.LANGUAGES
    context_extras['LANGUAGE_CODE'] = translation.get_language()
    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()

    return context_extras
Example #24
0
def render_dir_rtl(context):
    __M_caller = context.caller_stack._push_frame()
    try:
        __M_writer = context.writer()

        return 'rtl' if get_language_bidi() else 'ltr'

        return ''
    finally:
        context.caller_stack._pop_frame()
def i18n(request):
    lang_url_map = settings.LANGUAGE_URL_MAP
    return {
        'LANGUAGES':
        settings.LANGUAGES,
        'LANG': (lang_url_map.get(translation.get_language())
                 or translation.get_language()),
        'DIR':
        'rtl' if translation.get_language_bidi() else 'ltr',
    }
 def get_context_data(self, *args, **kwargs):
     context = super().get_context_data(*args, **kwargs)
     context['LANGUAGE_BIDI'] = translation.get_language_bidi()
     language_form_kwargs = self.get_language_form_kwargs()
     if self.translations_enabled:
         context['language_switcher'] = {
             'show': True,
             'form': self.language_form_class(**language_form_kwargs),
         }
     return context
Example #27
0
def bidi(request):
    """Adds to the context BiDi related variables

    LANGUAGE_DIRECTION -- Direction of current language ('ltr' or 'rtl')
    """
    if translation.get_language_bidi():
        extra_context = { 'LANGUAGE_DIRECTION':'rtl', }
    else:
        extra_context = { 'LANGUAGE_DIRECTION':'ltr', }
    return extra_context
Example #28
0
def i18n(request):
    lang_url_map = settings.LANGUAGE_URL_MAP
    return {
        "LANGUAGES":
        settings.LANGUAGES,
        "LANG": (lang_url_map.get(translation.get_language())
                 or translation.get_language()),
        "DIR":
        "rtl" if translation.get_language_bidi() else "ltr",
    }
Example #29
0
 def get_meta_data(self):
     model = registry.get_ra_model_by_name(self.kwargs['base_model'])
     verbose_name = model._meta.verbose_name
     verbose_name_plural = model._meta.verbose_name_plural
     is_bidi = get_language_bidi()
     if is_bidi:
         page_title = '%s %s' % (ugettext('reports'), model._meta.verbose_name_plural)
     else:
         page_title = '%s %s' % (model._meta.verbose_name_plural, ugettext('reports'))
     opts = model._meta
     return verbose_name, verbose_name_plural, page_title, opts
Example #30
0
 def set_filter_form(self):
     filter_type = self.request.GET.get('filter', None)
     if filter_type == 'time':
         return YearForm(initial={'all': True, 'filter': filter_type})
     elif filter_type == 'location':
         return LocationForm(initial={
             'all': True,
             'filter': filter_type
         },
                             bidi=translation.get_language_bidi())
     return None
Example #31
0
def send_notification(notification, recipients, **kwargs):
    if not recipients:
        return

    # HTML to text conversion
    html2text = HTML2Text(bodywidth=78)
    html2text.unicode_snob = True
    html2text.ignore_images = True
    html2text.pad_tables = True

    # Logos
    images = []
    for name in ("email-logo.png", "email-logo-footer.png"):
        filename = os.path.join(settings.STATIC_ROOT, name)
        with open(filename, "rb") as handle:
            image = MIMEImage(handle.read())
        image.add_header("Content-ID", "<{}@cid.weblate.org>".format(name))
        image.add_header("Content-Disposition", "inline", filename=name)
        images.append(image)

    # Context and subject
    context = {
        "LANGUAGE_CODE": get_language(),
        "LANGUAGE_BIDI": get_language_bidi(),
    }
    context.update(kwargs)
    subject = render_to_string("mail/{0}_subject.txt".format(notification),
                               context).strip()
    context["subject"] = subject

    # Render body
    body = render_to_string("mail/{0}.html".format(notification),
                            context).strip()

    # Prepare e-mail
    email = EmailMultiAlternatives(
        subject,
        html2text.handle(body),
        "*****@*****.**",
        recipients,
    )
    email.mixed_subtype = "related"
    for image in images:
        email.attach(image)
    email.attach_alternative(body, "text/html")
    # Include invoice PDF if exists
    if "invoice" in kwargs:
        with open(kwargs["invoice"].pdf_path, "rb") as handle:
            email.attach(
                os.path.basename(kwargs["invoice"].pdf_path),
                handle.read(),
                "application/pdf",
            )
    email.send()
    def css_dependencies():
        """
        Returns list of CSS files that this XBlock depends on.

        The helper function that it uses to obtain the list of CSS files
        works in conjunction with the Django pipeline to ensure that in development mode
        the files are loaded individually, but in production just the single bundle is loaded.
        """
        if get_language_bidi():
            return get_css_dependencies('style-inline-discussion-rtl')
        else:
            return get_css_dependencies('style-inline-discussion')
Example #33
0
    def css_dependencies(self):
        """
        Returns list of CSS files that this view depends on.

        The helper function that it uses to obtain the list of CSS files
        works in conjunction with the Django pipeline to ensure that in development mode
        the files are loaded individually, but in production just the single bundle is loaded.
        """
        if get_language_bidi():
            return self.get_css_dependencies('style-learner-dashboard-rtl')
        else:
            return self.get_css_dependencies('style-learner-dashboard')
def i18n(request):
    context_extras = {}
    context_extras['LANGUAGES'] = settings.LANGUAGES
    if hasattr(request, 'LANGUAGE_CODE'):
        context_extras['LANGUAGE_CODE'] = request.LANGUAGE_CODE
    else:
        context_extras['LANGUAGE_CODE'] = settings.LANGUAGE_CODE

    from django.utils import translation
    context_extras['LANGUAGE_BIDI'] = translation.get_language_bidi()

    return context_extras
Example #35
0
    def css_dependencies(self):
        """
        Returns list of CSS files that this view depends on.

        The helper function that it uses to obtain the list of CSS files
        works in conjunction with the Django pipeline to ensure that in development mode
        the files are loaded individually, but in production just the single bundle is loaded.
        """
        if get_language_bidi():
            return self.get_css_dependencies('style-learner-dashboard-rtl')
        else:
            return self.get_css_dependencies('style-learner-dashboard')
Example #36
0
    def css_dependencies():
        """
        Returns list of CSS files that this XBlock depends on.

        The helper function that it uses to obtain the list of CSS files
        works in conjunction with the Django pipeline to ensure that in development mode
        the files are loaded individually, but in production just the single bundle is loaded.
        """
        if get_language_bidi():
            return get_css_dependencies('style-inline-discussion-rtl')
        else:
            return get_css_dependencies('style-inline-discussion')
Example #37
0
def get_notification_email(language,
                           email,
                           notification,
                           context=None,
                           info=None):
    """Render notification email."""
    context = context or {}
    headers = {}

    LOGGER.info('sending notification %s on %s to %s', notification, info,
                email)

    with override('en' if language is None else language):
        # Template name
        context['subject_template'] = 'mail/{0}_subject.txt'.format(
            notification)
        context['LANGUAGE_CODE'] = get_language()
        context['LANGUAGE_BIDI'] = get_language_bidi()

        # Adjust context
        context['current_site_url'] = get_site_url()
        context['site_title'] = settings.SITE_TITLE

        # Render subject
        subject = render_to_string(context['subject_template'],
                                   context).strip()

        # Render body
        html_body = render_to_string('mail/{0}.html'.format(notification),
                                     context)
        body = html2text(html_body)

        # Define headers
        headers['Auto-Submitted'] = 'auto-generated'
        headers['X-AutoGenerated'] = 'yes'
        headers['Precedence'] = 'bulk'
        headers['X-Mailer'] = 'Weblate {0}'.format(VERSION)

        # List of recipients
        if email == 'ADMINS':
            emails = [a[1] for a in settings.ADMINS]
        else:
            emails = [email]

        # Return the mail content
        return {
            'subject': subject,
            'body': body,
            'to': emails,
            'headers': headers,
            'html_body': html_body,
        }
Example #38
0
def i18n(request):
    """Add current locale and language settings to the context."""
    requested_lang = get_language()
    actual_lang = settings.LANGUAGE_MAP.get(requested_lang, requested_lang)

    return {
        'LANGUAGES': settings.LANGUAGES,
        'LANG_SHORT': f'{actual_lang}'[:2],
        'LANG': actual_lang,
        'LANG_LOWER': f'{actual_lang}'.lower(),
        'LOCALE': to_locale(get_language()),
        'DIR': 'rtl' if get_language_bidi() else 'ltr',
    }
Example #39
0
def render_to_pdf(template_name, pdf_filename=None, template_values=None, css_sheets=None):
    context_extras = {'LANGUAGES': settings.LANGUAGES, 'LANGUAGE_CODE': translation.get_language(),
                      'LANGUAGE_BIDI': translation.get_language_bidi()}
    template_values.update(context_extras)
    html_content = render_to_string(template_name, template_values or {})
    css_objs = [CSS(filename=finders.find(x)) for x in css_sheets] if css_sheets else []
    html_obj = HTML(string=html_content)
    if pdf_filename is None:
        with tempfile.NamedTemporaryFile() as n:
            pdf_filename = n.name

    html_obj.write_pdf(pdf_filename, stylesheets=css_objs)
    return pdf_filename
Example #40
0
    def css_dependencies(self):
        """
        Returns list of CSS files that this view depends on.

        The helper function that it uses to obtain the list of CSS files
        works in conjunction with the Django pipeline to ensure that in development mode
        the files are loaded individually, but in production just the single bundle is loaded.
        """
        is_right_to_left = get_language_bidi()

        css_file = BOOTSTRAP_DISCUSSION_CSS_PATH
        if is_right_to_left:
            css_file = css_file.replace('.css', '-rtl.css')
        return [css_file]
Example #41
0
    def field_choices(self, field, request, model_admin):
        tree_level_indent = getattr(model_admin, 'tree_level_indent',
                                    self.tree_level_indent)
        language_bidi = get_language_bidi()
        initial_choices = field.get_choices(include_blank=False)
        pks = [pk for pk, val in initial_choices]
        models = field.related_model._default_manager.filter(pk__in=pks)
        levels_dict = {model.pk: model.get_depth() for model in models}
        choices = []
        for pk, val in initial_choices:
            choices.append((pk, val, 'right' if language_bidi else 'left',
                            tree_level_indent * levels_dict[pk]))

        return choices
Example #42
0
def bidi(request):
    """Adds to the context BiDi related variables

    LANGUAGE_DIRECTION -- Direction of current language ('ltr' or 'rtl')
    """
    if translation.get_language_bidi():
        extra_context = {
            'LANGUAGE_DIRECTION': 'rtl',
        }
    else:
        extra_context = {
            'LANGUAGE_DIRECTION': 'ltr',
        }
    return extra_context
Example #43
0
 def field_choices(self, field, request, model_admin):
     mptt_level_indent = getattr(model_admin, 'mptt_level_indent', self.mptt_level_indent)
     language_bidi = get_language_bidi()
     initial_choices = field.get_choices(include_blank=False)
     pks = [pk for pk, val in initial_choices]
     models = field.related_model._default_manager.filter(pk__in=pks)
     levels_dict = {model.pk: getattr(model, model._mptt_meta.level_attr) for model in models}
     choices = []
     for pk, val in initial_choices:
         padding_style = ' style="padding-%s:%spx"' % (
             'right' if language_bidi else 'left',
             mptt_level_indent * levels_dict[pk])
         choices.append((pk, val, mark_safe(padding_style)))
     return choices
Example #44
0
def tenant_css_overrides_file():
    """
    Django template tag that outputs the css import for a:
    {% tenant_css_overrides_file %}
    """
    if get_language_bidi():
        file_path = configuration_helpers.get_value(
            'css_overrides_file_rtl',
            configuration_helpers.get_value('css_overrides_file'))
    else:
        file_path = configuration_helpers.get_value('css_overrides_file')

    if file_path is not None:
        return "<link href='{}' rel='stylesheet' type='text/css'>".format(
            static(file_path))
    else:
        return ""
Example #45
0
def microsite_css_overrides_file():
    """
    Django template tag that outputs the css import for a:
    {% microsite_css_overrides_file %}
    """
    file_path = microsite.get_value('css_overrides_file', None)
    if get_language_bidi():
        file_path = microsite.get_value(
            'css_overrides_file_rtl',
            microsite.get_value('css_overrides_file')
        )
    else:
        file_path = microsite.get_value('css_overrides_file')

    if file_path is not None:
        return "<link href='{}' rel='stylesheet' type='text/css'>".format(static(file_path))
    else:
        return ""
Example #46
0
def microsite_css_overrides_file():
    """
    Django template tag that outputs the css import for a:
    {% microsite_css_overrides_file %}
    """
    file_path = microsite.get_value('css_overrides_file', None)
    if get_language_bidi():
        file_path = microsite.get_value(
            'css_overrides_file_rtl',
            microsite.get_value('css_overrides_file')
        )
    else:
        file_path = microsite.get_value('css_overrides_file')

    if file_path is not None:
        return "<link href='{}' rel='stylesheet' type='text/css'>".format(static(file_path))
    else:
        return ""
Example #47
0
    def css_dependencies(self):
        """
        Returns list of CSS files that this view depends on.

        The helper function that it uses to obtain the list of CSS files
        works in conjunction with the Django pipeline to ensure that in development mode
        the files are loaded individually, but in production just the single bundle is loaded.
        """
        is_right_to_left = get_language_bidi()
        if USE_BOOTSTRAP_FLAG.is_enabled():
            css_file = BOOTSTRAP_DISCUSSION_CSS_PATH
            if is_right_to_left:
                css_file = css_file.replace('.css', '-rtl.css')
            return [css_file]
        elif is_right_to_left:
            return self.get_css_dependencies('style-discussion-main-rtl')
        else:
            return self.get_css_dependencies('style-discussion-main')
Example #48
0
    def get_context(self, name, value, attrs=None, extra_context={}):
        # If a string reaches here (via a validation error on another
        # field) then just reconstruct the Geometry.
        if isinstance(value, six.text_type):
            try:
                value = geos.GEOSGeometry(value)
            except (geos.GEOSException, ValueError):
                value = None

        if (
            value and value.geom_type.upper() != self.geom_type and
            self.geom_type != 'GEOMETRY'
        ):
            value = None

        # Defaulting the WKT value to a blank string
        wkt = ''
        if value:
            srid = self.map_srid
            if value.srid != srid:
                try:
                    ogr = value.ogr
                    ogr.transform(srid)
                    wkt = ogr.wkt
                except gdal.OGRException:
                    pass  # wkt left as an empty string
            else:
                wkt = value.wkt
        context = super(BaseGeometryWidget, self).get_context(name, wkt, attrs)
        context['module'] = 'map_%s' % name.replace('-', '_')
        context['name'] = name

        # Deprecated, we will remove this in a future release, it's no longer
        # used. But we keep it here for now as it's documented in
        # docs/geodjango.rst

        # Django >= 1.4 doesn't have ADMIN_MEDIA_PREFIX anymore, we must
        # rely on contrib.staticfiles.
        if hasattr(settings, 'ADMIN_MEDIA_PREFIX'):
            context['ADMIN_MEDIA_PREFIX'] = settings.ADMIN_MEDIA_PREFIX
        else:
            context['ADMIN_MEDIA_PREFIX'] = settings.STATIC_URL + 'admin/'
        context['LANGUAGE_BIDI'] = translation.get_language_bidi()
        return context
Example #49
0
 def get_context(self,
                 change=None,
                 subscription=None,
                 extracontext=None,
                 changes=None):
     """Return context for rendering mail."""
     result = {
         "LANGUAGE_CODE": get_language(),
         "LANGUAGE_BIDI": get_language_bidi(),
         "current_site_url": get_site_url(),
         "site_title": settings.SITE_TITLE,
         "notification_name": self.verbose,
     }
     if changes is not None:
         result["changes"] = changes
     if subscription is not None:
         result["unsubscribe_nonce"] = TimestampSigner().sign(
             subscription.pk)
     if extracontext:
         result.update(extracontext)
     if change:
         result["change"] = change
         # Extract change attributes
         attribs = (
             "unit",
             "translation",
             "component",
             "project",
             "glossary_term",
             "comment",
             "suggestion",
             "announcement",
             "alert",
             "user",
             "target",
             "old",
             "details",
         )
         for attrib in attribs:
             result[attrib] = getattr(change, attrib)
     if result.get("translation"):
         result["translation_url"] = get_site_url(
             result["translation"].get_absolute_url())
     return result
Example #50
0
def get_notification_emails(language,
                            recipients,
                            notification,
                            context=None,
                            info=None):
    """Render notification email."""
    context = context or {}
    headers = {}

    LOGGER.info("sending notification %s on %s to %s", notification, info,
                ", ".join(recipients))

    with override("en" if language is None else language):
        # Template name
        context["subject_template"] = "mail/{0}_subject.txt".format(
            notification)
        context["LANGUAGE_CODE"] = get_language()
        context["LANGUAGE_BIDI"] = get_language_bidi()

        # Adjust context
        context["current_site_url"] = get_site_url()
        context["site_title"] = settings.SITE_TITLE

        # Render subject
        subject = render_to_string(context["subject_template"],
                                   context).strip()
        context["subject"] = subject

        # Render body
        body = render_to_string("mail/{0}.html".format(notification), context)

        # Define headers
        headers["Auto-Submitted"] = "auto-generated"
        headers["X-AutoGenerated"] = "yes"
        headers["Precedence"] = "bulk"
        headers["X-Mailer"] = USER_AGENT

        # Return the mail content
        return [{
            "subject": subject,
            "body": body,
            "address": address,
            "headers": headers
        } for address in recipients]
Example #51
0
def get_notification_emails(language,
                            recipients,
                            notification,
                            context=None,
                            info=None):
    """Render notification email."""
    context = context or {}
    headers = {}

    LOGGER.info('sending notification %s on %s to %s', notification, info,
                ', '.join(recipients))

    with override('en' if language is None else language):
        # Template name
        context['subject_template'] = 'mail/{0}_subject.txt'.format(
            notification)
        context['LANGUAGE_CODE'] = get_language()
        context['LANGUAGE_BIDI'] = get_language_bidi()

        # Adjust context
        context['current_site_url'] = get_site_url()
        context['site_title'] = settings.SITE_TITLE

        # Render subject
        subject = render_to_string(context['subject_template'],
                                   context).strip()
        context['subject'] = subject

        # Render body
        body = render_to_string('mail/{0}.html'.format(notification), context)

        # Define headers
        headers['Auto-Submitted'] = 'auto-generated'
        headers['X-AutoGenerated'] = 'yes'
        headers['Precedence'] = 'bulk'
        headers['X-Mailer'] = 'Weblate {0}'.format(VERSION)

        # Return the mail content
        return [{
            'subject': subject,
            'body': body,
            'address': address,
            'headers': headers
        } for address in recipients]
Example #52
0
def kolibri_language_globals(context):
    lang_dir = "rtl" if get_language_bidi() else "ltr"
    js = """
    <script>
      var languageCode = '{lang_code}';
      var languageDir = '{lang_dir}';
      var languages = JSON.parse('{languages}');
    </script>
    """.format(
        lang_code=get_language(),
        lang_dir=lang_dir,
        languages=json.dumps({code: {
            # Format to match the schema of the content Language model
            'id': code,
            'lang_name': name,
            'lang_direction': get_language_info(code)['bidi']
        } for code, name in settings.LANGUAGES}),
    )
    return mark_safe(js)
Example #53
0
def get_language_config():
    """
    Creates a language configuration for TinyMCE4 based on Django project settings

    :return: language- and locale-related parameters for TinyMCE 4
    :rtype: dict
    """
    language_code = convert_language_code(get_language()
                                          or settings.LANGUAGE_CODE)
    if not language_file_exists(language_code):
        language_code = language_code[:2]
        if not language_file_exists(language_code):
            # Fall back to English if Tiny MCE 4 does not have required translation
            language_code = 'en'
    config = {'language': language_code}
    if get_language_bidi():
        config['directionality'] = 'rtl'
    else:
        config['directionality'] = 'ltr'
    if mce_settings.USE_SPELLCHECKER:
        try:
            from enchant import list_languages
        except ImportError as ex:
            raise ImportError(
                'To use spellchecker you need to install pyenchant first!'
            ).with_traceback(ex.__traceback__)
        enchant_languages = list_languages()
        if settings.DEBUG:
            logger.info('Enchant languages: {0}'.format(enchant_languages))
        lang_names = []
        for lang, name in settings.LANGUAGES:
            lang = convert_language_code(lang)
            if lang not in enchant_languages:
                lang = lang[:2]
            if lang not in enchant_languages:
                logger.error(
                    'Missing {0} spellchecker dictionary!'.format(lang))
                continue
            if config.get('spellchecker_language') is None:
                config['spellchecker_language'] = lang
            lang_names.append('{0}={1}'.format(name, lang))
        config['spellchecker_languages'] = ','.join(lang_names)
    return config
Example #54
0
def get_language_config():
    """
    Creates a language configuration for TinyMCE4 based on Django project settings

    :return: language- and locale-related parameters for TinyMCE 4
    :rtype: dict
    """
    language_code = convert_language_code(get_language()
                                          or settings.LANGUAGE_CODE)
    if not language_file_exists(language_code):
        language_code = language_code[:2]
        if not language_file_exists(language_code):
            # Fall back to English if Tiny MCE 4 does not have required translation
            language_code = 'en'
    config = {'language': language_code}
    if get_language_bidi():
        config['directionality'] = 'rtl'
    else:
        config['directionality'] = 'ltr'
    return config
Example #55
0
 def get_context(self, name, value, attrs=None, extra_context={}):
     # Defaulting the WKT value to a blank string
     wkt, location = '', None
     if value:
         try:
             location = Location.objects.get(pk=int(value))
             wkt = location.point.wkt
         except ObjectDoesNotExist:
             pass
     context = super(ChooseLocationWidget, self).get_context(name, wkt,
                                                             attrs)
     context['location'] = ""
     if location:
         context['location'] = unicode(location)
     context['attrs']['value'] = wkt
     context['module'] = 'map_%s' % name.replace('-', '_')
     context['name'] = name
     # context['ADMIN_MEDIA_PREFIX'] = settings.ADMIN_MEDIA_PREFIX
     context['LANGUAGE_BIDI'] = translation.get_language_bidi()
     return context
Example #56
0
    def get_context(self, name, value, attrs=None):
        # If a string reaches here (via a validation error on another
        # field) then just reconstruct the Geometry.
        if isinstance(value, six.string_types):
            value = self.deserialize(value)

        if value:
            # Check that srid of value and map match
            if value.srid != self.map_srid:
                try:
                    ogr = value.ogr
                    ogr.transform(self.map_srid)
                    value = ogr
                except gdal.GDALException as err:
                    logger.error(
                        "Error transforming geometry from srid '%s' to srid "
                        "'%s' (%s)", value.srid, self.map_srid, err)

        if not attrs:
            attrs = {}
        attrs.update({
            "name": name,
            "module": 'geodjango_%s' % name.replace('-', '_'),  # JS-safe
            "serialized": self.serialize(value),
            "geom_type": gdal.OGRGeomType(self.attrs['geom_type']),
            "STATIC_URL": settings.STATIC_URL,
            "LANGUAGE_BIDI": translation.get_language_bidi(),
        })


        context = self.build_attrs(
            self.attrs or {},
            attrs
        )

        # fallback if no id
        if 'id' not in context:
            context['id'] = name

        return context
Example #57
0
def _render_footer_html(request, show_openedx_logo, include_dependencies):
    """Render the footer as HTML.

    Arguments:
        show_openedx_logo (bool): If True, include the OpenEdX logo in the rendered HTML.
        include_dependencies (bool): If True, include JavaScript and CSS dependencies.

    Returns: unicode

    """
    bidi = 'rtl' if translation.get_language_bidi() else 'ltr'
    css_name = settings.FOOTER_CSS['openedx'][bidi]

    context = {
        'hide_openedx_link': not show_openedx_logo,
        'footer_js_url': _footer_static_url(request, 'js/footer-edx.js'),
        'footer_css_urls': _footer_css_urls(request, css_name),
        'bidi': bidi,
        'include_dependencies': include_dependencies,
    }

    return render_to_response("footer.html", context)
Example #58
0
def kolibri_language_globals(context):
    lang_dir = "rtl" if get_language_bidi() else "ltr"
    js = """
    <script>
      var languageCode = '{lang_code}';
      var languageDir = '{lang_dir}';
      var languages = JSON.parse('{languages}');
    </script>
    """.format(
        lang_code=get_language(),
        lang_dir=lang_dir,
        languages=json.dumps({
            code: {
                # Format to match the schema of the content Language model
                'id': code,
                'lang_name': name,
                'lang_direction': get_language_info(code)['bidi']
            }
            for code, name in settings.LANGUAGES
        }),
    )
    return mark_safe(js)