Changeset 338


Ignore:
Timestamp:
29/05/15 15:06:32 (5 years ago)
Author:
mjuckes
Message:

call factory added to dreq.py

File:
1 edited

Legend:

Unmodified
Added
Removed
  • CMIP6dreq/trunk/src/framework/dreq.py

    r322 r338  
    22import xml.dom 
    33import xml.dom.minidom 
     4class dreqItemBase(object): 
     5       def __init__(self,dict=None,xmlMiniDom=None,id='defaultId'): 
     6         dictMode = dict != None 
     7         mdMode = xmlMiniDom != None 
     8         assert not( dictMode and mdMode), 'Mode must be either dictionary of minidom: both assigned' 
     9         assert dictMode or mdMode, 'Mode must be either dictionary of minidom: neither assigned' 
     10         self.defaults = {} 
     11         self.globalDefault = '__unset__' 
     12         if dictMode: 
     13           self.dictInit( dict ) 
     14         elif mdMode: 
     15           self.mdInit( xmlMiniDom ) 
     16 
     17 
     18       def dictInit( self, dict ): 
     19         for a in self.attributes: 
     20           if dict.has_key(a): 
     21             self.__dict__[a] = dict[a] 
     22           else: 
     23             self.__dict__[a] = self.defaults.get( a, self.globalDefault ) 
     24 
     25       def mdInit( self, el ): 
     26         __doc__ = """Initialisation from a mindom XML element. The list of attributes must be set by the class factory before the class is initialised""" 
     27         for a in self.attributes: 
     28           if el.hasAttribute( a ): 
     29             v = el.getAttribute( a ) 
     30             self.__dict__[a] = v 
     31           else: 
     32             self.__dict__[a] = self.defaults.get( a, self.globalDefault ) 
     33         
    434 
    535class config(object): 
     
    838    self.vdef = 'out/vocabDefn.xml'  
    939    self.vsamp = 'out/vocabSample.xml' 
     40    self.vsamp = '../workbook/trial_01.xml' 
    1041    self.nts = collections.namedtuple( 'sectdef', ['tag','label','title','id','itemLabelMode'] ) 
    1142    self.nti = collections.namedtuple( 'itemdef', ['tag','label','title','type'] ) 
     
    2051    self.slist = [] 
    2152    self.tables = {} 
     53    tables = {} 
     54    self.tableClasses = {} 
     55    self.tableItems = collections.defaultdict( list ) 
    2256    for v in vl: 
    2357      t = self.parsevcfg(v) 
    24       self.tables[t[0].label] = t 
     58      tables[t[0].label] = t 
     59      self.tableClasses[t[0].label] = self.itemClassFact( t.header.itemLabelMode, t.attributes.keys() ) 
    2560      self.slist.append( t ) 
    2661 
    27     for k in self.tables.keys(): 
     62    for k in tables.keys(): 
    2863      vl = self.contentDoc.getElementsByTagName( k ) 
    2964      if len(vl) == 1: 
     
    3368        il = v.getElementsByTagName( 'item' ) 
    3469        print k, t, i, len(il) 
     70        self.tables[k] = (i,t,len(il)) 
    3571         
    3672        for i in il: 
    37           s = '' 
    38           for a in self.tables[k].attributes.keys(): 
    39             if i.hasAttribute(a): 
    40               x = i.getAttribute(a) 
    41             else: 
    42               x = None 
    43             s+= '%s=%s; ' % (a,x) 
    44           print ' ---- ', s 
     73          ii = self.tableClasses[k](xmlMiniDom=i) 
     74          self.tableItems[k].append( ii ) 
     75      elif len(vl) > 1: 
     76        l1 = [] 
     77        l2 = [] 
     78        print '#### %s: %s' % (k,len(vl) ) 
     79        for v in vl: 
     80          t = v.getAttribute( 'title' ) 
     81          i = v.getAttribute( 'id' ) 
     82          il = v.getElementsByTagName( 'item' ) 
     83          print k, t, i, len(il) 
     84          l1.append( (i,t,len(il)) ) 
     85           
     86          l2i = [] 
     87          for i in il: 
     88            ii = self.tableClasses[k](xmlMiniDom=i) 
     89            l2i.append( ii ) 
     90          l2.append( l2i ) 
     91        self.tables[k] = l1 
     92        self.tableItems[k] = l2 
    4593 
     94  def itemClassFact(self,itemLabelMode,attributes): 
     95     class dreqItem(dreqItemBase): 
     96       """Inherits all methods from dreqItemBase""" 
     97        
     98     dreqItem.itemLabelMode = itemLabelMode 
     99     dreqItem.attributes = attributes 
     100     return dreqItem 
     101          
    46102  def parsevcfg(self,v): 
    47103      l = v.getAttribute( 'label' ) 
Note: See TracChangeset for help on using the changeset viewer.