• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

zostera / django-icons / 5153019666

pending completion
5153019666

push

github

dyve
Reformat

68 of 73 branches covered (93.15%)

Branch coverage included in aggregate %.

216 of 220 relevant lines covered (98.18%)

4.91 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.44
/src/django_icons/core.py
1
import warnings
5✔
2
from copy import deepcopy
5✔
3

4
from django.conf import settings
5✔
5
from django.utils.functional import keep_lazy_text
5✔
6
from django.utils.module_loading import import_string
5✔
7
from django.utils.safestring import mark_safe
5✔
8

9
from django_icons.css import merge_css_list
5✔
10
from django_icons.renderers import Bootstrap3Renderer, FontAwesome4Renderer, IconRenderer, ImageRenderer
5✔
11
from django_icons.renderers.material import MaterialRenderer
5✔
12

13
DEFAULT_RENDERERS = {
5✔
14
    "icon": IconRenderer,
15
    "fontawesome4": FontAwesome4Renderer,
16
    "bootstrap3": Bootstrap3Renderer,
17
    "material": MaterialRenderer,
18
    "image": ImageRenderer,
19
}
20

21

22
def icon(name, *args, **kwargs):
5✔
23
    """
24
    Render an icon.
25

26
    Deprecated because of frequent name collisions.
27
    """
28
    warnings.warn("The `icon` function is deprecated, user `render_icon` instead.", DeprecationWarning)
5✔
29
    return render_icon(name, *args, **kwargs)
5✔
30

31

32
@keep_lazy_text
5✔
33
def render_icon(name, *args, **kwargs):
4✔
34
    """
35
    Render an icon.
36

37
    **Parameters**:
38

39
        name
40
            The name of the icon to be rendered.
41

42
        title
43
            The title attribute for the icon
44

45
            :default: None (no title attribute rendered).
46

47
        renderer
48
            The renderer to use for the icon
49

50
            :default: The default renderer as per ``settings.py``, or ultimately `IconRenderer`.
51

52
        tag
53
            The tag to use for the icon
54

55
            :default: Each renderer has a default tag set. This parameter overrides the renderer's default tag.
56

57
    **Usage**::
58

59
        render_icon(name)
60

61
    **Example**::
62

63
        render_icon("pencil")
64
        render_icon("trash", title="Delete")
65
    """
66
    icon_kwargs = get_icon_kwargs(name, *args, **kwargs)
5✔
67
    renderer_class = get_icon_renderer(icon_kwargs.get("renderer", None))
5✔
68
    renderer = renderer_class(**icon_kwargs)
5✔
69
    return renderer.render()
5✔
70

71

72
def _get_setting(section, name, default=None):
5✔
73
    """Return a setting from a section, optionally provide default."""
74
    try:
5✔
75
        # Read from settings
76
        setting = deepcopy(settings.DJANGO_ICONS[section][name])
5✔
77
    except (AttributeError, KeyError, TypeError):
5✔
78
        # Set to default
79
        setting = default
5✔
80

81
    return setting
5✔
82

83

84
def _render_settings_content(content):
5✔
85
    """Render content from icon settings."""
86
    if not isinstance(content, list):
5!
87
        content = [content]
×
88
    result = mark_safe("")
5✔
89
    for item in content:
5✔
90
        result += render_icon(**item) if isinstance(item, dict) else str(item)
5✔
91
    return result
5✔
92

93

94
def get_icon_kwargs_from_settings(name):
5✔
95
    """Return the kwargs from settings, return a dict with at least a `name` key."""
96
    kwargs_from_settings = _get_setting("ICONS", name, {})
5✔
97
    if isinstance(kwargs_from_settings, str):
5✔
98
        kwargs_from_settings = {"name": kwargs_from_settings}
5✔
99
    kwargs_from_settings.setdefault("name", name)
5✔
100
    if "content" in kwargs_from_settings:
5✔
101
        kwargs_from_settings["content"] = _render_settings_content(kwargs_from_settings["content"])
5✔
102
    return kwargs_from_settings
5✔
103

104

105
def get_icon_kwargs(name, *args, **kwargs):
5✔
106
    """Build the kwargs for the icon function based on args and kwargs of the template tag."""
107
    icon_kwargs = get_icon_kwargs_from_settings(name)
5✔
108
    extra_classes = icon_kwargs.get("extra_classes", "")
5✔
109

110
    icon_kwargs.update(kwargs)
5✔
111

112
    extra_classes = merge_css_list(extra_classes, args, kwargs.get("extra_classes", ""))
5✔
113
    if extra_classes:
5✔
114
        icon_kwargs["extra_classes"] = extra_classes
5✔
115

116
    return icon_kwargs
5✔
117

118

119
def _get_icon_renderer_by_name(name):
5✔
120
    """Return class or dotted path to renderer class with this name from dict in settings."""
121
    default = DEFAULT_RENDERERS.get(name, None)
5✔
122
    renderer_class = _get_setting("RENDERERS", name, default)
5✔
123
    return renderer_class if renderer_class else name
5✔
124

125

126
def get_icon_renderer(renderer=None):
5✔
127
    """Return the default icon renderer."""
128
    renderer_class = renderer or _get_setting("DEFAULTS", "renderer", IconRenderer)
5✔
129

130
    if isinstance(renderer_class, str):
5✔
131
        renderer_class = _get_icon_renderer_by_name(renderer_class)
5✔
132
        if isinstance(renderer_class, str):
5✔
133
            if "." not in renderer_class:
5✔
134
                renderer_class = f"django_icons.renderers.{renderer_class}"
5✔
135
            renderer_class = import_string(renderer_class)
5✔
136

137
    return renderer_class
5✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc