Exemple #1
0
def render_collapsible(lst,
                       item_role='collapsible-item',
                       title=None,
                       expanded=False,
                       **kwargs):
    """
    Renders a queryset or list of objects

    Args:
        lst:
            List or queryset of objects inside the collapsible list.
        item_role:
            Role assigned to each element in the list. Defaults to
            'collapsible-item'.
        title (bool):
            Title in which the list of object is displayed.
        expanded (str):
            If true, start list in the "expanded" state.
    """
    if title is None:
        if isinstance(lst, QuerySet):
            title = title.model._meta.verbose_name_plural
        else:
            raise TypeError('must provide an explicit title!')

    data = [render(x, item_role, **kwargs) for x in lst]
    random_id = str(uuid.uuid4())
    display = 'block' if expanded else 'none'

    return div(
        class_='CollapsibleList'
    )[h2(onclick=f"$('#{random_id}').toggle()",
         children=[title, span(f'({len(data)})'),
                   fa_icon('angle-down')]),
      html_list(data, style=f'display: {display}', id=random_id), ]
Exemple #2
0
def render_collapsible(lst,
                       item_role='collapsible-item',
                       title=None,
                       expanded=False,
                       **kwargs):
    """
    Renders a queryset or list of objects

    Args:
        lst:
            List or queryset of objects inside the collapsible list.
        item_role:
            Role assigned to each element in the list. Defaults to
            'collapsible-item'.
        title (bool):
            Title in which the list of object is displayed.
        expanded (str):
            If true, start list in the "expanded" state.
    """
    if title is None:
        if isinstance(lst, QuerySet):
            title = title.model._meta.verbose_name_plural
        else:
            raise TypeError('must provide an explicit title!')

    data = [html(x, item_role, **kwargs) for x in lst]
    return div(class_='CollapsibleList', is_component=True)[
        h2([title, span(f'({len(data)})'
                        ), fa_icon('angle-up')]),
        div(class_='CollapsibleList-data')[html_list(data), ]]
Exemple #3
0
def twitter_button(request):
    provider = providers.registry.by_id('twitter', request)
    query = {
        'next': '/conversations/',
    }
    url = provider.get_login_url(request, **query)
    return fa_icon('twitter', href=url, id='twitter-button')
Exemple #4
0
def github_button(request):
    provider = providers.registry.by_id('github', request)
    query = {
        'next': request.GET.get('next', '/conversations/'),
    }
    url = provider.get_login_url(request, **query)
    return fa_icon('github', href=url, id='github-button')
Exemple #5
0
    def icon_tag(self, classes=()):
        """
        Render an icon tag for the given icon.

        >>> print(icon.icon_tag(classes=['header-icon']))       # doctest: +SKIP
        <i class="fa fa-icon header-icon"></i>
        """
        return fa_icon(self.icon_name, class_=classes)
Exemple #6
0
def google_button(request):
    provider = providers.registry.by_id('google', request)
    query = {
        'next': '/conversations/',
    }
    url = provider.get_login_url(request, **query)
    return fa_icon('google',
                   href=url,
                   id='google-button',
                   class_="fab fa-google icon-google rounded-icon")
Exemple #7
0
def twitter_button(request):
    provider = providers.registry.by_id('twitter', request)
    query = {
        'next': request.GET.get('next', '/conversations/'),
    }
    url = provider.get_login_url(request, **query)
    return fa_icon('twitter',
                   href=url,
                   id='twitter-button',
                   aria_label="Twitter Icon",
                   class_="fab fa-twitter icon-twitter rounded-icon")
Exemple #8
0
def facebook_button(request):
    provider = providers.registry.by_id('facebook', request)
    query = {
        'next': '/conversations/',
        'method': 'js_sdk',
    }
    url = provider.get_login_url(request, **query)
    return fa_icon('facebook',
                   href=url,
                   id='facebook-button',
                   class_='fab fa-facebook icon-facebook rounded-icon')
Exemple #9
0
def facebook_button(request):
    provider = providers.registry.by_id('facebook', request)
    query = {
        'next': request.GET.get('next', '/conversations/'),
        'method': 'oauth2',
    }
    url = provider.get_login_url(request, **query)
    return fa_icon('facebook',
                   href=url,
                   id='facebook-button',
                   aria_label="Facebook Icon",
                   class_='fab fa-facebook icon-facebook rounded-icon')
Exemple #10
0
    def social_button(request):
        redirect_url = reverse("conversation:list")
        provider = providers.registry.by_id(provider_id, request)
        url = provider.get_login_url(request, next=request.GET.get("next", redirect_url), **(query or {}))

        return fa_icon(
            provider_id,
            href=url,
            id=f"{provider_id}-button",
            aria_label=_("Login using {}").format(provider_id.title()),
            class_=f"fab {fa_class} icon-{provider_id} rounded-icon",
            style="font-size: 2.5rem",
        )
Exemple #11
0
def icon(name, href=None, **kwargs):
    """
    Generic icon function.

    If name does not end with a file extension (e.g.: .svg, .png, etc), it
    creates a font-awesome icon inside a <i> element. Otherwise, it returns
    an <img> tag pointing to the correct icon.

    If href is given, it wraps content inside an <a> tag.
    """
    if "." in name:
        raise NotImplementedError
    else:
        return components.fa_icon(name, href=href, **kwargs)
Exemple #12
0
def collapsible(data, title=None, collapsed=False):
    """
    Renders a collapsible content.
    """

    angle = fa_icon("angle-up", class_="collapsible__handle")
    return div(
        class_="collapsible",
        is_component=True,
        is_collapsed=collapsed,
        children=[
            h2([title, angle], class_="collapsible__title"),
            div(data, class_="collapsible__data"),
        ],
    )
Exemple #13
0
def edit(request, conversation, slug, check=check_promoted):
    check(conversation, request)
    new_cluster_form = forms.ClusterFormNew(request=request)
    clusterization = getattr(conversation, "clusterization", None)

    # Handle POST requests for new clusters
    if request.method == "POST" and request.POST[
            "action"] == "new" and new_cluster_form.is_valid():
        clusterization = clusterization or conversation.get_clusterization()
        new_cluster_form.save(clusterization=clusterization)
        new_cluster_form = forms.ClusterFormNew()

    # Decorate clusters
    if clusterization is None:
        clusters = ()
    else:
        clusters = clusterization.clusters.annotate_attr(
            form=lambda x: forms.ClusterForm(request=request, instance=x))
    groups = [
        (fa_icon("plus", alt=__("Create new group")), "#cluster-new"),
        # (_('New'), '#cluster-new'),
        *((cluster.name, f"#cluster-{cluster.id}") for cluster in clusters),
    ]

    # Handle POST requests for existing clusters
    if request.method == "POST" and request.POST["action"] != "new":
        cluster_map = {x.id: x for x in clusters}
        cluster = cluster_map[int(request.POST["action"])]
        if request.POST["submit"] == "delete":
            cluster.delete()
            return redirect(conversation.url("cluster:edit"))
        elif cluster.form.is_valid():
            cluster.form.save()
            cluster.form = forms.ClusterForm(instance=cluster)

    return {
        "conversation": conversation,
        "groups": groups,
        "clusters": clusters,
        "new_cluster_form": new_cluster_form,
    }
Exemple #14
0
 def test_render_icon_with_link(self):
     assert str(fa_icon(
         'user', href='#')) == '<a href="#"><i class="fa fa-user"></i></a>'
     assert str(fa_icon(
         'github',
         href='#')) == '<a href="#"><i class="fab fa-github"></i></a>'
Exemple #15
0
    function. The function must receive a request and a second object
    (which can be None) pertaining to that section. Ex.: in a route that
    configures the user profile, that object can be the profile object for the
    request user.
    """
    return lambda f: MENU_FUNCTIONS[section].append(f) or f


# Storage
MENU_FUNCTIONS = defaultdict(list)

#: Accessibility menu
page_menu.ACCESSIBILITY = thunk(lambda: menu_section(
    _("Accessibility"),
    [
        a([fa_icon("text-height"),
           _("Toggle Font Size")],
          href="#",
          is_element="toggleFontSize"),
        a([fa_icon("adjust"), _("Toggle Contrast")],
          href="#",
          is_element="toggleContrast"),
    ],
))

#: About menu
page_menu._ABOUT = thunk(lambda: menu_section(
    _("About"),
    [
        link(_("About"), href="about-us"),
        link(_("Frequently Asked Questions"), href="faq"),
Exemple #16
0
    "name": _("Name"),
    "participation": _("Participation ratio"),
    "pending": _("Pending"),
    "rejected": _("Rejected"),
    "skip": _("Skip"),
    "skipped": _("Skipped"),
    "text": _("Text"),
    "total": _("Total"),
    "user": _("User"),
    "votes": _("Votes"),
}

TABLE_COLUMN_NAMES = {
    **COLUMN_NAMES,
    "agree":
    fa_icon("check", title=_("Agree")),
    "convergence":
    fa_icon(
        "handshake",
        title=
        _("Agreement level\n0%: votes are evenly split\n100%: everyone has the same opinion"
          ),
    ),
    "disagree":
    fa_icon("times", title=_("Disagree")),
    "participation":
    fa_icon("users", title=_("Participation ratio")),
    "skip":
    fa_icon("arrow-right", title=_("Skip")),
    "skipped":
    fa_icon("arrow-right", title=_("Skipped")),
Exemple #17
0
    "missing": _("Missing"),
    "name": _("Name"),
    "participation": _("Participation ratio"),
    "pending": _("Pending"),
    "rejected": _("Rejected"),
    "skip": _("Skip"),
    "skipped": _("Skipped"),
    "text": _("Text"),
    "total": _("Total"),
    "user": _("User"),
    "votes": _("Votes"),
}

TABLE_COLUMN_NAMES = {
    **COLUMN_NAMES,
    "agree": fa_icon("check", title=_("Agree")),
    "divergence": fa_icon("not-equal", title=_("Divergence")),
    "disagree": fa_icon("times", title=_("Disagree")),
    "participation": fa_icon("users", title=_("Participation ratio")),
    "skip": fa_icon("arrow-right", title=_("Skip")),
    "skipped": fa_icon("arrow-right", title=_("Skipped")),
}

PC_COLUMNS = [
    "missing",
    "skipped",
    "agree",
    "disagree",
    "average",
    "divergence",
    "entropy",
Exemple #18
0
    configures the user profile, that object can be the profile object for the
    request user.
    """
    return lambda f: MENU_FUNCTIONS[section].append(f) or f


# Storage
MENU_FUNCTIONS = defaultdict(list)

#: Accessibility menu
page_menu.ACCESSIBILITY = thunk(
    lambda: menu_section(
        _("Accessibility"),
        [
            a(
                [fa_icon("text-height"), _("Toggle Font Size")],
                href="#",
                is_element="toggleFontSize",
            ),
            a(
                [fa_icon("adjust"), _("Toggle Contrast")],
                href="#",
                is_element="toggleContrast",
            ),
        ],
    )
)

#: About menu
page_menu.ABOUT = thunk(
    lambda: menu_section(
Exemple #19
0
 def test_render_font_awesome_icons(self):
     assert str(fa_icon('user')) == '<i class="fa fa-user"></i>'
     assert str(fa_icon('github')) == '<i class="fab fa-github"></i>'
     assert str(fa_icon(
         'github', class_='cls')) == '<i class="fab fa-github cls"></i>'