📄 devicemanagement.py
字号:
# -*- coding: ISO8859-1 -*-# $Id: deviceManagement.py 3315 2005-07-27 12:12:47Z mortenv $## Copyright 2003, 2004 Norwegian University of Science and Technology## This file is part of Network Administration Visualized (NAV)## NAV is free software; you can redistribute it and/or modify# it under the terms of the GNU General Public License as published by# the Free Software Foundation; either version 2 of the License, or# (at your option) any later version.## NAV is distributed in the hope that it will be useful,# but WITHOUT ANY WARRANTY; without even the implied warranty of# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the# GNU General Public License for more details.## You should have received a copy of the GNU General Public License# along with NAV; if not, write to the Free Software# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA### Authors: Hans J鴕gen Hoel <hansjorg@orakel.ntnu.no>#"""Contains all the functions and custom classes used by the deviceTracker, and is also the default handler."""################################################### Importsimport nav.db.manage,mx.DateTime,re,forgetSQL,psycopgfrom mod_python import util,apachefrom nav.web.templates.deviceManagementTemplate import deviceManagementTemplate#from deviceManagementTemplate import deviceManagementTemplatefrom nav.web.TreeSelect import TreeSelect,Select,UpdateableSelect,Option,SimpleSelectfrom nav.web import urlbuilder,SearchBox################################################### Constants (read from config file)BASEPATH = '/devicemanagement/'DATEFORMAT = '%d-%m-%Y'TIMEFORMAT = '%d-%m-%Y %H:%M'TIMESTAMP = '%Y-%m-%d %H:%M:%S'INFINITY = mx.DateTime.DateTime(999999,12,31,0,0,0)MAX_NUMBER_OF_DEVICES_ORDERED = 20NUMBER_OF_ARRIVED_SERIALS = 10DELETE_TIME_THRESHOLD = mx.DateTime.TimeDelta(hours=48)MAIN_MENU = [['Device history',BASEPATH,'Browse and view device history'], ['Order devices',BASEPATH + 'order/','Order new devices and register arrivals of devices with serials'], ['Register devices',BASEPATH + 'register/','Register new devices with serials'], ['Register RMA',BASEPATH + 'rma/','Register a RMA request'], ['Register error event',BASEPATH + 'error/','Register an error event with a comment on a location, room, box or module'], ['Module delete',BASEPATH + 'delete/','Manually delete any modules that are flagged as down']]CURRENT_PATH = [('Home','/'), ('Tools','/toolbox'), ('Device Management',None)]# Controlnames for TreeSelectCN_LOCATION = 'location'CN_ROOM = 'room'CN_BOX = 'box'CN_MODULE = 'module'CN_DEVICE = 'device'#### Default handler##def handler(req): keep_blank_values = True req.form = util.FieldStorage(req,keep_blank_values) path = req.uri.split(BASEPATH)[1] path = path.split('/') if path[0] == 'error': output = error(req) elif path[0] == 'order': output = order(req,path) elif path[0] == 'delete': output = delete(req,path) elif path[0] == 'rma': output = rma(req,path) elif path[0] == 'register': output = register(req,path) else: # Default output = history(req) if output: req.content_type = "text/html" req.write(output) return apache.OK else: return apache.HTTP_NOT_FOUND#### Pages##def register(req,path): page = Page() form = req.form subpath = path[1] product = None if form.has_key(CN_PRODUCT): product = form[CN_PRODUCT] if form.has_key(CN_ARRIVE_CONFIRM): if form.has_key(CN_SERIAL): if len(form[CN_SERIAL]): if len(form[CN_PRODUCT]): serial = form[CN_SERIAL] # Create devices fields = {} fields['productid'] = form[CN_PRODUCT] fields['active'] = 'true' fields['serial'] = serial try: sequence = ('deviceid', 'public.device_deviceid_seq') deviceid = insertFields(fields,'device',sequence) page.messages.append("Added device with serial '" +\ serial + "'") except psycopg.IntegrityError: page.errors.append("A device with serial '" +\ serial + "' already exists") # Send device active start event event = DeviceEvent('deviceActive') event.state = DeviceEvent.STATE_START event.deviceid = deviceid event.addVar('serial',serial) event.addVar('source','registered') event.post() # Send deviceState onShelf start event = DeviceEvent('deviceState','deviceOnShelf') event.state = DeviceEvent.STATE_START event.addVar('username',req.session['user'].login) event.deviceid = deviceid event.post() else: page.errors.append('Missing product') else: page.errors.append('Missing serial') # Set menu page.menu = makeMainMenu(selected=2) page.name = 'register' page.title = 'Register devices' page.description = 'Create new devices by entering serialnumbers.' page.widgets = {} page.action = BASEPATH+'register/' page.widgets['serial'] = Widget(CN_SERIAL,'text','Serial') page.widgets['submit'] = Widget(CN_ARRIVE_CONFIRM,'submit','Register') # Make productlist products = nav.db.manage.Product.getAllIterator() options = [(None,'Select a product',False)] for product in products: options.append((str(product.productid), product.productno + ' (' + product.descr + ')', False)) page.widgets['product'] = Widget(CN_PRODUCT,'select','Product', product, options={'options': options}, required=True) nameSpace = {'page': page} template = deviceManagementTemplate(searchList=[nameSpace]) template.path = CURRENT_PATH return template.respond()CN_ADD_DEVICE = 'r_dadd'CN_ADD_RMA = 'r_radd'CN_RMANUMBER = 'r_number'CN_RMACOMMENT = 'r_comment'CN_RMARETAILER = 'r_retailer'CN_ADDED_DEVICES = 'r_added'def rma(req,path): page = Page() form = req.form subpath = path[1] # Set menu page.menu = makeMainMenu(selected=3) page.name = 'rma' page.title = 'Register RMA' page.description = 'Active RMA events. Select return to register ' +\ 'return of devices.' page.widgets = {} page.action = BASEPATH+'rma/register/' # Get formdata addRMAKeys = [CN_YEAR,CN_MONTH,CN_DAY,CN_RMANUMBER,CN_RMACOMMENT, CN_RMARETAILER] formData = {} for key in addRMAKeys: if form.has_key(key): formData[key] = form[key] else: formData[key] = None submenu = [('Active RMA events','List active RMA events', BASEPATH+'rma/'), ('Register RMA request','Register RMA request', BASEPATH+'rma/register')] page.submenu = submenu deviceidList = [] if form.has_key(CN_ADD_DEVICE): if form.has_key(CN_DEVICE): deviceidList = form[CN_DEVICE] if type(deviceidList) in (str, unicode, util.StringField): deviceidList = [deviceidList] elif form.has_key(CN_ADD_RMA): if form.has_key(CN_RMANUMBER): if len(form[CN_RMANUMBER]): if form.has_key(CN_ADDED_DEVICES): if len(form[CN_ADDED_DEVICES]): rmanumber = form[CN_RMANUMBER] deviceidsAdded = form[CN_ADDED_DEVICES] if type(deviceidsAdded) in (str, unicode, util.StringField): deviceidsAdded = [deviceidsAdded] retailer = None if form.has_key(CN_RMARETAILER): retailer = form[CN_RMARETAILER] comment = None if form.has_key(CN_RMACOMMENT): retailer = form[CN_RMACOMMENT] year = form[CN_YEAR] month = form[CN_MONTH] day = form[CN_DAY] registerRMA(deviceidsAdded,rmanumber,year,month,day, retailer,comment,req.session['user'].login) subpath = '' page.messages.append('Sent RMA event') else: page.errors.append('You must select at least one ' +\ 'device') else: page.errors.append('You must select at least one device') else: page.errors.append('You must enter an RMA number') else: page.errors.append('You must enter an RMA number') if subpath == 'register': page.subname = 'register' page.description = 'Add devices to RMA' page.rmasearchbox,page.treeselect = makeTreeSelectRMA(req) addedDevices = [] if form.has_key(CN_ADDED_DEVICES): addedDevices = form[CN_ADDED_DEVICES] if type(addedDevices) in (str, unicode, util.StringField): addedDevices = [addedDevices] for deviceid in deviceidList: if not deviceid in addedDevices: addedDevices.append(deviceid) rows = [] for deviceid in addedDevices: page.hiddenInputs.append((CN_ADDED_DEVICES,deviceid)) device = nav.db.manage.Device(deviceid) if device.product: productname = device.product.productno else: productname = '' rows.append([[device.serial],[productname], [device.hw_ver],[device.sw_ver]]) page.rmalist = RMAList('Selected devices',rows) page.widgets['rmadate'] = Widget([CN_DAY,CN_MONTH,CN_YEAR],'date', 'RMA date', [formData[CN_YEAR], formData[CN_MONTH], formData[CN_DAY]]) page.widgets['number'] = Widget(CN_RMANUMBER,'text','RMA Number', formData[CN_RMANUMBER], required=True) page.widgets['comment'] = Widget(CN_RMACOMMENT,'textarea','Comment', formData[CN_RMACOMMENT], options={'rows': '5', 'cols': '10', 'style': 'width: 100%;'}) page.widgets['retailer'] = Widget(CN_RMARETAILER,'text','Retailer', formData[CN_RMARETAILER]) page.widgets['adddevice'] = Widget(CN_ADD_DEVICE,'submit','Add device') page.widgets['addrma'] = Widget(CN_ADD_RMA,'submit','Add RMA') if not subpath: # Main page sql = "SELECT device.deviceid,serial,serial " +\ "FROM device,alerthist WHERE " +\ "device.deviceid = alerthist.deviceid AND " +\ "active='false' AND active='true' ORDER BY deviceid" colformat = [['$1$'], ['$2$'], ['$3$'], [['url','Details',BASEPATH+'rma/details/$8$/']]] headings = [('RMA Number',None), ('Date',None), ('Amount',None), ('',None)] page.rmaList = FormattedList('orders','Active RMA events',headings, colformat,sql)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -