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

1from itertools import chain 

2 

3from django import template 

4from django.contrib.contenttypes.models import ContentType 

5 

6from apis_core.generic.abc import GenericModel 

7 

8register = template.Library() 

9 

10 

11@register.filter 

12def contenttype(model): 

13 return ContentType.objects.get_for_model(model) 

14 

15 

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 

35 

36 

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() 

43 

44 

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) 

48 

49 

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 

63 

64 

65@register.filter 

66def get_attribute(obj, attribute): 

67 return getattr(obj, attribute, None) 

68 

69 

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()