1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import os
23
24 import gtk
25
26 from twisted.internet import defer
27
28 from flumotion.common import errors, componentui
29 from flumotion.twisted import flavors
30 from flumotion.twisted.compat import implements
31 from flumotion.component.base.admin_gtk import BaseAdminGtk, BaseAdminGtkNode
32
33 (
34 COLUMN_ID,
35 COLUMN_USER,
36 COLUMN_ADDRESS,
37 ) = range(3)
38
41 self._iters = {}
42 self.model = gtk.ListStore(str, str, str)
43
44 gladeFile = os.path.join('flumotion', 'component', 'bouncers',
45 'bouncer.glade')
46 d = self.loadGladeFile(gladeFile)
47 d.addCallback(self._loadGladeFileCallback)
48 return d
49
51 self.wtree = widgetTree
52
53 self.widget = self.wtree.get_widget('keycards-widget')
54 self.tree = self.wtree.get_widget('keycards-treeview')
55 self.tree.set_model(self.model)
56 self.tree.set_headers_clickable(True)
57 treeselection = self.tree.get_selection()
58 treeselection.set_mode(gtk.SELECTION_MULTIPLE)
59
60 button = self.wtree.get_widget('expire-button')
61 button.connect('clicked', self._expire_clicked, treeselection)
62
63 col = gtk.TreeViewColumn('ID', gtk.CellRendererText(), text=COLUMN_ID)
64 self.tree.append_column(col)
65 col = gtk.TreeViewColumn('user', gtk.CellRendererText(),
66 text=COLUMN_USER)
67 self.tree.append_column(col)
68 col = gtk.TreeViewColumn('address', gtk.CellRendererText(),
69 text=COLUMN_ADDRESS)
70 self.tree.append_column(col)
71
72 d = self.callRemote('getUIState')
73 d.addCallback(self._gotStateCallback)
74 d.addCallback(lambda x: self.widget)
75 return d
76
78
79
80 self._uiState = result
81 keycardsData = result.get('keycards')
82 self.debug('_gotState: got %d keycards' % len(keycardsData))
83
84 for data in keycardsData:
85 self._append(data)
86
87 def append(object, key, value):
88 self._append(value)
89 def remove(object, key, value):
90 self._remove(value)
91
92 self._uiState.addListener(self, append=append, remove=remove)
93
95 (model, pathlist) = treeselection.get_selected_rows()
96 ids = []
97 for path in pathlist:
98 iter = model.get_iter(path)
99 id = model.get_value(iter, COLUMN_ID)
100 ids.append(id)
101
102 self.debug('expiring %d keycards' % len(ids))
103
104 d = defer.succeed(None)
105 for id in ids:
106
107
108 d.addCallback(lambda res, i: self.callRemote('expireKeycardId', i),
109 id)
110
111 return d
112
114 id = data['id']
115 iter = self.model.append()
116
117 self._iters[id] = iter
118 self.model.set_value(iter, COLUMN_ID, id)
119
120 if 'username' in data.keys():
121 self.model.set_value(iter, COLUMN_USER, data['username'])
122 if 'address' in data.keys():
123 self.model.set_value(iter, COLUMN_ADDRESS, data['address'])
124
126 id = data['id']
127 iter = self._iters[id]
128 del self._iters[id]
129 self.model.remove(iter)
130
132 if name == "pattern":
133 self.debug("pattern changed to %r" % value)
134 c = self.combobox_pattern
135 id = self.pattern_changed_id
136 c.handler_block(id)
137 c.set_active(value)
138 c.handler_unblock(id)
139
142
149
151 self._nodes['Keycards'].cleanup()
152
153 GUIClass = HTPasswdCryptAdminGtk
154