Example #1
0
class TweetButton(Tag):
    name = 'tweet_button'
    options = Options(
        Argument('text'),
        'link_to',
        Argument('obj', required=False),
    )

    def render_tag(self, context, text, obj):
        return render_to_string('twitter/tweet_button.html', {
            'BASE_URL': settings.BASE_URL,
            'text': text,
            'obj': obj,
        })
Example #2
0
class GardenMemberList(InclusionTag):
    options = Options(Argument('garden'), )
    template = 'farmingconcrete/garden_member_list.html'

    def get_garden_members(self, garden):
        if garden:
            return garden.gardenmembership_set.all()
        return []

    def get_context(self, context, garden):
        context.update({
            'members': self.get_garden_members(garden),
        })
        return context
Example #3
0
class RenderBundledMedia(Tag):
    name = 'render_bundled_media'

    options = Options(
        Argument('name'),
        parser_class=MediaParser,
    )

    def cache_get(self, key):
        packed_val = cache.get(key)
        if packed_val is None:
            return None
        val, refresh_time, refreshed = packed_val
        if (time.time() > refresh_time) and not refreshed:
            # Store the stale value while the cache
            # revalidates for another MINT_DELAY seconds.
            self.cache_set(key, val, timeout=MINT_DELAY, refreshed=True)
            return None
        return val

    def cache_set(self, key, val, timeout=REBUILD_TIMEOUT, refreshed=False):
        refresh_time = timeout + time.time()
        real_timeout = timeout + MINT_DELAY
        packed_val = (val, refresh_time, refreshed)
        return cache.set(key, packed_val, real_timeout)

    @property
    def nodelist(self):
        return self.blocks['nodelist']

    def render_tag(self, context, name, nodelist):
        request = context['request']
        rendered_contents = nodelist.render(context)
        content = request.media_holder[name].render()
        if settings.COMPRESS:
            if name == 'css':
                compressor = CssCompressor(content)
            elif name == 'js':
                compressor = JsCompressor(content)
            output = self.cache_get(compressor.cachekey)
            if output is None:
                try:
                    output = compressor.output()
                    self.cache_set(compressor.cachekey, output)
                except:
                    from traceback import format_exc
                    raise Exception(format_exc())
        else:
            output = content  # no compression
        return '%s\n%s' % (output, rendered_contents)
Example #4
0
class CMSEditableObjectBlock(CMSEditableObject):
    """
    Templatetag that links a content extracted from a generic django model
    to the model admin changeform.

    The rendered content is to be specified in the enclosed block.
    """
    name = 'render_model_block'
    options = Options(
        Argument('instance'),
        Argument('edit_fields', default=None, required=False),
        Argument('language', default=None, required=False),
        Argument('view_url', default=None, required=False),
        Argument('view_method', default=None, required=False),
        'as',
        Argument('varname', required=False, resolve=False),
        blocks=[('endrender_model_block', 'nodelist')],
    )

    def render_tag(self, context, **kwargs):
        """
        Renders the block and then inject the resulting HTML in the template
        context
        """
        context.push()
        template = self.get_template(context, **kwargs)
        data = self.get_context(context, **kwargs)
        data['content'] = mark_safe(kwargs['nodelist'].render(data))
        data['rendered_content'] = data['content']
        output = render_to_string(template, data)
        context.pop()
        if kwargs.get('varname'):
            context[kwargs['varname']] = output
            return ''
        else:
            return output

    def get_context(self, context, instance, edit_fields, language, view_url,
                    view_method, varname, nodelist):
        """
        Uses _get_empty_context and adds the `instance` object to the local
        context. Context here is to be intended as the context of the nodelist
        in the block.
        """
        extra_context = self._get_empty_context(context, instance, edit_fields,
                                                language, view_url,
                                                view_method)
        extra_context['instance'] = instance
        extra_context['render_model_block'] = True
        return extra_context
class GetGrid(AsTag):
    name = 'get_grid'
    options = Options(
        MultiValueArgument('keys', required=False, resolve=False),
        'as',
        Argument('varname', required=False, resolve=False, default="grid")
    )

    def get_value(self, context, keys):
        key = get_key(context, keys)

        grid, created = models.Grid.objects.get_or_create(key=key)

        return grid
Example #6
0
class RenderPlaceholder(Tag):
    name = 'render_placeholder'
    options = Options(
        Argument('placeholder'),
        Argument('width', default=None, required=False),
    )

    def render_tag(self, context, placeholder, width):
        request = context.get('request', None)
        if not request:
            return ''
        if not placeholder:
            return ''
        return safe(placeholder.render(context, width))
Example #7
0
class CMSToolbar(RenderBlock):
    name = 'cms_toolbar'

    options = Options(
        Argument('name', required=False
                 ),  # just here so sekizai thinks this is a RenderBlock
        parser_class=SekizaiParser,
    )

    def render_tag(self, context, name, nodelist):
        # render JS
        request = context.get('request', None)
        toolbar = getattr(request, 'toolbar', None)
        if toolbar:
            toolbar.init_toolbar(request)
            toolbar.populate()
        if request and 'cms-toolbar-login-error' in request.GET:
            context['cms_toolbar_login_error'] = request.GET[
                'cms-toolbar-login-error'] == '1'
        context['cms_version'] = __version__
        context['django_version'] = DJANGO_VERSION
        context['python_version'] = PYTHON_VERSION
        context['cms_edit_on'] = get_cms_setting('CMS_TOOLBAR_URL__EDIT_ON')
        context['cms_edit_off'] = get_cms_setting('CMS_TOOLBAR_URL__EDIT_OFF')
        if toolbar and toolbar.show_toolbar:
            language = toolbar.toolbar_language
            with force_language(language):
                # needed to populate the context with sekizai content
                render_to_string('cms/toolbar/toolbar_javascript.html',
                                 flatten_context(context))
                context['addons'] = mark_safe(toolbar.render_addons(context))
        else:
            language = None
        # render everything below the tag
        rendered_contents = nodelist.render(context)
        # sanity checks
        if not request:
            return rendered_contents
        if not toolbar:
            return rendered_contents
        if not toolbar.show_toolbar:
            return rendered_contents
        # render the toolbar content
        request.toolbar.post_template_populate()
        with force_language(language):
            addons = mark_safe(toolbar.post_template_render_addons(context))
            toolbar = render_to_string('cms/toolbar/toolbar.html',
                                       flatten_context(context))
        # return the toolbar content and the content below
        return '%s\n%s\n%s' % (toolbar, addons, rendered_contents)
Example #8
0
class BaseChart(BasePanel):
    name = 'chart'
    template = 'tags/chart.html'
    options = Options(
        Argument('container_id'),
        MultiKeywordArgument('kw', required=False),
        blocks=[('endchart', 'nodelist')],
    )
    DEFAULT_STYLES = 'min-width: 310px; height: 400px; margin: 0 auto'

    def get_panel_context(self, arguments):
        kw = arguments.pop('kw')
        arguments['style'] = kw.get('style', self.DEFAULT_STYLES)
        return arguments
Example #9
0
class Panel(BasePanel):
    name = 'panel'
    template = 'tags/panel.html'
    options = Options(
        Argument('title'),
        MultiKeywordArgument('kw', required=False),
        blocks=[('endpanel', 'nodelist')],
    )

    def get_panel_context(self, arguments):
        kw = arguments.pop('kw')
        arguments['state'] = kw.get('state', 'default')
        arguments['icon'] = kw.get('icon', 'fa-cube')
        return arguments
class Addtoblock(SekizaiTag):
    name = 'addtoblock'

    options = Options(
        Argument('name'),
        parser_class=AddtoblockParser,
    )

    def render_tag(self, context, name, nodelist):
        rendered_contents = nodelist.render(context)
        varname = getattr(settings, 'SEKIZAI_VARNAME',
                          'SEKIZAI_CONTENT_HOLDER')
        context[varname][name].append(rendered_contents)
        return ""
class MainMenuEmbodyId(MainMenu):
    name = 'main_menu_embody_id'
    options = Options(
        Argument('root_id', default=None, required=False),
        StringArgument(
            'template',
            default='bootstrap{}/menu/navbar.html'.format(BOOTSTRAP),
            required=False),
        IntegerArgument('offset', default=0, required=False),
        IntegerArgument('limit', default=100, required=False),
        StringArgument('namespace', default=None, required=False),
        Flag('embody_root', default=True, false_values=['skip_root']),
        Argument('next_page', default=None, required=False),
    )
Example #12
0
class CMSEditableObjectAddBlock(CMSEditableObject):
    """
    Templatetag that links arbitrary content to the addform for the specified
    model (based on the provided model instance).
    """
    name = 'render_model_add_block'
    options = Options(
        Argument('instance'),
        Argument('language', default=None, required=False),
        Argument('view_url', default=None, required=False),
        Argument('view_method', default=None, required=False),
        'as',
        Argument('varname', required=False, resolve=False),
        blocks=[('endrender_model_add_block', 'nodelist')],
    )

    def render_tag(self, context, **kwargs):
        """
        Renders the block and then inject the resulting HTML in the template
        context
        """
        context.push()
        template = self.get_template(context, **kwargs)
        data = self.get_context(context, **kwargs)
        data['content'] = kwargs['nodelist'].render(data)
        data['rendered_content'] = data['content']
        output = render_to_string(template, flatten_context(data))
        context.pop()
        if kwargs.get('varname'):
            context[kwargs['varname']] = output
            return ''
        else:
            return output

    def get_context(self, context, **kwargs):
        """
        Uses _get_empty_context and adds the `render_model_icon` variable.
        """
        instance = kwargs.pop('instance')
        if isinstance(instance, Model) and not instance.pk:
            instance.pk = 0
        kwargs.pop('varname')
        kwargs.pop('nodelist')
        extra_context = self._get_empty_context(context,
                                                instance,
                                                None,
                                                editmode=False,
                                                **kwargs)
        extra_context['render_model_add'] = True
        return extra_context
class MainMenu(ShowMenu):
    name = 'main_menu'

    options = Options(
        IntegerArgument('from_level', default=0, required=False),
        IntegerArgument('to_level', default=100, required=False),
        StringArgument('template', default='cms/bootstrap3/main-menu.html', required=False),
        StringArgument('namespace', default=None, required=False),
        StringArgument('root_id', default=None, required=False),
        Argument('next_page', default=None, required=False),
    )

    def get_context(self, context, from_level, to_level, template, namespace, root_id, next_page):
        return super(MainMenu, self).get_context(context, from_level, to_level, 100, 100, template, namespace, root_id, next_page)
Example #14
0
class TaskPairs(AsTag):
    options = Options(
        'as',
        Argument('varname', resolve=False, required=False),
    )

    def get_value(self, context):
        """Get tasks in pairs, useful for PDF pairing of tasks"""
        tasks = Task.objects.all().values_list('name', flat=True)
        for i in range(0, len(tasks), 2):
            try:
                yield (tasks[i], tasks[i + 1])
            except IndexError:
                yield (tasks[i], )
Example #15
0
class Products(InclusionTag):
    """
    Inclusion tag for displaying all products.
    """
    template = 'shop/templatetags/_products.html'
    options = Options(Argument('objects', resolve=True, required=False), )

    def get_context(self, context, objects):
        if objects is None:
            objects = Product.objects.filter(active=True)
        context.update({
            'products': objects,
        })
        return context
class EasyMapTag(InclusionTag):
    """
    The syntax:

    {% easy_map <address> [<width> <height>] [<zoom>] [using <template_name>] %}

    The "address" parameter can be an ``easy_maps.Address`` instance
    or a string describing it.  If an address is not found a new entry
    is created in the database.

    """
    name = 'easy_map'
    template = 'easy_maps/map.html'
    options = Options(
        Argument('address', resolve=True, required=True),
        Argument('width', required=False, default=None),
        Argument('height', required=False, default=None),
        IntegerArgument('zoom', required=False, default=None),
        'using',
        Argument('template_name', default=None, required=False),
    )

    def render_tag(self, context, **kwargs):
        params = dict((k, v) for k, v in kwargs.items()
                      if v and k not in ['template_name'])
        if 'address' in params and (len(params) == 2 or len(params) > 4):
            raise template.TemplateSyntaxError(
                "easy_map tag has the following syntax: "
                "{% easy_map <address> [<width> <height>] [zoom] [using <template_name>] %}"
            )

        if settings.EASY_MAPS_GOOGLE_KEY is None and settings.EASY_MAPS_GOOGLE_MAPS_API_KEY is None:
            raise ImproperlyConfigured(
                "easy_map tag requires EASY_MAPS_GOOGLE_KEY to be set in global settings "
                "because of the restrictions introduced in Google Maps API v3 by Google, Inc."
            )
        return super(EasyMapTag, self).render_tag(context, **kwargs)

    def get_template(self, context, **kwargs):
        return kwargs.get('template_name', None) or self.template

    def get_context(self, context, **kwargs):
        kwargs.update({'map': parse_address(kwargs.pop('address'))})
        if not kwargs.get('zoom', None):
            kwargs['zoom'] = settings.EASY_MAPS_ZOOM  # default value
        kwargs['language'] = settings.EASY_MAPS_LANGUAGE
        kwargs[
            'api_key'] = settings.EASY_MAPS_GOOGLE_KEY or settings.EASY_MAPS_GOOGLE_MAPS_API_KEY
        return kwargs
Example #17
0
class RenderPlaceholder(AsTag):
    """
    Render the content of the plugins contained in a placeholder.
    The result can be assigned to a variable within the template's context by using the `as` keyword.
    It behaves in the same way as the `PageAttribute` class, check its docstring for more details.
    """
    name = 'render_placeholder'
    options = Options(Argument('placeholder'),
                      Argument('width', default=None, required=False),
                      'language',
                      Argument('language', default=None, required=False), 'as',
                      Argument('varname', required=False, resolve=False))

    def _get_value(self, context, editable=True, **kwargs):
        request = context.get('request', None)
        placeholder = kwargs.get('placeholder')
        width = kwargs.get('width')
        nocache = kwargs.get('nocache', False)
        language = kwargs.get('language')
        if not request:
            return ''
        if not placeholder:
            return ''

        if isinstance(placeholder, string_types):
            placeholder = PlaceholderModel.objects.get(slot=placeholder)
        if not hasattr(request, 'placeholders'):
            request.placeholders = {}
        perms = (placeholder.has_change_permission(request)
                 or not placeholder.cache_placeholder)
        if not perms or placeholder.slot not in request.placeholders:
            request.placeholders[placeholder.slot] = (placeholder, perms)
        else:
            request.placeholders[placeholder.slot] = (
                placeholder, perms
                and request.placeholders[placeholder.slot][1])
        context = copy(context)
        return safe(
            placeholder.render(context,
                               width,
                               lang=language,
                               editable=editable,
                               use_cache=not nocache))

    def get_value_for_context(self, context, **kwargs):
        return self._get_value(context, editable=False, **kwargs)

    def get_value(self, context, **kwargs):
        return self._get_value(context, **kwargs)
Example #18
0
class LanguageChooser(InclusionTag):
    """
    Displays a language chooser
    - template: template used to render the language chooser
    """
    name = 'language_chooser'
    template = 'menu/dummy.html'

    options = Options(
        Argument('template', default=NOT_PROVIDED, required=False),
        Argument('i18n_mode', default='raw', required=False),
    )

    def get_context(self, context, template, i18n_mode):
        if template in MARKERS:
            _tmp = template
            if i18n_mode not in MARKERS:
                template = i18n_mode
            else:
                template = NOT_PROVIDED
            i18n_mode = _tmp
        if template is NOT_PROVIDED:
            template = "menu/language_chooser.html"
        if not i18n_mode in MARKERS:
            i18n_mode = 'raw'
        if 'request' not in context:
            # If there's an exception (500), default context_processors may not be called.
            return {'template': 'cms/content.html'}
        marker = MARKERS[i18n_mode]
        current_lang = get_language()
        site = Site.objects.get_current()
        request = context['request']

        if request.user.is_staff:
            languages = get_language_list(site_id=site.pk)
        else:
            languages = get_public_languages(site_id=site.pk)

        languages_info = []

        for language in languages:
            obj = get_language_object(language, site_id=site.pk)
            languages_info.append((obj['code'], marker(obj['name'],
                                                       obj['code'])))

        context['languages'] = languages_info
        context['current_language'] = current_lang
        context['template'] = template
        return context
class ProductTypeIcon(Tag):
    name = "product_type_icon"
    options = Options(
        Argument('product_type', resolve=True, required=True),
        Argument('tag', resolve=True, required=True),
    )

    def render_tag(self, context, product_type, tag):
        try:
            icon = product_type.icons.get(name=tag)
            return icon.image.url

        except Exception, error:
            return ApplicationSettings.DEFAULT_CATEGORY_IMAGE_URL.format(
                tag.lower())
Example #20
0
class SkillsShareds(AsTag):
    options = Options(
        'as',
        Argument('varname', resolve=False, required=False),
    )

    def get_value(self, context):
        shared = (
            'skills_shared',
            'concepts_shared',
            'projects_proposed',
            'ideas_to_learn',
            'intentions_to_collaborate',
        )
        return dict([(s, s.replace('_', ' ')) for s in shared])
Example #21
0
class RenderPlugin(Tag):
    name = 'render_plugin'
    options = Options(Argument('plugin'))

    def render_tag(self, context, plugin):
        if not plugin:
            return ''

        content_renderer = context['cms_content_renderer']
        content = content_renderer.render_plugin(
            instance=plugin,
            context=context,
            editable=content_renderer.user_is_on_edit_mode(),
        )
        return content
Example #22
0
class Paginate(Tag):
    """Paginate the given queryset, placing a Pager in the template context."""
    name = "paginate"
    options = Options(
        Argument("queryset"),
        "as",
        Argument("varname", resolve=False),
    )

    def render_tag(self, context, queryset, varname):
        """Place Pager for given ``queryset`` in context as ``varname``."""
        request = context["request"]
        pagesize, pagenum = pagination.from_request(request)
        context[varname] = pagination.Pager(queryset, pagesize, pagenum)
        return u""
Example #23
0
class PageTagsList(AsTag):
    name = 'page_tags'
    title = False

    options = Options(Argument('page_lookup'),
                      Argument('lang', required=False, default=None),
                      Argument('site', required=False, default=None), 'as',
                      Argument('varname', required=True, resolve=False))

    def get_value(self, context, page_lookup, lang, site):
        request = context.get('request', False)
        if not request:  # pragma: no cover
            return ''
        return get_page_tags_from_request(request, page_lookup, lang, site,
                                          self.title)
Example #24
0
class RenderPlugin(Tag):
    name = 'render_plugin'
    options = Options(Argument('plugin'))

    def render_tag(self, context, plugin):
        if not plugin:
            raise TemplateSyntaxError("Plugin is missing")

        content_renderer = context['cms_content_renderer']
        content = content_renderer.render_plugin(
            instance=plugin,
            context=context,
            editable=content_renderer.user_is_on_edit_mode(),
        )
        return content
Example #25
0
class JavascriptString(Tag):
    name = 'javascript_string'
    options = Options(
        blocks=[
            ('end_javascript_string', 'nodelist'),
        ]
    )

    def render_tag(self, context, **kwargs):
        try:
            from django.utils.html import escapejs
        except ImportError:
            from django.utils.text import javascript_quote as escapejs
        rendered = self.nodelist.render(context)
        return "'%s'" % escapejs(rendered.strip())
class IfCanDelete(Tag):
    name = 'ifcandelete'
    options = Options(
        Argument('metric'),
        blocks=[('endifcandelete', 'nodelist')],
    )

    def render_tag(self, context, metric, nodelist):
        user = context['user']
        meta = metric['model']._meta
        if user.has_perm(
                '%s.%s' %
            (meta.app_label, get_permission_codename('delete', meta))):
            return nodelist.render(context)
        return ''
class MetricContentType(AsTag):

    options = Options(
        Argument('metric', resolve=True, required=True),
        'for',
        Argument('model', resolve=True, required=False),
        'as',
        Argument('varname', resolve=False, required=False),
    )

    def get_value(self, context, metric, model):
        if model:
            app_name, model_name = model.split('.')
            return ContentType.objects.get_by_natural_key(app_name, model_name)
        return ContentType.objects.get_for_model(metric['model'])
Example #28
0
class GetRelatedCategories(AsTag):
    """
    A template tag to retrieve as a context variable, all the categories related via a
    CategoryPlugin to one or more of the pages targeted by a queryset or iterable.

    eg:
    {% get_related_category_pages pages as categories %}

    Keyword arguments:
        pages: a queryset of iterable targeting a group of cms pages.
    """

    options = Options(
        Argument("pages", required=True),
        "as",
        Argument("varname", required=True, resolve=False),
    )

    def get_value(self, context, **kwargs):
        """
        Get all categories related to either of the pages targeted by the queryset or
        iterator passed in argument.
        """
        current_page = context["current_page"]
        language = translation.get_language()

        selector = "category_plugins__cmsplugin_ptr__"
        filter_dict = {
            f"{selector:s}language": language,
            f"{selector:s}placeholder__page__publisher_is_draft":
            current_page.publisher_is_draft,
            f"{selector:s}placeholder__page__in": kwargs["pages"],
        }

        if context["current_page"].publisher_is_draft:
            query = Category.objects.filter(
                extended_object__publisher_is_draft=True,
                extended_object__in=Page.objects.filter(**filter_dict),
            )
        else:
            query = Category.objects.filter(
                extended_object__publisher_is_draft=False,
                extended_object__publisher_public__in=Page.objects.filter(
                    **filter_dict),
            )

        return (query.select_related("extended_object").order_by(
            "extended_object__node__path").distinct())
Example #29
0
class EasyMapTag(InclusionTag):
    """
    The syntax:

    {% easy_map <address> [<width> <height>] [<zoom>] [using <template_name>] %}

    The "address" parameter can be an ``easy_maps.Address`` instance or a string
    describing it.  If an address is not found a new entry is created
    in the database.

    """
    name = 'easy_map'
    template = 'easy_maps/map.html'
    options = Options(
        Argument('address', resolve=True, required=True),
        IntegerArgument('width', required=False, default=None),
        IntegerArgument('height', required=False, default=None),
        IntegerArgument('zoom', required=False, default=16),
        'using',
        Argument('template_name', default=None, required=False),
    )

    def render_tag(self, context, **kwargs):
        params = dict((k, v) for k, v in kwargs.items() if v is not None)
        if len(params.keys()) == 3 or len(params.keys()) > 5:
            raise template.TemplateSyntaxError(
                "easy_map tag has the following syntax: "
                "{% easy_map <address> [<width> <height>] [zoom] [using <template_name>] %}"
            )
        return super(EasyMapTag, self).render_tag(context, **kwargs)

    def get_template(self, context, **kwargs):
        return kwargs.get('template_name', None) or self.template

    def parse_address(self, address=None):
        if isinstance(address, Address):
            return address

        if not address:
            return Address(latitude=CENTER[0], longitude=CENTER[1])
        else:
            return Address.objects.get_or_create(address=address)[0]

        raise NotImplementedError

    def get_context(self, context, **kwargs):
        kwargs.update({'map': self.parse_address(kwargs.pop('address'))})
        return kwargs
class ShowPagesAroundPage(InclusionTag):
    """
    give the one level deep neighbour of a page
    """
    name = 'dju_show_pages_around_page'
    template = 'dju_page_thumbnail/dju_show_pages_around_page.html'

    options = Options(
        StringArgument(
            'template',
            default='dju_page_thumbnail/dju_show_pages_around_page.html',
            required=False), )

    def get_context(self, context, template):
        try:
            # If there's an exception (500), default context_processors may not be called.
            request = context['request']
        except KeyError:
            return {'template': 'menu/empty.html'}

        currentPage = request.current_page

        def get_info(page):
            try:
                imageurl = page.djupagethumbnail.image.url
            except:
                imageurl = ''
            return page.get_absolute_url(), page.get_title(), imageurl

        scanval = [('parent', [currentPage.get_parent()]),
                   ('siblings', currentPage.get_siblings()),
                   ('descendants', currentPage.get_descendants())]
        data = {}
        for datatype, objectslist in scanval:
            datalist = []
            for p in objectslist:
                abs_url, title, imageurl = get_info(p)
                datalist.append({
                    'abs_url': abs_url,
                    'title': title,
                    'imageurl': imageurl
                })
            data[datatype] = datalist
        try:
            context.update({'data': data, 'template': template})
        except:
            context = {'template': template}
        return context