source: mods2solr.py @ 18:379be4ecdeef

Revision 18:379be4ecdeef, 43.4 KB checked in by hagenbruch@phoibe.ub.rub.de, 8 years ago (diff)

Added caching for the retrieval of consent forms.

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