Advertisement
Guest User

Untitled

a guest
Jul 10th, 2014
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.84 KB | None | 0 0
  1. import zope.interface
  2.  
  3. from ckanext.publicamundi.lib.metadata.base import Object
  4. from ckanext.publicamundi.lib.metadata.schemata.inspire import IThesaurus, IInspireMetadata
  5.  
  6. from ckanext.publicamundi.lib.metadata.types import object_null_adapter
  7. from ckanext.publicamundi.lib.metadata.types.common import *
  8.  
  9. @object_null_adapter(IThesaurus)
  10. class Thesaurus(Object):
  11.     zope.interface.implements(IThesaurus)
  12.  
  13.     title = None
  14.     reference_date = None
  15.     date_type = None
  16.     value = None
  17.     terms = list
  18.  
  19. @object_null_adapter(IInspireMetadata)
  20. class InspireMetadata(Object):
  21.     zope.interface.implements(IInspireMetadata)
  22.  
  23.     contact = list
  24.     datestamp = None
  25.     languagecode = None
  26.     title = None
  27.     identifier = list
  28.     abstract = None
  29.     locator = list
  30.     resource_language = list
  31.     topic_category = list
  32.     keywords = list
  33.     bounding_box = list
  34.     temporal_extent = list
  35.     creation_date = None
  36.     publication_date = None
  37.     revision_date = None
  38.     lineage = None
  39.     denominator = list
  40.     spatial_resolution = list
  41.     conformity = list
  42.     access_constraints = list
  43.     limitation = list
  44.     responsible_party = list
  45.    
  46.     @classmethod
  47.     def from_xml(cls, infile):
  48.         ''' Load from a valid ISO XML file'''
  49.  
  50.         def to_date(str):
  51.             return datetime.datetime.strptime(str,'%Y-%m-%d').date()
  52.         def to_resp_party(alist):
  53.             result = []
  54.             for it in alist:
  55.                 result.append(ResponsibleParty(unicode(it.organization),[unicode(it.email)],it.role))
  56.             return result
  57.  
  58.         md = MD_Metadata(etree.parse(infile))
  59.         datestamp = to_date(md.datestamp)
  60.         id_list = []
  61.         for it in md.identification.uricode:
  62.             id_list.append(unicode(it))
  63.  
  64.         url_list = []
  65.         for it in md.distribution.online:
  66.             url_list.append(it.url)
  67.  
  68.         keywords_list = []
  69.         for it in md.identification.keywords:
  70.             kw = {}
  71.             kw['name'] = it['thesaurus']['title']
  72.             kw['value'] = it['thesaurus']['title']
  73.             kw['terms'] = it['keywords']
  74.             kw['date'] = it['thesaurus']['date']
  75.             kw['datetype'] = it['thesaurus']['datetype']
  76.             keywords_list.append(kw)
  77.  
  78.         temporal_extent = [TemporalExtent(to_date(md.identification.temporalextent_start),to_date(md.identification.temporalextent_end))]
  79.         creation_date = None
  80.         publication_date = None
  81.         revision_date = None
  82.  
  83.         for it in md.identification.date:
  84.             if it.type == 'creation':
  85.                 creation_date = to_date(it.date)
  86.             elif it.type == 'publication':
  87.                 publication_date = to_date(it.date)
  88.             elif it.type == 'revision':
  89.                 revision_date = to_date(it.date)
  90.  
  91.         if not creation_date:
  92.             raise Exception('creation date not present','')
  93.         elif not publication_date:
  94.             raise Exception('publication date not present','')
  95.         elif not revision_date:
  96.             raise Exception('revision date not present','')
  97.  
  98.         denom_list = []
  99.         for it in md.identification.denominators:
  100.             try:
  101.                 parsed_int = int(it)
  102.                 denom_list.append(parsed_int)
  103.             except:
  104.                 print 'Cannot parse denominator'
  105.  
  106.         #denom_list = md.identification.denominators
  107.  
  108.         spatial_list = []
  109.  
  110.         if len(md.identification.distance) != len(md.identification.uom):
  111.             raise Exception('unequal list lengths distance,uom','%s %s' % (md.identification.distance,md.identification.uom))
  112.         else:
  113.             for i in range(0,len(md.identification.distance)):
  114.                 spatial_list.append(SpatialResolution(md.identification.distance[i],md.identification.uom[i]))
  115.  
  116.         conf_list = []
  117.  
  118.         if len(md.dataquality.conformancedate) != len(md.dataquality.conformancedatetype):
  119.             raise Exception('unequal list lengths conformance date,conformancedatetype','!')
  120.         else:
  121.             for i in range(0,len(md.dataquality.conformancedate)):
  122.                 if md.dataquality.conformancetitle[i]:
  123.                     conf_list.append(Conformity(unicode(md.dataquality.conformancetitle[i]),to_date(md.dataquality.conformancedate[i]),md.dataquality.conformancedatetype[i],md.dataquality.conformancedegree[i]))
  124.                 else:
  125.                     conf_list.append(Conformance(None,to_datemd.dataquality.conformancedate[i]),md.dataquality.conformancedatetype[i],md.dataquality.conformancedegree[i])
  126.         limit_list = []
  127.         for it in md.identification.uselimitation:
  128.                 limit_list.append(unicode(it))
  129.         constr_list = []
  130.         for it in md.identification.otherconstraints:
  131.                 constr_list.append(unicode(it))
  132.  
  133.         return InspireMetadata(to_resp_party(md.contact), datestamp,  md.languagecode, unicode(md.identification.title),id_list , unicode(md.identification.abstract), url_list, md.identification.resourcelanguage, md.identification.topiccategory, keywords_list, [GeographicBoundingBox(float(md.identification.extent.boundingBox.maxy),float(md.identification.extent.boundingBox.miny),float(md.identification.extent.boundingBox.maxx),float(md.identification.extent.boundingBox.minx))], temporal_extent, creation_date, publication_date, revision_date, unicode(md.dataquality.lineage), denom_list, spatial_list, conf_list, limit_list, constr_list, to_resp_party(md.identification.contact))
  134.    
  135.     @classmethod
  136.     def to_xml(cls, imd, outfile):
  137.         '''Convert to ISO XML'''
  138.  
  139.         import ckan.plugins as p
  140.        
  141.         iso_xml = p.toolkit.render('package/objects/inspire-iso.xml', extra_vars={
  142.             'data':imd
  143.         })
  144.  
  145.         xml_file = outfile
  146.         xml_file = open(outfile, "w")
  147.         xml_file.write(iso_xml)
  148.         xml_file.close()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement