~elachuni/software-center/test_downloader_fix

« back to all changes in this revision

Viewing changes to utils/piston-helpers/piston_get_scagent_available_apps.py

  • Committer: Michael Vogt
  • Date: 2012-01-06 09:10:27 UTC
  • mfrom: (2635.2.5 software-center)
  • Revision ID: michael.vogt@ubuntu.com-20120106091027-8b6kq5a8h4yp8evb
lp:~gary-lasker/software-center/recommends-tweaks: merged

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/python
 
2
 
 
3
import argparse
 
4
import logging
 
5
import os
 
6
import pickle
 
7
import sys
 
8
 
 
9
import piston_mini_client.auth
 
10
 
 
11
from softwarecenter.paths import SOFTWARE_CENTER_CACHE_DIR
 
12
from softwarecenter.backend.piston.scaclient import SoftwareCenterAgentAPI
 
13
 
 
14
LOG = logging.getLogger(__name__)
 
15
 
 
16
from softwarecenter.backend.piston.sso_helper import SSOLoginHelper
 
17
 
 
18
if __name__ == "__main__":
 
19
    logging.basicConfig()
 
20
 
 
21
    # command line parser
 
22
    parser = argparse.ArgumentParser(description="Helper for software-center-agent")
 
23
    parser.add_argument("--debug", action="store_true", default=False,
 
24
                        help="enable debug output")
 
25
    parser.add_argument("--ignore-cache", action="store_true", default=False,
 
26
                        help="force ignore cache")
 
27
    parser.add_argument("--parent-xid", default=0,
 
28
                        help="xid of the parent window")
 
29
 
 
30
    subparser = parser.add_subparsers(title="Commands")
 
31
    # available_apps
 
32
    command = subparser.add_parser("available_apps")
 
33
    command.add_argument("lang")
 
34
    command.add_argument("series")
 
35
    command.add_argument("arch")
 
36
    command.set_defaults(command="available_apps")
 
37
 
 
38
    # available_apps_qa
 
39
    command = subparser.add_parser("available_apps_qa")
 
40
    command.add_argument("lang")
 
41
    command.add_argument("series")
 
42
    command.add_argument("arch")
 
43
    command.set_defaults(command="available_apps_qa")
 
44
    # subscriptions
 
45
    command = subparser.add_parser("subscriptions_for_me")
 
46
    command.set_defaults(command="subscriptions_for_me")
 
47
    # exhibits
 
48
    command = subparser.add_parser("exhibits")
 
49
    command.add_argument("lang")
 
50
    command.add_argument("series")
 
51
    command.set_defaults(command="exhibits")
 
52
 
 
53
    args = parser.parse_args()
 
54
 
 
55
    if args.debug:
 
56
        LOG.setLevel(logging.DEBUG)
 
57
 
 
58
    if args.ignore_cache:
 
59
        cachedir = None
 
60
    else:
 
61
        cachedir = os.path.join(SOFTWARE_CENTER_CACHE_DIR, "scaclient")
 
62
 
 
63
 
 
64
    # check if auth is required
 
65
    if args.command in ("available_apps_qa", "subscriptions_for_me"):
 
66
        helper = SSOLoginHelper(args.parent_xid)
 
67
        token = helper.get_oauth_token_and_verify_sync()
 
68
        # if we don't have a token, error here
 
69
        if not token:
 
70
            sys.stderr.write("ERROR: can not obtain a oauth token\n")
 
71
            sys.exit(1)
 
72
        
 
73
        auth = piston_mini_client.auth.OAuthAuthorizer(token["token"],
 
74
                                                       token["token_secret"],
 
75
                                                       token["consumer_key"],
 
76
                                                       token["consumer_secret"])
 
77
        scaclient = SoftwareCenterAgentAPI(cachedir=cachedir, auth=auth)
 
78
    else:
 
79
        scaclient = SoftwareCenterAgentAPI(cachedir=cachedir)
 
80
        
 
81
    piston_reply = None
 
82
 
 
83
    # common kwargs
 
84
    if args.command in ("available_apps", "available_apps_qa"):
 
85
        kwargs = {"lang": args.lang,
 
86
                  "series": args.series,
 
87
                  "arch": args.arch
 
88
                  }
 
89
 
 
90
    # handle the args
 
91
    if args.command == "available_apps":
 
92
        try:
 
93
            piston_reply = scaclient.available_apps(**kwargs)
 
94
        except:
 
95
            LOG.exception("available_apps")
 
96
            sys.exit(1)
 
97
 
 
98
    elif args.command == "available_apps_qa":
 
99
        try:
 
100
            piston_reply = scaclient.available_apps_qa(**kwargs)
 
101
        except:
 
102
            LOG.exception("available_apps_qa")
 
103
            sys.exit(1)
 
104
    elif args.command == "subscriptions_for_me":
 
105
        try:
 
106
            piston_reply = scaclient.subscriptions_for_me(complete_only=True)
 
107
            # the new piston API send the data in a nasty format, most
 
108
            # interessting stuff is in the "application" dict, move it
 
109
            # back int othe main object here so that the parser understands it
 
110
            for item in piston_reply:
 
111
                for k, v in item.application.iteritems():
 
112
                    setattr(item, k, v)
 
113
        except:
 
114
            LOG.exception("subscriptions_for_me")
 
115
            sys.exit(1)
 
116
    if args.command == "exhibits":
 
117
        try:
 
118
            piston_reply = scaclient.exhibits(lang=args.lang, series=args.series)
 
119
        except:
 
120
            LOG.exception("exhibits")
 
121
            sys.exit(1)
 
122
 
 
123
    if args.debug:
 
124
        LOG.debug("reply: %s" % piston_reply)
 
125
        for item in piston_reply:
 
126
            for var in vars(item):
 
127
                print "%s: %s" % (var, getattr(item, var))
 
128
            print "\n\n"
 
129
 
 
130
 
 
131
    # print to stdout where its consumed by the parent
 
132
    if piston_reply is not None:
 
133
        try:
 
134
            print pickle.dumps(piston_reply)
 
135
        except IOError:
 
136
            # this can happen if the parent gets killed, no need to trigger
 
137
            # apport for this
 
138
            pass