and some more fixes
[redakcja.git] / apps / catalogue / management / commands / make_master.py
index 220c66c..fcd4c03 100644 (file)
@@ -8,6 +8,8 @@ from optparse import make_option
 from datetime import date
 import re
 from slughifi import slughifi
+from lxml import etree
+from librarian import WLURI
 
 
 dc_fixed = {
@@ -16,6 +18,7 @@ dc_fixed = {
     'rights_license': u'http://creativecommons.org/licenses/by-sa/3.0/',
     }
 
+dc_namespaces = { "dc": "http://purl.org/dc/elements/1.1/" }
 
 class Command(BaseCommand):
     option_list = BaseCommand.option_list + (
@@ -26,14 +29,53 @@ class Command(BaseCommand):
     )
     help = 'Create a master module skeleton'
 
-    def looks_like_syntetic(self, slug):
-        if re.match(r"^(gim|lic) \d[.]? ", slug):
+    def looks_like_synthetic(self, title):
+        if re.match(r"^(gim|lic)_\d[.]? ", title):
             return True
         return False
 
-    def gen_xml(self, options, syntetic_modules=[], course_modules=[], project_modules=[]):
+    def adopt(self, child, master, typ_, audience_, commit_args):
+        fc = child[0]
+        txt = fc.materialize()
+        changed = False
+        try:
+            t = etree.fromstring(txt)
+        except etree.XMLSyntaxError, e:
+            print "cannot read xml in part: %s" % child.slug
+            print unicode(e)
+            return
+        wluri = WLURI(t.xpath("//dc:identifier.url", namespaces=dc_namespaces)[0].text)
+        typ = t.xpath("//dc:type", namespaces=dc_namespaces)
+        if not typ:
+            print "no type in DC, inserting under format" 
+            fmt = t.xpath("//dc:format", namespaces=dc_namespaces)
+            container = fmt.getparent()
+            typ = etree.SubElement(container, etree.QName('dc', 'type'))
+            container.insert(typ, container.index(fmt)+1)
+            changed = True
+        else:
+            typ = typ[0]
+        if typ.text != typ_:
+            print "type is '%s', setting to '%s'" % (typ.text, typ_)
+            changed = True
+            typ.text = typ_
+        audience = t.xpath("//dc:audience", namespaces=dc_namespaces)[0]
+        if audience.text != audience_:
+            print "audience is '%s', setting to '%s'" % (audience.text, audience_)
+            changed = True
+            audience.text = audience_
+        if changed:
+            print "will commit."
+            fc.commit(etree.tostring(t, encoding=unicode), **commit_args)
+        return wluri
+
+
+    def gen_xml(self, options, synthetic_modules=[], course_modules=[], project_modules=[]):
         holder = {}
         holder['xml'] = u""
+        slug = options['slug']
+        if not slug:
+            slug = slughifi(options['title'])
 
         def p(t):
             holder['xml'] += u"%s\n" % t
@@ -52,12 +94,12 @@ class Command(BaseCommand):
         p(u'<rdf:Description rdf:about="http://redakcja.edukacjamedialna.edu.pl/documents/">')
 
         dc(u'title', options['title'])
-        for slug in syntetic_modules:
-            dc(u'relation.hasChild.syntetic', slug_url(slug))
-        for slug in course_modules:
-            dc(u'relation.hasChild.course', slug_url(slug))
-        for slug in project_modules:
-            dc(u'relation.hasChild.project', slug_url(slug))
+        for s in synthetic_modules:
+            dc(u'relation.hasPart', unicode(s))
+        for s in course_modules:
+            dc(u'relation.hasPart', unicode(s))
+        for s in project_modules:
+            dc(u'relation.hasPart', unicode(s))
         dc(u'publisher', u'Fundacja Nowoczesna Polska')
         #        dc(u'subject.competence', meta.get(u'Wybrana kompetencja z Katalogu', u''))
         #        dc(u'subject.curriculum', meta.get(u'Odniesienie do podstawy programowej', u''))
@@ -65,20 +107,27 @@ class Command(BaseCommand):
         ##     keyword = keyword.strip()
         ##     dc(u'subject', keyword)
         dc(u'description', dc_fixed['description'])
-        dc(u'identifier.url', u'http://edukacjamedialna.edu.pl/%s' % options['slug'])
+        dc(u'identifier.url', u'http://edukacjamedialna.edu.pl/%s' % slug)
         dc(u'rights', dc_fixed['rights'])
         dc(u'rights.license', dc_fixed['rights_license'])
-        dc(u'format', u'syntetic, course, project')
+        dc(u'format', u'xml')
         dc(u'type', u'text')
         dc(u'date', date.strftime(date.today(), "%Y-%m-%d"))
         dc(u'audience', options['audience'])
         dc(u'language', u'pol')
         p(u'</rdf:Description>')
         p(u'</rdf:RDF>')
+        p(u'</utwor>')
 
         return holder['xml']
 
     def handle(self, *args, **options):
+        commit_args = {
+            "author_name": 'Platforma',
+            "description": 'Automatycznie zaimportowane z EtherPad',
+            "publishable": False,
+        }
+
         slug = options['slug']
         if not slug:
             slug = slughifi(options['title'])
@@ -99,7 +148,7 @@ class Command(BaseCommand):
         if len(master) == 0:
             master.add(slug, options['title'])
 
-        syntetic_modules = []
+        synthetic_modules = []
         course_modules = []
         if 'slugs_file' in options:
             f = open(options['slugs_file'], 'r')
@@ -113,18 +162,21 @@ class Command(BaseCommand):
                     except Book.DoesNotExist:
                         print "Book for title %s does not exist" % t
                         continue
-                    if self.looks_like_syntetic(t):
-                        syntetic_modules.append(b.slug)
+                    if self.looks_like_synthetic(t):
+                        wlurl = self.adopt(b, master, 'synthetic', options['audience'], commit_args)
+                        synthetic_modules.append(wlurl)
                     else:
-                        course_modules.append(b.slug)
+                        wlurl = self.adopt(b, master, 'course', options['audience'], commit_args)
+                        course_modules.append(wlurl)
             except Exception, e:
                 print "Error getting slug list (file %s): %s" % (options['slugs_file'], e)
 
-        print "syntetic: %s" % syntetic_modules
-        print "course: %s" % course_modules
-
-        xml = self.gen_xml(options, syntetic_modules, course_modules)
+        print "synthetic: %s" % [unicode(z) for z in synthetic_modules]
+        print "course: %s" % [unicode(z) for z in course_modules]
 
+        xml = self.gen_xml(options, synthetic_modules, course_modules)
+        c = master[0]
         print xml
+        if confirm("Commit?", True):
+            c.commit(xml, **commit_args)
 
-        #        master.save()