X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/bca6757e1d0a5c2875ef3ee2f99ddc145b38c2a8..0327b33c1e7816f8a30269f8798bff5e216ccd7c:/apps/catalogue/management/commands/make_master.py diff --git a/apps/catalogue/management/commands/make_master.py b/apps/catalogue/management/commands/make_master.py index 220c66cc..fcd4c036 100644 --- a/apps/catalogue/management/commands/make_master.py +++ b/apps/catalogue/management/commands/make_master.py @@ -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'') 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'') p(u'') + p(u'') 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()