Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/libs/django-iconify
1 result
Show changes
Commits on Source (3)
......@@ -2,7 +2,7 @@
Documentation: https://docs.iconify.design/types/
"""
from typing import Collection, Dict, Optional, Union
from typing import Collection, Dict, List, Optional, Union
from typing.io import TextIO
import json
......@@ -78,6 +78,7 @@ class IconifyJSON(IconifyOptional):
prefix: str
icons: Dict[str, IconifyIcon]
aliases: Optional[Dict[str, IconifyAlias]]
not_found: List[str]
@classmethod
def from_dict(cls, collection: Optional[dict] = None, only: Optional[Collection[str]] = None) -> "IconifyJSON":
......@@ -92,6 +93,7 @@ class IconifyJSON(IconifyOptional):
self.prefix = collection["prefix"]
self.icons, self.aliases = {}, {}
self.not_found = []
for name in only:
icon_dict = collection["icons"].get(name, None)
if icon_dict:
......@@ -104,7 +106,7 @@ class IconifyJSON(IconifyOptional):
self.icons[alias_dict["parent"]] = IconifyIcon.from_dict(collection["icons"][alias_dict["parent"]])
continue
raise KeyError(f"{name} is neither a known icon nor alias in the collection.")
self.not_found.append(name)
self._from_dict_optional(collection)
......@@ -126,5 +128,7 @@ class IconifyJSON(IconifyOptional):
"icons": {name: icon.as_dict() for name, icon in self.icons.items()},
"aliases": {name: alias.as_dict() for name, alias in self.aliases.items()},
}
if self.not_found:
res["not_found"] = self.not_found
res.update(self._as_dict_optional())
return res
from django.urls import re_path
from django.urls import path, re_path
from . import views
urlpatterns = [
path('_config.js', views.ConfigView.as_view(), name='config.js'),
re_path(r'^(?P<collection>[A-Za-z0-9-]+)\.(?P<format_>js(on)?)', views.IconifyJSONView.as_view(), name='iconify_json'),
]
import json
import os
from django.http import Http404, HttpRequest, HttpResponse, HttpResponseBadRequest
from django.http import Http404, HttpRequest, HttpResponse
from django.urls import reverse
from django.views.generic import View
from .conf import JSON_ROOT
from .types import IconifyJSON
class ConfigView(View):
"""Get JavaScript snippet to conifugre Iconify for our API."""
def get(self, request: HttpRequest) -> HttpResponse:
rev = reverse("iconify_json", kwargs={"collection": "prefix", "format_": "js"})
api_pattern = rev[:-9] + "{prefix}.js?icons={icons}"
config = {
"defaultAPI": api_pattern,
}
config_json = json.dumps(config)
return HttpResponse(f"var IconifyConfig = {config_json}", content_type="text/javascript")
class IconifyJSONView(View):
"""Serve the Iconify icon data retrieval API."""
def get(self, request: HttpRequest, collection: str, format_: str) -> HttpResponse:
......@@ -23,9 +38,7 @@ class IconifyJSONView(View):
# For JSONP, the callback name has to be passed
if format_ == "js":
callback = request.GET.get("callback", None)
if callback is None:
return HttpResponseBadRequest("The callback argument is mandatory for JSONP.")
callback = request.GET.get("callback", "SimpleSVG._loaderCallback")
# Load icon set through Iconify types
collection_file = os.path.join(JSON_ROOT, "json", f"{collection}.json")
......@@ -34,11 +47,11 @@ class IconifyJSONView(View):
icon_set = IconifyJSON.from_file(collection_file, only=icons)
except FileNotFoundError as exc:
raise Http404(f"Icon collection {collection} not found") from exc
except KeyError as exc:
raise Http404(str(exc)) from exc
# Get result JSON and form response
res = json.dumps(icon_set.as_dict())
if format_ == "js":
res = f"{callback}({res})"
return HttpResponse(res, content_type="application/json")
return HttpResponse(res, content_type="application/javascript")
else:
return HttpResponse(res, content_type="application/json")
from django.apps import AppConfig
class DjIconifyServerConfig(AppConfig):
name = 'dj_iconify_server'
......@@ -12,6 +12,7 @@ INSTALLED_APPS = [
'django.contrib.staticfiles',
'django_yarnpkg',
'dj_iconify.apps.DjIconifyConfig',
'dj_iconify_server.apps.DjIconifyServerConfig',
]
YARN_INSTALLED_APPS = [
......
<!DOCTYPE html>
<html>
<head>
<title>Example of Iconify usage in Django</title>
<script type="text/javascript" src="{% url 'config.js' %}"></script>
<script type="text/javascript" src="https://code.iconify.design/1/1.0.6/iconify.min.js"></script>
</head>
<body>
<span class="iconify" data-icon="fa:home" style="color:#ff0000"></span>
</body>
</head>
from django.views.generic import TemplateView
from django.urls import include, path
urlpatterns = [
path('', include("dj_iconify.urls")),
path('icons/', include("dj_iconify.urls")),
path('test.html', TemplateView.as_view(template_name="test.html")),
]