source: lliurex-store/trunk/fuentes/python3-lliurex-store.install/usr/share/lliurexstore/plugins/searchManager.py @ 5215

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

Avoid reload the cache when installing/uninstalling apps

File size: 5.3 KB
Line 
1import locale
2import gi
3gi.require_version('AppStreamGlib', '1.0')
4from gi.repository import AppStreamGlib as appstream
5
6class searchmanager:
7        def __init__(self):
8                self.locale=locale.getlocale()[0]
9                self.dbg=0
10                self.store=''
11                self.pluginInfo={'search':'*','list':'*','list_sections':'*','info':'*'}
12                self.precision=10
13                self.applist=[]
14                self.progress=0
15                self.result={}
16                self.result['data']={}
17                self.result['status']={}
18        #def __init__
19
20        def __call__(self):
21                return (self.applist)
22
23        def set_debug(self,dbg='1'):
24                self.dbg=int(dbg)
25                self._debug ("Debug enabled")
26        #def set__debug
27
28        def _debug(self,msg=''):
29                if self.dbg==1:
30                        print ('DEBUG Search: '+msg)
31        #def _debug
32
33        def register(self):
34                return(self.pluginInfo)
35
36        def execute_action(self,appstreamStore,action,tokens,exact_match_for_search=False):
37                self.progress=0
38                if not type(tokens) is str:
39                        tokens=''
40                else:
41                        tokens=tokens.lower()
42                if len(tokens.split(' '))>1:
43                        if action=='search':
44                                self._debug("Tokenizing search items")
45                                tokens=appstream.utils_search_tokenize(tokens)
46                        else:
47                                tokens=tokens.split(' ')
48                else:
49                        if len(tokens)>=1:
50                                tokens=[tokens]
51                        else:
52                                tokens=[]
53       
54                self.store=appstreamStore
55                self.result['status']={'status':-1,'msg':''}
56                self.result['data']=[]
57                if action=='list':
58                        self._list_category(tokens)
59                if action=='list_sections':
60                        self._list_sections()
61                if (action=='search' or action=='info'):
62                        self._search_app(tokens,exact_match_for_search)
63                self.progress=100
64                return(self.result)
65
66        def _set_status(self,status,msg=''):
67                self.result['status']={'status':status,'msg':msg}
68
69        def set_precision(self,precision):
70                self.precision=precision
71
72        def _search_app(self,tokens,exact_match):
73                self._debug("Searching app "+str(tokens)+ " with exact_match="+str(exact_match))
74                applist=[]
75                app=None
76                if len(tokens)==1:
77                        app=self._app_exists(tokens[0])
78                if app:
79                        applist.append(app)
80                        self._debug("App direct match found: "+app.get_id())
81                if not exact_match:
82                        applist.extend(self._get_apps_by_match(tokens,applist))
83#               if len(applist):
84#                       self._set_status(0)
85#               else:
86                        applist.extend(self._get_app_by_pkgname(tokens,applist))
87                applist=set(applist)
88                if len(applist):
89                        self._set_status(0)
90                else:
91                        self._set_status(1)
92                self.result['data']=applist
93                return(applist)
94
95        def _list_sections(self):
96                applist=[]
97                catDict={}
98                for app in self.store.get_apps():
99                        for cat in app.get_categories():
100                                if cat not in catDict.keys():
101                                        catDict[cat]=1
102                                else:
103                                        catDict[cat]=catDict[cat]+1
104                for section in catDict:
105                        applist.append({str(section):catDict[section]})
106                self.result['data']=applist
107                if len(applist):
108                        self._set_status(0)
109                else:
110                        self._set_status(1)
111                return(applist)
112
113        def _list_category(self,tokens=[]):
114                applist=[]
115                self._debug("tokens: "+str(tokens))
116                if len(tokens)>=1:
117                        self._debug("Searching category "+str(tokens))
118                        setCategories=set(tokens)
119                        apps_in_store=self.store.get_apps()
120                        count_apps=len(apps_in_store)
121                        self.progress=0
122                        inc=100/count_apps
123                        for app in apps_in_store:
124                                self.progress=self.progress+inc
125                                if 'setCategories' in locals():
126                                        try:
127                                                appCategories=[cat.lower() for cat in app.get_categories()]
128                                        except:
129                                                pass
130                                        setAppCategories=set(appCategories)
131                                        if setCategories.issubset(setAppCategories):
132                                                self._debug("Found "+app.get_id())
133                                                applist.append(app)
134                else:
135                        self._debug("Loading all apps in store")
136                        applist=self.store.get_apps()
137#                       for app in applist:
138#                               self._debug("Added "+app.get_id())
139                self.result['data']=applist
140                if len(applist):
141                        self._set_status(0)
142                else:
143                        self._set_status(1)
144                return(applist)
145
146        def _app_exists(self,appName):
147                self._debug("Trying direct match for "+appName)
148                app=None
149                #1.- Try exact match
150                app=self.store.get_app_by_id(appName)
151                if not app:
152                #2.- Try exact match with zero-lliurex- for the zomandos
153                        app=self.store.get_app_by_id("zero-lliurex-"+appName)
154                        if not app:
155                #2.- Try exact match with .desktop
156                                app=self.store.get_app_by_id(appName+".desktop")
157                return(app)
158
159        def _get_apps_by_match(self,tokens,applist=[]):
160                #Add items witch match >= self.precision
161                if not applist:
162                        insertPosition=1
163                else:
164                        insertPosition=len(applist)+1
165                apps_in_store=self.store.get_apps()
166                if apps_in_store:
167                        auxDict={}
168                        count_apps=len(apps_in_store)
169                        self.progress=0
170                        inc=100.0/count_apps
171                        for app in apps_in_store:
172                                self.progress=self.progress+inc
173                                if app not in self.applist:
174                                        for token in tokens:
175                                                score=app.search_matches(token)
176                                                if score>=self.precision:
177                                                        if "appimage" in app.get_id().lower():
178                                                                score=1
179                                                        if score in auxDict:
180                                                                auxDict[score].append(app)
181                                                        else:
182                                                                auxDict[score]=[app]
183                        for match in sorted(auxDict):
184                                for app in auxDict[match]:
185                                        if app not in applist:
186                                                self._debug("Adding app "+app.get_id() + " with score: "+str(match))
187                                                applist.insert(1,app)
188                return(applist)
189
190        def _get_app_by_pkgname(self,tokens,applist=[]):
191                if not applist:
192                        insertPosition=1
193                else:
194                        insertPosition=len(applist)+1
195                apps_in_store=self.store.get_apps()
196                if apps_in_store:
197                        count_apps=len(apps_in_store)
198                        self.progress=0
199                        inc=100.0/count_apps
200                        for app in apps_in_store:
201                                self.progress=self.progress+inc
202                                if app not in self.applist:
203                                        for token in tokens:
204                                                if app.get_pkgname_default()==token:
205                                                        applist.insert(1,app)
206
207                return(applist)
Note: See TracBrowser for help on using the repository browser.