diff options
author | Michael DeHaan <mdehaan@redhat.com> | 2009-03-05 17:59:10 -0500 |
---|---|---|
committer | Michael DeHaan <mdehaan@redhat.com> | 2009-03-05 17:59:10 -0500 |
commit | 1dee14556a2e8b5bb7046a56731490a95245b441 (patch) | |
tree | bd7f641dd2251396c1031f453ecf920f18e101b6 | |
parent | dbcfc5a2f0d191001cd8000a543e41eddefd20f7 (diff) | |
download | cobbler-1dee14556a2e8b5bb7046a56731490a95245b441.tar.gz cobbler-1dee14556a2e8b5bb7046a56731490a95245b441.tar.xz cobbler-1dee14556a2e8b5bb7046a56731490a95245b441.zip |
Add search to the webapp. Currently all areas are implemented on the backend though we need to tweak out the search forms to allow searching on simulatenous fields and prepopulate the options with fields folks will want to search against.
-rw-r--r-- | cobbler/api.py | 8 | ||||
-rw-r--r-- | cobbler/remote.py | 6 | ||||
-rw-r--r-- | cobbler/webui/CobblerWeb.py | 125 | ||||
-rw-r--r-- | setup.py | 1 | ||||
-rw-r--r-- | webui_templates/blank.tmpl | 6 | ||||
-rw-r--r-- | webui_templates/empty.tmpl | 4 | ||||
-rw-r--r-- | webui_templates/master.tmpl | 47 | ||||
-rw-r--r-- | webui_templates/paginate.tmpl | 3 | ||||
-rw-r--r-- | webui_templates/search.tmpl | 45 |
9 files changed, 219 insertions, 26 deletions
diff --git a/cobbler/api.py b/cobbler/api.py index 655bb413..ffc62644 100644 --- a/cobbler/api.py +++ b/cobbler/api.py @@ -22,6 +22,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA """ +import yaml import config import utils import action_sync @@ -48,7 +49,6 @@ import logging import time import random import os -import yaml import xmlrpclib import traceback @@ -209,14 +209,16 @@ class BootAPI: version_tuple -- something like [ 1, 3, 2 ] """ fd = open("/var/lib/cobbler/version") - data = yaml.load(fd.read()) + ydata = fd.read() fd.close() + data = yaml.load(ydata) if not extended: # for backwards compatibility and use with koan's comparisons elems = data["version_tuple"] + print elems return int(elems[0]) + 0.1*int(elems[1]) + 0.001*int(elems[2]) else: - return data + return data def clear(self): """ diff --git a/cobbler/remote.py b/cobbler/remote.py index 7d7c229b..d1935712 100644 --- a/cobbler/remote.py +++ b/cobbler/remote.py @@ -601,7 +601,11 @@ class CobblerXMLRPCInterface: def find_distro(self,criteria={},expand=False,token=None,**rest): self._log("find_distro", token=token) + # FIXME DEBUG + self._log(criteria) data = self.__find(self.api.find_distro,criteria,expand=expand,token=token) + # FIXME DEBUG + self._log(data) return data def find_profile(self,criteria={},expand=False,token=None,**rest): @@ -1566,7 +1570,7 @@ class CobblerXMLRPCInterface: class CobblerXMLRPCServer(SimpleXMLRPCServer.SimpleXMLRPCServer): def __init__(self, args): self.allow_reuse_address = True - SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(self,args) + SimpleXMLRPCServer.SimpleXMLRPCServer.__init__(self,args,allow_none=True) # ********************************************************************************* # ********************************************************************************* diff --git a/cobbler/webui/CobblerWeb.py b/cobbler/webui/CobblerWeb.py index 16cbffd1..b68eacbb 100644 --- a/cobbler/webui/CobblerWeb.py +++ b/cobbler/webui/CobblerWeb.py @@ -128,7 +128,7 @@ class CobblerWeb(object): }) def menu(self,**args): - return self.__render( 'blank.tmpl', { } ) + return self.__render( 'blank.tmpl', {} ) # ------------------------------------------------------------------------ # # Settings @@ -151,6 +151,85 @@ class CobblerWeb(object): # Distributions # ------------------------------------------------------------------------ # + def distro_menu(self,**spam): + return self.__render('blank.tmpl',{ 'more_blank' : 1}) + + def __search_execute(self,what,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None): + if not self.__xmlrpc_setup(): + return self.xmlrpc_auth_failure() + + criteria={} + if key1 is not None and key1 != "": + criteria[key1] = value1.replace('"','') + if key2 is not None and key2 != "": + criteria[key2] = value2.replace('"','') + if key3 is not None and key3 != "": + criteria[key3] = value3.replace('"','') + + params = {} + params['page'] = -1 + + results = [] + if what == "distro": + results = params['distros'] = self.remote.find_distro(criteria,True) + elif what == "profile": + results = params['profiles'] = self.remote.find_profile(criteria,True) + elif what == "system": + results = params['systems'] = self.remote.find_system(criteria,True) + elif what == "image": + results = params['images'] = self.remote.find_image(criteria,True) + elif what == "repo": + results = params['repos'] = self.remote.find_repo(criteria,True) + else: + raise "internal error, unknown search type" + + + if len(results) > 0: + return self.__render( "%s_list.tmpl" % what, params) + else: + return self.__render('empty.tmpl', { 'search' : 1 }) + + def distro_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest): + return self.__search_execute("distro",key1,value1,key2,value2,key3,value3) + def profile_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest): + return self.__search_execute("profile",key1,value1,key2,value2,key3,value3) + def system_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest): + return self.__search_execute("system",key1,value1,key2,value2,key3,value3) + def image_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest): + return self.__search_execute("image",key1,value1,key2,value2,key3,value3) + def repo_search_execute(self,key1=None,value1=None,key2=None,value2=None,key3=None,value3=None,**rest): + return self.__search_execute("repo",key1,value1,key2,value2,key3,value3) + + def __search(self, what): + caption = "" + dest = "" + if what == "distro": + caption = "Search distros" + dest = "distro_search_execute" + elif what == "profile": + caption = "Search profiles" + dest = "profile_search_execute" + elif what == "system": + caption = "Search systems" + dest = "system_search_execute" + elif what == "repo": + caption = "Search repos" + dest = "repo_search_execute" + elif what == "image": + caption = "Search image" + dest = "image_search_execute" + else: + raise "internal error, unknown object type in search" + + return self.__render('search.tmpl', { + 'what' : what, + 'caption' : caption, + 'submit_dest' : dest + }) + + def distro_search(self,**spam): + return self.__search('distro') + def distro_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -303,6 +382,9 @@ class CobblerWeb(object): pages = total_size / results_per_page return (page, results_per_page, pages) + + def system_menu(self,**spam): + return self.__render('blank.tmpl',{ 'more_blank' : 1}) def system_list(self,page=None,limit=None,**spam): @@ -619,10 +701,19 @@ class CobblerWeb(object): return self.system_list() + def system_search(self,**spam): + return self.__search('system') # ------------------------------------------------------------------------ # # Profiles # ------------------------------------------------------------------------ # + + def profile_search(self,**spam): + return self.__search('profile') + + def profile_menu(self,**spam): + return self.__render('blank.tmpl', { 'more_blank' : 1}) + def profile_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -780,6 +871,12 @@ class CobblerWeb(object): # Repos # ------------------------------------------------------------------------ # + def repo_search(self,**spam): + return self.__search('repo') + + def repo_menu(self,**spam): + return self.__render('blank.tmpl', { 'more_blank' : 1}) + def repo_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -894,6 +991,12 @@ class CobblerWeb(object): # Images # ------------------------------------------------------------------------ # + def image_search(self,**spam): + return self.__search('image') + + def image_menu(self,**spam): + return self.__render('blank.tmpl', { 'more_blank' : 1}) + def image_list(self,page=None,limit=None,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -1017,6 +1120,9 @@ class CobblerWeb(object): # Kickstart files # ------------------------------------------------------------------------ # + def ksfile_menu(self,**spam): + return self.__render('blank.tmpl', { 'more_blank' : 1}) + def ksfile_list(self,**spam): if not self.__xmlrpc_setup(): return self.xmlrpc_auth_failure() @@ -1128,15 +1234,22 @@ class CobblerWeb(object): index.exposed = True menu.exposed = True + distro_menu.exposed = True distro_edit.exposed = True distro_list.exposed = True distro_save.exposed = True - + distro_search.exposed = True + distro_search_execute.exposed = True + + profile_menu.exposed = True subprofile_edit.exposed = True profile_edit.exposed = True profile_list.exposed = True + profile_search.exposed = True profile_save.exposed = True + profile_search_execute.exposed = True + system_menu.exposed = True system_edit.exposed = True system_edit_new.exposed = True system_edit_copy.exposed = True @@ -1148,14 +1261,22 @@ class CobblerWeb(object): system_rename.exposed = True system_delete.exposed = True system_save.exposed = True + system_search.exposed = True + system_search_execute.exposed = True + repo_menu.exposed = True repo_edit.exposed = True repo_list.exposed = True repo_save.exposed = True + repo_search.exposed = True + repo_search_execute.exposed = True + image_menu.exposed = True image_edit.exposed = True image_list.exposed = True image_save.exposed = True + image_search.exposed = True + image_search_execute.exposed = True settings_view.exposed = True ksfile_edit.exposed = True @@ -284,6 +284,7 @@ if __name__ == "__main__": (wwwtmpl, ['webui_templates/empty.tmpl']), (wwwtmpl, ['webui_templates/blank.tmpl']), + (wwwtmpl, ['webui_templates/search.tmpl']), (wwwtmpl, ['webui_templates/enoaccess.tmpl']), (wwwtmpl, ['webui_templates/distro_list.tmpl']), (wwwtmpl, ['webui_templates/distro_edit.tmpl']), diff --git a/webui_templates/blank.tmpl b/webui_templates/blank.tmpl index 0b0d4f7d..7b33dd50 100644 --- a/webui_templates/blank.tmpl +++ b/webui_templates/blank.tmpl @@ -1,8 +1,12 @@ #extends cobbler.webui.master #block body +#if $getVar('more_blank','') == '' You are now logged in to <A HREF="http://fedorahosted.org/cobbler">Cobbler</A>. Main screen turn on. - +#else +Cobbler awaits your command. +<!-- for great justice --> +#end if #end block body diff --git a/webui_templates/empty.tmpl b/webui_templates/empty.tmpl index 7a76ddad..9f6d6725 100644 --- a/webui_templates/empty.tmpl +++ b/webui_templates/empty.tmpl @@ -1,5 +1,9 @@ #extends cobbler.webui.master #block body +#if $getVar('search','') == '' No items found. Add some using the links on the left. +#else +No matches found. +#end if #end block body diff --git a/webui_templates/master.tmpl b/webui_templates/master.tmpl index 6080b819..80865605 100644 --- a/webui_templates/master.tmpl +++ b/webui_templates/master.tmpl @@ -29,43 +29,54 @@ <li><a href="/cobbler/webui/wui.html" class="menu">Docs</a></li> <li><a href="$base_url?mode=settings_view" class="menu">Settings</a></li> <li><hr/></li> - <li><a href="$base_url?mode=distro_list" class="menu">Distros</a></li> - #if $mode == "distro_list" + <li><a class="menu">Distros</span></li> + ##if $mode.find("distro") != -1 <ul id="navaction"> + <li><a href="$base_url?mode=distro_list" class="menu">View</a></li> + <li><a href="$base_url?mode=distro_search" class="menu">Search</a></li> <li><a href="$base_url?mode=distro_edit" class="menu">Add</a></li> </ul> - #end if - <li><a href="$base_url?mode=profile_list" class="menu">Profiles</a></li> - #if $mode == "profile_list" + ##end if + <li><a class="menu">Profiles</span></li> + ##if $mode.find("profile") != -1 <ul id="navaction"> + <li><a href="$base_url?mode=profile_list" class="menu">View</a></li> + <li><a href="$base_url?mode=profile_search" class="menu">Search</a></li> <li><a href="$base_url?mode=profile_edit" class="menu">Add</a></li> <li><a href="$base_url?mode=subprofile_edit" class="menu">Add child</a></li> </ul> - #end if - <li><a href="$base_url?mode=system_list" class="menu">Systems</a></li> - #if $mode == "system_list" + ##end if + <li><a class="menu">Systems</span></li> + ##if $mode.find("system") != -1 <ul id="navaction"> + <li><a href="$base_url?mode=system_list" class="menu">View</a></li> + <li><a href="$base_url?mode=system_search" class="menu">Search</a></li> <li><a href="$base_url?mode=system_edit_new" class="menu">Add</a></li> </ul> - #end if - <li><a href="$base_url?mode=ksfile_list" class="menu">Kickstarts</a></li> - #if $mode == "ksfile_list" + ##end if + <li><a class="menu">Kickstarts</span></li> + ##if $mode.find("ksfile") != -1 <ul id="navaction"> + <li><a href="$base_url?mode=ksfile_list" class="menu">View</a></li> <li><a href="$base_url?mode=ksfile_new" class="menu">Add</a></li> </ul> - #end if - <li><a href="$base_url?mode=repo_list" class="menu">Repos</a></li> - #if $mode == "repo_list" + ##end if + <li><a class="menu">Repos</span></li> + ##if $mode.find("repo") != -1 <ul id="navaction"> + <li><a href="$base_url?mode=repo_list" class="menu">View</a></li> + <li><a href="$base_url?mode=repo_search" class="menu">Search</a></li> <li><a href="$base_url?mode=repo_edit" class="menu">Add</a></li> </ul> - #end if - <li><a href="$base_url?mode=image_list" class="menu">Images</a></li> - #if $mode == "image_list" + ##end if + <li><a class="menu">Images</span></li> + ##if $mode.find("image") != -1 <ul id="navaction"> + <li><a href="$base_url?mode=image_list" class="menu">View</a></li> + <li><a href="$base_url?mode=image_search" class="menu">Search</a></li> <li><a href="$base_url?mode=image_edit" class="menu">Add</a></li> </ul> - #end if + ##end if <li><hr/><br/></li> <li><a class="button sync" href="$base_url?mode=sync">Sync</a></li> </ul> diff --git a/webui_templates/paginate.tmpl b/webui_templates/paginate.tmpl index 9b20e560..66bf6345 100644 --- a/webui_templates/paginate.tmpl +++ b/webui_templates/paginate.tmpl @@ -1,3 +1,4 @@ +#if $page > 0 ## USAGE: # set global what="system" ## # include "/path/to/this/file" @@ -28,4 +29,4 @@ <br/> <br/> - +#end if diff --git a/webui_templates/search.tmpl b/webui_templates/search.tmpl new file mode 100644 index 00000000..f3fca6cb --- /dev/null +++ b/webui_templates/search.tmpl @@ -0,0 +1,45 @@ +#extends cobbler.webui.master +#block body + +<script language="javascript"> +</script> + +#set $form_dest=$base_url+"?mode="+$what+"_search_execute" + +<form method="POST" action="$form_dest"> +<fieldset id="cform"> + + <legend>$caption</legend> + <table border=0> + + <tr> + + <td> + <select id="key1" name="key1"> + <option value="name">name</option> + #if $what == "distro": + <option value="kernel">kernel</option> + <option value="initrd">initrd</option> + #elif $what == "profile" + <option value="distro">distro</option> + #elif $what == "system" + <option value="profile">profile</option> + <option value="image">image</option> + ## FIMXE: more values for more fields, add images, add repos + #end if + </select> + </td> + + ## FIXME copy and paste key2,value2 and key3,value3 in a loop + <td> + <input type="text" id="value1" name="value1"/> + </td> + + </table> + + <input type="submit" value="search"/> + +</fieldset> + +</form> +#end block body |