Merge lp:~elachuni/software-center/pep8-test-part20 into lp:software-center

Proposed by Anthony Lenton
Status: Merged
Merged at revision: 2874
Proposed branch: lp:~elachuni/software-center/pep8-test-part20
Merge into: lp:software-center
Prerequisite: lp:~elachuni/software-center/pep8-test-part19
Diff against target: 1547 lines (+368/-270)
11 files modified
softwarecenter/backend/installbackend_impl/aptd.py (+159/-119)
softwarecenter/backend/installbackend_impl/packagekit_enums.py (+4/-2)
softwarecenter/backend/installbackend_impl/packagekitd.py (+92/-59)
softwarecenter/backend/piston/rnrclient.py (+14/-9)
softwarecenter/backend/piston/rnrclient_fake.py (+74/-68)
softwarecenter/backend/piston/rnrclient_pristine.py (+8/-3)
softwarecenter/backend/piston/scaclient.py (+8/-7)
softwarecenter/backend/piston/scaclient_pristine.py (+1/-0)
softwarecenter/backend/piston/sreclient_pristine.py (+1/-0)
softwarecenter/backend/piston/sso_helper.py (+3/-3)
test/test_pep8.py (+4/-0)
To merge this branch: bzr merge lp:~elachuni/software-center/pep8-test-part20
Reviewer Review Type Date Requested Status
Kiwinote Approve
Review via email: mp+97977@code.launchpad.net

Description of the change

This branch makes all files under softwarecenter/backend/piston/ and softwarecenter/backend/installbackend_impl/ pass the pep8 test.

To post a comment you must log in.
Revision history for this message
Kiwinote (kiwinote) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'softwarecenter/backend/installbackend_impl/aptd.py'
--- softwarecenter/backend/installbackend_impl/aptd.py 2012-03-16 14:36:05 +0000
+++ softwarecenter/backend/installbackend_impl/aptd.py 2012-03-16 20:20:25 +0000
@@ -41,7 +41,7 @@
4141
42from softwarecenter.db.application import Application42from softwarecenter.db.application import Application
43from softwarecenter.backend.transactionswatcher import (43from softwarecenter.backend.transactionswatcher import (
44 BaseTransactionsWatcher, 44 BaseTransactionsWatcher,
45 BaseTransaction,45 BaseTransaction,
46 TransactionFinishedResult,46 TransactionFinishedResult,
47 TransactionProgress)47 TransactionProgress)
@@ -52,6 +52,8 @@
52# its important that we only have a single dbus BusConnection52# its important that we only have a single dbus BusConnection
53# per address when using the fake dbus aptd53# per address when using the fake dbus aptd
54buses = {}54buses = {}
55
56
55def get_dbus_bus():57def get_dbus_bus():
56 if "SOFTWARE_CENTER_APTD_FAKE" in os.environ:58 if "SOFTWARE_CENTER_APTD_FAKE" in os.environ:
57 global buses59 global buses
@@ -63,6 +65,7 @@
63 bus = dbus.SystemBus()65 bus = dbus.SystemBus()
64 return bus66 return bus
6567
68
66class FakePurchaseTransaction(object):69class FakePurchaseTransaction(object):
67 def __init__(self, app, iconname):70 def __init__(self, app, iconname):
68 self.pkgname = app.pkgname71 self.pkgname = app.pkgname
@@ -70,6 +73,7 @@
70 self.iconname = iconname73 self.iconname = iconname
71 self.progress = 074 self.progress = 0
7275
76
73class AptdaemonTransaction(BaseTransaction):77class AptdaemonTransaction(BaseTransaction):
74 def __init__(self, trans):78 def __init__(self, trans):
75 self._trans = trans79 self._trans = trans
@@ -126,9 +130,10 @@
126 trans = AptdaemonTransaction(trans)130 trans = AptdaemonTransaction(trans)
127 return real_handler(trans, *args)131 return real_handler(trans, *args)
128132
133
129class AptdaemonTransactionsWatcher(BaseTransactionsWatcher):134class AptdaemonTransactionsWatcher(BaseTransactionsWatcher):
130 """ 135 """
131 base class for objects that need to watch the aptdaemon 136 base class for objects that need to watch the aptdaemon
132 for transaction changes. it registers a handler for the daemon137 for transaction changes. it registers a handler for the daemon
133 going away and reconnects when it appears again138 going away and reconnects when it appears again
134 """139 """
@@ -144,7 +149,7 @@
144 #print "_register_active_transactions_watch", connection149 #print "_register_active_transactions_watch", connection
145 bus = get_dbus_bus()150 bus = get_dbus_bus()
146 apt_daemon = client.get_aptdaemon(bus=bus)151 apt_daemon = client.get_aptdaemon(bus=bus)
147 apt_daemon.connect_to_signal("ActiveTransactionsChanged", 152 apt_daemon.connect_to_signal("ActiveTransactionsChanged",
148 self._on_transactions_changed)153 self._on_transactions_changed)
149 current, queued = apt_daemon.GetActiveTransactions()154 current, queued = apt_daemon.GetActiveTransactions()
150 self._on_transactions_changed(current, queued)155 self._on_transactions_changed(current, queued)
@@ -158,54 +163,54 @@
158 trans = client.get_transaction(tid)163 trans = client.get_transaction(tid)
159 return AptdaemonTransaction(trans)164 return AptdaemonTransaction(trans)
160 except dbus.DBusException:165 except dbus.DBusException:
161 return None166 pass
162167
163168
164class AptdaemonBackend(GObject.GObject, InstallBackend):169class AptdaemonBackend(GObject.GObject, InstallBackend):
165 """ software center specific code that interacts with aptdaemon """170 """ software center specific code that interacts with aptdaemon """
166171
167 __gsignals__ = {'transaction-started':(GObject.SIGNAL_RUN_FIRST,172 __gsignals__ = {'transaction-started': (GObject.SIGNAL_RUN_FIRST,
168 GObject.TYPE_NONE,173 GObject.TYPE_NONE,
169 (str,str,str,str)),174 (str, str, str, str)),
170 # emits a TransactionFinished object175 # emits a TransactionFinished object
171 'transaction-finished':(GObject.SIGNAL_RUN_FIRST,176 'transaction-finished': (GObject.SIGNAL_RUN_FIRST,
172 GObject.TYPE_NONE,177 GObject.TYPE_NONE,
173 (GObject.TYPE_PYOBJECT, )),178 (GObject.TYPE_PYOBJECT, )),
174 'transaction-stopped':(GObject.SIGNAL_RUN_FIRST,179 'transaction-stopped': (GObject.SIGNAL_RUN_FIRST,
175 GObject.TYPE_NONE,180 GObject.TYPE_NONE,
176 (GObject.TYPE_PYOBJECT,)),181 (GObject.TYPE_PYOBJECT,)),
177 'transactions-changed':(GObject.SIGNAL_RUN_FIRST,182 'transactions-changed': (GObject.SIGNAL_RUN_FIRST,
178 GObject.TYPE_NONE,183 GObject.TYPE_NONE,
179 (GObject.TYPE_PYOBJECT, )),184 (GObject.TYPE_PYOBJECT, )),
180 'transaction-progress-changed':(GObject.SIGNAL_RUN_FIRST,185 'transaction-progress-changed': (GObject.SIGNAL_RUN_FIRST,
181 GObject.TYPE_NONE,186 GObject.TYPE_NONE,
182 (str,int,)),187 (str, int,)),
183 # the number/names of the available channels changed188 # the number/names of the available channels changed
184 'channels-changed':(GObject.SIGNAL_RUN_FIRST,189 'channels-changed': (GObject.SIGNAL_RUN_FIRST,
190 GObject.TYPE_NONE,
191 (bool,)),
192 # cache reload emits this specific signal as well
193 'reload-finished': (GObject.SIGNAL_RUN_FIRST,
185 GObject.TYPE_NONE,194 GObject.TYPE_NONE,
186 (bool,)),195 (GObject.TYPE_PYOBJECT, bool,)),
187 # cache reload emits this specific signal as well
188 'reload-finished':(GObject.SIGNAL_RUN_FIRST,
189 GObject.TYPE_NONE,
190 (GObject.TYPE_PYOBJECT, bool,)),
191 }196 }
192197
193 def __init__(self):198 def __init__(self):
194 GObject.GObject.__init__(self)199 GObject.GObject.__init__(self)
195 200
196 bus = get_dbus_bus()201 bus = get_dbus_bus()
197 self.aptd_client = client.AptClient(bus=bus)202 self.aptd_client = client.AptClient(bus=bus)
198 self.pending_transactions = {}203 self.pending_transactions = {}
199 self._transactions_watcher = AptdaemonTransactionsWatcher()204 self._transactions_watcher = AptdaemonTransactionsWatcher()
200 self._transactions_watcher.connect("lowlevel-transactions-changed",205 self._transactions_watcher.connect("lowlevel-transactions-changed",
201 self._on_lowlevel_transactions_changed)206 self._on_lowlevel_transactions_changed)
202 # dict of pkgname -> FakePurchaseTransaction207 # dict of pkgname -> FakePurchaseTransaction
203 self.pending_purchases = {}208 self.pending_purchases = {}
204 self._progress_signal = None209 self._progress_signal = None
205 self._logger = logging.getLogger("softwarecenter.backend")210 self._logger = logging.getLogger("softwarecenter.backend")
206 # the AptdaemonBackendUI code211 # the AptdaemonBackendUI code
207 self.ui = None212 self.ui = None
208 213
209 def _axi_finished(self, res):214 def _axi_finished(self, res):
210 self.emit("channels-changed", res)215 self.emit("channels-changed", res)
211216
@@ -216,7 +221,7 @@
216 # axi is optional, so just do nothing if its not installed221 # axi is optional, so just do nothing if its not installed
217 try:222 try:
218 axi = dbus.Interface(223 axi = dbus.Interface(
219 system_bus.get_object("org.debian.AptXapianIndex","/"),224 system_bus.get_object("org.debian.AptXapianIndex", "/"),
220 "org.debian.AptXapianIndex")225 "org.debian.AptXapianIndex")
221 except dbus.DBusException as e:226 except dbus.DBusException as e:
222 self._logger.warning("axi can not be updated '%s'" % e)227 self._logger.warning("axi can not be updated '%s'" % e)
@@ -234,22 +239,26 @@
234 def fix_broken_depends(self):239 def fix_broken_depends(self):
235 try:240 try:
236 trans = yield self.aptd_client.fix_broken_depends(defer=True)241 trans = yield self.aptd_client.fix_broken_depends(defer=True)
237 self.emit("transaction-started", "", "", trans.tid, TransactionTypes.REPAIR)242 self.emit("transaction-started", "", "", trans.tid,
243 TransactionTypes.REPAIR)
238 yield self._run_transaction(trans, None, None, None)244 yield self._run_transaction(trans, None, None, None)
239 except Exception as error:245 except Exception as error:
240 self._on_trans_error(error)246 self._on_trans_error(error)
241247
242 # FIXME: upgrade add-ons here248 # FIXME: upgrade add-ons here
243 @inline_callbacks249 @inline_callbacks
244 def upgrade(self, app, iconname, addons_install=[], addons_remove=[], metadata=None):250 def upgrade(self, app, iconname, addons_install=[], addons_remove=[],
251 metadata=None):
245 """ upgrade a single package """252 """ upgrade a single package """
246 pkgname = app.pkgname253 pkgname = app.pkgname
247 appname = app.appname254 appname = app.appname
248 try:255 try:
249 trans = yield self.aptd_client.upgrade_packages([pkgname],256 trans = yield self.aptd_client.upgrade_packages([pkgname],
250 defer=True)257 defer=True)
251 self.emit("transaction-started", pkgname, appname, trans.tid, TransactionTypes.UPGRADE)258 self.emit("transaction-started", pkgname, appname, trans.tid,
252 yield self._run_transaction(trans, pkgname, appname, iconname, metadata)259 TransactionTypes.UPGRADE)
260 yield self._run_transaction(trans, pkgname, appname, iconname,
261 metadata)
253 except Exception as error:262 except Exception as error:
254 self._on_trans_error(error, pkgname)263 self._on_trans_error(error, pkgname)
255264
@@ -257,9 +266,10 @@
257# @inline_callbacks266# @inline_callbacks
258# def _simulate_remove_multiple(self, pkgnames):267# def _simulate_remove_multiple(self, pkgnames):
259# try:268# try:
260# trans = yield self.aptd_client.remove_packages(pkgnames, 269# trans = yield self.aptd_client.remove_packages(pkgnames,
261# defer=True)270# defer=True)
262# trans.connect("dependencies-changed", self._on_dependencies_changed)271# trans.connect("dependencies-changed",
272# self._on_dependencies_changed)
263# except Exception:273# except Exception:
264# logging.exception("simulate_remove")274# logging.exception("simulate_remove")
265# return_value(trans)275# return_value(trans)
@@ -278,22 +288,25 @@
278# gtk.main_iteration()288# gtk.main_iteration()
279# time.sleep(0.01)289# time.sleep(0.01)
280290
281
282 @inline_callbacks291 @inline_callbacks
283 def remove(self, app, iconname, addons_install=[], addons_remove=[], metadata=None):292 def remove(self, app, iconname, addons_install=[], addons_remove=[],
293 metadata=None):
284 """ remove a single package """294 """ remove a single package """
285 pkgname = app.pkgname295 pkgname = app.pkgname
286 appname = app.appname296 appname = app.appname
287 try:297 try:
288 trans = yield self.aptd_client.remove_packages([pkgname],298 trans = yield self.aptd_client.remove_packages([pkgname],
289 defer=True)299 defer=True)
290 self.emit("transaction-started", pkgname, appname, trans.tid, TransactionTypes.REMOVE)300 self.emit("transaction-started", pkgname, appname, trans.tid,
291 yield self._run_transaction(trans, pkgname, appname, iconname, metadata)301 TransactionTypes.REMOVE)
302 yield self._run_transaction(trans, pkgname, appname, iconname,
303 metadata)
292 except Exception as error:304 except Exception as error:
293 self._on_trans_error(error, pkgname)305 self._on_trans_error(error, pkgname)
294306
295 @inline_callbacks307 @inline_callbacks
296 def remove_multiple(self, apps, iconnames, addons_install=[], addons_remove=[], metadatas=None):308 def remove_multiple(self, apps, iconnames, addons_install=[],
309 addons_remove=[], metadatas=None):
297 """ queue a list of packages for removal """310 """ queue a list of packages for removal """
298 if metadatas == None:311 if metadatas == None:
299 metadatas = []312 metadatas = []
@@ -303,7 +316,8 @@
303 yield self.remove(app, iconname, metadata)316 yield self.remove(app, iconname, metadata)
304317
305 @inline_callbacks318 @inline_callbacks
306 def install(self, app, iconname, filename=None, addons_install=[], addons_remove=[], metadata=None, force=False):319 def install(self, app, iconname, filename=None, addons_install=[],
320 addons_remove=[], metadata=None, force=False):
307 """Install a single package from the archive321 """Install a single package from the archive
308 If filename is given a local deb package is installed instead.322 If filename is given a local deb package is installed instead.
309 """323 """
@@ -317,23 +331,26 @@
317 # force means on lintian failure331 # force means on lintian failure
318 trans = yield self.aptd_client.install_file(332 trans = yield self.aptd_client.install_file(
319 filename, force=force, defer=True)333 filename, force=force, defer=True)
320 self.emit("transaction-started", pkgname, appname, trans.tid, TransactionTypes.INSTALL)334 self.emit("transaction-started", pkgname, appname, trans.tid,
335 TransactionTypes.INSTALL)
321 yield trans.set_meta_data(sc_filename=filename, defer=True)336 yield trans.set_meta_data(sc_filename=filename, defer=True)
322 else:337 else:
323 install = [pkgname] + addons_install338 install = [pkgname] + addons_install
324 remove = addons_remove339 remove = addons_remove
325 reinstall = remove = purge = upgrade =downgrade = []340 reinstall = remove = purge = upgrade = downgrade = []
326 trans = yield self.aptd_client.commit_packages(341 trans = yield self.aptd_client.commit_packages(
327 install, reinstall, remove, purge, upgrade, downgrade, 342 install, reinstall, remove, purge, upgrade, downgrade,
328 defer=True)343 defer=True)
329 self.emit("transaction-started", pkgname, appname, trans.tid, TransactionTypes.INSTALL)344 self.emit("transaction-started", pkgname, appname, trans.tid,
345 TransactionTypes.INSTALL)
330 yield self._run_transaction(346 yield self._run_transaction(
331 trans, pkgname, appname, iconname, metadata)347 trans, pkgname, appname, iconname, metadata)
332 except Exception as error:348 except Exception as error:
333 self._on_trans_error(error, pkgname)349 self._on_trans_error(error, pkgname)
334350
335 @inline_callbacks351 @inline_callbacks
336 def install_multiple(self, apps, iconnames, addons_install=[], addons_remove=[], metadatas=None):352 def install_multiple(self, apps, iconnames, addons_install=[],
353 addons_remove=[], metadatas=None):
337 """ queue a list of packages for install """354 """ queue a list of packages for install """
338 if metadatas == None:355 if metadatas == None:
339 metadatas = []356 metadatas = []
@@ -341,20 +358,22 @@
341 metadatas.append(None)358 metadatas.append(None)
342 for app, iconname, metadata in zip(apps, iconnames, metadatas):359 for app, iconname, metadata in zip(apps, iconnames, metadatas):
343 yield self.install(app, iconname, metadata=metadata)360 yield self.install(app, iconname, metadata=metadata)
344 361
345 @inline_callbacks362 @inline_callbacks
346 def apply_changes(self, app, iconname, addons_install=[], addons_remove=[], metadata=None):363 def apply_changes(self, app, iconname, addons_install=[],
364 addons_remove=[], metadata=None):
347 """ install and remove add-ons """365 """ install and remove add-ons """
348 pkgname = app.pkgname366 pkgname = app.pkgname
349 appname = app.appname367 appname = app.appname
350 try:368 try:
351 install = addons_install369 install = addons_install
352 remove = addons_remove370 remove = addons_remove
353 reinstall = remove = purge = upgrade =downgrade = []371 reinstall = remove = purge = upgrade = downgrade = []
354 trans = yield self.aptd_client.commit_packages(372 trans = yield self.aptd_client.commit_packages(
355 install, reinstall, remove, purge, upgrade, downgrade, 373 install, reinstall, remove, purge, upgrade, downgrade,
356 defer=True)374 defer=True)
357 self.emit("transaction-started", pkgname, appname, trans.tid, TransactionTypes.APPLY)375 self.emit("transaction-started", pkgname, appname, trans.tid,
376 TransactionTypes.APPLY)
358 yield self._run_transaction(trans, pkgname, appname, iconname)377 yield self._run_transaction(trans, pkgname, appname, iconname)
359 except Exception as error:378 except Exception as error:
360 self._on_trans_error(error)379 self._on_trans_error(error)
@@ -365,12 +384,12 @@
365 # check if the sourcespart is there, if not, do a full reload384 # check if the sourcespart is there, if not, do a full reload
366 # this can happen when the "partner" repository is added, it385 # this can happen when the "partner" repository is added, it
367 # will be in the main sources.list already and this means that386 # will be in the main sources.list already and this means that
368 # aptsources will just enable it instead of adding a extra 387 # aptsources will just enable it instead of adding a extra
369 # sources.list.d file (LP: #666956)388 # sources.list.d file (LP: #666956)
370 d = apt_pkg.config.find_dir("Dir::Etc::sourceparts")389 d = apt_pkg.config.find_dir("Dir::Etc::sourceparts")
371 if (not sources_list or390 if (not sources_list or
372 not os.path.exists(os.path.join(d, sources_list))):391 not os.path.exists(os.path.join(d, sources_list))):
373 sources_list=""392 sources_list = ""
374 try:393 try:
375 trans = yield self.aptd_client.update_cache(394 trans = yield self.aptd_client.update_cache(
376 sources_list=sources_list, defer=True)395 sources_list=sources_list, defer=True)
@@ -404,18 +423,18 @@
404 continue423 continue
405 sourcepart = os.path.basename(channelfile)424 sourcepart = os.path.basename(channelfile)
406 yield self.add_sources_list_entry(entry, sourcepart)425 yield self.add_sources_list_entry(entry, sourcepart)
407 keyfile = channelfile.replace(".list",".key")426 keyfile = channelfile.replace(".list", ".key")
408 if os.path.exists(keyfile):427 if os.path.exists(keyfile):
409 trans = yield self.aptd_client.add_vendor_key_from_file(keyfile, wait=True)428 trans = yield self.aptd_client.add_vendor_key_from_file(
429 keyfile, wait=True)
410 # don't use self._run_transaction() here, to avoid sending430 # don't use self._run_transaction() here, to avoid sending
411 # uneeded signals431 # uneeded signals
412 yield trans.run(defer=True)432 yield trans.run(defer=True)
413 yield self.reload(sourcepart)433 yield self.reload(sourcepart)
414434
415 @inline_callbacks435 @inline_callbacks
416 def add_vendor_key_from_keyserver(self, keyid, 436 def add_vendor_key_from_keyserver(self, keyid,
417 keyserver="hkp://keyserver.ubuntu.com:80/",437 keyserver="hkp://keyserver.ubuntu.com:80/", metadata=None):
418 metadata=None):
419 # strip the keysize438 # strip the keysize
420 if "/" in keyid:439 if "/" in keyid:
421 keyid = keyid.split("/")[1]440 keyid = keyid.split("/")[1]
@@ -452,8 +471,8 @@
452471
453 @inline_callbacks472 @inline_callbacks
454 def authenticate_for_purchase(self):473 def authenticate_for_purchase(self):
455 """ 474 """
456 helper that authenticates with aptdaemon for a purchase operation 475 helper that authenticates with aptdaemon for a purchase operation
457 """476 """
458 bus = get_dbus_bus()477 bus = get_dbus_bus()
459 name = bus.get_unique_name()478 name = bus.get_unique_name()
@@ -462,12 +481,13 @@
462 yield policykit1.check_authorization_by_name(name, action, flags=flags)481 yield policykit1.check_authorization_by_name(name, action, flags=flags)
463482
464 @inline_callbacks483 @inline_callbacks
465 def add_license_key(self, license_key, license_key_path, license_key_oauth, pkgname):484 def add_license_key(self, license_key, license_key_path,
485 license_key_oauth, pkgname):
466 """ add a license key for a purchase. """486 """ add a license key for a purchase. """
467 self._logger.debug(487 self._logger.debug(
468 "adding license_key for pkg '%s' of len: %i" % (488 "adding license_key for pkg '%s' of len: %i" % (
469 pkgname, len(license_key)))489 pkgname, len(license_key)))
470 490
471 # HOME based license keys491 # HOME based license keys
472 if license_key_path and license_key_path.startswith("~"):492 if license_key_path and license_key_path.startswith("~"):
473 # check if its inside HOME and if so, just create it493 # check if its inside HOME and if so, just create it
@@ -503,19 +523,19 @@
503 license_key_path,523 license_key_path,
504 json_oauth_token=None,524 json_oauth_token=None,
505 purchase=True):525 purchase=True):
506 """ 526 """
507 a convenience method that combines all of the steps needed527 a convenience method that combines all of the steps needed
508 to install a for-pay application, including adding the528 to install a for-pay application, including adding the
509 source entry and the vendor key, reloading the package list,529 source entry and the vendor key, reloading the package list,
510 and finally installing the specified application once the530 and finally installing the specified application once the
511 package list reload has completed.531 package list reload has completed.
512 """532 """
513 self.emit("transaction-started", app.pkgname, app.appname, "FIXME-NEED-ID-HERE", TransactionTypes.INSTALL)533 self.emit("transaction-started", app.pkgname, app.appname,
514 self._logger.info("add_repo_add_key_and_install_app() '%s' '%s' '%s'"% (534 "FIXME-NEED-ID-HERE", TransactionTypes.INSTALL)
515 # re.sub() out the password from the log535 self._logger.info("add_repo_add_key_and_install_app() '%s' '%s' '%s'" %
516 re.sub("deb https://.*@", "", deb_line),536 (re.sub("deb https://.*@", "", deb_line), # strip out password
517 signing_key_id, 537 signing_key_id,
518 app))538 app))
519539
520 if purchase:540 if purchase:
521 # pre-authenticate541 # pre-authenticate
@@ -537,15 +557,17 @@
537557
538 # add the metadata early, add_sources_list_entry is a transaction558 # add the metadata early, add_sources_list_entry is a transaction
539 # too559 # too
540 trans_metadata = {'sc_add_repo_and_install_appname' : app.appname, 560 trans_metadata = {
541 'sc_add_repo_and_install_pkgname' : app.pkgname,561 'sc_add_repo_and_install_appname': app.appname,
542 'sc_add_repo_and_install_deb_line' : deb_line,562 'sc_add_repo_and_install_pkgname': app.pkgname,
543 'sc_iconname' : iconname,563 'sc_add_repo_and_install_deb_line': deb_line,
544 'sc_add_repo_and_install_try' : "1",564 'sc_iconname': iconname,
545 'sc_add_repo_and_install_license_key' : license_key or "",565 'sc_add_repo_and_install_try': "1",
546 'sc_add_repo_and_install_license_key_path' : license_key_path or "",566 'sc_add_repo_and_install_license_key': license_key or "",
547 'sc_add_repo_and_install_license_key_token' : json_oauth_token or "",567 'sc_add_repo_and_install_license_key_path': license_key_path or "",
548 }568 'sc_add_repo_and_install_license_key_token': \
569 json_oauth_token or "",
570 }
549571
550 self._logger.info("add_sources_list_entry()")572 self._logger.info("add_sources_list_entry()")
551 sourcepart = yield self.add_sources_list_entry(deb_line)573 sourcepart = yield self.add_sources_list_entry(deb_line)
@@ -560,8 +582,9 @@
560 yield self._reload_for_commercial_repo(app, trans_metadata, sourcepart)582 yield self._reload_for_commercial_repo(app, trans_metadata, sourcepart)
561583
562 @inline_callbacks584 @inline_callbacks
563 def _reload_for_commercial_repo_defer(self, app, trans_metadata, sources_list):585 def _reload_for_commercial_repo_defer(self, app, trans_metadata,
564 """ 586 sources_list):
587 """
565 helper that reloads and registers a callback for when the reload is588 helper that reloads and registers a callback for when the reload is
566 finished589 finished
567 """590 """
@@ -570,7 +593,7 @@
570 # otherwise the daemon will fail because he does not know593 # otherwise the daemon will fail because he does not know
571 # the new package name yet594 # the new package name yet
572 self.connect("reload-finished",595 self.connect("reload-finished",
573 self._on_reload_for_add_repo_and_install_app_finished, 596 self._on_reload_for_add_repo_and_install_app_finished,
574 trans_metadata, app)597 trans_metadata, app)
575 # reload to ensure we have the new package data598 # reload to ensure we have the new package data
576 yield self.reload(sources_list=sources_list, metadata=trans_metadata)599 yield self.reload(sources_list=sources_list, metadata=trans_metadata)
@@ -588,29 +611,34 @@
588 return False611 return False
589612
590 @inline_callbacks613 @inline_callbacks
591 def _on_reload_for_add_repo_and_install_app_finished(self, backend, trans, 614 def _on_reload_for_add_repo_and_install_app_finished(self, backend, trans,
592 result, metadata, app):615 result, metadata, app):
593 """ 616 """
594 callback that is called once after reload was queued617 callback that is called once after reload was queued
595 and will trigger the install of the for-pay package itself618 and will trigger the install of the for-pay package itself
596 (after that it will automatically de-register)619 (after that it will automatically de-register)
597 """620 """
598 #print "_on_reload_for_add_repo_and_install_app_finished", trans, result, backend, self._reload_signal_id621 #print "_on_reload_for_add_repo_and_install_app_finished", trans, \
599 self._logger.info("_on_reload_for_add_repo_and_install_app_finished() %s %s %s" % (trans, result, app))622 # result, backend, self._reload_signal_id
623 self._logger.info("_on_reload_for_add_repo_and_install_app_finished() "
624 "%s %s %s" % (trans, result, app))
600625
601 # check if this is the transaction we waiting for626 # check if this is the transaction we waiting for
602 key = "sc_add_repo_and_install_pkgname"627 key = "sc_add_repo_and_install_pkgname"
603 if not (key in trans.meta_data and trans.meta_data[key] == app.pkgname):628 if not (key in trans.meta_data and
629 trans.meta_data[key] == app.pkgname):
604 return_value(None)630 return_value(None)
605631
606 # get the debline and check if we have a release.gpg file632 # get the debline and check if we have a release.gpg file
607 deb_line = trans.meta_data["sc_add_repo_and_install_deb_line"]633 deb_line = trans.meta_data["sc_add_repo_and_install_deb_line"]
608 license_key = trans.meta_data["sc_add_repo_and_install_license_key"]634 license_key = trans.meta_data["sc_add_repo_and_install_license_key"]
609 license_key_path = trans.meta_data["sc_add_repo_and_install_license_key_path"]635 license_key_path = trans.meta_data[
610 license_key_oauth = trans.meta_data["sc_add_repo_and_install_license_key_token"] 636 "sc_add_repo_and_install_license_key_path"]
637 license_key_oauth = trans.meta_data[
638 "sc_add_repo_and_install_license_key_token"]
611 release_filename = release_filename_in_lists_from_deb_line(deb_line)639 release_filename = release_filename_in_lists_from_deb_line(deb_line)
612 lists_dir = apt_pkg.config.find_dir("Dir::State::lists")640 lists_dir = apt_pkg.config.find_dir("Dir::State::lists")
613 release_signature = os.path.join(lists_dir, release_filename)+".gpg"641 release_signature = os.path.join(lists_dir, release_filename) + ".gpg"
614 self._logger.info("looking for '%s'" % release_signature)642 self._logger.info("looking for '%s'" % release_signature)
615 # no Release.gpg in the newly added repository, try again,643 # no Release.gpg in the newly added repository, try again,
616 # this can happen e.g. on odd network proxies644 # this can happen e.g. on odd network proxies
@@ -625,15 +653,15 @@
625 # FIXME: this logic will *fail* if the sources.list of the user653 # FIXME: this logic will *fail* if the sources.list of the user
626 # was broken before654 # was broken before
627655
628 # run install action if the repo was added successfully 656 # run install action if the repo was added successfully
629 if result:657 if result:
630 self.emit("channels-changed", True)658 self.emit("channels-changed", True)
631659
632 # we use aptd_client.install_packages() here instead660 # we use aptd_client.install_packages() here instead
633 # of just 661 # of just
634 # self.install(app, "", metadata=metadata)662 # self.install(app, "", metadata=metadata)
635 # go get less authentication prompts (because of the 03_auth_me_less663 # go get less authentication prompts (because of the
636 # patch in aptdaemon)664 # 03_auth_me_less patch in aptdaemon)
637 try:665 try:
638 self._logger.info("install_package()")666 self._logger.info("install_package()")
639 trans = yield self.aptd_client.install_packages(667 trans = yield self.aptd_client.install_packages(
@@ -648,7 +676,7 @@
648 # but I wonder if we should ease that restriction676 # but I wonder if we should ease that restriction
649 if license_key and not os.path.exists(license_key_path):677 if license_key and not os.path.exists(license_key_path):
650 yield self.add_license_key(678 yield self.add_license_key(
651 license_key, license_key_path, license_key_oauth, 679 license_key, license_key_path, license_key_oauth,
652 app.pkgname)680 app.pkgname)
653681
654 else:682 else:
@@ -668,14 +696,16 @@
668 # whole re-try machinery will not survive anyway if the local696 # whole re-try machinery will not survive anyway if the local
669 # s-c instance is closed697 # s-c instance is closed
670 self._logger.info("queuing reload in 30s")698 self._logger.info("queuing reload in 30s")
671 trans.meta_data["sc_add_repo_and_install_try"]= str(retry+1)699 trans.meta_data["sc_add_repo_and_install_try"] = str(retry + 1)
672 sourcepart = trans.meta_data["sc_add_repo_and_install_sources_list"]700 sourcepart = trans.meta_data[
701 "sc_add_repo_and_install_sources_list"]
673 GObject.timeout_add_seconds(30, self._reload_for_commercial_repo,702 GObject.timeout_add_seconds(30, self._reload_for_commercial_repo,
674 app, trans.meta_data, sourcepart)703 app, trans.meta_data, sourcepart)
675704
676 # internal helpers705 # internal helpers
677 def _on_lowlevel_transactions_changed(self, watcher, current, pending):706 def _on_lowlevel_transactions_changed(self, watcher, current, pending):
678 # cleanup progress signal (to be sure to not leave dbus matchers around)707 # cleanup progress signal (to be sure to not leave dbus
708 # matchers around)
679 if self._progress_signal:709 if self._progress_signal:
680 GObject.source_remove(self._progress_signal)710 GObject.source_remove(self._progress_signal)
681 self._progress_signal = None711 self._progress_signal = None
@@ -683,7 +713,8 @@
683 if current:713 if current:
684 try:714 try:
685 trans = client.get_transaction(current)715 trans = client.get_transaction(current)
686 self._progress_signal = trans.connect("progress-changed", self._on_progress_changed)716 self._progress_signal = trans.connect("progress-changed",
717 self._on_progress_changed)
687 except dbus.DBusException:718 except dbus.DBusException:
688 pass719 pass
689720
@@ -693,12 +724,14 @@
693 if not tid:724 if not tid:
694 continue725 continue
695 try:726 try:
696 trans = client.get_transaction(tid, error_handler=lambda x: True)727 trans = client.get_transaction(tid,
728 error_handler=lambda x: True)
697 except dbus.DBusException:729 except dbus.DBusException:
698 continue730 continue
699 trans_progress = TransactionProgress(trans)731 trans_progress = TransactionProgress(trans)
700 try:732 try:
701 self.pending_transactions[trans_progress.pkgname] = trans_progress733 self.pending_transactions[trans_progress.pkgname] = \
734 trans_progress
702 except KeyError:735 except KeyError:
703 # if its not a transaction from us (sc_pkgname) still736 # if its not a transaction from us (sc_pkgname) still
704 # add it with the tid as key to get accurate results737 # add it with the tid as key to get accurate results
@@ -709,19 +742,20 @@
709 self.inject_fake_transactions_and_emit_changed_signal()742 self.inject_fake_transactions_and_emit_changed_signal()
710743
711 def inject_fake_transactions_and_emit_changed_signal(self):744 def inject_fake_transactions_and_emit_changed_signal(self):
712 """ 745 """
713 ensures that the fake transactions are considered and emits746 ensures that the fake transactions are considered and emits
714 transactions-changed signal with the right pending transactions747 transactions-changed signal with the right pending transactions
715 """748 """
716 # inject a bunch FakePurchaseTransaction into the transations dict749 # inject a bunch FakePurchaseTransaction into the transations dict
717 for pkgname in self.pending_purchases:750 for pkgname in self.pending_purchases:
718 self.pending_transactions[pkgname] = self.pending_purchases[pkgname]751 self.pending_transactions[pkgname] = \
752 self.pending_purchases[pkgname]
719 # and emit the signal753 # and emit the signal
720 self.emit("transactions-changed", self.pending_transactions)754 self.emit("transactions-changed", self.pending_transactions)
721755
722 def _on_progress_changed(self, trans, progress):756 def _on_progress_changed(self, trans, progress):
723 """ 757 """
724 internal helper that gets called on our package transaction progress 758 internal helper that gets called on our package transaction progress
725 (only showing pkg progress currently)759 (only showing pkg progress currently)
726 """760 """
727 try:761 try:
@@ -741,7 +775,8 @@
741 return775 return
742 # hide any private ppa details in the error message since it may776 # hide any private ppa details in the error message since it may
743 # appear in the logs for LP bugs and potentially in screenshots as well777 # appear in the logs for LP bugs and potentially in screenshots as well
744 cleaned_error_details = obfuscate_private_ppa_details(trans.error_details)778 cleaned_error_details = obfuscate_private_ppa_details(
779 trans.error_details)
745 msg = utf8("%s: %s\n%s\n\n%s") % (780 msg = utf8("%s: %s\n%s\n\n%s") % (
746 utf8(_("Error")),781 utf8(_("Error")),
747 utf8(enums.get_error_string_from_enum(trans.error_code)),782 utf8(enums.get_error_string_from_enum(trans.error_code)),
@@ -750,20 +785,23 @@
750 self._logger.error("error in _on_trans_finished '%s'" % msg)785 self._logger.error("error in _on_trans_finished '%s'" % msg)
751 # show dialog to the user and exit (no need to reopen the cache)786 # show dialog to the user and exit (no need to reopen the cache)
752 if not trans.error_code:787 if not trans.error_code:
753 # sometimes aptdaemon doesn't return a value for error_code when the network788 # sometimes aptdaemon doesn't return a value for error_code
754 # connection has become unavailable; in that case, we will assume it's a789 # when the network connection has become unavailable; in
755 # failure during a package download because that is the only case where we790 # that case, we will assume it's a failure during a package
756 # see this happening - this avoids display of an empty error dialog and791 # download because that is the only case where we see this
757 # correctly prompts the user to check their network connection (see LP: #747172)792 # happening - this avoids display of an empty error dialog
758 # FIXME: fix aptdaemon to return a valid error_code under all conditions793 # and correctly prompts the user to check their network
794 # connection (see LP: #747172)
795 # FIXME: fix aptdaemon to return a valid error_code under
796 # all conditions
759 trans.error_code = enums.ERROR_PACKAGE_DOWNLOAD_FAILED797 trans.error_code = enums.ERROR_PACKAGE_DOWNLOAD_FAILED
760 # show dialog to the user and exit (no need to reopen798 # show dialog to the user and exit (no need to reopen
761 # the cache)799 # the cache)
762 res = self.ui.error(None,800 res = self.ui.error(None,
763 utf8(enums.get_error_string_from_enum(trans.error_code)),801 utf8(enums.get_error_string_from_enum(trans.error_code)),
764 utf8(enums.get_error_description_from_enum(trans.error_code)),802 utf8(enums.get_error_description_from_enum(trans.error_code)),
765 utf8(cleaned_error_details),803 utf8(cleaned_error_details),
766 utf8(alternative_action))804 utf8(alternative_action))
767 return res805 return res
768806
769 def _get_app_and_icon_and_deb_from_trans(self, trans):807 def _get_app_and_icon_and_deb_from_trans(self, trans):
@@ -794,7 +832,7 @@
794 self.install(app, iconname, filename, [], [],832 self.install(app, iconname, filename, [], [],
795 metadata=meta_copy, force=True)833 metadata=meta_copy, force=True)
796 return834 return
797 # on unauthenticated errors, try a "repair" using the 835 # on unauthenticated errors, try a "repair" using the
798 # reload functionatlity836 # reload functionatlity
799 elif trans.error.code == enums.ERROR_PACKAGE_UNAUTHENTICATED:837 elif trans.error.code == enums.ERROR_PACKAGE_UNAUTHENTICATED:
800 action = _("Repair")838 action = _("Repair")
@@ -808,7 +846,8 @@
808 metadata=meta_copy)846 metadata=meta_copy)
809 return847 return
810848
811 elif not "sc_add_repo_and_install_ignore_errors" in trans.meta_data:849 elif (not "sc_add_repo_and_install_ignore_errors" in
850 trans.meta_data):
812 self._show_transaction_failed_dialog(trans, enum)851 self._show_transaction_failed_dialog(trans, enum)
813852
814 # send finished signal, use "" here instead of None, because853 # send finished signal, use "" here instead of None, because
@@ -827,7 +866,8 @@
827 self.emit("reload-finished", trans, enum != enums.EXIT_FAILED)866 self.emit("reload-finished", trans, enum != enums.EXIT_FAILED)
828 # send appropriate signals867 # send appropriate signals
829 self.inject_fake_transactions_and_emit_changed_signal()868 self.inject_fake_transactions_and_emit_changed_signal()
830 self.emit("transaction-finished", TransactionFinishedResult(trans, enum != enums.EXIT_FAILED))869 self.emit("transaction-finished", TransactionFinishedResult(trans,
870 enum != enums.EXIT_FAILED))
831871
832 @inline_callbacks872 @inline_callbacks
833 def _config_file_conflict(self, transaction, old, new):873 def _config_file_conflict(self, transaction, old, new):
@@ -871,7 +911,8 @@
871 # setup debconf only if we have a pkg911 # setup debconf only if we have a pkg
872 yield trans.set_debconf_frontend("gnome", defer=True)912 yield trans.set_debconf_frontend("gnome", defer=True)
873 trans.set_remove_obsoleted_depends(True, defer=True)913 trans.set_remove_obsoleted_depends(True, defer=True)
874 self._progress_signal = trans.connect("progress-changed", self._on_progress_changed)914 self._progress_signal = trans.connect("progress-changed",
915 self._on_progress_changed)
875 self.pending_transactions[pkgname] = TransactionProgress(trans)916 self.pending_transactions[pkgname] = TransactionProgress(trans)
876 # generic metadata917 # generic metadata
877 if metadata:918 if metadata:
@@ -919,4 +960,3 @@
919 backend.enable_component("multiverse")960 backend.enable_component("multiverse")
920 from gi.repository import Gtk961 from gi.repository import Gtk
921 Gtk.main()962 Gtk.main()
922
923963
=== modified file 'softwarecenter/backend/installbackend_impl/packagekit_enums.py'
--- softwarecenter/backend/installbackend_impl/packagekit_enums.py 2011-12-16 12:50:18 +0000
+++ softwarecenter/backend/installbackend_impl/packagekit_enums.py 2012-03-16 20:20:25 +0000
@@ -18,9 +18,11 @@
1818
19from gi.repository import PackageKitGlib as packagekit19from gi.repository import PackageKitGlib as packagekit
2020
21
21# this requires packagekit 0.7.2 or better22# this requires packagekit 0.7.2 or better
22def status_enum_to_localised_text (status):23def status_enum_to_localised_text(status):
23 return packagekit.info_enum_to_localised_present(status)24 return packagekit.info_enum_to_localised_present(status)
2425
25def role_enum_to_localised_present (role):26
27def role_enum_to_localised_present(role):
26 return packagekit.role_enum_to_localised_present(role)28 return packagekit.role_enum_to_localised_present(role)
2729
=== modified file 'softwarecenter/backend/installbackend_impl/packagekitd.py'
--- softwarecenter/backend/installbackend_impl/packagekitd.py 2012-02-07 16:56:40 +0000
+++ softwarecenter/backend/installbackend_impl/packagekitd.py 2012-03-16 20:20:25 +0000
@@ -24,10 +24,12 @@
24from gi.repository import PackageKitGlib as packagekit24from gi.repository import PackageKitGlib as packagekit
2525
26from softwarecenter.enums import TransactionTypes26from softwarecenter.enums import TransactionTypes
27from softwarecenter.backend.transactionswatcher import (BaseTransactionsWatcher,27from softwarecenter.backend.transactionswatcher import (
28 BaseTransaction,28 BaseTransactionsWatcher,
29 TransactionFinishedResult,29 BaseTransaction,
30 TransactionProgress)30 TransactionFinishedResult,
31 TransactionProgress
32)
31from softwarecenter.backend.installbackend import InstallBackend33from softwarecenter.backend.installbackend import InstallBackend
32from softwarecenter.backend.installbackend_impl import packagekit_enums34from softwarecenter.backend.installbackend_impl import packagekit_enums
3335
@@ -36,9 +38,10 @@
3638
37LOG = logging.getLogger("softwarecenter.backend.packagekit")39LOG = logging.getLogger("softwarecenter.backend.packagekit")
3840
41
39class PackagekitTransaction(BaseTransaction):42class PackagekitTransaction(BaseTransaction):
40 _meta_data = {}43 _meta_data = {}
41 44
42 def __init__(self, trans):45 def __init__(self, trans):
43 """ trans -- a PkProgress object """46 """ trans -- a PkProgress object """
44 GObject.GObject.__init__(self)47 GObject.GObject.__init__(self)
@@ -50,18 +53,26 @@
50 because PK DBus exposes only a generic Changed, without53 because PK DBus exposes only a generic Changed, without
51 specifying the property changed54 specifying the property changed
52 """55 """
53 self._trans.connect('notify::role', self._emit, 'role-changed', 'role')56 self._trans.connect('notify::role', self._emit,
54 self._trans.connect('notify::status', self._emit, 'status-changed', 'status')57 'role-changed', 'role')
55 self._trans.connect('notify::percentage', self._emit, 'progress-changed', 'percentage')58 self._trans.connect('notify::status', self._emit,
56 #self._trans.connect('notify::subpercentage', self._emit, 'progress-changed', 'subpercentage') # SC UI does not support subprogress59 'status-changed', 'status')
57 self._trans.connect('notify::percentage', self._emit, 'progress-changed', 'percentage')60 self._trans.connect('notify::percentage', self._emit,
58 self._trans.connect('notify::allow-cancel', self._emit, 'cancellable-changed', 'allow-cancel')61 'progress-changed', 'percentage')
62 # SC UI does not support subprogress:
63 #self._trans.connect('notify::subpercentage', self._emit,
64 # 'progress-changed', 'subpercentage')
65 self._trans.connect('notify::percentage', self._emit,
66 'progress-changed', 'percentage')
67 self._trans.connect('notify::allow-cancel', self._emit,
68 'cancellable-changed', 'allow-cancel')
5969
60 # connect the delete:70 # connect the delete:
61 proxy = dbus.SystemBus().get_object('org.freedesktop.PackageKit', self.tid)71 proxy = dbus.SystemBus().get_object('org.freedesktop.PackageKit',
72 self.tid)
62 trans = dbus.Interface(proxy, 'org.freedesktop.PackageKit.Transaction')73 trans = dbus.Interface(proxy, 'org.freedesktop.PackageKit.Transaction')
63 trans.connect_to_signal("Destroy", self._remove)74 trans.connect_to_signal("Destroy", self._remove)
64 75
65 def _emit(self, *args):76 def _emit(self, *args):
66 prop, what = args[-1], args[-2]77 prop, what = args[-1], args[-2]
67 self.emit(what, self._trans.get_property(prop))78 self.emit(what, self._trans.get_property(prop))
@@ -69,25 +80,31 @@
69 @property80 @property
70 def tid(self):81 def tid(self):
71 return self._trans.get_property('transaction-id')82 return self._trans.get_property('transaction-id')
83
72 @property84 @property
73 def status_details(self):85 def status_details(self):
74 return self.get_status_description() # FIXME86 return self.get_status_description() # FIXME
87
75 @property88 @property
76 def meta_data(self):89 def meta_data(self):
77 return self._meta_data90 return self._meta_data
91
78 @property92 @property
79 def cancellable(self):93 def cancellable(self):
80 return self._trans.get_property('allow-cancel')94 return self._trans.get_property('allow-cancel')
95
81 @property96 @property
82 def progress(self):97 def progress(self):
83 return self._trans.get_property('percentage')98 return self._trans.get_property('percentage')
8499
85 def get_role_description(self, role=None):100 def get_role_description(self, role=None):
86 role = role if role is not None else self._trans.get_property('role')101 role = role if role is not None else self._trans.get_property('role')
87 return self.meta_data.get('sc_appname', packagekit_enums.role_enum_to_localised_present(role))102 return self.meta_data.get('sc_appname',
103 packagekit_enums.role_enum_to_localised_present(role))
88104
89 def get_status_description(self, status=None):105 def get_status_description(self, status=None):
90 status = status if status is not None else self._trans.get_property('status')106 if status is None:
107 status = self._trans.get_property('status')
91108
92 return packagekit_enums.status_enum_to_localised_text(status)109 return packagekit_enums.status_enum_to_localised_text(status)
93110
@@ -107,7 +124,8 @@
107 status <= packagekit.StatusEnum.DOWNLOAD_UPDATEINFO)124 status <= packagekit.StatusEnum.DOWNLOAD_UPDATEINFO)
108125
109 def cancel(self):126 def cancel(self):
110 proxy = dbus.SystemBus().get_object('org.freedesktop.PackageKit', self.tid)127 proxy = dbus.SystemBus().get_object('org.freedesktop.PackageKit',
128 self.tid)
111 trans = dbus.Interface(proxy, 'org.freedesktop.PackageKit.Transaction')129 trans = dbus.Interface(proxy, 'org.freedesktop.PackageKit.Transaction')
112 trans.Cancel()130 trans.Cancel()
113131
@@ -120,6 +138,7 @@
120 del PackagekitTransactionsWatcher._tlist[self.tid]138 del PackagekitTransactionsWatcher._tlist[self.tid]
121 LOG.debug("Delete transaction %s" % self.tid)139 LOG.debug("Delete transaction %s" % self.tid)
122140
141
123class PackagekitTransactionsWatcher(BaseTransactionsWatcher):142class PackagekitTransactionsWatcher(BaseTransactionsWatcher):
124 _tlist = {}143 _tlist = {}
125144
@@ -128,9 +147,10 @@
128 self.client = packagekit.Client()147 self.client = packagekit.Client()
129148
130 bus = dbus.SystemBus()149 bus = dbus.SystemBus()
131 proxy = bus.get_object('org.freedesktop.PackageKit', '/org/freedesktop/PackageKit')150 proxy = bus.get_object('org.freedesktop.PackageKit',
151 '/org/freedesktop/PackageKit')
132 daemon = dbus.Interface(proxy, 'org.freedesktop.PackageKit')152 daemon = dbus.Interface(proxy, 'org.freedesktop.PackageKit')
133 daemon.connect_to_signal("TransactionListChanged", 153 daemon.connect_to_signal("TransactionListChanged",
134 self._on_transactions_changed)154 self._on_transactions_changed)
135 queued = daemon.GetTransactionList()155 queued = daemon.GetTransactionList()
136 self._on_transactions_changed(queued)156 self._on_transactions_changed(queued)
@@ -161,29 +181,30 @@
161 return trans181 return trans
162 return PackagekitTransactionsWatcher._tlist[tid]182 return PackagekitTransactionsWatcher._tlist[tid]
163183
184
164class PackagekitBackend(GObject.GObject, InstallBackend):185class PackagekitBackend(GObject.GObject, InstallBackend):
165 186
166 __gsignals__ = {'transaction-started':(GObject.SIGNAL_RUN_FIRST,187 __gsignals__ = {'transaction-started': (GObject.SIGNAL_RUN_FIRST,
167 GObject.TYPE_NONE,188 GObject.TYPE_NONE,
168 (str,str,str,str)),189 (str, str, str, str)),
169 # emits a TransactionFinished object190 # emits a TransactionFinished object
170 'transaction-finished':(GObject.SIGNAL_RUN_FIRST,191 'transaction-finished': (GObject.SIGNAL_RUN_FIRST,
171 GObject.TYPE_NONE,192 GObject.TYPE_NONE,
172 (GObject.TYPE_PYOBJECT, )),193 (GObject.TYPE_PYOBJECT, )),
173 'transaction-stopped':(GObject.SIGNAL_RUN_FIRST,194 'transaction-stopped': (GObject.SIGNAL_RUN_FIRST,
174 GObject.TYPE_NONE,195 GObject.TYPE_NONE,
175 (GObject.TYPE_PYOBJECT,)),196 (GObject.TYPE_PYOBJECT,)),
176 'transactions-changed':(GObject.SIGNAL_RUN_FIRST,197 'transactions-changed': (GObject.SIGNAL_RUN_FIRST,
177 GObject.TYPE_NONE,198 GObject.TYPE_NONE,
178 (GObject.TYPE_PYOBJECT, )),199 (GObject.TYPE_PYOBJECT, )),
179 'transaction-progress-changed':(GObject.SIGNAL_RUN_FIRST,200 'transaction-progress-changed': (GObject.SIGNAL_RUN_FIRST,
180 GObject.TYPE_NONE,201 GObject.TYPE_NONE,
181 (str,int,)),202 (str, int,)),
182 # the number/names of the available channels changed203 # the number/names of the available channels changed
183 # FIXME: not emitted.204 # FIXME: not emitted.
184 'channels-changed':(GObject.SIGNAL_RUN_FIRST,205 'channels-changed': (GObject.SIGNAL_RUN_FIRST,
185 GObject.TYPE_NONE,206 GObject.TYPE_NONE,
186 (bool,)),207 (bool,)),
187 }208 }
188209
189 def __init__(self):210 def __init__(self):
@@ -192,7 +213,7 @@
192213
193 # transaction details for setting as meta214 # transaction details for setting as meta
194 self.new_pkgname, self.new_appname, self.new_iconname = '', '', ''215 self.new_pkgname, self.new_appname, self.new_iconname = '', '', ''
195 216
196 # this is public exposed217 # this is public exposed
197 self.pending_transactions = {}218 self.pending_transactions = {}
198219
@@ -202,11 +223,12 @@
202223
203 self._transactions_watcher = PackagekitTransactionsWatcher()224 self._transactions_watcher = PackagekitTransactionsWatcher()
204 self._transactions_watcher.connect('lowlevel-transactions-changed',225 self._transactions_watcher.connect('lowlevel-transactions-changed',
205 self._on_lowlevel_transactions_changed) 226 self._on_lowlevel_transactions_changed)
206227
207 def upgrade(self, pkgname, appname, iconname, addons_install=[],228 def upgrade(self, pkgname, appname, iconname, addons_install=[],
208 addons_remove=[], metadata=None):229 addons_remove=[], metadata=None):
209 pass # FIXME implement it230 pass # FIXME implement it
231
210 def remove(self, app, iconname, addons_install=[],232 def remove(self, app, iconname, addons_install=[],
211 addons_remove=[], metadata=None):233 addons_remove=[], metadata=None):
212 self.remove_multiple((app,), (iconname,),234 self.remove_multiple((app,), (iconname,),
@@ -220,26 +242,29 @@
220 appnames = [app.appname for app in apps]242 appnames = [app.appname for app in apps]
221243
222 # keep track of pkg, app and icon for setting them as meta244 # keep track of pkg, app and icon for setting them as meta
223 self.new_pkgname, self.new_appname, self.new_iconname = pkgnames[0], appnames[0], iconnames[0]245 self.new_pkgname = pkgnames[0]
246 self.new_appname = appnames[0]
247 self.new_iconname = iconnames[0]
224248
225 # temporary hack249 # temporary hack
226 pkgnames = self._fix_pkgnames(pkgnames)250 pkgnames = self._fix_pkgnames(pkgnames)
227251
228 self.client.remove_packages_async(pkgnames,252 self.client.remove_packages_async(pkgnames,
229 False, # allow deps253 False, # allow deps
230 False, # autoremove254 False, # autoremove
231 None, # cancellable255 None, # cancellable
232 self._on_progress_changed,256 self._on_progress_changed,
233 None, # progress data257 None, # progress data
234 self._on_remove_ready, # callback ready258 self._on_remove_ready, # callback ready
235 None # callback data259 None # callback data
236 )260 )
237 self.emit("transaction-started", pkgnames[0], appnames[0], 0, TransactionTypes.REMOVE)261 self.emit("transaction-started", pkgnames[0], appnames[0], 0,
262 TransactionTypes.REMOVE)
238263
239 def install(self, app, iconname, filename=None,264 def install(self, app, iconname, filename=None,
240 addons_install=[], addons_remove=[], metadata=None):265 addons_install=[], addons_remove=[], metadata=None):
241 if filename is not None:266 if filename is not None:
242 LOG.error("Filename not implemented") # FIXME267 LOG.error("Filename not implemented") # FIXME
243 else:268 else:
244 self.install_multiple((app,), (iconname,),269 self.install_multiple((app,), (iconname,),
245 addons_install, addons_remove, metadata270 addons_install, addons_remove, metadata
@@ -252,7 +277,9 @@
252 appnames = [app.appname for app in apps]277 appnames = [app.appname for app in apps]
253278
254 # keep track of pkg, app and icon for setting them as meta279 # keep track of pkg, app and icon for setting them as meta
255 self.new_pkgname, self.new_appname, self.new_iconname = pkgnames[0], appnames[0], iconnames[0]280 self.new_pkgname = pkgnames[0]
281 self.new_appname = appnames[0]
282 self.new_iconname = iconnames[0]
256283
257 # temporary hack284 # temporary hack
258 pkgnames = self._fix_pkgnames(pkgnames)285 pkgnames = self._fix_pkgnames(pkgnames)
@@ -263,19 +290,21 @@
263 # PackageKit from installing untrusted packages290 # PackageKit from installing untrusted packages
264 # (in general, all enabled repos should have GPG signatures,291 # (in general, all enabled repos should have GPG signatures,
265 # which is enough for being marked "trusted", but still)292 # which is enough for being marked "trusted", but still)
266 self.client.install_packages_async(True, # only trusted293 self.client.install_packages_async(True, # only trusted
267 pkgnames,294 pkgnames,
268 None, # cancellable295 None, # cancellable
269 self._on_progress_changed,296 self._on_progress_changed,
270 None, # progress data297 None, # progress data
271 self._on_install_ready, # GAsyncReadyCallback298 self._on_install_ready, # GAsyncReadyCallback
272 None # ready data299 None # ready data
273 )300 )
274 self.emit("transaction-started", pkgnames[0], appnames[0], 0, TransactionTypes.INSTALL)301 self.emit("transaction-started", pkgnames[0], appnames[0], 0,
302 TransactionTypes.INSTALL)
275303
276 def apply_changes(self, pkgname, appname, iconname,304 def apply_changes(self, pkgname, appname, iconname,
277 addons_install=[], addons_remove=[], metadata=None):305 addons_install=[], addons_remove=[], metadata=None):
278 pass306 pass
307
279 def reload(self, sources_list=None, metadata=None):308 def reload(self, sources_list=None, metadata=None):
280 """ reload package list """309 """ reload package list """
281 pass310 pass
@@ -313,15 +342,19 @@
313 if self.new_pkgname not in self.pending_transactions:342 if self.new_pkgname not in self.pending_transactions:
314 self.pending_transactions[self.new_pkgname] = trans343 self.pending_transactions[self.new_pkgname] = trans
315344
316 #LOG.debug("Progress update %s %s %s %s" % (status, ptype, progress.get_property('transaction-id'),progress.get_property('status')))345 # LOG.debug("Progress update %s %s %s %s" %
346 # (status, ptype, progress.get_property('transaction-id'),
347 # progress.get_property('status')))
317348
318 if status == packagekit.StatusEnum.FINISHED:349 if status == packagekit.StatusEnum.FINISHED:
319 LOG.debug("Transaction finished %s" % tid)350 LOG.debug("Transaction finished %s" % tid)
320 self.emit("transaction-finished", TransactionFinishedResult(trans, True))351 self.emit("transaction-finished",
352 TransactionFinishedResult(trans, True))
321353
322 if status == packagekit.StatusEnum.CANCEL:354 if status == packagekit.StatusEnum.CANCEL:
323 LOG.debug("Transaction canceled %s" % tid)355 LOG.debug("Transaction canceled %s" % tid)
324 self.emit("transaction-stopped", TransactionFinishedResult(trans, True))356 self.emit("transaction-stopped",
357 TransactionFinishedResult(trans, True))
325358
326 if ptype == packagekit.ProgressType.PACKAGE:359 if ptype == packagekit.ProgressType.PACKAGE:
327 # this should be done better360 # this should be done better
@@ -348,7 +381,8 @@
348 trans = self._transactions_watcher.get_transaction(tid)381 trans = self._transactions_watcher.get_transaction(tid)
349 trans_progress = TransactionProgress(trans)382 trans_progress = TransactionProgress(trans)
350 try:383 try:
351 self.pending_transactions[trans_progress.pkgname] = trans_progress384 self.pending_transactions[
385 trans_progress.pkgname] = trans_progress
352 except:386 except:
353 self.pending_transactions[trans.tid] = trans_progress387 self.pending_transactions[trans.tid] = trans_progress
354388
@@ -375,7 +409,7 @@
375409
376 loop = dbus.mainloop.glib.DBusGMainLoop()410 loop = dbus.mainloop.glib.DBusGMainLoop()
377 dbus.set_default_main_loop(loop)411 dbus.set_default_main_loop(loop)
378 412
379 backend = PackagekitBackend()413 backend = PackagekitBackend()
380 pkginfo = get_pkg_info()414 pkginfo = get_pkg_info()
381 if pkginfo[package].is_installed:415 if pkginfo[package].is_installed:
@@ -387,4 +421,3 @@
387 from gi.repository import Gtk421 from gi.repository import Gtk
388 Gtk.main()422 Gtk.main()
389 #print backend._fix_pkgnames(('cheese',))423 #print backend._fix_pkgnames(('cheese',))
390
391424
=== modified file 'softwarecenter/backend/piston/rnrclient.py'
--- softwarecenter/backend/piston/rnrclient.py 2011-10-26 10:25:49 +0000
+++ softwarecenter/backend/piston/rnrclient.py 2012-03-16 20:20:25 +0000
@@ -31,15 +31,18 @@
31# get the server to use31# get the server to use
32from softwarecenter.distro import get_distro32from softwarecenter.distro import get_distro
33distro = get_distro()33distro = get_distro()
34SERVER_ROOT=distro.REVIEWS_SERVER34SERVER_ROOT = distro.REVIEWS_SERVER
3535
36try:36try:
37 if "SOFTWARE_CENTER_FAKE_REVIEW_API" in os.environ:37 if "SOFTWARE_CENTER_FAKE_REVIEW_API" in os.environ:
38 from softwarecenter.backend.piston.rnrclient_fake import RatingsAndReviewsAPI38 from softwarecenter.backend.piston.rnrclient_fake import (
39 RatingsAndReviewsAPI
40 )
39 RatingsAndReviewsAPI.default_service_root = SERVER_ROOT41 RatingsAndReviewsAPI.default_service_root = SERVER_ROOT
40 import rnrclient_fake42 import rnrclient_fake
41 rnrclient_fake43 rnrclient_fake
42 LOG.warn("using FAKE review api, data returned will be dummy data only")44 LOG.warn("using FAKE review api, data returned will be dummy "
45 "data only")
43 else:46 else:
44 # patch default_service_root47 # patch default_service_root
45 from rnrclient_pristine import RatingsAndReviewsAPI48 from rnrclient_pristine import RatingsAndReviewsAPI
@@ -68,22 +71,24 @@
68 # dump all reviews71 # dump all reviews
69 for stat in rnr.review_stats():72 for stat in rnr.review_stats():
70 print("stats for (pkg='%s', app: '%s'): avg=%s total=%s" % (73 print("stats for (pkg='%s', app: '%s'): avg=%s total=%s" % (
71 stat.package_name, stat.app_name, stat.ratings_average, stat.ratings_total))74 stat.package_name, stat.app_name, stat.ratings_average,
75 stat.ratings_total))
72 reviews = rnr.get_reviews(76 reviews = rnr.get_reviews(
73 language="any", origin="ubuntu", distroseries="natty",77 language="any", origin="ubuntu", distroseries="natty",
74 packagename=stat.package_name,78 packagename=stat.package_name,
75 appname=urllib.quote_plus(stat.app_name.encode("utf-8")))79 appname=urllib.quote_plus(stat.app_name.encode("utf-8")))
76 for review in reviews:80 for review in reviews:
77 print("rating: %s user=%s" % (review.rating, review.reviewer_username))81 print("rating: %s user=%s" % (review.rating,
82 review.reviewer_username))
78 print(review.summary)83 print(review.summary)
79 print(review.review_text)84 print(review.review_text)
80 print("\n")85 print("\n")
81 86
82 # get individual ones87 # get individual ones
83 reviews = rnr.get_reviews(language="en",origin="ubuntu",distroseries="maverick",88 reviews = rnr.get_reviews(language="en", origin="ubuntu",
84 packagename="unace", appname="ACE")89 distroseries="maverick", packagename="unace", appname="ACE")
85 print(reviews)90 print(reviews)
86 print(rnr.get_reviews(language="en",origin="ubuntu",distroseries="natty",91 print(rnr.get_reviews(language="en", origin="ubuntu", distroseries="natty",
87 packagename="aclock.app"))92 packagename="aclock.app"))
88 print(rnr.get_reviews(language="en", origin="ubuntu", distroseries="natty",93 print(rnr.get_reviews(language="en", origin="ubuntu", distroseries="natty",
89 packagename="unace", appname="ACE"))94 packagename="unace", appname="ACE"))
9095
=== modified file 'softwarecenter/backend/piston/rnrclient_fake.py'
--- softwarecenter/backend/piston/rnrclient_fake.py 2011-08-15 11:55:13 +0000
+++ softwarecenter/backend/piston/rnrclient_fake.py 2012-03-16 20:20:25 +0000
@@ -17,36 +17,40 @@
17AUTHENTICATED_API_SCHEME = 'https'17AUTHENTICATED_API_SCHEME = 'https'
1818
19from rnrclient_pristine import ReviewRequest, ReviewsStats, ReviewDetails19from rnrclient_pristine import ReviewRequest, ReviewsStats, ReviewDetails
20from softwarecenter.backend.fake_review_settings import FakeReviewSettings, network_delay20from softwarecenter.backend.fake_review_settings import (
21 FakeReviewSettings,
22 network_delay,
23)
21import json24import json
22import random25import random
23import time26import time
2427
2528
26class RatingsAndReviewsAPI(PistonAPI):29class RatingsAndReviewsAPI(PistonAPI):
27 """A fake client pretending to be RAtingsAndReviewsAPI from rnrclient_pristine.30 """A fake client pretending to be RAtingsAndReviewsAPI from
28 Uses settings from test.fake_review_settings.FakeReviewSettings31 rnrclient_pristine. Uses settings from
29 to provide predictable responses to methods that try to use the 32 test.fake_review_settings.FakeReviewSettings
30 RatingsAndReviewsAPI for testing purposes (i.e. without network activity).33 to provide predictable responses to methods that try to use the
31 To use this, instead of importing from rnrclient_pristine, you can import34 RatingsAndReviewsAPI for testing purposes (i.e. without network
32 from rnrclient_fake instead.35 activity).
36 To use this, instead of importing from rnrclient_pristine, you can
37 import from rnrclient_fake instead.
33 """38 """
34 39
35 default_service_root = 'http://localhost:8000/reviews/api/1.0'40 default_service_root = 'http://localhost:8000/reviews/api/1.0'
36 default_content_type = 'application/x-www-form-urlencoded'41 default_content_type = 'application/x-www-form-urlencoded'
37 _exception_msg = 'Fake RatingsAndReviewsAPI raising fake exception'42 _exception_msg = 'Fake RatingsAndReviewsAPI raising fake exception'
38 _PACKAGE_NAMES = ['armagetronad', 'compizconfig-settings-manager', 'file-roller', 43 _PACKAGE_NAMES = ['armagetronad', 'compizconfig-settings-manager',
39 'aisleriot', 'p7zip-full', 'compiz-core', 'banshee', 44 'file-roller', 'aisleriot', 'p7zip-full', 'compiz-core',
40 'gconf-editor', 'nanny', '3depict', 'apturl', 'jockey-gtk', 45 'banshee', 'gconf-editor', 'nanny', '3depict', 'apturl',
41 'alex4', 'bzr-explorer', 'aqualung']46 'jockey-gtk', 'alex4', 'bzr-explorer', 'aqualung']
42 _USERS = ["Joe Doll", "John Foo", "Cat Lala", "Foo Grumpf", 47 _USERS = ["Joe Doll", "John Foo", "Cat Lala", "Foo Grumpf",
43 "Bar Tender", "Baz Lightyear"]48 "Bar Tender", "Baz Lightyear"]
44 _SUMMARIES = ["Cool", "Medium", "Bad", "Too difficult"]49 _SUMMARIES = ["Cool", "Medium", "Bad", "Too difficult"]
45 _TEXT = ["Review text number 1", "Review text number 2", 50 _TEXT = ["Review text number 1", "Review text number 2",
46 "Review text number 3", "Review text number 4"]51 "Review text number 3", "Review text number 4"]
47 _fake_settings = FakeReviewSettings()52 _fake_settings = FakeReviewSettings()
4853
49
50 @returns_json54 @returns_json
51 @network_delay55 @network_delay
52 def server_status(self):56 def server_status(self):
@@ -54,32 +58,31 @@
54 raise APIError(self._exception_msg)58 raise APIError(self._exception_msg)
55 return json.dumps('ok')59 return json.dumps('ok')
5660
57
58 @validate_pattern('origin', r'[0-9a-z+-.:/]+', required=False)61 @validate_pattern('origin', r'[0-9a-z+-.:/]+', required=False)
59 @validate_pattern('distroseries', r'\w+', required=False)62 @validate_pattern('distroseries', r'\w+', required=False)
60 @validate('days', int, required=False)63 @validate('days', int, required=False)
61 @returns_list_of(ReviewsStats)64 @returns_list_of(ReviewsStats)
62 @network_delay65 @network_delay
63 def review_stats(self, origin='any', distroseries='any', days=None,66 def review_stats(self, origin='any', distroseries='any', days=None,
64 valid_days=(1,3,7)):67 valid_days=(1, 3, 7)):
65 if self._fake_settings.get_setting('review_stats_error'):68 if self._fake_settings.get_setting('review_stats_error'):
66 raise APIError(self._exception_msg)69 raise APIError(self._exception_msg)
67 70
68 if self._fake_settings.get_setting('packages_returned') > 15:71 if self._fake_settings.get_setting('packages_returned') > 15:
69 quantity = 1572 quantity = 15
70 else:73 else:
71 quantity = self._fake_settings.get_setting('packages_returned')74 quantity = self._fake_settings.get_setting('packages_returned')
72 75
73 stats = []76 stats = []
74 77
75 for i in range (0, quantity):78 for i in range(0, quantity):
76 s = {'app_name':'', 79 s = {'app_name': '',
77 'package_name':self._PACKAGE_NAMES[i], 80 'package_name': self._PACKAGE_NAMES[i],
78 'ratings_total': str(random.randrange(1,200)),81 'ratings_total': str(random.randrange(1, 200)),
79 'ratings_average': str(random.randrange(0,5))82 'ratings_average': str(random.randrange(0, 5))
80 }83 }
81 stats.append(s)84 stats.append(s)
82 85
83 return json.dumps(stats)86 return json.dumps(stats)
8487
85 @validate_pattern('language', r'\w+', required=False)88 @validate_pattern('language', r'\w+', required=False)
@@ -94,7 +97,7 @@
94 @network_delay97 @network_delay
95 def get_reviews(self, packagename, language='any', origin='any',98 def get_reviews(self, packagename, language='any', origin='any',
96 distroseries='any', version='any', appname='', page=1, sort='helpful'):99 distroseries='any', version='any', appname='', page=1, sort='helpful'):
97 100
98 # work out how many reviews to return for pagination101 # work out how many reviews to return for pagination
99 if page <= self._fake_settings.get_setting('review_pages'):102 if page <= self._fake_settings.get_setting('review_pages'):
100 num_reviews = 10103 num_reviews = 10
@@ -102,10 +105,10 @@
102 num_reviews = self._fake_settings.get_setting('reviews_returned')105 num_reviews = self._fake_settings.get_setting('reviews_returned')
103 else:106 else:
104 num_reviews = 0107 num_reviews = 0
105 108
106 if self._fake_settings.get_setting('get_reviews_error'):109 if self._fake_settings.get_setting('get_reviews_error'):
107 raise APIError(self._exception_msg)110 raise APIError(self._exception_msg)
108 111
109 reviews = self._make_fake_reviews(packagename, num_reviews)112 reviews = self._make_fake_reviews(packagename, num_reviews)
110 return json.dumps(reviews)113 return json.dumps(reviews)
111114
@@ -124,9 +127,11 @@
124 def submit_review(self, review):127 def submit_review(self, review):
125 if self._fake_settings.get_setting('submit_review_error'):128 if self._fake_settings.get_setting('submit_review_error'):
126 raise APIError(self._exception_msg)129 raise APIError(self._exception_msg)
127 130
128 user = self._fake_settings.get_setting('reviewer_username') or random.choice(self._USERS)131 user = self._fake_settings.get_setting(
129 review_id = self._fake_settings.get_setting('submit_review_id') or random.randint(1,10000)132 'reviewer_username') or random.choice(self._USERS)
133 review_id = self._fake_settings.get_setting(
134 'submit_review_id') or random.randint(1, 10000)
130 r = {135 r = {
131 "origin": review.origin,136 "origin": review.origin,
132 "rating": review.rating,137 "rating": review.rating,
@@ -156,13 +161,15 @@
156 def flag_review(self, review_id, reason, text):161 def flag_review(self, review_id, reason, text):
157 if self._fake_settings.get_setting('flag_review_error'):162 if self._fake_settings.get_setting('flag_review_error'):
158 raise APIError(self._exception_msg)163 raise APIError(self._exception_msg)
159 164
160 mod_id = random.randint(1,500)165 mod_id = random.randint(1, 500)
161 pkg = self._fake_settings.get_setting('flag_package_name') or random.choice(self._PACKAGE_NAMES)166 pkg = self._fake_settings.get_setting(
162 username = self._fake_settings.get_setting('flagger_username') or random.choice(self._USERS)167 'flag_package_name') or random.choice(self._PACKAGE_NAMES)
168 username = self._fake_settings.get_setting(
169 'flagger_username') or random.choice(self._USERS)
163170
164 f = {171 f = {
165 "user_id": random.randint(1,500),172 "user_id": random.randint(1, 500),
166 "description": text,173 "description": text,
167 "review_moderation_id": mod_id,174 "review_moderation_id": mod_id,
168 "_user_cache": self._make_user_cache(username),175 "_user_cache": self._make_user_cache(username),
@@ -170,7 +177,7 @@
170 "_review_moderation_cache": {177 "_review_moderation_cache": {
171 "status": 0,178 "status": 0,
172 "review_id": review_id,179 "review_id": review_id,
173 "_review_cache": self._make_fake_reviews(packagename=pkg, 180 "_review_cache": self._make_fake_reviews(packagename=pkg,
174 single_id=review_id),181 single_id=review_id),
175 "moderation_text": text,182 "moderation_text": text,
176 "date_moderated": None,183 "date_moderated": None,
@@ -191,7 +198,8 @@
191 def submit_usefulness(self, review_id, useful):198 def submit_usefulness(self, review_id, useful):
192 if self._fake_settings.get_setting('submit_usefulness_error'):199 if self._fake_settings.get_setting('submit_usefulness_error'):
193 raise APIError(self._exception_msg)200 raise APIError(self._exception_msg)
194 return json.dumps(self._fake_settings.get_setting('usefulness_response_string'))201 return json.dumps(self._fake_settings.get_setting(
202 'usefulness_response_string'))
195203
196 @validate('review_id', int, required=False)204 @validate('review_id', int, required=False)
197 @validate_pattern('username', r'[^\n]+', required=False)205 @validate_pattern('username', r'[^\n]+', required=False)
@@ -200,24 +208,24 @@
200 def get_usefulness(self, review_id=None, username=None):208 def get_usefulness(self, review_id=None, username=None):
201 if not username and not review_id:209 if not username and not review_id:
202 return None210 return None
203 211
204 if self._fake_settings.get_setting('get_usefulness_error'):212 if self._fake_settings.get_setting('get_usefulness_error'):
205 raise APIError(self._exception_msg)213 raise APIError(self._exception_msg)
206 214
207 #just return a single fake item if the review_id was supplied215 #just return a single fake item if the review_id was supplied
208 if review_id:216 if review_id:
209 if username:217 if username:
210 response_user = username218 response_user = username
211 else:219 else:
212 response_user = random.choice(self._USERS)220 response_user = random.choice(self._USERS)
213 221
214 response = {222 response = {
215 'username':response_user,223 'username': response_user,
216 'useful':random.choice(['True','False']),224 'useful': random.choice(['True', 'False']),
217 'review_id':review_id225 'review_id': review_id
218 }226 }
219 return json.dumps([response])227 return json.dumps([response])
220 228
221 #set up review ids to honour requested and also add randoms229 #set up review ids to honour requested and also add randoms
222 quantity = self._fake_settings.get_setting('votes_returned')230 quantity = self._fake_settings.get_setting('votes_returned')
223 id_list = self._fake_settings.get_setting('required_review_ids')231 id_list = self._fake_settings.get_setting('required_review_ids')
@@ -228,23 +236,23 @@
228 rand_id_start = 0236 rand_id_start = 0
229 else:237 else:
230 rand_id_start = max(id_list)238 rand_id_start = max(id_list)
231 239
232 votes = []240 votes = []
233 241
234 for i in range(0, quantity):242 for i in range(0, quantity):
235 #assign review ids requested if any still exist243 #assign review ids requested if any still exist
236 try:244 try:
237 id = id_list[i]245 id = id_list[i]
238 except IndexError:246 except IndexError:
239 id = random.randint(rand_id_start,10000)247 id = random.randint(rand_id_start, 10000)
240 248
241 u = {249 u = {
242 'username': username, 250 'username': username,
243 'useful': random.choice(['True','False']), 251 'useful': random.choice(['True', 'False']),
244 'review_id' : id252 'review_id': id
245 }253 }
246 votes.append(u)254 votes.append(u)
247 255
248 return json.dumps(votes)256 return json.dumps(votes)
249257
250 @validate('review_id', int)258 @validate('review_id', int)
@@ -261,29 +269,28 @@
261 def modify_review(self, review_id, rating, summary, review_text):269 def modify_review(self, review_id, rating, summary, review_text):
262 """Modify an existing review"""270 """Modify an existing review"""
263 return json.dumps(self._make_fake_reviews()[0])271 return json.dumps(self._make_fake_reviews()[0])
264 272
265 273 def _make_fake_reviews(self, packagename='compiz-core',
266 def _make_fake_reviews(self, packagename='compiz-core',
267 quantity=1, single_id=None):274 quantity=1, single_id=None):
268 """Make and return a requested quantity of fake reviews"""275 """Make and return a requested quantity of fake reviews"""
269 276
270 reviews = []277 reviews = []
271 278
272 for i in range(0, quantity):279 for i in range(0, quantity):
273 if quantity == 1 and single_id:280 if quantity == 1 and single_id:
274 id = single_id281 id = single_id
275 else:282 else:
276 id = i*3283 id = i * 3
277 284
278 r = {285 r = {
279 "origin": "ubuntu",286 "origin": "ubuntu",
280 "rating": random.randint(1,5),287 "rating": random.randint(1, 5),
281 "hide": False,288 "hide": False,
282 "app_name": "",289 "app_name": "",
283 "language": "en",290 "language": "en",
284 "reviewer_username": random.choice(self._USERS),291 "reviewer_username": random.choice(self._USERS),
285 "usefulness_total": random.randint(3,6),292 "usefulness_total": random.randint(3, 6),
286 "usefulness_favorable": random.randint(1,3),293 "usefulness_favorable": random.randint(1, 3),
287 "review_text": random.choice(self._TEXT),294 "review_text": random.choice(self._TEXT),
288 "date_deleted": None,295 "date_deleted": None,
289 "summary": random.choice(self._SUMMARIES),296 "summary": random.choice(self._SUMMARIES),
@@ -295,13 +302,13 @@
295 "distroseries": "natty"302 "distroseries": "natty"
296 }303 }
297 reviews.append(r)304 reviews.append(r)
298 305
299 #get_review wants a dict but get_reviews wants a list of dicts306 #get_review wants a dict but get_reviews wants a list of dicts
300 if single_id:307 if single_id:
301 return r308 return r
302 else:309 else:
303 return reviews310 return reviews
304 311
305 def _make_user_cache(self, username):312 def _make_user_cache(self, username):
306 return {313 return {
307 "username": username,314 "username": username,
@@ -313,7 +320,6 @@
313 "is_staff": False,320 "is_staff": False,
314 "last_login": time.strftime("%Y-%m-%d %H:%M:%S"),321 "last_login": time.strftime("%Y-%m-%d %H:%M:%S"),
315 "password": "!",322 "password": "!",
316 "id": random.randint(1,500),323 "id": random.randint(1, 500),
317 "date_joined": time.strftime("%Y-%m-%d %H:%M:%S")324 "date_joined": time.strftime("%Y-%m-%d %H:%M:%S")
318 }325 }
319
320326
=== modified file 'softwarecenter/backend/piston/rnrclient_pristine.py'
--- softwarecenter/backend/piston/rnrclient_pristine.py 2011-08-15 11:55:13 +0000
+++ softwarecenter/backend/piston/rnrclient_pristine.py 2012-03-16 20:20:25 +0000
@@ -29,6 +29,7 @@
29 'rating', 'language', 'origin', 'distroseries', 'arch_tag')29 'rating', 'language', 'origin', 'distroseries', 'arch_tag')
30 app_name = ''30 app_name = ''
3131
32
32class ReviewsStats(PistonResponseObject):33class ReviewsStats(PistonResponseObject):
33 """A ratings summary for a package/app.34 """A ratings summary for a package/app.
3435
@@ -82,7 +83,7 @@
82 @validate('days', int, required=False)83 @validate('days', int, required=False)
83 @returns_list_of(ReviewsStats)84 @returns_list_of(ReviewsStats)
84 def review_stats(self, origin='any', distroseries='any', days=None,85 def review_stats(self, origin='any', distroseries='any', days=None,
85 valid_days=(1,3,7)):86 valid_days=(1, 3, 7)):
86 """Fetch ratings for a particular distroseries"""87 """Fetch ratings for a particular distroseries"""
87 url = 'review-stats/{0}/{1}/'.format(origin, distroseries)88 url = 'review-stats/{0}/{1}/'.format(origin, distroseries)
88 if days is not None:89 if days is not None:
@@ -115,7 +116,7 @@
115 appname = quote_plus(';' + appname)116 appname = quote_plus(';' + appname)
116 return self._get('reviews/filter/%s/%s/%s/%s/%s%s/page/%s/%s/' % (117 return self._get('reviews/filter/%s/%s/%s/%s/%s%s/page/%s/%s/' % (
117 language, origin, distroseries, version, packagename,118 language, origin, distroseries, version, packagename,
118 appname, page, sort), 119 appname, page, sort),
119 scheme=PUBLIC_API_SCHEME)120 scheme=PUBLIC_API_SCHEME)
120121
121 @validate('review_id', int)122 @validate('review_id', int)
@@ -183,6 +184,10 @@
183 @returns(ReviewDetails)184 @returns(ReviewDetails)
184 def modify_review(self, review_id, rating, summary, review_text):185 def modify_review(self, review_id, rating, summary, review_text):
185 """Modify an existing review"""186 """Modify an existing review"""
186 data = {'rating':rating, 'summary':summary, 'review_text':review_text}187 data = {
188 'rating': rating,
189 'summary': summary,
190 'review_text': review_text
191 }
187 return self._put('/reviews/modify/%s/' % review_id, data=data,192 return self._put('/reviews/modify/%s/' % review_id, data=data,
188 scheme=AUTHENTICATED_API_SCHEME)193 scheme=AUTHENTICATED_API_SCHEME)
189194
=== modified file 'softwarecenter/backend/piston/scaclient.py'
--- softwarecenter/backend/piston/scaclient.py 2012-01-03 16:48:01 +0000
+++ softwarecenter/backend/piston/scaclient.py 2012-03-16 20:20:25 +0000
@@ -14,7 +14,7 @@
14# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA14# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15#15#
16#16#
17# taken from lp:~canonical-ca-hackers/software-center/scaclient 17# taken from lp:~canonical-ca-hackers/software-center/scaclient
18# and put into scaclient_pristine.py18# and put into scaclient_pristine.py
1919
20import logging20import logging
@@ -31,26 +31,27 @@
31from softwarecenter.enums import BUY_SOMETHING_HOST31from softwarecenter.enums import BUY_SOMETHING_HOST
32try:32try:
33 from scaclient_pristine import SoftwareCenterAgentAPI33 from scaclient_pristine import SoftwareCenterAgentAPI
34 SoftwareCenterAgentAPI.default_service_root = BUY_SOMETHING_HOST+"/api/2.0"34 SoftwareCenterAgentAPI.default_service_root = \
35 BUY_SOMETHING_HOST + "/api/2.0"
35except:36except:
36 logging.exception("need python-piston-mini client")37 logging.exception("need python-piston-mini client")
37 sys.exit(1)38 sys.exit(1)
3839
3940
40
41if __name__ == "__main__":41if __name__ == "__main__":
4242
43 sca = SoftwareCenterAgentAPI()43 sca = SoftwareCenterAgentAPI()
44 44
45 lang = "en"45 lang = "en"
46 series = "natty"46 series = "natty"
47 arch = "i386"47 arch = "i386"
4848
49 available = sca.available_apps(lang=lang, series=series, arch=arch)49 available = sca.available_apps(lang=lang, series=series, arch=arch)
50 print(available)50 print(available)
51 51
52 available_for_qa = sca.available_apps_qa(lang=lang, series=series, arch=arch)52 available_for_qa = sca.available_apps_qa(lang=lang, series=series,
53 arch=arch)
53 print(available_for_qa)54 print(available_for_qa)
54 55
55 for_me = sca.subscriptions_for_me()56 for_me = sca.subscriptions_for_me()
56 print(for_me)57 print(for_me)
5758
=== modified file 'softwarecenter/backend/piston/scaclient_pristine.py'
--- softwarecenter/backend/piston/scaclient_pristine.py 2012-01-03 16:03:59 +0000
+++ softwarecenter/backend/piston/scaclient_pristine.py 2012-03-16 20:20:25 +0000
@@ -8,6 +8,7 @@
8PUBLIC_API_SCHEME = 'http'8PUBLIC_API_SCHEME = 'http'
9AUTHENTICATED_API_SCHEME = 'https'9AUTHENTICATED_API_SCHEME = 'https'
1010
11
11class SoftwareCenterAgentAPI(PistonAPI):12class SoftwareCenterAgentAPI(PistonAPI):
12 default_service_root = 'http://localhost:8000/api/2.0'13 default_service_root = 'http://localhost:8000/api/2.0'
1314
1415
=== modified file 'softwarecenter/backend/piston/sreclient_pristine.py'
--- softwarecenter/backend/piston/sreclient_pristine.py 2012-02-29 20:56:24 +0000
+++ softwarecenter/backend/piston/sreclient_pristine.py 2012-03-16 20:20:25 +0000
@@ -11,6 +11,7 @@
11PUBLIC_API_SCHEME = 'http'11PUBLIC_API_SCHEME = 'http'
12AUTHENTICATED_API_SCHEME = 'https'12AUTHENTICATED_API_SCHEME = 'https'
1313
14
14class SoftwareCenterRecommenderAPI(PistonAPI):15class SoftwareCenterRecommenderAPI(PistonAPI):
15 default_service_root = 'http://localhost:8000/api/1.0'16 default_service_root = 'http://localhost:8000/api/1.0'
1617
1718
=== modified file 'softwarecenter/backend/piston/sso_helper.py'
--- softwarecenter/backend/piston/sso_helper.py 2012-01-13 16:40:48 +0000
+++ softwarecenter/backend/piston/sso_helper.py 2012-03-16 20:20:25 +0000
@@ -28,13 +28,12 @@
28from softwarecenter.utils import clear_token_from_ubuntu_sso28from softwarecenter.utils import clear_token_from_ubuntu_sso
2929
3030
31
32class SSOLoginHelper(object):31class SSOLoginHelper(object):
33 def __init__(self, xid=0):32 def __init__(self, xid=0):
34 self.oauth = None33 self.oauth = None
35 self.xid = xid34 self.xid = xid
36 self.loop = GObject.MainLoop(GObject.main_context_default())35 self.loop = GObject.MainLoop(GObject.main_context_default())
37 36
38 def _login_successful(self, sso_backend, oauth_result):37 def _login_successful(self, sso_backend, oauth_result):
39 self.oauth = oauth_result38 self.oauth = oauth_result
40 # FIXME: actually verify the token against ubuntu SSO39 # FIXME: actually verify the token against ubuntu SSO
@@ -44,6 +43,7 @@
44 def _whoami_done(sso, me):43 def _whoami_done(sso, me):
45 self._whoami = me44 self._whoami = me
46 self.loop.quit()45 self.loop.quit()
46
47 def _whoami_error(sso, err):47 def _whoami_error(sso, err):
48 #print "ERRR", err48 #print "ERRR", err
49 self.loop.quit()49 self.loop.quit()
@@ -74,7 +74,7 @@
74 def get_oauth_token_sync(self):74 def get_oauth_token_sync(self):
75 self.oauth = None75 self.oauth = None
76 sso = get_sso_backend(76 sso = get_sso_backend(
77 self.xid, 77 self.xid,
78 SOFTWARE_CENTER_NAME_KEYRING,78 SOFTWARE_CENTER_NAME_KEYRING,
79 _(SOFTWARE_CENTER_SSO_DESCRIPTION))79 _(SOFTWARE_CENTER_SSO_DESCRIPTION))
80 sso.connect("login-successful", self._login_successful)80 sso.connect("login-successful", self._login_successful)
8181
=== modified file 'test/test_pep8.py'
--- test/test_pep8.py 2012-03-16 19:16:21 +0000
+++ test/test_pep8.py 2012-03-16 20:20:25 +0000
@@ -9,6 +9,8 @@
9# Only test these two packages for now:9# Only test these two packages for now:
10import softwarecenter.backend.reviews10import softwarecenter.backend.reviews
11import softwarecenter.backend.oneconfhandler11import softwarecenter.backend.oneconfhandler
12import softwarecenter.backend.piston
13import softwarecenter.backend.installbackend_impl
12import softwarecenter.db14import softwarecenter.db
13import softwarecenter.ui15import softwarecenter.ui
14import softwarecenter.distro16import softwarecenter.distro
@@ -16,6 +18,8 @@
16class PackagePep8TestCase(unittest.TestCase):18class PackagePep8TestCase(unittest.TestCase):
17 maxDiff = None19 maxDiff = None
18 packages = [softwarecenter.ui,20 packages = [softwarecenter.ui,
21 softwarecenter.backend.piston,
22 softwarecenter.backend.installbackend_impl,
19 softwarecenter.backend.reviews,23 softwarecenter.backend.reviews,
20 softwarecenter.backend.oneconfhandler,24 softwarecenter.backend.oneconfhandler,
21 softwarecenter.db,25 softwarecenter.db,