Correct dump_record, ensure that ref fields are exported as resources. Correct bug https://github.com/IRI-Research/plan4learning/issues/1
authorymh <ymh.work@gmail.com>
Mon, 07 Oct 2013 14:28:31 +0200
changeset 142 c365a6e23a56
parent 141 740d595d6728
child 143 b74f0e14d50f
Correct dump_record, ensure that ref fields are exported as resources. Correct bug https://github.com/IRI-Research/plan4learning/issues/1
src/p4l/management/commands/dump_record.py
src/p4l/mapping/__init__.py
src/p4l/mapping/serializers.py
--- a/src/p4l/management/commands/dump_record.py	Sat Oct 05 21:00:59 2013 +0200
+++ b/src/p4l/management/commands/dump_record.py	Mon Oct 07 14:28:31 2013 +0200
@@ -170,4 +170,4 @@
                 
             writer.endElementNS((RDF, 'RDF'), 'RDF')
             writer.endDocument()
-            dest_file.write("\n")
\ No newline at end of file
+            dest_file.write("\n")
--- a/src/p4l/mapping/__init__.py	Sat Oct 05 21:00:59 2013 +0200
+++ b/src/p4l/mapping/__init__.py	Mon Oct 07 14:28:31 2013 +0200
@@ -32,12 +32,19 @@
 #
 
 from rdflib.namespace import RDFS
+from rdflib.term import URIRef, Literal
 
 from p4l.mapping.constants import IIEP, DCT
 from p4l.mapping.serializers import (ModelSerializer, SimpleFieldSerializer, 
     BooleanFieldSerializer, RelatedFieldSerializer)
 
 
+def uri_convert(s):
+    try:
+        return URIRef(unicode(s)) if s else None
+    except:
+        return Literal(unicode(s)) if s else None
+
 class ImprintSerializer(ModelSerializer):
     
     imprintCity = SimpleFieldSerializer(predicate=IIEP.imprintCity, lang_field='lang')
@@ -82,20 +89,20 @@
     notes = SimpleFieldSerializer(predicate=IIEP.notes)
     editionStatement = SimpleFieldSerializer(predicate=IIEP.editionStatement)
     corporateAuthorLabel = SimpleFieldSerializer(predicate=IIEP.corporateAuthorLabel)
-    recordType = SimpleFieldSerializer(predicate=DCT.type)
+    recordType = SimpleFieldSerializer(predicate=DCT.type, convert=uri_convert)
     isDocumentPart = BooleanFieldSerializer(predicate=IIEP.isDocumentPart)
     hidden = BooleanFieldSerializer(predicate=IIEP.hidden)
     restricted = BooleanFieldSerializer(predicate=IIEP.restricted)    
 
-    language = RelatedFieldSerializer(many=False, value_field='uri', predicate=DCT.language) 
-    otherLanguages = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.otherLanguage)
-    subjects = RelatedFieldSerializer(many=True, value_field='uri', predicate=DCT.subject)
-    themes = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.theme)
-    countries = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.country)
-    projectNames = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.projectName)
-    subjectCorporateBodies = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.subjectCorporateBody) 
-    corporateAuthors = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.corporateAuthor)
-    audiences = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.audience)
+    language = RelatedFieldSerializer(many=False, value_field='uri', predicate=DCT.language, convert=uri_convert) 
+    otherLanguages = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.otherLanguage, convert=uri_convert)
+    subjects = RelatedFieldSerializer(many=True, value_field='uri', predicate=DCT.subject, convert=uri_convert)
+    themes = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.theme, convert=uri_convert)
+    countries = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.country, convert=uri_convert)
+    projectNames = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.projectName, convert=uri_convert)
+    subjectCorporateBodies = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.subjectCorporateBody, convert=uri_convert) 
+    corporateAuthors = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.corporateAuthor, convert=uri_convert)
+    audiences = RelatedFieldSerializer(many=True, value_field='uri', predicate=IIEP.audience, convert=uri_convert)
     
     isbns = RelatedFieldSerializer(many=True, value_field='isbn', predicate=IIEP.isbn, lang_field='lang')
     issns = RelatedFieldSerializer(many=True, value_field='issn', predicate=IIEP.issn, lang_field='lang')
--- a/src/p4l/mapping/serializers.py	Sat Oct 05 21:00:59 2013 +0200
+++ b/src/p4l/mapping/serializers.py	Mon Oct 07 14:28:31 2013 +0200
@@ -31,11 +31,11 @@
 # knowledge of the CeCILL-B license and that you accept its terms.
 #
 
+from collections import OrderedDict
 import logging
 
 from rdflib.namespace import RDF
-from rdflib.term import URIRef, Literal, BNode
-from collections import OrderedDict
+from rdflib.term import URIRef, Literal, BNode, Identifier
 
 
 logger = logging.getLogger(__name__)
@@ -80,8 +80,9 @@
         res = self.convert(getattr(obj, self.source or fieldname))
         if res is None:
             return
-        if not isinstance(res, Literal):
+        if not isinstance(res, Identifier):
             res = Literal(unicode(res))        
+        
         lang = getattr(obj, self.lang_field, None) if self.lang_field else None
         
         return Literal(res.value, lang) if lang else res
@@ -99,7 +100,7 @@
 class RelatedFieldSerializer(SimpleFieldSerializer):
         
     def __init__(self, value_field, predicate=None, convert=None, source=None, many=False, lang_field=None):
-        super(RelatedFieldSerializer, self).__init__(predicate, convert, source, lang_field=lang_field)
+        super(RelatedFieldSerializer, self).__init__(predicate=predicate, convert=convert, source=source, lang_field=lang_field)
         self.many = many
         self.value_field = value_field