summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael DeHaan <mdehaan@redhat.com>2009-03-05 17:59:10 -0500
committerMichael DeHaan <mdehaan@redhat.com>2009-03-05 17:59:10 -0500
commit1dee14556a2e8b5bb7046a56731490a95245b441 (patch)
treebd7f641dd2251396c1031f453ecf920f18e101b6
parentdbcfc5a2f0d191001cd8000a543e41eddefd20f7 (diff)
downloadcobbler-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.py8
-rw-r--r--cobbler/remote.py6
-rw-r--r--cobbler/webui/CobblerWeb.py125
-rw-r--r--setup.py1
-rw-r--r--webui_templates/blank.tmpl6
-rw-r--r--webui_templates/empty.tmpl4
-rw-r--r--webui_templates/master.tmpl47
-rw-r--r--webui_templates/paginate.tmpl3
-rw-r--r--webui_templates/search.tmpl45
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
diff --git a/setup.py b/setup.py
index c98c89ba..904732fb 100644
--- a/setup.py
+++ b/setup.py
@@ -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