Coverage for apis_core/apis_entities/serializers.py: 41%

32 statements  

« prev     ^ index     » next       coverage.py v7.5.3, created at 2025-06-25 10:00 +0000

1from rdflib import Literal, URIRef 

2from rdflib.namespace import GEO, RDF, RDFS 

3from rest_framework import serializers 

4 

5from apis_core.generic.serializers import ( 

6 GenericHyperlinkedIdentityField, 

7 GenericModelCidocSerializer, 

8) 

9from apis_core.generic.utils.rdf_namespace import APPELLATION, CRM 

10 

11 

12class MinimalEntitySerializer(serializers.Serializer): 

13 uri = GenericHyperlinkedIdentityField( 

14 view_name="apis_core:generic:genericmodelapi-detail" 

15 ) 

16 name = serializers.SerializerMethodField(method_name="get_name") 

17 

18 def get_name(self, object) -> str: 

19 return str(object) 

20 

21 

22class E21_PersonCidocSerializer(GenericModelCidocSerializer): 

23 def to_representation(self, instance): 

24 g = super().to_representation(instance) 

25 

26 if hasattr(instance, "forename"): 

27 forename_uri = URIRef(APPELLATION[f"forename_{instance.id}"]) 

28 g.add( 

29 ( 

30 forename_uri, 

31 RDF.type, 

32 CRM.E33_E41_Linguistic_Appellation, 

33 ) 

34 ) 

35 g.add( 

36 ( 

37 self.appellation_uri, 

38 CRM.P106_is_composed_of, 

39 forename_uri, 

40 ) 

41 ) 

42 g.add((forename_uri, RDFS.label, Literal(instance.forename))) 

43 

44 if hasattr(instance, "surname"): 

45 surname_uri = URIRef(APPELLATION[f"surname_{instance.id}"]) 

46 g.add( 

47 ( 

48 surname_uri, 

49 RDF.type, 

50 CRM.E33_E41_Linguistic_Appellation, 

51 ) 

52 ) 

53 g.add( 

54 ( 

55 self.appellation_uri, 

56 CRM.P106_is_composed_of, 

57 surname_uri, 

58 ) 

59 ) 

60 g.add((surname_uri, RDFS.label, Literal(instance.surname))) 

61 

62 return g 

63 

64 

65class E53_PlaceCidocSerializer(GenericModelCidocSerializer): 

66 def to_representation(self, instance): 

67 g = super().to_representation(instance) 

68 

69 if instance.latitude is not None and instance.longitude is not None: 

70 literal_text = f"Point ( {instance.longitude:+} {instance.latitude:+} )" 

71 literal = Literal(literal_text, datatype=GEO.wktLiteral) 

72 g.add((self.instance_uri, CRM.P168_place_is_defined_by, literal)) 

73 return g