27
28
from xml.sax.saxutils import escape as xml_escape
28
29
from xml.sax.saxutils import unescape as xml_unescape
30
from softwarecenter.enums import SortMethods
31
from softwarecenter.enums import (
32
SortMethods, NonAppVisibility)
33
from softwarecenter.backend.recommends import RecommenderAgent
34
from softwarecenter.db.appfilter import AppFilter
35
from softwarecenter.db.enquire import AppEnquire
36
from softwarecenter.db.utils import get_query_for_pkgnames
37
from softwarecenter.paths import APP_INSTALL_PATH
39
from gettext import gettext as _
32
41
# not possible not use local logger
33
42
LOG = logging.getLogger(__name__)
55
64
sorted_cats.append(cat)
60
class Category(object):
68
def get_query_for_category(db, untranslated_category_name):
69
cat_parser = CategoriesParser(db)
70
categories = cat_parser.parse_applications_menu(APP_INSTALL_PATH)
72
if untranslated_category_name == c.untranslated_name:
78
class Category(GObject.GObject):
61
79
"""represents a menu category"""
62
80
def __init__(self, untranslated_name, name, iconname, query,
63
81
only_unallocated=True, dont_display=False, flags=[],
64
82
subcategories=[], sortmode=SortMethods.BY_ALPHABET,
84
GObject.GObject.__init__(self)
66
85
if type(name) == str:
67
86
self.name = unicode(name, 'utf8').encode('utf8')
83
102
def is_forced_sort_mode(self):
84
103
return (self.sortmode != SortMethods.BY_ALPHABET)
105
def get_documents(self, db):
106
""" return the database docids for the given category """
107
enq = AppEnquire(db._aptcache, db)
108
app_filter = AppFilter(db, db._aptcache)
109
if "available-only" in self.flags:
110
app_filter.set_available_only(True)
111
if "not-installed-only" in self.flags:
112
app_filter.set_not_installed_only(True)
113
enq.set_query(self.query,
114
limit=self.item_limit,
116
sortmode=self.sortmode,
117
nonapps_visible=NonAppVisibility.ALWAYS_VISIBLE,
118
nonblocking_load=False)
119
return enq.get_documents()
86
121
def __str__(self):
87
122
return "<Category: name='%s', sortmode='%s', "\
88
123
"item_limit='%s'>" % (
89
124
self.name, self.sortmode, self.item_limit)
127
class RecommendedForYouCategory(Category):
130
"needs-refresh" : (GObject.SIGNAL_RUN_LAST,
134
"recommender-agent-error" : (GObject.SIGNAL_RUN_LAST,
136
(GObject.TYPE_STRING,),
141
super(RecommendedForYouCategory, self).__init__(
142
u"Recommended for You", _("Recommended for You"), None,
143
xapian.Query(),flags=['available-only', 'not-installed-only'],
145
self.recommender_agent = RecommenderAgent()
146
self.recommender_agent.connect(
147
"recommend-top", self._recommend_top_result)
148
self.recommender_agent.connect(
149
"error", self._recommender_agent_error)
150
self.recommender_agent.query_recommend_top()
152
def _recommend_top_result(self, recommender_agent, result_list):
154
for item in result_list['recommendations']:
155
pkgs.append(item['package_name'])
156
self.query = get_query_for_pkgnames(pkgs)
157
self.emit("needs-refresh")
159
def _recommender_agent_error(self, recommender_agent, msg):
160
LOG.warn("Error while accessing the recommender service: %s"
162
self.emit("recommender-agent-error", msg)
91
164
class CategoriesParser(object):
93
166
Parser that is able to read the categories from a menu file
345
419
'Video': 'Sound & Video',
346
420
'Settings': 'Themes & Tweaks',
347
421
'Accessibility': 'Universal Access',
348
'Development': 'Developer Tools',}
422
'Development': 'Developer Tools',
423
'X-Publishing': 'Books & Magazines',
350
426
category_subcat = {
351
427
'BoardGame': 'Games;Board Games',