Package ldaptor :: Module weave
[hide private]
[frames] | no frames]

Source Code for Module ldaptor.weave

  1  from zope.interface import implements 
  2  from nevow import tags, compy, inevow, flat 
  3  from ldaptor.protocols.ldap import ldapsyntax, distinguishedname 
  4  from ldaptor import interfaces 
  5   
6 -def keyvalue(context, data):
7 """ 8 Render items in a mapping using patterns found in the children 9 of the element. 10 11 Keyvalue recognizes the following patterns: 12 13 - header: Rendered at the start, before the first item. If 14 multiple header patterns are provided they are rendered 15 together in the order they were defined. 16 17 - footer: Just like the header only renderer at the end, after 18 the last item. 19 20 - item: Rendered once for each item in the sequence. Can contain 21 subpatterns key and value. 22 23 If multiple item patterns are provided then the pattern is 24 cycled in the order defined. 25 26 - divider: Rendered once between each item in the 27 sequence. Multiple divider patterns are cycled. 28 29 - empty: Rendered instead of item and divider patterns when the 30 sequence contains no items. 31 32 Example:: 33 34 <table nevow:render="sequence" nevow:data="peopleSeq"> 35 <tr nevow:pattern="header"> 36 <th>name</th> 37 <th>email</th> 38 </tr> 39 <tr nevow:pattern="item" class="odd"> 40 <td>name goes here</td> 41 <td>email goes here</td> 42 </tr> 43 <tr nevow:pattern="item" class="even"> 44 <td>name goes here</td> 45 <td>email goes here</td> 46 </tr> 47 <tr nevow:pattern="empty"> 48 <td colspan="2"><em>they've all gone!</em></td> 49 </tr> 50 </table> 51 52 """ 53 headers = context.tag.allPatterns('header') 54 item = context.tag.patternGenerator('item') 55 divider = context.tag.patternGenerator('divider', default=tags.invisible) 56 content = [] 57 for key, value in data.items(): 58 content.append(item(data=(key, value))) 59 content.append(divider(data=(key, value))) 60 if not content: 61 content = context.tag.allPatterns('empty') 62 else: 63 ## No divider after the last thing. 64 del content[-1] 65 footers = context.tag.allPatterns('footer') 66 return context.tag.clear()[ headers, content, footers ]
67
68 -def keyvalue_item(context, data):
69 key, value = data 70 71 k = context.tag.patternGenerator('key') 72 v = context.tag.patternGenerator('value') 73 74 return context.tag.clear()[ k(data=key), v(data=value) ]
75
76 -class _DictLike(object):
77 implements(inevow.IContainer) 78
79 - def __init__(self, original):
80 self.original = original
81
82 - def child(self, context, name):
83 return self.original.get(name, None)
84
85 - def items(self):
86 return self.original.items()
87
88 -class LDAPEntryContainer(object):
89 implements(inevow.IContainer) 90
91 - def __init__(self, original):
92 self.original = original
93
94 - def child(self, context, name):
95 if name == 'dn': 96 return self.original.dn 97 elif name == 'attributes': 98 return _DictLike(self.original) 99 else: 100 return None
101 102 compy.registerAdapter(LDAPEntryContainer, ldapsyntax.LDAPEntryWithClient, inevow.IContainer) 103
104 -def dnSerializer(original, context):
105 return flat.serialize(str(original), context)
106 107 flat.registerFlattener(dnSerializer, 108 distinguishedname.DistinguishedName) 109
110 -def entrySerializer(original, context):
111 ul = tags.ul() 112 for a,l in original.items(): 113 if len(l)==0: 114 ul[tags.li[a, ': none']] 115 elif len(l)==1: 116 for attr in l: 117 first = attr 118 break 119 ul[tags.li[a, ': ', first]] 120 else: 121 li=tags.li[a, ':'] 122 ul[li] 123 liul=tags.ul() 124 li[liul] 125 for i in l: 126 liul[tags.li[i]] 127 return flat.serialize(ul, context)
128 129 flat.registerFlattener(entrySerializer, 130 interfaces.ILDAPEntry) 131
132 -class IZebraStyle(compy.Interface):
133 """Marker interface for zebra.""" 134 pass
135
136 -def zebra(styles=['zebra-odd', 'zebra-even']):
137 """ 138 Provide alternating background colors for e.g. zebra tables. 139 140 @param styles: Two or more CSS class names to iterate. 141 142 Use like this:: 143 144 render_zebra = weave.zebra() 145 146 <table> 147 <tr nevow:render="zebra"><td>foo</td></tr> 148 <tr nevow:render="zebra"><td>bar</td></tr> 149 <tr nevow:render="zebra"><td>baz</td></tr> 150 </table> 151 """ 152 styles = list(styles) 153 def f(self, ctx, data): 154 request = inevow.IRequest(ctx) 155 state = IZebraStyle(request, styles) 156 r = ctx.tag(class_="%s" % state[0]) 157 request.setComponent(IZebraStyle, state[1:]+state[:1]) 158 159 return r
160 return f 161