Page Menu
Home
c4science
Search
Configure Global Search
Log In
Files
F85694545
elmsubmit_generate_marc.py
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Subscribers
None
File Metadata
Details
File Info
Storage
Attached
Created
Tue, Oct 1, 07:43
Size
6 KB
Mime Type
text/x-python
Expires
Thu, Oct 3, 07:43 (1 d, 22 h)
Engine
blob
Format
Raw Data
Handle
21244811
Attached To
R3600 invenio-infoscience
elmsubmit_generate_marc.py
View Options
# -*- coding: utf-8 -*-
##
## $Id$
##
## This file is part of the CERN Document Server Software (CDSware).
## Copyright (C) 2002, 2003, 2004, 2005, 2006 CERN.
##
## The CDSware is free software; you can redistribute it and/or
## modify it under the terms of the GNU General Public License as
## published by the Free Software Foundation; either version 2 of the
## License, or (at your option) any later version.
##
## The CDSware is distributed in the hope that it will be useful, but
## WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with CDSware; if not, write to the Free Software Foundation, Inc.,
## 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
import
os
from
string
import
split
import
cdsware.elmsubmit_config
as
elmsubmit_config
def
generate_marc
(
submission_dict
):
""" method generates a marc xml file from the submission dict
"""
marc_dict
=
{}
for
field
in
submission_dict
.
keys
():
# print "field", field, submission_dict[field]
# marc_dict should cotain a dictionary {'marc_code', value, ...}
generate_data_field
(
field
,
submission_dict
[
field
],
marc_dict
)
# generate an xml file from marc_dict
# print 'MARC DICT', marc_dict
full_marc
=
print_marc
(
marc_dict
)
return
full_marc
def
print_marc
(
marc_dict
):
""" method prints the xml file from the transformed dictionary
"""
marc_text
=
'<record>
\n
'
# extract the ind1 and ind2 tags
for
key
in
marc_dict
.
keys
():
tag
=
key
[
0
:
3
]
if
key
[
3
]
!=
'_'
:
ind1
=
key
[
3
]
else
:
ind1
=
''
if
key
[
4
]
!=
'_'
:
ind2
=
key
[
4
]
else
:
ind2
=
''
# subfields joined into one field
if
key
in
elmsubmit_config
.
marc_fields_joined
.
keys
():
tuple_list
=
marc_dict
[
key
]
prefix_list
=
[]
prefix_dict
=
{}
# make a list and a dictionary with occurance numbers
for
subfield_tuple
in
marc_dict
[
key
]:
prefix_list
.
append
(
subfield_tuple
[
0
])
if
prefix_dict
.
has_key
(
subfield_tuple
[
0
])
==
1
:
prefix_dict
[
subfield_tuple
[
0
]]
=
prefix_dict
[
subfield_tuple
[
0
]]
+
1
else
:
prefix_dict
[
subfield_tuple
[
0
]]
=
1
for
linked_prefix_list
in
elmsubmit_config
.
marc_fields_joined
[
key
]:
#we found a list of prefixes to join, build a field out of them
while
(
contains_elements
(
linked_prefix_list
,
prefix_dict
.
keys
())
==
True
):
marc_text
=
marc_text
+
'<datafield tag ="'
+
tag
+
'" ind1="'
+
ind1
+
'" ind2="'
+
ind2
+
'">
\n
'
for
prefix
in
linked_prefix_list
:
tuple_index
=
prefix_list
.
index
(
prefix
)
sub_tuple
=
tuple_list
[
tuple_index
]
marc_text
=
marc_text
+
'<subfield code="'
+
sub_tuple
[
0
]
+
'">'
+
sub_tuple
[
1
]
+
'</subfield>
\n
'
del
tuple_list
[
tuple_index
]
del
prefix_list
[
tuple_index
]
prefix_dict
[
prefix
]
=
prefix_dict
[
prefix
]
-
1
if
prefix_dict
[
prefix
]
==
0
:
del
prefix_dict
[
prefix
]
marc_text
=
marc_text
+
'</datafield>
\n
'
# append the actual datafields
for
sub_tuple
in
tuple_list
:
marc_text
=
marc_text
+
'<datafield tag ="'
+
tag
+
'" ind1="'
+
ind1
+
'" ind2="'
+
ind2
+
'">
\n
'
marc_text
=
marc_text
+
'<subfield code="'
+
sub_tuple
[
0
]
+
'">'
+
sub_tuple
[
1
]
+
'</subfield>
\n
'
prefix_dict
[
sub_tuple
[
0
]]
=
prefix_dict
[
sub_tuple
[
0
]]
-
1
if
prefix_dict
[
sub_tuple
[
0
]]
==
0
:
del
prefix_dict
[
sub_tuple
[
0
]]
marc_text
=
marc_text
+
'</datafield>
\n
'
del
tuple_list
del
prefix_list
else
:
# simply create the datafield
for
subfield_tuple
in
marc_dict
[
key
]:
marc_text
=
marc_text
+
'<datafield tag ="'
+
tag
+
'" ind1="'
+
ind1
+
'" ind2="'
+
ind2
+
'">
\n
'
marc_text
=
marc_text
+
'<subfield code="'
+
subfield_tuple
[
0
]
+
'">'
+
subfield_tuple
[
1
]
+
'</subfield>
\n
'
marc_text
=
marc_text
+
'</datafield>
\n
'
marc_text
=
marc_text
+
'</record>'
return
marc_text
def
contains_elements
(
small_list
,
big_list
):
"""function checking if all elements of list a are in list b
"""
for
element
in
small_list
:
try
:
a
=
big_list
.
index
(
element
)
except
ValueError
:
return
False
return
True
def
generate_data_field
(
field
,
value
,
marc_dict
):
""" for a given data field, determine if it is in the marc dictionary dictionary and update marc_dict accordingly
"""
if
(
field
in
elmsubmit_config
.
marc_mapping
):
# print "field:", field
# field is a normal field
if
isinstance
(
elmsubmit_config
.
marc_mapping
[
field
],
list
)
==
False
:
for
value_part
in
value
:
(
datafield
,
subfield
)
=
process_marc
(
elmsubmit_config
.
marc_mapping
[
field
])
if
marc_dict
.
has_key
(
datafield
)
==
1
:
marc_dict
[
datafield
]
.
append
((
subfield
,
value_part
))
else
:
marc_dict
[
datafield
]
=
[(
subfield
,
value_part
)]
else
:
# field is a list
#determine the length
for
value_part
in
value
:
if
value
.
index
(
value_part
)
==
0
:
(
datafield
,
subfield
)
=
process_marc
(
elmsubmit_config
.
marc_mapping
[
field
][
0
])
if
marc_dict
.
has_key
(
datafield
)
==
1
:
marc_dict
[
datafield
]
.
append
((
subfield
,
value_part
))
else
:
marc_dict
[
datafield
]
=
[(
subfield
,
value_part
)]
else
:
(
datafield
,
subfield
)
=
process_marc
(
elmsubmit_config
.
marc_mapping
[
field
][
1
])
if
marc_dict
.
has_key
(
datafield
)
==
1
:
marc_dict
[
datafield
]
.
append
((
subfield
,
value_part
))
else
:
marc_dict
[
datafield
]
=
[(
subfield
,
value_part
)]
else
:
pass
#print "field_not_in Marc:", field
def
process_marc
(
marc_code
):
""" extract the datafield and subfield from a Marc field
"""
# print "marc_code", marc_code
datafield
=
marc_code
[
0
:
5
]
subfield
=
marc_code
[
5
]
# print "datafield", datafield, "subfield", subfield
return
(
datafield
,
subfield
)
Event Timeline
Log In to Comment