source: mods2solr.py @ 19:568f0b136f2d

Revision 19:568f0b136f2d, 44.7 KB checked in by hagenbruch@phoibe.ub.rub.de, 9 years ago (diff)

New entry IDs (UUIDs). Statistics overview of record counts. Deduplication support. Minor tweaks...

Line 
1#!/usr/bin/env python
2# encoding: utf-8
3"""
4mods2solr.py
5
6Created by Andre Hagenbruch on 2009-02-19.
7Copyright (c) 2009 University Library Bochum. All rights reserved.
8"""
9import urllib
10import logging
11
12logging.basicConfig(level=logging.DEBUG)
13
14MODS_NAMESPACE = 'http://www.loc.gov/mods/v3'
15DCTERMS_NAMESPACE = 'http://purl.org/dc/terms'
16XLINK_NAMESPACE = 'http://www.w3.org/1999/xlink'
17MODS = '{%s}' % MODS_NAMESPACE
18DCTERMS = '{%s}' % DCTERMS_NAMESPACE
19XLINK = '{%s}' % XLINK_NAMESPACE
20
21NSMAP = {None: MODS_NAMESPACE,
22    'dcterms': DCTERMS_NAMESPACE,
23    'xlink': XLINK_NAMESPACE
24}
25
26from MARCCodes import MARCRelators
27from MARCCodes import languageCodes
28from bibtex_util import umlaut
29from cgi import escape
30import datetime
31from dc_util import *
32from dcds_util import *
33from jcr import *
34from lxml import etree
35from mods_util import *
36import re
37from sesame_util import *
38import simplejson as json
39from solr_util import commit
40from solr_util import solr
41from solr_util import update
42from tictocs import *
43from xml_util import xml2cdata
44
45# from lang_id import *
46
47# GENRE_MAP = {
48#       'JournalArticle': 'Aufsatz',
49#       'ComputerProgram': 'Software',
50#       'Contribution': 'Aufsatz',
51#       'PressRelease': 'Pressemitteilung',
52#       'CollectedEdition': 'Edition',
53#       'Monograph': 'Monographie'
54# }
55
56GENRE_MAP = {
57    'Beitrag in Sammelwerk': 'Aufsatz',
58    'Zeitschriftenaufsatz': 'Aufsatz',
59    'Zeitungsartikel': 'Aufsatz',
60    'Rezension': 'Aufsatz',
61    'Sammelwerk': 'Buch',
62    'Monographie': 'Buch',
63    'Festschrift': 'Buch',
64    'Tagungsband': 'Buch',
65    'Dissertation': 'Buch',
66    'Habilitation': 'Buch',
67    'Magisterarbeit': 'Buch',
68    'Diplomarbeit': 'Buch',
69    'Sonderheft': 'Buch',
70    'Edition': 'Buch',
71    'Internetdokument': 'Elektronische Ressource',
72    'Software': 'Elektronische Ressource',
73    'Patentschrift': 'Sonstiges',
74    'Graue Literatur': 'Sonstiges',
75    'Gesetzeskommentar': 'Buch',
76    'Beitrag in Gesetzeskommentar': 'Aufsatz',
77    'Hochschulschrift': 'Buch',
78    'Musikdruck': 'Buch',
79    'Pressemitteilung': 'Sonstiges',
80    'Vortrag': 'Sonstiges',
81    'Lexikonartikel': 'Aufsatz',
82    'Vorwort': 'Sonstiges',
83}
84
85GENRE_LOCAL_MAP = {
86    'Contribution': 'Beitrag in Sammelwerk',
87    'JournalArticle': 'Zeitschriftenaufsatz',
88    'NewspaperArticle': 'Zeitungsartikel',
89    'CollectedEdition': 'Sammelwerk',
90    'Monograph': 'Monographie',
91    'ConferenceProceedings': 'Tagungsband',
92    'SpecialIssue': 'Sonderheft',
93    'CollectedWorks': 'Edition',
94    'InternetDocument': 'Internetdokument',
95    'ComputerProgram': 'Software',
96    'Patent': 'Patentschrift',
97    'UnpublishedWork': 'Graue Literatur',
98    'LegalCommentary': 'Gesetzeskommentar',
99    'ContributionInLegalCommentary': 'Beitrag in Gesetzeskommentar',
100    'Thesis': 'Hochschulschrift',
101    'Lecture': 'Vortrag',
102    'PressRelease': 'Pressemitteilung',
103}
104
105# RIS_GENRE_MAP = {
106#       'JournalArticle': 'JOUR',
107#       'ComputerProgram': 'COMP',
108#       'Contribution': 'JOUR',
109#       'PressRelease': 'INPR',
110#       'CollectedEdition': 'GEN',
111#       'Monograph': 'BOOK'
112# }
113
114RIS_GENRE_MAP = {
115    'Rezension': 'JOUR',
116    'Festschrift': 'BOOK',
117    'Dissertation': 'THESIS',
118    'Habilitation': 'THESIS',
119    'Magisterarbeit': 'THESIS',
120    'Diplomarbeit': 'THESIS',
121    'Musikdruck': 'BOOK',
122    'Pressemitteilung': 'GEN',
123    'Vortrag': 'GEN',
124    'Lexikonartikel': 'GEN',
125    'Vorwort': 'GEN',
126}
127
128RIS_GENRE_LOCAL_MAP = {
129    'Contribution': 'JOUR',
130    'JournalArticle': 'JOUR',
131    'NewspaperArticle': 'JOUR',
132    'CollectedEdition': 'BOOK',
133    'Monograph': 'BOOK',
134    'ConferenceProceedings': 'CONF',
135    'SpecialIssue': 'BOOK',
136    'CollectedWorks': 'BOOK',
137    'InternetDocument': 'ICOMM',
138    'ComputerProgram': 'COMP',
139    'Patent': 'PAT',
140    'UnpublishedWork': 'UNPB',
141    'LegalCommentary': 'BOOK',
142    'ContributionInLegalCommentary': 'JOUR',
143    'Thesis': 'THES',
144    'Lecture': 'GEN',
145    'PressRelease': 'GEN',
146}
147
148# BIBTEX_GENRE_MAP = {
149#       'JournalArticle': 'article',
150#       'ComputerProgram': 'misc',
151#       'Contribution': 'article',
152#       'PressRelease': 'misc',
153#       'CollectedEdition': 'book',
154#       'Monograph': 'book'
155# }
156
157BIBTEX_GENRE_MAP = {
158    'Rezension': 'article',
159    'Festschrift': 'book',
160    'Dissertation': 'phdthesis',
161    'Habilitation': 'book',
162    'Magisterarbeit': 'mastersthesis',
163    'Diplomarbeit': 'mastersthesis',
164    'Musikdruck': 'book',
165    'Pressemitteilung': 'misc',
166    'Vortrag': 'misc',
167    'Lexikonartikel': 'misc',
168    'Vorwort': 'misc',
169}
170
171BIBTEX_GENRE_LOCAL_MAP = {
172    'Contribution': 'incollection',
173    'JournalArticle': 'article',
174    'NewspaperArticle': 'article',
175    'CollectedEdition': 'book',
176    'Monograph': 'book',
177    'ConferenceProceedings': 'proceedings',
178    'SpecialIssue': 'book',
179    'CollectedWorks': 'book',
180    'InternetDocument': 'misc',
181    'ComputerProgram': 'misc',
182    'Patent': 'misc',
183    'UnpublishedWork': 'unpublished',
184    'LegalCommentary': 'book',
185    'ContributionInLegalCommentary': 'incollection',
186    'Thesis': 'book',
187    'Lecture': 'misc',
188    'PressRelease': 'misc',
189}
190
191
192DATE_RANGE_RE = re.compile('(\d{4})-\[?\d{4}\]?')
193
194def get_title(twig):
195    titlepart = ''
196    for title in twig:
197        if title.tag == '%stitle' % MODS:
198            titlepart = title.text
199        if title.tag == '%ssubTitle' % MODS:
200            titlepart += ' : %s' % title.text
201    return titlepart.encode('utf-8')
202
203def get_name(twig):
204    realname = ''
205    nametype = ''
206    namerole = ''
207    nametype = twig.attrib['type']
208    pnd = twig.attrib.get('ID')
209    for part in twig:
210        if part.tag == '%snamePart' % MODS:
211            realname = part.text
212        if part.tag == '%srole' % MODS:
213            for role in part:
214                if role.tag == '%sroleTerm' % MODS:
215                    namerole = role.text
216    return (realname, nametype, namerole, pnd)
217
218def sparql(ids):
219    c = connection('http://134.147.247.41:8080/openrdf-sesame/')
220    c.use_repository('stw')
221    c.addnamespace('skos', 'http://www.w3.org/2004/02/skos/core#')
222       
223    descriptors = {}
224    subjects = set()
225       
226    for myid in ids:
227        p = c.query("""
228                                        SELECT DISTINCT ?pref
229                                        WHERE {
230                                                <http://zbw.eu/beta/stw/descriptor/%s> skos:prefLabel ?pref.
231                                        }
232                                        """ % myid)
233                               
234        a = c.query("""
235                                        SELECT DISTINCT ?alt
236                                        WHERE {
237                                                <http://zbw.eu/beta/stw/descriptor/%s> skos:altLabel ?alt.
238                                        }
239                                        """ % myid)
240       
241        n = c.query("""
242                                        SELECT DISTINCT ?narrower
243                                        WHERE {
244                                                <http://zbw.eu/beta/stw/descriptor/%s> skos:narrower ?nar. ?nar skos:prefLabel ?narrower
245                                        }
246                                        """ % myid)
247
248        # b = c.query("""
249        #                       SELECT DISTINCT ?broader
250        #                       WHERE {
251        #                               <http://zbw.eu/beta/stw/descriptor/%s> skos:broader ?bro. ?bro skos:prefLabel ?broader
252        #                       }
253        #                       """ % myid)
254                               
255        rel = c.query("""
256                                        SELECT DISTINCT ?related
257                                        WHERE {
258                                                <http://zbw.eu/beta/stw/descriptor/%s> skos:related ?rel. ?rel skos:prefLabel ?related
259                                        }
260                                        """ % myid)
261
262        #print p
263
264        for r in p:
265            for i in r:
266                # print r[i]['value']
267                subjects.add(r[i]['value'])
268                if r[i]['xml:lang'] == 'de':
269                    descriptors.setdefault(myid, []).append(r[i]['value'])
270                                               
271        for r in a:
272            for i in r:
273                #print r[i]['value']
274                subjects.add(r[i]['value'])
275                if r[i]['xml:lang'] == 'de':
276                    descriptors.setdefault(myid, []).append(r[i]['value'])
277       
278        for r in n:
279            for i in r:
280                #print r[i]['value']
281                subjects.add(r[i]['value'])
282       
283        # for r in b:
284        #       for i in r:
285        #               print r[i]['value']
286               
287        for r in rel:
288            for i in r:
289                #print r[i]['value']
290                subjects.add(r[i]['value'])
291
292    return (descriptors, subjects)
293
294_pnd_cache = {}
295
296def _check_consent(pnd):
297    if _pnd_cache.get(pnd):
298        return _pnd_cache.get(pnd)
299    else:
300        response = urllib.urlopen('http://bibliographie-admin.ub.rub.de/rubauthor/%s/consent' % pnd)#.read()
301        resp = response.read()
302        #logging.info('CODE: %s' % response.getcode())
303        if response.getcode() == 500: # Noch nicht in der Redaktion?
304            _pnd_cache.setdefault(pnd, resp)
305            return 'False'
306        else:
307            _pnd_cache.setdefault(pnd, resp)
308            return resp
309
310class Collection(object):
311       
312    def __init__(self, filename, fach, disziplin, **args):
313        self.filename = filename
314        #self.fakultaet = fakultaet
315        self.fach = fach
316        self.disziplin = disziplin
317        self.institution = args.get('institution', '')
318        self.inst_label = args.get('inst_label', '')
319        self.debug = args.get('debug', '')
320
321    def feed(self):
322        update(Collection.convert(self))
323        #commit()
324        #commit()
325
326    def convert(self):
327        try:
328            intree = etree.parse(self.filename)
329        except:
330            raise
331        doc = ''
332        index = elm ('add', None)
333        record_counter = 1
334        lang_hist = {}
335        #abbr_title = {}
336        debug_id = ''
337        debug_genre = ''
338
339        #print genre_local.text
340        records = intree.findall('%smods' % MODS)
341        abstract_consent = True
342               
343               
344        #for data in intree.iter():
345        for data in records:
346            json_dict = {}
347            genre = set()
348            genre_local = ''
349            stw_ids = []
350            year = ''
351            issn = ''
352
353            if data.tag == '%smods' % MODS:
354                doc = (elm('doc', None))
355                doc.append(solr('disziplin', self.disziplin))
356                if self.institution == 'Fakultaet':
357                    doc.append(solr('fakultaet', self.inst_label))
358                else:
359                    doc.append(solr('zentraleeinheit', self.inst_label))
360                if self.inst_label != self.fach:
361                    doc.append(solr('fach', self.fach))
362                #doc.append(solr('recordCreationDate', datetime.datetime.now().isoformat()[:-9] + '00Z'))
363                #doc.append(solr('id', 'tag:bibliographie.ub.rub.de,2009:%s:%s' % (self.fach.replace(' ', '_').decode('utf-8'), str(record_counter))))
364                #doc.append(solr('entryID', '%s_%s' % (self.fach.replace(' ', '_'), str(record_counter))))
365                guid = data.find('.//%srecordInfo/%srecordIdentifier' % (MODS, MODS))
366                doc.append(solr('id', guid.text))
367                doc.append(solr('entryID', guid.text))
368                debug_id = guid.text
369                #dcds_tree = desc('tag:bibliographie.ub.rub.de,2009:%s:%s' % (self.fach.replace(' ', '_').decode('utf-8'), str(record_counter)))
370                dcds_tree = desc(guid.text)
371                #json_dict.setdefault('id', '%s_%s' % (self.fach.replace(' ', '_'), str(record_counter)))
372                json_dict.setdefault('id', guid.text)
373                json_dict.setdefault('fach', self.fach)
374                dc_list = []
375                #dc_list.append(dc('identifier', 'tag:bibliographie.ub.rub.de,2009:%s:%s' % (self.fach.replace(' ', '_').decode('utf-8'), str(record_counter))))
376                dc_list.append(dc('identifier', guid.text))
377                bib_authors = []
378                bib_editors = []
379                bibtex_list = []
380                ris_list = []
381                keywords = []
382                json_name = {}
383                json_dict.setdefault('names', [])
384                                                               
385                for elem in data:
386                    #genre = elem.xpath('//mods:genre[not(@authority)]', namespaces = {'mods': 'http://www.loc.gov/mods/v3', 'dcterms': 'http://purl.org/dc/terms', 'xsi': 'http://www.w3.org/2001/XMLSchema-instance'})
387                    #genre_local = elem.find('.//%sgenre[@authority="local"]' % MODS)
388                                       
389                    if elem.tag == '%sgenre' % MODS:
390                        if len(elem.attrib) == 0:
391                            genre.add(elem.text)
392                        else:
393                            if elem.attrib['authority'] == 'local':
394                                genre_local = elem.text
395                                debug_genre = elem.text
396                                       
397                    if elem.tag == '%sname' % MODS:
398                        ris_authors = ''
399                        realname, nametype, namerole, pnd = get_name(elem)
400                        if pnd is not None:
401                            #logging.debug('PND: %s' % pnd)
402                            doc.append(solr('pnd', '%s#%s' % (realname, pnd)))
403                            abstract_consent = _check_consent(pnd)
404                            #logging.info('CONSENT: %s => %s' % (pnd, abstract_consent))
405                        if namerole == 'aut' and nametype == 'personal':
406                            doc.append(solr('creator', realname))
407                            doc.append(solr('fperson', realname))
408                            doc.append(solr('person', realname))
409                            bib_authors.append(umlaut(realname))
410                            ris_authors += 'A1  - %s\n' % realname
411                            ris_list.append(ris_authors)
412                            dc_list.append(dc('creator', realname))
413                            dcds_tree.append(stmt('creator', realname))
414                        if namerole == 'ctb' and nametype == 'corporate':
415                            doc.append(solr('contributor', realname))
416                            dcds_tree.append(stmt('contributor', realname))
417                            dc_list.append(dc('contributor', realname))
418                        if namerole == 'edt' and nametype == 'personal':
419                            doc.append(solr('editor', realname))
420                            doc.append(solr('fperson', realname))
421                            doc.append(solr('person', realname))
422                            bib_editors.append(umlaut(realname))
423                        else:
424                            pass
425                            # bib_authors.append(umlaut(realname))
426                            # ris_authors += 'A1  - %s\n' % realname
427                            # ris_list.append(ris_authors)
428                        json_name.setdefault('name', {}).setdefault('type', nametype)
429                        json_name.setdefault('name', {}).setdefault('namePart', {}).setdefault('displayForm', realname)
430                        json_name.setdefault('name', {}).setdefault('namePart', {}).setdefault('role', {}).setdefault('type', {}).setdefault('code', namerole)
431                        json_dict.setdefault('names', []).append(json_name)
432                        json_name = {}
433                            # dc_list.append(dc('creator', realname))
434                    if elem.tag == '%stitleInfo' % MODS:
435                        if elem.attrib.get('type') == 'translated':
436                            doc.append(solr('parallel_title', get_title(elem)))
437                            json_dict.setdefault('titleInfo', {}).setdefault('title', {}).setdefault('type', {}).setdefault('translated', get_title(elem).decode('utf-8'))
438                            # Keine Paralleltitel in BibTeX und RIS?
439                            dcds_tree.append(stmt('alternative', get_title(elem)))
440                        elif elem.attrib.get('type') == 'uniform':
441                            pass
442                        else:
443                            doc.append(solr('title', get_title(elem)))
444                            doc.append(solr('sorttitle', get_title(elem)))
445                            dcds_tree.append(stmt('title', get_title(elem)))
446                            bibtex_list.append('\ttitle = {{%s}},\n' % umlaut(get_title(elem).decode('utf-8')))
447                            #bibtex += '\ttitle = {{%s}},\n' % umlaut(get_title(elem))
448                            ris_list.append('T1  - %s\n' % get_title(elem).decode('utf-8'))
449                            #ris_list.append('T1  - %s\n' % get_title(elem))
450                            dc_list.append(dc('title', get_title(elem).decode('utf-8')))
451                            json_dict.setdefault('titleInfo', {}).setdefault('title', get_title(elem))
452                    if elem.tag == '%ssubject' % MODS:
453                        for topic in elem:
454                            doc.append(solr('subject', topic.text))
455                            doc.append(solr('fsubject', topic.text))
456                            doc.append(solr('tagcloud', topic.text))
457                            dcds_tree.append(stmt('subject', topic.text))
458                            keywords.append(umlaut(topic.text))
459                            ris_list.append('KW  - %s\n' % topic.text)
460                            dc_list.append(dc('subject', topic.text))
461                            json_dict.setdefault('subject', {}).setdefault('topic', []).append(topic.text)
462                    if elem.tag == '%sidentifier' % MODS:
463                        if elem.attrib.get('type') == 'isbn':
464                            doc.append(solr('isbn', elem.text.replace('-', '')))
465                            doc.append(solr('isxn', elem.text.replace('-', '')))
466                            dcds_tree.append(stmt('identifier', 'urn:isbn:%s' % elem.text))
467                            dc_list.append(dc('identifier', 'urn:isbn:%s' % elem.text))
468                            bibtex_list.append('\tISBN = {%s},\n' % elem.text)
469                            ris_list.append('SN  - %s\n' % elem.text)
470                        if elem.attrib.get('type') == 'doi':
471                            doc.append(solr('doi', elem.text))
472                            dcds_tree.append(stmt('identifier', 'urn:doi:%s' % elem.text))
473                            dc_list.append(dc('identifier', 'urn:doi:%s' % elem.text))
474                            ris_list.append('SN  - %s\n' % elem.text)
475                        if elem.attrib.get('displayLabel') == u'Veröffentlichungs-Nr.':
476                            doc.append(solr('patent_id', elem.text))
477                            dcds_tree.append(stmt('identifier', elem.text))
478                            dc_list.append(dc('identifier', elem.text))
479                            ris_list.append('SN  - %s\n' % elem.text)
480                    if elem.tag == '%srelatedItem' % MODS:
481                        #if elem.attrib['type'] == 'host':
482                        if elem.attrib.get('type') == 'host':
483                            for host in elem:
484                                if host.tag == '%sidentifier' % MODS:
485                                    if host.attrib['type'] == 'issn':
486                                        issn = host.text
487                                        if tictocs.get(host.text, ''):
488                                            doc.append(solr('tictoc', tictocs.get(host.text)))
489                                        #if jcr.get(year).get(host.text):
490                                        #print year
491                                        #print host.text
492                                        #raise KeyError()
493                                        #doc.append(solr('jcr', jcr.get(year).get(host.text)))
494                                        doc.append(solr('issn', host.text.replace('-', '')))
495                                        doc.append(solr('isxn', host.text.replace('-', '')))
496                                        bibtex_list.append('\tISSN = {%s},\n' % host.text)
497                                        ris_list.append('SN  - %s\n' % host.text)
498                                        dcds_tree.append(stmt('isPartOf', 'urn:issn:%s' % host.text))
499                                        dc_list.append(dc('relation', 'urn:issn:%s' % host.text))
500                                    elif host.attrib['type'] == 'isbn':
501                                        doc.append(solr('isbn', host.text.replace('-', '')))
502                                        doc.append(solr('isxn', host.text.replace('-', '')))
503                                        bibtex_list.append('\tISBN = {%s},\n' % host.text)
504                                        ris_list.append('SN  - %s\n' % host.text)
505                                        dcds_tree.append(stmt('isPartOf', 'urn:isbn:%s' % host.text))
506                                        dc_list.append(dc('relation', 'urn:isbn:%s' % host.text))
507                                        # worldcat = xisbn(host.text.replace('-', ''))
508                                        #                                                                       if worldcat.startswith('http'):
509                                        #                                                                               doc.append(solr('worldcat_url', worldcat))
510                                        # gb = google_book(host.text.replace('-', ''))
511                                        #                                                                       if gb.startswith('http'):
512                                        #                                                                               doc.append(solr('google_book_url', gb))
513                                if host.tag == '%stitleInfo' % MODS:
514                                    if host.attrib.get('type') != 'abbreviated':
515                                        doc.append(solr('journal_title', get_title(host)))
516                                        doc.append(solr('fjtitle', get_title(host)))
517                                        bibtex_list.append('\tjournal = {%s},\n' % umlaut(get_title(host).decode('utf-8')))
518                                        ris_list.append('JO  - %s\n' % get_title(host).decode('utf-8'))
519                                        dcds_tree.append(stmt('isPartOf', get_title(host).decode('utf-8')))
520                                        dc_list.append(dc('relation', get_title(host).decode('utf-8')))
521                                    else:
522                                        #doc.append(solr('abbr_jtitle', get_title(host)))
523                                        ris_list.append('JA  - %s\n' % get_title(host).decode('utf-8'))
524                                if host.tag == '%sname' % MODS:
525                                    realname, nametype, namerole, pnd = get_name(host)
526                                    if pnd is not None:
527                                        doc.append(solr('pnd', '%s#%s' % (realname, pnd)))
528                                    if namerole == 'edt' and nametype == 'personal':
529                                        doc.append(solr('editor', realname))
530                                        doc.append(solr('fperson', realname))
531                                        bib_editors.append(realname)
532                                        ris_list.append('ED  - %s\n' % realname)
533                                        json_name.setdefault('name', {}).setdefault('type', nametype)
534                                        json_name.setdefault('name', {}).setdefault('namePart', {}).setdefault('displayForm', realname)
535                                        json_name.setdefault('name', {}).setdefault('namePart', {}).setdefault('role', {}).setdefault('type', {}).setdefault('code', namerole)
536                                        json_dict.setdefault('names', []).append(json_name)
537                                        json_name = {}
538                                if host.tag == '%spart' % MODS:
539                                    for detail in host:
540                                        if detail.tag == '%sdate' % MODS:
541                                            #doc.append(solr('date', '%s%s' % (detail.text, '-01-01T00:00:00Z')))
542                                            year = detail.text
543                                            doc.append(solr('date', year))
544                                            #print year
545                                            if DATE_RANGE_RE.match(detail.text):
546                                                date_range = DATE_RANGE_RE.match(detail.text)
547                                                doc.append(solr('fdate', date_range.group(1)))
548                                            else:
549                                                doc.append(solr('fdate', year[:4]))
550                                            dcds_tree.append(stmt('issued', detail.text))
551                                            dc_list.append(dc('date', detail.text))
552                                            bibtex_list.append('\tyear = {%s},\n' % year)
553                                            ris_list.append('Y1  - %s///\n' % year)
554                                        if detail.tag == '%sdetail' % MODS:
555                                            if detail.attrib['type'] == 'issue':
556                                                doc.append(solr('issue', detail[0].text))
557                                                bibtex_list.append('\tnumber = {%s},\n' % detail[0].text)
558                                                ris_list.append('IS  - %s\n' % detail[0].text)
559                                            if detail.attrib['type'] == 'volume':
560                                                doc.append(solr('volume', detail[0].text))
561                                                bibtex_list.append('\tvolume = {%s},\n' % detail[0].text)
562                                                ris_list.append('VL  - %s\n' % detail[0].text)
563                                        if detail.tag == '%sextent' % MODS:
564                                            if detail.attrib['unit'] == 'pages':
565                                                doc.append(solr('pages', detail[0].text))
566                                                bibtex_list.append('\tpages = {%s},\n' % detail[0].text)
567                                                dcds_tree.append(stmt('extent', detail[0].text))
568                                                dc_list.append(dc('format', detail[0].text))
569                                if host.tag == '%srelatedItem' % MODS:
570                                    if host.attrib['type'] == 'series':
571                                        for series in host:
572                                            if series.tag == '%stitleInfo' % MODS:
573                                                # print get_title(series).decode('utf8')
574                                                doc.append(solr('series_title', get_title(series)))
575                                                doc.append(solr('fjtitle', get_title(series)))
576                                                dcds_tree.append(stmt('isPartOf', get_title(series)))
577                                                dc_list.append(dc('relation', get_title(series).decode('utf-8')))
578                                                bibtex_list.append('\tseries = {%s},\n' % umlaut(get_title(series).decode('utf-8')))
579                                            if series.tag == '%spart' % MODS:
580                                                for detail in series:
581                                                    if detail.tag == '%sdate' % MODS:
582                                                        #doc.append(solr('date', '%s%s' % (detail.text, '-01-01T00:00:00Z')))
583                                                        doc.append(solr('date', detail.text))
584                                                        year = detail.text
585                                                        #print year
586                                                        if DATE_RANGE_RE.search(detail.text):
587                                                            date_range = DATE_RANGE_RE.search(detail.text)
588                                                            doc.append(solr('fdate', date_range.group(1)))
589                                                        else:
590                                                            doc.append(solr('fdate', year[:4]))
591                                                    if detail.tag == '%sdetail' % MODS:
592                                                        if detail.attrib['type'] == 'issue':
593                                                            doc.append(solr('issue', detail[0].text))
594                                                        #if detail.attrib['type'] == 'volume':
595                                                            #doc.append(solr('volume', detail[0].text))
596                                                    if detail.tag == '%sextent' % MODS:
597                                                        if detail.attrib['unit'] == 'pages':
598                                                            doc.append(solr('pages', detail[0].text))
599                                if host.tag == '%soriginInfo' % MODS:
600                                    for info in host:
601                                        if info.tag == '%spublisher' % MODS:
602                                            doc.append(solr('publisher', info.text))
603                                            dcds_tree.append(stmt('publisher', info.text))
604                                            ris_list.append('PB  - %s\n' % info.text)
605                                            bibtex_list.append('\tpublisher = {%s},\n' % umlaut(info.text))
606                                        if info.tag == '%sdateIssued' % MODS:
607                                            if debug_genre == 'ContributionInLegalCommentary':
608                                                pass
609                                            else:
610                                                if info.text:
611                                                    # doc.append(solr('date', '%s%s' % (info.text, '-01-01T00:00:00Z')))
612                                                    doc.append(solr('date', info.text))
613                                                    year = info.text
614                                                    #print year
615                                                    if DATE_RANGE_RE.search(info.text):
616                                                        date_range = DATE_RANGE_RE.search(info.text)
617                                                        doc.append(solr('fdate', date_range.group(1)))
618                                                    else:
619                                                        doc.append(solr('fdate', year[:4]))
620                        # elif elem.attrib.get('type') == 'constituent':
621                        #       stellen = []
622                        #       ids = []
623                        #       for part in elem:
624                        #               if part.tag == '%spart' % MODS:
625                        #                       for extent in part:
626                        #                               if extent.tag == '%sextent' % MODS:
627                        #                                       if extent.attrib.get('unit') == 'reference':
628                        #                                               stellen = extent[0].text.split('; ')
629                        #                                               # print stellen
630                        #                               if extent.tag == '%sidentifier' % MODS:
631                        #                                       ids = extent.text.split('; ')
632                        #       if len(stellen) == len(ids):
633                        #               for stelle, pri_id in zip(stellen, ids):
634                        #                       doc.append(solr('stelle', '%s: http://archeoinf.de/gela/%s' % (stelle, pri_id)))
635                        #       elif len(stellen) < len(ids):
636                        #               if stellen:
637                        #                       # if len(stellen) > 1:
638                        #                               # print 'stellen', stellen
639                        #                               # print ids
640                        #                       pass
641                        #               else:
642                        #                       # print 'stellen', stellen
643                        #                       # print ids
644                        #                       pass
645                        #       else:
646                        #               # print 'stellen', stellen
647                        #               # print ids
648                        #               pass
649                               
650                        elif elem.attrib.get('type') == 'series':
651                            for series in elem:
652                                if series.tag == '%stitleInfo' % MODS:
653                                    # print get_title(series).decode('utf8')
654                                    doc.append(solr('series_title', get_title(series)))
655                                    doc.append(solr('fjtitle', get_title(series)))
656                                    dcds_tree.append(stmt('isPartOf', get_title(series)))
657                                    dc_list.append(dc('relation', get_title(series).decode('utf-8')))
658                                    bibtex_list.append('\tseries = {%s},\n' % umlaut(get_title(series).decode('utf-8')))
659                                if series.tag == '%spart' % MODS:
660                                    for detail in series:
661                                        if detail.tag == '%sdate' % MODS:
662                                            #doc.append(solr('date', '%s%s' % (detail.text, '-01-01T00:00:00Z')))
663                                            doc.append(solr('date', detail.text))
664                                            year = detail.text
665                                            #print year
666                                            if DATE_RANGE_RE.search(detail.text):
667                                                date_range = DATE_RANGE_RE.search(detail.text)
668                                                doc.append(solr('fdate', date_range.group(1)))
669                                            else:
670                                                doc.append(solr('fdate', year[:4]))
671                                        if detail.tag == '%sdetail' % MODS:
672                                            if detail.attrib['type'] == 'issue':
673                                                doc.append(solr('issue', detail[0].text))
674                                            #if detail.attrib['type'] == 'volume':
675                                                #doc.append(solr('volume', detail[0].text))
676                                        if detail.tag == '%sextent' % MODS:
677                                            if detail.attrib['unit'] == 'pages':
678                                                doc.append(solr('pages', detail[0].text))
679                               
680                               
681                    if elem.tag == '%soriginInfo' % MODS:
682                        for origin in elem:
683                            if origin.tag == '%sedition' % MODS:
684                                doc.append(solr('edition', origin.text))
685                                bibtex_list.append('\tedition = {%s},\n' % origin.text)
686                            if origin.tag == '%spublisher' % MODS:
687                                doc.append(solr('publisher', origin.text))
688                                dcds_tree.append(stmt('publisher', origin.text))
689                                bibtex_list.append('\tpublisher = {%s},\n' % umlaut(origin.text))
690                            if origin.tag == '%splace' % MODS:
691                                doc.append(solr('place', origin[0].text))
692                            if origin.tag == '%sdateIssued' % MODS:
693                                doc.append(solr('date', origin.text))
694                                #logging.debug('%s in %s' % (info.text, debug_id))
695                                if DATE_RANGE_RE.search(info.text):
696                                    date_range = DATE_RANGE_RE.search(info.text)
697                                    doc.append(solr('fdate', date_range.group(1)))
698                                else:
699                                    doc.append(solr('fdate', origin.text[:4]))
700                                    #logging.debug('%s in %s' % (origin.text, debug_id))
701                                bibtex_list.append('\tyear = {%s},\n' % origin.text)
702                                ris_list.append('Y1  - %s///\n' % origin.text)
703                                dcds_tree.append(stmt('issued', origin.text))
704                                dc_list.append(dc('date', origin.text))
705                    if elem.tag == '%slocation' % MODS:
706                        for location in elem:
707                            if location.tag == '%sphysicalLocation' % MODS:
708                                doc.append(solr('location', location.text))
709                            if location.tag == '%sshelfLocator' % MODS:
710                                doc.append(solr('locator', location.text))
711                            if location.tag == '%surl' % MODS:
712                                doc.append(solr('url', location.text))
713                                bibtex_list.append('\tURL = {%s}' % location.text)
714                    if elem.tag == '%slanguage' % MODS:
715                        for lang in elem:
716                            if lang.tag == '%slanguageTerm' % MODS:
717                                if lang.attrib['authority'] == 'iso639-2b':
718                                    lang_hist[lang.text] = lang_hist.setdefault(lang.text, 0) + 1
719                                    doc.append(solr('language', languageCodes[lang.text]['ger']))
720                                    dcds_tree.append(stmt('language', languageCodes[lang.text]['ger']))
721                                    dc_list.append(dc('language', languageCodes[lang.text]['ger']).decode('utf-8'))
722                                    bibtex_list.append('\tlanguage = {%s},\n' % umlaut(languageCodes[lang.text]['ger'].decode('utf-8')))
723                                    # RIS hat keine Sprache?
724                                    json_dict.setdefault('language', {}).setdefault('languageTerm', languageCodes[lang.text]['ger'])
725                    if elem.tag == '%sabstract' % MODS:
726                        # lang = NGram('LM_MOD')
727                        # for i in elem.text:
728                            # print '%s (%d)' % (i, elem.text.index(i)),
729                        # print '%s => %s' % (elem.text, lang.classify(elem.text))
730                        # print
731
732                        if abstract_consent == 'True':
733                            doc.append(solr('abstract', elem.text))
734                            dc_list.append(dc('description', elem.text))
735                            dcds_tree.append(stmt('abstract', elem.text))
736                            bibtex_list.append('\tabstract = {%s},\n' % elem.text)
737                            ris_list.append('N2  - %s\n' % elem.text)
738                        else:
739                            #logging.debug(etree.tostring(elem))
740                            doc.append(solr('ro_abstract', elem.text))
741                            data.remove(elem)
742                            #logging.debug(etree.tostring(data))
743                    if elem.tag == '%sclassification' % MODS:
744                        if elem.attrib.get('authority', '') == 'stw':
745                            stw_ids.append(elem.text)
746                                                       
747                    if elem.tag == '%sphysicalDescription' % MODS:
748                        for extent in elem:
749                            if extent.tag == '%sextent' % MODS:
750                                doc.append(solr('pages', extent.text))
751                                dcds_tree.append(stmt('format', extent.text))
752                                dc_list.append(dc('format', extent.text))
753                    if elem.tag == '%srecordInfo' % MODS:
754                        for info in elem:
755                            if info.tag == '%srecordContentSource' % MODS:
756                                json_dict.setdefault('recordContentSource', info.text)
757                            if info.tag == '%srecordCreationDate' % MODS:
758                                #json_dict.setdefault('recordCreationDate', datetime.datetime.now().isoformat()[:-9] + '00Z') # Citavi ISO-Format abwarten
759                                #doc.append(solr('recordCreationDate', datetime.datetime.now().isoformat()[:-9] + '00Z')) # Citavi ISO-Format abwarten
760                                doc.append(solr('recordCreationDate', '%sT00:00:00Z' % info.text))
761                            if info.tag == '%srecordChangeDate' % MODS:
762                                #doc.append(solr('recordChangeDate', datetime.datetime.now().isoformat()[:-9] + '00Z')) # Citavi ISO-Format abwarten
763                                #json_dict.setdefault('recordChangeDate', datetime.datetime.now().isoformat()[:-9] + '00Z') # Citavi ISO-Format abwarten
764                                doc.append(solr('recordChangeDate', '%sT00:00:00Z' % info.text))
765                            # json_dict.setdefault('typeOfResource', 'Text')
766                    if elem.tag == '%sextension' % MODS:
767                        for bc in elem:
768                            if bc.tag == '%sbibliographicCitation' % DCTERMS:
769                                doc.append(solr('bibliographicCitation', bc.text))
770                                dcds_tree.append(stmt('bibliographicCitation', bc.text))
771                    if elem.tag == '%stableOfContents' % MODS:
772                        if elem.attrib.get('%shref' % XLINK):
773                            doc.append(solr('toc_link', elem.attrib.get('%shref' % XLINK)))
774                            dcds_tree.append(stmt('tableOfContents', elem.attrib.get('%shref' % XLINK)))
775                            dc_list.append(dc('description', elem.attrib.get('%shref' % XLINK)))
776                        if elem.text:
777                            doc.append(solr('toc_text', elem.text))
778                            dcds_tree.append(stmt('tableOfContents', elem.text))
779                            dc_list.append(dc('description', elem.text))
780                                       
781                #print etree.tostring(doc)
782                               
783                if genre:
784                    try:
785                        genre = list(genre)
786                        doc.append(solr('genrel1', GENRE_MAP[genre[0]]))
787                        doc.append(solr('genrel2', genre[0]))
788                        ris = 'TY  - %s\n' % RIS_GENRE_MAP[genre[0]]
789                        #bibtex = '@%s{%s_%s,\n' % (BIBTEX_GENRE_MAP[genre[0]], self.fach.decode('utf-8'), str(record_counter))
790                        bibtex = '@%s{%s_%s,\n' % (BIBTEX_GENRE_MAP[genre[0]], self.fach.decode('utf-8'), guid.text)
791                        dcds_tree.append(stmt('type', GENRE_MAP[genre[0]]))
792                        dc_list.append(dc('type', GENRE_MAP[genre[0]]))
793                        json_dict.setdefault('genre', GENRE_MAP[genre[0]])
794                        genre_local = ''
795                    except KeyError as ke:
796                        logging.error(ke)
797
798                if genre_local:
799                    tmp = GENRE_LOCAL_MAP[genre_local]
800                    doc.append(solr('genrel1', GENRE_MAP[tmp]))
801                    doc.append(solr('genrel2', tmp))
802                    ris = 'TY  - %s\n' % RIS_GENRE_LOCAL_MAP[genre_local]
803                    #bibtex = '@%s{%s_%s,\n' % (BIBTEX_GENRE_LOCAL_MAP[genre_local], self.fach.decode('utf-8'), str(record_counter))
804                    bibtex = '@%s{%s_%s,\n' % (BIBTEX_GENRE_LOCAL_MAP[genre_local], self.fach.decode('utf-8'), guid.text)
805                    dcds_tree.append(stmt('type', GENRE_MAP[tmp]))
806                    dc_list.append(dc('type', GENRE_MAP[tmp]))
807                    json_dict.setdefault('genre', GENRE_MAP[tmp])
808                               
809                if stw_ids:
810                    (stw_descriptors, stw_subjects) = sparql(stw_ids)
811                    for stw_desc in stw_descriptors:
812                        doc.append(solr('stwdesc', stw_desc))
813                        for term in stw_descriptors[stw_desc]:
814                            doc.append(solr('stwterm', term))
815                                                       
816                    for stw_subject in stw_subjects:
817                        doc.append(solr('fsubject', stw_subject))
818                               
819                if issn:
820                    try:
821                        if jcr.get(year).get(issn):
822                            doc.append(solr('jcr', jcr.get(year).get(issn)))
823                    except AttributeError:
824                        pass
825                               
826                if bib_authors:
827                    if len(bib_authors) > 1:
828                        bibtex += '\tauthor = {%s},\n' % ' and '.join(bib_authors)
829                    else:
830                        bibtex += '\tauthor = {%s},\n' % bib_authors[0]
831                if bib_editors:
832                    if len(bib_editors) > 1:
833                        bibtex += '\teditor = {%s},\n' % ' and '.join(bib_editors)
834                    else:
835                        bibtex += '\teditor = {%s},\n' % bib_editors[0]
836                if keywords:
837                    if len(keywords) > 1:
838                        bibtex += '\tkeywords = {%s},\n' % '; '.join(keywords)
839                    else:
840                        bibtex += '\tkeywords = {%s},\n' % keywords[0]
841                bibtex += ''.join(bibtex_list)
842                bibtex += '}'
843                ris += ''.join(ris_list)
844                ris += 'ER - '
845                doc.append(solr('mods', xml2cdata(data)))
846                doc.append(solr('bibtex', bibtex))
847                doc.append(solr('ris', ris))
848                doc.append(solr('json', json.dumps(json_dict, indent=3)))
849                doc.append(solr('dc', dc2cdata(escape('\n'.join(dc_list))).encode('utf-8')))
850                doc.append(solr('dcds', xml2cdata(dcds_tree)))
851                       
852                index.append(doc)
853                record_counter += 1
854        myrecords = record_counter  - 1
855        logging.info('NUMBER OF RECORDS: %d' % myrecords)
856        #print lang_hist
857        if self.debug == True:
858            logging.info(etree.tostring(index, pretty_print=True))
859        return index
860               
861def main():
862    #commit()
863    #feed('20090506-gela.xml')
864    #commit()
865    #convert('20090520-gela.xml', 'Gela')
866    #convert('20090520-bergemann.xml', 'Bergemann')
867    #feed('20090526-bergemann.xml', 'Bergemann')
868    #feed('20090520-gela.xml', 'Gela')
869    #convert('MODS_Export.xml', 'Dummy')
870    convert('mods-xml/maschinenbau.xml', 'Maschinenbau', 'Maschinenbau')
871
872
873if __name__ == '__main__':
874    main()
Note: See TracBrowser for help on using the repository browser.