25
25
from softwarecenter.ui.gtk3.em import StockEms
26
26
from softwarecenter.ui.gtk3.widgets.containers import (FramedHeaderBox,
28
28
from softwarecenter.ui.gtk3.utils import get_parent_xid
29
29
from softwarecenter.db.categories import (RecommendedForYouCategory,
30
30
AppRecommendationsCategory)
31
from softwarecenter.backend import get_install_backend
31
32
from softwarecenter.backend.recagent import RecommenderAgent
32
33
from softwarecenter.backend.login_sso import get_sso_backend
33
34
from softwarecenter.backend.ubuntusso import get_ubuntu_sso_backend
35
36
LOBBY_RECOMMENDATIONS_CAROUSEL_LIMIT,
36
37
DETAILS_RECOMMENDATIONS_CAROUSEL_LIMIT,
37
38
SOFTWARE_CENTER_NAME_KEYRING,
39
RecommenderFeedbackActions,
39
42
from softwarecenter.utils import utf8
40
43
from softwarecenter.netstatus import network_state_is_connected
57
def __init__(self, catview):
58
61
FramedHeaderBox.__init__(self)
59
# FIXME: we only need the catview for "add_titles_to_flowgrid"
60
# and "on_category_clicked" so we should be able to
61
# extract this to a "leaner" widget
62
self.catview = catview
64
"application-activated", self._on_application_activated)
65
62
self.recommender_agent = RecommenderAgent()
63
# keep track of applications that have been viewed via a
64
# recommendation so that we can detect when a recommended app
66
self.recommended_apps_viewed = set()
67
self.backend = get_install_backend()
68
self.backend.connect("transaction-started",
69
self._on_transaction_started)
70
self.backend.connect("transaction-finished",
71
self._on_transaction_finished)
67
def _on_application_activated(self, catview, app):
73
def _on_application_activated(self, tile, app):
68
74
self.emit("application-activated", app)
75
# we only track installed items if the user has opted-in to the
76
# recommendations service
77
if self.recommender_agent.is_opted_in():
78
self.recommended_apps_viewed.add(app.pkgname)
80
def _on_transaction_started(self, backend, pkgname, appname, trans_id,
82
if (trans_type != TransactionTypes.INSTALL and
83
pkgname in self.recommended_apps_viewed):
84
# if the transaction is not an installation we don't want to
85
# track it as a recommended item
86
self.recommended_apps_viewed.remove(pkgname)
88
def _on_transaction_finished(self, backend, result):
89
if result.pkgname in self.recommended_apps_viewed:
90
self.recommended_apps_viewed.remove(result.pkgname)
91
if network_state_is_connected():
92
# no need to monitor for an error, etc., for this
93
self.recommender_agent.post_implicit_feedback(
95
RecommenderFeedbackActions.INSTALLED)
70
97
def _on_recommender_agent_error(self, agent, msg):
71
98
LOG.warn("Error while accessing the recommender agent: %s" % msg)
81
108
Panel for use in the category view that displays recommended apps for
82
109
the given category
84
def __init__(self, catview, subcategory):
85
RecommendationsPanel.__init__(self, catview)
113
"more-button-clicked": (GObject.SignalFlags.RUN_LAST,
115
(GObject.TYPE_PYOBJECT, ),
119
def __init__(self, db, properties_helper, subcategory):
120
RecommendationsPanel.__init__(self)
122
self.properties_helper = properties_helper
86
123
self.subcategory = subcategory
87
124
if self.subcategory:
88
125
self.set_header_label(GObject.markup_escape_text(utf8(
98
135
if self.recommended_for_you_content:
99
136
self.recommended_for_you_content.destroy()
100
137
# add the new stuff
101
self.recommended_for_you_content = FlowableGrid()
138
self.recommended_for_you_content = TileGrid()
139
self.recommended_for_you_content.connect(
140
"application-activated", self._on_application_activated)
102
141
self.add(self.recommended_for_you_content)
103
142
self.spinner_notebook.show_spinner(_(u"Receiving recommendations…"))
104
143
# get the recommendations from the recommender agent
113
152
def _on_recommended_for_you_agent_refresh(self, cat):
114
153
self.header_implements_more_button()
115
docs = cat.get_documents(self.catview.db)
154
self.more.connect("clicked",
155
self._on_more_button_clicked,
156
self.recommended_for_you_cat)
157
docs = cat.get_documents(self.db)
116
158
# display the recommendedations
117
159
if len(docs) > 0:
118
self.catview._add_tiles_to_flowgrid(
119
docs, self.recommended_for_you_content,
120
LOBBY_RECOMMENDATIONS_CAROUSEL_LIMIT)
160
self.recommended_for_you_content.add_tiles(
161
self.properties_helper,
163
LOBBY_RECOMMENDATIONS_CAROUSEL_LIMIT)
121
164
self.recommended_for_you_content.show_all()
122
165
self.spinner_notebook.hide_spinner()
123
self.more.connect('clicked',
124
self.catview.on_category_clicked,
126
166
self.header.queue_draw()
129
169
# hide the panel if we have no recommendations to show
172
def _on_more_button_clicked(self, btn, category):
173
self.emit("more-button-clicked", category)
133
176
class RecommendationsPanelLobby(RecommendationsPanelCategory):
155
198
NO_NETWORK_RECOMMENDATIONS_TEXT = _(u"Recommendations will appear "
156
199
"when next online.")
158
def __init__(self, catview):
159
RecommendationsPanel.__init__(self, catview)
201
def __init__(self, db, properties_helper):
202
RecommendationsPanel.__init__(self)
204
self.properties_helper = properties_helper
160
205
self.subcategory = None
161
206
self.set_header_label(_(u"Recommended For You"))
162
207
self.recommended_for_you_content = None
325
370
self._on_profile_submitted)
326
371
self.recommender_agent.connect("error",
327
372
self._on_profile_submitted_error)
328
self.recommender_agent.post_submit_profile(self.catview.db)
373
self.recommender_agent.post_submit_profile(self.db)
330
375
def _on_profile_submitted(self, agent, profile):
331
376
# after the user profile data has been uploaded, make the request
362
407
Panel for use in the details view to display recommendations for a given
365
def __init__(self, catview):
366
RecommendationsPanel.__init__(self, catview)
410
def __init__(self, db, properties_helper):
411
RecommendationsPanel.__init__(self)
413
self.properties_helper = properties_helper
367
414
self.set_header_label(_(u"People Also Installed"))
368
self.app_recommendations_content = FlowableGrid()
415
self.app_recommendations_content = TileGrid()
416
self.app_recommendations_content.connect(
417
"application-activated", self._on_application_activated)
369
418
self.add(self.app_recommendations_content)
371
420
def set_pkgname(self, pkgname):
385
434
self._on_recommender_agent_error)
387
436
def _on_app_recommendations_agent_refresh(self, cat):
388
docs = cat.get_documents(self.catview.db)
437
docs = cat.get_documents(self.db)
389
438
# display the recommendations
390
439
if len(docs) > 0:
391
self.catview._add_tiles_to_flowgrid(
392
docs, self.app_recommendations_content,
393
DETAILS_RECOMMENDATIONS_CAROUSEL_LIMIT)
440
self.app_recommendations_content.add_tiles(
441
self.properties_helper,
443
DETAILS_RECOMMENDATIONS_CAROUSEL_LIMIT)
395
445
self.spinner_notebook.hide_spinner()