annotate MetaDataFolder.py @ 23:5ed16f971297

getDomFromPathOrUrl does not throw exception but returns None.
author casties
date Wed, 25 Jul 2012 12:53:17 +0200
parents 9a1e75e708e1
children 64b703d1b8a4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
1 from OFS.Folder import Folder
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
2 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
3 from Globals import package_home
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
4 from AccessControl import ClassSecurityInfo
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
5 import os.path
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
6 import urlparse
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
7 import logging
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
8
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
9 import xml.etree.ElementTree as ET
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
10
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
11 from MetaDataMapping import MetaDataMapping
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
12 from MetaData import MetaData
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
13 from SrvTxtUtils import getHttpData, getText
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
14
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
15 def normalizeBibField(bt, underscore=True):
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
16 """returns normalised bib type for looking up mappings"""
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
17 bt = bt.strip().replace(' ', '-').lower()
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
18 if underscore:
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
19 bt = bt.replace('_', '-')
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
20
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
21 return bt
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
22
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
23 def OLDgetBibdataFromDom(dom):
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
24 """returns dict with all elements from bib-tag"""
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
25 bibinfo = {}
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
26 bib = dom.find(".//meta/bib")
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
27 if bib is not None:
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
28 # put type in @type
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
29 type = bib.get('type')
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
30 bibinfo['@type'] = normalizeBibField(type)
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
31 # put all subelements in dict
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
32 for e in bib:
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
33 bibinfo[normalizeBibField(e.tag)] = getText(e)
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
34
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
35 return bibinfo
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
36
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
37 def toString(list):
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
38 ret=u""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
39
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
40 for l in list:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
41 ret+=unicode(l)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
42
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
43 return ret
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
44
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
45 def dcMetaDataToHash(mdSet):
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
46 """Convenience Function for creates a hash from the DCMetadataset
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
47 @param mdSet: String containing DCMetadata informmation
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
48 currently only in the format getDCMetadata of this module"""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
49
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
50 NSS = {
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
51 'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
52 'dc': 'http://dublincore.org/documents/dcmi-namespace/',
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
53 'owl':"http://www.w3.org/2002/07/owl#",
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
54 'rdfs':"http://www.w3.org/2000/01/rdf-schema#"
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
55 }
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
56 ret={}
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
57 import StringIO
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
58 import sys
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
59 buffer= StringIO.StringIO(mdSet)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
60 try:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
61 md = amara.parse(buffer,prefixes=NSS)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
62 except:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
63 logging.error("Error: %s (%s)"%(sys.exc_info()[0],sys.exc_info()[1]))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
64
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
65 ret["error"]=mdSet
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
66 return ret
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
67
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
68 ret["title"] = toString(md.xml_xpath("//dc:title/text()"))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
69 ret["creator"] =toString(md.xml_xpath("//dc:creator/text()"))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
70 ret["date"] = toString(md.xml_xpath("//dc:date/text()"))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
71
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
72 return ret
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
73
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
74
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
75 class MetaDataFolder(Folder):
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
76 """provides methods for managing complete metadata structures"""
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
77 meta_type='MetaDataFolder'
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
78 security=ClassSecurityInfo()
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
79 manage_options = Folder.manage_options+(
5
c1dbf78cc036 more MetaDataFolder
casties
parents: 4
diff changeset
80 {'label':'Main Config','action':'changeMetaDataFolderForm'},
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
81 )
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
82
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
83 metaDataServerUrl = "http://digilib.mpiwg-berlin.mpg.de/digitallibrary/servlet/Texter?fn=%s"
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
84 """URL of metadata server. %s replaced by file path."""
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
85
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
86 def __init__(self,id,title='',metaDataServerUrl=None):
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
87 """initialize a new instance"""
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
88 self.id = id
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
89 self.title = title
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
90 if metaDataServerUrl:
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
91 self.metaDataServerUrl = metaDataServerUrl
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
92
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
93
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
94 def getMDFromPathOrUrl(self,path):
10
68bc459c9f59 getmd handles empty url
casties
parents: 9
diff changeset
95 """returns contents of metadata file from server as text"""
68bc459c9f59 getmd handles empty url
casties
parents: 9
diff changeset
96 if not path:
68bc459c9f59 getmd handles empty url
casties
parents: 9
diff changeset
97 logging.error("getMDFromPathOrUrl: empty path!")
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
98 return None
10
68bc459c9f59 getmd handles empty url
casties
parents: 9
diff changeset
99
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
100 parsedurl = urlparse.urlparse(path)
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
101 if parsedurl[0] != "":
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
102 # has schema (e.g. http)
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
103 url=path
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
104 else:
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
105 # path only
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
106 path = path.replace('/mpiwg/online/', '')
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
107 if path.endswith("index.meta"):
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
108 url = self.metaDataServerUrl%path
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
109 else:
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
110 url = os.path.join(self.metaDataServerUrl%path,'index.meta')
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
111
23
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
112 try:
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
113 md = getHttpData(url)
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
114 return md
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
115
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
116 except:
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
117 logging.error("getMDFromPathOrUrl: unable to get data!")
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
118
5ed16f971297 getDomFromPathOrUrl does not throw exception but returns None.
casties
parents: 20
diff changeset
119 return None
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
120
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
121 def getDomFromPathOrUrl(self, path):
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
122 """returns DOM of metadata file at given path"""
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
123 dom = None
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
124 data = self.getMDFromPathOrUrl(path)
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
125 if data:
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
126 dom = ET.fromstring(data)
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
127
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
128 return dom
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
129
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
130 def getXmlPathObj(self, xmlpath):
281d223aa361 attribution works now
casties
parents: 12
diff changeset
131 """returns object at xmlpath"""
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
132 # make xmlpath relative for Zope
20
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
133 logging.debug("XMlPAth:"+xmlpath)
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
134 if xmlpath[0] == '/':
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
135 xmlpath = xmlpath[1:]
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
136
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
137 obj = self.restrictedTraverse(xmlpath, None)
281d223aa361 attribution works now
casties
parents: 12
diff changeset
138 return obj
281d223aa361 attribution works now
casties
parents: 12
diff changeset
139
17
ba617e755c56 mostly finished attributions and copyright
casties
parents: 15
diff changeset
140 def getXmlPathData(self, xmlpath, path=None, dom=None, recursive=0, all=False, allText=False):
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
141 """returns contents of element at xmlpath as dict"""
281d223aa361 attribution works now
casties
parents: 12
diff changeset
142 logging.error("getXmlPathData(%s)"%xmlpath)
281d223aa361 attribution works now
casties
parents: 12
diff changeset
143 mdObj = self.getXmlPathObj(xmlpath)
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
144 if mdObj is not None:
17
ba617e755c56 mostly finished attributions and copyright
casties
parents: 15
diff changeset
145 return mdObj.getData(path=path, dom=dom, recursive=recursive, all=all, allText=allText)
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
146 else:
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
147 logging.error("getXmlPathData: MetaData element at '%s' not found!"%xmlpath)
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
148 return None
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
149
17
ba617e755c56 mostly finished attributions and copyright
casties
parents: 15
diff changeset
150 def getXmlPathFormatted(self, xmlpath, template, path=None, dom=None, data=None, allFields=False, recursive=0, all=False, allText=False):
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
151 """returns contents of element at xmlpath as dict"""
281d223aa361 attribution works now
casties
parents: 12
diff changeset
152 logging.error("getXmlPathFormatted(xmlpath=%s, template=%s)"%(xmlpath,template))
281d223aa361 attribution works now
casties
parents: 12
diff changeset
153 mdObj = self.getXmlPathObj(xmlpath)
281d223aa361 attribution works now
casties
parents: 12
diff changeset
154 if mdObj is not None:
281d223aa361 attribution works now
casties
parents: 12
diff changeset
155 if data is None:
17
ba617e755c56 mostly finished attributions and copyright
casties
parents: 15
diff changeset
156 data = mdObj.getData(path=path, dom=dom, recursive=recursive, all=all, allText=allText)
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
157
281d223aa361 attribution works now
casties
parents: 12
diff changeset
158 if data is None:
281d223aa361 attribution works now
casties
parents: 12
diff changeset
159 return ''
281d223aa361 attribution works now
casties
parents: 12
diff changeset
160
281d223aa361 attribution works now
casties
parents: 12
diff changeset
161 fmt = ''
15
41b90f09a1f2 new getdata
casties
parents: 14
diff changeset
162 if all:
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
163 # data is list of elements
281d223aa361 attribution works now
casties
parents: 12
diff changeset
164 for d in data:
281d223aa361 attribution works now
casties
parents: 12
diff changeset
165 # concatenate formatted strings
281d223aa361 attribution works now
casties
parents: 12
diff changeset
166 fmt += mdObj.getFormatted(template, path=path, dom=dom, data=d, allFields=allFields) + '\n'
281d223aa361 attribution works now
casties
parents: 12
diff changeset
167
281d223aa361 attribution works now
casties
parents: 12
diff changeset
168 else:
281d223aa361 attribution works now
casties
parents: 12
diff changeset
169 fmt = mdObj.getFormatted(template, path=path, dom=dom, data=data, allFields=allFields)
281d223aa361 attribution works now
casties
parents: 12
diff changeset
170
281d223aa361 attribution works now
casties
parents: 12
diff changeset
171 return fmt
281d223aa361 attribution works now
casties
parents: 12
diff changeset
172
281d223aa361 attribution works now
casties
parents: 12
diff changeset
173 else:
281d223aa361 attribution works now
casties
parents: 12
diff changeset
174 logging.error("getXmlPathFormatted: MetaData element at '%s' not found!"%xmlpath)
281d223aa361 attribution works now
casties
parents: 12
diff changeset
175 return ''
281d223aa361 attribution works now
casties
parents: 12
diff changeset
176
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
177 def getResourceData(self, path=None, dom=None):
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
178 """returns contents of resource tag as dict"""
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
179 return self.getXmlPathData('resource', path=path, dom=dom)
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
180
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
181 def getTexttoolData(self, path=None, dom=None):
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
182 """returns contents of texttool tag as dict"""
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
183 return self.getXmlPathData('resource/meta/texttool', path=path, dom=dom)
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
184
12
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
185 def getAccessData(self, path=None, dom=None):
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
186 """returns contents of access tag as dict"""
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
187 return self.getXmlPathData('resource/meta/access-conditions/access', path=path, dom=dom)
7f0e2b656e5c more work for non-bib metadata
casties
parents: 11
diff changeset
188
15
41b90f09a1f2 new getdata
casties
parents: 14
diff changeset
189 def getAttributionData(self, path=None, dom=None, all=True):
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
190 """returns contents of attribution tag as dict"""
15
41b90f09a1f2 new getdata
casties
parents: 14
diff changeset
191 return self.getXmlPathData('resource/meta/access-conditions/attribution', path=path, dom=dom, all=all)
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
192
15
41b90f09a1f2 new getdata
casties
parents: 14
diff changeset
193 def getAttributionFormatted(self, template, path=None, dom=None, data=None, all=True):
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
194 """returns formatted contents of access tag"""
15
41b90f09a1f2 new getdata
casties
parents: 14
diff changeset
195 return self.getXmlPathFormatted('resource/meta/access-conditions/attribution', template, path=path, dom=dom, data=data, all=all)
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
196
17
ba617e755c56 mostly finished attributions and copyright
casties
parents: 15
diff changeset
197 def getCopyrightData(self, path=None, dom=None, recursive=1, all=True):
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
198 """returns contents of copyright tag as dict"""
18
611b6df70840 niceification
casties
parents: 17
diff changeset
199 # information is two tags deep - recursive=1
17
ba617e755c56 mostly finished attributions and copyright
casties
parents: 15
diff changeset
200 return self.getXmlPathData('resource/meta/access-conditions/copyright', path=path, dom=dom, recursive=recursive, all=all)
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
201
18
611b6df70840 niceification
casties
parents: 17
diff changeset
202 def getCopyrightFormatted(self, template, path=None, dom=None, data=None, recursive=1, all=True):
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
203 """returns formatted contents of access tag"""
18
611b6df70840 niceification
casties
parents: 17
diff changeset
204 # information is two tags deep - recursive=1
611b6df70840 niceification
casties
parents: 17
diff changeset
205 return self.getXmlPathFormatted('resource/meta/access-conditions/copyright', template, path=path, dom=dom, data=data, recursive=recursive, all=all)
14
281d223aa361 attribution works now
casties
parents: 12
diff changeset
206
20
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
207 def getContextData(self, path=None, dom=None, all=True):
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
208 """returns contents of context tag as dict"""
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
209 # information is two tags deep - recursive=1
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
210
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
211 return self.getXmlPathData('resource/meta/context', path=path, dom=dom, all=all)
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
212
9a1e75e708e1 small bugs
dwinter
parents: 18
diff changeset
213
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
214 def getBibData(self, path=None, dom=None):
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
215 """returns contents of bib tag as dict"""
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
216 return self.resource.meta.bib.getData(path=path, dom=dom)
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
217
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
218 def getBibMapping(self, bibtype):
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
219 """returns MetaDataMapping for resource/meta/bib of bibtype"""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
220 return self.resource.meta.bib.getMapping(bibtype)
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
221
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
222 def getBibFields(self, bibdata):
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
223 """returns dict with metadata description for bibdata"""
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
224 return self.resource.meta.bib.getMapFields(bibdata)
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
225
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
226 def getBibMappedData(self, bibdata, allFields=False):
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
227 """returns dict with metadata descriptions and data for bibdata"""
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
228 return self.resource.meta.bib.getMappedData(bibdata, allFields=allFields)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
229
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
230 def getDCMappedData(self, bibdata):
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
231 """returns dict with DC keys and data from bibdata"""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
232 return self.resource.meta.bib.getDCMappedData(bibdata)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
233
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
234 def getBibFormattedMetaData(self, path=None, dom=None, bibdata=None):
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
235 """get the metadafrom server"""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
236 logging.debug("getBibFormattedMetaData(path=%s)"%path)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
237 return self.resource.meta.bib.getFormatted('metadata_template', path=path, dom=dom, data=bibdata)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
238
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
239 def getBibFormattedMetaDataExtended(self,path=None, dom=None, bibdata=None):
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
240 """get the metadafrom server"""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
241 logging.debug("getBibFormattedMetaDataExtended(path=%s)"%path)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
242 return self.resource.meta.bib.getFormatted('metadata_extended_template', path=path, dom=dom, data=bibdata, allFields=True)
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
243
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
244 def getBibFormattedLabel(self,path=None, dom=None, bibdata=None):
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
245 """get the metadafrom server"""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
246 logging.debug("getBibFormattedLabel(%s)"%path)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
247 return self.resource.meta.bib.getFormatted('label_template', path=path, dom=dom, data=bibdata)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
248
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
249 # compatibility
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
250 getFormattedMetaData = getBibFormattedMetaData
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
251 getFormattedMetaDataShort = getBibFormattedMetaData
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
252 getFormattedMetaDataExtended = getBibFormattedMetaDataExtended
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
253 getFormattedLabel = getBibFormattedLabel
8
4cd862bf37a3 more renovation
casties
parents: 6
diff changeset
254
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
255
11
a29665fa9c62 more work for non-bib metadata
casties
parents: 10
diff changeset
256 def OLDgetDCFormatted(self,path):
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
257 """get the metadata as dc set"""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
258 logging.debug("getDCFormatted(path=%s)"%path)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
259 namespace={ 'mpiwg': "http://www.mpiwg-berlin.mpg.de/ns/mpiwg"}
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
260 namespaceUsed=False
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
261
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
262 md = self.getMDFromPathOrUrl(path)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
263 logging.debug("MD in XML"+md)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
264 im = amara.parse(md, prefixes=namespace)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
265
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
266 typePaths=im.xml_xpath('//bib/@type')
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
267 archimedes=False
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
268
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
269 if len(typePaths)<1:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
270 typePaths=im.xml_xpath('//meta/archimedes') # sinderfall fuer veraltete index.meta files vom typ archimedes
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
271 if len(typePaths)>0:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
272 type = "archimedes"
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
273 archimedes=True
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
274 else:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
275 typePaths=im.xml_xpath('//mpiwg:bib/@type')
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
276 if len(typePaths)<1:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
277 return ""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
278 else:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
279 namespaceUsed=True
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
280
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
281 type=unicode(typePaths[0])
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
282 else:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
283 type=unicode(typePaths[0])
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
284 logging.info("got type:"+type)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
285 try:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
286 mapping=getattr(self.main.meta.bib,type.lower(),None)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
287 except:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
288 logging.error("getMetaDataFromServer no mapping for type: %s"%type)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
289 return ""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
290
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
291 try:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
292 dcMapping=getattr(self.main.meta.bib,"dc",None)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
293 except:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
294 logging.error("getMetaDataFromServer no dc in meta/bib")
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
295 return ""
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
296
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
297 mds=mapping.generateMappingHash() # Hole das Mapping generisches Feld --> Feld im entsprechenden Typ
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
298 dcMds=dcMapping.generateMappingHash()
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
299
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
300 mdHash=[]
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
301 logging.debug("Value: %s"%repr(mds))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
302
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
303 for key,valueTriple in mds.items():
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
304 value=valueTriple[0]
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
305 logging.debug("Value: %s"%repr(value))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
306 logging.debug("Key: %s"%repr(key))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
307 if value!="":
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
308 if not archimedes:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
309 if namespaceUsed:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
310 try:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
311 v = im.xml_xpath('//mpiwg:bib/mpiwg:%s/text()'%value)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
312 except:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
313 logging.error('cannot do: //mpiwg:bib/mpiwg:%s/text()'%value)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
314 else:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
315 v = im.xml_xpath('//bib/%s/text()'%value)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
316 else:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
317 v = im.xml_xpath('//archimedes/%s/text()'%value)
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
318 if len(v) > 0:
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
319 dc=dcMds[key][0]
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
320
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
321 if (dc !="") and (value !=""):
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
322 logging.debug("%s--> : %s"%(repr(value),dc))
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
323 mdHash.append([dc,unicode(v[0])])
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
324
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
325 ret="""<bib xmlns:dc="http://dublincore.org/documents/dcmi-namespace/"> """
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
326 ret+="<dc:type>%s</dc:type>"%type
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
327 for md in mdHash:
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
328
6
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
329 ret+="""<dc:%s>%s</dc:%s>"""%(md[0],xml.sax.saxutils.escape(md[1]),md[0])
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
330 ret+="</bib>"
00147a1ab4ac division between MetaDataFolder and Metadata looks good now (to me :-)
casties
parents: 5
diff changeset
331 return ret
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
332
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
333
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
334 changeMetaDataFolderForm = PageTemplateFile('zpt/changeMetaDataFolder',globals())
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
335
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
336 security.declarePublic('changeMetaDataFolder')
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
337 def changeMetaDataFolder(self,title,metaDataServerUrl,RESPONSE=None):
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
338 """Change MetaDataFolder"""
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
339 self.title = title
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
340 self.metaDataServerUrl=metaDataServerUrl
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
341 if RESPONSE is not None:
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
342 RESPONSE.redirect('manage_main')
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
343
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
344
9
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
345 def manage_addMetaDataFolderForm(self):
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
346 """add MetaDataFolder form"""
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
347 pt = PageTemplateFile('zpt/addMetadataFolderForm',globals()).__of__(self)
eeaad777d3d7 more work for non-bib metadata
casties
parents: 8
diff changeset
348 return pt()
4
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
349
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
350 def manage_addMetaDataFolder(self,id,title,RESPONSE=None):
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
351 """a MetaDataFolder objekt"""
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
352 newObj=MetaDataFolder(id,title)
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
353 self.Destination()._setObject(id,newObj)
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
354 if RESPONSE is not None:
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
355 RESPONSE.redirect('manage_main')
8291255b1868 adding new base level class MetaDataFolder.
casties
parents:
diff changeset
356