source: lliurex-store/trunk/fuentes/lliurex-appstore.install/usr/bin/plugins/searchManager.py @ 3099

Last change on this file since 3099 was 3099, checked in by Juanma, 3 years ago

wip on plugin architecture

File size: 3.4 KB
Line 
1import locale
2
3class searchmanager:
4        def __init__(self):
5                self.locale=locale.getlocale()[0]
6                self.dbg=1
7                self.store=''
8                self.pluginInfo={'search':'*','list':'*','list_sections':'*'}
9                self.precision=50
10                self.applist=[]
11                self.progress=0
12        #def __init__
13
14        def __call__(self):
15                return (self.applist)
16
17        def set_debug(self,dbg='1'):
18                self.dbg=int(dbg)
19                self._debug ("Debug enabled")
20        #def set__debug
21
22        def _debug(self,msg=''):
23                if self.dbg==1:
24                        print ('DEBUG Search: '+msg)
25        #def _debug
26
27        def register(self):
28                return(self.pluginInfo)
29
30        def execute_action(self,appstreamStore,action,tokens):
31                self.store=appstreamStore
32                if action=='list':
33                        self._list_category(tokens)
34                if action=='list_sections':
35                        self._list_sections()
36                if action=='search':
37                        self._search_app(tokens)
38                self.progress=100
39                return(self.applist)
40
41        def set_precision(self,precision):
42                self.precision=precision
43
44        def _search_app(self,tokens):
45                self._debug("Searching app "+str(tokens))
46                applist=[]
47                app=None
48                if len(tokens)==1:
49                        app=self._app_exists(tokens[0])
50
51                if app:
52                        applist.append(app)
53                        self._debug("App direct match found: "+app.get_id())
54                else:
55                        for app in self._get_apps_by_match(tokens):
56                                applist.append(app)
57                self.applist=applist
58                return(applist)
59
60        def _list_sections(self):
61                applist=[]
62                catDict={}
63                for app in self.store.get_apps():
64                        for cat in app.get_categories():
65                                if cat not in catDict.keys():
66                                        catDict[cat]=1
67                                else:
68                                        catDict[cat]=catDict[cat]+1
69                for section in catDict:
70                        applist.append({section:catDict[section]})
71                self.applist=applist
72                return(applist)
73
74        def _list_category(self,tokens=[]):
75                applist=[]
76                self._debug("tokens: "+str(tokens))
77                if len(tokens)>=1:
78                        self._debug("Searching category "+str(tokens))
79                        setCategories=set(tokens)
80                        apps_in_store=self.store.get_apps()
81                        count_apps=len(apps_in_store)
82                        self.progress=0
83                        inc=100/count_apps
84                        for app in apps_in_store:
85                                self.progress=self.progress+inc
86                                if 'setCategories' in locals():
87                                        try:
88                                                appCategories=[cat.lower() for cat in app.get_categories()]
89                                        except:
90                                                pass
91                                        setAppCategories=set(appCategories)
92                                        if list(setCategories.intersection(setAppCategories)):
93                                                self._debug("Found "+app.get_id())
94                                                applist.append(app)
95                else:
96                        self._debug("Loading all apps in store")
97                        applist=self.store.get_apps()
98#                       for app in applist:
99#                               self._debug("Added "+app.get_id())
100                self.applist=applist
101                return(applist)
102
103        def _app_exists(self,appName):
104                self._debug("Trying direct match for "+appName)
105                app=None
106                #1.- Try exact match
107                app=self.store.get_app_by_id(appName)
108                if not app:
109                #2.- Try with exact match with .desktop
110                        app=self.store.get_app_by_id(appName+".desktop")
111                return(app)
112
113        def _get_apps_by_match(self,tokens):
114                        #Add items witch match >= self.precision
115                        applist=[]
116                        apps_in_store=self.store.get_apps()
117                        if apps_in_store:
118                                auxDict={}
119                                count_apps=len(apps_in_store)
120                                self.progress=0
121                                inc=100.0/count_apps
122                                for app in apps_in_store:
123                                        self.progress=self.progress+inc
124                                        if app not in self.applist:
125                                                for token in tokens:
126                                                        score=app.search_matches(token)
127                                                        if score>=self.precision:
128                                                                if score in auxDict:
129                                                                        auxDict[score].append(app)
130                                                                else:
131                                                                        auxDict[score]=[app]
132                                for match in sorted(auxDict):
133                                        for app in auxDict[match]:
134                                                self._debug("Adding app "+app.get_id() + " with score: "+str(match))
135                                                applist.insert(0,app)
136                        return(applist)
Note: See TracBrowser for help on using the repository browser.