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

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

WIP on zmdManager

File size: 4.8 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):
37                if not type(tokens) is str:
38                        tokens=''
39                if len(tokens.split(' '))>1 or action=='list':
40                        self._debug("Tokenizing search items")
41                        tokens=appstream.utils_search_tokenize(tokens)
42                else:
43                        tokens=[tokens]
44                self.store=appstreamStore
45                self.result['status']={'status':-1,'msg':''}
46                self.result['data']=[]
47                if action=='list':
48                        self._list_category(tokens)
49                if action=='list_sections':
50                        self._list_sections()
51                if (action=='search' or action=='info'):
52                        self._search_app(tokens)
53                self.progress=100
54                return(self.result)
55
56        def _set_status(self,status,msg=''):
57                self.result['status']={'status':status,'msg':msg}
58
59        def set_precision(self,precision):
60                self.precision=precision
61
62        def _search_app(self,tokens):
63                self._debug("Searching app "+str(tokens))
64                applist=[]
65                app=None
66                if len(tokens)==1:
67                        app=self._app_exists(tokens[0])
68
69                if app:
70                        applist.append(app)
71                        self._debug("App direct match found: "+app.get_id())
72#               else:
73#               for app in self._get_apps_by_match(tokens):
74#                       applist.append(app)
75                applist=self._get_apps_by_match(tokens,applist)
76                if len(applist):
77                        self._set_status(0)
78                else:
79                        applist=self._get_app_by_pkgname(tokens)
80                        if len(applist):
81                                self._set_status(0)
82                        else:
83                                self._set_status(1)
84                self.result['data']=applist
85                return(applist)
86
87        def _list_sections(self):
88                applist=[]
89                catDict={}
90                for app in self.store.get_apps():
91                        for cat in app.get_categories():
92                                if cat not in catDict.keys():
93                                        catDict[cat]=1
94                                else:
95                                        catDict[cat]=catDict[cat]+1
96                for section in catDict:
97                        applist.append({str(section):catDict[section]})
98                self.result['data']=applist
99                if len(applist):
100                        self._set_status(0)
101                else:
102                        self._set_status(1)
103                return(applist)
104
105        def _list_category(self,tokens=[]):
106                applist=[]
107                self._debug("tokens: "+str(tokens))
108                if len(tokens)>=1:
109                        self._debug("Searching category "+str(tokens))
110                        setCategories=set(tokens)
111                        apps_in_store=self.store.get_apps()
112                        count_apps=len(apps_in_store)
113                        self.progress=0
114                        inc=100/count_apps
115                        for app in apps_in_store:
116                                self.progress=self.progress+inc
117                                if 'setCategories' in locals():
118                                        try:
119                                                appCategories=[cat.lower() for cat in app.get_categories()]
120                                        except:
121                                                pass
122                                        setAppCategories=set(appCategories)
123                                        if setCategories.issubset(setAppCategories):
124                                                self._debug("Found "+app.get_id())
125                                                applist.append(app)
126                else:
127                        self._debug("Loading all apps in store")
128                        applist=self.store.get_apps()
129#                       for app in applist:
130#                               self._debug("Added "+app.get_id())
131                self.result['data']=applist
132                if len(applist):
133                        self._set_status(0)
134                else:
135                        self._set_status(1)
136                return(applist)
137
138        def _app_exists(self,appName):
139                self._debug("Trying direct match for "+appName)
140                app=None
141                #1.- Try exact match
142                app=self.store.get_app_by_id(appName)
143                if not app:
144                #2.- Try exact match with org.lliurex
145                        app=self.store.get_app_by_id("org.lliurex."+appName)
146                        if not app:
147                #2.- Try exact match with .desktop
148                                app=self.store.get_app_by_id(appName+".desktop")
149                return(app)
150
151        def _get_apps_by_match(self,tokens,applist=[]):
152                #Add items witch match >= self.precision
153                apps_in_store=self.store.get_apps()
154                if apps_in_store:
155                        auxDict={}
156                        count_apps=len(apps_in_store)
157                        self.progress=0
158                        inc=100.0/count_apps
159                        for app in apps_in_store:
160                                self.progress=self.progress+inc
161                                if app not in self.applist:
162                                        for token in tokens:
163                                                score=app.search_matches(token)
164                                                if score>=self.precision:
165                                                        if score in auxDict:
166                                                                auxDict[score].append(app)
167                                                        else:
168                                                                auxDict[score]=[app]
169                        for match in sorted(auxDict):
170                                for app in auxDict[match]:
171                                        if app not in applist:
172                                                self._debug("Adding app "+app.get_id() + " with score: "+str(match))
173                                                applist.insert(1,app)
174                return(applist)
175
176        def _get_app_by_pkgname(self,tokens):
177                applist=[]             
178                apps_in_store=self.store.get_apps()
179                if apps_in_store:
180                        count_apps=len(apps_in_store)
181                        self.progress=0
182                        inc=100.0/count_apps
183                        for app in apps_in_store:
184                                self.progress=self.progress+inc
185                                if app not in self.applist:
186                                        for token in tokens:
187                                                if app.get_pkgname_default()==token:
188                                                        applist.append(app)
189
190                return(applist)
Note: See TracBrowser for help on using the repository browser.