Coverage for apis_core/generic/templatetags/generic.py: 39%
46 statements
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-18 14:11 +0000
« prev ^ index » next coverage.py v7.6.1, created at 2024-09-18 14:11 +0000
1from itertools import chain
3from django import template
4from django.contrib.contenttypes.models import ContentType
6from apis_core.generic.abc import GenericModel
8register = template.Library()
11@register.filter
12def contenttype(model):
13 return ContentType.objects.get_for_model(model)
16@register.simple_tag
17def modeldict(instance, fields=None, exclude=None):
18 opts = instance._meta
19 data = {}
20 for f in chain(opts.concrete_fields, opts.private_fields, opts.many_to_many):
21 if not getattr(f, "editable", False):
22 continue
23 if fields is not None and f.name not in fields:
24 continue
25 if exclude and f.name in exclude:
26 continue
27 field = instance._meta.get_field(f.name)
28 data[field] = instance._get_FIELD_display(field)
29 if getattr(field, "remote_field", False):
30 data[field] = getattr(instance, field.name)
31 if getattr(field, "m2m_field_name", False):
32 values = getattr(instance, field.name).all()
33 data[field] = ", ".join([str(value) for value in values])
34 return data
37@register.simple_tag
38def contenttypes(app_labels=None):
39 if app_labels:
40 app_labels = app_labels.split(",")
41 return ContentType.objects.filter(app_label__in=app_labels)
42 return ContentType.objects.all()
45def is_genericmodel(content_type: ContentType):
46 model_class = content_type.model_class()
47 return model_class is not None and issubclass(model_class, GenericModel)
50@register.simple_tag
51def genericmodel_content_types():
52 """
53 Retrieve all models which inherit from GenericModel class
54 and return their ContentType.
55 """
56 genericmodels = list(
57 filter(
58 lambda content_type: is_genericmodel(content_type),
59 ContentType.objects.all(),
60 )
61 )
62 return genericmodels
65@register.filter
66def get_attribute(obj, attribute):
67 return getattr(obj, attribute, None)
70@register.filter
71def content_type_count(content_type):
72 """
73 Return the number of objects having a specific content type
74 """
75 return content_type.model_class().objects.count()