cosmetic
[sfa.git] / sfa / rspecs / elements / element.py
1 class Element(dict):
2
3     fields = {}
4
5     def __init__(self, fields={}, element=None, keys=None):
6         self.element = element
7         dict.__init__(self, dict.fromkeys(self.fields))
8         if not keys:
9             keys = fields.keys()
10         for key in keys:
11             if key in fields:
12                 self[key] = fields[key] 
13
14     @staticmethod
15     def get_elements(xml, xpath, element_class=None, fields=None):
16         """
17         Search the specifed xml node for elements that match the 
18         specified xpath query. 
19         Returns a list of objects instanced by the specified element_class.
20         """
21         if not element_class:
22             element_class = Element
23 # xxx this obviously is wrong...
24 #        if not fields and hasattr(element_class, fields):
25 #           fields = element_class.fields
26         elems = xml.xpath(xpath)
27         objs = []
28         for elem in elems:
29             if not fields:
30                 obj = element_class(elem.attrib, elem)
31             else:
32                 obj = element_class({}, elem)
33                 for field in fields:
34                     if field in elem.attrib:
35                         obj[field] = elem.attrib[field]    
36             objs.append(obj)
37 # xxx seems unused
38         generic_elems = [element_class(elem.attrib, elem) for elem in elems]
39         return objs
40
41
42     @staticmethod
43     def add_elements(xml, name, objs, fields=None):
44         """
45         Adds a child node to the specified xml node based on
46         the specified name , element class and object.    
47         """
48         if not isinstance(objs, list):
49             objs = [objs]
50         elems = []
51         for obj in objs:
52             if not obj:
53                 continue
54             if not fields:
55                 fields = obj.keys()
56             elem = xml.add_element(name)
57             for field in fields:
58                 if field in obj and obj[field]:
59                     elem.set(field, unicode(obj[field]))
60             elems.append(elem)
61         return elems