Best Python code snippet using tempest_python
bi.py
Source:bi.py  
1#!/usr/bin/python2# -*- encoding: utf-8; py-indent-offset: 4 -*-3# +------------------------------------------------------------------+4# |             ____ _               _        __  __ _  __           |5# |            / ___| |__   ___  ___| | __   |  \/  | |/ /           |6# |           | |   | '_ \ / _ \/ __| |/ /   | |\/| | ' /            |7# |           | |___| | | |  __/ (__|   <    | |  | | . \            |8# |            \____|_| |_|\___|\___|_|\_\___|_|  |_|_|\_\           |9# |                                                                  |10# | Copyright Mathias Kettner 2012             mk@mathias-kettner.de |11# +------------------------------------------------------------------+12#13# This file is part of Check_MK.14# The official homepage is at http://mathias-kettner.de/check_mk.15#16# check_mk is free software;  you can redistribute it and/or modify it17# under the  terms of the  GNU General Public License  as published by18# the Free Software Foundation in version 2.  check_mk is  distributed19# in the hope that it will be useful, but WITHOUT ANY WARRANTY;  with-20# out even the implied warranty of  MERCHANTABILITY  or  FITNESS FOR A21# PARTICULAR PURPOSE. See the  GNU General Public License for more de-22# ails.  You should have  received  a copy of the  GNU  General Public23# License along with GNU Make; see the file  COPYING.  If  not,  write24# to the Free Software Foundation, Inc., 51 Franklin St,  Fifth Floor,25# Boston, MA 02110-1301 USA.26import bi27#     ____        _28#    |  _ \  __ _| |_ __ _ ___  ___  _   _ _ __ ___ ___  ___29#    | | | |/ _` | __/ _` / __|/ _ \| | | | '__/ __/ _ \/ __|30#    | |_| | (_| | || (_| \__ \ (_) | |_| | | | (_|  __/\__ \31#    |____/ \__,_|\__\__,_|___/\___/ \__,_|_|  \___\___||___/32#33multisite_datasources["bi_aggregations"] = {34    "title"       : _("BI Aggregations"),35    "table"       : bi.table,36    "infos"       : [ "aggr" ],37    "keys"        : [],38    "idkeys"      : [ 'aggr_name' ],39}40multisite_datasources["bi_host_aggregations"] = {41    "title"       : _("BI Aggregations affected by one host"),42    "table"       : bi.host_table,43    "infos"       : [ "host", "aggr" ],44    "keys"        : [],45    "idkeys"      : [ 'aggr_name' ],46}47# Similar to host aggregations, but the name of the aggregation48# is used to join the host table rather then the affected host49multisite_datasources["bi_hostname_aggregations"] = {50    "title"       : _("BI Hostname Aggregations"),51    "table"       : bi.hostname_table,52    "infos"       : [ "host", "aggr" ],53    "keys"        : [],54    "idkeys"      : [ 'aggr_name' ],55}56#     ____       _       _57#    |  _ \ __ _(_)_ __ | |_ ___ _ __ ___58#    | |_) / _` | | '_ \| __/ _ \ '__/ __|59#    |  __/ (_| | | | | | ||  __/ |  \__ \60#    |_|   \__,_|_|_| |_|\__\___|_|  |___/61#62def paint_aggr_state_short(state, assumed = False):63    if state == None:64        return "", ""65    else:66        name = nagios_short_state_names[state["state"]]67        classes = "state svcstate state%s" % state["state"]68        if assumed:69            classes += " assumed"70        return classes, name71multisite_painters["aggr_state"] = {72    "title"   : _("Aggregated state"),73    "short"   : _("State"),74    "columns" : [ "aggr_effective_state" ],75    "paint"   : lambda row: paint_aggr_state_short(row["aggr_effective_state"], row["aggr_effective_state"] != row["aggr_state"])76}77multisite_painters["aggr_state_num"] = {78    "title"   : _("Aggregated state (number)"),79    "short"   : _("State"),80    "columns" : [ "aggr_effective_state" ],81    "paint"   : lambda row: ("", str(row["aggr_effective_state"]['state']))82}83multisite_painters["aggr_real_state"] = {84    "title"   : _("Aggregated real state (never assumed)"),85    "short"   : _("R.State"),86    "columns" : [ "aggr_state" ],87    "paint"   : lambda row: paint_aggr_state_short(row["aggr_state"])88}89multisite_painters["aggr_assumed_state"] = {90    "title"   : _("Aggregated assumed state"),91    "short"   : _("Assumed"),92    "columns" : [ "aggr_assumed_state" ],93    "paint"   : lambda row: paint_aggr_state_short(row["aggr_assumed_state"])94}95multisite_painters["aggr_group"] = {96    "title"   : _("Aggregation group"),97    "short"   : _("Group"),98    "columns" : [ "aggr_group" ],99    "paint"   : lambda row: ("", row["aggr_group"])100}101multisite_painters["aggr_name"] = {102    "title"   : _("Aggregation name"),103    "short"   : _("Aggregation"),104    "columns" : [ "aggr_name" ],105    "paint"   : lambda row: ("", row["aggr_name"])106}107multisite_painters["aggr_output"] = {108    "title"   : _("Aggregation status output"),109    "short"   : _("Output"),110    "columns" : [ "aggr_output" ],111    "paint"   : lambda row: ("", row["aggr_output"])112}113def paint_aggr_hosts(row, link_to_view):114    h = []115    for site, host in row["aggr_hosts"]:116        url = html.makeuri([("view_name", link_to_view), ("site", site), ("host", host)])117        h.append('<a href="%s">%s</a>' % (url, host))118    return "", " ".join(h)119multisite_painters["aggr_hosts"] = {120    "title"   : _("Aggregation: affected hosts"),121    "short"   : _("Hosts"),122    "columns" : [ "aggr_hosts" ],123    "paint"   : lambda row: paint_aggr_hosts(row, "aggr_host"),124}125multisite_painters["aggr_hosts_services"] = {126    "title"   : _("Aggregation: affected hosts (link to host page)"),127    "short"   : _("Hosts"),128    "columns" : [ "aggr_hosts" ],129    "paint"   : lambda row: paint_aggr_hosts(row, "host"),130}131multisite_painter_options["aggr_expand"] = {132 "title"   : _("Initial expansion of aggregations"),133 "default" : "0",134 "values"  : [ ("0", "collapsed"), ("1", "first level"), ("2", "two levels"), ("3", "three levels"), ("999", "complete")]135}136multisite_painter_options["aggr_onlyproblems"] = {137 "title"   : _("Show only problems"),138 "default" : "0",139 "values"  : [ ("0", "show all"), ("1", "show only problems")]140}141multisite_painter_options["aggr_treetype"] = {142 "title"   : _("Type of tree layout"),143 "default" : "foldable",144 "values"  : [ 145    ("foldable",     _("foldable")), 146    ("boxes",        _("boxes")),147    ("boxes-omit-root", _("boxes (omit root)")),148    ("bottom-up",    _("bottom up")), 149    ("top-down",     _("top down"))]150}151multisite_painter_options["aggr_wrap"] = {152 "title"   : _("Handling of too long texts"),153 "default" : "wrap",154 "values"  : [ ("wrap", "wrap"), ("nowrap", "don't wrap")]155}156def render_bi_state(state):157    return { bi.PENDING: _("PD"),158             bi.OK:      _("OK"),159             bi.WARN:    _("WA"),160             bi.CRIT:    _("CR"),161             bi.UNKNOWN: _("UN"),162             bi.MISSING: _("MI"),163             bi.UNAVAIL: _("NA"),164    }.get(state, _("??"))165def render_assume_icon(site, host, service):166    if service:167        key = (site, host, service)168    else:169        key = (site, host)170    ass = bi.g_assumptions.get(key)171    # TODO: Non-Ascii-Characters do not work yet!172    mousecode = \173       u'onmouseover="this.style.cursor=\'pointer\';" ' \174       'onmouseout="this.style.cursor=\'auto\';" ' \175       'title="%s" ' \176       'onclick="toggle_assumption(this, \'%s\', \'%s\', \'%s\');" ' % \177         (_("Assume another state for this item (reload page to activate)"),178         # MIST: DAS HIER MUSS verfünftig für Javascript encodiert werden.179         # Das Ausgangsmaterial sind UTF-8 kodierte str-Objekte.180          site, host, service != None and service or '')181    current = str(ass).lower()182    return u'<img state="%s" class=assumption %s src="images/assume_%s.png">\n' % (current, mousecode, current)183def aggr_render_leaf(tree, show_host, bare = False):184    site, host = tree[2]["host"]185    service = tree[2].get("service")186    if bare:187        content = u""188    else:189        content = u"" + render_assume_icon(site, host, service)190    # Four cases:191    # (1) zbghora17 . Host status   (show_host == True, service == None)192    # (2) zbghora17 . CPU load      (show_host == True, service != None)193    # (3) Host Status               (show_host == False, service == None)194    # (4) CPU load                  (show_host == False, service != None)195    if show_host or not service:196        host_url = html.makeuri([("view_name", "hoststatus"), ("site", site), ("host", host)])197    if service:198        service_url = html.makeuri([("view_name", "service"), ("site", site), ("host", host), ("service", service)])199    if show_host:200        content += '<a href="%s">%s</a><b class=bullet>♦</b>' % (host_url, host.replace(" ", " "))201    if tree[1] and tree[0] != tree[1]:202        addclass = ' class="state assumed"'203    else:204        addclass = ""205    if not service:206        content += '<a href="%s"%s>%s</a>' % (host_url, addclass, _("Host status"))207    else:208        content += '<a href="%s"%s>%s</a>' % (service_url, addclass, service.replace(" ", " "))209    if bare:210        return content211    else:212        return aggr_render_node(tree, content, None, show_host)213def aggr_render_node(tree, title, mousecode, show_host):214    # Check if we have an assumed state: comparing assumed state (tree[1]) with state (tree[0])215    if tree[1] and tree[0] != tree[1]:216        addclass = " " + _("assumed")217        effective_state = tree[1]218    else:219        addclass = ""220        effective_state = tree[0]221    h = '<span class="content state state%d%s">%s</span>\n' \222         % (effective_state["state"], addclass, render_bi_state(effective_state["state"]))223    if mousecode:224        h += '<img class=opentree %s>' % mousecode225        h += '<span class="content name">%s</span>' % title226    else:227        h += title228    output = format_plugin_output(effective_state["output"])229    if output:230        output = "<b class=bullet>♦</b>" + output231    else:232        output = ""233    h += '<span class="content output">%s</span>\n' % output234    return h235# Convert tree to tree contain only node in non-OK state236def filter_tree_only_problems(tree):237    state, assumed_state, node, subtrees = tree238    # remove subtrees in state OK239    new_subtrees = []240    for subtree in subtrees:241        effective_state = subtree[1] != None and subtree[1] or subtree[0]242        if effective_state["state"] != bi.OK:243            if len(subtree) == 3:244                new_subtrees.append(subtree)245            else:246                new_subtrees.append(filter_tree_only_problems(subtree))247    return state, assumed_state, node, new_subtrees248def paint_aggr_tree_foldable(row, boxes, omit_root=True):249    saved_expansion_level = bi.load_ex_level()250    treestate = weblib.get_tree_states('bi')251    expansion_level = int(get_painter_option("aggr_expand"))252    if expansion_level != saved_expansion_level:253        treestate = {}254        weblib.set_tree_states('bi', treestate)255        weblib.save_tree_states()256    mousecode = \257       'onmouseover="this.style.cursor=\'pointer\';" ' \258       'onmouseout="this.style.cursor=\'auto\';" ' \259       'onclick="bi_toggle_%s(this);" ' % (boxes and "box" or "subtree")260    def render_subtree(tree, path, show_host):261        is_leaf = len(tree) == 3262        path_id = "/".join(path)263        is_open = treestate.get(path_id)264        if is_open == None:265            is_open = len(path) <= expansion_level266        h = ""267        268        state = tree[0]269        # Variant: BI-Boxes270        if boxes:271            # Check if we have an assumed state: comparing assumed state (tree[1]) with state (tree[0])272            if tree[1] and tree[0] != tree[1]:273                addclass = " " + _("assumed")274                effective_state = tree[1]275            else:276                addclass = ""277                effective_state = tree[0]278            if is_leaf:279                leaf = "leaf"280                mc = ""281            else:282                leaf = "noleaf"283                mc = mousecode284            omit = omit_root and len(path) == 1285            if not omit:286                h += '<span id="%d:%s" %s class="bibox_box %s %s state state%s%s">' % (287                        expansion_level, path_id, mc, leaf, is_open and "open" or "closed", effective_state["state"], addclass)288                if is_leaf:289                    h += aggr_render_leaf(tree, show_host, bare = True) # .replace(" ", " ")290                else:291                    h += tree[2]["title"].replace(" ", " ")292                h += '</span> '293            if not is_leaf:294                h += '<span class="bibox" style="%s">' % ((not is_open and not omit) and "display: none;" or "")295                parts = []296                for node in tree[3]:297                    new_path = path + [node[2]["title"]]298                    h += render_subtree(node, new_path, show_host)299                h += '</span>'300            return h301        # Variant: foldable trees302        else:303            if is_leaf: # leaf304                return aggr_render_leaf(tree, show_host, bare = boxes)305            h += '<span class=title>'306            is_empty = len(tree[3]) == 0307            if is_empty:308                style = ''309                mc = ''310            elif is_open:311                style = ''312                mc = mousecode + 'src="images/tree_black_90.png" '313            else:314                style = 'style="display: none" '315                mc = mousecode + 'src="images/tree_black_00.png" '316            h += aggr_render_node(tree, tree[2]["title"], mc, show_host)317            if not is_empty:318                h += '<ul id="%d:%s" %sclass="subtree">' % (expansion_level, path_id, style)319                for node in tree[3]:320                    estate = node[1] != None and node[1] or node[0]321                    if not node[2].get("hidden"):322                        new_path = path + [node[2]["title"]]323                        h += '<li>' + render_subtree(node, new_path, show_host) + '</li>\n'324                h += '</ul>'325            return h + '</span>\n'326    tree = row["aggr_treestate"]327    if get_painter_option("aggr_onlyproblems") == "1":328        tree = filter_tree_only_problems(tree)329    affected_hosts = row["aggr_hosts"]330    htmlcode = render_subtree(tree, [tree[2]["title"]], len(affected_hosts) > 1)331    return "aggrtree" + (boxes and "_box" or ""), htmlcode332def paint_aggr_tree_ltr(row, mirror):333    wrap = get_painter_option("aggr_wrap")334    if wrap == "wrap":335        td = '<td'336    else:337        td = '<td style="white-space: nowrap;"'338    def gen_table(tree, height, show_host):339        if len(tree) == 3:340            return gen_leaf(tree, height, show_host)341        else:342            return gen_node(tree, height, show_host)343    def gen_leaf(tree, height, show_host):344        return [(aggr_render_leaf(tree, show_host), height, [])]345    def gen_node(tree, height, show_host):346        leaves = []347        for node in tree[3]:348            if not node[2].get("hidden"):349                leaves += gen_table(node, height - 1, show_host)350        h = '<div class="aggr tree">' + aggr_render_node(tree, tree[2]["title"], '', show_host) + "</div>"351        if leaves:352            leaves[0][2].append((len(leaves), h))353        return leaves354    tree = row["aggr_treestate"]355    if get_painter_option("aggr_onlyproblems") == "1":356        tree = filter_tree_only_problems(tree)357    depth = bi.status_tree_depth(tree)358    leaves = gen_table(tree, depth, row["aggr_hosts"] > 1)359    h = '<table class="aggrtree">'360    odd = "odd"361    for code, colspan, parents in leaves:362        h += '<tr>\n'363        leaf_td = td + ' class="leaf %s"' % odd364        odd = odd == "odd" and "even" or "odd"365        if colspan > 1:366            leaf_td += ' colspan=%d' % colspan367        leaf_td += '>%s</td>\n' % code368        tds = [leaf_td]369        for rowspan, c in parents:370            tds.append(td + ' class=node rowspan=%d>%s</td>\n' % (rowspan, c))371        if mirror:372            tds.reverse()373        h += "".join(tds)374        h += '</tr>\n'375    h += '</table>'376    return "aggrtree", h377def paint_aggregated_tree_state(row):378    treetype = get_painter_option("aggr_treetype")379    if treetype == "foldable":380        return paint_aggr_tree_foldable(row, boxes = False, omit_root = False)381    elif treetype == "boxes":382        return paint_aggr_tree_foldable(row, boxes = True, omit_root = False)383    elif treetype == "boxes-omit-root":384        return paint_aggr_tree_foldable(row, boxes = True, omit_root = True)385    elif treetype == "bottom-up":386        return paint_aggr_tree_ltr(row, False)387    elif treetype == "top-down":388        return paint_aggr_tree_ltr(row, True)389multisite_painters["aggr_treestate"] = {390    "title"   : _("Aggregation: complete tree"),391    "short"   : _("Tree"),392    "columns" : [ "aggr_treestate", "aggr_hosts" ],393    "options" : [ "aggr_expand", "aggr_onlyproblems", "aggr_treetype", "aggr_wrap" ],394    "paint"   : paint_aggregated_tree_state,395}396multisite_painters["aggr_treestate_boxed"] = {397    "title"   : _("Aggregation: simplistic boxed layout"),398    "short"   : _("Tree"),399    "columns" : [ "aggr_treestate", "aggr_hosts" ],400    "paint"   : lambda row: paint_aggr_tree_foldable(row, boxes = True, omit_root = True),401}402#     _____ _ _ _403#    |  ___(_) | |_ ___ _ __ ___404#    | |_  | | | __/ _ \ '__/ __|405#    |  _| | | | ||  __/ |  \__ \406#    |_|   |_|_|\__\___|_|  |___/407#408class BIGroupFilter(Filter):409    def __init__(self):410        self.column = "aggr_group"411        Filter.__init__(self, self.column, _("Aggregation group"), "aggr", [self.column], [self.column])412    def variable_settings(self, row):413        return [ (self.htmlvars[0], row[self.column]) ]414    def display(self):415        htmlvar = self.htmlvars[0]416        html.select(htmlvar, [ ("", "") ] + [(g, g) for g in bi.aggregation_groups()])417    def selected_group(self):418        return html.var(self.htmlvars[0])419    def filter_table(self, rows):420        group = self.selected_group()421        if not group:422            return rows423        else:424            return [ row for row in rows if row[self.column] == group ]425    def heading_info(self, infoname):426        return html.var(self.htmlvars[0])427declare_filter( 90,  BIGroupFilter())428class BITextFilter(Filter):429    def __init__(self, what):430        self.column = "aggr_" + what431        label = ''432        if what == 'name':433            label = _('Aggregation name')434        elif what == 'output':435            label = _('Aggregation output')436        Filter.__init__(self, self.column, label, "aggr", [self.column], [self.column])437    def variable_settings(self, row):438        return [ (self.htmlvars[0], row[self.column]) ]439    def display(self):440        html.text_input(self.htmlvars[0])441    def heading_info(self, infoname):442        return html.var(self.htmlvars[0])443    def filter_table(self, rows):444        val = html.var(self.htmlvars[0])445        if not val:446            return rows447        reg = re.compile(val.lower())448        return [ row for row in rows if reg.search(row[self.column].lower()) ]449declare_filter(120, BITextFilter("name"))450declare_filter(121, BITextFilter("output"))451class BIHostFilter(Filter):452    def __init__(self):453        self.column = "aggr_hosts"454        Filter.__init__(self, self.column, _("Affected hosts contain"), "aggr", ["site", "host"], [])455    def display(self):456        html.text_input(self.htmlvars[1])457    def heading_info(self, infoname):458        return html.var(self.htmlvars[1])459    def find_host(self, host, hostlist):460        for s, h in hostlist:461            if h == host:462                return True463        return False464    # Used for linking465    def variable_settings(self, row):466        return [ ("host", row["host_name"]), ("site", row["site"]) ]467    def filter_table(self, rows):468        val = html.var(self.htmlvars[1])469        if not val:470            return rows471        return [ row for row in rows if self.find_host(val, row["aggr_hosts"]) ]472declare_filter(130, BIHostFilter(), _("Filter for all aggregations that base on status information of that host. Exact match (no regular expression)"))473class BIServiceFilter(Filter):474    def __init__(self):475        Filter.__init__(self, "aggr_service", _("Affected by service"), "aggr", ["site", "host", "service"], [])476    def double_height(self):477        return True478    def display(self):479        html.write(_("Host") + ": ")480        html.text_input("host")481        html.write(_("Service") + ": ")482        html.text_input("service")483    def heading_info(self, infoname):484        return html.var_utf8("host") + " / " + html.var_utf8("service")485    def service_spec(self):486        return html.var_utf8("site"), html.var_utf8("host"), html.var_utf8("service")487    # Used for linking488    def variable_settings(self, row):489        return [ ("site", row["site"]), ("host", row["host_name"]), ("service", row["service_description"]) ]490declare_filter(131, BIServiceFilter(), _("Filter for all aggregations that are affected by one specific service on a specific host (no regular expression)"))491class BIStatusFilter(Filter):492    def __init__(self, what):493        title = (what.replace("_", " ") + " state").title()494        self.column = "aggr_" + what + "state"495        if what == "":496            self.code = 'r'497        else:498            self.code = what[0]499        self.prefix = "bi%ss" % self.code500        vars = [ self.prefix + str(x) for x in [ -1, 0, 1, 2, 3 ] ]501        if self.code == 'a':502            vars.append(self.prefix + "n")503        Filter.__init__(self, self.column, title, "aggr", vars, [])504    def filter(self, tablename):505        return ""506    def double_height(self):507        return self.column == "aggr_assumed_state"508    def display(self):509        if html.var("filled_in"):510            defval = ""511        else:512            defval = "on"513        for varend, text in [('0', 'OK'), ('1', 'WARN'), ('2', 'CRIT'), 514                             ('3', 'UNKN'), ('-1', 'PENDING'), ('n', _('no assumed state set'))]:515            if self.code != 'a' and varend == 'n':516                continue # no unset for read and effective state517            if varend == 'n':518                html.write("<br>")519            var = self.prefix + varend520            html.checkbox(var, defval, label = text)521    def filter_table(self, rows):522        jeaders = []523        if html.var("filled_in"):524            defval = ""525        else:526            defval = "on"527        allowed_states = []528        for i in ['0','1','2','3','-1','n']:529            if html.var(self.prefix + i, defval) == "on":530                if i == 'n':531                    s = None532                else:533                    s = int(i)534                allowed_states.append(s)535        newrows = []536        for row in rows:537            if row[self.column] != None:538                s = row[self.column]["state"]539            else:540                s = None541            if s in allowed_states:542                newrows.append(row)543        return newrows544declare_filter(150,  BIStatusFilter(""))545declare_filter(151,  BIStatusFilter("effective_"))...host_modify.py
Source:host_modify.py  
1# -*- coding: UTF-8 â*-.2import sys3def show_host():4	host_path="C:\Windows\System32\drivers\etc\hosts"5	host_file=open(host_path,"r")6	host_list=[]7	while 1:8		line = host_file.readline()9   		if not line:10   			break11   		host_list.append(line)12   	host_file.close()13   	return host_list1415def host_write(host_list,ip,host_name):16	host_path="C:\Windows\System32\drivers\etc\hosts"17	host_file=open(host_path,"w")18	write=019	content=""20	for line in range(len(host_list)):21		if(host_list[line][0]!="#" and (host_name==host_list[line].split(' ')[1])):22			host_list[line]=ip+' '+host_name+'\n'23			write=124	if(write==0):25		host_list.append(ip+' '+host_name+'\n')26	for line in host_list:27		content+=line28	host_file.write(content)29	host_file.close()3031def host_remove(host_list,host_name):32	write=033	content=""34	for line in range(len(host_list)):35		if(host_list[line][0]!="#" and (host_name==host_list[line].split(' ')[1])):36			host_list[line]=''37			write=138	if(write==1):39		for line in host_list:40			content+=line41		host_path="C:\Windows\System32\drivers\etc\hosts"42		host_file=open(host_path,"w")43		host_file.write(content)44		host_file.close()45	else:46		print 'no host to remove.'474849if __name__=='__main__':50	operator=05152	if(len(sys.argv)==2):53		if(sys.argv[1]=='--show-host'):54			operator=155			host_list=show_host()56			for i in host_list:57				print i,58		#if(sys.argv[1]=='--set-backup'):59		#if(sys.argv[1]=='--get-backup')6061	if(len(sys.argv)==3):62		if(sys.argv[1]=='--remove'):63			operator=164			host_list=show_host()65			host_remove(host_list,sys.argv[2])66			67	if(len(sys.argv)==4):68		if(sys.argv[1]=='--add'):69			operator=170			host_list=show_host()71			host_write(host_list,sys.argv[2],sys.argv[3])7273	if(operator==0):74		print '--show-host'75		#print '--set-backup'76		#print '--get-backup'77		print '--add ip hostname'
...urls.py
Source:urls.py  
1"""ebooking URL Configuration2The `urlpatterns` list routes URLs to views. For more information please see:3    https://docs.djangoproject.com/en/4.0/topics/http/urls/4Examples:5Function views6    1. Add an import:  from my_app import views7    2. Add a URL to urlpatterns:  path('', views.home, name='home')8Class-based views9    1. Add an import:  from other_app.views import Home10    2. Add a URL to urlpatterns:  path('', Home.as_view(), name='home')11Including another URLconf12    1. Import the include() function: from django.urls import include, path13    2. Add a URL to urlpatterns:  path('blog/', include('blog.urls'))14"""15from django.contrib import admin16from django.urls import path17from ebooking import views18urlpatterns = [19    path('', views.home, name="home"),20    path('register', views.register, name="register"),21    path('admin', admin.site.urls),22    path('login', views.login, name="login"),23    path('logout', views.logout, name="logout"),24    path('list_rooms', views.list_rooms, name="list_rooms"),25    path('book_room', views.book_room, name="book_room"),26    path('update_room/<str:pk>/', views.update_room, name="update_room"),27    path('delete_room/<str:pk>/', views.delete_room, name="delete_room"),28    path('show_room/<str:pk>/', views.show_room, name="show_room"),29    path('show_host/<str:pk>/', views.show_host, name="show_host"),...Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.
You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.
Get 100 minutes of automation test minutes FREE!!
