Merge lp:~tealeg/landscape-client/sanitise-hostname into lp:~landscape/landscape-client/trunk
- sanitise-hostname
- Merge into trunk
Status: | Merged | ||||
---|---|---|---|---|---|
Approved by: | Chad Smith | ||||
Approved revision: | 547 | ||||
Merged at revision: | 546 | ||||
Proposed branch: | lp:~tealeg/landscape-client/sanitise-hostname | ||||
Merge into: | lp:~landscape/landscape-client/trunk | ||||
Diff against target: |
503 lines (+258/-12) (has conflicts) 9 files modified
landscape/ui/view/configuration.py (+77/-2) landscape/ui/view/tests/test_configuration.py (+56/-0) landscape/ui/view/ui/landscape-client-settings.glade (+1/-1) man/landscape-client.1 (+1/-1) man/landscape-config.1 (+1/-1) man/landscape-message.1 (+1/-1) po/fr.po (+83/-6) po/landscape-client.pot (+36/-0) setup.cfg (+2/-0) Text conflict in po/fr.po Text conflict in po/landscape-client.pot |
||||
To merge this branch: | bzr merge lp:~tealeg/landscape-client/sanitise-hostname | ||||
Related bugs: |
|
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Chad Smith | Approve | ||
Mike Milner (community) | Approve | ||
Review via email: mp+99053@code.launchpad.net |
Commit message
Description of the change
Fixes #954507.
Adds a Gtk.InfoBar and in-entry icon that are both displayed when a validation check fails.
Also adds a validation check.
Chad Smith (chad.smith) wrote : | # |
+1!
[1] Probably can boil down this regex a bit more:
14 +HOSTNAME_REGEXP = re.compile(
15 + "^(([a-
16 + "*([A-Za-
So I think the regex could be:
"^(([a-
"(([A-Za-
[2] I get merge conflicts in the translation files that you'll probably resolve on commit.
patching file po/fr.po
Hunk #1 FAILED at 8.
Hunk #2 FAILED at 56.
Hunk #3 FAILED at 124.
Hunk #4 succeeded at 150 (offset 1 line).
3 out of 4 hunks FAILED -- saving rejects to file po/fr.po.rej
patching file po/landscape-
Hunk #1 FAILED at 8.
Hunk #2 FAILED at 55.
2 out of 2 hunks FAILED -- saving rejects to file po/landscape-
patching file setup.cfg
Too bad underscore is part of \w, would have made things look a lot simpler.
Geoff Teale (tealeg) wrote : | # |
> Looks good! +1
>
> [1]
> 68 def register_
> 69 - self.response(
> 70 + if self.validity_
> 71 + self.response(
> 72 + else:
> 73 + return False
>
> This function only returns explicitly if the dialog is not valid. You can
> probably drop the else clause entirely.
Good call. Done.
>
>
> [2]
> 142 + def test_sanitise_
> 143 + """
> 144 + Test UI level host_name sanitation.
> 145 + """
>
> A nitpick here, but test docstrings shouldn't start with "Test that.." or
> "Check if..." Just state what the test is verifying. Something like
> """C{dialog.
> hostnames."""
Fair enough, I was struggling to think of a decent like there. Done.
Geoff Teale (tealeg) wrote : | # |
> +1!
>
> [1] Probably can boil down this regex a bit more:
>
> 14 +HOSTNAME_REGEXP = re.compile(
> 15 + "^(([a-
> 16 + "*([A-Za-
>
>
> So I think the regex could be:
>
> "^(([a-
> "(([A-Za-
Looks good! Done.
>
> [2] I get merge conflicts in the translation files that you'll probably
> resolve on commit.
> patching file po/fr.po
> Hunk #1 FAILED at 8.
> Hunk #2 FAILED at 56.
> Hunk #3 FAILED at 124.
> Hunk #4 succeeded at 150 (offset 1 line).
> 3 out of 4 hunks FAILED -- saving rejects to file po/fr.po.rej
> patching file po/landscape-
> Hunk #1 FAILED at 8.
> Hunk #2 FAILED at 55.
> 2 out of 2 hunks FAILED -- saving rejects to file po/landscape-
> patching file setup.cfg
>
>
>
> Too bad underscore is part of \w, would have made things look a lot simpler.
OK. I'll make sure this is right when I merge.
Thanks!
- 548. By Geoff Teale
-
Remove unused boolean return (from milner's review).
- 549. By Geoff Teale
-
Better docstring for test (from milner's review).
- 550. By Geoff Teale
-
lint
Preview Diff
1 | === modified file 'landscape/ui/view/configuration.py' |
2 | --- landscape/ui/view/configuration.py 2012-03-23 10:49:43 +0000 |
3 | +++ landscape/ui/view/configuration.py 2012-03-28 08:35:22 +0000 |
4 | @@ -1,3 +1,4 @@ |
5 | +import re |
6 | import os |
7 | |
8 | from gettext import gettext as _ |
9 | @@ -7,6 +8,10 @@ |
10 | from landscape.ui.constants import ( |
11 | CANONICAL_MANAGED, LOCAL_MANAGED, NOT_MANAGED) |
12 | |
13 | +# Note, I think this may not be fully compliant with the changes in RFC 1123 |
14 | +HOSTNAME_REGEXP = re.compile("^(([a-zA-Z][a-zA-Z0-9\-]*)?[a-zA-Z0-9][\.]?)*" |
15 | + "(([A-Za-z][A-Za-z0-9\-]*)?[A-Za-z0-9])$") |
16 | + |
17 | |
18 | class ClientSettingsDialog(Gtk.Dialog): |
19 | """ |
20 | @@ -30,6 +35,32 @@ |
21 | # One extra revert to reset after loading data |
22 | self.controller.revert() |
23 | |
24 | + def sanitise_host_name(self, host_name): |
25 | + """ |
26 | + Do some minimal input sanitation. |
27 | + """ |
28 | + return host_name.strip() |
29 | + |
30 | + def is_valid_host_name(self, host_name): |
31 | + return HOSTNAME_REGEXP.match(host_name) is not None |
32 | + |
33 | + def validity_check(self): |
34 | + if self.use_type_combobox.get_active() < 2: |
35 | + return True |
36 | + else: |
37 | + host_name = self.sanitise_host_name( |
38 | + self.local_landscape_host_entry.get_text()) |
39 | + if self.is_valid_host_name(host_name): |
40 | + self.local_landscape_host_entry.set_text(host_name) |
41 | + return True |
42 | + else: |
43 | + self.info_message.set_text(self.INVALID_HOSTNAME_MESSAGE) |
44 | + self.local_landscape_host_entry.set_icon_from_stock( |
45 | + Gtk.EntryIconPosition.PRIMARY, |
46 | + Gtk.STOCK_DIALOG_WARNING) |
47 | + self._info_bar_container.show() |
48 | + return False |
49 | + |
50 | @property |
51 | def NO_SERVICE_TEXT(self): |
52 | return _("None") |
53 | @@ -50,6 +81,10 @@ |
54 | def DISABLE_BUTTON_TEXT(self): |
55 | return _("Disable") |
56 | |
57 | + @property |
58 | + def INVALID_HOSTNAME_MESSAGE(self): |
59 | + return _("Invalid host name.") |
60 | + |
61 | def _set_use_type_combobox_from_controller(self): |
62 | """ |
63 | Load the persisted L{management_type} from the controller and set the |
64 | @@ -140,7 +175,8 @@ |
65 | self.response(Gtk.ResponseType.CANCEL) |
66 | |
67 | def register_response(self, widget): |
68 | - self.response(Gtk.ResponseType.OK) |
69 | + if self.validity_check(): |
70 | + self.response(Gtk.ResponseType.OK) |
71 | |
72 | def set_button_text(self, management_type): |
73 | [alignment] = self.register_button.get_children() |
74 | @@ -165,6 +201,41 @@ |
75 | self.register_button.show() |
76 | self.register_button.connect("clicked", self.register_response) |
77 | |
78 | + def dismiss_infobar(self, widget): |
79 | + self._info_bar_container.hide() |
80 | + self.local_landscape_host_entry.set_icon_from_stock( |
81 | + Gtk.EntryIconPosition.PRIMARY, None) |
82 | + |
83 | + def setup_info_bar(self): |
84 | + labels_size_group = self._builder.get_object("labels-sizegroup") |
85 | + entries_size_group = self._builder.get_object("entries-sizegroup") |
86 | + labels_size_group.set_ignore_hidden(False) |
87 | + entries_size_group.set_ignore_hidden(False) |
88 | + self._info_bar_container = Gtk.HBox() |
89 | + self._info_bar_container.set_spacing(12) |
90 | + info_bar = Gtk.InfoBar() |
91 | + entries_size_group.add_widget(info_bar) |
92 | + info_bar.show() |
93 | + empty_label = Gtk.Label() |
94 | + labels_size_group.add_widget(empty_label) |
95 | + empty_label.show() |
96 | + self._info_bar_container.pack_start(empty_label, expand=False, |
97 | + fill=False, padding=0) |
98 | + self._info_bar_container.pack_start(info_bar, expand=False, fill=False, |
99 | + padding=0) |
100 | + content_area = info_bar.get_content_area() |
101 | + hbox = Gtk.HBox() |
102 | + self.info_message = Gtk.Label() |
103 | + self.info_message.set_alignment(0, 0.5) |
104 | + self.info_message.show() |
105 | + hbox.pack_start(self.info_message, expand=True, fill=True, padding=6) |
106 | + ok_button = Gtk.Button("Dismiss") |
107 | + ok_button.connect("clicked", self.dismiss_infobar) |
108 | + ok_button.show() |
109 | + hbox.pack_start(ok_button, expand=True, fill=True, padding=0) |
110 | + hbox.show() |
111 | + content_area.pack_start(hbox, expand=True, fill=True, padding=0) |
112 | + |
113 | def setup_ui(self): |
114 | self._builder = Gtk.Builder() |
115 | self._builder.set_translation_domain("landscape-client") |
116 | @@ -174,9 +245,13 @@ |
117 | content_area = self.get_content_area() |
118 | content_area.set_spacing(12) |
119 | self.set_border_width(12) |
120 | + self.setup_info_bar() |
121 | self._vbox = self._builder.get_object("toplevel-vbox") |
122 | self._vbox.unparent() |
123 | - content_area.pack_start(self._vbox, expand=True, fill=True, padding=12) |
124 | + content_area.pack_start(self._vbox, expand=True, fill=True, |
125 | + padding=12) |
126 | + self._vbox.pack_start(self._info_bar_container, expand=False, |
127 | + fill=False, padding=0) |
128 | self.liststore = self.make_liststore() |
129 | self.link_use_type_combobox(self.liststore) |
130 | self.link_hosted_service_widgets() |
131 | |
132 | === modified file 'landscape/ui/view/tests/test_configuration.py' |
133 | --- landscape/ui/view/tests/test_configuration.py 2012-03-16 14:57:32 +0000 |
134 | +++ landscape/ui/view/tests/test_configuration.py 2012-03-28 08:35:22 +0000 |
135 | @@ -210,6 +210,62 @@ |
136 | self.assertEqual("foo", dialog.hosted_account_name_entry.get_text()) |
137 | self.assertEqual("bar", dialog.hosted_password_entry.get_text()) |
138 | |
139 | + def test_sanitise_host_name(self): |
140 | + """ |
141 | + Test that L{ClientSettingsDialog.sanitise_host_name} removes both |
142 | + leading and trailing white space from a host name. |
143 | + """ |
144 | + dialog = ClientSettingsDialog(self.controller) |
145 | + self.assertEquals("foo.bar", dialog.sanitise_host_name(" foo.bar")) |
146 | + self.assertEquals("foo.bar", dialog.sanitise_host_name("foo.bar ")) |
147 | + self.assertEquals("foo.bar", dialog.sanitise_host_name(" foo.bar ")) |
148 | + |
149 | + def test_is_valid_host_name(self): |
150 | + """ |
151 | + Test that L{is_valid_host_name} checks host names correctly. |
152 | + """ |
153 | + dialog = ClientSettingsDialog(self.controller) |
154 | + self.assertTrue(dialog.is_valid_host_name("foo.bar")) |
155 | + self.assertFalse(dialog.is_valid_host_name("foo bar")) |
156 | + self.assertFalse(dialog.is_valid_host_name("f\xc3.bar")) |
157 | + |
158 | + def test_validity_check(self): |
159 | + """ |
160 | + Test that the L{validity_check} returns True for valid input and False |
161 | + for invalid input. |
162 | + """ |
163 | + dialog = ClientSettingsDialog(self.controller) |
164 | + self.run_gtk_eventloop() |
165 | + |
166 | + # Checking disable should always return True |
167 | + dialog.use_type_combobox.set_active(0) |
168 | + self.run_gtk_eventloop() |
169 | + self.assertTrue(dialog.validity_check()) |
170 | + |
171 | + # Check for hosted - currently returns True always |
172 | + dialog.use_type_combobox.set_active(1) |
173 | + self.run_gtk_eventloop() |
174 | + self.assertTrue(dialog.validity_check()) |
175 | + |
176 | + # Checks for local |
177 | + dialog.use_type_combobox.set_active(2) |
178 | + self.run_gtk_eventloop() |
179 | + dialog.local_landscape_host_entry.set_text("foo.bar") |
180 | + self.run_gtk_eventloop() |
181 | + self.assertTrue(dialog.validity_check()) |
182 | + dialog.local_landscape_host_entry.set_text(" foo.bar") |
183 | + self.run_gtk_eventloop() |
184 | + self.assertTrue(dialog.validity_check()) |
185 | + dialog.local_landscape_host_entry.set_text("foo.bar ") |
186 | + self.run_gtk_eventloop() |
187 | + self.assertTrue(dialog.validity_check()) |
188 | + dialog.local_landscape_host_entry.set_text("foo bar") |
189 | + self.run_gtk_eventloop() |
190 | + self.assertFalse(dialog.validity_check()) |
191 | + dialog.local_landscape_host_entry.set_text(u"f\xc3.bar") |
192 | + self.run_gtk_eventloop() |
193 | + self.assertFalse(dialog.validity_check()) |
194 | + |
195 | if not got_gobject_introspection: |
196 | skip = gobject_skip_message |
197 | |
198 | |
199 | === modified file 'landscape/ui/view/ui/landscape-client-settings.glade' |
200 | --- landscape/ui/view/ui/landscape-client-settings.glade 2012-03-14 17:03:14 +0000 |
201 | +++ landscape/ui/view/ui/landscape-client-settings.glade 2012-03-28 08:35:22 +0000 |
202 | @@ -466,7 +466,7 @@ |
203 | </object> |
204 | </child> |
205 | </object> |
206 | - <object class="GtkSizeGroup" id="entries-sizgroup"> |
207 | + <object class="GtkSizeGroup" id="entries-sizegroup"> |
208 | <widgets> |
209 | <widget name="hosted-account-name-entry"/> |
210 | <widget name="hosted-password-entry"/> |
211 | |
212 | === modified file 'man/landscape-client.1' |
213 | --- man/landscape-client.1 2012-03-05 14:11:42 +0000 |
214 | +++ man/landscape-client.1 2012-03-28 08:35:22 +0000 |
215 | @@ -1,5 +1,5 @@ |
216 | .\"Text automatically generated by txt2man |
217 | -.TH landscape-client "18 January 2010" "" "" |
218 | +.TH landscape-client 1 "27 March 2012" "" "" |
219 | .SH NAME |
220 | \fBlandscape-client \fP- Landscape system client |
221 | \fB |
222 | |
223 | === modified file 'man/landscape-config.1' |
224 | --- man/landscape-config.1 2012-03-05 14:11:42 +0000 |
225 | +++ man/landscape-config.1 2012-03-28 08:35:22 +0000 |
226 | @@ -1,5 +1,5 @@ |
227 | .\"Text automatically generated by txt2man |
228 | -.TH landscape-config "18 January 2010" "" "" |
229 | +.TH landscape-config 1 "27 March 2012" "" "" |
230 | .SH NAME |
231 | \fBlandscape-config \fP- configure the Landscape management client |
232 | \fB |
233 | |
234 | === modified file 'man/landscape-message.1' |
235 | --- man/landscape-message.1 2012-03-05 14:11:42 +0000 |
236 | +++ man/landscape-message.1 2012-03-28 08:35:22 +0000 |
237 | @@ -1,5 +1,5 @@ |
238 | .\"Text automatically generated by txt2man |
239 | -.TH landscape-message "18 January 2010" "" "" |
240 | +.TH landscape-message 1 "27 March 2012" "" "" |
241 | .SH NAME |
242 | \fBlandscape-message \fP- Send a message to the landscape web interface |
243 | \fB |
244 | |
245 | === modified file 'po/fr.po' |
246 | --- po/fr.po 2012-03-27 13:46:13 +0000 |
247 | +++ po/fr.po 2012-03-28 08:35:22 +0000 |
248 | @@ -8,8 +8,13 @@ |
249 | msgstr "" |
250 | "Project-Id-Version: PACKAGE VERSION\n" |
251 | "Report-Msgid-Bugs-To: \n" |
252 | +<<<<<<< TREE |
253 | "POT-Creation-Date: 2012-03-27 15:42+0200\n" |
254 | "PO-Revision-Date: 2012-03-27 15:45+0100\n" |
255 | +======= |
256 | +"POT-Creation-Date: 2012-03-28 10:04+0200\n" |
257 | +"PO-Revision-Date: 2012-03-23 11:25+0100\n" |
258 | +>>>>>>> MERGE-SOURCE |
259 | "Last-Translator: Thomas Hervé <thomas.herve@canonical.com>\n" |
260 | "Language-Team: français <>\n" |
261 | "Language: \n" |
262 | @@ -56,34 +61,77 @@ |
263 | msgid "Attempting to disable landscape client." |
264 | msgstr "Tentative de désactivation du client Landscape." |
265 | |
266 | +<<<<<<< TREE |
267 | #: ../landscape/ui/view/configuration.py:22 |
268 | #: ../applications/landscape-client-settings.desktop.in.h:1 |
269 | msgid "Management Service" |
270 | msgstr "Service de gestion" |
271 | |
272 | #: ../landscape/ui/view/configuration.py:35 |
273 | +======= |
274 | +#: ../landscape/ui/view/configuration.py:28 |
275 | +#: ../applications/landscape-client-settings.desktop.in.h:1 |
276 | +msgid "Management Service" |
277 | +msgstr "Service de gestion" |
278 | + |
279 | +#: ../landscape/ui/view/configuration.py:67 |
280 | +>>>>>>> MERGE-SOURCE |
281 | msgid "None" |
282 | msgstr "Aucun" |
283 | |
284 | +<<<<<<< TREE |
285 | #: ../landscape/ui/view/configuration.py:39 |
286 | +======= |
287 | +#: ../landscape/ui/view/configuration.py:71 |
288 | +>>>>>>> MERGE-SOURCE |
289 | msgid "Landscape - hosted by Canonical" |
290 | msgstr "Landscape - hébergé par Canonical" |
291 | |
292 | +<<<<<<< TREE |
293 | #: ../landscape/ui/view/configuration.py:43 |
294 | +======= |
295 | +#: ../landscape/ui/view/configuration.py:75 |
296 | +>>>>>>> MERGE-SOURCE |
297 | msgid "Landscape - dedicated server" |
298 | msgstr "Landscape - serveur dédié" |
299 | |
300 | +<<<<<<< TREE |
301 | #: ../landscape/ui/view/configuration.py:47 |
302 | +======= |
303 | +#: ../landscape/ui/view/configuration.py:79 |
304 | +>>>>>>> MERGE-SOURCE |
305 | msgid "Register" |
306 | msgstr "S'enregistrer" |
307 | |
308 | +<<<<<<< TREE |
309 | #: ../landscape/ui/view/configuration.py:51 |
310 | +======= |
311 | +#: ../landscape/ui/view/configuration.py:83 |
312 | +>>>>>>> MERGE-SOURCE |
313 | msgid "Disable" |
314 | msgstr "Désactiver" |
315 | |
316 | +<<<<<<< TREE |
317 | +======= |
318 | +#: ../landscape/ui/view/configuration.py:87 |
319 | +msgid "Invalid host name." |
320 | +msgstr "Nom d'hôte invalide." |
321 | + |
322 | +>>>>>>> MERGE-SOURCE |
323 | #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:1 |
324 | +<<<<<<< TREE |
325 | msgid "Landscape is a remote administration service from Canonical. If you allow it, a Landcape server can monitor this computer's performance and send administration commands." |
326 | msgstr "Landscape est un service de gestion à distance de Canonical. Si vous l'autorisez, un serveur Landscape peut surveiller les performance de cette machine et envoyer des commandes administratives." |
327 | +======= |
328 | +msgid "" |
329 | +"Landscape is a remote administration service from Canonical. If you allow " |
330 | +"it, a Landcape server can monitor this computer's performance and send " |
331 | +"administration commands." |
332 | +msgstr "" |
333 | +"Landscape est un service de gestion à distance de Canonical. Si vous " |
334 | +"l'autorisez, un serveur Landscape peut surveiller les performance de cette " |
335 | +"machine et envoyer des commandes administratives." |
336 | +>>>>>>> MERGE-SOURCE |
337 | |
338 | #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:2 |
339 | #: ../scripts/landscape-client-ui-install:52 |
340 | @@ -115,8 +163,18 @@ |
341 | msgstr "Nom d'hôte du serveur Landscape:" |
342 | |
343 | #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:9 |
344 | +<<<<<<< TREE |
345 | msgid "If you click \"Disable\" the Landscape client on this machine will be disabled. You can reenable it later by revisiting this dialog." |
346 | msgstr "Si vous cliquez sur \"Désactiver\" le client Landscape sera désactivé sur cette machine. Vous pouvez le réactiver plus tard en rouvrant cette fenêtre de dialogue." |
347 | +======= |
348 | +msgid "" |
349 | +"If you click \"Disable\" the Landscape client on this machine will be " |
350 | +"disabled. You can reenable it later by revisiting this dialog." |
351 | +msgstr "" |
352 | +"Si vous cliquez sur \"Désactiver\" le client Landscape sera désactivé sur " |
353 | +"cette machine. Vous pouvez le réactiver plus tard en rouvrant cette fenêtre " |
354 | +"de dialogue." |
355 | +>>>>>>> MERGE-SOURCE |
356 | |
357 | #: ../applications/landscape-client-settings.desktop.in.h:2 |
358 | msgid "Management Service Preferences" |
359 | @@ -124,24 +182,44 @@ |
360 | |
361 | #: ../polkit-1/com.canonical.LandscapeClientSettings.policy.in.h:1 |
362 | msgid "Allow the user to read and write Landscape Client settings." |
363 | -msgstr "Autorise l'utilisateur à lire et écrire la configuration du client Landscape." |
364 | +msgstr "" |
365 | +"Autorise l'utilisateur à lire et écrire la configuration du client Landscape." |
366 | |
367 | #: ../polkit-1/com.canonical.LandscapeClientSettings.policy.in.h:2 |
368 | -msgid "System policy prevents you from reading and writing Landscape Client Settings." |
369 | -msgstr "Politique système vous empêchant de lire et d'écrire la configuration du client Landscape." |
370 | +msgid "" |
371 | +"System policy prevents you from reading and writing Landscape Client " |
372 | +"Settings." |
373 | +msgstr "" |
374 | +"Politique système vous empêchant de lire et d'écrire la configuration du " |
375 | +"client Landscape." |
376 | |
377 | #: ../scripts/landscape-client-ui-install:55 |
378 | msgid "Landscape client" |
379 | msgstr "Client Landscape" |
380 | |
381 | #: ../scripts/landscape-client-ui-install:56 |
382 | +<<<<<<< TREE |
383 | #, fuzzy |
384 | msgid "Landscape is an easy-to-use commercial systems management and monitoring service offered by Canonical that helps administrators manage multiple machines efficiently." |
385 | msgstr "Landscape est un système de gestion et de surveillance proposé en tant que service par Canonical, qui aide les administrateurs à gérer plusieurs machine efficacement." |
386 | +======= |
387 | +msgid "" |
388 | +"Landscape is an easy to use systems management and monitoring service " |
389 | +"offered by Canonical that helps administrators manage multiple machines " |
390 | +"efficiently." |
391 | +msgstr "" |
392 | +"Landscape est un système de gestion et de surveillance proposé en tant que " |
393 | +"service par Canonical, qui aide les administrateurs à gérer plusieurs " |
394 | +"machine efficacement." |
395 | +>>>>>>> MERGE-SOURCE |
396 | |
397 | #: ../scripts/landscape-client-ui-install:59 |
398 | -msgid "You need to install Landscape client to be able to configure it. Do you want to install it now?" |
399 | -msgstr "Il faut installer le client Landscape pour le configurer. Voulez-vous l'installer maintenant?" |
400 | +msgid "" |
401 | +"You need to install Landscape client to be able to configure it. Do you want " |
402 | +"to install it now?" |
403 | +msgstr "" |
404 | +"Il faut installer le client Landscape pour le configurer. Voulez-vous " |
405 | +"l'installer maintenant?" |
406 | |
407 | #: ../scripts/landscape-client-ui-install:61 |
408 | msgid "Install Landscape client?" |
409 | @@ -150,4 +228,3 @@ |
410 | #: ../scripts/landscape-client-ui-install:62 |
411 | msgid "Install" |
412 | msgstr "Installer" |
413 | - |
414 | |
415 | === modified file 'po/landscape-client.pot' |
416 | --- po/landscape-client.pot 2012-03-27 13:46:13 +0000 |
417 | +++ po/landscape-client.pot 2012-03-28 08:35:22 +0000 |
418 | @@ -8,7 +8,11 @@ |
419 | msgstr "" |
420 | "Project-Id-Version: PACKAGE VERSION\n" |
421 | "Report-Msgid-Bugs-To: \n" |
422 | +<<<<<<< TREE |
423 | "POT-Creation-Date: 2012-03-27 15:42+0200\n" |
424 | +======= |
425 | +"POT-Creation-Date: 2012-03-28 10:04+0200\n" |
426 | +>>>>>>> MERGE-SOURCE |
427 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" |
428 | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" |
429 | "Language-Team: LANGUAGE <LL@li.org>\n" |
430 | @@ -55,31 +59,63 @@ |
431 | msgid "Attempting to disable landscape client." |
432 | msgstr "" |
433 | |
434 | +<<<<<<< TREE |
435 | #: ../landscape/ui/view/configuration.py:22 |
436 | #: ../applications/landscape-client-settings.desktop.in.h:1 |
437 | msgid "Management Service" |
438 | msgstr "" |
439 | |
440 | #: ../landscape/ui/view/configuration.py:35 |
441 | +======= |
442 | +#: ../landscape/ui/view/configuration.py:28 |
443 | +#: ../applications/landscape-client-settings.desktop.in.h:1 |
444 | +msgid "Management Service" |
445 | +msgstr "" |
446 | + |
447 | +#: ../landscape/ui/view/configuration.py:67 |
448 | +>>>>>>> MERGE-SOURCE |
449 | msgid "None" |
450 | msgstr "" |
451 | |
452 | +<<<<<<< TREE |
453 | #: ../landscape/ui/view/configuration.py:39 |
454 | +======= |
455 | +#: ../landscape/ui/view/configuration.py:71 |
456 | +>>>>>>> MERGE-SOURCE |
457 | msgid "Landscape - hosted by Canonical" |
458 | msgstr "" |
459 | |
460 | +<<<<<<< TREE |
461 | #: ../landscape/ui/view/configuration.py:43 |
462 | +======= |
463 | +#: ../landscape/ui/view/configuration.py:75 |
464 | +>>>>>>> MERGE-SOURCE |
465 | msgid "Landscape - dedicated server" |
466 | msgstr "" |
467 | |
468 | +<<<<<<< TREE |
469 | #: ../landscape/ui/view/configuration.py:47 |
470 | +======= |
471 | +#: ../landscape/ui/view/configuration.py:79 |
472 | +>>>>>>> MERGE-SOURCE |
473 | msgid "Register" |
474 | msgstr "" |
475 | |
476 | +<<<<<<< TREE |
477 | #: ../landscape/ui/view/configuration.py:51 |
478 | +======= |
479 | +#: ../landscape/ui/view/configuration.py:83 |
480 | +>>>>>>> MERGE-SOURCE |
481 | msgid "Disable" |
482 | msgstr "" |
483 | |
484 | +<<<<<<< TREE |
485 | +======= |
486 | +#: ../landscape/ui/view/configuration.py:87 |
487 | +msgid "Invalid host name." |
488 | +msgstr "" |
489 | + |
490 | +>>>>>>> MERGE-SOURCE |
491 | #: ../landscape/ui/view/ui/landscape-client-settings.glade.h:1 |
492 | msgid "" |
493 | "Landscape is a remote administration service from Canonical. If you allow " |
494 | |
495 | === modified file 'setup.cfg' |
496 | --- setup.cfg 2012-03-23 10:04:18 +0000 |
497 | +++ setup.cfg 2012-03-28 08:35:22 +0000 |
498 | @@ -5,3 +5,5 @@ |
499 | domain=landscape-client |
500 | xml_files=[("share/polkit-1/actions/", ["polkit-1/com.canonical.LandscapeClientSettings.policy.in"])] |
501 | desktop_files=[("share/applications", ["applications/landscape-client-settings.desktop.in"])] |
502 | +merge_po=True |
503 | + |
Looks good! +1
[1] response( self, widget): Gtk.ResponseTyp e.OK) check() : Gtk.ResponseTyp e.OK)
68 def register_
69 - self.response(
70 + if self.validity_
71 + self.response(
72 + else:
73 + return False
This function only returns explicitly if the dialog is not valid. You can probably drop the else clause entirely.
[2] host_name( self):
142 + def test_sanitise_
143 + """
144 + Test UI level host_name sanitation.
145 + """
A nitpick here, but test docstrings shouldn't start with "Test that.." or "Check if..." Just state what the test is verifying. Something like """C{dialog. sanitise_ host_name} removes leading and trailing spaces from hostnames."""