1 from zope.interface import implements,Interface
2 from twisted.internet import defer
3 from webut.skin import iskin
4 from ldaptor.protocols.ldap import ldapclient, ldapsyntax
5 from ldaptor.protocols.ldap import distinguishedname, ldapconnector
6 from ldaptor.protocols import pureldap
7 from ldaptor import ldapfilter, interfaces
8 from twisted.internet import reactor
9 from ldaptor.apps.webui import config, iwebui
10 from ldaptor.apps.webui.uriquote import uriQuote
11 from ldaptor.apps.webui.i18n import _
12 from ldaptor.apps.webui import i18n
13 from ldaptor import weave
14
15 import os
16 from nevow import rend, inevow, loaders, url, tags
17 from formless import annotate, webform, iformless, configurable
18
20 """Entries being moved in the tree."""
21 pass
22
23 -class MoveItem(configurable.Configurable):
25 return ['move', 'cancel']
26
28 return annotate.MethodBinding(
29 'move',
30 annotate.Method(arguments=[
31 annotate.Argument('context', annotate.Context()),
32 ],
33 label=_('Move')),
34 action=_('Move'))
35
37 return annotate.MethodBinding(
38 'cancel',
39 annotate.Method(arguments=[
40 annotate.Argument('context', annotate.Context()),
41 ],
42 label=_('Cancel')),
43 action=_('Cancel'))
44
46 session = context.locate(inevow.ISession)
47 move = session.getComponent(IMove)
48 if move is None:
49 return
50 try:
51 move.remove(self.original)
52 except ValueError:
53 pass
54
55 - def move(self, context):
66 d.addCallback(_cb, context)
67 return d
68
70 self._remove(context)
71 return _('Cancelled move of %s') % self.original.dn
72
82
198 d.addCallback(_search, curDN, self.filter, self.data['scope'])
199 return d
200
216 d.addBoth(_cb, proto)
217 return d
218 d.addCallback(_search, iwebui.ICurrentDN(context))
219
220 def _first(results, dn):
221 assert len(results)==1, \
222 "Expected one result, not %r" % results
223 return {'dn': dn,
224 'attributes': results[0],
225 }
226 d.addCallback(_first, iwebui.ICurrentDN(context))
227
228 return d
229
232
242
243 -class SearchPage(rend.Page):
244 implements(iskin.ISkinnable)
245
246 title = _('Ldaptor Search Page')
247
248 addSlash = True
249
250 docFactory = loaders.xmlfile(
251 'search.xhtml',
252 templateDir=os.path.split(os.path.abspath(__file__))[0])
253
255 conf = getSearchForm(ctx)
256 formDefaults = ctx.locate(iformless.IFormDefaults)
257 methodDefaults = formDefaults.getAllDefaults('search')
258 for k,v in conf.data.items():
259 if v is not None:
260 methodDefaults[k] = str(v)
261 return webform.renderForms()
262
263 - def render_keyvalue(self, context, data):
264 return weave.keyvalue(context, data)
265
266 - def render_keyvalue_item(self, context, data):
267 return weave.keyvalue_item(context, data)
268
269 - def render_passthrough(self, context, data):
270 return context.tag.clear()[data]
271
272 - def data_status(self, context, data):
273 try:
274 obj = context.locate(inevow.IStatusMessage)
275 except KeyError:
276 return ''
277
278 if isinstance(obj, SearchForm):
279 return ''
280 else:
281 return obj
282
283 - def render_data(self, ctx, data):
284 return ctx.tag.clear()[data]
285
286 - def render_if(self, context, data):
287 r=context.tag.allPatterns(str(bool(data)))
288 return context.tag.clear()[r]
289
290 - def data_search(self, ctx, data):
291 return getSearchForm(ctx)
292
294 u=url.URL.fromContext(ctx)
295 u=u.parentdir().clear()
296 l=[]
297 l.append(tags.a(href=u.sibling("add"))[_("add new entry")])
298 return l
299
300 - def data_navilink(self, context, data):
301 cfg = context.locate(interfaces.ILDAPConfig)
302 dn = iwebui.ICurrentDN(context)
303
304 r=[]
305 while dn!=distinguishedname.DistinguishedName(stringValue=''):
306 firstPart=dn.split()[0]
307 r.append(('../../%s' % uriQuote(str(dn)),
308 str(firstPart)))
309 dn=dn.up()
310 return r
311
312 - def render_link(self, context, (url, desc)):
313 context.fillSlots('url', url)
314 context.fillSlots('description', desc)
315 return context.tag
316
317 - def render_linkedDN(self, ctx, data):
318 dn = data
319 cfg = ctx.locate(interfaces.ILDAPConfig)
320 baseDN = iwebui.ICurrentDN(ctx)
321
322 ctx.tag.clear()
323 while (dn!=baseDN
324 and dn!=distinguishedname.DistinguishedName(stringValue='')):
325 firstPart=dn.split()[0]
326
327 u = url.here.parentdir().parentdir().child(dn)
328 segments = inevow.ICurrentSegments(ctx)
329 if segments[-1] == '':
330 u = u.child(segments[-2]).child(segments[-1])
331 else:
332 u = u.child(segments[-1])
333 for segment in inevow.IRemainingSegments(ctx):
334 u = u.child(segment)
335 ctx.tag[tags.a(href=u)[str(firstPart)], ',']
336 dn=dn.up()
337
338 ctx.tag['%s\n' % str(dn)]
339 return ctx.tag
340
341 - def render_entryLinks(self, ctx, data):
342 u = url.URL.fromContext(ctx).parentdir().clear()
343 l = [ (u.sibling('edit').child(uriQuote(data)),
344 _('edit')),
345 (u.sibling('move').child(uriQuote(data)),
346 _('move')),
347 (u.sibling('delete').child(uriQuote(data)),
348 _('delete')),
349 (u.sibling('change_password').child(uriQuote(data)),
350 _('change password')),
351 ]
352 return self.render_sequence(ctx, l)
353
354 - def render_listLen(self, context, data):
355 if data is None:
356 length = 0
357 else:
358 length = len(data)
359 return context.tag.clear()[length]
360
362 u = url.URL.fromContext(ctx)
363 u = u.parentdir().sibling("mass_change_password")
364 u = u.child(uriQuote(data))
365 return ctx.tag(href=u)
366
367 - def data_move(self, context, data):
368 session = context.locate(inevow.ISession)
369 if not session.getLoggedInRoot().loggedIn:
370 return []
371 move = session.getComponent(IMove)
372 if move is None:
373 return []
374 return move
375
376 - def locateConfigurable(self, context, name):
377 if name == '':
378 return getSearchForm(context)
379 elif name.startswith('move_'):
380 dn = name[len('move_'):]
381
382 session = context.locate(inevow.ISession)
383 move = session.getComponent(IMove)
384 if move is not None:
385 for entry in move:
386 if entry.dn == dn:
387 return iformless.IConfigurable(MoveItem(entry))
388
389 raise KeyError, name
390
391 - def render_move(self, context, data):
392 return webform.renderForms('move_%s' % data.dn)[context.tag]
393
394 render_i18n = i18n.render()
395
397 r = SearchPage()
398 return r
399