Package flumotion :: Package component :: Package bouncers :: Module admin_gtk
[hide private]

Source Code for Module flumotion.component.bouncers.admin_gtk

  1  # -*- Mode: Python -*- 
  2  # vi:si:et:sw=4:sts=4:ts=4 
  3  # 
  4  # Flumotion - a streaming media server 
  5  # Copyright (C) 2004,2005,2006,2007 Fluendo, S.L. (www.fluendo.com). 
  6  # All rights reserved. 
  7   
  8  # This file may be distributed and/or modified under the terms of 
  9  # the GNU General Public License version 2 as published by 
 10  # the Free Software Foundation. 
 11  # This file is distributed without any warranty; without even the implied 
 12  # warranty of merchantability or fitness for a particular purpose. 
 13  # See "LICENSE.GPL" in the source distribution for more information. 
 14   
 15  # Licensees having purchased or holding a valid Flumotion Advanced 
 16  # Streaming Server license may use this file in accordance with the 
 17  # Flumotion Advanced Streaming Server Commercial License Agreement. 
 18  # See "LICENSE.Flumotion" in the source distribution for more information. 
 19   
 20  # Headers in this file shall remain intact. 
 21   
 22  import os 
 23   
 24  import gettext 
 25  import gtk 
 26   
 27  from twisted.internet import defer 
 28   
 29  from flumotion.common import errors, componentui 
 30  from flumotion.twisted import flavors 
 31  from flumotion.component.base.admin_gtk import BaseAdminGtk 
 32  from flumotion.component.base.baseadminnode import BaseAdminGtkNode 
 33   
 34  _ = gettext.gettext 
 35  __version__ = "$Rev$" 
 36  ( 
 37    COLUMN_ID, 
 38    COLUMN_USER, 
 39    COLUMN_ADDRESS, 
 40  ) = range(3) 
 41   
 42   
43 -class KeycardsNode(BaseAdminGtkNode):
44
45 - def render(self):
46 self._iters = {} # iter -> data dict mapping 47 self.model = gtk.ListStore(str, str, str) 48 49 gladeFile = os.path.join('flumotion', 'component', 'bouncers', 50 'bouncer.glade') 51 d = self.loadGladeFile(gladeFile) 52 d.addCallback(self._loadGladeFileCallback) 53 return d
54
55 - def stateAppend(self, state, key, value):
56 self._append(value)
57
58 - def stateRemove(self, state, key, value):
59 self._remove(value)
60
61 - def _loadGladeFileCallback(self, widgetTree):
62 self.wtree = widgetTree 63 64 self.widget = self.wtree.get_widget('keycards-widget') 65 self.tree = self.wtree.get_widget('keycards-treeview') 66 self.tree.set_model(self.model) 67 self.tree.set_headers_clickable(True) 68 treeselection = self.tree.get_selection() 69 treeselection.set_mode(gtk.SELECTION_MULTIPLE) 70 71 button = self.wtree.get_widget('expire-button') 72 button.connect('clicked', self._expire_clicked, treeselection) 73 74 col = gtk.TreeViewColumn('ID', gtk.CellRendererText(), text=COLUMN_ID) 75 self.tree.append_column(col) 76 col = gtk.TreeViewColumn('user', gtk.CellRendererText(), 77 text=COLUMN_USER) 78 self.tree.append_column(col) 79 col = gtk.TreeViewColumn('address', gtk.CellRendererText(), 80 text=COLUMN_ADDRESS) 81 self.tree.append_column(col) 82 83 d = self.callRemote('getUIState') 84 d.addCallback(self._gotStateCallback) 85 d.addCallback(lambda x: self.widget) 86 return d
87
88 - def _gotStateCallback(self, result):
89 # we need to store the state ref we get; if not, it gets GC'd here, 90 # and then in the manager, and then our listener doesn't work anymore 91 self._uiState = result 92 keycardsData = result.get('keycards') 93 self.debug('_gotState: got %d keycards' % len(keycardsData)) 94 95 for data in keycardsData: 96 self._append(data)
97
98 - def _expire_clicked(self, button, treeselection):
99 (model, pathlist) = treeselection.get_selected_rows() 100 ids = [] 101 for path in pathlist: 102 model_iter = model.get_iter(path) 103 ids.append(model.get_value(model_iter, COLUMN_ID)) 104 105 self.debug('expiring %d keycards' % len(ids)) 106 107 d = defer.succeed(None) 108 for keycard_id in ids: 109 # we need to pass in i as well, to make sure we actually iterate 110 # instead of adding a bunch of lambdas with the same id to expire 111 d.addCallback(lambda res, i: self.callRemote('expireKeycardId', i), 112 keycard_id) 113 114 return d
115
116 - def _append(self, data):
117 keycard_id = data['id'] 118 model_iter = self.model.append() 119 # GtkListStore garantuees validity of iter as long as row lives 120 self._iters[keycard_id] = model_iter 121 self.model.set_value(model_iter, COLUMN_ID, keycard_id) 122 123 if 'username' in data.keys(): 124 self.model.set_value(model_iter, COLUMN_USER, data['username']) 125 if 'address' in data.keys(): 126 self.model.set_value(model_iter, COLUMN_ADDRESS, data['address'])
127
128 - def _remove(self, data):
129 keycard_id = data['id'] 130 model_iter = self._iters[keycard_id] 131 del self._iters[keycard_id] 132 self.model.remove(model_iter)
133 134
135 -class HTPasswdCryptAdminGtk(BaseAdminGtk):
136
137 - def setup(self):
138 # FIXME: have constructor take self instead ? 139 keycards = KeycardsNode(self.state, self.admin, _("Keycards")) 140 self.nodes['Keycards'] = keycards 141 return BaseAdminGtk.setup(self)
142 143 GUIClass = HTPasswdCryptAdminGtk 144