From pbear at ned.gsfc.nasa.gov Wed Oct 1 14:24:15 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 1 13:24:18 2003 Subject: [Pangalactic-commits] fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay Message-ID: <200310011724.h91HOFtY014278@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.56 1.57 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.5 1.6 PanGalactic/pangalactic/utils/__init__.py 1.3 1.4 PanGalactic/pangalactic/utils/basegrid.py 1.10 1.11 PanGalactic/pangalactic/utils/configdbbrowser.py 1.3 1.4 PanGalactic/pangalactic/utils/dbbrowser.py 1.2 1.3 PanGalactic/pangalactic/utils/pgefdatatable.py 1.3 1.4 PanGalactic/pangalactic/utils/customizegrid.py 1.3 None Log message: fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay Index: PanGalactic/pangalactic/utils/pgefdatatable.py diff -u PanGalactic/pangalactic/utils/pgefdatatable.py:1.3 PanGalactic/pangalactic/utils/pgefdatatable.py:1.4 --- PanGalactic/pangalactic/utils/pgefdatatable.py:1.3 Wed Sep 24 12:03:13 2003 +++ PanGalactic/pangalactic/utils/pgefdatatable.py Wed Oct 1 13:24:14 2003 @@ -23,6 +23,8 @@ # required methods for the wxPyGridTableBase interface def GetDisplayMapping(self): + #print "pgefdatatable.getdisplaymapping" + #print self.display_mapping return self.display_mapping def GetNumberRows(self): @@ -135,19 +137,26 @@ return None def SetDisplayMapping(self, mapping): + #print "pgefdatatable.setdisplaymapping" if mapping: self.display_mapping = mapping + #print "display_mapping", self.display_mapping self.identifiers = [entry[0] for entry in self.display_mapping] + #print "mapping", mapping[0] + #print "identifiers", self.identifiers[0] #msg = wxGridTableMessage(self, wxGRIDTABLE_REQUEST_VIEW_GET_VALUES) #self.RefreshGrid() #self.GetView().ProcessTableMessage(msg) #print 'identifiers are: %s' % self.identifiers elif self._data: + #print "no mapping, table data" #self.identifiers = self._data[0].__dict__.keys() #self.display_mapping = zip(self.identifiers, self.identifiers) self.identifiers = [z[1].replace('self.','') for z in self._data[0]._gridmap] self.display_mapping = [(z[1].replace('self.',''), z[0]) for z in self._data[0]._gridmap] + #print "display_mapping", self.display_mapping + #print "identifiers", self.identifiers[0] def DeleteObject(self, ndx): if ndx: Index: PanGalactic/pangalactic/utils/dbbrowser.py diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.2 PanGalactic/pangalactic/utils/dbbrowser.py:1.3 --- PanGalactic/pangalactic/utils/dbbrowser.py:1.2 Tue Sep 16 15:11:53 2003 +++ PanGalactic/pangalactic/utils/dbbrowser.py Wed Oct 1 13:24:14 2003 @@ -66,7 +66,6 @@ def ClearGrid(self): - gridrows = self.grid.GetNumberRows() if gridrows > 0: self.grid.DeleteRows(0, gridrows) @@ -137,7 +136,9 @@ collection_name = self.GetRootitems().GetStringSelection() tmpsize = wxSize(750, 500) testframe = toolframe.toolFrame(self, -1, 'Config DB Browser', wxDefaultPosition, tmpsize) - testframe.mainpanel = configdbbrowser.ConfigDbBrowser(testframe, -1, dbroot = self.dbroot, collection_name = collection_name) + testframe.mainpanel = configdbbrowser.ConfigDbBrowser(testframe, -1, + dbroot = self.dbroot, + collection_name = collection_name) testframe.CentreOnParent() testframe.Show(true) Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.5 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.6 --- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.5 Thu Aug 28 14:21:47 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py Wed Oct 1 13:24:13 2003 @@ -9,8 +9,6 @@ import mx.DateTime import pangalactic.utils.basegrid as basegrid import pangalactic.utils.pdfoptions as pdfoptions -from pangalactic.utils.customizegrid import * - # just a note for my benefit in case I have the same problem. --vwk # Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.56 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.57 --- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.56 Wed Sep 24 16:02:13 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py Wed Oct 1 13:24:13 2003 @@ -5,7 +5,7 @@ from wxPython.lib.gridmovers import wxGridColMover, EVT_GRID_COL_MOVE import pangalactic.enterprise.productmodelversion -from pangalactic.utils.customizegrid import * +from pangalactic.utils.configuregrid import * import quickcreate import os @@ -46,117 +46,6 @@ grid columns and to fill a row of data given the data in a list format""" def __init__(self, parent, id, savename = None, dbroot = None, intable = None): basegrid.BaseGrid.__init__(self, parent, id, savename, dbroot, intable) -# self.SetColLabelSize(48) -# self.AutoSizeColumns(true) - -# if intable: -# self.table = intable -# else: -# self.table = pgefdatatable.PgefDataTable() -# self.SetTable(self.table, true) - -# self.moveTo = None -# self.DropVariable = None -# self._displayed_objs = [] -# self.allow_config_flag = 1 -# self.already_showing_config = 0 -# self.dbroot = dbroot -# self.savename = savename -# self.DisplayMapping = self.RetrieveDisplay() -# self.table.SetDisplayMapping(self.DisplayMapping) - -# evthandler = pgefevents.PgefDragDropHandler(self) - -# EVT_MOTION(self.GetGridWindow(), self.OnMove) -# EVT_MOTION(self.GetGridRowLabelWindow(), self.OnMove) -# EVT_GRID_COL_SIZE(self, self.OnColResize) -# EVT_GRID_CELL_LEFT_CLICK(self, self.OnLeftClick) -# EVT_GRID_LABEL_LEFT_CLICK(self, self.OnLeftClick) -# EVT_GRID_CELL_RIGHT_CLICK(self, self.OnRightDown) -# EVT_MENU(self, pdfoptions.ID_CREATEPDF_POPUP, self.DumpToPdf) -# EVT_MENU(self, ID_POPUP_CONFIG_GRID, self.ConfigGrid) -# EVT_MENU(self, ID_POPUP_CLEAR_SELECTION, self.OnClearSelection) - -# self.PushEventHandler(evthandler) -# wxGridColMover(self) -# self.SetDefaultCellOverflow(false) -# self.FitInside() -# EVT_GRID_COL_MOVE(self,self.GetId(),self.OnColMove) -# EVT_MENU(self, ID_POPUP_QUICKCREATE, self.QuickCreate) - - - # Event method called when a column move needs to take place -# def OnColMove(self, evt): -# frm = evt.GetMoveColumn() # Column being moved -# to = evt.GetBeforeColumn() # Before which column to insert -# #print "oncolmove", frm, to -# self.GetTable().MoveColumn(frm, to) -# self.AutoSizeColumns() - -## def SetColumnAttr(self, typelist = None): -## if typelist == None: -## raise dataobjects.pgefexceptions.RequiredDataError, 'a column type list must be provided' -## column = 0 - -## for columntype in typelist: -## attr = wxGridCellAttr() -## if columntype == 'bool': -## attr.SetEditor(wxGridCellBoolEditor()) -## attr.SetReadOnly(false) - -## elif columntype == 'image': -## attr.SetBackgroundColour(wxGREEN) -### attr.SetRenderer(MyCustomRenderer(self.gridimage)) -## attr.SetReadOnly(true) - -## else: -## attr.SetEditor(wxGridCellTextEditor()) -## attr.SetReadOnly(true) - -## self.SetColAttr(column, attr) - -## if columntype == 'bool': -## self.SetColFormatBool(column) - -## column += 1 - -## def OnLeftClick(self, event): -## if event.GetId() == self.GetId(): -## temprow = event.GetRow() -## tempcol = event.GetCol() -## if temprow == wxNOT_FOUND: -## self.DropVariable = None -## #elif tempcol != 0: -## #self.DropVariable = None -## else: -## self.DropVariable = temprow - -## if event.GetCol() == 1: -## row = event.GetRow() -## col = event.GetCol() -## oldvalue = self.GetCellValue(row, col) -## if oldvalue: -## self.SetCellValue(row, col, '') -## else: -## self.SetCellValue(row, col, 'Y') -## event.Skip() - -## def OnColResize(self, event): -## if event.GetId() == self.GetId(): -## try: -## self.ForceRefresh() -## except: -## self.Refresh(true) - -## def OnMove(self, event): -## """Initiates the drag and drop operation if the control key is pressed""" -## if event.LeftIsDown() and self.DropVariable != None: -## self.StartDragOperation(self.DropVariable) -## else: -## event.Skip() - -## def OnClearSelection(self, event): -## self.ClearSelection() def OnRightDown(self, event): if event.GetId() == self.GetId(): @@ -176,183 +65,6 @@ self.PopupMenuXY(menu, x, y) -## def StartDragOperation(self, selectedrow): -## """Handles the data encapsulation and packaging for the drag and drop""" - -## if selectedrow < 0: -## return false - -## itemid = self.GetObjectOid(selectedrow) -## if itemid == '': -## return false - -## data = [None, itemid, "GRID", self.GetId()] -## datapickle = cPickle.dumps(data, 1) -## dragitem = wxCustomDataObject(wxCustomDataFormat("PGEF_Item")) -## dragitem.SetData(datapickle) -## dropSource = wxDropSource(self) -## dropSource.SetData(dragitem) -## result = dropSource.DoDragDrop(true) - -## def CanConfigDisplay(self): -## if self.table._data: -## return 1 -## else: -## return None - -## def ClearGrid(self): -## self.table.ClearTableBase() - -## def GetDataObj(self, ndx): -## return self.table._data[ndx] - -## def RefreshFromObjects(self): -## self.table.RefreshGrid() -## self.FitInside() - -## def AddData(self, data): -## if isinstance(data, types.ListType): -## for obj in data: -## self.table.AddData(obj) -## else: -## self.table.AddData(data) -## self.AutoSizeColumns(true) -## self.FitInside() - - -## def DefaultBackgroundColour(self): -## """Reset the grid background for all rows to the default colour.""" -## nrows = self.GetNumberRows() -## self.BeginBatch() -## somecol = 0 -## for row in range(nrows): -## #print "set bg colour for row: " + str(row) -## # get the attr for the wxAttrKind.Row (= 3) -## # GetAttr needs the type of attr to get, despite what the docs say -## if attr: -## attr.SetBackgroundColour(self.GetDefaultCellBackgroundColour()) -## self.SetRowAttr(row, attr) -## found = true -## self.EndBatch() - - -## def ResetBackgroundColour(self, value): -## nrows = self.GetNumberRows() -## self.BeginBatch() -## for row in range(nrows): -## if self.GetObjectOid(row) == value: -## #print "set bg colour for row: " + str(row) -## # get the attr for the wxAttrKind.Row (= 3) -## # GetAttr needs the type of attr to get, despite what the docs say -## attr = self.GetTable().GetAttr(row, 0, 3) -## if attr: -## attr.SetBackgroundColour(self.GetDefaultCellBackgroundColour()) -## self.SetRowAttr(row, attr) -## found = true - -## self.EndBatch() - - -## def DumpToPdf(self, event = None): -## gridrows = self.GetNumberRows() -## if gridrows <= 0: -## return -## dlg = pdfoptions.PDFOptions(self) -## dlg.Layout() -## result = dlg.ShowModal() -## if result == wxID_OK: -## filename = dlg.filename.GetValue() -## if not filename.endswith('.pdf'): -## filename += '.pdf' - -## if dlg.portrait.GetValue(): -## page_orientation = 'portrait' -## else: -## page_orientation = 'landscape' - -## hide_gridlines = dlg.hide_gridlines.GetValue() - -## if dlg.table_or_list.GetValue(): -## tabular = 0 -## else: -## tabular = 1 - -## title = dlg.pdftitle.GetValue() -## footer = dlg.footertext.GetValue() - -## temp = objectreport.ObjectReport(filename, -## self.table._data, -## title, -## footer, -## orientation = page_orientation, -## tabular = tabular, -## hidegridlines = hide_gridlines) - -## temp.display_map = self.DisplayMapping -## temp.generate() - -## def RetrieveDisplay(self): -## done = None -## if self.dbroot and self.savename: -## if self.dbroot.has_key('config_grid'): -## if self.dbroot['config_grid'].has_key(self.savename): -## done = self.dbroot['config_grid'][self.savename] -## else: -## config = ConfigParser.ConfigParser() -## tmppath = os.path.join("data", "grid.ini") -## if os.path.exists(tmppath): -## config.read(tmppath) -## temp = config.get(self.savename, 'display') -## temp = temp.replace("'", "") -## temp = temp[2:-2] -## temp = temp.split('), (') -## done = [element.split(',') for element in temp] -## return done - - -## def SaveDisplay(self, display_list): -## print "save display config", display_list -## if self.dbroot: -## print "save to zodb" -## temp = {} -## temp[self.savename] = display_list -## self.dbroot['config_grid'] = temp -## get_transaction().commit() - -## if self.savename: -## print 'save to file' -## config = ConfigParser.ConfigParser() -## tmppath = os.path.join("data", "grid.ini") -## if os.path.exists(tmppath): -## print "ini exists" -## config.read(tmppath) -## if config.has_section(self.savename): -## print "removing section" -## config.remove_section(self.savename) -## outfile = open(tmppath,'ab') -## config.add_section(self.savename) -## config.set(self.savename, 'display',display_list) -## config.write(outfile) -## outfile.close() - -## def ConfigGrid(self, event = None): -## #if not self.already_showing_config: -## #print 'call config screen' -## tmpsize = wxSize(750, 500) -## #testframe = toolframe.toolFrame(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize) -## testframe = wxDialog(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize, -## style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME ) -## print "configgrid", self.DisplayMapping -## testframe.mainpanel = CustomizeGrid(testframe, -1, disp_objs = self.table._data, old_mapping = self.DisplayMapping) -## testframe.CentreOnParent() -## result = testframe.ShowModal() -## if result == wxID_OK: -## self.DisplayMapping = testframe.mainpanel.GetDisplayList() -## print 'getdisplaylist returned: %s' % self.DisplayMapping -## self.SaveDisplay(self.DisplayMapping) -## self.table.SetDisplayMapping(self.DisplayMapping) -## self.table.RefreshGrid() -## self.AutoSizeColumns() def QuickCreate(self, event = None): result = quickcreate.showQuickCreate(self) @@ -363,10 +75,6 @@ #result = self.DataManager.quickCreate(result) #print result - -## def GetObjectOid(self, row): -## return self.table.GetObjectOid(row) - #--------------------------------------------------------------------------- Index: PanGalactic/pangalactic/utils/__init__.py diff -u PanGalactic/pangalactic/utils/__init__.py:1.3 PanGalactic/pangalactic/utils/__init__.py:1.4 --- PanGalactic/pangalactic/utils/__init__.py:1.3 Tue Jul 8 22:14:13 2003 +++ PanGalactic/pangalactic/utils/__init__.py Wed Oct 1 13:24:14 2003 @@ -4,7 +4,8 @@ 'configdbbrowser', 'configdbbrowser_wdr', 'convertimage', -'customizegrid', +'configuregrid', +'configuredisplay', 'customizegrid_wdr', 'datamanager', 'data_utils', Index: PanGalactic/pangalactic/utils/basegrid.py diff -u PanGalactic/pangalactic/utils/basegrid.py:1.10 PanGalactic/pangalactic/utils/basegrid.py:1.11 --- PanGalactic/pangalactic/utils/basegrid.py:1.10 Thu Sep 25 13:33:34 2003 +++ PanGalactic/pangalactic/utils/basegrid.py Wed Oct 1 13:24:14 2003 @@ -12,7 +12,7 @@ from pangalactic.utils import pgefexceptions from pangalactic.utils import pgefdatatable -from pangalactic.utils.customizegrid import * +from pangalactic.utils.configuregrid import * ID_POPUP_CONFIG_GRID = wxNewId() ID_POPUP_CLEAR_SELECTION = wxNewId() @@ -40,6 +40,7 @@ grid columns and to fill a row of data given the data in a list format""" def __init__(self, parent, id, savename = None, dbroot = None, intable = None): wxGrid.__init__(self, parent, id) + #print "\nbasegrid.init" self.SetColLabelSize(48) self.AutoSizeColumns(true) @@ -57,10 +58,17 @@ self.dbroot = dbroot self.savename = savename if len(self.table.GetDisplayMapping()) == 0: + #print "basegrid.init.displaymapping empty", savename self.DisplayMapping = self.RetrieveDisplay() + #if self.DisplayMapping: + #print "displaymapping", self.DisplayMapping[0] + #else: + #print "displaymapping", self.DisplayMapping self.table.SetDisplayMapping(self.DisplayMapping) else: + #print "basegrid.init.displaymapping exists", savename self.DisplayMapping = self.table.GetDisplayMapping() + self.RefreshDisplay(self.DisplayMapping) evthandler = pgefevents.PgefDragDropHandler(self) @@ -79,6 +87,7 @@ self.SetDefaultCellOverflow(false) self.FitInside() EVT_GRID_COL_MOVE(self,self.GetId(),self.OnColMove) + #print "end basegrid.init" # Event method called when a column move needs to take place @@ -345,72 +354,91 @@ def RetrieveDisplay(self): + #print "basegrid.retrievedisplay", self.savename done = None if self.dbroot and self.savename: + #print "dbroot and savename" if self.dbroot.has_key('config_grid'): + #print "config_grid" if self.dbroot['config_grid'].has_key(self.savename): + #print "have key", self.savename done = self.dbroot['config_grid'][self.savename] else: + #print "not (dbroot and savename)" config = ConfigParser.ConfigParser() tmppath = os.path.join("data", "grid.ini") if os.path.exists(tmppath): + #print "have ini file" config.read(tmppath) temp = config.get(self.savename, 'display') temp = temp.replace("'", "") temp = temp[2:-2] temp = temp.split('), (') done = [element.split(',') for element in temp] + #print "end retrievedisplay" return done def SaveDisplay(self, display_list): - print "save display config", display_list + #print "save display config" + #if display_list: + #print "displaylist", display_list[0] + #else: + #print "displaylist", display_list if self.dbroot: - print "save to zodb" + #print "save to zodb" temp = {} temp[self.savename] = display_list self.dbroot['config_grid'] = temp get_transaction().commit() if self.savename: - print 'save to file' + #print 'save to file', self.savename config = ConfigParser.ConfigParser() tmppath = os.path.join("data", "grid.ini") if os.path.exists(tmppath): - print "ini exists" + #print "ini exists" config.read(tmppath) if config.has_section(self.savename): - print "removing section" + #print "removing section" config.remove_section(self.savename) - outfile = open(tmppath,'ab') + +# outfile = open(tmppath, 'ab') # config is in memory; don't append; overwrite. + outfile = open(tmppath, "w+") config.add_section(self.savename) - config.set(self.savename, 'display',display_list) + config.set(self.savename, 'display', display_list) config.write(outfile) outfile.close() def ConfigGrid(self, event = None): - print "basegrid.configgrid" + #print "basegrid.configgrid" #if not self.already_showing_config: #print 'call config screen' tmpsize = wxSize(750, 500) testframe = wxDialog(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize, style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME ) - print "configgrid", self.DisplayMapping - testframe.mainpanel = CustomizeGrid(testframe, -1, + #if self.DisplayMapping: + #print "oldmapping", self.DisplayMapping[0] + #else: + #print "oldmapping", self.DisplayMapping + testframe.mainpanel = ConfigureGrid(testframe, -1, disp_objs = self.table._data, old_mapping = self.DisplayMapping) testframe.CentreOnParent() result = testframe.ShowModal() if result == wxID_OK: + #print "ok to save" self.DisplayMapping = testframe.mainpanel.GetDisplayList() - print 'getdisplaylist returned: %s' % self.DisplayMapping + #if self.DisplayMapping: + #print "newmapping", self.DisplayMapping[0] + #else: + #print "newmapping", self.DisplayMapping self.SaveDisplay(self.DisplayMapping) self.RefreshDisplay(self.DisplayMapping) -# self.table.SetDisplayMapping(self.DisplayMapping) -# self.table.RefreshGrid() -# self.AutoSizeColumns() + def RefreshDisplay(self, displaymapping = None): + #print "basegrid.refreshdisplay" if displaymapping: self.table.SetDisplayMapping(displaymapping) else: Index: PanGalactic/pangalactic/utils/configdbbrowser.py diff -u PanGalactic/pangalactic/utils/configdbbrowser.py:1.3 PanGalactic/pangalactic/utils/configdbbrowser.py:1.4 --- PanGalactic/pangalactic/utils/configdbbrowser.py:1.3 Wed Jun 25 04:32:12 2003 +++ PanGalactic/pangalactic/utils/configdbbrowser.py Wed Oct 1 13:24:14 2003 @@ -1,81 +1,37 @@ #!/bin/env python #---------------------------------------------------------------------------- # Name: configdbbrowser.py -# Author: XXXX -# Created: XX/XX/XX +# Author: +# Created: # Copyright: #---------------------------------------------------------------------------- from wxPython.wx import * -from pangalactic.utils.configdbbrowser_wdr import * from wxPython.lib.mixins.listctrl import wxColumnSorterMixin +from pangalactic.utils.configuredisplay import ConfigureDisplay # WDR: classes DISPLAY_CONFIG = "display_config" -class ConfigDbBrowser(wxPanel, wxColumnSorterMixin): +class ConfigDbBrowser(ConfigureDisplay, wxColumnSorterMixin): def __init__(self, parent, id, - pos = wxPyDefaultPosition, size = wxPyDefaultSize, - style = wxTAB_TRAVERSAL, dbroot = None, collection_name = None): - wxPanel.__init__(self, parent, id, pos, size, style) - self.Parent = parent + pos = wxPyDefaultPosition, + size = wxPyDefaultSize, + style = wxTAB_TRAVERSAL, + dbroot = None, + collection_name = None): + ConfigureDisplay.__init__(self, parent, id, pos, size, style) + self.collection_name = collection_name self.dbroot = dbroot - self.collection_name = collection_name - - self.attr_list = self.CreateAttributeList() self.current_config = {} - - ConfigDisplayFunc(self, true) - self.grid = self.GetGridMap() - wxColumnSorterMixin.__init__(self, 1) self.Setup() - self.ReloadSelections() - # WDR: handler declarations for ConfigDbBrowser - EVT_BUTTON(self, ID_BITMAPBUTTON_UP, self.OnMoveUp) - EVT_BUTTON(self, ID_BITMAPBUTTON_DOWN, self.OnMoveDown) EVT_BUTTON(self, wxID_CANCEL, self.OnCancel) - EVT_BUTTON(self, wxID_OK, self.OnOK) - EVT_BUTTON(self, ID_BTN_REMOVEALL, self.OnRemoveAll) - EVT_BUTTON(self, ID_BTN_REMOVE, self.OnRemove) - EVT_BUTTON(self, ID_BTN_ADD, self.OnAdd) - EVT_BUTTON(self, ID_BTN_ADDALL, self.OnAddAll) - EVT_LIST_ITEM_SELECTED(self, ID_LISTCTRL_SHOWN, self.OnShownItemClick) - - # WDR: methods for ConfigDbBrowser - - def GetBitmapbuttonDown(self): - return wxPyTypeCast( self.FindWindowById(ID_BITMAPBUTTON_DOWN), "wxBitmapButton" ) - - def GetBitmapbuttonUp(self): - return wxPyTypeCast( self.FindWindowById(ID_BITMAPBUTTON_UP), "wxBitmapButton" ) - - def GetGridMap(self): - return wxPyTypeCast( self.FindWindowById(ID_GRID_MAP), "wxGrid" ) - - def GetCancel(self): - return wxPyTypeCast( self.FindWindowById(wxID_CANCEL), "wxButton" ) - - def GetOk(self): - return wxPyTypeCast( self.FindWindowById(wxID_OK), "wxButton" ) - - def GetBtnRemoveall(self): - return wxPyTypeCast( self.FindWindowById(ID_BTN_REMOVEALL), "wxBitmapButton" ) - - def GetBtnAdd(self): - return wxPyTypeCast( self.FindWindowById(ID_BTN_ADD), "wxBitmapButton" ) - def GetBtnAddall(self): - return wxPyTypeCast( self.FindWindowById(ID_BTN_ADDALL), "wxBitmapButton" ) - - def GetListctrlShown(self): - return wxPyTypeCast( self.FindWindowById(ID_LISTCTRL_SHOWN), "wxListCtrl" ) - - def GetListctrlAvailable(self): - return wxPyTypeCast( self.FindWindowById(ID_LISTCTRL_AVAILABLE), "wxListCtrl" ) def Setup(self): + #print "configdbb.setup" self.GetListctrlAvailable().ClearAll() self.GetListctrlAvailable().InsertColumn(0, "Attribute Names") self.GetListctrlAvailable().SetColumnWidth(0, wxLIST_AUTOSIZE_USEHEADER) @@ -89,14 +45,18 @@ self.grid.DeleteRows(0, rows) self.grid.SetColLabelValue(0, 'Attribute Name') self.grid.SetColLabelValue(1, 'Display Name') - self.grid.SetColSize(0,200) - self.grid.SetColSize(1,200) + self.grid.SetColSize(0, 200) + self.grid.SetColSize(1, 200) + self.attr_list = self.CreateAttributeList() if self.attr_list: + #print "have attr_list" self.FillAvailable() - self.grid.MakeCellVisible(0,0) + self.grid.MakeCellVisible(0, 0) + self.ReloadSelections() def CreateAttributeList(self): """Creates the list of all available attribute names in the entire collection""" + #print "configdbb.createattributelist" temp = {} collection = self.dbroot[self.collection_name] if isinstance(collection, list): @@ -109,27 +69,33 @@ def ReloadSelections(self): """Reloads the shown listctrl with the previous selections and also updates the grid""" + #print "configdbb.reloadselections" #Get the list of tuples that are attr name and display name if self.dbroot.has_key(DISPLAY_CONFIG): + #print "have display_config" if self.dbroot[DISPLAY_CONFIG].has_key(self.collection_name): + #print "displaymapping", DISPLAY_CONFIG, self.collection_name selections = self.dbroot[DISPLAY_CONFIG][self.collection_name] #loop through th elist and set the item as selected in the available listctrl for attrname, dispname in selections: + #print "attrname, dispname: (%s, %s)" % (attrname, dispname) ndx = self.GetListctrlAvailable().FindItem(-1, attrname) - self.GetListctrlAvailable().SetItemState ( ndx, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED) + self.GetListctrlAvailable().SetItemState (ndx, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED) #move all the selected entries to the shown listctrl self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown()) #once again loop the list and put the display name into the grid for attrname, dispname in selections: + #print "displaynames (%s, %s)" % (attrname, dispname) ndx = self.GetListctrlShown().FindItem(-1, attrname) - self.grid.SetCellValue(ndx,1, dispname) + self.grid.SetCellValue(ndx, 1, dispname) def SaveConfig(self): + #print "saveconfig" disp_list = self.GetDisplayList() if not self.current_config: self.ReadConfig() @@ -139,12 +105,17 @@ get_transaction().commit() def ReadConfig(self): + #print "configdbb.readconfig" try: self.current_config = self.dbroot[DISPLAY_CONFIG] + #print "current_config" + #print self.current_config except: + #print "======> exception" self.current_config = {} def GetDisplayList(self): + #print "configdbb.getdisplaylist" numrows = self.grid.GetNumberRows() temp = [] for x in range(numrows): @@ -153,150 +124,7 @@ temp.append((cell_zero, cell_one)) return temp - def GetListCtrl(self): - return self.GetListctrlAvailable() - - def _getSelectedIndices( self, list_widget, state = wxLIST_STATE_SELECTED): - indices = [] - found = 1 - lastFound = -1 - while found: - index = list_widget.GetNextItem( - lastFound, - wxLIST_NEXT_ALL, - state, - ) - if index == -1: - break - else: - lastFound = index - indices.append( index ) - return indices - - def FillAvailable(self): - if self.attr_list: - temp_list = zip(range(len(self.attr_list)), self.attr_list) - self.itemDataMap = {} - for ndx, attr_string in temp_list: - self.itemDataMap[ndx] = attr_string - self.GetListctrlAvailable().InsertStringItem(ndx,attr_string) - self.GetListctrlAvailable().SetItemData(ndx, ndx) - self.GetListctrlAvailable().SetColumnWidth(0, wxLIST_AUTOSIZE) - self.SortListItems(0,true) - - def LookupData(self, text): - for key, value in self.itemDataMap.items(): - if value == text: - return key - - - def MoveSelections(self, from_list, to_list, move_all = None): - remove_from_grid = 0 - if move_all: - selected_ndxs = range(from_list.GetItemCount()) - else: - selected_ndxs = self._getSelectedIndices(from_list) - - if from_list == self.GetListctrlShown(): - remove_from_grid = 1 - - for ndx in selected_ndxs: - move_text = from_list.GetItemText(ndx) - move_data = self.LookupData(move_text) - to_list.InsertStringItem(to_list.GetItemCount(), move_text) - to_list.SetItemData(to_list.GetItemCount() -1, move_data) - - if not remove_from_grid: - self.grid.AppendRows(1) - map_ndx = self.grid.GetNumberRows() - - self.grid.SetCellValue(map_ndx -1,0, move_text) - self.grid.SetReadOnly(map_ndx -1,0) - self.grid.SetCellBackgroundColour(map_ndx -1,0, wxLIGHT_GREY) - - selected_ndxs.sort() - selected_ndxs.reverse() - for ndx in selected_ndxs: - from_list.DeleteItem(ndx) - if remove_from_grid: - self.grid.DeleteRows(ndx, 1) - - def MoveInList(self, list_obj, direction): - #get the selected text and text - current_ndx = self._getSelectedIndices(self.GetListctrlShown()) - #since _getSelected returns a list, convert it to a single integer - current_ndx = current_ndx[0] - - if current_ndx == 0 and direction == -1: - return - if current_ndx == list_obj.GetItemCount() - 1 and direction == 1: - return - - selected_text = list_obj.GetItemText(current_ndx) - selected_data = list_obj.GetItemData(current_ndx) - - #delete the current item - list_obj.DeleteItem(current_ndx) - - #re-insert the item at current_ndx -1 - if direction > 0: - new_index = current_ndx + 1 - elif direction < 0: - new_index = current_ndx - 1 - list_obj.InsertStringItem(new_index, selected_text) - - #reset its data as well - list_obj.SetItemData(new_index , selected_data) - - #re-select it so we can move it again if needed - list_obj.SetItemState(new_index, wxLIST_STATE_SELECTED, wxLIST_STATE_SELECTED) - list_obj.EnsureVisible(new_index) - - #move the item in the grid to keep them synced - self.MoveInGrid(self.grid, current_ndx, direction) - - def MoveInGrid(self, grid_obj, current_ndx, direction): - if current_ndx == 0 and direction == -1: - return - if current_ndx == grid_obj.GetNumberRows() -1 and direction == 1: - return - current_row_data = [] - grid_obj.ClearSelection() - for x in range(grid_obj.GetNumberCols()): - current_row_data.append(grid_obj.GetCellValue(current_ndx, x)) - - #delete the current item - grid_obj.DeleteRows(current_ndx, 1) - - #re-insert the item at current_ndx -1 - if direction > 0: - new_index = current_ndx + 1 - elif direction < 0: - new_index = current_ndx - 1 - - grid_obj.InsertRows(new_index, 1) - grid_obj.SetCellBackgroundColour(new_index, 0, wxLIGHT_GREY) - grid_obj.SelectRow(new_index) - for x in range(len(current_row_data)): - grid_obj.SetCellValue(new_index,x, current_row_data[x]) - - - - # WDR: handler implementations for ConfigDbBrowser - def OnShownItemClick(self, event): - currentItem = event.m_itemIndex - self.grid.ClearSelection() - self.grid.MakeCellVisible(currentItem, 0) - self.grid.SelectRow(currentItem) - - - def OnMoveUp(self, event): - self.MoveInList(self.GetListctrlShown(), -1) - - def OnMoveDown(self, event): - self.MoveInList(self.GetListctrlShown(), 1) - def OnCancel(self, event): self.Parent.Close() @@ -304,27 +132,3 @@ self.SaveConfig() self.Parent.Close() - def OnRemoveAll(self, event): - self.grid.BeginBatch() - self.GetListctrlShown().DeleteAllItems() - self.GetListctrlAvailable().DeleteAllItems() - self.FillAvailable() - rows = self.grid.GetNumberRows() - self.grid.DeleteRows(0, rows) - self.grid.EndBatch() - - def OnRemove(self, event): - self.MoveSelections(self.GetListctrlShown(), self.GetListctrlAvailable()) - self.SortListItems(0,true) - - def OnAdd(self, event): - self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown()) - - def OnAddAll(self, event): - self.grid.BeginBatch() - self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown(), move_all = 1) - self.grid.EndBatch() - #evt = wxSizeEvent( self.Parent.GetSize() ) - #wxPostEvent(self.Parent, evt) - self.Parent.ProcessEvent(wxSizeEvent(self.Parent.GetSize())) - From pbear at ned.gsfc.nasa.gov Wed Oct 1 14:27:56 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 1 13:27:58 2003 Subject: [Pangalactic-commits] fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay Message-ID: <200310011727.h91HRuVJ014355@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/configuredisplay.py None 1.1 Log message: fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay From pbear at ned.gsfc.nasa.gov Wed Oct 1 14:28:21 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 1 13:28:22 2003 Subject: [Pangalactic-commits] fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay Message-ID: <200310011728.h91HSLUI014396@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/configuregrid.py None 1.1 Log message: fixed grid configuration; both configdbbrowser and configuregrid extend new class configuredisplay From waterbug at ned.gsfc.nasa.gov Wed Oct 1 14:35:29 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 1 13:35:30 2003 Subject: [Pangalactic-commits] Add _pk and _fk attributes. Message-ID: <200310011735.h91HZT30014581@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/assemblycomponentusage.py 1.15 1.16 PanGalactic/pangalactic/enterprise/category.py 1.3 1.4 PanGalactic/pangalactic/enterprise/dmcomponentusage.py 1.8 1.9 PanGalactic/pangalactic/enterprise/docmaster.py 1.9 1.10 PanGalactic/pangalactic/enterprise/docrep.py 1.12 1.13 PanGalactic/pangalactic/enterprise/docversion.py 1.10 1.11 PanGalactic/pangalactic/enterprise/drfile.py 1.6 1.7 PanGalactic/pangalactic/enterprise/pgefobject.py 1.24 1.25 PanGalactic/pangalactic/enterprise/productmaster.py 1.15 1.16 PanGalactic/pangalactic/enterprise/productmodelmaster.py 1.16 1.17 PanGalactic/pangalactic/enterprise/productmodelversion.py 1.19 1.20 PanGalactic/pangalactic/enterprise/productversion.py 1.18 1.19 Log message: Add _pk and _fk attributes. Index: PanGalactic/pangalactic/enterprise/productmodelmaster.py diff -u PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.16 PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.17 --- PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.16 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/productmodelmaster.py Wed Oct 1 13:35:27 2003 @@ -1,4 +1,4 @@ -# $Id: productmodelmaster.py,v 1.16 2003/09/29 18:39:59 waterbug Exp $ +# $Id: productmodelmaster.py,v 1.17 2003/10/01 17:35:27 waterbug Exp $ """ Version-independent product model data. @@ -10,7 +10,7 @@ default one? ... """ -__version__ = "$Revision: 1.16 $"[11:-2] +__version__ = "$Revision: 1.17 $"[11:-2] from pangalactic.enterprise.project import Project from pangalactic.enterprise.productmaster import ProductMaster @@ -46,6 +46,14 @@ # These are the fields that will appear in when an item is # placed in a grid. The format for each field is [ Label, # attribute, field_type ]. + _fk = {'_project' : ['project_id', + 'project_id_context'], + '_of_master' : ['of_pm_id', + 'of_pm_id_context'], + '_of_version' : ['of_pv_id', + 'of_pm_id', + 'of_pm_id_context'] + } _gridmap = [ ['Part\nNumber', 'self.of_pm_id', 'string'], ['Part\nVersion', 'self.of_pv_id', 'string'], @@ -54,16 +62,22 @@ ['Model\nName', 'self.short_description', 'string'], ['Model\nOwner', 'self.owner', 'string'] ] + _pk = [ + 'id', + 'of_pv_id', + 'of_pm_id', + 'of_pm_id_context' + ] _schema_ext = { - 'of_pm_id' : 'str', - 'of_pm_id_context' : 'str', - 'of_pv_id' : 'str', - 'frame_of_reference' : 'str', - 'life_cycle_stage' : 'str', - 'model_definition_context' : 'str', - 'model_view' : 'str', - 'step_subtype' : 'str' - } + 'of_pm_id' : 'str', + 'of_pm_id_context' : 'str', + 'of_pv_id' : 'str', + 'frame_of_reference' : 'str', + 'life_cycle_stage' : 'str', + 'model_definition_context' : 'str', + 'model_view' : 'str', + 'step_subtype' : 'str' + } _schema = _schema_ext.copy() _schema.update(ProductMaster._schema) # These are the minimum fields that must be filled in before @@ -73,10 +87,10 @@ # this info is used by the PgerObjectRegistry and # PgerObjectFactory. _refd = { - '_project' : 'Project', - '_of_master' : 'ProductMaster', - '_of_version' : 'ProductVersion' - } + '_project' : 'Project', + '_of_master' : 'ProductMaster', + '_of_version' : 'ProductVersion' + } # Standard abbreviation for the class name (used in the # PgerObjectRegistry to compute the names of foreign key # constraints) Index: PanGalactic/pangalactic/enterprise/docversion.py diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.10 PanGalactic/pangalactic/enterprise/docversion.py:1.11 --- PanGalactic/pangalactic/enterprise/docversion.py:1.10 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/docversion.py Wed Oct 1 13:35:27 2003 @@ -1,10 +1,10 @@ -# $Id: docversion.py,v 1.10 2003/09/29 18:39:59 waterbug Exp $ +# $Id: docversion.py,v 1.11 2003/10/01 17:35:27 waterbug Exp $ """ Version-specific attributes of a document. """ -__version__ = "$Revision: 1.10 $"[11:-2] +__version__ = "$Revision: 1.11 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docmaster import DocMaster as DM @@ -29,18 +29,24 @@ ] _excluded_fields = PgefObject._excluded_fields _excluded_fields += _excluded_fields_ext + _fk = {'_of_master' : ['of_dm_id', + 'of_dm_id_context'] + } _gridmap = [ ['Title', 'self._of_master.name'], ['Abstract' , 'self.abstract'] ] + _pk = [ + 'id', + 'of_dm_id', + 'of_dm_id_context' + ] _properties = PgefObject._properties.copy() _required = [ 'id', 'creator' ] - _refd = { - '_of_master' : 'DocMaster' - } + _refd = {'_of_master' : 'DocMaster'} _schema_ext = { 'of_dm_id' : 'str', 'of_dm_id_context' : 'str', Index: PanGalactic/pangalactic/enterprise/productmaster.py diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.15 PanGalactic/pangalactic/enterprise/productmaster.py:1.16 --- PanGalactic/pangalactic/enterprise/productmaster.py:1.15 Mon Sep 29 14:47:56 2003 +++ PanGalactic/pangalactic/enterprise/productmaster.py Wed Oct 1 13:35:27 2003 @@ -1,10 +1,10 @@ -# $Id: productmaster.py,v 1.15 2003/09/29 18:47:56 pbear Exp $ +# $Id: productmaster.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $ """ Version-independent product data. """ -__version__ = "$Revision: 1.15 $"[11:-2] +__version__ = "$Revision: 1.16 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -37,6 +37,9 @@ _excluded_dump = ['Mark', 'Drag'] # These are the fields that will appear in when an item is placed in a grid. # The format for each field is [ Label, attribute, field_type ]. + _fk = {'_project' : ['project_id', + 'project_id_context'] + } _gridmap = [ ['Part\nNumber','self.id', 'string'], ['Name\nCode','self.name', 'string'], @@ -45,6 +48,7 @@ ['Created','self.create_datetime', 'string'], ['Creator','self.creator', 'string'] ] + _pk = ['id', 'id_context'] _schema_ext = { 'project_id' : 'str', 'project_id_context' : 'str', Index: PanGalactic/pangalactic/enterprise/docrep.py diff -u PanGalactic/pangalactic/enterprise/docrep.py:1.12 PanGalactic/pangalactic/enterprise/docrep.py:1.13 --- PanGalactic/pangalactic/enterprise/docrep.py:1.12 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/docrep.py Wed Oct 1 13:35:27 2003 @@ -1,10 +1,10 @@ -# $Id: docrep.py,v 1.12 2003/09/29 18:39:59 waterbug Exp $ +# $Id: docrep.py,v 1.13 2003/10/01 17:35:27 waterbug Exp $ """ A representation or format of a document. """ -__version__ = "$Revision: 1.12 $"[11:-2] +__version__ = "$Revision: 1.13 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docversion import DocVersion as DV @@ -32,16 +32,22 @@ _excluded_fields = PgefObject._excluded_fields _excluded_fields += _excluded_fields_ext _excluded_dump = [] + _fk = {'of_version' : ['of_dv_id', + 'of_dm_id', + 'of_dm_id_context'] + } _gridmap = [ ['Title', 'self._of_version.name'], ['Abstract' , 'self._of_version.abstract'], ['Type' , 'self.Type'] ] + _pk = ['id', + 'of_dv_id', + 'of_dm_id', + 'of_dm_id_context'] _properties = PgefObject._properties.copy() _required = [] - _refd = { - '_of_version' : 'DocVersion' - } + _refd = {'_of_version' : 'DocVersion'} _schema_ext = { 'of_dv_id' : 'str', 'of_dm_id' : 'str', Index: PanGalactic/pangalactic/enterprise/docmaster.py diff -u PanGalactic/pangalactic/enterprise/docmaster.py:1.9 PanGalactic/pangalactic/enterprise/docmaster.py:1.10 --- PanGalactic/pangalactic/enterprise/docmaster.py:1.9 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/docmaster.py Wed Oct 1 13:35:27 2003 @@ -1,10 +1,10 @@ -# $Id: docmaster.py,v 1.9 2003/09/29 18:39:59 waterbug Exp $ +# $Id: docmaster.py,v 1.10 2003/10/01 17:35:27 waterbug Exp $ """ Version-independent attributes of a document. """ -__version__ = "$Revision: 1.9 $"[11:-2] +__version__ = "$Revision: 1.10 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject @@ -24,20 +24,22 @@ _default_display_names = {} _default_display_types = {} # _excluded_fields are those inherited from PgefObject + _fk = {} _gridmap = [ ['Title', 'self.name'], ['Type' , 'self.doc_type_code'] ] _properties = PgefObject._properties.copy() - _required = [ - 'id' - ] + _required = ['id'] + # when we create a DocType class, refd will contain that, but + # in the meantime, it's empty ... + _pk = ['id', 'id_context'] _refd = {} _schema_ext = { - 'doc_type_code' : 'str', - 'doc_type_code_context' : 'str', - 'structural_role' : 'str' - } + 'doc_type_code' : 'str', + 'doc_type_code_context' : 'str', + 'structural_role' : 'str' + } _schema = _schema_ext.copy() _schema.update(PgefObject._schema) _std_abbrev = 'dm' Index: PanGalactic/pangalactic/enterprise/assemblycomponentusage.py diff -u PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.15 PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.16 --- PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.15 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/assemblycomponentusage.py Wed Oct 1 13:35:27 2003 @@ -1,11 +1,11 @@ -# $Id: assemblycomponentusage.py,v 1.15 2003/09/29 18:39:59 waterbug Exp $ +# $Id: assemblycomponentusage.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $ """ The relationship between an assembled product and a part that is used in it. """ -__version__ = "$Revision: 1.15 $"[11:-2] +__version__ = "$Revision: 1.16 $"[11:-2] from pangalactic.utils import oid from pangalactic.enterprise.pgefobject import PgefObject @@ -29,13 +29,25 @@ _default_display_names = {} _default_display_types = {} # _excluded_fields are those inherited from PgefObject + _fk = {'_assembly' : ['assembly_id', + 'assembly_of_pmm_id', + 'assembly_of_pv_id', + 'assembly_of_pm_id', + 'assembly_of_pm_id_context'], + '_component' : ['component_id', + 'component_of_pmm_id', + 'component_of_pv_id', + 'component_of_pm_id', + 'component_of_pm_id_context'] + } _gridmap = [ - ['Type','self.subtype', 'string'], - ['Assembly PN','self.assembly_of_pm_id', 'string'], - ['Component PN','self.component_of_pm_id', 'string'], - ['Delete','self.Delete', 'boolean'], - ['Ref Designator','self.ref_designator', 'string'] + ['Type', 'self.subtype', 'string'], + ['Assembly PN', 'self.assembly_of_pm_id', 'string'], + ['Component PN', 'self.component_of_pm_id', 'string'], + ['Delete', 'self.Delete', 'boolean'], + ['Ref Designator', 'self.ref_designator', 'string'] ] + _pk = ['pgef_oid'] _properties = PgefObject._properties.copy() _schema_ext = { 'assembly_id' : 'str', @@ -59,7 +71,7 @@ # is used by the PgerObjectRegistry and the # PgerObjectFactory. _refd = {'_assembly' : 'ProductModelVersion', - '_component' : 'ProductModelVersion'} + '_component' : 'ProductModelVersion'} # Standard abbreviation for the class name (used in the # PgerObjectRegistry to compute the names of foreign key # constraints) Index: PanGalactic/pangalactic/enterprise/category.py diff -u PanGalactic/pangalactic/enterprise/category.py:1.3 PanGalactic/pangalactic/enterprise/category.py:1.4 --- PanGalactic/pangalactic/enterprise/category.py:1.3 Mon Sep 15 16:08:59 2003 +++ PanGalactic/pangalactic/enterprise/category.py Wed Oct 1 13:35:27 2003 @@ -1,4 +1,4 @@ -# $Id: category.py,v 1.3 2003/09/15 20:08:59 waterbug Exp $ +# $Id: category.py,v 1.4 2003/10/01 17:35:27 waterbug Exp $ """ A data element that supports customizable object taxonomies. @@ -17,13 +17,16 @@ _default_display_types = {} # _excluded_fields are those inherited from PgefObject _excluded_dump = [] + _fk = {} _gridmap = [ ['ID', 'self.id'], ['Name' , 'self.name'], ['Definition' , 'self.long_description'] ] + _pk = ['id', 'id_context'] _properties = PgefObject._properties.copy() _schema = PgefObject._schema.copy() + _refd = {} _required = [ 'id', 'creator', Index: PanGalactic/pangalactic/enterprise/drfile.py diff -u PanGalactic/pangalactic/enterprise/drfile.py:1.6 PanGalactic/pangalactic/enterprise/drfile.py:1.7 --- PanGalactic/pangalactic/enterprise/drfile.py:1.6 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/drfile.py Wed Oct 1 13:35:27 2003 @@ -1,10 +1,10 @@ -# $Id: drfile.py,v 1.6 2003/09/29 18:39:59 waterbug Exp $ +# $Id: drfile.py,v 1.7 2003/10/01 17:35:27 waterbug Exp $ """ A file that contains an instance of a document. """ -__version__ = "$Revision: 1.6 $"[11:-2] +__version__ = "$Revision: 1.7 $"[11:-2] from pangalactic.enterprise.pgeffile import PgefFile from pangalactic.enterprise.docversion import DocVersion as DV @@ -21,40 +21,49 @@ 'of_dm_id', 'of_dm_id_context', 'of_dv_id' + 'of_dr_id' ] _excluded_fields = PgefFile._excluded_fields _excluded_fields += _excluded_fields_ext _excluded_dump = [] + _fk = {'DocRep' : ['of_dm_id', + 'of_dm_id_context', + 'of_dv_id' + 'of_dr_id'] + } _gridmap = [] + _pk = ['pgef_oid'] _properties = PgefFile._properties.copy() _required = [] - _refd = {} + _refd = {'_of_dr' : 'DocRep'} _schema_ext = { - 'dm_id' : 'str', - 'dm_id_context' : 'str', - 'dv_id' : 'str', - 'dr_id' : 'str' + 'of_dm_id' : 'str', + 'of_dm_id_context' : 'str', + 'of_dv_id' : 'str', + 'of_dr_id' : 'str' } _schema = _schema_ext.copy() _schema.update(PgefFile._schema) _std_abbrev = 'df' def __init__(self, email=None, schema=_schema, - dv=None, **kw): + dr=None, **kw): PgefFile.__init__(self, email=email, schema=schema, **kw) # if a dv is passed in, use it ... - if dv.__class__.__name__ == 'DocVersion': - self._of_version = dv + if dr.__class__.__name__ == 'DocRep': + self._of_dr = dr else: # if not, create one ... + drid = kw.get('of_dr_id', '1') dvid = kw.get('of_dv_id', '1') dvdmid = kw.get('of_dm_id', 'Document Master Identifier') dvdmidc = kw.get('of_dm_id_context', 'PGER') - self._of_version = DV(id=dvid, - of_dm_id=dvdmid, - of_dm_id_context=dvdmidc) + self._of_dr = DR(id=drid, + of_dv_id=dvid, + of_dm_id=dvdmid, + of_dm_id_context=dvdmidc) # pull in _of_master from the _of_version so we don't # have to go nuts with blah.blah.blah to get to # attributes of my parents ... Index: PanGalactic/pangalactic/enterprise/dmcomponentusage.py diff -u PanGalactic/pangalactic/enterprise/dmcomponentusage.py:1.8 PanGalactic/pangalactic/enterprise/dmcomponentusage.py:1.9 --- PanGalactic/pangalactic/enterprise/dmcomponentusage.py:1.8 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/dmcomponentusage.py Wed Oct 1 13:35:27 2003 @@ -1,10 +1,10 @@ -# $Id: dmcomponentusage.py,v 1.8 2003/09/29 18:39:59 waterbug Exp $ +# $Id: dmcomponentusage.py,v 1.9 2003/10/01 17:35:27 waterbug Exp $ """ An occurance of a document as a component of another document. """ -__version__ = "$Revision: 1.8 $"[11:-2] +__version__ = "$Revision: 1.9 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject @@ -18,14 +18,18 @@ _default_display_names = {} _default_display_types = {} # _excluded_fields are those inherited from PgefObject + _fk = {'_assembly_dm' : ['assembly_dm_id', + 'assembly_dm_id_context'], + '_component_dm' : ['component_dm_id', + 'component_dm_id_context'] + } _excluded_dump = [] _gridmap = [] + _pk = ['pgef_oid'] _properties = PgefObject._properties.copy() + _refd = {'_assembly_dm' : 'DocMaster', + '_component_dm' : 'DocMaster'} _required = [] - # TODO: implement _refd as: - # '_parent_doc' : 'DocMaster', - # '_child_doc' : 'DocMaster' - _refd = {} _schema_ext = { 'assembly_dm_id' : 'str', 'assembly_dm_id_context' : 'str', @@ -39,7 +43,7 @@ _std_abbrev = 'dcu' def __init__(self, email=None, schema=_schema, - _parent_doc=None, _child_doc=None, **kw): + _assembly_dm=None, _component_dm=None, **kw): # TODO: this needs serious work -- should be set up # similar to ACU. PgefObject.__init__(self, email=email, Index: PanGalactic/pangalactic/enterprise/pgefobject.py diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.24 PanGalactic/pangalactic/enterprise/pgefobject.py:1.25 --- PanGalactic/pangalactic/enterprise/pgefobject.py:1.24 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/pgefobject.py Wed Oct 1 13:35:27 2003 @@ -1,8 +1,8 @@ -# $Id: pgefobject.py,v 1.24 2003/09/29 18:39:59 waterbug Exp $ +# $Id: pgefobject.py,v 1.25 2003/10/01 17:35:27 waterbug Exp $ """ The Mother of all PGEF application classes. -@version: $Revision: 1.24 $ +@version: $Revision: 1.25 $ """ # TODO: @@ -24,7 +24,7 @@ # should we jettison this? # Nope. -__version__ = "$Revision: 1.24 $"[11:-2] +__version__ = "$Revision: 1.25 $"[11:-2] import types import string @@ -101,6 +101,11 @@ 'Mark' and 'Drag' attributes given to objects in a grid). + @type _fk: dictionary + @cvar _fk: each attribute in _refd mapped to the list of + _schema attributes that constitute its foreign + key + @type _gridmap: list of lists @cvar _gridmap: defines which attributes are to be displayed when the object is presented in a grid, in @@ -110,6 +115,10 @@ - C{_gridmap = [ [display_name, attr_name, type], ...]} + @type _pk: list + @cvar _pk: _schema attributes that constitute the primary + key for this class + @type _properties: dictionary @cvar _properties: the names and types of all attributes that are computed as Python properties @@ -148,7 +157,9 @@ 'mod_datetime' ] _excluded_dump = [] + _fk = {} _gridmap = [] + _pk = [] _properties = {} _required = [] _refd = {} Index: PanGalactic/pangalactic/enterprise/productmodelversion.py diff -u PanGalactic/pangalactic/enterprise/productmodelversion.py:1.19 PanGalactic/pangalactic/enterprise/productmodelversion.py:1.20 --- PanGalactic/pangalactic/enterprise/productmodelversion.py:1.19 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/productmodelversion.py Wed Oct 1 13:35:27 2003 @@ -1,10 +1,10 @@ -# $Id: productmodelversion.py,v 1.19 2003/09/29 18:39:59 waterbug Exp $ +# $Id: productmodelversion.py,v 1.20 2003/10/01 17:35:27 waterbug Exp $ """ Version-dependent product model data. """ -__version__ = "$Revision: 1.19 $"[11:-2] +__version__ = "$Revision: 1.20 $"[11:-2] from pangalactic.enterprise.project import Project from pangalactic.enterprise.productversion import ProductVersion @@ -37,6 +37,18 @@ # comparisions between ProductModelVersion Objects _excluded_fields = ['create_datetime', 'pger_create_datetime', 'pgef_oid'] _excluded_dump = ['Mark', 'Drag'] + _fk = {'_project' : ['project_id', + 'project_id_context'], + '_of_master' : ['of_pm_id', + 'of_pm_id_context'], + '_of_version' : ['of_pv_id', + 'of_pm_id', + 'of_pm_id_context'], + '_of_model_master' : ['of_pmm_id', + 'of_pv_id', + 'of_pm_id', + 'of_pm_id_context'] + } # These are the fields that will appear in when an item is # placed in a grid. The format for each field is [ Label, # attribute, field_type ]. @@ -47,12 +59,19 @@ ['Model\nVersion', 'self.id', 'string'], ['Model\nVersion\nOwner', 'self.owner', 'string'] ] + _pk = [ + 'id', + 'of_pmm_id', + 'of_pv_id', + 'of_pm_id', + 'of_pm_id_context' + ] _schema_ext = { - 'of_pv_id' : 'str', - 'of_pmm_id' : 'str', - 'has_parts_flag' : 'bool', - 'has_parts_lists_flag' : 'bool' - } + 'of_pv_id' : 'str', + 'of_pmm_id' : 'str', + 'has_parts_flag' : 'bool', + 'has_parts_lists_flag' : 'bool' + } _schema = _schema_ext.copy() _schema.update(ProductVersion._schema) # These are the minimum fields that must be filled in before @@ -65,17 +84,17 @@ # PgerObjectFactory. # TODO: implement _owner, _creator, etc. ... _refd = { - # '_owner' : 'Person', - # '_creator' : 'Person', - # '_modifier' : 'Person', - # '_pger_owner' : 'Person', - # '_pger_creator' : 'Person', - # '_pger_modifier' : 'Person', - '_project' : 'Project', - '_of_master' : 'ProductMaster', - '_of_version' : 'ProductVersion', - '_of_model_master' : 'ProductModelMaster' - } + # '_owner' : 'Person', + # '_creator' : 'Person', + # '_modifier' : 'Person', + # '_pger_owner' : 'Person', + # '_pger_creator' : 'Person', + # '_pger_modifier' : 'Person', + '_project' : 'Project', + '_of_master' : 'ProductMaster', + '_of_version' : 'ProductVersion', + '_of_model_master' : 'ProductModelMaster' + } # Standard abbreviation for the class name (used in the # PgerObjectRegistry to compute the names of foreign key # constraints) Index: PanGalactic/pangalactic/enterprise/productversion.py diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.18 PanGalactic/pangalactic/enterprise/productversion.py:1.19 --- PanGalactic/pangalactic/enterprise/productversion.py:1.18 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/productversion.py Wed Oct 1 13:35:27 2003 @@ -1,12 +1,12 @@ -# $Id: productversion.py,v 1.18 2003/09/29 18:39:59 waterbug Exp $ +# $Id: productversion.py,v 1.19 2003/10/01 17:35:27 waterbug Exp $ """ Version-dependent product data. -@version: $Revision: 1.18 $ +@version: $Revision: 1.19 $ """ -__version__ = "$Revision: 1.18 $"[11:-2] +__version__ = "$Revision: 1.19 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -38,6 +38,11 @@ # comparisions between ProductVersion Objects _excluded_fields = ['create_datetime', 'pger_create_datetime', 'pgef_oid'] _excluded_dump = ['Mark', 'Drag'] + _fk = {'_project' : ['project_id', + 'project_id_context'], + '_of_master' : ['of_pm_id', + 'of_pm_id_context'] + } # These are the fields that will appear in when an item is # placed in a grid. The format for each field is [ Label, # attribute, field_type ]. @@ -49,6 +54,11 @@ ['Version\nCreated','self.create_datetime', 'string'], ['Version\nCreator','self.creator', 'string'] ] + _pk = [ + 'id', + 'of_pm_id', + 'of_pm_id_context' + ] _schema_ext = { 'of_pm_id' : 'str', 'of_pm_id_context' : 'str', @@ -66,9 +76,9 @@ # is used by the PgerObjectRegistry and the # PgerObjectFactory. _refd = { - '_project' : 'Project', - '_of_master' : 'ProductMaster' - } + '_project' : 'Project', + '_of_master' : 'ProductMaster' + } # Standard abbreviation for the class name (used in the # PgerObjectRegistry to compute the names of foreign key From pbear at ned.gsfc.nasa.gov Wed Oct 1 14:43:47 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 1 13:43:48 2003 Subject: [Pangalactic-commits] fixed doublearrow remove when list is empty Message-ID: <200310011743.h91HhlUo014885@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/configuredisplay.py 1.1 1.2 Log message: fixed doublearrow remove when list is empty Index: PanGalactic/pangalactic/utils/configuredisplay.py diff -u PanGalactic/pangalactic/utils/configuredisplay.py:1.1 PanGalactic/pangalactic/utils/configuredisplay.py:1.2 --- PanGalactic/pangalactic/utils/configuredisplay.py:1.1 Wed Oct 1 13:27:55 2003 +++ PanGalactic/pangalactic/utils/configuredisplay.py Wed Oct 1 13:43:46 2003 @@ -245,6 +245,8 @@ event.Skip() def OnRemoveAll(self, event): + if self.GetListctrlShown().GetItemCount() == 0: + return self.grid.BeginBatch() self.GetListctrlShown().DeleteAllItems() self.GetListctrlAvailable().DeleteAllItems() @@ -256,7 +258,7 @@ def OnRemove(self, event): self.MoveSelections(self.GetListctrlShown(), self.GetListctrlAvailable()) - self.SortListItems(0,true) + self.SortListItems(0, true) def OnAdd(self, event): self.MoveSelections(self.GetListctrlAvailable(), self.GetListctrlShown()) From pbear at ned.gsfc.nasa.gov Wed Oct 1 16:29:25 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 1 15:29:26 2003 Subject: [Pangalactic-commits] added edit to pgefgrid rclick popup menu Message-ID: <200310011929.h91JTP8u017688@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/fnord.py 1.62 1.63 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.57 1.58 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.113 1.114 PanGalactic/pangalactic/utils/basegrid.py 1.11 1.12 Log message: added edit to pgefgrid rclick popup menu Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.57 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.58 --- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.57 Wed Oct 1 13:24:13 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py Wed Oct 1 15:29:23 2003 @@ -48,32 +48,31 @@ basegrid.BaseGrid.__init__(self, parent, id, savename, dbroot, intable) def OnRightDown(self, event): +# print "onrightdown" if event.GetId() == self.GetId(): #print self.table.display_mapping #print self.table.identifiers menu = wxMenu() x,y = event.GetPosition() - menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections') - menu.AppendSeparator() + y -= self.GetColLabelSize() + curr_row = self.YToRow(y) +# print "curr_row", curr_row + if curr_row >= 0: + self.SelectRow(curr_row) + + menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selection') +# menu.AppendSeparator() if self.allow_config_flag: if self.CanConfigDisplay(): menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure grid column display...') - menu.AppendSeparator() +# menu.AppendSeparator() menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') menu.AppendSeparator() menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick create...') + menu.Append(basegrid.ID_POPUP_EDIT, 'Edit...') self.PopupMenuXY(menu, x, y) - - def QuickCreate(self, event = None): - result = quickcreate.showQuickCreate(self) - if result: - print 'in psmtools, quickcreate' - print 'sending %s to create function' % str(result) - #print self.dbroot.GetParent() - #result = self.DataManager.quickCreate(result) - #print result #--------------------------------------------------------------------------- Index: PanGalactic/pangalactic/client/fnord.py diff -u PanGalactic/pangalactic/client/fnord.py:1.62 PanGalactic/pangalactic/client/fnord.py:1.63 --- PanGalactic/pangalactic/client/fnord.py:1.62 Fri Sep 26 15:47:10 2003 +++ PanGalactic/pangalactic/client/fnord.py Wed Oct 1 15:29:23 2003 @@ -139,6 +139,7 @@ ID_FILE_NEWPV : "ProductVersion", ID_FILE_NEWPMV : "ProductModelVersion"} + #sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'psm')) #sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'plm')) Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.113 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.114 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.113 Mon Sep 29 14:47:56 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Wed Oct 1 15:29:23 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.113 $"[11:-2] +__version__ = "$Revision: 1.114 $"[11:-2] import os import sys @@ -46,7 +46,7 @@ from pangalactic.utils.mixin_security import Security_Mixin from pangalactic.utils.securitymanager import actions -import pangalactic.utils.pgefexceptions +import pangalactic.utils.basegrid as basegrid from pangalactic.client.modules.psm import toolbarpanel from pangalactic.client.modules.psm import searchframe @@ -263,6 +263,11 @@ EVT_MENU(self.product_version_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate) EVT_MENU(self.model_master_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate) + EVT_MENU(self.itemgrid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit) + EVT_MENU(self.product_master_grid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit) + EVT_MENU(self.product_version_grid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit) + EVT_MENU(self.model_master_grid, basegrid.ID_POPUP_EDIT, self.onGridPopupEdit) + EVT_RIGHT_DOWN(self.tree, self.OnRightDown) EVT_TREE_ITEM_EXPANDING(self, self.tID, self.OnItemExpanding) #EVT_TREE_ITEM_COLLAPSED(self, self.tID, self.OnItemCollapsed) @@ -295,11 +300,11 @@ currentgrid = self.product_version_grid elif GRIDLIST[currentpage] == "ProductMaster": currentgrid = self.product_master_grid - return currentgrid + return (currentgrid, GRIDLIST[currentpage]) def ExportProperties(self): - currentgrid = self.GetCurrentGrid() + currentgrid, gridname = self.GetCurrentGrid() nrows = currentgrid.GetNumberRows() # sometimes the grid has one empty row if nrows == 0: dlg = wxMessageDialog(self, "There is no point generating an Excel file. The grid is empty.", @@ -428,19 +433,6 @@ def FillEditFrame(self, nodedata): -## if nodedata[0] == "GRID": -## print "changing nodedata[0] from GRID to TOPLEVEL. Why?" -## nodedata[0] = 'TOPLEVEL' -# -# # don't change the notebook page if the editor is already up -# pane = 1 -# if self.itemeditform: -## if self.itemeditform.IsShown(): -# pane = self.itemeditform.editnb.GetSelection() -# -# self.ShowEditFrame(pane, splitter = 1, nodedata = nodedata) -# self.itemeditform.SetMode(pane) - pane = 1 product_id = nodedata[1] self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"]) @@ -580,7 +572,7 @@ def OnGridToPdf(self, event = None): - currentgrid = self.GetCurrentGrid() + currentgrid, gridname = self.GetCurrentGrid() nrows = currentgrid.GetNumberRows() # sometimes the grid has one empty row if nrows == 0: dlg = wxMessageDialog(self, "The grid is empty. There is no point generating a PDF.", "A message from PGEF", @@ -937,7 +929,7 @@ self.SelectGridRowByItemId(itemid) def SelectGridRowByItemId(self, itemid): - currentgrid = self.GetCurrentGrid() + currentgrid, gridname = self.GetCurrentGrid() rowcount = currentgrid.GetNumberRows() currentgrid.ClearSelection() for row in range(0, rowcount): @@ -1532,6 +1524,15 @@ wxEndBusyCursor() wxSafeYield() + def onGridPopupEdit(self, event): + currentgrid, gridname = self.GetCurrentGrid() + selectedrow = currentgrid.GetSelectedRows() +# print "selectedrows", selectedrow + if selectedrow: +# print "selectedrow", selectedrow[0] + product_id = currentgrid.GetObjectOid(selectedrow[0]) + self.processGridDClick(product_id, gridname, selectedrow) + def onPMVGridDClick(self, event): product_id = event.GetEventObject().GetObjectOid(event.GetRow()) @@ -1578,9 +1579,9 @@ print "pane??? what pane???" self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type]) - self.itemeditform.SetMode(0) - self.itemgrid.SelectRow(row_ndx) - self.topWindow.toppanel.GetItemWidget().SetSelection(row_ndx + 1) + self.itemeditform.SetMode(pane) +# self.itemgrid.SelectRow(row_ndx) +# self.topWindow.toppanel.GetItemWidget().SetSelection(row_ndx + 1) wxEndBusyCursor() dlg.Destroy() @@ -1594,8 +1595,8 @@ else: print "pane??? what pane???" self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type]) - self.itemeditform.SetMode(0) - self.itemgrid.SelectRow(row_ndx) + self.itemeditform.SetMode(pane) +# self.itemgrid.SelectRow(row_ndx) else: dlg = wxMessageDialog(self, "I'm sorry Steve, I can't do that...", "Unable to comply", @@ -1604,7 +1605,7 @@ wxSafeYield() def QuickCreate(self, event = None): - #print "psmtool.quickcreate" + print "psmtool.quickcreate" create_results = quickcreate.showQuickCreate(self) if create_results: #print 'in psmtools, quickcreate' Index: PanGalactic/pangalactic/utils/basegrid.py diff -u PanGalactic/pangalactic/utils/basegrid.py:1.11 PanGalactic/pangalactic/utils/basegrid.py:1.12 --- PanGalactic/pangalactic/utils/basegrid.py:1.11 Wed Oct 1 13:24:14 2003 +++ PanGalactic/pangalactic/utils/basegrid.py Wed Oct 1 15:29:24 2003 @@ -16,6 +16,7 @@ ID_POPUP_CONFIG_GRID = wxNewId() ID_POPUP_CLEAR_SELECTION = wxNewId() +ID_POPUP_EDIT = wxNewId() class MyCustomRenderer(wxPyGridCellRenderer): def __init__(self,bmp): @@ -284,35 +285,6 @@ ## self.EndBatch() -## def DumpToPdf(self, event = None): -## gridrows = self.GetNumberRows() -## if gridrows <= 0: -## return -## dlg = pdfoptions.PDFOptions(self) -## dlg.Layout() -## result = dlg.ShowModal() -## if result == wxID_OK: -## filename = dlg.filename.GetValue() -## if not filename.endswith('.pdf'): -## filename += '.pdf' - -## landscape = dlg.landscape.GetValue() -## temp = objectreport.ObjectReport(filename, -## self.table._data, -## landscape) #, -## #dlg.pdftitle.GetValue(), -## #dlg.footertext.GetValue()) - - -## temp.table_format = dlg.table_or_list.GetValue() -## temp.Title = dlg.pdftitle.GetValue() -## temp.footer_text = dlg.footertext.GetValue() - -## if dlg.show_gridlines.GetValue(): -## temp.showGridLines() - -## temp.display_map = self.DisplayMapping -## temp.Generate() def DumpToPdf(self, event = None): gridrows = self.GetNumberRows() From pbear at ned.gsfc.nasa.gov Wed Oct 1 17:45:43 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 1 16:45:46 2003 Subject: [Pangalactic-commits] changed Exit to Close on local database browser Message-ID: <200310012045.h91Kjhj8019771@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/fnord.py 1.63 1.64 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.58 1.59 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.114 1.115 Log message: changed Exit to Close on local database browser Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.114 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.115 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.114 Wed Oct 1 15:29:23 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Wed Oct 1 16:45:42 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.114 $"[11:-2] +__version__ = "$Revision: 1.115 $"[11:-2] import os import sys @@ -272,7 +272,8 @@ EVT_TREE_ITEM_EXPANDING(self, self.tID, self.OnItemExpanding) #EVT_TREE_ITEM_COLLAPSED(self, self.tID, self.OnItemCollapsed) EVT_TREE_SEL_CHANGED(self, self.tID, self.OnTreeActivate) - EVT_LEFT_DCLICK(self.tree, self.OnLeftDClick) +# EVT_LEFT_DCLICK(self.tree, self.OnLeftDClick) + EVT_LEFT_DCLICK(self.tree, self.OnEditComponent) EVT_COMBOBOX(self, ID_CHOICE_VIEW, self.SelectView) EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged) @@ -382,13 +383,13 @@ # menu.Append(ID_TREE_RIGHTPOPUP_TOPLEVEL, 'Show Top Level Items', "Display the default hierarchy") # menu.SetHelpString(ID_TREE_RIGHTPOPUP_TOPLEVEL, "Display the toplevel hierarchy") - menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit/View Product', "Edit this product") - menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data', "Show the project data window") - menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Create PDF...', 'Show PDF Options dialog') + menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this product") + menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data...', "View project data") + menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Generate PDF...', 'Show the PDF creation options') menu.SetHelpString(ID_TREE_RIGHTPOPUP_EDIT, "Edit this product") - menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "Show the project data window") + menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "View project data") menu.AppendSeparator() - menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick create...') + menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick create...', "Create a set of products") self.PopupMenuXY(menu, event.GetX(), event.GetY()) @@ -432,26 +433,30 @@ pass - def FillEditFrame(self, nodedata): - pane = 1 - product_id = nodedata[1] - self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"]) - - - def OnLeftDClick(self, event): - point = event.GetPosition() - tree = event.GetEventObject() - node, flags = tree.HitTest(point) - if node.IsOk(): - nodedata = tree.GetPyData(node) - if node == tree.GetRootItem(): - if nodedata[1] == "ROOT": - return - wxSafeYield() - wxBeginBusyCursor() - - self.FillEditFrame(nodedata) - wxEndBusyCursor() +# def FillEditFrame(self, nodedata): +# print "psmtool.filleditframe", nodedata +# pane = 1 +# product_id = nodedata[1] +# print "product_id", product_id +# self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"]) +# self.itemeditform.SetMode(pane) + +## duplicate of OnEditComponent -vwk +## +## def OnLeftDClick(self, event): +## point = event.GetPosition() +## tree = event.GetEventObject() +## node, flags = tree.HitTest(point) +## if node.IsOk(): +## nodedata = tree.GetPyData(node) +## if node == tree.GetRootItem(): +## if nodedata[1] == "ROOT": +## return + +## wxSafeYield() +## wxBeginBusyCursor() +## self.FillEditFrame(nodedata) +## wxEndBusyCursor() def RebuildMainTree(self): @@ -866,15 +871,17 @@ self.ToolMenu = None mb.Refresh() - def ShowDBBrowser(self): - tmpsize = wxSize(750, 500) - dbframe = toolframe.toolFrame(self, -1, 'DB Browser', wxDefaultPosition, tmpsize) - dbframe.mainpanel = dbbrowser.zodbbrowser(dbframe, -1, zodbroot = self.DataManager.localDB.dbroot) - dbframe.mainpanel.FillChoice() - dbframe.mainpanel.SelectDict("IDRDict") - dbframe.mainpanel.OnRefresh() - dbframe.CentreOnParent() - dbframe.Show(true) +## def ShowDBBrowser(self): +## tmpsize = wxSize(750, 500) +## dbframe = toolframe.toolFrame(self, -1, 'Local Database Browser', wxDefaultPosition, tmpsize) +## dbframe.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close') +## dbframe.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window") +## dbframe.mainpanel = dbbrowser.zodbbrowser(dbframe, -1, zodbroot = self.DataManager.localDB.dbroot) +## dbframe.mainpanel.FillChoice() +## dbframe.mainpanel.SelectDict("IDRDict") +## dbframe.mainpanel.OnRefresh() +## dbframe.CentreOnParent() +## dbframe.Show(true) def CloseDown(self): if self.DataManager.user._loggedin: @@ -1512,15 +1519,24 @@ def OnEditComponent(self, event): + print "psmtool.oneditcomponent" node = self.tree.GetSelection() if node.IsOk(): nodedata = self.tree.GetPyData(node) + print "nodedata", nodedata if node == self.tree.GetRootItem(): if nodedata[1] == "ROOT": return wxBeginBusyCursor() - self.FillEditFrame(nodedata) + +# self.FillEditFrame(nodedata) # only called here now, so moved code here. + + pane = 1 + product_id = nodedata[1] +# print "product_id", product_id + self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"]) + self.itemeditform.SetMode(pane) wxEndBusyCursor() wxSafeYield() Index: PanGalactic/pangalactic/client/fnord.py diff -u PanGalactic/pangalactic/client/fnord.py:1.63 PanGalactic/pangalactic/client/fnord.py:1.64 --- PanGalactic/pangalactic/client/fnord.py:1.63 Wed Oct 1 15:29:23 2003 +++ PanGalactic/pangalactic/client/fnord.py Wed Oct 1 16:45:41 2003 @@ -725,8 +725,9 @@ def OnDBBrowser(self, event): tmpsize = wxSize(750, 500) - testframe = toolframe.toolFrame(self, -1, 'DB Browser', wxDefaultPosition, tmpsize) - filename = self.DataManager.localDBfilename + testframe = toolframe.toolFrame(self, -1, 'Local Database Browser', wxDefaultPosition, tmpsize) + testframe.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close') + testframe.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window") testframe.mainpanel = dbbrowser.zodbbrowser(testframe, -1, zodbroot = self.DataManager.dbroot) testframe.mainpanel.FillChoice() testframe.CentreOnParent() Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.58 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.59 --- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.58 Wed Oct 1 15:29:23 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py Wed Oct 1 16:45:42 2003 @@ -66,7 +66,7 @@ if self.CanConfigDisplay(): menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure grid column display...') # menu.AppendSeparator() - menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') + menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') menu.AppendSeparator() menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick create...') menu.Append(basegrid.ID_POPUP_EDIT, 'Edit...') From waterbug at ned.gsfc.nasa.gov Thu Oct 2 13:19:59 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 2 12:20:03 2003 Subject: [Pangalactic-commits] Default for refd objs is None; constructor kwargs for refd objs are now same as attr names for them. Message-ID: <200310021619.h92GJxNX030815@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/assemblycomponentusage.py 1.16 1.17 PanGalactic/pangalactic/enterprise/pgefobject.py 1.25 1.26 PanGalactic/pangalactic/enterprise/productmaster.py 1.16 1.17 PanGalactic/pangalactic/enterprise/productmodelmaster.py 1.17 1.18 PanGalactic/pangalactic/enterprise/productmodelversion.py 1.20 1.21 PanGalactic/pangalactic/enterprise/productversion.py 1.19 1.20 Log message: Default for refd objs is None; constructor kwargs for refd objs are now same as attr names for them. Index: PanGalactic/pangalactic/enterprise/pgefobject.py diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.25 PanGalactic/pangalactic/enterprise/pgefobject.py:1.26 --- PanGalactic/pangalactic/enterprise/pgefobject.py:1.25 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/pgefobject.py Thu Oct 2 12:19:57 2003 @@ -1,8 +1,8 @@ -# $Id: pgefobject.py,v 1.25 2003/10/01 17:35:27 waterbug Exp $ +# $Id: pgefobject.py,v 1.26 2003/10/02 16:19:57 waterbug Exp $ """ The Mother of all PGEF application classes. -@version: $Revision: 1.25 $ +@version: $Revision: 1.26 $ """ # TODO: @@ -24,7 +24,7 @@ # should we jettison this? # Nope. -__version__ = "$Revision: 1.25 $"[11:-2] +__version__ = "$Revision: 1.26 $"[11:-2] import types import string @@ -216,24 +216,33 @@ self.state = kw.get('state', '') # create an oid if one isn't passed in ... self.pgef_oid = kw.get('pgef_oid', oid.generate(email)) - # use schema, if they are passed in ... - if 'schema' in kw: - self._schema = kw.get('schema') + # use schema, pk, and fk if they are passed in; otherwise, use the + # class's _schema, _fk, and _pk ... + self._schema = kw.get('schema', self._schema) + self._fk = kw.get('fk', self._fk) + self._pk = kw.get('pk', self._pk) # loop over _schema; set values from kw args or # defaults ... for a in self._schema: if a != 'pgef_oid' and self._schema[a] == 'str': setattr(self, a, kw.get(a, '')) - # self.__dict__[a] = kw.get(a, '') elif self._schema[a] == 'DateTime': setattr(self, a, kw.get(a, None)) - # self.__dict__[a] = kw.get(a, None) elif self._schema[a] == 'int': setattr(self, a, kw.get(a, 0)) - # self.__dict__[a] = kw.get(a, 0) elif self._schema[a] == 'bool': setattr(self, a, kw.get(a, False)) - # self.__dict__[a] = kw.get(a, False) + # loop over _refd; set values from kw args or + # defaults ... + for a in self._refd: + if kw.get(a).__class__.__name__ == self._refd[a]: + setattr(self, a, kw[a]) + else: + setattr(self, a, None) + ###### DEBUGGING ######## + # print '%s passed in is not %s type ...' % (a, + # self._refd[a]) + # print 'setting %s to None.' % a # if no oid is passed in, assume we are a new instance, # and record our creation/mod datetime ... if not kw.get('pgef_oid'): @@ -327,23 +336,16 @@ Output a human-readable string presentation for a PgefObject. """ -## outstring = '\n_____________________________________\n' -## outstring += self.__class__.__name__ -## attribs = self.__dict__.keys() -## attribs.sort() -## for a in attribs: -## astring = " .%s = %s" % (a, str(self.__dict__[a])) -## outstring = outstring + "\n" + astring -## outstring += '\n_____________________________________\n' - - outstring = "\n\n" + outstring = "\n" outstring += self.__class__.__name__ attribs = self.__dict__.keys() attribs.sort() for a in attribs: if isinstance(self.__dict__[a], PgefObject): - astring = " .%s = %s (%s)" % \ - (a, self.__dict__[a].__class__.__name__, self.__dict__[a].pgef_oid) + astring = " .%s = %s (pgef_oid=%s)" % \ + (a, + repr(self.__dict__[a]), + self.__dict__[a].pgef_oid) else: astring = " .%s = %s" % (a, str(self.__dict__[a])) outstring = outstring + "\n" + astring @@ -355,7 +357,7 @@ Populate certain attributes of a PgefObject that should be populated at creation time. """ - self.project = currentproject + self._project = currentproject # project should be pushed down into specific # subtypes; doesn't make sense for all objects # also: now every project has to have a Index: PanGalactic/pangalactic/enterprise/productversion.py diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.19 PanGalactic/pangalactic/enterprise/productversion.py:1.20 --- PanGalactic/pangalactic/enterprise/productversion.py:1.19 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/productversion.py Thu Oct 2 12:19:57 2003 @@ -1,12 +1,12 @@ -# $Id: productversion.py,v 1.19 2003/10/01 17:35:27 waterbug Exp $ +# $Id: productversion.py,v 1.20 2003/10/02 16:19:57 waterbug Exp $ """ Version-dependent product data. -@version: $Revision: 1.19 $ +@version: $Revision: 1.20 $ """ -__version__ = "$Revision: 1.19 $"[11:-2] +__version__ = "$Revision: 1.20 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -92,72 +92,27 @@ _pmm_cache = [] _pmm_cache_datetime = '' - def __init__(self, email=None, schema=_schema, - project=None, pm=None, **kw): + def __init__(self, email=None, schema=_schema, **kw): """ Optional keyword arguments: - - pm is a ProductMaster object. - - project is a Project object - id is required to be unique within the context of the _of_master.id and _of_master.id_context. - other recognized kw args for ProductVersion are: + - _project (a Project instance) + - _of_master (a ProductMaster instance) - email - name - has_docs_flag """ PgefObject.__init__(self, email=email, schema=schema, **kw) - # if a ProductMaster is passed in, use it ... - if pm.__class__.__name__ == 'ProductMaster': - self._of_master = pm - # if not, create one ... - elif kw.get('pm_id'): - pmkw = kw.copy() - pmkw['id'] = kw['pm_id'] - pmkw['id_context'] = kw.get('pm_id_context', 'PGER') - self._of_master = PM(**pmkw) - else: - pmprojid = kw.get('project_id', 'NOPROJECT') - pmprojidc = kw.get('project_id_context', 'NOCONTEXT') - pmid = kw.get('of_pm_id', 'Default PN') - pmidc = kw.get('of_pm_id_context', 'PGER') - self._of_master = PM(project_id=pmprojid, - project_id_context=pmprojidc, - id=pmid, - id_context=pmidc) - # set "foreign key" attributes from referenced objects - self.of_pm_id = self._of_master.id - self.of_pm_id_context = self._of_master.id_context - # default is for project to be the same as the - # _of_master's project ... - self._project = self._of_master._project - self.project_id = self._project.id - self.project_id_context = self._project.id_context - # however, a passed-in Project object or keywords will - # override this ... - if project.__class__.__name__ == 'Project': - self._project = project - self.project_id = project.id - self.project_id_context = project.id_context - kw['project_id'] = project.id - kw['project_id_context'] = project.id_context - # Must set project kw args here for 2 reasons: - # (1) if a Project object and project_id are both - # passed in, the object overrides - # (2) for use in the creation of a default - # ProductMaster (see below), if necessary. - elif kw.get('project_id'): - # else, if keyword args are present, use them ... - projid = kw.get('project_id') - projidc = kw.get('project_id_context', 'PGER') - # (may want to raise an exception if a - # project_id_context is not present) - email = kw.get("email", "unknown") - self._project = Project(email=email, - id=projid, - id_context=projidc) - self.project_id = self._project.id - self.project_id_context = self._project.id_context - # If no id is passed in, assign default revision of '1' - self.id = kw.get('id', '1') - + pm = getattr(self, '_of_master', None) + if pm: + self.of_pm_id = pm.id + self.of_pm_id_context = pm.id_context + # inherit project only if I didn't get one from init + if not getattr(self, '_project', None): + self._project = pm._project + self.project_id = pm.project_id + self.project_id_context = pm.project_id_context + Index: PanGalactic/pangalactic/enterprise/assemblycomponentusage.py diff -u PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.16 PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.17 --- PanGalactic/pangalactic/enterprise/assemblycomponentusage.py:1.16 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/assemblycomponentusage.py Thu Oct 2 12:19:57 2003 @@ -1,11 +1,11 @@ -# $Id: assemblycomponentusage.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $ +# $Id: assemblycomponentusage.py,v 1.17 2003/10/02 16:19:57 waterbug Exp $ """ The relationship between an assembled product and a part that is used in it. """ -__version__ = "$Revision: 1.16 $"[11:-2] +__version__ = "$Revision: 1.17 $"[11:-2] from pangalactic.utils import oid from pangalactic.enterprise.pgefobject import PgefObject @@ -77,8 +77,7 @@ # constraints) _std_abbrev = 'acu' - def __init__(self, email=None, schema=_schema, - assembly=None, component=None, **kw): + def __init__(self, email=None, schema=_schema, **kw): """ The Assembly Component Usage represents the relationship between a product (the I{component}) and another product @@ -109,45 +108,18 @@ """ PgefObject.__init__(self, email=email, schema=schema, **kw) - if assembly.__class__.__name__ == 'ProductModelVersion': - self._assembly = assembly - else: - # if no assembly PMV is passed in, create one from - # keyword args ... - pmvid = kw.get('assembly_id') - pmvpmmid = kw.get('assembly_of_pmm_id') - pmvpvid = kw.get('assembly_of_pv_id') - pmvpmid = kw.get('assembly_of_pm_id') - pmvpmidc = kw.get('assembly_of_pm_id_context') - self._assembly = PMV(id=pmvid, - of_pmm_id=pmvpmmid, - of_pv_id=pmvpvid, - of_pm_id=pmvpmid, - of_pm_id_context=pmvpmidc) - if component.__class__.__name__ == 'ProductModelVersion': - self._component = component - else: - # if no component PMV is passed in, create one from - # keyword args ... - pmvid = kw.get('component_id') - pmvpmmid = kw.get('component_of_pmm_id') - pmvpvid = kw.get('component_of_pv_id') - pmvpmid = kw.get('component_of_pm_id') - pmvpmidc = kw.get('component_of_pm_id_context') - self._component = PMV(id=pmvid, - of_pmm_id=pmvpmmid, - of_pv_id=pmvpvid, - of_pm_id=pmvpmid, - of_pm_id_context=pmvpmidc) - # set "foreign key" attributes from referenced objects: - self.assembly_id = self._assembly.id - self.assembly_of_pmm_id = self._assembly.of_pmm_id - self.assembly_of_pv_id = self._assembly.of_pv_id - self.assembly_of_pm_id = self._assembly.of_pm_id - self.assembly_of_pm_id_context = self._assembly.of_pm_id_context - self.component_id = self._component.id - self.component_of_pmm_id = self._component.of_pmm_id - self.component_of_pv_id = self._component.of_pv_id - self.component_of_pm_id = self._component.of_pm_id - self.component_of_pm_id_context = self._component.of_pm_id_context + assy = getattr(self, '_assembly', None) + comp = getattr(self, '_component', None) + if assy: + self.assembly_id = assy.id + self.assembly_of_pmm_id = assy.of_pmm_id + self.assembly_of_pv_id = assy.of_pv_id + self.assembly_of_pm_id = assy.of_pm_id + self.assembly_of_pm_id_context = assy.of_pm_id_context + if comp: + self.component_id = comp.id + self.component_of_pmm_id = comp.of_pmm_id + self.component_of_pv_id = comp.of_pv_id + self.component_of_pm_id = comp.of_pm_id + self.component_of_pm_id_context = comp.of_pm_id_context Index: PanGalactic/pangalactic/enterprise/productmaster.py diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.16 PanGalactic/pangalactic/enterprise/productmaster.py:1.17 --- PanGalactic/pangalactic/enterprise/productmaster.py:1.16 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/productmaster.py Thu Oct 2 12:19:57 2003 @@ -1,10 +1,10 @@ -# $Id: productmaster.py,v 1.16 2003/10/01 17:35:27 waterbug Exp $ +# $Id: productmaster.py,v 1.17 2003/10/02 16:19:57 waterbug Exp $ """ Version-independent product data. """ -__version__ = "$Revision: 1.16 $"[11:-2] +__version__ = "$Revision: 1.17 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -77,8 +77,7 @@ _pv_cache = [] _pv_cache_datetime = '' - def __init__(self, email=None, schema=_schema, - project=None, **kw): + def __init__(self, email=None, schema=_schema, **kw): """ Initialize - id must be unique within the id_context @@ -86,33 +85,16 @@ and project) - id_context must be a valid id_context (default is the user's organization identifier) - - project is a Project object - email is the creator's email address - other recognized kw args for ProductMaster are: + - _project (a Project object) - name - has_docs_flag """ PgefObject.__init__(self, email=email, schema=schema, **kw) - # ... if project_id/id_context are passed in, use them; - if project.__class__.__name__ == 'Project': - self._project = project - elif kw.get('project_id'): - # or, if kw args are present, use them ... - # of course, need to check whether the project exists or - # whether the user has permissions to create a project - # ... - projid = kw.get('project_id') - projidc = kw.get('project_id_context', 'PGER') - # (may want to raise an exception if a - # project_id_context is not present) - email = kw.get("email", "unknown") - self._project = Project(email=email, - id=projid, - id_context=projidc) - else: - # last resort: create the default 'NOPROJECT' ... - self._project = Project() - self.project_id = self._project.id - self.project_id_context = self._project.id_context + project = getattr(self, '_project', None) + if project: + self.project_id = project.id + self.project_id_context = project.id_context Index: PanGalactic/pangalactic/enterprise/productmodelmaster.py diff -u PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.17 PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.18 --- PanGalactic/pangalactic/enterprise/productmodelmaster.py:1.17 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/productmodelmaster.py Thu Oct 2 12:19:57 2003 @@ -1,4 +1,4 @@ -# $Id: productmodelmaster.py,v 1.17 2003/10/01 17:35:27 waterbug Exp $ +# $Id: productmodelmaster.py,v 1.18 2003/10/02 16:19:57 waterbug Exp $ """ Version-independent product model data. @@ -10,7 +10,7 @@ default one? ... """ -__version__ = "$Revision: 1.17 $"[11:-2] +__version__ = "$Revision: 1.18 $"[11:-2] from pangalactic.enterprise.project import Project from pangalactic.enterprise.productmaster import ProductMaster @@ -96,16 +96,15 @@ # constraints) _std_abbrev = 'pmm' - def __init__(self, email=None, schema=_schema, - project=None, pv=None, **kw): + def __init__(self, email=None, schema=_schema, **kw): """Parameters: - - pv is a ProductVersion object. - - project is a Project object - email is the user's email address - id is required to be unique within the context of the _of_version.id, _of_version._of_master.id, and _of_version._of_master.id_context. - other recognized kw args for ProductModelMaster are: + - _of_version is a ProductVersion instance + - _project is a Project instance - name - model_view ('design', 'usage', 'manufacturing', etc.) @@ -113,59 +112,16 @@ - has_docs_flag """ ProductMaster.__init__(self, email=email, - schema=schema, - project=project, **kw) - # if a Project object has been passed in, use it ... - if project.__class__.__name__ == 'Project': - self._project = project - self.project_id = project.id - self.project_id_context = project.id_context - kw['project_id'] = project.id - kw['project_id_context'] = project.id_context - # Must set project kw args here for 2 reasons: - # (1) if a Project object and project_id are both - # passed in, the object overrides - # (2) for use in the creation of a default - # ProductVersion (see below), if necessary. - elif kw.get('project_id'): - # or, if keyword args are present, use them ... - projid = kw.get('project_id') - projidc = kw.get('project_id_context', 'PGER') - self._project = Project(id=projid, - id_context=projidc) - self.project_id = self._project.id - self.project_id_context = self._project.id_context - else: - self._project = None - # if a pv is passed in, use it ... - if pv.__class__.__name__ == 'ProductVersion': - self._of_version = pv - else: - # if not, create one ... - pvprojid = kw.get('project_id', 'NOPROJECT') - pvprojidc = kw.get('project_id_context', 'NOCONTEXT') - pvid = kw.get('of_pv_id', '1') - pvpmid = kw.get('of_pm_id', 'Default PN') - pvpmidc = kw.get('of_pm_id_context', 'PGER') - self._of_version = PV(project_id=pvprojid, - project_id_context=pvprojidc, - id=pvid, - of_pm_id=pvpmid, - of_pm_id_context=pvpmidc) - # pull in _of_master from the _of_version so we don't - # have to go nuts with blah.blah.blah to get to - # attributes of my parents ... - self._of_master = self._of_version._of_master - # if self._project has not be set above, use - # self._of_master's project ... - if not self._project: - self._project = self._of_master._project - self.project_id = self._project.id - self.project_id_context = self._project.id_context - # set "foreign key" attributes from referenced objects: - self.of_pv_id = self._of_version.id - self.of_pm_id = self._of_master.id - self.of_pm_id_context = self._of_master.id_context - # if no model id is passed in, assign a default ... - self.id = kw.get('id', 'Default Model ID') + schema=schema, **kw) + pv = getattr(self, '_of_version', None) + if pv: + self._of_master = pv._of_master + self.of_pv_id = pv.id + self.of_pm_id = pv.of_pm_id + self.of_pm_id_context = pv.of_pm_id_context + # inherit project only if I didn't get one from init + if not getattr(self, '_project', None): + self._project = pv._project + self.project_id = pv.project_id + self.project_id_context = pv.project_id_context Index: PanGalactic/pangalactic/enterprise/productmodelversion.py diff -u PanGalactic/pangalactic/enterprise/productmodelversion.py:1.20 PanGalactic/pangalactic/enterprise/productmodelversion.py:1.21 --- PanGalactic/pangalactic/enterprise/productmodelversion.py:1.20 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/productmodelversion.py Thu Oct 2 12:19:57 2003 @@ -1,10 +1,10 @@ -# $Id: productmodelversion.py,v 1.20 2003/10/01 17:35:27 waterbug Exp $ +# $Id: productmodelversion.py,v 1.21 2003/10/02 16:19:57 waterbug Exp $ """ Version-dependent product model data. """ -__version__ = "$Revision: 1.20 $"[11:-2] +__version__ = "$Revision: 1.21 $"[11:-2] from pangalactic.enterprise.project import Project from pangalactic.enterprise.productversion import ProductVersion @@ -100,8 +100,7 @@ # constraints) _std_abbrev = 'pmv' - def __init__(self, email=None, schema=_schema, - project=None, pmm=None, **kw): + def __init__(self, email=None, schema=_schema, **kw): """ Initialize - pmm is a ProductModelMaster object @@ -124,63 +123,18 @@ - has_parts_lists_flag """ ProductVersion.__init__(self, email=email, - schema=schema, - project=project, **kw) - # if a Project object has been passed in, use it ... - if project.__class__.__name__ == 'Project': - self._project = project - self.project_id = project.id - self.project_id_context = project.id_context - kw['project_id'] = project.id - kw['project_id_context'] = project.id_context - # Must set project kw args here for 2 reasons: - # (1) if a Project object and project_id are both - # passed in, the object overrides - # (2) for use in the creation of a default - # ProductModelMaster (see below), if necessary. - elif kw.get('project_id'): - # else, if keyword args are present, use them ... - projid = kw.get('project_id') - projidc = kw.get('project_id_context', 'PGER') - # (may want to raise an exception if a - # project_id_context is not present) - self._project = Project(id=projid, - id_context=projidc) - self.project_id = self._project.id - self.project_id_context = self._project.id_context - else: - self._project = None - # if a pmm is passed in, use it ... - if pmm.__class__.__name__ == 'ProductModelMaster': - self._of_model_master = pmm - else: - # if not, create one ... - pmmprojid = kw.get('project_id', 'NOPROJECT') - pmmprojidc = kw.get('project_id_context', 'PGER') - pmmid = kw.get('of_pmm_id', 'Default Model ID') - pmmpvid = kw.get('of_pv_id', '1') - pmmpmid = kw.get('of_pm_id', 'Default PN') - pmmpmidc = kw.get('of_pm_id_context', 'PGER') - self._of_model_master = PMM(project_id=pmmprojid, - project_id_context=pmmprojidc, - id=pmmid, - of_pv_id=pmmpvid, - of_pm_id=pmmpmid, - of_pm_id_context=pmmpmidc) - # pull in _of_master and _of_version from the - # _of_model_master so we don't have to go nuts with - # blah.blah.blah to get to attributes of my parents ... - self._of_master = self._of_model_master._of_master - self._of_version = self._of_model_master._of_version - # if self._project has not be set above, use - # self._of_master's project ... - if not self._project: - self._project = self._of_master._project - self.project_id = self._project.id - self.project_id_context = self._project.id_context - # set "foreign key" attributes from referenced objects: - self.of_pmm_id = self._of_model_master.id - self.of_pv_id = self._of_version.id - self.of_pm_id = self._of_master.id - self.of_pm_id_context = self._of_master.id_context + schema=schema, **kw) + pmm = getattr(self, '_of_model_master', None) + if pmm: + self._of_version = pmm._of_version + self._of_master = pmm._of_master + self.of_pmm_id = pmm.id + self.of_pv_id = pmm.of_pv_id + self.of_pm_id = pmm.of_pm_id + self.of_pm_id_context = pmm.of_pm_id_context + # inherit project only if I didn't get one from init + if not getattr(self, '_project', None): + self._project = pmm._project + self.project_id = pmm.project_id + self.project_id_context = pmm.project_id_context From waterbug at ned.gsfc.nasa.gov Thu Oct 2 14:39:08 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 2 13:39:09 2003 Subject: [Pangalactic-commits] Clean up some scripts and test data. Message-ID: <200310021739.h92Hd8j9031916@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/insertTestData.sql None 1.1 PanGalactic/src/sql/createPgerDbTables.sql 1.62 1.63 PanGalactic/src/sql/dropPgerDbTables.sql 1.22 1.23 PanGalactic/src/sql/emptyPgerDbTables.sql 1.23 1.24 PanGalactic/src/sql/insertRefData.sql 1.2 1.3 PanGalactic/src/sql/populate_pgerdb.sh 1.1 1.2 PanGalactic/src/sql/insertPgerDbTestData.sql 1.5 None Log message: Clean up some scripts and test data. Index: PanGalactic/src/sql/emptyPgerDbTables.sql diff -u PanGalactic/src/sql/emptyPgerDbTables.sql:1.23 PanGalactic/src/sql/emptyPgerDbTables.sql:1.24 --- PanGalactic/src/sql/emptyPgerDbTables.sql:1.23 Wed Aug 20 01:54:58 2003 +++ PanGalactic/src/sql/emptyPgerDbTables.sql Thu Oct 2 13:39:06 2003 @@ -52,6 +52,7 @@ DELETE FROM doc_rep; DELETE FROM doc_version; DELETE FROM doc_master; +DELETE FROM doc_type; DELETE FROM product_instance; DELETE FROM product_model_version; DELETE FROM product_model_master; Index: PanGalactic/src/sql/insertRefData.sql diff -u PanGalactic/src/sql/insertRefData.sql:1.2 PanGalactic/src/sql/insertRefData.sql:1.3 --- PanGalactic/src/sql/insertRefData.sql:1.2 Wed Aug 20 01:54:58 2003 +++ PanGalactic/src/sql/insertRefData.sql Thu Oct 2 13:39:06 2003 @@ -1,267 +1,207 @@ -/* PGEFDB organization and user test data initialization script. - * */ +/* PGERDB reference data initialization. */ -/* $Id: insertRefData.sql,v 1.2 2003/08/20 05:54:58 waterbug Exp $ */ +/* $Id: insertRefData.sql,v 1.3 2003/10/02 17:39:06 waterbug Exp $ */ + +/* This script sets up the default identification contexts for + * PGEF objects, and is required before the PGERDB can be + * populated. */ BEGIN; SET CONSTRAINTS ALL DEFERRED; -INSERT INTO project +INSERT INTO id_context ( - pgef_oid, - id, -- primary key - id_context -- primary key + name, -- primary key + pgef_class, + owner, + owner_context ) VALUES ( - 'test.project.1', - 'H2G2', - 'TEST' + 'PGER', + 'IdContext', + 'admin', + 'PGER' ); -INSERT INTO project +INSERT INTO id_context ( - pgef_oid, - id, -- primary key - id_context -- primary key + name, -- primary key + pgef_class, + owner, + owner_context +) +VALUES +( + 'NOCONTEXT', + 'IdContext', + 'admin', + 'PGER' +); + +INSERT INTO id_context +( + name, -- primary key + pgef_class, + owner, + owner_context +) +VALUES +( + 'DEMO', + 'IdContext', + 'admin', + 'PGER' +); + +INSERT INTO id_context +( + name, -- primary key + pgef_class, + owner, + owner_context +) +VALUES +( + 'TEST', + 'IdContext', + 'admin', + 'PGER' +); + +INSERT INTO id_context +( + name, -- primary key + pgef_class, + owner, + owner_context +) +VALUES +( + 'CAGE', + 'IdContext', + 'admin', + 'PGER' +); + +INSERT INTO id_context +( + name, -- primary key + pgef_class, + owner, + owner_context ) VALUES ( - 'test.project.2', - 'TEST', - 'TEST' + 'FSC', + 'IdContext', + 'admin', + 'PGER' ); INSERT INTO person ( pgef_oid, - id, -- primary key - id_context, -- primary key + pgef_class, + id, -- primary key + id_context, -- primary key email, - fname, - mi_or_name, - lname, - position_title, - role, org_id, org_id_context, - phone, god_flag ) VALUES ( - 'test.person1', - 'banzai@banzai.earth', + 'admin@default.person.1', + 'Person', + 'admin', + 'PGER', + 'admin@default', + 'PGEF', 'PGER', - 'banzai@banzai.earth', - 'Buckaroo', - '', - 'Banzai', - 'Genius-at-Large', - 'Big Kahuna', - 'BANZA', - 'TEST', - 'buckafone', '1' ); -INSERT INTO person +INSERT INTO organization ( pgef_oid, - id, -- primary key - id_context, -- primary key - email, - fname, - mi_or_name, - lname, - position_title, - role, - org_id, - org_id_context, - phone + pgef_class, + id, -- primary key + id_context -- primary key ) VALUES ( - 'test.person2', - 'bigboote@yoyodyne.planet10', - 'PGER', - 'bigboote@yoyodyne.planet10', - 'John', - '', - 'Bigboote', - 'Ubergeek', - 'Hive Admin', - 'YOYOD', - 'TEST', - 'yoyofone' + 'PGEF', + 'Organization', + 'PGEF', + 'PGER' ); -INSERT INTO person +INSERT INTO organization ( pgef_oid, - id, -- primary key - id_context, -- primary key - email, - fname, - mi_or_name, - lname, - position_title, - role, - org_id, - org_id_context, - phone -) + pgef_class, + id, -- primary key + id_context -- primary key +) VALUES ( - 'test.person3', - 'smallberries@yoyodyne.planet10', - 'TEST', - 'smallberries@yoyodyne.planet10', - 'John', - '', - 'Smallberries', - 'Schlemiel', - 'Hive Lackey', - 'YOYOD', - 'TEST', - 'yoyofone' + 'DLA', + 'Organization', + 'DLA', + 'PGER' ); -INSERT INTO person +INSERT INTO project ( pgef_oid, - id, -- primary key - id_context, -- primary key - email, - fname, - mi_or_name, - lname, - position_title, - role, - org_id, - org_id_context, - phone + pgef_class, + id, -- primary key + id_context, -- primary key + short_description ) VALUES ( - 'test.person4', - 'lizardo@yoyodyne.planet10', - 'TEST', - 'lizardo@yoyodyne.planet10', - 'John', - '', - 'Whorfin', - '', - 'Hive Master', - 'YOYOD', - 'TEST', - 'yoyofone' + 'NOPROJECT', + 'Project', + 'NOPROJECT', + 'NOCONTEXT', + 'No project specified' ); -INSERT INTO organization +INSERT INTO doc_master ( pgef_oid, - pgef_class, - id, - id_context, - pgef_security_mask, + id, -- primary key + id_context, -- primary key name, - short_description, - long_description, - pger_owner, - pger_owner_context, - pger_creator, - pger_creator_context, - pger_create_datetime, - pger_modifier, - pger_modifier_context, - pger_mod_datetime, - owner, - owner_context, - creator, - creator_context, - create_datetime, - modifier, - modifier_context, - mod_datetime, - pgef_org_name_code, - name1, - name2, - name3, - name4, - name5, - country_code, - street_address1, - street_address2, - city, - state_or_country, - zip_or_postal_zone, - phone, - association_cage, - status_code, - type_code, - replacement_cage, - sic_code1, - sic_code2, - sic_code3, - sic_code4 + short_description ) VALUES ( -'org.yoyo1', '', 'YOYOD', 'TEST', '0', 'Yoyodyne Propulsion Systems', '', '', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'YOYODYNE', 'Yoyodyne Propulsion Systems', '', '', '', '', '1', '', '', 'Grovers Mills', 'NJ', '', '', '', '', '', '', '', '', '', '' + 'admin@fsc.doc_master.1', + 'FSC Doc Master', + 'FSC', + 'FSC Doc Master', + 'Federal Supply Classifications Document Master' ); -INSERT INTO organization +INSERT INTO doc_type ( pgef_oid, - pgef_class, - id, - id_context, - pgef_security_mask, + id, -- primary key + id_context, -- primary key name, - short_description, - long_description, - pger_owner, - pger_owner_context, - pger_creator, - pger_creator_context, - pger_create_datetime, - pger_modifier, - pger_modifier_context, - pger_mod_datetime, - owner, - owner_context, - creator, - creator_context, - create_datetime, - modifier, - modifier_context, - mod_datetime, - pgef_org_name_code, - name1, - name2, - name3, - name4, - name5, - country_code, - street_address1, - street_address2, - city, - state_or_country, - zip_or_postal_zone, - phone, - association_cage, - status_code, - type_code, - replacement_cage, - sic_code1, - sic_code2, - sic_code3, - sic_code4 -) + short_description +) VALUES ( -'org.banzai1', '', 'BANZA', 'TEST', '0', 'Banzai Institute', '', '', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'admin', 'PGER', '2003-02-25 22:18:15.275408-05', 'BANZAI', 'Banzai Institute', '', '', '', '', '1', '', '', 'Holland Township', 'NJ', '', '', '', '', '', '', '', '', '', '' + 'admin@fsc.doc_type.1', + 'Unknown', + 'PGER', + 'Unknown Document Type', + 'Default type for unidentified document types.' ); + END; Index: PanGalactic/src/sql/createPgerDbTables.sql diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.62 PanGalactic/src/sql/createPgerDbTables.sql:1.63 --- PanGalactic/src/sql/createPgerDbTables.sql:1.62 Tue Sep 30 13:49:30 2003 +++ PanGalactic/src/sql/createPgerDbTables.sql Thu Oct 2 13:39:06 2003 @@ -1,6 +1,6 @@ /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */ -/* $Id: createPgerDbTables.sql,v 1.62 2003/09/30 17:49:30 waterbug Exp $ +/* $Id: createPgerDbTables.sql,v 1.63 2003/10/02 17:39:06 waterbug Exp $ * * *** TO DO *** * -- TBR (Text-Based Requirements) @@ -2217,12 +2217,12 @@ /* The name of the file's role. Valid values TBD, will * probably include 'content', 'template', 'stylesheet', * etc. */ - dr_id TEXT NOT NULL, - dv_id TEXT NOT NULL, - dm_id TEXT NOT NULL, - dm_id_context TEXT NOT NULL, + of_dr_id TEXT NOT NULL, + of_dv_id TEXT NOT NULL, + of_dm_id TEXT NOT NULL, + of_dm_id_context TEXT NOT NULL, CONSTRAINT dr_file_has_dr - FOREIGN KEY (dr_id, dv_id, dm_id, dm_id_context) + FOREIGN KEY (of_dr_id, of_dv_id, of_dm_id, of_dm_id_context) REFERENCES doc_rep ON DELETE CASCADE INITIALLY DEFERRED Index: PanGalactic/src/sql/dropPgerDbTables.sql diff -u PanGalactic/src/sql/dropPgerDbTables.sql:1.22 PanGalactic/src/sql/dropPgerDbTables.sql:1.23 --- PanGalactic/src/sql/dropPgerDbTables.sql:1.22 Wed Aug 20 01:54:58 2003 +++ PanGalactic/src/sql/dropPgerDbTables.sql Thu Oct 2 13:39:06 2003 @@ -50,6 +50,7 @@ DROP TABLE doc_rep CASCADE; DROP TABLE doc_version CASCADE; DROP TABLE doc_master CASCADE; +DROP TABLE doc_type CASCADE; DROP TABLE product_instance CASCADE; DROP TABLE product_model_version CASCADE; DROP TABLE product_model_master CASCADE; Index: PanGalactic/src/sql/populate_pgerdb.sh diff -u PanGalactic/src/sql/populate_pgerdb.sh:1.1 PanGalactic/src/sql/populate_pgerdb.sh:1.2 --- PanGalactic/src/sql/populate_pgerdb.sh:1.1 Sun Jun 15 21:39:02 2003 +++ PanGalactic/src/sql/populate_pgerdb.sh Thu Oct 2 13:39:06 2003 @@ -1,11 +1,10 @@ #!/bin/bash -# $Id: populate_pgerdb.sh,v 1.1 2003/06/16 01:39:02 radix Exp $ +# $Id: populate_pgerdb.sh,v 1.2 2003/10/02 17:39:06 waterbug Exp $ -psql pgerdb < insertPgerDbReferenceData.sql -psql pgerdb < copyOrganizations.psql -psql pgerdb < insertPgerDbTestData.sql psql pgerdb < insertRefData.sql +psql pgerdb < copyOrganizations.psql +psql pgerdb < insertTestData.sql psql pgerdb < copyCats.psql psql pgerdb < insertProductMasters.sql psql pgerdb < insertProductVersions.sql From waterbug at ned.gsfc.nasa.gov Thu Oct 2 14:40:31 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 2 13:40:33 2003 Subject: [Pangalactic-commits] Fix so no overlaps with test and ref data inserts. Message-ID: <200310021740.h92HeVN7031968@ned.gsfc.nasa.gov> Modified files: PanGalactic/data/organizations.tsv 1.2 1.3 Log message: Fix so no overlaps with test and ref data inserts. Index: PanGalactic/data/organizations.tsv diff -u PanGalactic/data/organizations.tsv:1.2 PanGalactic/data/organizations.tsv:1.3 --- PanGalactic/data/organizations.tsv:1.2 Fri Sep 26 14:15:59 2003 +++ PanGalactic/data/organizations.tsv Thu Oct 2 13:40:30 2003 @@ -1,5 +1,3 @@ -admin@default.organization.1 Organization PGEF TEST 0 \N admin PGER admin PGER 2003-09-25 21:48:00.88844 admin PGER 2003-09-25 21:48:00.88844 admin PGER admin PGER 2003-09-25 21:48:00.88844 admin PGER 2003-09-25 21:48:00.88844 \N 1 -admin@default.organization.2 Organization DLA TEST 0 \N admin PGER admin PGER 2003-09-25 21:48:00.88844 admin PGER 2003-09-25 21:48:00.88844 admin PGER admin PGER 2003-09-25 21:48:00.88844 admin PGER 2003-09-25 21:48:00.88844 \N 1 test.organization.1 Organization 11139 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 DEUTSCH DEUTSCH CO THE ENGINEERED CONNECTING DEVICES 1 5733 W WHITTIER AVE HEMET CA 92545 909-765-2200 17419 A A 3678 test.organization.2 Organization 03550 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 VANGUARD VANGUARD ELECTRONICS COMPANY 1 7412 PRINCE DRIVE HUNTINGTON BEACH CA 92647-4553 714-842-3330 A A 3671 test.organization.3 Organization 55801 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 CDI COMPENSATED DEVICES INC 1 22 COREY ST MELROSE MA 02176-4696 781-665-1071 A A @@ -12,11 +10,8 @@ test.organization.10 Organization 77820 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 AMPHENOL AMPHENOL AEROSPACE OPERATIONS 1 40-60 DELAWARE ST SIDNEY NY 13838 607-563-5011 A A 3678 test.organization.11 Organization 34156 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 SEMICOA SEMICOA 1 333 MCCORMICK AVE COSTA MESA CA 92626-3422 714-979-1900 A A 3674 test.organization.12 Organization 06324 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 GLENAIR GLENAIR INC 1 1211 AIR WAY GLENDALE CA 91201-2497 818-247-6000 06324 A A 3643 -org.yoyo1 Organization YOYOD TEST 0 Yoyodyne Propulsion Systems admin PGER admin PGER 2003-02-25 22:18:15.275408 admin PGER 2003-02-25 22:18:15.275408 admin PGER admin PGER 2003-02-25 22:18:15.275408 admin PGER 2003-02-25 22:18:15.275408 YOYODYNE Yoyodyne Propulsion Systems 1 Grovers Mills NJ test.organization.13 Organization 55123 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 KINETICSYS KINETICSYSTEMS COMPANY LLC 1 900 NORTH STATE STREET LOCKPORT IL 60441-2230 815-838-0005 A A 3625 test.organization.14 Organization 52202 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 MODULARDEV MODULAR DEVICES INC DBA 1 ONE RONED ROAD SHIRLEY NY 11967-4706 631-345-3100 A A 3651 test.organization.16 Organization 0LSP2 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 SPECCTRL SPECTRUM CONTROL INC ELECTROMAGNETIC DIV 1 8061 AVONIA RD FAIRVIEW PA 16415-2829 814-474-1571 33095 A A 3675 3679 test.organization.17 Organization 1FS71 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 WALCO WALCO CORP ADHESIVE TAPES DIV 1 1651 E SUTTER RD GLENSHAW PA 15116-1700 412-486-4400 A F test.organization.18 Organization 0AKS0 TEST 0 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 admin PGER admin PGER 2003-02-26 00:05:34.749062 admin PGER 2003-02-26 00:05:34.749062 RAMENTRPRS RAM ENTERPRISES INC 1 24940 AVENUE TIBBITTS SANTA CLARITA CA 91355-3426 661-257-0800 A A 5063 -tester1@default.organization.1 Organization TO1 TEST 0 \N admin PGER admin PGER 2003-09-25 21:48:01.225522 admin PGER 2003-09-25 21:48:01.225522 admin PGER admin PGER 2003-09-25 21:48:01.225522 admin PGER 2003-09-25 21:48:01.225522 TORG1 Test Organization 1 US 42 Hitchhikers Blvd Spamville MD 00000 -org.banzai1 Organization BANZA TEST 0 Banzai Institute admin PGER admin PGER 2003-02-25 22:18:15.275408 admin PGER 2003-02-25 22:18:15.275408 admin PGER admin PGER 2003-02-25 22:18:15.275408 admin PGER 2003-02-25 22:18:15.275408 BANZAI Banzai Institute 1 Holland Township NJ From pbear at ned.gsfc.nasa.gov Thu Oct 2 16:31:25 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 2 15:31:27 2003 Subject: [Pangalactic-commits] add overdue times to workflows; colourization of wfinstances; send object not string in quickcreate Message-ID: <200310021931.h92JVPcd001010@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.33 1.34 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.9 1.10 PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py 1.11 1.12 PanGalactic/pangalactic/enterprise/workflow/wffactory.py 1.5 1.6 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.3 1.4 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.12 1.13 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.13 1.14 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.15 1.16 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.6 1.7 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.wdr 1.2 1.3 PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py 1.2 1.3 PanGalactic/pangalactic/utils/basegrid.py 1.12 1.13 PanGalactic/pangalactic/utils/datamanager.py 1.33 1.34 Log message: add overdue times to workflows; colourization of wfinstances; send object not string in quickcreate Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.33 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.34 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.33 Mon Sep 15 16:08:59 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Thu Oct 2 15:31:22 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.33 2003/09/15 20:08:59 waterbug Exp $ +# $Id: pgefadvisory.py,v 1.34 2003/10/02 19:31:22 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.33 $"[11:-2] +__version__ = "$Revision: 1.34 $"[11:-2] import os.path import string @@ -54,25 +54,31 @@ Initialize PgefAdvisory. """ Document.__init__(self, **kw) + # XXX TO DO: make center_acronym a computed attribute # (and name it _center_acronym) self.center_acronym = acronym + # XXX TO DO: change attachments to _attachments self.attachments = [] ## list of tuples: (label, filename) # for the interim, set the attributes; eventually, method # calls can be added to the list of attributes + self.part_refs = kw.get('part_refs', []) # list of PartRef objects - self._workflow_str = "INITIATED" # self.GetState() - self._next_workflow_str = "DRAFT" # self.GetNextState() - # this needs to reflect length of workflow state -tbd -vwk - self.due_datetime = mx.DateTime.now() + +# leave this here... I use it to generate old data -vwk +# +# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) +# earlier = now + mx.DateTime.RelativeDateTime(days=-85) +# +# self.pger_create_datetime = earlier +# self.pger_mod_datetime = earlier +# self.create_datetime = earlier +# self.mod_datetime = earlier + def __getattr__(self, name): - if name == '_due_datetime': - return getDisplayDateTime(self.due_datetime) - elif name == '_due_date': - return getDisplayDate(self.due_datetime) - elif name == '_pretty_doc_type': + if name == '_pretty_doc_type': return self.getPrettyDocType() else: return Document.__getattr__(self, name) @@ -87,12 +93,12 @@ def GetCreateDateStr(self): return self._create_date - def SetDueDate(self, due_datetime): - self.due_datetime = due_datetime +# def SetDueDate(self, due_datetime): +# self.due_datetime = due_datetime - def SetWorkflowState(self, statestr, nextstatestr): - self._workflowstr = statestr - self._next_workflowstr = nextstatestr +# def SetWorkflowState(self, statestr, nextstatestr): +# self._workflowstr = statestr +# self._next_workflowstr = nextstatestr def SetAttachments(self, attachments): self.attachments = attachments Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.9 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.10 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.9 Fri Sep 26 10:10:50 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py Thu Oct 2 15:31:23 2003 @@ -65,6 +65,8 @@ self.canstart = 0 self.fields = fields + def getDuration(self): + return int(self.fields["duration"]) def changeState(self, newState): # wfmc specification Index: PanGalactic/pangalactic/utils/basegrid.py diff -u PanGalactic/pangalactic/utils/basegrid.py:1.12 PanGalactic/pangalactic/utils/basegrid.py:1.13 --- PanGalactic/pangalactic/utils/basegrid.py:1.12 Wed Oct 1 15:29:24 2003 +++ PanGalactic/pangalactic/utils/basegrid.py Thu Oct 2 15:31:23 2003 @@ -248,6 +248,10 @@ self.SetRowAttr(row, attr) found = true + def SetColBackgroundColour(self, col, colour): + numrows = self.GetNumberRows() + for row in range(numrows): + self.SetCellBackgroundColour(row, col, colour) def SetRowBackgroundColour(self, rowlist, colour): numcols = self.GetNumberCols() Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.13 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.14 --- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.13 Fri Sep 26 15:47:11 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py Thu Oct 2 15:31:23 2003 @@ -79,8 +79,11 @@ self.actinfo = [("Activity", 100, "activity"), ("Time Frame\n(days)", 100, "duration"), + ("Late\n(days)", 100, "late"), + ("Very Late\n(days)", 100, "very_late"), + ("WAAAAY Overdue\n(days)", 130, "lost_cause"), ("Description", 400, "description")] - self.transinfo = [("From", 200, "to"), ("To", 200, "to")] + self.transinfo = [("From", 200, "from"), ("To", 200, "to")] self.parent = parent @@ -168,11 +171,6 @@ def OnWorkflowWizard(self, event): #print "CreateWorkflow" - # tuples of displayed_label, duration, and dictionary key -# actinfo = [("Activity", 100, "activity"), -# ("Time Frame\n(days)", 100, "duration"), -# ("Description", 400, "description")] -# transinfo = [("From", 200, "from"), ("To", 200, "to")] tmpsize = wxSize(750, 600) WizardFrame = toolframe.toolFrame(self, -1, "Workflow Wizard", wxDefaultPosition, tmpsize) Wizard = workflow_wizard.WorkflowWizard(WizardFrame, self.State, self.DataManager, @@ -238,12 +236,6 @@ def OnWorkflowEdit(self, event): # popup the editor, initialized with the selected workflow from the grid #print "EditWorkflow" - -# actinfo = [("Activity", 100, "activity"), -# ("Time Frame\n(days)", 100, "duration"), -# ("Description", 400, "description")] -# transinfo = [("From", 200, "to"), ("To", 200, "to")] - tmpsize = wxSize(750, 600) EditorFrame = toolframe.toolFrame(self, -1, "Workflow Editor", wxDefaultPosition, tmpsize) Editor = workflow_wizard.WorkflowWizard(EditorFrame, self.State, self.DataManager, Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.12 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.13 --- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.12 Mon Sep 29 13:35:50 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py Thu Oct 2 15:31:23 2003 @@ -6,11 +6,14 @@ @see: L{WfExecutionObject }, L{WfActivity } """ +import types +import mx.DateTime +import pangalactic.utils.datetimes as datetimes + from pangalactic.enterprise.workflow.wfexecutionstates import * from pangalactic.enterprise.workflow.wfexceptions import * from pangalactic.enterprise.workflow.wfexecutionobject import WfExecutionObject from pangalactic.enterprise.workflow.wftransition import WfTransition -import types class WfProcess(WfExecutionObject): """ @@ -37,11 +40,12 @@ _properties = {"activityId" : "str", "defaultStartId" : "str"} - _instancegridmap = [["Workflow Data", "self.wfdata_name", "string", ""], - ["Template\nName", "self.name", "string", ""], - ["# Steps", "self._nstates", "string", ""], - ["Status", "self._activity_name", "string", ""], - ["Pending\nAction", "self._next_activity_name", "string", ""]] + _instancegridmap = [["Workflow Data", "self.wfdata_name", "string", ""], + ["Template\nName", "self.name", "string", ""], + ["# Steps", "self._nstates", "string", ""], + ["Status", "self._activity_name", "string", ""], + ["Status Date", "self._activity_due_date_str", "string", "colour"], + ["Pending\nAction", "self._next_activity_name", "string", ""]] def __init__(self, name, activities, transitiondict, transitions, canstartlist, defaultstart): @@ -81,6 +85,8 @@ self._CreateDateStr = self.GetCreateDateStr() self._activity_name = "N/A" self._next_activity_name = "" + self._activity_date = "" + self._activity_due_date = "" self.activityId = None self.wfdata = None self.wfdata_name = "" @@ -124,20 +130,31 @@ def initiate(self, wfdata): - print "wfprocess.initiate", self.defaultstartid - if self.defaultstartid: - self.activities[self.defaultstartid].changeState(OPEN_NOTSTARTED) +# print "wfprocess.initiate", self.defaultstartid self.activityId = self.defaultstartid - self._activity_name = self.activities[self.activityId].getName() + if self.activityId: + current_activity = self.activities[self.activityId] + current_activity.changeState(OPEN_NOTSTARTED) + self._activity_name = current_activity.getName() +# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) + now = mx.DateTime.DateFromTicks(wfdata.create_datetime) + duedate = now + mx.DateTime.RelativeDateTime(days=current_activity.getDuration()) + self._activity_due_date = duedate + self._activity_due_date_str = datetimes.getDisplayDate(duedate) + + self.getNextActivityName() + self.SetData(wfdata) + + def getNextActivityName(self): nexttranslist = self.transitions[self.activityId] #print "next transitions", nexttranslist if len(nexttranslist) > 0: nextid = nexttranslist[0] nexttransition = self.transitionsdict[nextid] self._next_activity_name = self.activities[nexttransition.to_activity].getName() - self.SetData(wfdata) - + return "" + def changeState(self, newState): # wfmc specification Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py:1.2 PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py:1.3 --- PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py:1.2 Mon Jun 30 15:52:06 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid_wdr.py Thu Oct 2 15:31:23 2003 @@ -10,6 +10,7 @@ from wxPython.grid import * + # Window functions WF_PROCESS_NAME = wxNewId() @@ -36,7 +37,7 @@ item4 = wxStaticBoxSizer( item5, wxVERTICAL ) item6 = wxGrid( parent, WF_ACTIVITY_GRID, wxDefaultPosition, wxSize(200,160), wxWANTS_CHARS ) - item6.CreateGrid( 10, 3 ) + item6.CreateGrid( 10, 6 ) item4.AddWindow( item6, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ) item7 = wxBoxSizer( wxHORIZONTAL ) Index: PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.11 PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.12 --- PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.11 Mon Sep 29 13:35:50 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py Thu Oct 2 15:31:23 2003 @@ -53,9 +53,6 @@ self.fields = {} -# def SetDataManager(self, datamgr): -# self.DataManager = datamgr - def GetData(self): # must be overridden by subclass pass Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.3 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.4 --- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.3 Fri Sep 26 15:47:11 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py Thu Oct 2 15:31:23 2003 @@ -11,24 +11,14 @@ # Copyright: #---------------------------------------------------------------------------- +import mx.DateTime from wxPython.wx import * from wxPython.grid import * -#import os.path - -#import shutil from pangalactic.enterprise.workflow.wfprocessoverview import WfProcessOverview, WorkflowState from workflowgrid import WorkflowGrid, WF_EDIT, WF_VIEW -#import workflow_wizard import wfdatatable -#import pangalactic.utils.toolstate as toolstate -#import pangalactic.utils.pgdialogs as pgdialogs -#import pangalactic.utils.toolframe as toolframe - -#WF_WIZARD = wxNewId() -#WF_SAVE = wxNewId() - class WfInstanceOverview(WfProcessOverview): """ @@ -69,13 +59,69 @@ self.gridtable = wfdatatable.WfDataTable() if len(datalist) > 0: self.gridtable.setGridMap(datalist[0]._instancegridmap) -# print "instance.table.displaymapping", self.gridtable.GetDisplayMapping() self.grid = WorkflowGrid(self, -1, savename = tablename, dbroot = self.DataManager.dbroot, intable = self.gridtable) self.grid.SetSize(self.parent.GetClientSize()) self.FillGrid(datalist) - + self.setColourByDueDate(datalist) + EVT_MENU(self.grid, WF_EDIT, self.OnWorkflowEdit) EVT_MENU(self.grid, WF_VIEW, self.OnWorkflowView) + def setColourByDueDate(self, wfobj_list): + msg = "alertgrid.setcolour" + #print msg + somecol = None + displaymap = wfobj_list[0]._instancegridmap + + for ndx in range(len(displaymap)): + colinfo = displaymap[ndx] + if colinfo[3] == "colour": + somecol = ndx + + if somecol == None: + return + + for row in range(self.grid.GetNumberRows()): + wfobj = self.grid.GetDataObj(row) + msg += "set bg colour for row: " + str(row) + colour = wxLIGHT_GREY + + now = mx.DateTime.DateFromTicks(mx.DateTime.now()) + duedate = wfobj._activity_due_date + wfobj_fields = wfobj.getActivity(wfobj.activityId).GetFields() + #print wfobj_fields + late = int(wfobj_fields["late"]) + very_late = int(wfobj_fields["very_late"]) + lost_cause = int(wfobj_fields["lost_cause"]) + + #print duedate, late, very_late, lost_cause + + if duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)) <= now: + colour = wxColour(225, 0, 0) + msg += "; Waaay Overdue" + elif duedate + mx.DateTime.RelativeDateTime(days=(+very_late)) <= now: + colour = wxTheColourDatabase.FindColour("CORAL") + msg += "; Very Late" + elif duedate + mx.DateTime.RelativeDateTime(days=(+late)) <= now: + colour = wxTheColourDatabase.FindColour("YELLOW") + msg += "; Late" + else: + colour = wxColour(0, 240, 80) + msg += "; on time" + + self.grid.SetCellBackgroundColour(row, somecol, colour) + #print msg + +## get the attr for the wxAttrKind.Row (= 3) +## GetAttr needs the type of attr to get, despite what the docs say +## The values are: +## +## wxGridCellAttr.Any (Any == 0) +## wxGridCellAttr.Default +## wxGridCellAttr.Cell +## wxGridCellAttr.Row +## wxGridCellAttr.Col +## wxGridCellAttr.Merged + Index: PanGalactic/pangalactic/enterprise/workflow/wffactory.py diff -u PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.5 PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.6 --- PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.5 Mon Sep 29 13:35:50 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wffactory.py Thu Oct 2 15:31:23 2003 @@ -10,10 +10,10 @@ DEFAULT_WORKFLOW = ("WF0", - {0:{"activity":"Initiated", "duration":"28", "description":"Initial Draft"}, - 1:{"activity":"Draft", "duration":"28", "description":"Final Draft"}, - 2:{"activity":"Approved", "duration":"14", "description":"Approved for Release"}, - 3:{"activity":"Released", "duration":"21", "description":"Released to Distribution List"}}, + {0:{"activity":"Initiated", "duration":"28", "late":"7", "very_late":"30", "lost_cause":"60", "description":"Initial Draft"}, + 1:{"activity":"Draft", "duration":"28", "late":"14", "very_late":"60", "lost_cause":"30", "description":"Final Draft"}, + 2:{"activity":"Approved", "duration":"14", "late":"30", "very_late":"60", "lost_cause":"30", "description":"Approved for Release"}, + 3:{"activity":"Released", "duration":"21", "late":"30", "very_late":"30", "lost_cause":"90", "description":"Released to Distribution List"}}, {0:{"from":"Initiated", "to":"Draft"}, 1:{"from":"Draft", "to":"Approved"}, @@ -100,12 +100,14 @@ obj.oid = pgef_oid obj.pgef_oid = pgef_oid activities[pgef_oid] = obj + #print "activity", obj a_old2new[akey] = pgef_oid # synchronize the default start activity if akey == wfobj.defaultstartid: newwfobj.defaultstartid = pgef_oid + #print "activities", activities transitionsdict = {} t_old2new = {} for tkey, tvalue in wfobj.transitionsdict.items(): Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.6 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.7 --- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.6 Wed Oct 1 13:24:13 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py Thu Oct 2 15:31:23 2003 @@ -82,7 +82,7 @@ # print "wfgrid.table.displaymapping", self.table.GetDisplayMapping() - + def RefreshFromObjects(self): #simplified refresh #print "wfgrid.refresh" Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.15 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.16 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.15 Thu Sep 4 16:04:25 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Thu Oct 2 15:31:23 2003 @@ -78,6 +78,7 @@ self.act_labels = [] for actinfo in self.ActInfo: + print "actinfo", actinfo self.act_labels.append(actinfo[2]) self.trans_labels = [] @@ -208,21 +209,18 @@ def createWorkflow(self, name, activities, transitions): - #print "wizard.createWorkflow" + print "wizard.createWorkflow" -# process = wfprocess.WfProcess(name, {}, {}, canstartlist = [0], defaultstart = 0) process = wffactory.simpleWfProcess(name) activitydict = {} wfdata = None for akey, avalue in activities.items(): - #print "akey", akey - #print "akey", akey, "; avalue", avalue -# wfactivity = wfactivity.WfActivity(avalue["activity"], avalue, wfdata, process.pgef_oid) + print "akey", akey, "; avalue", avalue wfactivity = wffactory.newWfActivity(avalue["activity"], process.pgef_oid, avalue, wfdata) activitydict[wfactivity.pgef_oid] = wfactivity self.DataManager.Add([wfactivity]) - #print "activitydict", activitydict + print "activitydict", activitydict fromlist = [] tolist = [] @@ -266,17 +264,16 @@ def Save(self, event = None): - #print "workflow_wizard.save" + print "workflow_wizard.save" if self.DataManager.creatingWorkflow: self.DataManager.creatingWorkflow = false transitions = self.GetTransitions() activities = self.GetActivities() name = self.GetName() - #print "name <", name, ">" + print "name <", name, ">" if name: self.workflow = self.createWorkflow(name, activities, transitions) -# self.workflow.setDataManager(self.DataManager) self.DataManager.addWorkflow(self.workflow) self.displayWgt.AddData(self.workflow) self.saved_workflow = true @@ -346,15 +343,34 @@ row = 0 key_col = 0 time_col = 1 - desc_col = 2 + time_late_col = 2 + time_very_late_col = 3 + time_lost_cause_col = 4 + desc_col = 5 for akey, avalue in wfobj.activities.items(): #print akey, avalue.fields self.activitygrid.SetCellValue(row, key_col, avalue.fields["activity"]) self.activitygrid.SetCellValue(row, time_col, avalue.fields["duration"]) + self.activitygrid.SetCellValue(row, time_late_col, avalue.fields["late"]) + self.activitygrid.SetCellValue(row, time_very_late_col, avalue.fields["very_late"]) + self.activitygrid.SetCellValue(row, time_lost_cause_col, avalue.fields["lost_cause"]) self.activitygrid.SetCellValue(row, desc_col, avalue.fields["description"]) row += 1 + red = wxColour(225, 0, 0) + orange = wxTheColourDatabase.FindColour("CORAL") + yellow = wxTheColourDatabase.FindColour("YELLOW") + self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, red) + self.SetColBackgroundColour(self.activitygrid, time_very_late_col, orange) + self.SetColBackgroundColour(self.activitygrid, time_late_col, yellow) + + + def SetColBackgroundColour(self, grid, col, colour): + numrows = grid.GetNumberRows() + for row in range(numrows): + grid.SetCellBackgroundColour(row, col, colour) + def SetActivities(self, activitydict): for row, value in activitydict.items(): Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.33 PanGalactic/pangalactic/utils/datamanager.py:1.34 --- PanGalactic/pangalactic/utils/datamanager.py:1.33 Mon Sep 29 13:35:50 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Thu Oct 2 15:31:23 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.33 $"[11:-2] +__version__ = "$Revision: 1.34 $"[11:-2] import time import mx.DateTime @@ -92,6 +92,10 @@ product_model_version = None PartNumber, Revision, ModelType, ModelRev = data_list + + #tbd make a project object and pass it in... + #project = Project(self.currentProject) + if PartNumber: #print 'Creating product master' product_master = ProductMaster(id = PartNumber, @@ -100,21 +104,21 @@ if product_master and Revision: #print 'Creating product version' - product_version = ProductVersion(pm = product_master, + product_version = ProductVersion(_of_master = product_master, project_id = self.currentProject, id = Revision, id_context = self.currentProject) if product_version and ModelType: #print 'Creating product model master' - product_model_master = ProductModelMaster(pv = product_version, + product_model_master = ProductModelMaster(_of_version = product_version, project_id = self.currentProject, id = ModelType, id_context = self.currentProject) if product_model_master and ModelRev: #print 'Creating product model version' - product_model_version = ProductModelVersion(pmm = product_model_master, + product_model_version = ProductModelVersion(_of_model_master = product_model_master, project_id = self.currentProject, id = ModelRev, id_context = self.currentProject) From waterbug at ned.gsfc.nasa.gov Thu Oct 2 22:50:36 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 2 21:50:38 2003 Subject: [Pangalactic-commits] Add scripts to setup and populate as separate database for unit tests. Message-ID: <200310030150.h931oaRu005903@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/populate_pgertestdb.sh None 1.1 PanGalactic/src/sql/setup_pgertestdb.sh None 1.1 Log message: Add scripts to setup and populate as separate database for unit tests. From waterbug at ned.gsfc.nasa.gov Thu Oct 2 22:58:54 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 2 21:58:55 2003 Subject: [Pangalactic-commits] Renamed setup_testpgerdb.sh and populate_testpgerdb.sh. Message-ID: <200310030158.h931wsTO005973@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/populate_testpgerdb.sh None 1.1 PanGalactic/src/sql/setup_testpgerdb.sh None 1.1 PanGalactic/src/sql/README 1.4 1.5 PanGalactic/src/sql/populate_pgertestdb.sh 1.1 None PanGalactic/src/sql/setup_pgertestdb.sh 1.1 None Log message: Renamed setup_testpgerdb.sh and populate_testpgerdb.sh. Index: PanGalactic/src/sql/README diff -u PanGalactic/src/sql/README:1.4 PanGalactic/src/sql/README:1.5 --- PanGalactic/src/sql/README:1.4 Sun Jun 15 21:39:02 2003 +++ PanGalactic/src/sql/README Thu Oct 2 21:58:53 2003 @@ -1,10 +1,9 @@ -(1) insertPgerDbReferenceData.sql loads basic data that are -needed to satisfy referential integrity constraints for some -default values, so it needs to be run before any other data is -added to PGERDB. +(1) insertRefData.sql loads basic data that are needed to satisfy +referential integrity constraints for some default values, so it +needs to be run before any other data is added to PGERDB. -(2) insertPgerDbTestData.sql loads data required by the test -scripts in pangalactic.test +(2) insertTestData.sql loads data required by the test scripts in +pangalactic.test (3) The following are the shell and python scripts and data: @@ -45,9 +44,6 @@ using the tablesunsorted file insertACUs.sql ........ inserts test data for AssemblyComponentUsages -insertPgerDbReferenceData.sql ... inserts reference data needed - for all pgerdb data and applications -insertPgerDbTestData.sql ... inserts basic test data insertProductMasters.sql ... inserts test data for ProductMasters insertProductModelMasters.sql ... inserts test data for ProductModelMasters @@ -55,7 +51,8 @@ ProductModelVersions insertProductVersions.sql ... inserts test data for ProductVersions -insertRefData.sql ..... inserts reference data used in tests +insertRefData.sql ..... inserts reference data +insertTestData.sql .... inserts basic test data listalters ............ generates a sorted list of all altered tables listtables ............ generates a sorted list of all created @@ -67,9 +64,13 @@ listtablesunsorted > tablesunsorted) populate_pgerdb.sh .... runs all scripts to load PGERDB with reference data and test data +populate_testpgerdb.sh ... runs all scripts to load the test PGERDB + with reference data and test data README ................ this file -setup_pgerdb.sh ...... creates PGERDB (if necessary) and runs +setup_pgerdb.sh ....... creates PGERDB (if necessary) and runs the create script +setup_testpgerdb.sh ... creates a separate PGERDB for unit tests and + runs the create script tables ................ a sorted list of all created tables (created using listtables > tables) From waterbug at ned.gsfc.nasa.gov Thu Oct 2 23:15:12 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 2 22:15:13 2003 Subject: [Pangalactic-commits] Add unit test script for p.repo.factory. Message-ID: <200310030215.h932FC2V006301@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/ut_repofactory.py None 1.1 PanGalactic/pangalactic/test/IDTEST 1.12 1.13 PanGalactic/pangalactic/test/test_db_addrow.py 1.8 1.9 PanGalactic/pangalactic/test/test_db_addrows.py 1.1 1.2 PanGalactic/pangalactic/test/test_sql.py 1.5 1.6 Log message: Add unit test script for p.repo.factory. Index: PanGalactic/pangalactic/test/test_db_addrows.py diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.1 PanGalactic/pangalactic/test/test_db_addrows.py:1.2 --- PanGalactic/pangalactic/test/test_db_addrows.py:1.1 Fri Sep 26 22:28:13 2003 +++ PanGalactic/pangalactic/test/test_db_addrows.py Thu Oct 2 22:15:10 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_addrows.py,v 1.1 2003/09/27 02:28:13 waterbug Exp $ +# $Id: test_db_addrows.py,v 1.2 2003/10/03 02:15:10 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -10,10 +10,14 @@ import time, os from pprint import pprint from twisted.internet import reactor -from twisted.enterprise import adbapi from pangalactic.repo.db import PgerDb from pangalactic.utils import oid +from pangalactic.enterprise.productmaster import ProductMaster as PM +from pangalactic.enterprise.productversion import ProductVersion as PV +from pangalactic.enterprise.project import Project +from pangalactic.utils.factory import PgefFactory as PF +factory = PF() db = PgerDb() f = open('IDTEST') @@ -27,46 +31,21 @@ f.write(testid) f.close() -pmid = testid -pvid = testid + 'A' +pmid = 'MD-' + testid +pmname = 'Mr. Dynamo ' + testid -dict = { - 'product_version' : [ - [('pgef_oid', testoid2), - ('name', 'Mr. Dynamo addRows' + testid + ' Version A'), - ('id', pvid), - ('id_context', 'TEST'), - ('of_pm_id', pmid), - ('of_pm_id_context', 'TEST'), - ('project_id', 'TEST'), - ('project_id_context', 'TEST')] - ], - 'product_master' : [ - [('pgef_oid', testoid1), - ('name', 'Mr. Dynamo addRows' + testid), - ('id', pmid), - ('id_context', 'TEST'), - ('project_id', 'TEST'), - ('project_id_context', 'TEST')] - ] - } - -pprint(dict) - -db.addRows(dict) - -print 'product_master:' -print ' id = "%s"' % pmid -print ' id_context = "%s"' % 'TEST' -print -print 'product_version:' -print ' id = "%s"' % pvid -print ' of_pm_id = "%s"' % testid -print ' of_pm_id_context = "%s"' % 'TEST' -print +p = Project(pgef_oid='test.project.1', id='TEST', id_context='TEST') +pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p) +pv = PV(_of_master=pm, id='A') + +pme = factory.extract(pm) +pve = factory.extract(pv) + +extracts = [pme, pve] + +db.addRows(extracts) def success(stuff): - # now stuff is a tuple, (result, logmsg) pprint(stuff) reactor.stop() @@ -74,15 +53,12 @@ print error reactor.stop() -res = db.doPgerdbQuery('pgef_object', - ('pgef_class', 'Product%'), - ('name', 'Mr. Dynamo%') - ) - res.addCallbacks(success, failure) reactor.run() # start the main loop -time.sleep(1) -reactor.stop() +res = db.doPgerdbQuery('pgef_object', 1, + ('pgef_class', 'Product%'), + ('name', 'Mr. Dynamo%') + ) Index: PanGalactic/pangalactic/test/test_db_addrow.py diff -u PanGalactic/pangalactic/test/test_db_addrow.py:1.8 PanGalactic/pangalactic/test/test_db_addrow.py:1.9 --- PanGalactic/pangalactic/test/test_db_addrow.py:1.8 Mon Sep 15 16:38:32 2003 +++ PanGalactic/pangalactic/test/test_db_addrow.py Thu Oct 2 22:15:10 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_addrow.py,v 1.8 2003/09/15 20:38:32 waterbug Exp $ +# $Id: test_db_addrow.py,v 1.9 2003/10/03 02:15:10 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -8,6 +8,7 @@ """ import time, os +from pprint import pprint from twisted.internet import reactor from twisted.enterprise import adbapi from pangalactic.repo.db import PgerDb @@ -25,20 +26,21 @@ f.write(testid) f.close() -db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', - id=testid, id_context='TEST', - project_id='TEST', project_id_context='TEST') - def success(stuff): # now stuff is a tuple, (result, logmsg) - print stuff + pprint(stuff) reactor.stop() def failure(error): print error reactor.stop() -res = db.doPgerdbQuery('product_master', ('name', 'Mr. Dynamo')) +db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', + id=testid, id_context='TEST', + project_id='TEST', project_id_context='TEST') + +res = db.doPgerdbQuery('product_master', 0, + ('name', 'Mr. Dynamo')) res.addCallbacks(success, failure) reactor.run() # start the main loop @@ -46,3 +48,4 @@ time.sleep(1) reactor.stop() + Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.12 PanGalactic/pangalactic/test/IDTEST:1.13 --- PanGalactic/pangalactic/test/IDTEST:1.12 Fri Sep 26 22:20:06 2003 +++ PanGalactic/pangalactic/test/IDTEST Thu Oct 2 22:15:10 2003 @@ -1 +1 @@ -166 \ No newline at end of file +189 \ No newline at end of file Index: PanGalactic/pangalactic/test/test_sql.py diff -u PanGalactic/pangalactic/test/test_sql.py:1.5 PanGalactic/pangalactic/test/test_sql.py:1.6 --- PanGalactic/pangalactic/test/test_sql.py:1.5 Fri Sep 26 22:20:06 2003 +++ PanGalactic/pangalactic/test/test_sql.py Thu Oct 2 22:15:11 2003 @@ -1,4 +1,4 @@ -# $Id: test_sql.py,v 1.5 2003/09/27 02:20:06 waterbug Exp $ +# $Id: test_sql.py,v 1.6 2003/10/03 02:15:11 waterbug Exp $ """ Functional tests for pangalactic.utils.sql module @@ -16,7 +16,7 @@ def test_1_equals(self): """CASE: one string column, '=' operator""" - cmd = buildSelect('product_master', + cmd = buildSelect('product_master', 0, ('id_context', 'TEST', '=')) expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s', 'TEST') @@ -24,7 +24,7 @@ def test_2_equals_and_like(self): """CASE: several string columns; like and =""" - cmd = buildSelect('product_master', + cmd = buildSelect('product_master', 0, ('id_context', 'TEST', '='), ('name', 'Mr. F') ) @@ -33,7 +33,7 @@ def test_3_in_sequence(self): """CASE: one column and a sequence of values""" - cmd = buildSelect('alert', + cmd = buildSelect('alert', 0, ('doc_number', ("XG4-D-02-03", "XG4-D-02-05", @@ -43,7 +43,7 @@ def test_4_date_interval(self): """CASE: date interval""" - cmd = buildSelect('alert', + cmd = buildSelect('alert', 0, ('doc_issue_date', '2002-04-01', '>'), ('doc_issue_date', '2002-05-01', '<') ) @@ -52,7 +52,7 @@ def test_5_sort(self): """CASE: order by one column""" - cmd = buildSelect('alert', + cmd = buildSelect('alert', 0, ('doc_issue_date', '2002-04-01', '>'), sort='doc_issue_date') expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date', '2002-04-01') @@ -60,7 +60,7 @@ def test_6_multi_sort(self): """CASE: order by multiple columns""" - cmd = buildSelect('alert', + cmd = buildSelect('alert', 0, ('doc_issue_date', '2002-04-01', '>'), sort=('doc_issue_date', 'doc_designator') ) From waterbug at ned.gsfc.nasa.gov Thu Oct 2 23:33:54 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 2 22:33:55 2003 Subject: [Pangalactic-commits] Clean out obsolete self-test code (keep the function; update later). Message-ID: <200310030233.h932Xsln006382@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/factory.py 1.25 1.26 Log message: Clean out obsolete self-test code (keep the function; update later). Index: PanGalactic/pangalactic/repo/factory.py diff -u PanGalactic/pangalactic/repo/factory.py:1.25 PanGalactic/pangalactic/repo/factory.py:1.26 --- PanGalactic/pangalactic/repo/factory.py:1.25 Mon Sep 29 14:45:26 2003 +++ PanGalactic/pangalactic/repo/factory.py Thu Oct 2 22:33:52 2003 @@ -1,11 +1,11 @@ -# $Id: factory.py,v 1.25 2003/09/29 18:45:26 waterbug Exp $ +# $Id: factory.py,v 1.26 2003/10/03 02:33:52 waterbug Exp $ """ Pan Galactic Object Factory module -@version: $Revision: 1.25 $ +@version: $Revision: 1.26 $ """ -__version__ = "$Revision: 1.25 $"[11:-2] +__version__ = "$Revision: 1.26 $"[11:-2] import types from pprint import pprint @@ -49,34 +49,59 @@ def test(self, classname): """ Test the factory. - - @param classname: the name of a class that occurs in - self._registry.pger_objects.values() """ - print ' - class is: %s' % classname - print """ - initparms for '%s' objects are:""" % classname - pprint(self._registry.obj_init_parms[classname]) + pass def makeExtracts(self, reslist): """ - Convert a pyPgSQL resultset into an S-expression-style - list of strings and integers for transport. + Convert a pyPgSQL resultset into "extract" format (see + L{pangalactic.utils.factory}). """ - extractlist = [] + extracts = [] if reslist: for res in reslist: obj = self._registry.pgerdb_classes[res.pgef_class] schema = obj._schema module = obj.__module__ - data = [ [a, self.cook(getattr(res, a), schema[a])] - for a in schema ] + s = [ (a, self.cook(getattr(res, a), schema[a])) + for a in schema ] + if obj._refd: + # strictly for testing purposes! + r = [ (a, 'pgef_oid') + for a in obj._refd ] + s += r + instdict = dict(s) name = module + '.' + res.pgef_class - extr = [ name, data ] - extractlist.append(extr) - return extractlist + extr = [ name, instdict ] + extracts.append(extr) + return extracts else: return [] + def extracts2Records(self, extracts): + """ + Take a list of extracts and convert them to a list of + "records" for use in the addRows() method of + L{pangalactic.repo.db.PgerDb}. + + @type extracts: a list + @param extracts: a list of extracts -- see + L{pangalactic.utils.factory.extract} + + @rtype: list + @return: a list of "records". A record has the following + structure: [tablename, {colname : value, ...}] + """ + recs = [] + for e in extracts: + classname = e[0].split('.')[-1] + schema = self._registry.pgef_classes[classname]._schema + table = self._registry.getTableName(classname) + for a in e[1]: + e[1][a] = self._factory.uncook(e[1][a], schema[a]) + recs.append([table, e[1]]) + return recs + def unmakeObject(self, obj): """ Take an object and return its attributes as a dictionary @@ -118,8 +143,8 @@ for row in resultsets: # create kw dict for initialization string ... initparms = {} - for i in schema: - initparms[i] = getattr(row, i) + for a in schema: + initparms[a] = getattr(row, a) # initialize the object o = klass(**initparms) objectlist.append(o) From waterbug at ned.gsfc.nasa.gov Sat Oct 4 01:26:10 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 00:26:12 2003 Subject: [Pangalactic-commits] Mods for working tests; even a real twisted-trial-style unit test, and test_db_addrows works! (RARR!!) Message-ID: <200310040426.h944QAaD025106@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_factory_extracts2Records.py None 1.1 PanGalactic/pangalactic/test/ut_sql.py None 1.1 PanGalactic/pangalactic/test/IDTEST 1.13 1.14 PanGalactic/pangalactic/test/test_db_addrow.py 1.9 1.10 PanGalactic/pangalactic/test/test_db_addrows.py 1.2 1.3 PanGalactic/pangalactic/test/test_sql.py 1.6 1.7 PanGalactic/pangalactic/test/ut_repofactory.py 1.1 1.2 Log message: Mods for working tests; even a real twisted-trial-style unit test, and test_db_addrows works! (RARR!!) Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.13 PanGalactic/pangalactic/test/IDTEST:1.14 --- PanGalactic/pangalactic/test/IDTEST:1.13 Thu Oct 2 22:15:10 2003 +++ PanGalactic/pangalactic/test/IDTEST Sat Oct 4 00:26:08 2003 @@ -1 +1 @@ -189 \ No newline at end of file +220 \ No newline at end of file Index: PanGalactic/pangalactic/test/test_db_addrow.py diff -u PanGalactic/pangalactic/test/test_db_addrow.py:1.9 PanGalactic/pangalactic/test/test_db_addrow.py:1.10 --- PanGalactic/pangalactic/test/test_db_addrow.py:1.9 Thu Oct 2 22:15:10 2003 +++ PanGalactic/pangalactic/test/test_db_addrow.py Sat Oct 4 00:26:08 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_addrow.py,v 1.9 2003/10/03 02:15:10 waterbug Exp $ +# $Id: test_db_addrow.py,v 1.10 2003/10/04 04:26:08 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -16,18 +16,17 @@ db = PgerDb() -f = open(os.getcwd() + '/IDTEST') +f = open('IDTEST') savedid = f.read() testoid = oid.generate('test') testid = str(int(savedid) + 1) f.close() -f = open(os.getcwd() + '/IDTEST', 'w') +f = open('IDTEST', 'w') f.write(testid) f.close() def success(stuff): - # now stuff is a tuple, (result, logmsg) pprint(stuff) reactor.stop() @@ -35,17 +34,16 @@ print error reactor.stop() -db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', - id=testid, id_context='TEST', - project_id='TEST', project_id_context='TEST') +def ifNone(x): + if not x: + res = db.doPgerdbQuery('product_master', 0, + ('name', 'Mr. Dynamo')) + res.addCallbacks(success, failure) + +out = db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', + id=testid, id_context='TEST', + project_id='TEST', project_id_context='TEST') +out.addCallback(ifNone) -res = db.doPgerdbQuery('product_master', 0, - ('name', 'Mr. Dynamo')) -res.addCallbacks(success, failure) - -reactor.run() # start the main loop - -time.sleep(1) - -reactor.stop() +reactor.run() Index: PanGalactic/pangalactic/test/test_db_addrows.py diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.2 PanGalactic/pangalactic/test/test_db_addrows.py:1.3 --- PanGalactic/pangalactic/test/test_db_addrows.py:1.2 Thu Oct 2 22:15:10 2003 +++ PanGalactic/pangalactic/test/test_db_addrows.py Sat Oct 4 00:26:08 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_addrows.py,v 1.2 2003/10/03 02:15:10 waterbug Exp $ +# $Id: test_db_addrows.py,v 1.3 2003/10/04 04:26:08 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -15,9 +15,11 @@ from pangalactic.enterprise.productmaster import ProductMaster as PM from pangalactic.enterprise.productversion import ProductVersion as PV from pangalactic.enterprise.project import Project -from pangalactic.utils.factory import PgefFactory as PF +from pangalactic.repo.factory import PgerObjectFactory as POF +from pangalactic.repo.registry import PgerObjectRegistry as POR -factory = PF() +reg = POR() +fac = POF(reg) db = PgerDb() f = open('IDTEST') @@ -31,19 +33,26 @@ f.write(testid) f.close() +projid = 'MD' + testid +projname = 'MD' + testid + ' Project' pmid = 'MD-' + testid -pmname = 'Mr. Dynamo ' + testid +pmname = 'MD-' + testid + ' Model Mr. Dynamo' +pvname = 'MD-' + testid + ' Version A' -p = Project(pgef_oid='test.project.1', id='TEST', id_context='TEST') +# create test objects +p = Project(id=projid, id_context='TEST', name=projname) +p.popTestData() pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p) -pv = PV(_of_master=pm, id='A') +pm.popTestData() +pv = PV(_of_master=pm, id='A', name=pvname) +pv.popTestData() + +pe = fac.extract(p) +pme = fac.extract(pm) +pve = fac.extract(pv) -pme = factory.extract(pm) -pve = factory.extract(pv) - -extracts = [pme, pve] - -db.addRows(extracts) +extracts = [pe, pme, pve] +recs = fac.extracts2Records(extracts) def success(stuff): pprint(stuff) @@ -53,12 +62,14 @@ print error reactor.stop() -res.addCallbacks(success, failure) +def ifNone(x): + if not x: + res = db.doPgerdbQuery('pgef_object', 1, + ('name', 'MD')) + res.addCallbacks(success, failure) -reactor.run() # start the main loop +out = db.addRows(recs) +out.addCallback(ifNone) +reactor.run() -res = db.doPgerdbQuery('pgef_object', 1, - ('pgef_class', 'Product%'), - ('name', 'Mr. Dynamo%') - ) Index: PanGalactic/pangalactic/test/test_sql.py diff -u PanGalactic/pangalactic/test/test_sql.py:1.6 PanGalactic/pangalactic/test/test_sql.py:1.7 --- PanGalactic/pangalactic/test/test_sql.py:1.6 Thu Oct 2 22:15:11 2003 +++ PanGalactic/pangalactic/test/test_sql.py Sat Oct 4 00:26:08 2003 @@ -1,4 +1,4 @@ -# $Id: test_sql.py,v 1.6 2003/10/03 02:15:11 waterbug Exp $ +# $Id: test_sql.py,v 1.7 2003/10/04 04:26:08 waterbug Exp $ """ Functional tests for pangalactic.utils.sql module @@ -15,7 +15,7 @@ class SqlGenerationTest(unittest.TestCase): def test_1_equals(self): - """CASE: one string column, '=' operator""" + """CASE: build a SELECT by one string column, '=' operator""" cmd = buildSelect('product_master', 0, ('id_context', 'TEST', '=')) expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s', @@ -23,7 +23,7 @@ self.assertEquals(expected, cmd) def test_2_equals_and_like(self): - """CASE: several string columns; like and =""" + """CASE: build a SELECT by several string columns; like and =""" cmd = buildSelect('product_master', 0, ('id_context', 'TEST', '='), ('name', 'Mr. F') @@ -32,7 +32,7 @@ self.assertEquals(expected, cmd) def test_3_in_sequence(self): - """CASE: one column and a sequence of values""" + """CASE: build a SELECT by one column with a sequence of values""" cmd = buildSelect('alert', 0, ('doc_number', ("XG4-D-02-03", @@ -42,7 +42,7 @@ self.assertEquals(expected, cmd) def test_4_date_interval(self): - """CASE: date interval""" + """CASE: build a SELECT by date interval""" cmd = buildSelect('alert', 0, ('doc_issue_date', '2002-04-01', '>'), ('doc_issue_date', '2002-05-01', '<') @@ -51,7 +51,7 @@ self.assertEquals(expected, cmd) def test_5_sort(self): - """CASE: order by one column""" + """CASE: build a SELECT with order by one column""" cmd = buildSelect('alert', 0, ('doc_issue_date', '2002-04-01', '>'), sort='doc_issue_date') @@ -59,7 +59,7 @@ self.assertEquals(expected, cmd) def test_6_multi_sort(self): - """CASE: order by multiple columns""" + """CASE: build a SELECT with order by multiple columns""" cmd = buildSelect('alert', 0, ('doc_issue_date', '2002-04-01', '>'), sort=('doc_issue_date', 'doc_designator') @@ -67,30 +67,21 @@ expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date, doc_designator,', '2002-04-01') self.assertEquals(expected, cmd) - def test_7_insert_from_args(self): - """CASE: insert a record into a table (using arg signature)""" - cmd = buildInsert('product_master', - ('id', '123'), - ('id_context', 'TEST') - ) - expected = ('INSERT INTO product_master (id, id_context) VALUES (%s, %s)', '123', 'TEST') - self.assertEquals(expected, cmd) - - def test_8_insert_from_kws(self): - """CASE: insert a record into a table (using kw signature)""" - cmd = buildInsert('product_master', - **{'id' : '123', - 'id_context' : 'TEST'} - ) - expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', 'TEST', '123') - self.assertEquals(expected, cmd) - - def test_9_sqlinsert_from_args(self): - """CASE: sql string to insert a record into a table (using arg signature)""" - cmd = buildSQLInsert('product_master', - ('id', '123'), - ('id_context', 'TEST') - ) - expected = ("""INSERT INTO product_master (id, id_context) VALUES ('123', 'TEST')""") - self.assertEquals(expected, cmd) + def test_7_buildInsert(self): + """CASE: build an INSERT statement + parameter list""" + result = buildInsert('product_master', + {'id' : '123', + 'id_context' : 'TEST'} + ) + expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123')) + self.assertEquals(expected, result) + +# def test_9_buildTransaction(self): +# """CASE: sql string to insert a record into a table (using arg signature)""" +# cmd = buildInsert('product_master', +# ('id', '123'), +# ('id_context', 'TEST') +# ) +# expected = ("""INSERT INTO product_master (id, id_context) VALUES ('123', 'TEST')""") +# self.assertEquals(expected, cmd) Index: PanGalactic/pangalactic/test/ut_repofactory.py diff -u PanGalactic/pangalactic/test/ut_repofactory.py:1.1 PanGalactic/pangalactic/test/ut_repofactory.py:1.2 --- PanGalactic/pangalactic/test/ut_repofactory.py:1.1 Thu Oct 2 22:15:11 2003 +++ PanGalactic/pangalactic/test/ut_repofactory.py Sat Oct 4 00:26:08 2003 @@ -1,4 +1,4 @@ -# $Id: ut_repofactory.py,v 1.1 2003/10/03 02:15:11 waterbug Exp $ +# $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $ """ Unit tests for pangalactic.repo.factory module @@ -7,101 +7,102 @@ from twisted.trial import unittest from twisted.internet import reactor from pangalactic.repo.db import PgerDb -from pangalactic.repo.factory import PgerObjectFactory -from pangalactic.repo.registry import PgerObjectRegistry - -typename = 'ProductMaster' - -def success(objectlist): - print objectlist - for o in objectlist: - print o - print "\n*** %s %s object(s) found. ***\n" % (len(objectlist), typename) - reactor.stop() - -def failure(error): - print error - reactor.stop() - -db = PgerDb() -registry = PgerObjectRegistry() -factory = PgerObjectFactory(registry) - -result = db.doPgerdbQuery('product_master', 0, ['id_context', 'TEST', '=']) -result.addCallbacks(lambda x: factory.makeObjects(typename, x)).addCallbacks(success, failure) - -reactor.run() # start the main loop - -""" -Functional test for pangalactic.repo.factory module -*** using non-deferred input *** - - connects to PostgreSQL using adbapi.py - - executes *synchronous* query - - runs factory.makeobjects on result - - outputs resulting list of objects -""" - -from pyPgSQL import PgSQL -from pangalactic.repo.factory import PgerObjectFactory -from pangalactic.repo.registry import PgerObjectRegistry - -registry = PgerObjectRegistry() -factory = PgerObjectFactory(registry) - -conn = PgSQL.connect(database='pgerdb') -curs = conn.cursor() -curs.execute('SELECT * from product_model_version where name = %s', - ('HOG-42')) -result = curs.fetchall() -print result -objectlist = factory.makeObjects('ProductModelVersion', result) -for o in objectlist: - print o - -""" -Functional test of pangalactic.repo.factory.PgefObjectFactory -test(classname) method -""" -__version__ = "$Revision: 1.1 $"[11:-2] - -import sys from pangalactic.repo.registry import PgerObjectRegistry as POR from pangalactic.repo.factory import PgerObjectFactory as POF -registry = POR() -factory = POF(registry) - -print "dir(): %s" % dir() -print -print "dir(factory): %s" % dir(factory) - -for classname in registry.pgerdb_classes: - print """\nRunning factory.test('%s'):\n""" % classname - factory.test(classname) - -# $Id: ut_repofactory.py,v 1.1 2003/10/03 02:15:11 waterbug Exp $ - -""" -Functional test for pangalactic.repo.db module - - connects to PostgreSQL using adbapi.py - - executes asynchronous query - - outputs result of callback -""" - -import sys -from twisted.enterprise import adbapi -from pangalactic.repo.db import PgerDb as PDB -from pangalactic.repo.registry import PgerObjectRegistry as POR -from pangalactic.repo.factory import PgerObjectFactory as POF -from pangalactic.enterprise.productversion import ProductVersion as PV +class RepoFactoryTest(unittest.TestCase): -db = PDB() -registry = POR() -factory = POF(registry) - -print """\nRunning factory.unmake on ProductVersion:\n""" -pv = PV() -dict, t = factory.unmakeObject(pv) -print 'table is: %s' % t -print 'dict is:' -print dict + def __init__(self): + self.registry = POR() + self.factory = POF(self.registry) + + + def test_1_factory_extracts2Records(self): + """CASE: PgerObjectFactory self-test""" + input = [['foo.bar.baz.Project', + {'id_context': 'TEST', + 'id': 'H2G2', + 'name': 'HitchHikers Guide'}]] + expected = [['project', + {'id_context': 'TEST', + 'id': 'H2G2', + 'name': 'HitchHikers Guide'}]] + output = self.factory.extracts2Records(input) + self.assertEquals(expected, output) + + +# typename = 'ProductMaster' +# +# def success(objectlist): +# print objectlist +# for o in objectlist: +# print o +# print "\n*** %s %s object(s) found. ***\n" % (len(objectlist), typename) +# reactor.stop() +# +# def failure(error): +# print error +# reactor.stop() +# +# db = PgerDb() +# registry = PgerObjectRegistry() +# factory = PgerObjectFactory(registry) +# +# result = db.doPgerdbQuery('product_master', 0, ['id_context', 'TEST', '=']) +# result.addCallbacks(lambda x: factory.makeObjects(typename, x)).addCallbacks(success, failure) +# +# reactor.run() # start the main loop +# +# """ +# Functional test for pangalactic.repo.factory module +# *** using non-deferred input *** +# - connects to PostgreSQL using adbapi.py +# - executes *synchronous* query +# - runs factory.makeobjects on result +# - outputs resulting list of objects +# """ +# +# from pyPgSQL import PgSQL +# from pangalactic.repo.factory import PgerObjectFactory +# from pangalactic.repo.registry import PgerObjectRegistry +# +# registry = PgerObjectRegistry() +# factory = PgerObjectFactory(registry) +# +# conn = PgSQL.connect(database='pgerdb') +# curs = conn.cursor() +# curs.execute('SELECT * from product_model_version where name = %s', +# ('HOG-42')) +# result = curs.fetchall() +# print result +# objectlist = factory.makeObjects('ProductModelVersion', result) +# for o in objectlist: +# print o +# +# +# # $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $ +# +# """ +# Functional test for pangalactic.repo.db module +# - connects to PostgreSQL using adbapi.py +# - executes asynchronous query +# - outputs result of callback +# """ +# +# import sys +# from twisted.enterprise import adbapi +# from pangalactic.repo.db import PgerDb as PDB +# from pangalactic.repo.registry import PgerObjectRegistry as POR +# from pangalactic.repo.factory import PgerObjectFactory as POF +# from pangalactic.enterprise.productversion import ProductVersion as PV +# +# db = PDB() +# registry = POR() +# factory = POF(registry) +# +# print """\nRunning factory.unmake on ProductVersion:\n""" +# pv = PV() +# dict, t = factory.unmakeObject(pv) +# print 'table is: %s' % t +# print 'dict is:' +# print dict From waterbug at ned.gsfc.nasa.gov Sat Oct 4 01:51:25 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 00:51:26 2003 Subject: [Pangalactic-commits] More test fixes and renaming of test_factory_async.py to test_factory_makeObjects.py. Message-ID: <200310040451.h944pP9u025216@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_factory_makeObjects.py None 1.1 PanGalactic/pangalactic/test/README 1.14 1.15 PanGalactic/pangalactic/test/test_factory_sync.py 1.4 1.5 PanGalactic/pangalactic/test/test_factory_test.py 1.5 1.6 PanGalactic/pangalactic/test/test_factory_async.py 1.8 None Log message: More test fixes and renaming of test_factory_async.py to test_factory_makeObjects.py. Index: PanGalactic/pangalactic/test/test_factory_test.py diff -u PanGalactic/pangalactic/test/test_factory_test.py:1.5 PanGalactic/pangalactic/test/test_factory_test.py:1.6 --- PanGalactic/pangalactic/test/test_factory_test.py:1.5 Mon Sep 15 16:38:32 2003 +++ PanGalactic/pangalactic/test/test_factory_test.py Sat Oct 4 00:51:24 2003 @@ -2,20 +2,17 @@ Functional test of pangalactic.repo.factory.PgefObjectFactory test(classname) method """ -__version__ = "$Revision: 1.5 $"[11:-2] +__version__ = "$Revision: 1.6 $"[11:-2] -import sys -from pangalactic.repo.registry import PgerObjectRegistry as POR -from pangalactic.repo.factory import PgerObjectFactory as POF +# TODO: the factory self-test code has been scrapped -- needs to +# be re-implemented when time allows. -registry = POR() -factory = POF(registry) +# import sys +# from pangalactic.repo.registry import PgerObjectRegistry as POR +# from pangalactic.repo.factory import PgerObjectFactory as POF +# +# registry = POR() +# factory = POF(registry) -print "dir(): %s" % dir() -print -print "dir(factory): %s" % dir(factory) - -for classname in registry.pgerdb_classes: - print """\nRunning factory.test('%s'):\n""" % classname - factory.test(classname) +print "\nThis test has been deactivated for refurbishment.\n" Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.14 PanGalactic/pangalactic/test/README:1.15 --- PanGalactic/pangalactic/test/README:1.14 Mon Sep 8 15:50:24 2003 +++ PanGalactic/pangalactic/test/README Sat Oct 4 00:51:24 2003 @@ -1,20 +1,24 @@ -$Id: README,v 1.14 2003/09/08 19:50:24 waterbug Exp $ +$Id: README,v 1.15 2003/10/04 04:51:24 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ Package: pangalactic.repo Prep: These tests require the test data to be loaded into PgerDb -- run the script: - Pangalactic/src/sql/insertPgerDbTestData.sql + Pangalactic/src/sql/populate_pgerdb.sh + (TODO: set up a separate test database: + "testpgerdb") Graph: test_glimpse_getfulltext.py test_sql.py test_db_runquery.py test_db_runsequencequery.py -test_db_addrow.py test_registry.py - \ / +test_db_addrow.py +test_db_addrows.py test_registry.py + \ / test_factory_test.py + test_factory_extracts2Records.py test_factory_sync.py test_factory_async.py test_factory_unmake.py Index: PanGalactic/pangalactic/test/test_factory_sync.py diff -u PanGalactic/pangalactic/test/test_factory_sync.py:1.4 PanGalactic/pangalactic/test/test_factory_sync.py:1.5 --- PanGalactic/pangalactic/test/test_factory_sync.py:1.4 Mon Sep 15 16:38:32 2003 +++ PanGalactic/pangalactic/test/test_factory_sync.py Sat Oct 4 00:51:24 2003 @@ -1,4 +1,4 @@ -# $Id: test_factory_sync.py,v 1.4 2003/09/15 20:38:32 waterbug Exp $ +# $Id: test_factory_sync.py,v 1.5 2003/10/04 04:51:24 waterbug Exp $ """ Functional test for pangalactic.repo.factory module @@ -19,10 +19,13 @@ conn = PgSQL.connect(database='pgerdb') curs = conn.cursor() curs.execute('SELECT * from product_model_version where name = %s', - ('HOG-42')) + ('HOG-42')) result = curs.fetchall() +print "\nQuery result is:" print result -objectlist = factory.makeObjects('ProductModelVersion', result) -for o in objectlist: +objs = factory.makeObjects('ProductModelVersion', result) +print "\nObjects returned by factory.makeObjects() are:" +for o in objs: print o +print From waterbug at ned.gsfc.nasa.gov Sat Oct 4 02:11:34 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 01:11:36 2003 Subject: [Pangalactic-commits] Mods and rename of test_factory_unmake.py to test_factory_unmakeObject.py. Message-ID: <200310040511.h945BYWw025318@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_factory_unmakeObject.py None 1.1 PanGalactic/pangalactic/test/README 1.15 1.16 PanGalactic/pangalactic/test/test_factory_unmake.py 1.6 None Log message: Mods and rename of test_factory_unmake.py to test_factory_unmakeObject.py. Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.15 PanGalactic/pangalactic/test/README:1.16 --- PanGalactic/pangalactic/test/README:1.15 Sat Oct 4 00:51:24 2003 +++ PanGalactic/pangalactic/test/README Sat Oct 4 01:11:33 2003 @@ -1,4 +1,4 @@ -$Id: README,v 1.15 2003/10/04 04:51:24 waterbug Exp $ +$Id: README,v 1.16 2003/10/04 05:11:33 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ @@ -20,7 +20,7 @@ test_factory_test.py test_factory_extracts2Records.py test_factory_sync.py - test_factory_async.py + test_factory_makeObjects.py test_factory_unmake.py | test_pger_getresultsets.py From waterbug at ned.gsfc.nasa.gov Sat Oct 4 02:14:26 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 01:14:27 2003 Subject: [Pangalactic-commits] Mods for building transactional inserts. Message-ID: <200310040514.h945EQxM025352@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/sql.py 1.3 1.4 Log message: Mods for building transactional inserts. Index: PanGalactic/pangalactic/utils/sql.py diff -u PanGalactic/pangalactic/utils/sql.py:1.3 PanGalactic/pangalactic/utils/sql.py:1.4 --- PanGalactic/pangalactic/utils/sql.py:1.3 Fri Sep 26 22:22:30 2003 +++ PanGalactic/pangalactic/utils/sql.py Sat Oct 4 01:14:24 2003 @@ -1,10 +1,10 @@ """SQL Tools""" -# $Id: sql.py,v 1.3 2003/09/27 02:22:30 waterbug Exp $ +# $Id: sql.py,v 1.4 2003/10/04 05:14:24 waterbug Exp $ import re, types -def buildSelect(table, subtypes=0, *args, **kw): +def buildSelect(table, subtypes, *args, **kw): """ Take a table name and a list of args and build a set of SQL SELECT arguments from them that can be used directly as a @@ -30,18 +30,22 @@ @param kw: I{sort} specifies sort order. Can be either a string (a column name) or a list or tuple of column names + + @rtype: tuple + @return: SQL command string + (optional) arg list """ # specify logic (later on, we might enable 'OR' ...) connector = 'AND' # create re to remove final connector from sqlstmt ... conn_re = re.compile(' %s$' % connector) # build sql statement ... - if subtypes == 0: - # search *only* in the specified table - sqlstmt = 'SELECT * FROM ONLY ' + table + ' WHERE' - else: + if subtypes == 1: # search the specified table and all its subtypes sqlstmt = 'SELECT * FROM ' + table + ' WHERE' + else: + # DEFAULT CASE: + # search *only* in the specified table + sqlstmt = 'SELECT * FROM ONLY ' + table + ' WHERE' arl = [] for a in args: sqlargs = _argmunge(a) @@ -92,48 +96,36 @@ selectargs = (sqlstmt,) return selectargs -def buildInsert(table, *args, **kw): +def buildInsert(table, parmdict): """ - Take a table name and either a list of sequences (lists or - tuples) of args or a set of kw args and build a set of SQL - insert arguments from them that can be used directly as a - complete set of arguments for the PgSQL cursor.execute() - function. - - B{Important}: either an arg tuple/list I{or} a kw dictionary - should be supplied, but I{not} both! If a kw dictionary is - supplied, it will take precedence. + Take a table name a {colname:value} dictionary and build a + set of arguments for use in PgSQL.cursor.execute(). @type table: string @param table: name of the table to insert into - @type args: list of lists or list of tuples - @param args: a set of sequences (lists or tuples) of SQL - element tuples in which each tuple has the form: - - element[0] = column name - - element[1] = value to be assigned - - @type kw: dictionary (of kw args) - @param kw: kw args should be of the form: - - kw[column name] = value to be assigned + @type parmdict: dictionary + @param parmdict: a dictionary of the form: + - {colname : value, ...} + + @rtype: tuple + @return: a 2-tuple whose elements are: + [1] the SQL statement formatted for PgSQL with + %s dummy variables + [2] the tuple of values to be inserted """ # build sql arguments for PgSQL ... sqlstmt = 'INSERT INTO ' + table + ' (' dum = '(' - arl = [] - if kw: - newargs = zip(kw.keys(), kw.values()) - elif args: - newargs = args - for pair in newargs: - sqlstmt = sqlstmt + """%s, """ % pair[0] - dum = dum + """%s, """ - arl.append(pair[1]) + parms = () + for parm in parmdict: + sqlstmt += '%s, ' % parm + dum += '%s, ' + parms += (parmdict[parm],) sqlstmt = sqlstmt[:-2] dum = dum[:-2] sqlstmt = sqlstmt + ') VALUES ' + dum + ')' - insertargs = (sqlstmt,) + tuple(arl) - return insertargs + return (sqlstmt, parms) def buildSQLInsert(table, *args, **kw): """ @@ -161,35 +153,35 @@ sqlstmt = 'INSERT INTO ' + table + ' (' values = '(' if kw: - newargs = zip(kw.keys(), kw.valuesues()) + coldict = kw elif args: - newargs = args - for pair in newargs: - sqlstmt = sqlstmt + """%s, """ % pair[0] - values = values + """'%s', """ % pair[1] + coldict = dict(args) + for col in coldict: + sqlstmt = sqlstmt + """%s, """ % col + values = values + """'%s', """ % coldict[col] sqlstmt = sqlstmt[:-2] values = values[:-2] sqlstmt = sqlstmt + ') VALUES ' + values + ')' return sqlstmt -def buildTransaction(parmdict): +def buildTransaction(records): """ Build an SQL command string to add a series of rows in a single transaction. """ sqlstmt = """SET CONSTRAINTS ALL DEFERRED;\n""" - for table in parmdict.keys(): - print '\n doing table = "%s"' % table - for arglist in parmdict[table]: - print ' doing arglist = "%s"' % str(arglist) - # sqlstmt += buildSQLInsert(table, *arglist) + ';\n' - s = buildSQLInsert(table, *arglist) + ';\n' - print ' - output of buildSQLInsert is:' - print s - sqlstmt += s + allparms = () + for rec in records: + print '\n doing parmdict = %s' % str(rec[1]) + sqlcmd, parms = buildInsert(rec[0], rec[1]) + print '\n - output of buildInsert is:' + print sqlcmd + sqlstmt += sqlcmd + '; ' + allparms += parms print - print 'sqlstmt = "%s"' % sqlstmt - return sqlstmt + print '\nsqlstmt = "%s"' % sqlstmt + print '\nallparms = "%s"\n' % str(allparms) + return sqlstmt, allparms def _argmunge(arg): """Munges a tuple into a column name, search value, and From waterbug at ned.gsfc.nasa.gov Sat Oct 4 02:18:20 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 01:18:21 2003 Subject: [Pangalactic-commits] Clean ups. Message-ID: <200310040518.h945IKJ4025391@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/sql.py 1.4 1.5 Log message: Clean ups. Index: PanGalactic/pangalactic/utils/sql.py diff -u PanGalactic/pangalactic/utils/sql.py:1.4 PanGalactic/pangalactic/utils/sql.py:1.5 --- PanGalactic/pangalactic/utils/sql.py:1.4 Sat Oct 4 01:14:24 2003 +++ PanGalactic/pangalactic/utils/sql.py Sat Oct 4 01:18:19 2003 @@ -1,6 +1,6 @@ """SQL Tools""" -# $Id: sql.py,v 1.4 2003/10/04 05:14:24 waterbug Exp $ +# $Id: sql.py,v 1.5 2003/10/04 05:18:19 waterbug Exp $ import re, types @@ -127,43 +127,6 @@ sqlstmt = sqlstmt + ') VALUES ' + dum + ')' return (sqlstmt, parms) -def buildSQLInsert(table, *args, **kw): - """ - Build an SQL command that can be used directly by PgSQL - cursor.execute() to insert a row. - - B{Important}: either an arg tuple/list I{or} a kw dictionary - should be supplied, but I{not} both! If a kw dictionary is - supplied, it will take precedence. - - @type table: string - @param table: name of the table to insert into - - @type args: list of lists or list of tuples - @param args: a set of sequences (lists or tuples) of SQL - element tuples in which each tuple has the form: - - element[0] = column name - - element[1] = value to be assigned - - @type kw: dictionary (of kw args) - @param kw: kw args should be of the form: - - kw[column name] = value to be assigned - """ - # build sql statement ... - sqlstmt = 'INSERT INTO ' + table + ' (' - values = '(' - if kw: - coldict = kw - elif args: - coldict = dict(args) - for col in coldict: - sqlstmt = sqlstmt + """%s, """ % col - values = values + """'%s', """ % coldict[col] - sqlstmt = sqlstmt[:-2] - values = values[:-2] - sqlstmt = sqlstmt + ') VALUES ' + values + ')' - return sqlstmt - def buildTransaction(records): """ Build an SQL command string to add a series of rows in a @@ -172,15 +135,9 @@ sqlstmt = """SET CONSTRAINTS ALL DEFERRED;\n""" allparms = () for rec in records: - print '\n doing parmdict = %s' % str(rec[1]) sqlcmd, parms = buildInsert(rec[0], rec[1]) - print '\n - output of buildInsert is:' - print sqlcmd sqlstmt += sqlcmd + '; ' allparms += parms - print - print '\nsqlstmt = "%s"' % sqlstmt - print '\nallparms = "%s"\n' % str(allparms) return sqlstmt, allparms def _argmunge(arg): From waterbug at ned.gsfc.nasa.gov Sat Oct 4 02:31:00 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 01:31:01 2003 Subject: [Pangalactic-commits] More test clean-ups. Message-ID: <200310040531.h945V0YT025506@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/README 1.16 1.17 PanGalactic/pangalactic/test/test_pger_getobjects.py 1.2 1.3 PanGalactic/pangalactic/test/test_pger_getresultsets.py 1.7 1.8 PanGalactic/pangalactic/test/test_pger_gettuplers.py 1.6 1.7 Log message: More test clean-ups. Index: PanGalactic/pangalactic/test/test_pger_getresultsets.py diff -u PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.7 PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.8 --- PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.7 Fri Sep 26 22:20:06 2003 +++ PanGalactic/pangalactic/test/test_pger_getresultsets.py Sat Oct 4 01:30:59 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_getresultsets.py,v 1.7 2003/09/27 02:20:06 waterbug Exp $ +# $Id: test_pger_getresultsets.py,v 1.8 2003/10/04 05:30:59 waterbug Exp $ """ Functional test for pangalactic.repo.pger module @@ -18,7 +18,8 @@ def success(resultsets): schema = pgr._registry.pgerdb_classes[typename]._schema if resultsets: - print "\nRESULT SETS" + print "\n===========" + print "RESULT SETS" print "===========" for r in resultsets: pprint(r) @@ -28,24 +29,27 @@ t = schema[a] val = getattr(r, a) print ' %s = %s' % (a, pgr._factory.cook(val, t)) + print "\n========" print "EXTRACTS" print "========" pprint(pgr._factory.makeExtracts(resultsets)) else: print "\nResult is empty:\n" print resultsets + reactor.stop() def failure(error): print error + reactor.stop() -db = PgerDb() -pgr = Pger(db) +pgrdb = PgerDb() +pgr = Pger(pgrdb) out = pgr.getResultSets(typename, name='Mr. Fusion') out.addCallbacks(success, failure) -reactor.run() # start the main loop -print 'stopped.' +reactor.run() +print '\n - end of test -' Index: PanGalactic/pangalactic/test/test_pger_gettuplers.py diff -u PanGalactic/pangalactic/test/test_pger_gettuplers.py:1.6 PanGalactic/pangalactic/test/test_pger_gettuplers.py:1.7 --- PanGalactic/pangalactic/test/test_pger_gettuplers.py:1.6 Mon Sep 15 16:38:32 2003 +++ PanGalactic/pangalactic/test/test_pger_gettuplers.py Sat Oct 4 01:30:59 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_gettuplers.py,v 1.6 2003/09/15 20:38:32 waterbug Exp $ +# $Id: test_pger_gettuplers.py,v 1.7 2003/10/04 05:30:59 waterbug Exp $ """ Functional test of Pger getting a result set for a list of docs @@ -36,5 +36,7 @@ returntype='resultsets')) result.addCallbacks(success, failure) -reactor.run() # start the main loop +reactor.run() + +print "\n- end of test -" Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.16 PanGalactic/pangalactic/test/README:1.17 --- PanGalactic/pangalactic/test/README:1.16 Sat Oct 4 01:11:33 2003 +++ PanGalactic/pangalactic/test/README Sat Oct 4 01:30:59 2003 @@ -1,4 +1,4 @@ -$Id: README,v 1.16 2003/10/04 05:11:33 waterbug Exp $ +$Id: README,v 1.17 2003/10/04 05:30:59 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ @@ -18,10 +18,10 @@ test_db_addrows.py test_registry.py \ / test_factory_test.py - test_factory_extracts2Records.py test_factory_sync.py + test_factory_extracts2Records.py test_factory_makeObjects.py - test_factory_unmake.py + test_factory_unmakeObject.py | test_pger_getresultsets.py test_pger_gettuplers.py Index: PanGalactic/pangalactic/test/test_pger_getobjects.py diff -u PanGalactic/pangalactic/test/test_pger_getobjects.py:1.2 PanGalactic/pangalactic/test/test_pger_getobjects.py:1.3 --- PanGalactic/pangalactic/test/test_pger_getobjects.py:1.2 Fri Sep 26 22:20:06 2003 +++ PanGalactic/pangalactic/test/test_pger_getobjects.py Sat Oct 4 01:30:59 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_getobjects.py,v 1.2 2003/09/27 02:20:06 waterbug Exp $ +# $Id: test_pger_getobjects.py,v 1.3 2003/10/04 05:30:59 waterbug Exp $ """ Functional test for pangalactic.repo.pger module @@ -14,7 +14,9 @@ from pangalactic.repo.pger import Pger def success(olist): + print "Object list:" pprint(olist) + print "\nObjects:" for obj in olist: print obj reactor.stop() @@ -29,5 +31,7 @@ out = pgr.getObjects('Project', id='H2G2') out.addCallbacks(success, failure) -reactor.run() # start the main loop +reactor.run() + +print '\n- end of test -' From waterbug at ned.gsfc.nasa.gov Sat Oct 4 19:38:27 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 18:38:29 2003 Subject: [Pangalactic-commits] Renamed test_pger_add.py to test_pger_addObjects.py. Message-ID: <200310042238.h94McRHT028351@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_pger_addObjects.py None 1.1 PanGalactic/pangalactic/test/test_pger_add.py 1.8 None Log message: Renamed test_pger_add.py to test_pger_addObjects.py. From waterbug at ned.gsfc.nasa.gov Sat Oct 4 20:22:15 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 19:22:17 2003 Subject: [Pangalactic-commits] Updates for better test data. Message-ID: <200310042322.h94NMFh9028457@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_pger_addObjects.py 1.1 1.2 Log message: Updates for better test data. Index: PanGalactic/pangalactic/test/test_pger_addObjects.py diff -u PanGalactic/pangalactic/test/test_pger_addObjects.py:1.1 PanGalactic/pangalactic/test/test_pger_addObjects.py:1.2 --- PanGalactic/pangalactic/test/test_pger_addObjects.py:1.1 Sat Oct 4 18:38:25 2003 +++ PanGalactic/pangalactic/test/test_pger_addObjects.py Sat Oct 4 19:22:14 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_addObjects.py,v 1.1 2003/10/04 22:38:25 waterbug Exp $ +# $Id: test_pger_addObjects.py,v 1.2 2003/10/04 23:22:14 waterbug Exp $ """ Functional test for pangalactic.repo.Pger.addObjects() @@ -9,37 +9,56 @@ pger_mod_datetime for all committed objects) """ -import time, os +import time +from pprint import pprint from twisted.internet import reactor -from twisted.enterprise import adbapi from pangalactic.repo.db import PgerDb -from pangalactic.repo.pger import Pger from pangalactic.utils import oid -from pangalactic.enterprise.productmaster import ProductMaster +from pangalactic.enterprise.productmaster import ProductMaster as PM +from pangalactic.enterprise.productversion import ProductVersion as PV from pangalactic.enterprise.project import Project +from pangalactic.repo.factory import PgerObjectFactory as POF +from pangalactic.repo.registry import PgerObjectRegistry as POR +from pangalactic.repo.pger import Pger -db = PgerDb() -pgr = Pger(db) - -f = open(os.getcwd() + '/IDTEST') -nextid = f.read() -newoid = oid.generate('test') +reg = POR() +fac = POF(reg) +pgrdb = PgerDb() +pgr = Pger(pgrdb) + +f = open('IDTEST') +savedid = f.read() +testoid1 = oid.generate('test') +testoid2 = oid.generate('test') -nextid = str(int(nextid) + 1) +testid = str(int(savedid) + 1) f.close() -f = open(os.getcwd() + '/IDTEST', 'w') -f.write(nextid) +f = open('IDTEST', 'w') +f.write(testid) f.close() -testname = 'Mr. Test-Pger-addObjects()-' + nextid -proj = Project(id='TEST', id_context='TEST') -pm = ProductMaster(name=testname, id=nextid, id_context='TEST', project=proj) -print pm -pmlist = [pm] -dts = pgr.addObjects(pmlist) -print 'dts = %s' % dts +projid = 'MD' + testid +projname = 'MD' + testid + ' Project' +pmid = 'MD-' + testid +pmname = 'MD-' + testid + ' Model Mr. Dynamo' +pvname = 'MD-' + testid + ' Version A' + +# create test objects +p = Project(id=projid, id_context='TEST', name=projname) +p.popTestData() +pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p) +pm.popTestData() +pv = PV(_of_master=pm, id='A', name=pvname) +pv.popTestData() + +olist = [p, pm, pv] + +dts = pgr.addObjects(olist) + +reactor.run() -reactor.run() # start the main loop -time.sleep(1) reactor.stop() + +print 'dts is %s\n' % dts +print '- test is complete -' From waterbug at ned.gsfc.nasa.gov Sat Oct 4 20:25:45 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 19:25:46 2003 Subject: [Pangalactic-commits] Renamed test_pger_addextracts.py to test_pger_addExtracts.py. Message-ID: <200310042325.h94NPjjW028525@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_pger_addExtracts.py None 1.1 PanGalactic/pangalactic/test/IDTEST 1.14 1.15 PanGalactic/pangalactic/test/README 1.17 1.18 PanGalactic/pangalactic/test/test_db_addrows.py 1.3 1.4 PanGalactic/pangalactic/test/test_pger_addextracts.py 1.2 None Log message: Renamed test_pger_addextracts.py to test_pger_addExtracts.py. Index: PanGalactic/pangalactic/test/test_db_addrows.py diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.3 PanGalactic/pangalactic/test/test_db_addrows.py:1.4 --- PanGalactic/pangalactic/test/test_db_addrows.py:1.3 Sat Oct 4 00:26:08 2003 +++ PanGalactic/pangalactic/test/test_db_addrows.py Sat Oct 4 19:25:44 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_addrows.py,v 1.3 2003/10/04 04:26:08 waterbug Exp $ +# $Id: test_db_addrows.py,v 1.4 2003/10/04 23:25:44 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -7,7 +7,6 @@ - outputs result of callback """ -import time, os from pprint import pprint from twisted.internet import reactor from pangalactic.repo.db import PgerDb Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.14 PanGalactic/pangalactic/test/IDTEST:1.15 --- PanGalactic/pangalactic/test/IDTEST:1.14 Sat Oct 4 00:26:08 2003 +++ PanGalactic/pangalactic/test/IDTEST Sat Oct 4 19:25:44 2003 @@ -1 +1 @@ -220 \ No newline at end of file +224 \ No newline at end of file Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.17 PanGalactic/pangalactic/test/README:1.18 --- PanGalactic/pangalactic/test/README:1.17 Sat Oct 4 01:30:59 2003 +++ PanGalactic/pangalactic/test/README Sat Oct 4 19:25:44 2003 @@ -1,4 +1,4 @@ -$Id: README,v 1.17 2003/10/04 05:30:59 waterbug Exp $ +$Id: README,v 1.18 2003/10/04 23:25:44 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ @@ -28,7 +28,7 @@ test_pger_getobjects.py | test_pger_create.py - test_pger_add.py + test_pger_addObjects.py | test_pger_pb.py | From waterbug at ned.gsfc.nasa.gov Sat Oct 4 20:32:20 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 19:32:21 2003 Subject: [Pangalactic-commits] Remove obsolete jelly test. Message-ID: <200310042332.h94NWKCi028576@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_xmlrpc_jelly_get.py 1.4 None Log message: Remove obsolete jelly test. From waterbug at ned.gsfc.nasa.gov Sat Oct 4 20:35:45 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sat Oct 4 19:35:46 2003 Subject: [Pangalactic-commits] Remove obsolete test. Message-ID: <200310042335.h94NZjrJ028627@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_pger_trans_add.py 1.4 None Log message: Remove obsolete test. From waterbug at ned.gsfc.nasa.gov Sun Oct 5 01:52:18 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 00:52:20 2003 Subject: [Pangalactic-commits] Add test for factory.extractall() method (jelly was never this good!! :^) and some general updates. Message-ID: <200310050452.h954qIHK029300@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_factory_extractall.py None 1.1 PanGalactic/pangalactic/test/README 1.18 1.19 PanGalactic/pangalactic/test/test_pger_create.py 1.7 1.8 PanGalactic/pangalactic/test/test_pger_getresultsets.py 1.8 1.9 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.6 1.7 Log message: Add test for factory.extractall() method (jelly was never this good!! :^) and some general updates. Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.6 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.7 --- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.6 Mon Sep 15 16:38:32 2003 +++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py Sun Oct 5 00:52:17 2003 @@ -1,4 +1,4 @@ -# $Id: test_xmlrpc_getobjects.py,v 1.6 2003/09/15 20:38:32 waterbug Exp $ +# $Id: test_xmlrpc_getobjects.py,v 1.7 2003/10/05 04:52:17 waterbug Exp $ """ Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService @@ -31,11 +31,15 @@ print "\n*** RECONSTITUTED OBJECTS ***\n" olist = [] for x in stuff: - o = pgr._factory.reconstitute(x) + o = pgr._factory.rebuild(x) olist.append(o) pprint(olist) print print "\n*** %s %s(s) found. ***\n" % (len(olist), typename) + if olist: + print """Here's what the first one looks like:""" + print + print olist[0] reactor.stop() def failure(error): @@ -44,11 +48,10 @@ db = PgerDb() pgr = Pger(db) -x = PgerXmlrpcService(pgr) +xmlsrv = PgerXmlrpcService(pgr) -x.xmlrpc_getObjects(typename, 'name=Mr. Fusion').addCallbacks(success, failure) +res = xmlsrv.xmlrpc_getObjects(typename, 0, 0, ['name', 'Mr. Fusion']) +res.addCallbacks(success, failure) -reactor.run() # start the main loop - -# reactor.run(installSignalHandlers=0) # start the main loop +reactor.run() Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.18 PanGalactic/pangalactic/test/README:1.19 --- PanGalactic/pangalactic/test/README:1.18 Sat Oct 4 19:25:44 2003 +++ PanGalactic/pangalactic/test/README Sun Oct 5 00:52:17 2003 @@ -1,13 +1,13 @@ -$Id: README,v 1.18 2003/10/04 23:25:44 waterbug Exp $ +$Id: README,v 1.19 2003/10/05 04:52:17 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ Package: pangalactic.repo Prep: These tests require the test data to be - loaded into PgerDb -- run the script: + loaded into pgerdb -- run the script: Pangalactic/src/sql/populate_pgerdb.sh - (TODO: set up a separate test database: - "testpgerdb") + (TODO: set up a separate test database: + "testpgerdb") Graph: test_glimpse_getfulltext.py @@ -27,14 +27,13 @@ test_pger_gettuplers.py test_pger_getobjects.py | - test_pger_create.py + test_pger_addExtracts.py test_pger_addObjects.py + test_pger_create.py | test_pger_pb.py | test_xmlrpc_getobjects.py test_xmlrpc_addobjects.py test_xmlrpc_createpm.py - | - test_pger_trans_add.py Index: PanGalactic/pangalactic/test/test_pger_create.py diff -u PanGalactic/pangalactic/test/test_pger_create.py:1.7 PanGalactic/pangalactic/test/test_pger_create.py:1.8 --- PanGalactic/pangalactic/test/test_pger_create.py:1.7 Sat Jul 5 05:02:18 2003 +++ PanGalactic/pangalactic/test/test_pger_create.py Sun Oct 5 00:52:17 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_create.py,v 1.7 2003/07/05 09:02:18 waterbug Exp $ +# $Id: test_pger_create.py,v 1.8 2003/10/05 04:52:17 waterbug Exp $ """ Functional test for pangalactic.repo.pger.createProductMaster @@ -8,7 +8,7 @@ - reports oid of the new Product Master """ -import time, os +import time from twisted.internet import reactor from twisted.enterprise import adbapi from pangalactic.repo.registry import PgerObjectRegistry @@ -23,21 +23,24 @@ registry = PgerObjectRegistry('pgerdb', 'pangalactic', 'enterprise') repo = Pger(db, registry) -f = open(os.getcwd() + '/IDTEST') +f = open('IDTEST') nextid = f.read() newoid = oid.generate('test') nextid = str(int(nextid) + 1) f.close() -f = open(os.getcwd() + '/IDTEST', 'w') +f = open('IDTEST', 'w') f.write(nextid) f.close() -pmoid = repo.createProductMaster(pgef_oid=newoid, name='Mr. Test', id=nextid, id_context='TEST', - project_id='TEST', project_id_context='TEST') +pmoid = repo.createProductMaster(pgef_oid=newoid, + name='Mr. Test', + id=nextid, id_context='TEST', + project_id='TEST', + project_id_context='TEST') print 'pmoid = %s' % pmoid -reactor.run(installSignalHandlers=0) # start the main loop +reactor.run() time.sleep(1) reactor.stop() Index: PanGalactic/pangalactic/test/test_pger_getresultsets.py diff -u PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.8 PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.9 --- PanGalactic/pangalactic/test/test_pger_getresultsets.py:1.8 Sat Oct 4 01:30:59 2003 +++ PanGalactic/pangalactic/test/test_pger_getresultsets.py Sun Oct 5 00:52:17 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_getresultsets.py,v 1.8 2003/10/04 05:30:59 waterbug Exp $ +# $Id: test_pger_getresultsets.py,v 1.9 2003/10/05 04:52:17 waterbug Exp $ """ Functional test for pangalactic.repo.pger module @@ -32,7 +32,7 @@ print "\n========" print "EXTRACTS" print "========" - pprint(pgr._factory.makeExtracts(resultsets)) + pprint(pgr._factory.resultsets2Extracts(resultsets)) else: print "\nResult is empty:\n" print resultsets @@ -45,7 +45,7 @@ pgrdb = PgerDb() pgr = Pger(pgrdb) -out = pgr.getResultSets(typename, +out = pgr.getResultSets(typename, 0, 0, name='Mr. Fusion') out.addCallbacks(success, failure) From waterbug at ned.gsfc.nasa.gov Sun Oct 5 03:35:28 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 02:35:29 2003 Subject: [Pangalactic-commits] Empty _refd for Organization, and caveat as to why. ; ^) Message-ID: <200310050635.h956ZS1P029752@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/organization.py 1.7 1.8 Log message: Empty _refd for Organization, and caveat as to why. ;^) Index: PanGalactic/pangalactic/enterprise/organization.py diff -u PanGalactic/pangalactic/enterprise/organization.py:1.7 PanGalactic/pangalactic/enterprise/organization.py:1.8 --- PanGalactic/pangalactic/enterprise/organization.py:1.7 Mon Sep 15 16:08:59 2003 +++ PanGalactic/pangalactic/enterprise/organization.py Sun Oct 5 02:35:27 2003 @@ -1,4 +1,4 @@ -# $Id: organization.py,v 1.7 2003/09/15 20:08:59 waterbug Exp $ +# $Id: organization.py,v 1.8 2003/10/05 06:35:27 waterbug Exp $ """ A business entity comprised of personnel and other resources. @@ -26,6 +26,12 @@ 'Identifier', 'Type'] _properties = PgefObject._properties.copy() + _refd = {} # Keep this empty, or things could get real UGLY! + # (Person refs Org, but Org has the usual + # "creator", etc., so it could get quite circular + # in a hurry. For sanity's sake, all Orgs in PGER + # will be regarded as Immaculately Conceived, + # though we suspect the Sysadmin was involved. ;^) _schema_ext = { 'pgef_org_name_code' : 'str', 'name1' : 'str', @@ -51,7 +57,7 @@ } _schema = PgefObject._schema.copy() _schema.update(_schema_ext) - std_abbrev = 'org' + _std_abbrev = 'org' def __init__(self, email=None, schema=_schema, **kw): # PgefObject.__init__() creates the pgef_oid ... From waterbug at ned.gsfc.nasa.gov Sun Oct 5 06:33:06 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 05:33:08 2003 Subject: [Pangalactic-commits] Improvements to factory.rebuildall() ... much more forgiving now! Message-ID: <200310050933.h959X6gh007756@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/factory.py 1.2 1.3 Log message: Improvements to factory.rebuildall() ... much more forgiving now! Index: PanGalactic/pangalactic/utils/factory.py diff -u PanGalactic/pangalactic/utils/factory.py:1.2 PanGalactic/pangalactic/utils/factory.py:1.3 --- PanGalactic/pangalactic/utils/factory.py:1.2 Mon Sep 29 01:31:44 2003 +++ PanGalactic/pangalactic/utils/factory.py Sun Oct 5 05:33:05 2003 @@ -1,15 +1,16 @@ -# $Id: factory.py,v 1.2 2003/09/29 05:31:44 waterbug Exp $ +# $Id: factory.py,v 1.3 2003/10/05 09:33:05 waterbug Exp $ """ Functions to extract persistable data from L{pangalactic.enterprise} objects. -@version: $Revision: 1.2 $ +@version: $Revision: 1.3 $ """ -__version__ = "$Revision: 1.2 $"[11:-2] +__version__ = "$Revision: 1.3 $"[11:-2] import types import string +from pprint import pprint from mx.DateTime.ISO import ParseDateTime from pangalactic.utils import utils from pangalactic.utils.registry import PgefRegistry @@ -23,72 +24,134 @@ def __init__(self): self._registry = PgefRegistry() - def cook(self, a, datatype): + def cook(self, attr, datatype): """ Convert an attribute to a string or an int in preparation for its use in protocols that require clear-text encoding. + + @type attr: any type + @param attr: an attribute to be converted + + @type datatype: string + @param datatype: the name of the type to which the + attribute is to be converted """ # *_datetime attributes: # pypgsql returns a DateTime object, which can't # be jellied, so convert to GMT string ... if datatype == 'DateTime': - if a: - return str(a) + if attr: + return str(attr) else: return '' # *_flag attributes: # pypgsql returns a PgBoolean object, which can't be # jellied, so convert value to 0 or 1 ... if datatype == 'bool': - # print "%s is a flag -- setting it to 1 or 0." % a - if a: + # print "%s is a flag -- setting it to 1 or 0." % attr + if attr: return 1 else: return 0 # special case: for a null, pypgsql returns a # None object, which can't be jellied, so convert # to an empty string ... - if isinstance(a, types.NoneType): - # print "%s is None -- setting it to an empty string." % a + if isinstance(attr, types.NoneType): + # print "%s is None -- setting it to an empty string." % attr return '' else: - return a + return attr def extract(self, obj): """ - Extract persistable data from an object into an - S-expression-style list of strings and integers for - transport. + Extract persistable data from an object into a + format suitable for transport over the wire. The extract + format is: + + [classname, instance dict] + + ... where + + - "instance dict" is a dictionary of the + persistable attributes (those in obj._schema), and + + - "refd objs dictionary" is a dictionary that maps the + attribute name of any PgefObject subtypes that this + type references to the pgef_oid of the instance refd + by this obj. + + For example: + + [ 'product_master', + { 'id' : 'spam', + 'id_context' : 'eggs', ...} + ] + + @type obj: L{pangalactic.enterprise.pgefobject.PgefObject} + @param obj: an object from which _schema instance data is + to be extracted """ - data = [ [a, self.cook(getattr(obj, a), obj._schema[a])] - for a in obj._schema ] + # get _schema instance values for obj ... + s = [ (a, self.cook(getattr(obj, a), obj._schema[a])) + for a in obj._schema ] + instdict = dict(s) name = obj.__module__ + '.' + obj.__class__.__name__ - extr = [ name, data ] + extr = [name, instdict] return extr - def extractall(self, obj): + def extractall(self, objs, classnames=[]): """ - Extract persistable data from an object I{and} from all - the objects on which it depends (those in its _referenced - attribute) and return all the extracts in a list. + Extract persistable data from a list of objects I{and} + from all the objects on which each object depends (those + in its _refd attribute) recursively (until no + further referenced objects are found) and return all the + resulting extracts in a list. + + @type objs: list of + L{pangalactic.enterprise.pgefobject.PgefObject} + @param objs: a list of objects from which _schema instance data is + to be extracted + + @type types: list of classnames + @param types: limits the classes to be extracted ([], + which is the default, indicates all + classes) + + @returntype: list of extracts """ - extracts = [self.extract(obj)] - objs = [getattr(obj, a) for a in obj._referenced] # DEBUGGING # print 'Begin: objs are %s' % str(objs) + extracts = [] while objs: refdobjs = [] for o in objs: - extracts.append(self.extract(o)) - refdobjs += [getattr(o, a) - for a in o._referenced] - objs = refdobjs + if o: + toextract = [] + if classnames: + if o.__class__.__name__ in classnames: + extracts.append(self.extract(o)) + for a in o._refd: + if o._refd[a] in classnames: + toextract.append(a) + else: + extracts.append(self.extract(o)) + toextract = o._refd.keys() + refdobjs += [getattr(o, a) + for a in toextract] + objs = utils.unique(refdobjs) return utils.unique(extracts) def uncook(self, value, datatype): """ Convert a value from a string or an int to the specified type. + + @type value: string + @param value: value to be converted to the specified + type + + @type datatype: string + @param datatype: name of the specified type """ if datatype == 'DateTime': if value: @@ -107,15 +170,155 @@ else: return value - def reconstitute(self, data): + def rebuild(self, extr, objs=[]): """ - Use data produced by extract() to reconstruct an object - of the type specified in the data. + Reconstruct an object from an extract and a list of + candidates to use for its referenced objects (i.e., those + in _refd). (Use case: update of an object of which the + referenced objects already exist locally.) + + @type extr: a list (see + L{pangalatic.utils.factory.extract} + @param extr: an extract (see + L{pangalatic.utils.factory.extract} + + @type objs: list of L{pangalactic.enterprise.pgefobject.PgefObject} + @param objs: a list of objects from which the referenced + objects of the object being rebuilt can be + selected """ - classname = string.split(data[0], '.')[-1] - classobj = self._registry.pgef_classes[classname] + classpath = extr[0] + classname = string.split(classpath, '.')[-1] + klass = self._registry.pgef_classes[classname] kw = {} - for a in data[1]: - kw[a[0]] = self.uncook(a[1], classobj._schema[a[0]]) - return classobj(**kw) + for a in klass._schema: + kw[a] = self.uncook(extr[1][a], klass._schema[a]) + if klass._refd: + for a in klass._refd: + for o in objs: + if (o.__class__.__name__ == klass._refd[a] + and ([getattr(o, pka) for pka in o._pk] + == [kw[fka] for fka in klass._fk[a]])): + kw[a] = o + else: + kw[a] = None + return klass(**kw) + + def rebuildall(self, extracts, objs=[]): + """ + Take a list of extracts and reconstruct the collection of + objects. + + @type extracts: list + @param extracts: a list of extracts to be rebuilt into + objects. + + @type objs: list + @param objs: a list of instances for use in the + rebuilding process (candidates for objects + that may be referenced by the extracts but + may not be among the extracts that were + passed in). + + @rtype: list + @return: a rat's nest of objects + """ + built = [] # instances that have been built + # make a list of all classes in the extracts + cnames = utils.unique([string.split(e[0], '.')[-1] + for e in extracts]) + print 'cnames = %s' % str(cnames) + # build a dictionary of lists of extracts by class + edict = {} + for cname in cnames: + edict[cname] = [] + for e in extracts: + if cname == string.split(e[0], '.')[-1]: + edict[cname].append(e) + print 'edict = %s' % str(edict) + # make a dictionary of lists of instances by class + byclass = {} + for c in cnames: + byclass[c] = [self.rebuild(e, objs) for e in edict[c]] + for o in objs: + c = o.__class__.__name__ + if c in byclass: + byclass[c].append(o) + else: + byclass[c] = [o] + print 'byclass = %s' % str(byclass) + # so in theory, at this point everything is rebuilt. + # now hook up as many refs as we can ... using the + # registry a little bit: + for c in cnames: + print '- adding refs to %s instances ...' % c + refd = self._registry.pgef_classes[c]._refd + print ' - refd is %s' % str(refd) + if refd: + for attr in refd: + print ' - %s has type %s' % (attr, refd[attr]) + print ' - looking for %s instances' % refd[attr] + if refd[attr] in byclass: + print ' - we have %s instances' % refd[attr] + for o in byclass[c]: + print ' - looking at fk attrs of %s' % repr(o) + fkattrs = o._fk[attr] + fkvals = [getattr(o, a) + for a in fkattrs] + print ' - fk vals are %s' % str(fkvals) + for oo in byclass[refd[attr]]: + pkattrs = oo._pk + pkvals = [getattr(oo, a) + for a in pkattrs] + if fkvals == pkvals: + setattr(o, attr, oo) + break + built += byclass[c] + return built + +# built = [] # classes of refd objs that have been built +# pgef_classes = self._registry.pgef_classes +# # make a list of all classes in the extracts +# cnames = utils.unique([string.split(e[0], '.')[-1] +# for e in extracts]) +# print 'cnames is:' +# pprint(cnames) +# # instantiate objects for the class(es) that have no +# # references first ... +# print 'doing classes w/out refs ...' +# for cname in cnames: +# print ' - class: %s' % cname +# if not pgef_classes[cname]._refd: +# objs += [self.rebuild(e) for e in +# edict[cname]] +# del edict[cname] +# built.append(cname) +# print ' edict is: %s' % str(edict) +# print ' built is: %s' % str(built) +# # then iterate over the other classes, in as many passes +# # as it takes ... +# print 'now doing rest of classes ...' +# while edict: +# newbuilt = [] +# for cname in edict: +# # Sets would make this a lot easier! +# logic = (False in [a in built +# for a in pgef_classes[cname]._refd.values()]) +# print ' - class: %s ...' % cname +# print ' refd: %s ...' % str(pgef_classes[cname]._refd.values()) +# print ' logic: %s ...' % logic +# if not logic: +# objs += [self.rebuild(e, objs) for e in +# edict[cname]] +# newbuilt.append(cname) +# print ' newbuilt is: %s' % str(newbuilt) +# for cn in newbuilt: +# del edict[cn] +# built += newbuilt +# print ' built is: %s' % str(built) +# if not newbuilt: +# print """Sorry, not enough info; couldn't build all objects.""" +# break +# print 'built objs: %s' % str(objs) +# return objs From waterbug at ned.gsfc.nasa.gov Sun Oct 5 06:40:00 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 05:40:02 2003 Subject: [Pangalactic-commits] More little refinements. Message-ID: <200310050940.h959e0r5007853@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/README 1.19 1.20 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.7 1.8 Log message: More little refinements. Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.19 PanGalactic/pangalactic/test/README:1.20 --- PanGalactic/pangalactic/test/README:1.19 Sun Oct 5 00:52:17 2003 +++ PanGalactic/pangalactic/test/README Sun Oct 5 05:39:59 2003 @@ -1,4 +1,4 @@ -$Id: README,v 1.19 2003/10/05 04:52:17 waterbug Exp $ +$Id: README,v 1.20 2003/10/05 09:39:59 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ @@ -19,6 +19,7 @@ \ / test_factory_test.py test_factory_sync.py + test_factory_extractall.py test_factory_extracts2Records.py test_factory_makeObjects.py test_factory_unmakeObject.py @@ -26,11 +27,9 @@ test_pger_getresultsets.py test_pger_gettuplers.py test_pger_getobjects.py - | test_pger_addExtracts.py test_pger_addObjects.py test_pger_create.py - | test_pger_pb.py | test_xmlrpc_getobjects.py Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.7 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.8 --- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.7 Sun Oct 5 00:52:17 2003 +++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py Sun Oct 5 05:39:59 2003 @@ -1,4 +1,4 @@ -# $Id: test_xmlrpc_getobjects.py,v 1.7 2003/10/05 04:52:17 waterbug Exp $ +# $Id: test_xmlrpc_getobjects.py,v 1.8 2003/10/05 09:39:59 waterbug Exp $ """ Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService @@ -19,27 +19,26 @@ typename = 'ProductMaster' def success(stuff): - print "\n*** EXTRACT LIST ***\n" + print "\n*** XMLRPC Command:" + print """ Server.getObjects('ProductMaster', 1, 0, ['name', 'Mr. Fusion'])\n""" + print "*** Extract list obtained as result:" + print "====================================" pprint(stuff) - print "\n*** END OF EXTRACT LIST ***\n" - print - print "\n*** INDIVIDUAL OBJECT EXTRACTS ***\n" - - for x in stuff: - pprint(x) - - print "\n*** RECONSTITUTED OBJECTS ***\n" + print "====================================" + print "\n*** Rebuilt objects:" olist = [] for x in stuff: o = pgr._factory.rebuild(x) olist.append(o) - pprint(olist) - print - print "\n*** %s %s(s) found. ***\n" % (len(olist), typename) + print "%s %s(s) found" % (len(olist), typename) if olist: - print """Here's what the first one looks like:""" - print + print "====================================" + pprint(olist) + print "====================================" + print """\nHere's the first %s:""" % typename + print "====================================" print olist[0] + print "====================================" reactor.stop() def failure(error): @@ -50,7 +49,7 @@ pgr = Pger(db) xmlsrv = PgerXmlrpcService(pgr) -res = xmlsrv.xmlrpc_getObjects(typename, 0, 0, ['name', 'Mr. Fusion']) +res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, ['name', 'Mr. Fusion']) res.addCallbacks(success, failure) reactor.run() From waterbug at ned.gsfc.nasa.gov Sun Oct 5 18:24:51 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 17:24:54 2003 Subject: [Pangalactic-commits] Some more test tweaks. Message-ID: <200310052124.h95LOpos010869@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/IDTEST 1.15 1.16 PanGalactic/pangalactic/test/test_db_addrow.py 1.10 1.11 PanGalactic/pangalactic/test/test_sql.py 1.7 1.8 PanGalactic/pangalactic/test/ut_sql.py 1.1 1.2 Log message: Some more test tweaks. Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.15 PanGalactic/pangalactic/test/IDTEST:1.16 --- PanGalactic/pangalactic/test/IDTEST:1.15 Sat Oct 4 19:25:44 2003 +++ PanGalactic/pangalactic/test/IDTEST Sun Oct 5 17:24:50 2003 @@ -1 +1 @@ -224 \ No newline at end of file +228 \ No newline at end of file Index: PanGalactic/pangalactic/test/ut_sql.py diff -u PanGalactic/pangalactic/test/ut_sql.py:1.1 PanGalactic/pangalactic/test/ut_sql.py:1.2 --- PanGalactic/pangalactic/test/ut_sql.py:1.1 Sat Oct 4 00:26:08 2003 +++ PanGalactic/pangalactic/test/ut_sql.py Sun Oct 5 17:24:50 2003 @@ -1,4 +1,4 @@ -# $Id: ut_sql.py,v 1.1 2003/10/04 04:26:08 waterbug Exp $ +# $Id: ut_sql.py,v 1.2 2003/10/05 21:24:50 waterbug Exp $ """ Functional tests for pangalactic.utils.sql module @@ -7,7 +7,7 @@ from pyPgSQL import PgSQL from pangalactic.utils.sql import buildSelect from pangalactic.utils.sql import buildInsert -from pangalactic.utils.sql import buildSQLInsert +from pangalactic.utils.sql import buildTransactionalInsert from twisted.trial import unittest # TODO: need more test data ... @@ -76,7 +76,7 @@ expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123')) self.assertEquals(expected, result) -# def test_9_buildTransaction(self): +# def test_9_buildTransactionalInsert(self): # """CASE: sql string to insert a record into a table (using arg signature)""" # cmd = buildInsert('product_master', # ('id', '123'), Index: PanGalactic/pangalactic/test/test_db_addrow.py diff -u PanGalactic/pangalactic/test/test_db_addrow.py:1.10 PanGalactic/pangalactic/test/test_db_addrow.py:1.11 --- PanGalactic/pangalactic/test/test_db_addrow.py:1.10 Sat Oct 4 00:26:08 2003 +++ PanGalactic/pangalactic/test/test_db_addrow.py Sun Oct 5 17:24:50 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_addrow.py,v 1.10 2003/10/04 04:26:08 waterbug Exp $ +# $Id: test_db_addrow.py,v 1.11 2003/10/05 21:24:50 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -20,10 +20,10 @@ savedid = f.read() testoid = oid.generate('test') -testid = str(int(savedid) + 1) +tmpid = str(int(savedid) + 1) f.close() f = open('IDTEST', 'w') -f.write(testid) +f.write(tmpid) f.close() def success(stuff): @@ -40,7 +40,9 @@ ('name', 'Mr. Dynamo')) res.addCallbacks(success, failure) -out = db.addRow('product_master', pgef_oid=testoid, name='Mr. Dynamo', +testid = 'MD-' + tmpid +testname = testid + ' Model Mr. Dynamo' +out = db.addRow('product_master', pgef_oid=testoid, name=testname, id=testid, id_context='TEST', project_id='TEST', project_id_context='TEST') out.addCallback(ifNone) Index: PanGalactic/pangalactic/test/test_sql.py diff -u PanGalactic/pangalactic/test/test_sql.py:1.7 PanGalactic/pangalactic/test/test_sql.py:1.8 --- PanGalactic/pangalactic/test/test_sql.py:1.7 Sat Oct 4 00:26:08 2003 +++ PanGalactic/pangalactic/test/test_sql.py Sun Oct 5 17:24:50 2003 @@ -1,4 +1,4 @@ -# $Id: test_sql.py,v 1.7 2003/10/04 04:26:08 waterbug Exp $ +# $Id: test_sql.py,v 1.8 2003/10/05 21:24:50 waterbug Exp $ """ Functional tests for pangalactic.utils.sql module @@ -7,7 +7,6 @@ from pyPgSQL import PgSQL from pangalactic.utils.sql import buildSelect from pangalactic.utils.sql import buildInsert -from pangalactic.utils.sql import buildSQLInsert from twisted.trial import unittest # TODO: need more test data ... @@ -76,12 +75,7 @@ expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123')) self.assertEquals(expected, result) -# def test_9_buildTransaction(self): -# """CASE: sql string to insert a record into a table (using arg signature)""" -# cmd = buildInsert('product_master', -# ('id', '123'), -# ('id_context', 'TEST') -# ) -# expected = ("""INSERT INTO product_master (id, id_context) VALUES ('123', 'TEST')""") -# self.assertEquals(expected, cmd) +# def test_9_buildTransactionalInsert(self): +# """CASE: build a transactional series of INSERT +# commands as a single statement + parameter list""" From waterbug at ned.gsfc.nasa.gov Sun Oct 5 18:27:00 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 17:27:02 2003 Subject: [Pangalactic-commits] Renamed buildTransaction to buildTransactionalInsert (will need a transactional update, etc.) Message-ID: <200310052127.h95LR0hV010931@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/sql.py 1.5 1.6 Log message: Renamed buildTransaction to buildTransactionalInsert (will need a transactional update, etc.) Index: PanGalactic/pangalactic/utils/sql.py diff -u PanGalactic/pangalactic/utils/sql.py:1.5 PanGalactic/pangalactic/utils/sql.py:1.6 --- PanGalactic/pangalactic/utils/sql.py:1.5 Sat Oct 4 01:18:19 2003 +++ PanGalactic/pangalactic/utils/sql.py Sun Oct 5 17:26:58 2003 @@ -1,6 +1,6 @@ """SQL Tools""" -# $Id: sql.py,v 1.5 2003/10/04 05:18:19 waterbug Exp $ +# $Id: sql.py,v 1.6 2003/10/05 21:26:58 waterbug Exp $ import re, types @@ -127,7 +127,7 @@ sqlstmt = sqlstmt + ') VALUES ' + dum + ')' return (sqlstmt, parms) -def buildTransaction(records): +def buildTransactionalInsert(records): """ Build an SQL command string to add a series of rows in a single transaction. From waterbug at ned.gsfc.nasa.gov Sun Oct 5 18:28:47 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 17:28:48 2003 Subject: [Pangalactic-commits] Mods to support transactional inserts, etc. Message-ID: <200310052128.h95LSlfU010987@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/db.py 1.22 1.23 Log message: Mods to support transactional inserts, etc. Index: PanGalactic/pangalactic/repo/db.py diff -u PanGalactic/pangalactic/repo/db.py:1.22 PanGalactic/pangalactic/repo/db.py:1.23 --- PanGalactic/pangalactic/repo/db.py:1.22 Fri Sep 26 22:26:50 2003 +++ PanGalactic/pangalactic/repo/db.py Sun Oct 5 17:28:45 2003 @@ -1,10 +1,10 @@ """ Pan Galactic Engineering Repository Database Interface -@version: $Revision: 1.22 $ +@version: $Revision: 1.23 $ """ -__version__ = "$Revision: 1.22 $"[11:-2] +__version__ = "$Revision: 1.23 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/db.py,v $ # Twisted imports ... @@ -12,7 +12,7 @@ from twisted.internet import defer from twisted.python import log, reflect # Pan Galactic imports ... -from pangalactic.utils import sql +from pangalactic.utils import sql, utils class PgerDb(adbapi.ConnectionPool): @@ -36,8 +36,9 @@ @param table: name of the table to search @type subtypes: boolean - @param subtypes: whether to search all subtype tables or - only the specified table + @param subtypes: whether to search only the specified + table (False) or to include all subtype + tables (True) @type args: list of tuples @param args: a list of tuples, in which each tuple has the @@ -62,71 +63,57 @@ def addRow(self, table, *args, **kw): """ - Add a row, submitted either as a list of tuple arguments - (args) or a set of keyword arguments (kw), to a specified - table. + Add a row to the specified table. @type table: string @param table: name of the table to search - @type args: list of tuples - @param args: a list of tuples, in which each tuple has the - form: - - arg[0] = column name - - arg[1] = value to assign - - @kw: a dictionary of the form: - - key = column name - - value = value to assign - """ - if args: - insertargs = args - # print 'got args ...' - # print 'insertargs are %s' % insertargs - elif kw: - insertargs = [ (x, kw[x]) for x in kw.keys() ] - # print 'got keywords ...' - # print 'insertargs are %s' % insertargs - sqlargs = sql.buildInsert(table, *insertargs) - d = self.runOperation(*sqlargs) - logmsg = 'addRow done: %s table updated.' % table + @type args: list + @param args: a list of 2-tuples: + [(colname, value), ...] + + @type kw: dictionary + @param kw: {colname : value, ...} + """ + parmdict = kw or dict(args) + sqlcmd, parms = sql.buildInsert(table, parmdict) + d = self.runOperation(sqlcmd, *parms) + logmsg = 'addRow: 1 row added to %s table.' % table d.addCallback(lambda x: self._addRowDone(x, logmsg)) d.addErrback(self.operationError) + return d - def addRows(self, parmdict): + def _addRowDone(self, d, logmsg): + """Callback for addRow success. """ - Add a series of rows. + log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg)) + return d - @type parmdict: dictionary - @param parmdict: dictionary of table names mapped to - a list of lists of row attribute/value - tuples: - - {'product_master' : [ - [(id, '101'), ...], - [(id, '102'), ...]], - 'product_version' : [ - [(id, '1001'), ...], - [(id, '1002'), ...]], ... - } - """ - tables = parmdict.keys() - sqlstmt = sql.buildTransaction(parmdict) - d = self.runOperation(sqlstmt) - logmsg = 'addRows done: tables %s updated.' % str(tables) + def addRows(self, records): + """ + Add a series of rows, in a single transaction, from a + list of records (for a description of "records", see + L{pangalactic.repo.factory.extracts2Records}). + + @type records: list + @param records: a list of records -- see + L{pangalactic.utils.factory} for the + definition of an extract + """ + tables = utils.unique([rec[0] for rec in records]) + sqlstmt, parms = sql.buildTransactionalInsert(records) + d = self.runOperation(sqlstmt, *parms) + logmsg = 'addRows: rows added to tables %s.' % str(tables) d.addCallback(lambda x: self._addRowsDone(x, logmsg)) d.addErrback(self.interactionError) - - def _addRowDone(self, d, logmsg): - """Callback for addRow success. - """ - return (d, log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg))) + return d def _addRowsDone(self, d, logmsg): """ Callback for addRows success. """ - return (d, log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg))) + log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg)) + return d def operationDone(self, done): """ From waterbug at ned.gsfc.nasa.gov Sun Oct 5 18:30:19 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 17:30:21 2003 Subject: [Pangalactic-commits] Fixes to the conversion of resultsets to extracts. Message-ID: <200310052130.h95LUJDo011049@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/factory.py 1.26 1.27 Log message: Fixes to the conversion of resultsets to extracts. Index: PanGalactic/pangalactic/repo/factory.py diff -u PanGalactic/pangalactic/repo/factory.py:1.26 PanGalactic/pangalactic/repo/factory.py:1.27 --- PanGalactic/pangalactic/repo/factory.py:1.26 Thu Oct 2 22:33:52 2003 +++ PanGalactic/pangalactic/repo/factory.py Sun Oct 5 17:30:17 2003 @@ -1,11 +1,11 @@ -# $Id: factory.py,v 1.26 2003/10/03 02:33:52 waterbug Exp $ +# $Id: factory.py,v 1.27 2003/10/05 21:30:17 waterbug Exp $ """ Pan Galactic Object Factory module -@version: $Revision: 1.26 $ +@version: $Revision: 1.27 $ """ -__version__ = "$Revision: 1.26 $"[11:-2] +__version__ = "$Revision: 1.27 $"[11:-2] import types from pprint import pprint @@ -52,24 +52,19 @@ """ pass - def makeExtracts(self, reslist): + def resultsets2Extracts(self, resultsets): """ - Convert a pyPgSQL resultset into "extract" format (see - L{pangalactic.utils.factory}). + Convert a sequence of pyPgSQL resultsets into "extract" + format (see L{pangalactic.utils.factory}). """ extracts = [] - if reslist: - for res in reslist: + if resultsets: + for res in resultsets: obj = self._registry.pgerdb_classes[res.pgef_class] schema = obj._schema module = obj.__module__ s = [ (a, self.cook(getattr(res, a), schema[a])) for a in schema ] - if obj._refd: - # strictly for testing purposes! - r = [ (a, 'pgef_oid') - for a in obj._refd ] - s += r instdict = dict(s) name = module + '.' + res.pgef_class extr = [ name, instdict ] @@ -98,7 +93,7 @@ schema = self._registry.pgef_classes[classname]._schema table = self._registry.getTableName(classname) for a in e[1]: - e[1][a] = self._factory.uncook(e[1][a], schema[a]) + e[1][a] = self.uncook(e[1][a], schema[a]) recs.append([table, e[1]]) return recs @@ -114,9 +109,8 @@ """ kw = {} table = self._registry.getTableName(obj.__class__.__name__) - for a in self._registry.table_cols[table]: - if obj.__dict__.get(a): # populate kw[a] iff p.a exists - kw[a] = obj.__dict__[a] + for a in obj._schema: + kw[a] = getattr(obj, a) return (kw, table) def makeObjects(self, classname, resultsets): From waterbug at ned.gsfc.nasa.gov Sun Oct 5 18:31:50 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 17:31:51 2003 Subject: [Pangalactic-commits] Fixed report to explicitly show an empty refd. Message-ID: <200310052131.h95LVoBU011104@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/registry.py 1.33 1.34 Log message: Fixed report to explicitly show an empty refd. Index: PanGalactic/pangalactic/repo/registry.py diff -u PanGalactic/pangalactic/repo/registry.py:1.33 PanGalactic/pangalactic/repo/registry.py:1.34 --- PanGalactic/pangalactic/repo/registry.py:1.33 Mon Sep 29 14:45:26 2003 +++ PanGalactic/pangalactic/repo/registry.py Sun Oct 5 17:31:49 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Engineering Repository Object Registry -@version: $Revision: 1.33 $ +@version: $Revision: 1.34 $ """ -__version__ = "$Revision: 1.33 $"[11:-2] +__version__ = "$Revision: 1.34 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $ import string, re @@ -382,6 +382,8 @@ if nolisting: for x in nolisting: print ' %s' % x + else: + print ' Referenced Objects: ... none' print ' PgerDb Table: %s'% t print ' Columns:' print ' ---------------------------------------------' From waterbug at ned.gsfc.nasa.gov Sun Oct 5 18:34:31 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 17:34:32 2003 Subject: [Pangalactic-commits] Mods to utilize new db transactional inserts + factory extracts2Records method. Message-ID: <200310052134.h95LYV3Z011147@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/pger.py 1.42 1.43 Log message: Mods to utilize new db transactional inserts + factory extracts2Records method. Index: PanGalactic/pangalactic/repo/pger.py diff -u PanGalactic/pangalactic/repo/pger.py:1.42 PanGalactic/pangalactic/repo/pger.py:1.43 --- PanGalactic/pangalactic/repo/pger.py:1.42 Fri Sep 26 22:32:46 2003 +++ PanGalactic/pangalactic/repo/pger.py Sun Oct 5 17:34:30 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Entropy Reverser module -@version: $Revision: 1.42 $ +@version: $Revision: 1.43 $ """ -__version__ = "$Revision: 1.42 $"[11:-2] +__version__ = "$Revision: 1.43 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $ import time @@ -103,8 +103,8 @@ @type refs: integer @param refs: specifies whether to include the objects referenced by the specified class. - - 0: do not get references - - 1: get all references + 0: do not get references + 1: get all references (in future, refs may specify how many reference levels to follow ...) @@ -112,8 +112,8 @@ @param subtypes: specifies whether to include only the specified class (the default) or all subtypes. - - 0: only this type - - 1: include subtypes + 0: only this type + 1: include subtypes @param kw: keyword arguments of the form: key: an attribute of the object @@ -361,26 +361,10 @@ L{pangalactic.enterprise.pgefobject.PgefObject} @param olist: a list of PGEF objects """ - # set datetime stamp for this operation - dt = time.strftime("%Y-%m-%d %H:%M:%S") - for o in olist: - # possible TO DO item: - # group objects in olist by type and add them in - # order of potential dependencies ... or else do - # entire list in a single transaction -- probably - # better, but might want to have that as an option or - # even a completely separate method. - kw, table = self._factory.unmakeObject(o) - kw['pger_create_datetime'] = dt - kw['pger_mod_datetime'] = dt - addargs = [ (k, kw[k]) for k in kw ] - # DEBUG: print kw - # DEBUG: print 'object type is %s' % o.__class__.__name__ - # DEBUG: print 'table is %s' % table - self._pgerdb.addRow(table, *addargs) - return dt + extracts = [self._factory.extract(o) for o in olist] + return self.addExtracts(extracts) - def addExtracts(self, elist): + def addExtracts(self, extracts): """ Add a list of extracts of PGEF objects to PGERDB. - add a row to the appropriate PGERDB table for each @@ -399,20 +383,14 @@ """ # TODO: role-based authorization checks based on object # type, etc. + parmdict = {} dt = time.strftime("%Y-%m-%d %H:%M:%S") - for e in elist: - classpath, args = e[0], e[1] - cname = classpath.split('.')[-1] - table = self._registry.getTableName(cname) - args.append(['pger_create_datetime', dt]) - args.append(['pger_mod_datetime', dt]) - # uncook args for PostgreSQL-compatible types - schema = self._registry.pgef_classes[cname]._schema - for arg in args: - arg[1] = self._factory.uncook(arg[1], schema[arg[0]]) - print 'table = %s' % table - print 'args = %s' % args - self._pgerdb.addRow(table, *args) + parmdict['pger_create_datetime'] = dt + parmdict['pger_mod_datetime'] = dt + for e in extracts: + e[1].update(parmdict) + recs = self._factory.extracts2Records(extracts) + self._pgerdb.addRows(recs) return dt def createProductMaster(self, id, id_context, project_id, project_id_context, **kw): From waterbug at ned.gsfc.nasa.gov Sun Oct 5 18:36:06 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Sun Oct 5 17:36:07 2003 Subject: [Pangalactic-commits] Mods to XMLRPC code and method signatures to utilize new back-end capabilities. Message-ID: <200310052136.h95La64A011209@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/xmlrpc.py 1.20 1.21 Log message: Mods to XMLRPC code and method signatures to utilize new back-end capabilities. Index: PanGalactic/pangalactic/repo/xmlrpc.py diff -u PanGalactic/pangalactic/repo/xmlrpc.py:1.20 PanGalactic/pangalactic/repo/xmlrpc.py:1.21 --- PanGalactic/pangalactic/repo/xmlrpc.py:1.20 Sun Sep 21 16:23:22 2003 +++ PanGalactic/pangalactic/repo/xmlrpc.py Sun Oct 5 17:36:05 2003 @@ -1,9 +1,9 @@ """ PGER XML-RPC Interfaces module -@version: $Revision: 1.20 $ +@version: $Revision: 1.21 $ """ -__version__ = "$Revision: 1.20 $"[11:-2] +__version__ = "$Revision: 1.21 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/xmlrpc.py,v $ from twisted.web import xmlrpc @@ -41,12 +41,20 @@ def xmlrpc_test_echoargs(self, *args): """xmlrpc request for echo of args.""" - l = list(args) - return l + if args: + l = list(args) + return l + else: + s = """Nothin' from nothin' LEAVES nothin', """ + s += """ya gotta have somethin' ...!""" + return s - def xmlrpc_getObjects(self, *args): - """xmlrpc get objects: gets the set of objects that - exactly match a specified set of attribute-value pairs. + def xmlrpc_getObjects(self, typename, refs, subtypes, *args): + """ + XMLRPC getObjects: get the set of objects that exactly + match a specified set of attribute-value pairs, returning + the result encoded in the "extract" format -- see + L{pangalactic.utils.factory.extract}) usage: getObjects([object type], [kw-string, ...]) @@ -55,14 +63,19 @@ XMLRPC doesn't support keyword parameters; they are quoted strings that will be parsed by the server). """ - if len(args) > 1: - typename = args[0] - kw = keywordify(args[1:]) - if kw: - res = self.PGER.getResultSets(typename, **kw) - else: - res = self.PGER.getResultSets(typename) - res.addCallback(self.PGER._factory.makeExtracts) + if args: + kw = {} + tuples = [] + for a in args: + if a and isinstance(a, list): + tuples.append(a) + if a and isinstance(a, dict): + kw.update(a) + if tuples: + kw.update(dict(tuples)) + res = self.PGER.getResultSets(typename, refs, + subtypes, **kw) + res.addCallback(self.PGER._factory.resultsets2Extracts) res.addCallbacks(succeed, fail) return res else: @@ -79,8 +92,7 @@ # creating the (classname, kw) from that. But this is # easier for now ... if elist: - olist = [self.PGER._factory.reconstitute(e) for e in elist] - return self.PGER.addObjects(olist) + return self.PGER.addExtracts(elist) else: return """I'm sorry, Dave, I'm afraid I can't do that.""" From waterbug at ned.gsfc.nasa.gov Mon Oct 6 01:23:33 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 00:23:35 2003 Subject: [Pangalactic-commits] New p.repo.factory method records2RowKeys(). Message-ID: <200310060423.h964NX95012067@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/factory.py 1.27 1.28 Log message: New p.repo.factory method records2RowKeys(). Index: PanGalactic/pangalactic/repo/factory.py diff -u PanGalactic/pangalactic/repo/factory.py:1.27 PanGalactic/pangalactic/repo/factory.py:1.28 --- PanGalactic/pangalactic/repo/factory.py:1.27 Sun Oct 5 17:30:17 2003 +++ PanGalactic/pangalactic/repo/factory.py Mon Oct 6 00:23:31 2003 @@ -1,11 +1,11 @@ -# $Id: factory.py,v 1.27 2003/10/05 21:30:17 waterbug Exp $ +# $Id: factory.py,v 1.28 2003/10/06 04:23:31 waterbug Exp $ """ Pan Galactic Object Factory module -@version: $Revision: 1.27 $ +@version: $Revision: 1.28 $ """ -__version__ = "$Revision: 1.27 $"[11:-2] +__version__ = "$Revision: 1.28 $"[11:-2] import types from pprint import pprint @@ -96,6 +96,28 @@ e[1][a] = self.uncook(e[1][a], schema[a]) recs.append([table, e[1]]) return recs + + def records2RowKeys(self, records): + """ + Take a list of records and extracts the rowkeys -- i.e., + the values of the primary key for each record. + + @type extracts: a list + @param extracts: a list of records -- see + L{pangalactic.repo.factory.extracts2Records} + + @rtype: list + @return: a list of "rowkeys". A rowkey has the following + structure: [tablename, {pkcolname : value, ...}] + """ + rowkeys = [] + for rec in records: + pk = self._registry.table_pkeys[rec[0]] + key = {} + for a in pk: + key[a] = rec[1][a] + rowkeys.append([rec[0], key]) + return rowkeys def unmakeObject(self, obj): """ From waterbug at ned.gsfc.nasa.gov Mon Oct 6 01:24:41 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 00:24:43 2003 Subject: [Pangalactic-commits] ... and a test for p.repo.factory.records2RowKeys(). Message-ID: <200310060424.h964Ofoj012109@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_factory_records2RowKeys.py None 1.1 Log message: .. and a test for p.repo.factory.records2RowKeys(). From waterbug at ned.gsfc.nasa.gov Mon Oct 6 01:30:59 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 00:31:01 2003 Subject: [Pangalactic-commits] Somewhat more concise coding, + docstring correction. Message-ID: <200310060430.h964UxwR012153@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/factory.py 1.28 1.29 Log message: Somewhat more concise coding, + docstring correction. Index: PanGalactic/pangalactic/repo/factory.py diff -u PanGalactic/pangalactic/repo/factory.py:1.28 PanGalactic/pangalactic/repo/factory.py:1.29 --- PanGalactic/pangalactic/repo/factory.py:1.28 Mon Oct 6 00:23:31 2003 +++ PanGalactic/pangalactic/repo/factory.py Mon Oct 6 00:30:58 2003 @@ -1,11 +1,11 @@ -# $Id: factory.py,v 1.28 2003/10/06 04:23:31 waterbug Exp $ +# $Id: factory.py,v 1.29 2003/10/06 04:30:58 waterbug Exp $ """ Pan Galactic Object Factory module -@version: $Revision: 1.28 $ +@version: $Revision: 1.29 $ """ -__version__ = "$Revision: 1.28 $"[11:-2] +__version__ = "$Revision: 1.29 $"[11:-2] import types from pprint import pprint @@ -102,9 +102,9 @@ Take a list of records and extracts the rowkeys -- i.e., the values of the primary key for each record. - @type extracts: a list - @param extracts: a list of records -- see - L{pangalactic.repo.factory.extracts2Records} + @type records: a list + @param records: a list of records -- see + L{pangalactic.repo.factory.extracts2Records} @rtype: list @return: a list of "rowkeys". A rowkey has the following @@ -113,9 +113,8 @@ rowkeys = [] for rec in records: pk = self._registry.table_pkeys[rec[0]] - key = {} - for a in pk: - key[a] = rec[1][a] + pks = [(a, rec[1][a]) for a in pk] + key = dict(pks) rowkeys.append([rec[0], key]) return rowkeys From waterbug at ned.gsfc.nasa.gov Mon Oct 6 01:41:22 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 00:41:24 2003 Subject: [Pangalactic-commits] Add new function buildSelectFromRowKeys() Message-ID: <200310060441.h964fMqZ012198@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/sql.py 1.6 1.7 Log message: Add new function buildSelectFromRowKeys() Index: PanGalactic/pangalactic/utils/sql.py diff -u PanGalactic/pangalactic/utils/sql.py:1.6 PanGalactic/pangalactic/utils/sql.py:1.7 --- PanGalactic/pangalactic/utils/sql.py:1.6 Sun Oct 5 17:26:58 2003 +++ PanGalactic/pangalactic/utils/sql.py Mon Oct 6 00:41:21 2003 @@ -1,6 +1,6 @@ """SQL Tools""" -# $Id: sql.py,v 1.6 2003/10/05 21:26:58 waterbug Exp $ +# $Id: sql.py,v 1.7 2003/10/06 04:41:21 waterbug Exp $ import re, types @@ -95,6 +95,22 @@ # is needed ... selectargs = (sqlstmt,) return selectargs + +def buildSelectFromRowKeys(rowkeys): + """ + Take a list of rowkeys (for def of a rowkey, see + L{pangalactic.repo.factory.records2RowKeys}) and + return an SQL select statement that will select the + corresponding rows from the appropriate tables. + """ + allsql = '' + allargs = [] + for rk in rowkeys: + args = [(a, rk[1][a], '=') for a in rk[1]] + parms = buildSelect(rk[0], 0, *args) + allsql += parms[0] + '; ' + allargs += parms[1:] + return allsql, allargs def buildInsert(table, parmdict): """ From waterbug at ned.gsfc.nasa.gov Mon Oct 6 01:42:18 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 00:42:20 2003 Subject: [Pangalactic-commits] ... and add a test for buildSelectFromRowKeys(). Message-ID: <200310060442.h964gIow012227@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_sql.py 1.8 1.9 Log message: .. and add a test for buildSelectFromRowKeys(). Index: PanGalactic/pangalactic/test/test_sql.py diff -u PanGalactic/pangalactic/test/test_sql.py:1.8 PanGalactic/pangalactic/test/test_sql.py:1.9 --- PanGalactic/pangalactic/test/test_sql.py:1.8 Sun Oct 5 17:24:50 2003 +++ PanGalactic/pangalactic/test/test_sql.py Mon Oct 6 00:42:16 2003 @@ -1,81 +1,157 @@ -# $Id: test_sql.py,v 1.8 2003/10/05 21:24:50 waterbug Exp $ +# $Id: test_sql.py,v 1.9 2003/10/06 04:42:16 waterbug Exp $ """ Functional tests for pangalactic.utils.sql module """ +from pprint import pprint from pyPgSQL import PgSQL from pangalactic.utils.sql import buildSelect +from pangalactic.utils.sql import buildSelectFromRowKeys from pangalactic.utils.sql import buildInsert -from twisted.trial import unittest +from pangalactic.utils import oid +from pangalactic.enterprise.productmaster import ProductMaster as PM +from pangalactic.enterprise.productversion import ProductVersion as PV +from pangalactic.enterprise.project import Project +from pangalactic.repo.factory import PgerObjectFactory as POF +from pangalactic.repo.registry import PgerObjectRegistry as POR # TODO: need more test data ... -class SqlGenerationTest(unittest.TestCase): - - def test_1_equals(self): - """CASE: build a SELECT by one string column, '=' operator""" - cmd = buildSelect('product_master', 0, - ('id_context', 'TEST', '=')) - expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s', - 'TEST') - self.assertEquals(expected, cmd) - - def test_2_equals_and_like(self): - """CASE: build a SELECT by several string columns; like and =""" - cmd = buildSelect('product_master', 0, - ('id_context', 'TEST', '='), - ('name', 'Mr. F') - ) - expected = ('SELECT * FROM ONLY product_master WHERE id_context = %s AND name ILIKE %s', 'TEST', '%Mr. F%') - self.assertEquals(expected, cmd) - - def test_3_in_sequence(self): - """CASE: build a SELECT by one column with a sequence of values""" - cmd = buildSelect('alert', 0, - ('doc_number', - ("XG4-D-02-03", - "XG4-D-02-05", - "XG4-D-02-07"))) - expected = ("SELECT * FROM ONLY alert WHERE doc_number IN ('XG4-D-02-03', 'XG4-D-02-05', 'XG4-D-02-07')",) - self.assertEquals(expected, cmd) - - def test_4_date_interval(self): - """CASE: build a SELECT by date interval""" - cmd = buildSelect('alert', 0, - ('doc_issue_date', '2002-04-01', '>'), - ('doc_issue_date', '2002-05-01', '<') - ) - expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s AND doc_issue_date < %s', '2002-04-01', '2002-05-01') - self.assertEquals(expected, cmd) - - def test_5_sort(self): - """CASE: build a SELECT with order by one column""" - cmd = buildSelect('alert', 0, - ('doc_issue_date', '2002-04-01', '>'), - sort='doc_issue_date') - expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date', '2002-04-01') - self.assertEquals(expected, cmd) - - def test_6_multi_sort(self): - """CASE: build a SELECT with order by multiple columns""" - cmd = buildSelect('alert', 0, - ('doc_issue_date', '2002-04-01', '>'), - sort=('doc_issue_date', 'doc_designator') - ) - expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date, doc_designator,', '2002-04-01') - self.assertEquals(expected, cmd) - - def test_7_buildInsert(self): - """CASE: build an INSERT statement + parameter list""" - result = buildInsert('product_master', - {'id' : '123', - 'id_context' : 'TEST'} - ) - expected = ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123')) - self.assertEquals(expected, result) - -# def test_9_buildTransactionalInsert(self): -# """CASE: build a transactional series of INSERT -# commands as a single statement + parameter list""" +print '===================================' +print """CASE: build a SELECT by one string column, '=' operator""" +print '-----------------------------------' +cmd = buildSelect('product_master', 0, + ('id_context', 'TEST', '=')) +print 'cmd is:' +print str(cmd) +print ' -----------------------------------' +print """ expected: 'SELECT * FROM ONLY product_master WHERE id_context = %s', + 'TEST'""" +print '===================================' +print +print +print '===================================' +print """CASE: build a SELECT by several string columns; like and =""" +print '-----------------------------------' +cmd = buildSelect('product_master', 0, + ('id_context', 'TEST', '='), + ('name', 'Mr. F') + ) +print 'cmd is:' +print str(cmd) +print '-----------------------------------' +print """expected: ('SELECT * FROM ONLY product_master WHERE id_context = %s AND name ILIKE %s', 'TEST', '%Mr. F%')""" +print '===================================' +print +print +print '===================================' +print """CASE: build a SELECT by one column with a sequence of values""" +print '-----------------------------------' +cmd = buildSelect('alert', 0, + ('doc_number', + ("XG4-D-02-03", + "XG4-D-02-05", + "XG4-D-02-07"))) +print 'cmd is:' +print str(cmd) +print '-----------------------------------' +print """expected: ("SELECT * FROM ONLY alert WHERE doc_number IN ('XG4-D-02-03', 'XG4-D-02-05', 'XG4-D-02-07')",)""" +print '===================================' +print +print +print '===================================' +print """CASE: build a SELECT by date interval""" +print '-----------------------------------' +cmd = buildSelect('alert', 0, + ('doc_issue_date', '2002-04-01', '>'), + ('doc_issue_date', '2002-05-01', '<') + ) +print 'cmd is:' +print str(cmd) +print '-----------------------------------' +print """expected: ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s AND doc_issue_date < %s', '2002-04-01', '2002-05-01')""" +print '===================================' +print +print +print '===================================' +print """CASE: build a SELECT with order by one column""" +print '-----------------------------------' +cmd = buildSelect('alert', 0, + ('doc_issue_date', '2002-04-01', '>'), + sort='doc_issue_date') +print 'cmd is:' +print str(cmd) +print '-----------------------------------' +print """expected = ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date', '2002-04-01')""" +print '===================================' +print +print +print '===================================' +print """CASE: build a SELECT with order by multiple columns""" +print '-----------------------------------' +cmd = buildSelect('alert', 0, + ('doc_issue_date', '2002-04-01', '>'), + sort=('doc_issue_date', 'doc_designator') + ) +print 'cmd is:' +print str(cmd) +print '-----------------------------------' +print """expected: ('SELECT * FROM ONLY alert WHERE doc_issue_date > %s ORDER BY doc_issue_date, doc_designator,', '2002-04-01')""" +print '===================================' +print +print +print '===================================' +print """CASE: build an INSERT statement + parameter list""" +cmd = buildInsert('product_master', + {'id' : '123', + 'id_context' : 'TEST'} + ) +print 'cmd is:' +print str(cmd) +print '-----------------------------------' +print """expected: ('INSERT INTO product_master (id_context, id) VALUES (%s, %s)', ('TEST', '123'))""" +print '===================================' +print +print +print '===================================' +print """CASE: build a SELECT statement + parameter list from records""" +f = open('IDTEST') +savedid = f.read() +testoid1 = oid.generate('test') +testoid2 = oid.generate('test') + +testid = str(int(savedid) + 1) +f.close() +f = open('IDTEST', 'w') +f.write(testid) +f.close() + +projid = 'MD' + testid +projname = 'MD' + testid + ' Project' +pmid = 'MD-' + testid +pmname = 'MD-' + testid + ' Model Mr. Dynamo' +pvname = 'MD-' + testid + ' Version A' + +# create test objects +p = Project(id=projid, id_context='TEST', name=projname) +p.popTestData() +pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p) +pm.popTestData() +pv = PV(_of_master=pm, id='A', name=pvname) +pv.popTestData() + +reg = POR() +fac = POF(reg) +pe = fac.extract(p) +pme = fac.extract(pm) +pve = fac.extract(pv) + +extracts = [pe, pme, pve] +recs = fac.extracts2Records(extracts) +keys = fac.records2RowKeys(recs) +cmd = buildSelectFromRowKeys(keys) +print 'cmd is:' +pprint(cmd) +print '===================================' From waterbug at ned.gsfc.nasa.gov Mon Oct 6 02:11:20 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 01:11:21 2003 Subject: [Pangalactic-commits] A gleeful renaming (esp. for Harry Potter fans ... heh ; ^). Message-ID: <200310060511.h965BKRs012321@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/factory.py 1.3 1.4 Log message: A gleeful renaming (esp. for Harry Potter fans ... heh ;^). Index: PanGalactic/pangalactic/utils/factory.py diff -u PanGalactic/pangalactic/utils/factory.py:1.3 PanGalactic/pangalactic/utils/factory.py:1.4 --- PanGalactic/pangalactic/utils/factory.py:1.3 Sun Oct 5 05:33:05 2003 +++ PanGalactic/pangalactic/utils/factory.py Mon Oct 6 01:11:18 2003 @@ -1,12 +1,12 @@ -# $Id: factory.py,v 1.3 2003/10/05 09:33:05 waterbug Exp $ +# $Id: factory.py,v 1.4 2003/10/06 05:11:18 waterbug Exp $ """ Functions to extract persistable data from L{pangalactic.enterprise} objects. -@version: $Revision: 1.3 $ +@version: $Revision: 1.4 $ """ -__version__ = "$Revision: 1.3 $"[11:-2] +__version__ = "$Revision: 1.4 $"[11:-2] import types import string @@ -170,12 +170,12 @@ else: return value - def rebuild(self, extr, objs=[]): + def remember(self, extr, objs=[]): """ - Reconstruct an object from an extract and a list of - candidates to use for its referenced objects (i.e., those - in _refd). (Use case: update of an object of which the - referenced objects already exist locally.) + Re-member (wink ;^) an object from an extract and a list + of candidates to use for its referenced objects (i.e., + those in _refd). (Use case: update of an object of + which the referenced objects already exist locally.) @type extr: a list (see L{pangalatic.utils.factory.extract} @@ -184,7 +184,7 @@ @type objs: list of L{pangalactic.enterprise.pgefobject.PgefObject} @param objs: a list of objects from which the referenced - objects of the object being rebuilt can be + objects of the object being remembered can be selected """ classpath = extr[0] @@ -204,18 +204,18 @@ kw[a] = None return klass(**kw) - def rebuildall(self, extracts, objs=[]): + def rememberAll(self, extracts, objs=[]): """ Take a list of extracts and reconstruct the collection of objects. @type extracts: list - @param extracts: a list of extracts to be rebuilt into + @param extracts: a list of extracts to be remembered into objects. @type objs: list @param objs: a list of instances for use in the - rebuilding process (candidates for objects + remembering process (candidates for objects that may be referenced by the extracts but may not be among the extracts that were passed in). @@ -223,7 +223,7 @@ @rtype: list @return: a rat's nest of objects """ - built = [] # instances that have been built + remembered = [] # instances that have been remembered # make a list of all classes in the extracts cnames = utils.unique([string.split(e[0], '.')[-1] for e in extracts]) @@ -239,7 +239,7 @@ # make a dictionary of lists of instances by class byclass = {} for c in cnames: - byclass[c] = [self.rebuild(e, objs) for e in edict[c]] + byclass[c] = [self.remember(e, objs) for e in edict[c]] for o in objs: c = o.__class__.__name__ if c in byclass: @@ -247,7 +247,7 @@ else: byclass[c] = [o] print 'byclass = %s' % str(byclass) - # so in theory, at this point everything is rebuilt. + # so in theory, at this point everything is remembered. # now hook up as many refs as we can ... using the # registry a little bit: for c in cnames: @@ -273,52 +273,6 @@ if fkvals == pkvals: setattr(o, attr, oo) break - built += byclass[c] - return built - -# built = [] # classes of refd objs that have been built -# pgef_classes = self._registry.pgef_classes -# # make a list of all classes in the extracts -# cnames = utils.unique([string.split(e[0], '.')[-1] -# for e in extracts]) -# print 'cnames is:' -# pprint(cnames) -# # instantiate objects for the class(es) that have no -# # references first ... -# print 'doing classes w/out refs ...' -# for cname in cnames: -# print ' - class: %s' % cname -# if not pgef_classes[cname]._refd: -# objs += [self.rebuild(e) for e in -# edict[cname]] -# del edict[cname] -# built.append(cname) -# print ' edict is: %s' % str(edict) -# print ' built is: %s' % str(built) -# # then iterate over the other classes, in as many passes -# # as it takes ... -# print 'now doing rest of classes ...' -# while edict: -# newbuilt = [] -# for cname in edict: -# # Sets would make this a lot easier! -# logic = (False in [a in built -# for a in pgef_classes[cname]._refd.values()]) -# print ' - class: %s ...' % cname -# print ' refd: %s ...' % str(pgef_classes[cname]._refd.values()) -# print ' logic: %s ...' % logic -# if not logic: -# objs += [self.rebuild(e, objs) for e in -# edict[cname]] -# newbuilt.append(cname) -# print ' newbuilt is: %s' % str(newbuilt) -# for cn in newbuilt: -# del edict[cn] -# built += newbuilt -# print ' built is: %s' % str(built) -# if not newbuilt: -# print """Sorry, not enough info; couldn't build all objects.""" -# break -# print 'built objs: %s' % str(objs) -# return objs + remembered += byclass[c] + return remembered From waterbug at ned.gsfc.nasa.gov Mon Oct 6 04:47:01 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 03:47:03 2003 Subject: [Pangalactic-commits] Add _pk and _fk attrs and removed FillSampleProject class method (superceded by popTestData instance method). Message-ID: <200310060747.h967l1Cd012927@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/project.py 1.10 1.11 Log message: Add _pk and _fk attrs and removed FillSampleProject class method (superceded by popTestData instance method). Index: PanGalactic/pangalactic/enterprise/project.py diff -u PanGalactic/pangalactic/enterprise/project.py:1.10 PanGalactic/pangalactic/enterprise/project.py:1.11 --- PanGalactic/pangalactic/enterprise/project.py:1.10 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/project.py Mon Oct 6 03:46:59 2003 @@ -1,22 +1,20 @@ -# $Id: project.py,v 1.10 2003/09/29 18:39:59 waterbug Exp $ +# $Id: project.py,v 1.11 2003/10/06 07:46:59 waterbug Exp $ """ Project metadata. """ -__version__ = "$Revision: 1.10 $"[11:-2] +__version__ = "$Revision: 1.11 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject -def FillSampleProject(project): +def FillSampleProject(proj): """ Fills in some test data. """ - project.name = 'TP' - project.short_description = 'Test Project' - project.owner = 'joe@schmoe.com' - project.creator = 'moi@moi.com' - + proj.name = 'TP' + proj.short_description = 'Test Project' + class Project(PgefObject): """ I encapsulate all data about a Project. @@ -30,6 +28,7 @@ 'pger_create_datetime', 'pgef_oid'] _excluded_dump = [] + _fk = {} # These are the fields that will appear in when a Project is # placed in a grid. The format for each field is # [ Label, attribute, field_type ]. @@ -41,6 +40,7 @@ ['Created','self.create_datetime', 'string'], ['Creator','self.creator', 'string'] ] + _pk = ['id', 'id_context'] _schema_ext = {} _schema = _schema_ext.copy() _schema.update(PgefObject._schema) From waterbug at ned.gsfc.nasa.gov Mon Oct 6 09:20:41 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 08:20:43 2003 Subject: [Pangalactic-commits] Test for Pger method _getRefRowKeys. Message-ID: <200310061220.h96CKfCF015438@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_pger_getRefRowKeys.py None 1.1 Log message: Test for Pger method _getRefRowKeys. From pbear at ned.gsfc.nasa.gov Mon Oct 6 15:37:11 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Mon Oct 6 14:37:13 2003 Subject: [Pangalactic-commits] added vanilla implementations of current wfprocess activities; more tbd rsn Message-ID: <200310061837.h96IbBOO020077@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.34 1.35 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py None 1.1 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.10 1.11 PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py 1.12 1.13 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.13 1.14 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.14 1.15 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.16 1.17 PanGalactic/pangalactic/utils/datamanager.py 1.34 1.35 PanGalactic/pangalactic/utils/localdb.py 1.32 1.33 Log message: added vanilla implementations of current wfprocess activities; more tbd rsn Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.14 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.15 --- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.14 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py Mon Oct 6 14:37:09 2003 @@ -345,7 +345,6 @@ transitions = editor.GetTransitions() activities = editor.GetActivities() wfobj = editor.Save() - #print "wfobj", wfobj if wfobj: self.grid.AddData(wfobj, wxLIGHT_GREY) dlg.Destroy() @@ -430,7 +429,7 @@ print "workflowoverview.Setupforlocalmode tbd" def Commit(self): - #print "workflowoverview.commit" + print "workflowoverview.commit" if self.DataManager.UncommittedWorkflows(): #print "have uncommitted workflows" Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.34 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.35 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.34 Thu Oct 2 15:31:22 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Mon Oct 6 14:37:09 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.34 2003/10/02 19:31:22 pbear Exp $ +# $Id: pgefadvisory.py,v 1.35 2003/10/06 18:37:09 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.34 $"[11:-2] +__version__ = "$Revision: 1.35 $"[11:-2] import os.path import string @@ -69,8 +69,7 @@ # leave this here... I use it to generate old data -vwk # # now = mx.DateTime.DateFromTicks(mx.DateTime.now()) -# earlier = now + mx.DateTime.RelativeDateTime(days=-85) -# +# earlier = now + mx.DateTime.RelativeDateTime(days=-15) # self.pger_create_datetime = earlier # self.pger_mod_datetime = earlier # self.create_datetime = earlier Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.16 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.17 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.16 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Mon Oct 6 14:37:09 2003 @@ -78,7 +78,7 @@ self.act_labels = [] for actinfo in self.ActInfo: - print "actinfo", actinfo + #print "actinfo", actinfo self.act_labels.append(actinfo[2]) self.trans_labels = [] @@ -209,18 +209,18 @@ def createWorkflow(self, name, activities, transitions): - print "wizard.createWorkflow" + #print "wizard.createWorkflow" process = wffactory.simpleWfProcess(name) activitydict = {} wfdata = None for akey, avalue in activities.items(): - print "akey", akey, "; avalue", avalue + #print "akey", akey, "; avalue", avalue wfactivity = wffactory.newWfActivity(avalue["activity"], process.pgef_oid, avalue, wfdata) activitydict[wfactivity.pgef_oid] = wfactivity - self.DataManager.Add([wfactivity]) - print "activitydict", activitydict + self.DataManager.add([wfactivity]) + #print "activitydict", activitydict fromlist = [] tolist = [] @@ -243,7 +243,7 @@ # transition = wftransition.WfTransition(translist[0], translist[1], process.pgef_oid) transition = wffactory.newWfTransition(process.pgef_oid, translist[0], translist[1]) transitiondict[transition.pgef_oid] = transition - self.DataManager.Add([transition]) + self.DataManager.add([transition]) #print "transitiondict", transitiondict tolist.sort() @@ -264,14 +264,14 @@ def Save(self, event = None): - print "workflow_wizard.save" + #print "workflow_wizard.save" if self.DataManager.creatingWorkflow: self.DataManager.creatingWorkflow = false transitions = self.GetTransitions() activities = self.GetActivities() name = self.GetName() - print "name <", name, ">" + #print "name <", name, ">" if name: self.workflow = self.createWorkflow(name, activities, transitions) self.DataManager.addWorkflow(self.workflow) @@ -282,17 +282,17 @@ return None else: - # print "not creating a workflow" + #print "not creating a workflow" return None def SaveChanges(self): - print "wfwizard.savechanges" + #print "wfwizard.savechanges" transitions = self.GetTransitions() activities = self.GetActivities() name = self.GetName() - print "name <", name, ">" - print "activities", activities - print "transitions", transitions + #print "name <", name, ">" + #print "activities", activities + #print "transitions", transitions if name: if self.workflow: self.workflow.SetActivities(activities) Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.13 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.14 --- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.13 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py Mon Oct 6 14:37:09 2003 @@ -44,7 +44,7 @@ ["Template\nName", "self.name", "string", ""], ["# Steps", "self._nstates", "string", ""], ["Status", "self._activity_name", "string", ""], - ["Status Date", "self._activity_due_date_str", "string", "colour"], + ["Due Date", "self._activity_due_date_str", "string", "colour"], ["Pending\nAction", "self._next_activity_name", "string", ""]] @@ -129,9 +129,29 @@ self.defaultstartid = activityid - def initiate(self, wfdata): +## def setDataManager(self, datamgr): +## print "wfprocess.setdatamanager" +## self._DataManager = datamgr +## for akey, aobj in self.activities.items(): +## aobj.setDataManager(self._DataManager) + + +## def clearDataManager(self): +## print "wfprocess.cleardatamanager" +## self._DataManager = None +## for akey, aobj in self.activities.items(): +## aobj.clearDataManager() + + + def initiate(self, wfdata, datamgr): + """ + Start a wfprocess instance. Only a wfprocess instance has a wfdata object. + """ # print "wfprocess.initiate", self.defaultstartid self.activityId = self.defaultstartid +# self.setDataManager(datamgr) + self.SetData(wfdata) + if self.activityId: current_activity = self.activities[self.activityId] current_activity.changeState(OPEN_NOTSTARTED) @@ -141,9 +161,8 @@ duedate = now + mx.DateTime.RelativeDateTime(days=current_activity.getDuration()) self._activity_due_date = duedate self._activity_due_date_str = datetimes.getDisplayDate(duedate) - - self.getNextActivityName() - self.SetData(wfdata) + current_activity.startActivity(datamgr) + self.getNextActivityName() def getNextActivityName(self): @@ -164,7 +183,6 @@ self.fields["currentStatus"] = newState self.fields["lastStatusUpdate"] = now eventaudit = wfeventaudit.WfEventAudit(self, wfeventaudittypes.processStateChanged, self.oid) - #self.DataManager.Save([eventaudit]) historyevent = wfeventaudit.WfEventAudit(self.getName(), wfeventaudittypes.processStateChanged, self.oid) Index: PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.12 PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.13 --- PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py:1.12 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfexecutionobject.py Mon Oct 6 14:37:09 2003 @@ -45,7 +45,6 @@ self.parentId = parentId # WorkEffort ID of the parent runtime object (null for process) self.name = wfname self.description = "" -# self.DataManager = None self.history = [] # timetuple = mx.DateTime.now() # self.create_datetime = timetuple.strftime("%m/%d/%Y %H:%M:%S") #time.strftime("%m/%d/%Y %H:%M:%S", footuple) Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.10 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.11 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.10 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py Mon Oct 6 14:37:09 2003 @@ -10,9 +10,11 @@ from pangalactic.enterprise.workflow.wfexecutionstates import * from pangalactic.enterprise.workflow.wfexecutionobject import WfExecutionObject +import pangalactic.enterprise.workflow.wfactivity_implementation as wfactivity_impl import pangalactic.enterprise.workflow.wfeventaudit as wfeventaudit import pangalactic.enterprise.workflow.wfeventaudittypes as wfeventaudittypes + class WfActivity(WfExecutionObject): """ This is the primary building block for a workflow. For now, only these @@ -77,7 +79,6 @@ self.fields["currentStatus"] = newState self.fields["lastStatusUpdate"] = now eventaudit = wfeventaudit.WfEventAudit(self, wfeventaudittypes.activityStateChanged, self.oid) -# self.DataManager.Save([eventaudit]) historyevent = wfeventaudit.WfEventAudit(self.getName(), wfeventaudittypes.activityStateChanged, self.oid) @@ -132,11 +133,18 @@ except TransitionNotAllowed: raise CannotComplete, "Transition Not Allowed" - +## def setDataManager(self, datamgr): +## print "wfactivity.setdatamanager" +## self._DataManager = datamgr + +## def clearDataManager(self): +## print "wfactivity.cleardatamanager" +## self._DataManager = None + ## Starts or activates this activity - def startActivity(self): + def startActivity(self, datamgr): # wfmc specification - print "startActivity needs more work" + print "startActivity is under construction" try: self.changeState(OPEN_RUNNING) @@ -145,8 +153,18 @@ except TransitionNotAllowed: raise CannotStart, "Transition Not Allowed" -# start an automatic activity; we're not doing that yet --wvk -# ## egad, the GOO that these calls invoke!!! --vwk + print "get the activity name" + activity_name = self.fields["activity"] + print "call the start method" + wfactivity_impl.startActivity(activity_name, datamgr) + print "method finished" + + +# only here until code above includes all this stuff +# +# start an automatic activity; we're not doing that yet --wvk +# egad, the GOO that these calls invoke!!! --vwk +# # executor = WfActivityImplementationFact.getConcretImplementation(type, self) # executor.run() # self.setResult(executor.getResult()) Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.34 PanGalactic/pangalactic/utils/datamanager.py:1.35 --- PanGalactic/pangalactic/utils/datamanager.py:1.34 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Mon Oct 6 14:37:10 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.34 $"[11:-2] +__version__ = "$Revision: 1.35 $"[11:-2] import time import mx.DateTime @@ -260,8 +260,8 @@ pmms = self.server.GetPmmByProject(projectlist[0]) #print 'items for project: %s are: %s' % (projectlist[0], data) except Exception, e: - print e print "no items in project" + print e return if data: @@ -739,7 +739,6 @@ def addWorkflow(self, wf_obj): self.localDB.Add([wf_obj]) - def getWfProcessTemplates(self): Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.32 PanGalactic/pangalactic/utils/localdb.py:1.33 --- PanGalactic/pangalactic/utils/localdb.py:1.32 Fri Sep 26 15:47:12 2003 +++ PanGalactic/pangalactic/utils/localdb.py Mon Oct 6 14:37:10 2003 @@ -1410,10 +1410,15 @@ #print "localdb.SaveWfProcessInstance" for wfobj in wflist: try: + #print "attempt to delete wfobj.pgef_oid" del self.dbroot[self.WFPROCESS][wfobj.pgef_oid] + #print "deleted" except: + #print "EXCEPTION" pass + self.dbroot[self.WFPROCESS][wfobj.pgef_oid] = wfobj + #print "added", wfobj.pgef_oid self.Commit() @@ -1426,10 +1431,15 @@ self.SaveWfProcessTemplate([wfobj]) if recurse: + #print "recurse to subobjects" for akey, avalue in wfobj.activities.items(): + #print "wfactivity" self.SaveWfActivity([avalue]) + #print "saved wfactivity" for tkey, tvalue in wfobj.transitionsdict.items(): + #print "wftransition" self.SaveWfTransition([tvalue]) + #print "saved wftransition" From pbear at ned.gsfc.nasa.gov Mon Oct 6 17:31:43 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Mon Oct 6 16:31:45 2003 Subject: [Pangalactic-commits] A bit more tweaking to wfprocess instances Message-ID: <200310062031.h96KVhl5021123@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.11 1.12 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.1 1.2 PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py 1.2 1.3 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.14 1.15 Log message: A bit more tweaking to wfprocess instances Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.11 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.12 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.11 Mon Oct 6 14:37:09 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py Mon Oct 6 16:31:42 2003 @@ -14,6 +14,7 @@ import pangalactic.enterprise.workflow.wfeventaudit as wfeventaudit import pangalactic.enterprise.workflow.wfeventaudittypes as wfeventaudittypes +DataManager = None class WfActivity(WfExecutionObject): """ @@ -120,6 +121,7 @@ def activate(self): # wfmc specification ## make sure we aren't already running + #print "current_activity", self.getState() if self.getState() == OPEN_RUNNING: raise AlreadyRunning self.startActivity() @@ -133,18 +135,20 @@ except TransitionNotAllowed: raise CannotComplete, "Transition Not Allowed" -## def setDataManager(self, datamgr): -## print "wfactivity.setdatamanager" -## self._DataManager = datamgr - -## def clearDataManager(self): -## print "wfactivity.cleardatamanager" -## self._DataManager = None + def setDataManager(self, datamgr): + #print "wfactivity.setdatamanager" + global DataManager + DataManager = datamgr + + def clearDataManager(self): + #print "wfactivity.cleardatamanager" + global DataManager + DataManager = None ## Starts or activates this activity - def startActivity(self, datamgr): + def startActivity(self): # wfmc specification - print "startActivity is under construction" + #print "startActivity is under construction" try: self.changeState(OPEN_RUNNING) @@ -153,11 +157,8 @@ except TransitionNotAllowed: raise CannotStart, "Transition Not Allowed" - print "get the activity name" - activity_name = self.fields["activity"] - print "call the start method" - wfactivity_impl.startActivity(activity_name, datamgr) - print "method finished" + global DataManager + wfactivity_impl.startActivity(self, DataManager) # only here until code above includes all this stuff Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.14 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.15 --- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.14 Mon Oct 6 14:37:09 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py Mon Oct 6 16:31:42 2003 @@ -15,6 +15,8 @@ from pangalactic.enterprise.workflow.wfexecutionobject import WfExecutionObject from pangalactic.enterprise.workflow.wftransition import WfTransition +DataManager = None + class WfProcess(WfExecutionObject): """ Any methods required by WfMC are commented as such. @@ -79,7 +81,9 @@ self.canstartlist = canstartlist self.defaultstartid = defaultstart self.requester = None - + self.nextTransList = [] + self.activityId = None + self._nstates = self.howManyStep() self._nsteps = len(self.transitionsdict) self._CreateDateStr = self.GetCreateDateStr() @@ -87,7 +91,7 @@ self._next_activity_name = "" self._activity_date = "" self._activity_due_date = "" - self.activityId = None + self.wfdata = None self.wfdata_name = "" @@ -129,18 +133,20 @@ self.defaultstartid = activityid -## def setDataManager(self, datamgr): -## print "wfprocess.setdatamanager" -## self._DataManager = datamgr -## for akey, aobj in self.activities.items(): -## aobj.setDataManager(self._DataManager) + def setDataManager(self, datamgr): + #print "wfprocess.setdatamanager" + global DataManager + DataManager = datamgr + for akey, aobj in self.activities.items(): + aobj.setDataManager(DataManager) -## def clearDataManager(self): -## print "wfprocess.cleardatamanager" -## self._DataManager = None -## for akey, aobj in self.activities.items(): -## aobj.clearDataManager() + def clearDataManager(self): + #print "wfprocess.cleardatamanager" + global DataManager + DataManager = None + for akey, aobj in self.activities.items(): + aobj.clearDataManager() def initiate(self, wfdata, datamgr): @@ -148,32 +154,16 @@ Start a wfprocess instance. Only a wfprocess instance has a wfdata object. """ # print "wfprocess.initiate", self.defaultstartid - self.activityId = self.defaultstartid -# self.setDataManager(datamgr) self.SetData(wfdata) - - if self.activityId: - current_activity = self.activities[self.activityId] - current_activity.changeState(OPEN_NOTSTARTED) - self._activity_name = current_activity.getName() -# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) - now = mx.DateTime.DateFromTicks(wfdata.create_datetime) - duedate = now + mx.DateTime.RelativeDateTime(days=current_activity.getDuration()) - self._activity_due_date = duedate - self._activity_due_date_str = datetimes.getDisplayDate(duedate) - current_activity.startActivity(datamgr) - self.getNextActivityName() + self.setDataManager(datamgr) + self.activityId = self.defaultstartid + current_activity = self.activities[self.activityId] + current_activity.changeState(OPEN_NOTSTARTED) + #print "current_activity", current_activity.getState() + self.startActivity(current_activity) + self.getNextActivityData(current_activity) - def getNextActivityName(self): - nexttranslist = self.transitions[self.activityId] - #print "next transitions", nexttranslist - if len(nexttranslist) > 0: - nextid = nexttranslist[0] - nexttransition = self.transitionsdict[nextid] - self._next_activity_name = self.activities[nexttransition.to_activity].getName() - return "" - def changeState(self, newState): # wfmc specification @@ -305,17 +295,32 @@ # this was synchronized in java if activity <> CLOSED_COMPLETED: raise WfException, "Activity state is not completed" - self.queueNext(activity) ## do we need this??? + self.queueNext(activity) ## Queues the next activities for processing def queueNext(self, fromActivity): - nextTrans = self.transitions[fromActivity] - if len(nextTrans) > 0: - for trans in nextTrans: - toActivityid = self.transitionsdict[trans].to_activity - toActivity = self.activities[toActivityId] - self.startActivity(toActivity) + toActivity = self.getNextActivityData(fromActivity) + self.startActivity(toActivity) + + ## Queues the next activities for processing + def getNextActivityData(self, fromActivity): + self.nextTransList = self.transitions[fromActivity.oid] + if len(self.nextTransList) > 0: + nextTransId = self.nextTransList[0] + nextTransObj = self.transitionsdict[nextTransId] + toActivity = self.activities[nextTransObj.to_activity] + + self._activity_name = fromActivity.getName() + self._next_activity_name = toActivity.getName() + +# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) + now = mx.DateTime.DateFromTicks(self.wfdata.create_datetime) + duedate = now + mx.DateTime.RelativeDateTime(days=fromActivity.getDuration()) + self._activity_due_date = duedate + self._activity_due_date_str = datetimes.getDisplayDate(duedate) + return toActivity + else: self.finishProcess() @@ -324,6 +329,7 @@ def startActivity(self, activity): try: activity.activate() + #print "current_activity", activity.getState() self.activityId = activity.oid except AlreadyRunning, e: raise WfException, "Activity already running" Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.1 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.2 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.1 Mon Oct 6 14:37:09 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py Mon Oct 6 16:31:42 2003 @@ -9,8 +9,10 @@ approved_complete = None released_complete = None -def startActivity(activityName, datamanager): - print "wfactivity_impl.startActivity", activityName, datamanager +def startActivity(activity, datamanager): + print "wfactivity_impl.startActivity" + activityName = activity.fields["activity"] + #print "activityName", activityName if activityName == "initiated": initiated_impl(datamanager) elif activityName == "draft": Index: PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py:1.2 PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py:1.3 --- PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py:1.2 Thu Jul 3 16:34:27 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfexceptions.py Mon Oct 6 16:31:42 2003 @@ -61,6 +61,10 @@ def __init__(self, arg = None): WfException.__init__(self, arg) +class CannotStart(WfException): + def __init__(self, arg = None): + WfException.__init__(self, arg) + class CannotStop(WfException): def __init__(self, arg = None): WfException.__init__(self, arg) From pbear at ned.gsfc.nasa.gov Mon Oct 6 18:09:35 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Mon Oct 6 17:09:36 2003 Subject: [Pangalactic-commits] added some flavouring to implementations of current wfprocess activities Message-ID: <200310062109.h96L9Zpw022008@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.12 1.13 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.2 1.3 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.15 1.16 PanGalactic/pangalactic/utils/datamanager.py 1.35 1.36 Log message: added some flavouring to implementations of current wfprocess activities Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.2 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.3 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.2 Mon Oct 6 16:31:42 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py Mon Oct 6 17:09:33 2003 @@ -2,7 +2,7 @@ The implementations of each wfactivity object (L{WfActivity }). """ -from pangalactic.utils.datamanager import * +from pangalactic.utils.datamanager import * #initiatedActivity, draftActivity, approvedActivity, releasedActivity initiated_complete = None draft_complete = None @@ -12,34 +12,38 @@ def startActivity(activity, datamanager): print "wfactivity_impl.startActivity" activityName = activity.fields["activity"] - #print "activityName", activityName - if activityName == "initiated": - initiated_impl(datamanager) - elif activityName == "draft": - draft_impl(datamanager) - elif activityName == "approved": - approved_impl(datamanager) - elif activityName == "released": - released_impl(datamanager) + print "activityName", activityName + if activityName == "Initiated": + initiated_impl(activity, datamanager) + elif activityName == "Draft": + draft_impl(activity, datamanager) + elif activityName == "Approved": + approved_impl(activity, datamanager) + elif activityName == "Released": + released_impl(activity, datamanager) -def initiated_impl(datamanager): +def initiated_impl(activity, datamanager): print "wfactivity_impl.initiated" + datamanager.initiatedActivity(activity) initiated_complete = 1 -def draft_impl(datamanager): +def draft_impl(activity, datamanager): print "wfactivity_impl.draft" + datamanager.draftActivity(activity) draft_complete = 1 -def approved_impl(datamanager): +def approved_impl(activity, datamanager): print "wfactivity_impl.approved" + datamanager.approvedActivity(activity) approved_complete = 1 -def released_impl(datamanager): +def released_impl(activity, datamanager): print "wfactivity_impl.released" + datamanager.releasedActivity(activity) released_complete = 1 Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.12 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.13 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.12 Mon Oct 6 16:31:42 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py Mon Oct 6 17:09:33 2003 @@ -121,7 +121,7 @@ def activate(self): # wfmc specification ## make sure we aren't already running - #print "current_activity", self.getState() + print "wfactivity.activate" if self.getState() == OPEN_RUNNING: raise AlreadyRunning self.startActivity() @@ -148,7 +148,7 @@ ## Starts or activates this activity def startActivity(self): # wfmc specification - #print "startActivity is under construction" + print "wfactivity.startActivity" try: self.changeState(OPEN_RUNNING) Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.15 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.16 --- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.15 Mon Oct 6 16:31:42 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py Mon Oct 6 17:09:33 2003 @@ -153,15 +153,14 @@ """ Start a wfprocess instance. Only a wfprocess instance has a wfdata object. """ -# print "wfprocess.initiate", self.defaultstartid + print "wfprocess.initiate", self.defaultstartid self.SetData(wfdata) self.setDataManager(datamgr) self.activityId = self.defaultstartid current_activity = self.activities[self.activityId] current_activity.changeState(OPEN_NOTSTARTED) #print "current_activity", current_activity.getState() - self.startActivity(current_activity) - self.getNextActivityData(current_activity) + self.start() def changeState(self, newState): @@ -286,14 +285,14 @@ raise AlreadyRunning, "Process is already running" startValue = self.activities[self.defaultstartid] - self.startValue.changeState(OPEN_RUNNING) self.startActivity(startValue) + self.getNextActivityData(startValue) def activityComplete(self, activity): # wfmc specification # this was synchronized in java - if activity <> CLOSED_COMPLETED: + if activity.getState() <> CLOSED_COMPLETED: raise WfException, "Activity state is not completed" self.queueNext(activity) Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.35 PanGalactic/pangalactic/utils/datamanager.py:1.36 --- PanGalactic/pangalactic/utils/datamanager.py:1.35 Mon Oct 6 14:37:10 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Mon Oct 6 17:09:33 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.35 $"[11:-2] +__version__ = "$Revision: 1.36 $"[11:-2] import time import mx.DateTime @@ -757,7 +757,7 @@ def commit(self, unsavedobjs, upload = True): #tbd - need to actually pass upload flag or determine it based on document interfaces - #print "datamanager.commit" + print "datamanager.commit" if self.user._loggedin: if len(unsavedobjs) > 0: @@ -865,3 +865,21 @@ self.refresh = False + def initiatedActivity(self, activity): + print "datamanager.initiated", activity.getName() + print "notify the ptbs that wfprocess has been initiated" + + + def draftActivity(self, activity): + print "datamanager.draft", activity.getName() + print "notify the ptbs that wfprocess is now draft" + + + def approvedActivity(self, activity): + print "datamanager.approved", activity.getName() + print "notify the ptbs that wfprocess is at approval stage" + + + def releasedActivity(self, activity): + print "datamanager.released", activity.getName() + print "notify the ptbs that wfprocess is at approval stage" From waterbug at ned.gsfc.nasa.gov Mon Oct 6 18:16:33 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 6 17:16:35 2003 Subject: [Pangalactic-commits] Some test updates. Message-ID: <200310062116.h96LGXg4022334@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_db_getByRowKey.py None 1.1 PanGalactic/pangalactic/test/test_factory_extract2Record.py None 1.1 PanGalactic/pangalactic/test/test_factory_record2RowKey.py None 1.1 PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py None 1.1 PanGalactic/pangalactic/test/test_pger_getResultSets.py None 1.1 PanGalactic/pangalactic/test/IDTEST 1.16 1.17 PanGalactic/pangalactic/test/README 1.20 1.21 PanGalactic/pangalactic/test/test_db_addrows.py 1.4 1.5 PanGalactic/pangalactic/test/test_pger_addExtracts.py 1.1 1.2 PanGalactic/pangalactic/test/test_sql.py 1.9 1.10 PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py 1.8 1.9 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.8 1.9 PanGalactic/pangalactic/test/ut_repofactory.py 1.2 1.3 PanGalactic/pangalactic/test/test_factory_extracts2Records.py 1.1 None PanGalactic/pangalactic/test/test_factory_records2RowKeys.py 1.1 None PanGalactic/pangalactic/test/test_pger_getRefRowKeys.py 1.1 None PanGalactic/pangalactic/test/test_pger_getresultsets.py 1.9 None Log message: Some test updates. Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.8 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.9 --- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.8 Sun Oct 5 05:39:59 2003 +++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py Mon Oct 6 17:16:32 2003 @@ -1,4 +1,4 @@ -# $Id: test_xmlrpc_getobjects.py,v 1.8 2003/10/05 09:39:59 waterbug Exp $ +# $Id: test_xmlrpc_getobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $ """ Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService @@ -25,10 +25,10 @@ print "====================================" pprint(stuff) print "====================================" - print "\n*** Rebuilt objects:" + print "\n*** Remembered objects:" olist = [] for x in stuff: - o = pgr._factory.rebuild(x) + o = pgr._factory.remember(x) olist.append(o) print "%s %s(s) found" % (len(olist), typename) if olist: @@ -49,7 +49,7 @@ pgr = Pger(db) xmlsrv = PgerXmlrpcService(pgr) -res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, ['name', 'Mr. Fusion']) +res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, [['name', 'Mr. Fusion']]) res.addCallbacks(success, failure) reactor.run() Index: PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py diff -u PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.8 PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.9 --- PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.8 Wed Sep 24 11:07:00 2003 +++ PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py Mon Oct 6 17:16:32 2003 @@ -1,4 +1,4 @@ -# $Id: test_xmlrpc_addobjects.py,v 1.8 2003/09/24 15:07:00 waterbug Exp $ +# $Id: test_xmlrpc_addobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $ """ Functional test for pangalactic.repo.xmlrpc.xmlrpc_addProductMaster @@ -8,40 +8,64 @@ - reports oid of the new Product Master """ -import time, os +from pprint import pprint from twisted.internet import reactor +from twisted.enterprise import adbapi +from pangalactic.utils import oid from pangalactic.repo.db import PgerDb from pangalactic.repo.pger import Pger from pangalactic.repo.xmlrpc import PgerXmlrpcService from pangalactic.enterprise.productmaster import ProductMaster as PM from pangalactic.enterprise.productversion import ProductVersion as PV +from pangalactic.enterprise.project import Project -db = PgerDb() -pgr = Pger(db) -x = PgerXmlrpcService(pgr) - -def getTestID(): - f = open('IDTEST') - savedid = f.read() - testid = str(int(savedid) + 1) - f.close() - f = open('IDTEST', 'w') - f.write(testid) - f.close() - return testid - -pmtestid = getTestID() -pmtestname = 'Mr. PM Test-Xmlrpc.addObjects()-' + pmtestid -pm = PM(id=pmtestid, id_context='TEST', name=pmtestname, - project_id='TEST', project_id_context='TEST') -epmlist = [pgr._factory.extract(pm)] -dt = x.xmlrpc_addObjects(epmlist) -print 'pm.id = %s' % pm.id -print 'pm.id_context = %s' % pm.id_context -print 'pm.project_id = %s' % pm.project_id -print 'pm.project_id_context = %s' % pm.project_id_context -print 'ProductMaster dt = %s' % dt +pgrdb = PgerDb() +PGER = Pger(pgrdb) +xmlrpcsrv = PgerXmlrpcService(PGER) + +f = open('IDTEST') +savedid = f.read() +testoid1 = oid.generate('test') +testoid2 = oid.generate('test') + +testid = str(int(savedid) + 1) +f.close() +f = open('IDTEST', 'w') +f.write(testid) +f.close() + +projid = 'MTPaE' + testid +projname = 'MTPaE' + testid + ' Project' +pmid = 'MTPaE-' + testid +pmname = 'MTPaE-' + testid + ' Model Mr. Dynamo' +pvname = 'MTPaE-' + testid + ' Version A' + +# create test objects +p = Project(id=projid, id_context='TEST', name=projname) +p.popTestData() +pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p) +pm.popTestData() +pv = PV(_of_master=pm, id='A', name=pvname) +pv.popTestData() + +extract = PGER._factory.extract +pe = extract(p) +pme = extract(pm) +pve = extract(pv) + +extracts = [pe, pme, pve] + +def success(res): + pprint(res) + reactor.stop() + +def failure(error): + print error + reactor.stop() -reactor.run() # start the main loop -print 'stopped.' +res = xmlrpcsrv.xmlrpc_addObjects(extracts) +res.addCallbacks(success, failure) + +reactor.run() +print '- end of test -' Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.20 PanGalactic/pangalactic/test/README:1.21 --- PanGalactic/pangalactic/test/README:1.20 Sun Oct 5 05:39:59 2003 +++ PanGalactic/pangalactic/test/README Mon Oct 6 17:16:31 2003 @@ -1,4 +1,4 @@ -$Id: README,v 1.20 2003/10/05 09:39:59 waterbug Exp $ +$Id: README,v 1.21 2003/10/06 21:16:31 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ @@ -20,7 +20,7 @@ test_factory_test.py test_factory_sync.py test_factory_extractall.py - test_factory_extracts2Records.py + test_factory_extract2Record.py test_factory_makeObjects.py test_factory_unmakeObject.py | Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.16 PanGalactic/pangalactic/test/IDTEST:1.17 --- PanGalactic/pangalactic/test/IDTEST:1.16 Sun Oct 5 17:24:50 2003 +++ PanGalactic/pangalactic/test/IDTEST Mon Oct 6 17:16:31 2003 @@ -1 +1 @@ -228 \ No newline at end of file +269 \ No newline at end of file Index: PanGalactic/pangalactic/test/ut_repofactory.py diff -u PanGalactic/pangalactic/test/ut_repofactory.py:1.2 PanGalactic/pangalactic/test/ut_repofactory.py:1.3 --- PanGalactic/pangalactic/test/ut_repofactory.py:1.2 Sat Oct 4 00:26:08 2003 +++ PanGalactic/pangalactic/test/ut_repofactory.py Mon Oct 6 17:16:32 2003 @@ -1,4 +1,4 @@ -# $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $ +# $Id: ut_repofactory.py,v 1.3 2003/10/06 21:16:32 waterbug Exp $ """ Unit tests for pangalactic.repo.factory module @@ -17,7 +17,7 @@ self.factory = POF(self.registry) - def test_1_factory_extracts2Records(self): + def test_1_factory_extract2Record(self): """CASE: PgerObjectFactory self-test""" input = [['foo.bar.baz.Project', {'id_context': 'TEST', @@ -27,7 +27,7 @@ {'id_context': 'TEST', 'id': 'H2G2', 'name': 'HitchHikers Guide'}]] - output = self.factory.extracts2Records(input) + output = self.factory.extract2Record(input) self.assertEquals(expected, output) @@ -80,7 +80,7 @@ # print o # # -# # $Id: ut_repofactory.py,v 1.2 2003/10/04 04:26:08 waterbug Exp $ +# # $Id: ut_repofactory.py,v 1.3 2003/10/06 21:16:32 waterbug Exp $ # # """ # Functional test for pangalactic.repo.db module Index: PanGalactic/pangalactic/test/test_db_addrows.py diff -u PanGalactic/pangalactic/test/test_db_addrows.py:1.4 PanGalactic/pangalactic/test/test_db_addrows.py:1.5 --- PanGalactic/pangalactic/test/test_db_addrows.py:1.4 Sat Oct 4 19:25:44 2003 +++ PanGalactic/pangalactic/test/test_db_addrows.py Mon Oct 6 17:16:31 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_addrows.py,v 1.4 2003/10/04 23:25:44 waterbug Exp $ +# $Id: test_db_addrows.py,v 1.5 2003/10/06 21:16:31 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -19,7 +19,7 @@ reg = POR() fac = POF(reg) -db = PgerDb() +pgerdb = PgerDb() f = open('IDTEST') savedid = f.read() @@ -51,7 +51,7 @@ pve = fac.extract(pv) extracts = [pe, pme, pve] -recs = fac.extracts2Records(extracts) +recs = [fac.extract2Record(e) for e in extracts] def success(stuff): pprint(stuff) @@ -61,14 +61,13 @@ print error reactor.stop() -def ifNone(x): - if not x: - res = db.doPgerdbQuery('pgef_object', 1, - ('name', 'MD')) - res.addCallbacks(success, failure) +def verify(x): + res = pgerdb.doPgerdbQuery('pgef_object', 1, + ('name', 'MD')) + res.addCallbacks(success, failure) -out = db.addRows(recs) -out.addCallback(ifNone) +out = pgerdb.addRows(recs) +out.addCallback(verify) reactor.run() Index: PanGalactic/pangalactic/test/test_pger_addExtracts.py diff -u PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.1 PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.2 --- PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.1 Sat Oct 4 19:25:44 2003 +++ PanGalactic/pangalactic/test/test_pger_addExtracts.py Mon Oct 6 17:16:32 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_addExtracts.py,v 1.1 2003/10/04 23:25:44 waterbug Exp $ +# $Id: test_pger_addExtracts.py,v 1.2 2003/10/06 21:16:32 waterbug Exp $ """ Functional test for pangalactic.repo.Pger.addExtracts() @@ -9,54 +9,62 @@ pger_mod_datetime for all committed data) """ -import time, os +from pprint import pprint from twisted.internet import reactor from twisted.enterprise import adbapi +from pangalactic.utils import oid from pangalactic.repo.db import PgerDb from pangalactic.repo.pger import Pger -from pangalactic.utils import oid -from pangalactic.enterprise.productmaster import ProductMaster +from pangalactic.enterprise.productmaster import ProductMaster as PM +from pangalactic.enterprise.productversion import ProductVersion as PV from pangalactic.enterprise.project import Project -db = PgerDb() -pgr = Pger(db) +pgrdb = PgerDb() +PGER = Pger(pgrdb) -f = open(os.getcwd() + '/IDTEST') -nextid = f.read() -newoid = oid.generate('test') +f = open('IDTEST') +savedid = f.read() +testoid1 = oid.generate('test') +testoid2 = oid.generate('test') -nextid = str(int(nextid) + 1) +testid = str(int(savedid) + 1) f.close() -f = open(os.getcwd() + '/IDTEST', 'w') -f.write(nextid) +f = open('IDTEST', 'w') +f.write(testid) f.close() -testname = 'Mr. Test-Pger-addExtracts()-' + nextid -proj = Project(id='TEST', id_context='TEST') -pm = ProductMaster(name=testname, id=nextid, - id_context='TEST', project=proj, - owner='admin', - owner_context='PGER', - creator='admin', - creator_context='PGER', - modifier='admin', - modifier_context='PGER', - pger_owner='admin', - pger_owner_context='PGER', - pger_creator='admin', - pger_creator_context='PGER', - pger_modifier='admin', - pger_modifier_context='PGER' - ) -print 'ProductMaster:' -print pm -ext = pgr._factory.extract(pm) -print 'extract: %s' % ext -elist = [ext] -dts = pgr.addExtracts(elist) -print 'dts = %s' % dts - -reactor.run() # start the main loop -time.sleep(1) -reactor.stop() +projid = 'MTPaE' + testid +projname = 'MTPaE' + testid + ' Project' +pmid = 'MTPaE-' + testid +pmname = 'MTPaE-' + testid + ' Model Mr. Dynamo' +pvname = 'MTPaE-' + testid + ' Version A' + +# create test objects +p = Project(id=projid, id_context='TEST', name=projname) +p.popTestData() +pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p) +pm.popTestData() +pv = PV(_of_master=pm, id='A', name=pvname) +pv.popTestData() + +extract = PGER._factory.extract +pe = extract(p) +pme = extract(pm) +pve = extract(pv) + +extracts = [pe, pme, pve] + +def success(result): + for defres in result: + defres.addCallback(lambda x: pprint(x)) + reactor.stop() + +def failure(error): + print error + reactor.stop() + +res = PGER.addExtracts(extracts) +res.addCallbacks(success, failure) + +reactor.run() Index: PanGalactic/pangalactic/test/test_sql.py diff -u PanGalactic/pangalactic/test/test_sql.py:1.9 PanGalactic/pangalactic/test/test_sql.py:1.10 --- PanGalactic/pangalactic/test/test_sql.py:1.9 Mon Oct 6 00:42:16 2003 +++ PanGalactic/pangalactic/test/test_sql.py Mon Oct 6 17:16:32 2003 @@ -1,4 +1,4 @@ -# $Id: test_sql.py,v 1.9 2003/10/06 04:42:16 waterbug Exp $ +# $Id: test_sql.py,v 1.10 2003/10/06 21:16:32 waterbug Exp $ """ Functional tests for pangalactic.utils.sql module @@ -7,7 +7,7 @@ from pprint import pprint from pyPgSQL import PgSQL from pangalactic.utils.sql import buildSelect -from pangalactic.utils.sql import buildSelectFromRowKeys +from pangalactic.utils.sql import buildSelectFromRowKey from pangalactic.utils.sql import buildInsert from pangalactic.utils import oid from pangalactic.enterprise.productmaster import ProductMaster as PM @@ -148,10 +148,12 @@ pve = fac.extract(pv) extracts = [pe, pme, pve] -recs = fac.extracts2Records(extracts) -keys = fac.records2RowKeys(recs) -cmd = buildSelectFromRowKeys(keys) -print 'cmd is:' -pprint(cmd) +recs = [fac.extract2Record(e) for e in extracts] +rowkeys = [fac.record2RowKey(rec) for rec in recs] +for rk in rowkeys: + cmd = buildSelectFromRowKey(rk) + print ' ---------------------------------' + print ' cmd for %s is:\n ' % rk[0] + pprint(cmd) print '===================================' From pbear at ned.gsfc.nasa.gov Mon Oct 6 18:28:31 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Mon Oct 6 17:28:33 2003 Subject: [Pangalactic-commits] remove datamanager import from wfactivity_implementation Message-ID: <200310062128.h96LSVJB022590@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.3 1.4 Log message: remove datamanager import from wfactivity_implementation Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.3 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.4 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.3 Mon Oct 6 17:09:33 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py Mon Oct 6 17:28:30 2003 @@ -2,7 +2,7 @@ The implementations of each wfactivity object (L{WfActivity }). """ -from pangalactic.utils.datamanager import * #initiatedActivity, draftActivity, approvedActivity, releasedActivity +#from pangalactic.utils.datamanager import initiatedActivity, draftActivity, approvedActivity, releasedActivity initiated_complete = None draft_complete = None From pbear at ned.gsfc.nasa.gov Tue Oct 7 11:53:50 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 7 10:53:52 2003 Subject: [Pangalactic-commits] added new workflow template option; fixed rclick menu on template grid; wizard now has dropdown for workflow activity names Message-ID: <200310071453.h97Ero38031580@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py 1.13 1.14 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py 1.4 1.5 PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py 1.6 1.7 PanGalactic/pangalactic/enterprise/workflow/wffactory.py 1.6 1.7 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.16 1.17 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.15 1.16 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.17 1.18 PanGalactic/pangalactic/utils/datamanager.py 1.36 1.37 Log message: added new workflow template option; fixed rclick menu on template grid; wizard now has dropdown for workflow activity names Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.15 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.16 --- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.15 Mon Oct 6 14:37:09 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py Tue Oct 7 10:53:48 2003 @@ -169,7 +169,7 @@ dlg.Destroy() - def OnWorkflowWizard(self, event): + def OnWorkflowWizard(self, event = None): #print "CreateWorkflow" tmpsize = wxSize(750, 600) WizardFrame = toolframe.toolFrame(self, -1, "Workflow Wizard", wxDefaultPosition, tmpsize) @@ -265,11 +265,6 @@ def OnWorkflowView(self, event): # popup the viewer, initialized with the selected workflow from the grid #print "ViewWorkflow" - -# actinfo = [("Activity", 100, "activity"), -# ("Time Frame\n(days)", 100, "duration"), -# ("Description", 400, "description")] -# transinfo = [("From", 200, "to"), ("To", 200, "to")] tmpsize = wxSize(750, 600) ViewerFrame = toolframe.toolFrame(self, -1, "Workflow Viewer", wxDefaultPosition, tmpsize) Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.13 PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.14 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity.py:1.13 Mon Oct 6 17:09:33 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity.py Tue Oct 7 10:53:48 2003 @@ -121,7 +121,7 @@ def activate(self): # wfmc specification ## make sure we aren't already running - print "wfactivity.activate" + #print "wfactivity.activate" if self.getState() == OPEN_RUNNING: raise AlreadyRunning self.startActivity() @@ -148,7 +148,7 @@ ## Starts or activates this activity def startActivity(self): # wfmc specification - print "wfactivity.startActivity" + #print "wfactivity.startActivity" try: self.changeState(OPEN_RUNNING) Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.16 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.17 --- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.16 Mon Oct 6 17:09:33 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py Tue Oct 7 10:53:48 2003 @@ -91,6 +91,7 @@ self._next_activity_name = "" self._activity_date = "" self._activity_due_date = "" + self._activity_due_date_str = "" self.wfdata = None self.wfdata_name = "" @@ -153,7 +154,7 @@ """ Start a wfprocess instance. Only a wfprocess instance has a wfdata object. """ - print "wfprocess.initiate", self.defaultstartid + #print "wfprocess.initiate", self.defaultstartid self.SetData(wfdata) self.setDataManager(datamgr) self.activityId = self.defaultstartid Index: PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.4 PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.5 --- PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py:1.4 Mon Oct 6 17:28:30 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfactivity_implementation.py Tue Oct 7 10:53:48 2003 @@ -2,7 +2,8 @@ The implementations of each wfactivity object (L{WfActivity }). """ -#from pangalactic.utils.datamanager import initiatedActivity, draftActivity, approvedActivity, releasedActivity +# do not directly import initiatedActivity, draftActivity, approvedActivity, releasedActivity from DataManager +# it would lead to a compile-time circular dependency. ick. initiated_complete = None draft_complete = None @@ -10,9 +11,9 @@ released_complete = None def startActivity(activity, datamanager): - print "wfactivity_impl.startActivity" + #print "wfactivity_impl.startActivity" activityName = activity.fields["activity"] - print "activityName", activityName + #print "activityName", activityName if activityName == "Initiated": initiated_impl(activity, datamanager) elif activityName == "Draft": @@ -24,32 +25,32 @@ def initiated_impl(activity, datamanager): - print "wfactivity_impl.initiated" + #print "wfactivity_impl.initiated" datamanager.initiatedActivity(activity) initiated_complete = 1 def draft_impl(activity, datamanager): - print "wfactivity_impl.draft" + #print "wfactivity_impl.draft" datamanager.draftActivity(activity) draft_complete = 1 def approved_impl(activity, datamanager): - print "wfactivity_impl.approved" + #print "wfactivity_impl.approved" datamanager.approvedActivity(activity) approved_complete = 1 def released_impl(activity, datamanager): - print "wfactivity_impl.released" + #print "wfactivity_impl.released" datamanager.releasedActivity(activity) released_complete = 1 def isComplete(activityName): result = eval(activityName + "_complete") - print result + print "wfactivity_imple.isComplete", result return result Index: PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py:1.6 PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py:1.7 --- PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py:1.6 Thu Sep 4 16:04:25 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfdatatable.py Tue Oct 7 10:53:48 2003 @@ -33,7 +33,6 @@ # self.display_mapping = [] ## list of tuples : (attribute name, column label), 1 per column self._datadict = {} self._UseDefaultMapping = false -# print "wfdatatable.display_mapping", self.display_mapping def SetDefaultMapping(self): Index: PanGalactic/pangalactic/enterprise/workflow/wffactory.py diff -u PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.6 PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.7 --- PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.6 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wffactory.py Tue Oct 7 10:53:48 2003 @@ -10,10 +10,18 @@ DEFAULT_WORKFLOW = ("WF0", - {0:{"activity":"Initiated", "duration":"28", "late":"7", "very_late":"30", "lost_cause":"60", "description":"Initial Draft"}, - 1:{"activity":"Draft", "duration":"28", "late":"14", "very_late":"60", "lost_cause":"30", "description":"Final Draft"}, - 2:{"activity":"Approved", "duration":"14", "late":"30", "very_late":"60", "lost_cause":"30", "description":"Approved for Release"}, - 3:{"activity":"Released", "duration":"21", "late":"30", "very_late":"30", "lost_cause":"90", "description":"Released to Distribution List"}}, + {0:{"activity":"Initiated", "duration":"28", + "late":"7", "very_late":"14", "lost_cause":"21", + "description":"Initial Draft"}, + 1:{"activity":"Draft", "duration":"28", + "late":"15", "very_late":"30", "lost_cause":"45", + "description":"Final Draft"}, + 2:{"activity":"Approved", "duration":"14", + "late":"30", "very_late":"60", "lost_cause":"90", + "description":"Approved for Release"}, + 3:{"activity":"Released", "duration":"21", + "late":"10", "very_late":"20", "lost_cause":"30", + "description":"Released to Distribution List"}}, {0:{"from":"Initiated", "to":"Draft"}, 1:{"from":"Draft", "to":"Approved"}, Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.17 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.18 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.17 Mon Oct 6 14:37:09 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Tue Oct 7 10:53:48 2003 @@ -16,6 +16,7 @@ import pangalactic.enterprise.workflow.wffactory as wffactory import pangalactic.utils.pdfoptions as pdfoptions +import pangalactic.utils.basegrid as basegrid WF_START = wxNewId() @@ -72,9 +73,9 @@ self.ActInfo = actinfo #info is a list of tuples ("column label", column_width) self.TransInfo = transinfo #info is a list of tuples ("column label", column_width) self.DataManager = datamgr - self.DataManager.creatingWorkflow = true + self.DataManager.creatingWorkflow = True - WorkflowFunc(self, true) + WorkflowFunc(self, True) self.act_labels = [] for actinfo in self.ActInfo: @@ -88,27 +89,33 @@ self.Parent = parent self.workflow = None - self.saved_workflow = true + self.saved_workflow = True self.activitygrid = self.GetActGridWgt() - self.activitygrid.EnableEditing(false) + self.activitygrid.EnableEditing(False) self.activitygrid.SetColMinimalWidth (-1, 1) for ndx in range(len(self.ActInfo)): colinfo = self.ActInfo[ndx] self.activitygrid.SetColSize(ndx, colinfo[1]) self.activitygrid.SetColLabelValue(ndx, colinfo[0]) + self.activitygrid.SetRowLabelSize(40) - self.activitygrid.EnableEditing(true) + self.activitygrid.EnableEditing(True) + editor = wxGridCellChoiceEditor(["Initiated", "Draft", "Approved", "Released"], False) +# print "editor", editor + for row in range(self.activitygrid.GetNumberRows()): +# print "row" + self.activitygrid.SetCellEditor(row, 0, editor) self.transitiongrid = self.GetTransGridWgt() - self.transitiongrid.EnableEditing(false) + self.transitiongrid.EnableEditing(False) self.transitiongrid.SetColMinimalWidth (-1, 1) for ndx in range(len(self.TransInfo)): colinfo = self.TransInfo[ndx] self.transitiongrid.SetColSize(ndx, colinfo[1]) self.transitiongrid.SetColLabelValue(ndx, colinfo[0]) self.transitiongrid.SetRowLabelSize(40) - self.transitiongrid.EnableEditing(true) + self.transitiongrid.EnableEditing(True) self.MoveTo = None @@ -130,6 +137,7 @@ EVT_GRID_CELL_RIGHT_CLICK(self.activitygrid, self.OnActRightDown) EVT_GRID_CELL_CHANGE(self.activitygrid, self.OnCellChange) + EVT_GRID_LABEL_LEFT_CLICK(self, self.OnSelectCell) EVT_GRID_SELECT_CELL(self, self.OnSelectCell) # EVT_GRID_EDITOR_SHOWN(self, self.OnEditorShown) # EVT_GRID_EDITOR_HIDDEN(self, self.OnEditorHidden) @@ -145,11 +153,13 @@ def setDisplayWgt(self, wgt): + #print "wfwizard.setdisplaywgt" self.displayWgt = wgt def setStartActivity(self, event): print "wfwizard.setstartactivity", self.ActSelectedRow + self.startRow = self.ActSelectedRow def OnActRightDown(self, event): @@ -170,7 +180,6 @@ #print self.table.display_mapping #print self.table.identifiers menu = wxMenu() - x,y = event.GetPosition() menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections') menu.Append(WF_START, "Start here") # menu.AppendSeparator() @@ -179,7 +188,7 @@ # menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...') # menu.AppendSeparator() # menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') - + y += self.activitygrid.GetColLabelSize() self.PopupMenuXY(menu, x, y) def OnTransRightDown(self, event): @@ -266,7 +275,7 @@ def Save(self, event = None): #print "workflow_wizard.save" if self.DataManager.creatingWorkflow: - self.DataManager.creatingWorkflow = false + self.DataManager.creatingWorkflow = False transitions = self.GetTransitions() activities = self.GetActivities() @@ -276,7 +285,7 @@ self.workflow = self.createWorkflow(name, activities, transitions) self.DataManager.addWorkflow(self.workflow) self.displayWgt.AddData(self.workflow) - self.saved_workflow = true + self.saved_workflow = True return self.workflow else: return None @@ -300,7 +309,7 @@ self.workflow.SetName(name) self.DataManager.update(self.workflow) else: - self.DataManager.creatingWorkflow = true + self.DataManager.creatingWorkflow = True self.workflow = self.Save() self.displayWgt.AddData(self.workflow) return self.workflow @@ -335,10 +344,6 @@ activities.append(to_activity) row += 1 -# self.transitiongrid.RefreshFromObjects() -# self.transitiongrid.AutoSizeColumns(true) - -# self.SetActivities(activities) row = 0 key_col = 0 @@ -432,7 +437,7 @@ keypressed = evt.KeyCode() if keypressed <> WXK_RETURN and keypressed <> WXK_TAB: #print "keypressed" - self.saved_workflow = false + self.saved_workflow = False evt.Skip() return @@ -440,7 +445,7 @@ def OnActKeyDown(self, evt): keypressed = evt.KeyCode() if keypressed <> WXK_RETURN and keypressed <> WXK_TAB: - self.saved_workflow = false + self.saved_workflow = False evt.Skip() return @@ -464,7 +469,7 @@ def OnTransKeyDown(self, evt): keypressed = evt.KeyCode() if keypressed <> WXK_RETURN and keypressed <> WXK_TAB: - self.saved_workflow = false + self.saved_workflow = False evt.Skip() return @@ -546,7 +551,7 @@ def OnGenerateTransitions(self, event = None): # print "onGeneratetransitions" - self.saved_workflow = false + self.saved_workflow = False actlist = [] for ndx in range(self.activitygrid.GetNumberRows()): actname = self.activitygrid.GetCellValue(ndx, 0) Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.36 PanGalactic/pangalactic/utils/datamanager.py:1.37 --- PanGalactic/pangalactic/utils/datamanager.py:1.36 Mon Oct 6 17:09:33 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Tue Oct 7 10:53:48 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.36 $"[11:-2] +__version__ = "$Revision: 1.37 $"[11:-2] import time import mx.DateTime @@ -866,20 +866,20 @@ def initiatedActivity(self, activity): - print "datamanager.initiated", activity.getName() - print "notify the ptbs that wfprocess has been initiated" + #print "datamanager.initiated", activity.getName() + print "notify the ptbs that wfprocess is at " + activity.getName() + " stage" def draftActivity(self, activity): - print "datamanager.draft", activity.getName() - print "notify the ptbs that wfprocess is now draft" + #print "datamanager.draft", activity.getName() + print "notify the ptbs that wfprocess is at " + activity.getName() + " stage" def approvedActivity(self, activity): - print "datamanager.approved", activity.getName() - print "notify the ptbs that wfprocess is at approval stage" + #print "datamanager.approved", activity.getName() + print "notify the ptbs that wfprocess is at " + activity.getName() + " stage" def releasedActivity(self, activity): - print "datamanager.released", activity.getName() - print "notify the ptbs that wfprocess is at approval stage" + #print "datamanager.released", activity.getName() + print "notify the ptbs that wfprocess is at " + activity.getName() + " stage" From waterbug at ned.gsfc.nasa.gov Tue Oct 7 14:33:55 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 13:33:55 2003 Subject: [Pangalactic-commits] Oops. Message-ID: <200310071733.h97HXttL003826@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/IDTEST None 1.1 Log message: Oops. From waterbug at ned.gsfc.nasa.gov Tue Oct 7 14:34:42 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 13:34:43 2003 Subject: [Pangalactic-commits] I shouldnt have done that. Message-ID: <200310071734.h97HYgcZ003867@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/IDTEST 1.1 None Log message: I shouldnt have done that. From pbear at ned.gsfc.nasa.gov Tue Oct 7 14:53:56 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 7 13:53:58 2003 Subject: [Pangalactic-commits] More tweaking for wfprocesses Message-ID: <200310071753.h97Hrurg004077@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.35 1.36 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.4 1.5 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py 1.17 1.18 Log message: More tweaking for wfprocesses Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.35 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.36 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.35 Mon Oct 6 14:37:09 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Tue Oct 7 13:53:54 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.35 2003/10/06 18:37:09 pbear Exp $ +# $Id: pgefadvisory.py,v 1.36 2003/10/07 17:53:54 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.35 $"[11:-2] +__version__ = "$Revision: 1.36 $"[11:-2] import os.path import string @@ -37,17 +37,15 @@ _defaultgridmap = [["Center", "self.center_acronym", "string", ""], ["Type" , "self._pretty_doc_type", "string", ""], ["Document ID", "self.id", "string", ""], + ["Title", "self.name", "string", ""], ["Date", "self._create_date", "string", ""]] -# ["Status", "self._workflow_str", "string", ""], -# ["Pending\nAction", "self._next_workflow_str", "string", ""], -# ["Due Date", "self._due_date", "string", "colour"]] + _gridmap = [["Center", "self.center_acronym", "string", ""], ["Type" , "self._pretty_doc_type", "string", ""], ["Document ID", "self.id", "string", ""], + ["Title", "self.name", "string", ""], ["Date", "self._create_date", "string", ""]] -# ["Status", "self._workflow_str", "string", ""], -# ["Pending\nAction", "self._next_workflow_str", "string", ""], -# ["Due Date", "self._due_date", "string", "colour"]] + def __init__(self, acronym="", **kw): """ @@ -83,6 +81,7 @@ return Document.__getattr__(self, name) def setName(self, name): + print "name", name self.name = name def getPrettyDocType(self): Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.4 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.5 --- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.4 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py Tue Oct 7 13:53:54 2003 @@ -79,6 +79,7 @@ colinfo = displaymap[ndx] if colinfo[3] == "colour": somecol = ndx + break if somecol == None: return Index: PanGalactic/pangalactic/enterprise/workflow/wfprocess.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.17 PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.18 --- PanGalactic/pangalactic/enterprise/workflow/wfprocess.py:1.17 Tue Oct 7 10:53:48 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocess.py Tue Oct 7 13:53:54 2003 @@ -46,6 +46,7 @@ ["Template\nName", "self.name", "string", ""], ["# Steps", "self._nstates", "string", ""], ["Status", "self._activity_name", "string", ""], + ["Status Date", "self._activity_date_str", "string", ""], ["Due Date", "self._activity_due_date_str", "string", "colour"], ["Pending\nAction", "self._next_activity_name", "string", ""]] @@ -317,6 +318,8 @@ # now = mx.DateTime.DateFromTicks(mx.DateTime.now()) now = mx.DateTime.DateFromTicks(self.wfdata.create_datetime) duedate = now + mx.DateTime.RelativeDateTime(days=fromActivity.getDuration()) + self._activity_date = now + mx.DateTime.RelativeDateTime(days=+1) + self._activity_date_str = datetimes.getDisplayDate(self._activity_date) self._activity_due_date = duedate self._activity_due_date_str = datetimes.getDisplayDate(duedate) return toActivity From bmuir at ned.gsfc.nasa.gov Tue Oct 7 14:59:06 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 13:59:09 2003 Subject: [Pangalactic-commits] initial cut of version tree.. works for all tabs except PMV tab Message-ID: <200310071759.h97Hx6RO004318@ned.gsfc.nasa.gov> Modified files: PanGalactic/PanGalactic_wingide_proj 1.28 1.29 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.103 1.104 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.115 1.116 PanGalactic/pangalactic/utils/data_utils.py 1.4 1.5 PanGalactic/pangalactic/utils/datamanager.py 1.37 1.38 PanGalactic/pangalactic/utils/localdb.py 1.33 1.34 Log message: initial cut of version tree.. works for all tabs except PMV tab Index: PanGalactic/pangalactic/utils/data_utils.py diff -u PanGalactic/pangalactic/utils/data_utils.py:1.4 PanGalactic/pangalactic/utils/data_utils.py:1.5 --- PanGalactic/pangalactic/utils/data_utils.py:1.4 Thu Aug 28 14:41:45 2003 +++ PanGalactic/pangalactic/utils/data_utils.py Tue Oct 7 13:59:04 2003 @@ -9,14 +9,23 @@ # if we have a pmv, compound key is # (id, of_pmm_id, of_pv_id, of_pm_id, of_pm_id_context) +# if obj.__class__.__name__ == 'ProductModelVersion': if obj.__class__.__name__ == 'ProductModelVersion': # DEBUGGING # print "creating compound key for obj of class %s" % obj.__class__.__name__ # print 'class of obj._of_model_master is %s' % obj._of_model_master.__class__.__name__ # print 'class of obj._of_version is %s' % obj._of_version.__class__.__name__ - temp = (obj.id, obj._of_model_master.id, obj._of_version.id, obj._of_master.id, obj._of_master.id_context) + temp = (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id) + elif obj.__class__.__name__ == 'ProductModelMaster': + temp = (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id) + elif obj.__class__.__name__ == 'ProductVersion': + temp = (obj.of_pm_id, obj.of_pm_id_context, obj.id) + elif obj.__class__.__name__ == 'ProductMaster': + temp = (obj.id) + + #print temp - return temp + return temp #else: # print '---------------------------------------------' # print 'create compoundkey: returning None' @@ -25,7 +34,7 @@ def createACUSearchByComponent(acu_obj): search_str = [] - value_list = createCompoundKey(acu_obj) + value_list = createCompoundKey(acu_obj, 'ProductModelVersion') name_list = ('component_id=', 'component_of_pmm_id=', 'component_of_pv_id=', 'component_of_pm_id=', 'component_of_pm_id_context=') for ndx in range(5): search_str.append(name_list[ndx] + value_list[ndx]) @@ -35,7 +44,7 @@ def createACUSearchByAssembly(acu_obj): search_str = [] - value_list = createCompoundKey(acu_obj) + value_list = createCompoundKey(acu_obj, 'ProductModelVersion') name_list = ('assembly_id=', 'assembly_of_pmm_id=', 'assembly_of_pv_id=', 'assembly_of_pm_id=', 'assembly_of_pm_id_context=') for ndx in range(5): search_str.append(name_list[ndx] + value_list[ndx]) Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.37 PanGalactic/pangalactic/utils/datamanager.py:1.38 --- PanGalactic/pangalactic/utils/datamanager.py:1.37 Tue Oct 7 10:53:48 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Tue Oct 7 13:59:04 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.37 $"[11:-2] +__version__ = "$Revision: 1.38 $"[11:-2] import time import mx.DateTime @@ -101,6 +101,7 @@ product_master = ProductMaster(id = PartNumber, project_id = self.currentProject, id_context = self.currentProject) + print product_master if product_master and Revision: #print 'Creating product version' @@ -108,6 +109,7 @@ project_id = self.currentProject, id = Revision, id_context = self.currentProject) + print product_version if product_version and ModelType: #print 'Creating product model master' @@ -863,6 +865,24 @@ self.localDB.Add(unsavedobjs) self.refresh = False + + def getVersionTreeObjects(self, root_object): + objs = [] + if self.user._loggedin: + print 'logged in' + if root_object.__class__.__name__ == 'ProductMaster': + objs = self.server.GetPvByPm(root_object._of_pm_id, root_object._of_pm_id_context) + elif root_object.__class__.__name__ == 'ProductVersion': + objs = self.server.GetPmmByPv(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id) + elif root_object.__class__.__name__ == 'ProductModelMaster': + objs = self.server.GetPmvByPm(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id, root_object._of_pmm_id) + elif root_object.__class__.__name__ == 'ProductModelVersion': + return None + else: + print 'not logged in' + objs = self.localDB.getVersionTreeObjects(root_object) + return objs + def initiatedActivity(self, activity): Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.103 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.104 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.103 Mon Sep 29 15:18:19 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Tue Oct 7 13:59:03 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.103 $"[11:-2] +__version__ = "$Revision: 1.104 $"[11:-2] # Python imports import copy @@ -1160,7 +1160,7 @@ elif self.pm_pv_form.CreatingProductVersion: temp_master = self.pm_pv_form.temp_pm #print "temp_master", temp_master - save_object = ProductVersion(pm = temp_master, project_id = self.DataManager.currentProject, + save_object = ProductVersion(_of_master = temp_master, project_id = self.DataManager.currentProject, id_context = self.DataManager.currentProject) self.pm_pv_form.FillPVWithFormData(save_object) save_object.state = pangalactic.utils.objectstatus.ADD @@ -1168,8 +1168,10 @@ elif self.pmm_pmv_form.CreatingProductModelMaster: temp_version = self.pm_pv_form.temp_pv - save_object = ProductModelMaster(pv = temp_version, project_id = self.DataManager.currentProject, + print temp_version + save_object = ProductModelMaster(_of_version = temp_version, project_id = self.DataManager.currentProject, id_context = self.DataManager.currentProject) + print save_object self.pmm_pmv_form.FillPMMWithFormData(save_object) save_object.state = pangalactic.utils.objectstatus.ADD self.pmm_pmv_form.temp_pmm = save_object @@ -1177,7 +1179,7 @@ elif self.pmm_pmv_form.CreatingProductModelVersion: #print " creating a pmv" temp_model_master = self.pmm_pmv_form.temp_pmm - save_object = ProductModelVersion(pmm = temp_model_master, + save_object = ProductModelVersion(_of_model_master = temp_model_master, project_id = self.DataManager.currentProject, id_context = self.DataManager.currentProject) self.pmm_pmv_form.FillPMVWithFormData(save_object) Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.115 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.116 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.115 Wed Oct 1 16:45:42 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Tue Oct 7 13:59:03 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.115 $"[11:-2] +__version__ = "$Revision: 1.116 $"[11:-2] import os import sys @@ -51,6 +51,7 @@ from pangalactic.client.modules.psm import toolbarpanel from pangalactic.client.modules.psm import searchframe from pangalactic.client.modules.psm import pgefmaintree +from pangalactic.client.modules.psm import pgefversiontree from pangalactic.client.modules.psm import mystuffoptions from pangalactic.client.modules.psm import projectframe from pangalactic.client.modules.psm import quickcreate @@ -205,7 +206,7 @@ self.tree_notebook.AddPage(self.tree, 'Assembly') self.version_tree_ID = wxNewId() - self.version_tree = pgefmaintree.PgefMainTree(self.tree_notebook, self.version_tree_ID, self.DataManager) + self.version_tree = pgefversiontree.PgefVersionTree(self.tree_notebook, self.version_tree_ID, self.DataManager) self.version_tree.SetToolTip(wxToolTip("A hierarchy of the currently selected product.\n" + "Click on a product to highlight its data in the Products grid.\n" + "Doubleclick on a product to display the Product Editor.")) @@ -257,6 +258,10 @@ EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onPMGridDClick) EVT_GRID_CELL_LEFT_DCLICK(self.model_master_grid, self.onMMGridDClick) EVT_GRID_CELL_LEFT_DCLICK(self.product_version_grid, self.onPVGridDClick) + + EVT_GRID_CELL_LEFT_CLICK(self.product_master_grid, self.onGridGlickGetVersions) + EVT_GRID_CELL_LEFT_CLICK(self.model_master_grid, self.onGridGlickGetVersions) + EVT_GRID_CELL_LEFT_CLICK(self.product_version_grid, self.onGridGlickGetVersions) EVT_MENU(self.itemgrid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate) EVT_MENU(self.product_master_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate) @@ -278,8 +283,13 @@ EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged) - def testgridfunc(self, event): + + def onGridGlickGetVersions(self, event): print 'model master grid was clicked' + ndx = event.GetRow() + obj = event.GetEventObject().GetDataObj(ndx) + objs = self.version_tree.LoadTreefromObjects(self.DataManager, obj) + print objs # WDR: methods for MyFrame def SelectView(self, event): @@ -290,6 +300,7 @@ currentpage = self.remainingSpace.GetSelection() if currentpage != 0: self.tree_notebook.SetSelection(1) + print 'changed tree' def GetCurrentGrid(self): currentpage = self.remainingSpace.GetSelection() Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.33 PanGalactic/pangalactic/utils/localdb.py:1.34 --- PanGalactic/pangalactic/utils/localdb.py:1.33 Mon Oct 6 14:37:10 2003 +++ PanGalactic/pangalactic/utils/localdb.py Tue Oct 7 13:59:04 2003 @@ -961,10 +961,11 @@ return self.dbroot[searchdict][id] except: return None - - def SaveObject(self, savedict, id, obj): - #eventuall remove this when all calls have been renamed - self.saveObject(savedict, id, obj) + + # remove next time you see me + #def SaveObject(self, savedict, id, obj): + ##eventuall remove this when all calls have been renamed + #self.saveObject(savedict, id, obj) def saveObject(self, savedict, id, obj): #print "localdb.saveobject", savedict, id @@ -972,10 +973,26 @@ self.dbroot[savedict][id] = obj self.dbroot[self.OIDLOOKUP][obj.pgef_oid] = savedict #print "saved local object", savedict, id - except: - print "Eek. An EXCEPTION. localdb.SaveObject" -# pass - + compound_key = data_utils.createCompoundKey(obj) + print 'compound_key is:', compound_key + self.saveCompoundKey(obj, compound_key) + except Exception, e: + print "Eek. An EXCEPTION. localdb.saveObject" + print e + import traceback + traceback.print_exc() + + def saveCompoundKey(self, obj, key): + if obj.__class__.__name__ == 'ProductModelVersion': + dictname = self.PMVBYPRIMARYKEY + elif obj.__class__.__name__ == 'ProductModelMaster': + dictname = self.PMMBYPRIMARYKEY + elif obj.__class__.__name__ == 'ProductVersion': + dictname = self.PVBYPRIMARYKEY + elif obj.__class__.__name__ == 'ProductMaster': + dictname = self.PMBYPRIMARYKEY + self.dbroot[dictname][key] = obj + def AppendUncommittedData(self, uncommitteddict, unsavedlist): tmplist = self.dbroot[uncommitteddict] @@ -1232,7 +1249,7 @@ #print "localdb.add" if unsavedlist: for obj in unsavedlist: - self.SaveObject(self.UNCOMMITTEDOBJECTS, obj.pgef_oid, obj) + self.saveObject(self.UNCOMMITTEDOBJECTS, obj.pgef_oid, obj) self.Commit() @@ -1517,6 +1534,45 @@ def GetWfEventAuditDict(self): return self.dbroot[self.WFEVENTAUDIT] + + def getPvByPm(self, pm_id, pm_context): + results = [] + dict_contents = self.dbroot[self.PVBYPRIMARYKEY].items() + print 'pvbyprimary:',dict_contents + for key, object in dict_contents: + if key[:-1] == (pm_id, pm_context): + results.append(object) + return results + + + def getPmmByPv(self, pm_id, pm_context, pv_id): + results = [] + dict_contents = self.dbroot[self.PMMBYPRIMARYKEY].items() + for key, object in dict_contents: + if key[:-1] == (pm_id, pm_context, pv_id): + results.append(object) + return results + + + def getPmvByPmm(self, pm_id, pm_context, pv_id, pmm_id): + results = [] + dict_contents = self.dbroot[self.PMVBYPRIMARYKEY].items() + for key, object in dict_contents: + if key[:-1] == (pm_id, pm_context, pv_id, pmm_id): + results.append(object) + return results + + def getVersionTreeObjects(self, root_object): + objs = [] + if root_object.__class__.__name__ == 'ProductMaster': + objs = self.getPvByPm(root_object.id, root_object.id_context) + elif root_object.__class__.__name__ == 'ProductVersion': + objs = self.getPmmByPv(root_object.of_pm_id, root_object.of_pm_id_context, root_object.id) + elif root_object.__class__.__name__ == 'ProductModelMaster': + objs = self.getPmvByPmm(root_object.of_pm_id, root_object.of_pm_id_context, root_object.of_pv_id, root_object.id) + elif root_object.__class__.__name__ == 'ProductModelVersion': + return None + return objs Index: PanGalactic/PanGalactic_wingide_proj diff -u PanGalactic/PanGalactic_wingide_proj:1.28 PanGalactic/PanGalactic_wingide_proj:1.29 --- PanGalactic/PanGalactic_wingide_proj:1.28 Thu Sep 25 13:33:33 2003 +++ PanGalactic/PanGalactic_wingide_proj Tue Oct 7 13:59:03 2003 @@ -421,164 +421,164 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (110, 100, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/report'\ 'lab/lib/pagesizes.py', {'visual-state': {'first-line': 0, 'selection_start': 741, 'selection_end': 741}, - 'display-font-size': {}, 'last-window-loc': (407, 309, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/report'\ 'lab/pdfgen/canvas.py', {'visual-state': {'first-line': 0, 'selection_start': 758, 'selection_end': 758}, - 'display-font-size': {}, 'last-window-loc': (110, 110, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/report'\ 'lab/platypus/__init__.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (40, 40, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/report'\ 'lab/platypus/doctemplate.py', {'visual-state': {'first-line': 223, 'selection_start': 9291, 'selection_end': 9291}, - 'display-font-size': {}, 'last-window-loc': (399, 97, 875, - 1028)}), + 1028), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/report'\ 'lab/platypus/flowables.py', {'visual-state': {'first-line': 115, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (40, 20, 976, - 1090)}), + 1090), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/report'\ 'lab/platypus/tables.py', {'visual-state': {'first-line': 101, 'selection_start': 4035, 'selection_end': 4035}, - 'display-font-size': {}, 'last-window-loc': (410, 132, 1042, - 846)}), + 846), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/wxPyth'\ 'on/controls.py', {'visual-state': {'first-line': 936, - 'selection_start': 39504, - 'selection_end': 39504}, - 'display-font-size': {}, + 'selection_start': 36664, + 'selection_end': 36664}, 'last-window-loc': (30, 20, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/wxPyth'\ 'on/events.py', {'visual-state': {'first-line': 780, 'selection_start': 33308, 'selection_end': 33308}, - 'display-font-size': {}, 'last-window-loc': (40, 30, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/wxPyth'\ 'on/grid.py', {'visual-state': {'first-line': 1226, - 'selection_start': 54180, - 'selection_end': 54180}, + 'selection_start': 52431, + 'selection_end': 52431}, 'ignored_exceptions': {1292: 1}, - 'display-font-size': {}, 'last-window-loc': (90, 90, 650, - 1020)}), + 1020), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/wxPyth'\ 'on/lib/gridmovers.py', - {'visual-state': {'first-line': 183, - 'selection_start': 7750, - 'selection_end': 7750}, + {'visual-state': {'first-line': 0, + 'selection_start': 6047, + 'selection_end': 6047}, 'ignored_exceptions': {248: 1}, - 'display-font-size': {}, 'last-window-loc': (110, 110, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/wxPyth'\ 'on/py/shell.py', {'visual-state': {'first-line': 182, - 'selection_start': 9111, - 'selection_end': 9111}, - 'display-font-size': {}, + 'selection_start': 6523, + 'selection_end': 6523}, 'last-window-loc': (50, 40, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/wxPyth'\ 'on/windows.py', - {'visual-state': {'first-line': 162, - 'selection_start': 6587, - 'selection_end': 6587}, + {'visual-state': {'first-line': 0, + 'selection_start': 7756, + 'selection_end': 7756}, 'ignored_exceptions': {641: 1}, - 'display-font-size': {}, 'last-window-loc': (100, 100, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/site-packages/wxPyth'\ 'on/wx.py', - {'visual-state': {'first-line': 1594, - 'selection_start': 55998, - 'selection_end': 55998}, - 'display-font-size': {}, + {'visual-state': {'first-line': 0, + 'selection_start': 54712, + 'selection_end': 54712}, 'last-window-loc': (20, 10, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('../../../../usr/lib/python2.2/sre_parse.py', {'visual-state': {'first-line': 0, - 'selection_start': 1947, - 'selection_end': 1947}, + 'selection_start': 343, + 'selection_end': 343}, 'ignored_exceptions': {138: 1}, - 'display-font-size': {}, 'last-window-loc': (80, 80, 650, - 1030)}), + 1030), + 'display-font-size': {}}), ('../../../../usr/local/lib/python2.2/site-packages/'\ 'twisted/spread/jelly.py', {'visual-state': {'first-line': 741, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (413, 56, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('../../../../usr/tmp/@15162.2', {'visual-state': {'first-line': 0, 'selection_start': 286, @@ -595,42 +595,52 @@ 'selection_end': 1153}, 'display-font-size': {}}), ('../../../../windows/arena/PanGalactic/pangalactic/'\ + 'client/fnord.py', + {'visual-state': {'first-line': 975, + 'selection_start': 40699, + 'selection_end': 40699}, + 'last-window-loc': (80, + 70, + 650, + 1040), + 'display-font-size': {}}), + ('../../../../windows/arena/PanGalactic/pangalactic/'\ 'client/fnord_py22.iss', {'visual-state': {'first-line': 0, 'selection_start': 1203, 'selection_end': 1203}, + 'display-font-size': {}, 'last-window-loc': (50, 50, 1126, - 1060), - 'display-font-size': {}}), + 1060)}), ('../../.wingide/preferences', {'visual-state': {'first-line': 0, 'selection_start': 339, 'selection_end': 339}, - 'display-font-size': {}, 'last-window-loc': (724, 79, 650, - 709)}), + 709), + 'display-font-size': {}}), ('../../Desktop/Wing', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (40, 40, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('../../IDE', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (50, 50, 650, - 1060)}), + 1060), + 'display-font-size': {}}), ('../../tables.py', {'visual-state': {'first-line': 281, 'selection_start': 12545, @@ -653,143 +663,143 @@ 'selection_start': 3012, 'selection_end': 3012}, 'ignored_exceptions': {104: 1}, - 'display-font-size': {}, 'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('../../usr/lib/python2.1/site-packages/wxPython/win'\ 'dows.py', {'visual-state': {'first-line': 235, 'selection_start': 13055, 'selection_end': 13055}, - 'display-font-size': {}, 'last-window-loc': (90, 90, 650, - 1020)}), + 1020), + 'display-font-size': {}}), ('../../usr/lib/python2.1/site-packages/wxPython/wx.'\ 'py', {'visual-state': {'first-line': 1535, 'selection_start': 53214, 'selection_end': 53214}, - 'display-font-size': {}, 'last-window-loc': (199, 34, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('../../usr/lib/python2.2/site-packages/logging/prop'\ 'erties.py', {'visual-state': {'first-line': 36, 'selection_start': 1986, 'selection_end': 1986}, 'ignored_exceptions': {104: 1}, - 'display-font-size': {}, 'last-window-loc': (70, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('../../usr/lib/python2.2/site-packages/wxPython/mis'\ 'c.py', {'visual-state': {'first-line': 87, 'selection_start': 3289, 'selection_end': 3289}, - 'display-font-size': {}, 'last-window-loc': (520, 86, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('../../usr/lib/wingide/keymap.emacs', {'visual-state': {'first-line': 0, 'selection_start': 1170, 'selection_end': 1170}, - 'display-font-size': {}, 'last-window-loc': (470, 35, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('../../usr/local/lib/python2.1/UserList.py', {'visual-state': {'first-line': 0, 'selection_start': 1256, 'selection_end': 1256}, 'ignored_exceptions': {28: 1}, - 'display-font-size': {}, 'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('../../usr/local/lib/python2.1/site-packages/ZODB/P'\ 'ersistentMapping.py', {'visual-state': {'first-line': 51, 'selection_start': 4779, 'selection_end': 4779}, - 'display-font-size': {}, 'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('../../usr/local/lib/python2.1/sre_compile.py', - {'display-font-size': {}, - 'last-window-loc': (90, + {'last-window-loc': (90, 90, 650, - 1020)}), + 1020), + 'display-font-size': {}}), ('../../usr/local/lib/python2.1/sre_parse.py', {'ignored_exceptions': {132: 1}, - 'display-font-size': {}, 'last-window-loc': (70, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('../../usr/local/lib/python2.2/site-packages/ZODB/C'\ 'onnection.py', {'visual-state': {'first-line': 131, 'selection_start': 6488, 'selection_end': 6496}, - 'display-font-size': {}, 'last-window-loc': (50, 40, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('../../usr/local/lib/python2.2/site-packages/ZODB/T'\ 'ransaction.py', {'visual-state': {'first-line': 162, 'selection_start': 5754, 'selection_end': 5754}, - 'display-font-size': {}, 'last-window-loc': (677, 24, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('../../usr/local/lib/python2.2/site-packages/twiste'\ 'd/cred/identity.py', {'visual-state': {'first-line': 25, 'selection_start': 1419, 'selection_end': 1419}, - 'display-font-size': {}, 'last-window-loc': (389, 48, 650, - 1031)}), + 1031), + 'display-font-size': {}}), ('../../usr/local/lib/python2.2/sre_parse.py', {'visual-state': {'first-line': 69, 'selection_start': 2084, 'selection_end': 2084}, 'ignored_exceptions': {138: 1}, - 'display-font-size': {}, 'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('../../usr/local/lib/python2.2/xmlrpclib.py', {'visual-state': {'first-line': 898, 'selection_start': 26996, 'selection_end': 26996}, - 'display-font-size': {}, 'last-window-loc': (564, 85, 768, - 1000)}), + 1000), + 'display-font-size': {}}), ('../../usr/tmp/@10039.2', {'visual-state': {'first-line': 179, 'selection_start': 7954, @@ -810,65 +820,75 @@ {'visual-state': {'first-line': 0, 'selection_start': 326, 'selection_end': 326}, + 'display-font-size': {}, 'last-window-loc': (155, 15, 836, - 1014), - 'display-font-size': {}}), + 1014)}), ('../../wbgmapper.py.bak', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (100, 100, 650, - 1010), - 'display-font-size': {}}), + 1010)}), ('../../windows/arena/test/setup.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 843}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), + ('../PanGalactic_bak/pangalactic/enterprise/productv'\ + 'ersion.py', + {'visual-state': {'first-line': 54, + 'selection_start': 0, + 'selection_end': 0}, + 'display-font-size': {}, + 'last-window-loc': (20, + 10, + 650, + 1090)}), ('../Twisted/twisted/python/mvc.py', {'visual-state': {'first-line': 0, 'selection_start': 1878, 'selection_end': 1878}, + 'display-font-size': {}, 'last-window-loc': (498, 28, 792, - 935), - 'display-font-size': {}}), + 935)}), ('../Twisted/twisted/web/woven/controller.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (730, 96, 650, - 826), - 'display-font-size': {}}), + 826)}), ('../Twisted/twisted/web/woven/model.py', {'visual-state': {'first-line': 0, 'selection_start': 1317, 'selection_end': 1317}, + 'display-font-size': {}, 'last-window-loc': (704, 0, 650, - 981), - 'display-font-size': {}}), + 981)}), ('../Twisted/twisted/web/woven/view.py', {'visual-state': {'first-line': 0, 'selection_start': 140, 'selection_end': 140}, + 'display-font-size': {}, 'last-window-loc': (821, 216, 650, - 720), - 'display-font-size': {}}), + 720)}), ('../cf_exec/cf.wpr', {'open-windows': (('manager', (('Project: cf.wpr (arena/cf_exec)', @@ -902,11 +922,11 @@ {'visual-state': {'first-line': 0, 'selection_start': 282, 'selection_end': 282}, + 'display-font-size': {}, 'last-window-loc': (60, 19, 650, - 1020), - 'display-font-size': {}}), + 1020)}), ('../nepp/nepp.wpr', {'open-windows': (('manager', (('Project: nepp.wpr (arena/nepp)', @@ -944,199 +964,134 @@ 'selection_start': 8245, 'selection_end': 8245}}), ('../pbear/foo.py', - {'display-font-size': {}, - 'last-window-loc': (100, + {'last-window-loc': (100, 100, 650, - 674)}), + 674), + 'display-font-size': {}}), ('../temp/sp_activity_invoice.py', {'visual-state': {'first-line': 469, 'selection_start': 946, 'selection_end': 946}, - 'display-font-size': {}, 'last-window-loc': (253, 0, 943, - 1040)}), + 1040), + 'display-font-size': {}}), ('../wbgmapper.py', {'visual-state': {'first-line': 0, 'selection_start': 548, 'selection_end': 548}, + 'display-font-size': {}, 'last-window-loc': (110, 110, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('.gnome-desktop/wxPython', - {'display-font-size': {}, - 'last-window-loc': (884, + {'last-window-loc': (884, 51, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('.wingide/preferences', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('Demo.desktop', - {'display-font-size': {}, - 'last-window-loc': (4, + {'last-window-loc': (4, 38, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('PanGalactic_wingide_proj', - {'open-windows': (('source', - (('editor', - 'file:/usr/lib/python2.2/site-packages/wxPython/py/shell.py', - {'first-line': 182, - 'selection_start': 9111, - 'selection_end': 9111}),), - (50, - 40, - 650, - 1070)), - ('source', - (('editor', - 'file:/usr/lib/python2.2/site-packages/wxPython/events.py', - {'first-line': 780, - 'selection_start': 33308, - 'selection_end': 33308}),), - (40, - 30, - 650, - 1080)), - ('source', - (('editor', - 'file:/home/bmuir/arena/PanGalactic/pangalactic/client/fnord.py', - {'first-line': 463, - 'selection_start': 20438, - 'selection_end': 20438}),), - (424, - 112, - 971, - 851)), + {'open-windows': (('manager', + (('Project: PanGalactic_wingide_proj (arena/PanGalactic)', + {}),), + (58, + 10, + 340, + 883)), ('source', (('editor', 'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\ - 'm/psmtool.py', - {'first-line': 540, - 'selection_start': 24797, - 'selection_end': 24797}),), - (406, - 52, - 1034, - 904)), + 'm/pgefversiontree.py', + {'first-line': 47, + 'selection_start': 3691, + 'selection_end': 3691}),), + (333, + 120, + 969, + 987)), ('source', (('editor', - 'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\ - 'm/itemeditframe.py', - {'first-line': 363, - 'selection_start': 18109, - 'selection_end': 18109}),), - (494, - 22, - 956, - 933)), + 'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/data_utils.'\ + 'py', + {'first-line': 3, + 'selection_start': 645, + 'selection_end': 1392}),), + (485, + 137, + 1039, + 936)), ('source', (('editor', 'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\ - 'm/productdataform.py', - {'first-line': 198, - 'selection_start': 8168, - 'selection_end': 8168}),), - (502, - 102, - 993, - 875)), - ('source', - (('editor', - 'file:/usr/lib/python2.2/site-packages/wxPython/controls.py', - {'first-line': 936, - 'selection_start': 39504, - 'selection_end': 39504}),), - (30, - 20, - 650, - 1090)), - ('source', - (('editor', - 'file:/usr/lib/python2.2/site-packages/wxPython/wx.py', - {'first-line': 1594, - 'selection_start': 55998, - 'selection_end': 55998}),), - (20, - 10, - 650, - 1090)), - ('source', - (('editor', - 'file:/usr/lib/python2.2/site-packages/wxPython/windows.py', - {'first-line': 162, - 'selection_start': 6587, - 'selection_end': 6587}),), - (100, - 100, - 650, - 1010)), - ('source', - (('editor', - 'file:/usr/lib/python2.2/site-packages/wxPython/lib/gridmovers.py', - {'first-line': 183, - 'selection_start': 7750, - 'selection_end': 7750}),), - (110, - 110, - 650, - 1000)), + 'm/pgeftree.py', + {'first-line': 209, + 'selection_start': 10839, + 'selection_end': 10864}),), + (424, + 23, + 998, + 971)), ('source', (('editor', - 'file:/usr/lib/python2.2/site-packages/wxPython/grid.py', - {'first-line': 1226, - 'selection_start': 54180, - 'selection_end': 54180}),), - (90, - 90, - 650, - 1020)), + 'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/datamanager'\ + '.py', + {'first-line': 812, + 'selection_start': 9745, + 'selection_end': 9795}),), + (407, + 47, + 1053, + 1040)), ('source', (('editor', - 'file:/usr/lib/python2.2/sre_parse.py', - {'first-line': 0, - 'selection_start': 1947, - 'selection_end': 1947}),), - (80, - 80, - 650, - 1030)), - ('manager', - (('Debugger', - {}),), - (30, - 20, - 650, - 1090)), - ('manager', - (('Project: PanGalactic_wingide_proj (arena/PanGalactic)', - {}),), - (35, - 18, - 526, - 908)), + 'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/localdb.py', + {'first-line': 1498, + 'selection_start': 35786, + 'selection_end': 35786}),), + (454, + 67, + 961, + 1050)), ('source', (('editor', 'file:/home/bmuir/arena/PanGalactic/pangalactic/client/modules/ps'\ - 'm/pgeftree.py', - {'first-line': 275, - 'selection_start': 13686, - 'selection_end': 13686}),), + 'm/psmtool.py', + {'first-line': 277, + 'selection_start': 138606, + 'selection_end': 138606}),), (415, - 23, - 998, - 971))), + 56, + 1034, + 904)), + ('source', + (('editor', + 'file:/home/bmuir/arena/PanGalactic/pangalactic/utils/xmlrpcinter'\ + 'face.py', + {'first-line': 54, + 'selection_start': 2213, + 'selection_end': 2213}),), + (521, + 36, + 953, + 1066))), 'mgr-window-loc': {'mixin_security.py (arena/PanGa'\ 'lactic/pangalactic/client/dataobjects)': (450, 219, @@ -1168,6 +1123,10 @@ 293, 562, 613), + 'gridmovers.py (/usr/lib/python2.2/site-packages/wxPython/lib)': (110, + 110, + 650, + 1000), 'Project: PanGalactic_wingide_proj (arena/PanGalactic_bak)': (35, 31, 551, @@ -1193,24 +1152,22 @@ 28, 650, 1000), + 'shell.py (/usr/lib/python2.2/site-packages/wxPython/py)': (50, + 40, + 650, + 1070), 'view.py (arena/Twisted/twisted/web/woven)': (821, 216, 650, 720), - 'itemeditframe.py (arena/PanGalactic_bak/pangalactic/client/modules/'\ - 'psm)': (209, - 127, - 1045, - 1000), + 'data_utils.py (arena/PanGalactic/pangalactic/client/dataobjects)': (436, + 43, + 760, + 1000), 'objectreport.py (arena/PanGalactic/pangalactic/client/io)': (429, 293, 835, 744), - 'test_xmlrpcinterface.py (arena/PanGalactic/pangalactic/client/tests'\ - ')': (80, - 60, - 650, - 1050), 'customizegrid_wdr.py (arena/PanGalactic/pangalactic/utils)': (20, 10, 650, @@ -1248,10 +1205,10 @@ 9, 650, 1000), - 'fnord_py22.iss (/windows/arena/PanGalactic/pangalactic/client)': (50, - 50, - 1126, - 1060), + 'windows.py (/usr/lib/python2.2/site-packages/wxPython)': (100, + 100, + 650, + 1010), 'advisory.py (arena/PanGalactic/pangalactic/client/io)': (401, 281, 849, @@ -1260,18 +1217,19 @@ 500, 600, 200), - 'Suspicious Indentation in File': (786, - 571, - 510, - 266), + 'httpserverinterface.py (arena/PanGalactic_bak/pangalactic/client/su'\ + 'pport)': (314, + 96, + 762, + 1000), 'pgefdatatable.py (arena/PanGalactic/pangalactic/client/modules/psm)': (311, 35, 788, 1045), - 'datamanager.py (arena/PanGalactic/pangalactic/utils)': (398, - 43, - 1053, - 1040), + 'textreport.py (arena/PanGalactic/pangalactic/client/io)': (30, + 20, + 650, + 1090), 'dbbrowser.py (arena/PanGalactic_bak/pangalactic/client/support)': (250, 40, 890, @@ -1280,11 +1238,10 @@ 110, 650, 1000), - 'httpserverinterface.py (arena/PanGalactic_bak/pangalactic/client/su'\ - 'pport)': (314, - 96, - 762, - 1000), + 'Suspicious Indentation in File': (786, + 571, + 510, + 266), 'customizegrid.py (arena/PanGalactic/pangalactic/client/modules/psm)': (591, 24, 877, @@ -1293,6 +1250,10 @@ 20, 650, 1090), + 'wx.py (/usr/lib/python2.2/site-packages/wxPython)': (20, + 10, + 650, + 1090), 'itemsearchform.py (arena/PanGalactic/pangalactic/client/modules/psm'\ ')': (449, 40, @@ -1307,6 +1268,10 @@ 51, 650, 867), + 'pgefmaintree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (110, + 70, + 650, + 1040), 'pagesizes.py (/usr/lib/python2.2/site-packages/reportlab/lib)': (407, 309, 650, @@ -1315,14 +1280,22 @@ 150, 746, 966), + 'basegrid.py (arena/PanGalactic/pangalactic/utils)': (287, + 53, + 650, + 1060), + 'plmconvert.py (arena/PanGalactic/pangalactic/client/modules/plm)': (560, + 7, + 650, + 1090), 'xlate_list.py_new (arena/PanGalactic/pangalactic/tools)': (862, 78, 650, 1040), - 'tables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (438, - 114, - 1042, - 846), + 'datamanager.py (arena/PanGalactic/pangalactic/utils)': (398, + 43, + 1053, + 1040), 'itemdataform_wdr.py (arena/PanGalactic/pangalactic/client/modules/p'\ 'sm)': (130, 110, @@ -1345,11 +1318,10 @@ 462, 640, 276), - 'pgefmaintree.py (arena/PanGalactic_bak/pangalactic/client/modules/p'\ - 'sm)': (110, - 70, - 650, - 1040), + 'pgefgrid.py (arena/PanGalactic/pangalactic/client/modules/psm)': (442, + 114, + 941, + 801), 'setup.py (arena/PanGalactic/pangalactic/client)': (80, 80, 1137, @@ -1366,22 +1338,26 @@ 12, 907, 1000), - 'link.py (arena/PanGalactic_bak/pangalactic/common)': (203, - 52, + 'dbbrowser.py (arena/PanGalactic/pangalactic/client/support)': (426, + 24, 650, - 1080), - 'test_nauo.py (arena/PanGalactic_bak/pangalactic/client/tests)': (391, - 276, + 1000), + 'searchframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (0, + 28, + 894, + 1000), + 'model.py (arena/Twisted/twisted/web/woven)': (704, + 0, 650, - 852), + 981), 'untitled-2.py': (80, 80, 650, 1030), - 'sm_pdf_tables.py (arena/PanGalactic/pangalactic/client/io)': (411, - 191, - 829, - 890), + 'controls.py (/usr/lib/python2.2/site-packages/wxPython)': (30, + 20, + 650, + 1090), 'test_zodb.py': (712, 299, 758, @@ -1391,9 +1367,9 @@ 20, 650, 1000), - 'itemeditframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (494, - 22, - 956, + 'itemeditframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (502, + 129, + 957, 933), 'partslisttreeframe.py (arena/PanGalactic/pangalactic/client/modules'\ '/psm)': (605, @@ -1404,10 +1380,10 @@ 474, 500, 296), - 'canvas.py (/usr/lib/python2.2/site-packages/reportlab/pdfgen)': (110, - 110, + 'productmodelversion.py (arena/PanGalactic/pangalactic/enterprise)': (40, + 30, 650, - 1000), + 1080), 'pgefdatatable.py (arena/PanGalactic/pangalactic/common/utils)': (40, 40, 650, @@ -1416,44 +1392,50 @@ 146, 650, 971), - 'pdfreport.py (arena/PanGalactic/pangalactic/client/io)': (401, - 60, - 949, - 836), + 'reportlab_blocks.py (arena/PanGalactic/pangalactic/client/io)': (410, + 61, + 650, + 1010), + 'flowables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (40, + 20, + 976, + 1090), 'controller.py (arena/Twisted/twisted/web/woven)': (730, 96, 650, 826), - 'itemdataform.wdr (arena/PanGalactic/pangalactic/client/modules/psm)': (100, + 'person.py (arena/PanGalactic_bak/pangalactic/common)': (100, 90, 650, 1020), - 'itemdroptarget.py (arena/PanGalactic_bak/pangalactic/client/modules'\ - '/psm)': (417, - 196, - 916, - 748), + 'tables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (438, + 114, + 1042, + 846), 'productfilerelationship.py (arena/PanGalactic/pangalactic/common)': (100, 100, 650, 1010), - 'xlator.py (arena/PanGalactic/pangalactic/tools)': (425, - 31, - 866, - 1000), + 'data_utils.py (arena/PanGalactic/pangalactic/utils)': (485, + 133, + 1039, + 936), 'test_pgefobject.py (arena/PanGalactic_bak/pangalactic/client/tests)': (0, 28, 650, 1000), - 'flowables.py (/usr/lib/python2.2/site-packages/reportlab/platypus)': (40, - 20, - 976, - 1090), - 'checkedoutgrid.py (arena/PanGalactic/pangalactic/client/modules/psm'\ - ')': (414, - 46, - 924, - 1000), + 'pdfreport.py (arena/PanGalactic/pangalactic/client/io)': (401, + 60, + 949, + 836), + 'configdbbrowser.py (arena/PanGalactic/pangalactic/utils)': (343, + 48, + 828, + 1000), + 'project.py (arena/PanGalactic/pangalactic/common)': (411, + 138, + 650, + 982), 'partslistform.py (arena/PanGalactic/pangalactic/client/modules/psm)': (407, 32, 870, @@ -1470,18 +1452,22 @@ 21, 650, 1000), - 'Select files': (550, - 450, - 500, - 300), + 'link.py (arena/PanGalactic_bak/pangalactic/common)': (203, + 52, + 650, + 1080), + 'fnord_py22.iss (/windows/arena/PanGalactic/pangalactic/client)': (50, + 50, + 1126, + 1060), 'pgefadvisory.py (arena/PanGalactic/pangalactic/enterprise)': (60, 60, 848, 1050), - 'plmconvert.py (arena/PanGalactic/pangalactic/client/modules/plm)': (560, - 7, - 650, - 1090), + 'sm_pdf_tables.py (arena/PanGalactic/pangalactic/client/io)': (411, + 191, + 829, + 890), 'partslistfilerelationship.py (arena/PanGalactic/pangalactic/common)': (30, 20, 650, @@ -1490,10 +1476,6 @@ 28, 650, 1000), - 'person.py (arena/PanGalactic_bak/pangalactic/common)': (100, - 90, - 650, - 1020), 'object_report.py (arena/cf_exec)': (666, 61, 750, @@ -1532,14 +1514,22 @@ 50, 650, 1060), - 'dbbrowser.py (arena/PanGalactic/pangalactic/client/support)': (426, - 24, + 'events.py (/usr/lib/python2.2/site-packages/wxPython)': (40, + 30, 650, + 1080), + 'xlator.py (arena/PanGalactic/pangalactic/tools)': (425, + 31, + 866, 1000), 'sp_activity_invoice.py (arena/temp)': (253, 0, 943, 1040), + 'toolbarpanel.py (arena/PanGalactic/pangalactic/client/modules/psm)': (440, + 167, + 814, + 882), 'toolframe.py (arena/PanGalactic/pangalactic/client)': (336, 45, 1037, @@ -1549,10 +1539,11 @@ 254, 916, 748), - 'pgefgrid.py (arena/PanGalactic/pangalactic/client/modules/psm)': (442, - 114, - 941, - 801), + 'pgefmaintree.py (arena/PanGalactic_bak/pangalactic/client/modules/p'\ + 'sm)': (110, + 70, + 650, + 1040), 'localdb.py (arena/PanGalactic/pangalactic/utils)': (445, 63, 835, @@ -1570,22 +1561,31 @@ 97, 875, 1028), - 'reportlab_blocks.py (arena/PanGalactic/pangalactic/client/io)': (410, - 61, + 'sre_parse.py (/usr/lib/python2.2)': (80, + 80, 650, - 1010), + 1030), 'Save Files?': (0, 28, 500, 1000), + '__init__.py (/usr/lib/python2.2/site-packages/reportlab)': (110, + 100, + 650, + 1010), 'jelly.py (/usr/local/lib/python2.2/site-packages/twisted/spread)': (413, 56, 650, 1070), - 'pgeftree.py (arena/PanGalactic_bak/pangalactic/client/modules/psm)': (120, - 80, + 'pystrptime.py (arena/PanGalactic/pangalactic/utils)': (100, + 100, 650, - 1030), + 1010), + 'itemdroptarget.py (arena/PanGalactic_bak/pangalactic/client/modules'\ + '/psm)': (417, + 196, + 916, + 748), 'test_gidep_alert.py (arena/PanGalactic_bak/pangalactic/client/tests'\ ')': (0, 28, @@ -1611,22 +1611,24 @@ 31, 750, 1068), - 'pgeftree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (415, + 'pgeftree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (424, 23, 998, 971), + 'checkedoutgrid.py (arena/PanGalactic/pangalactic/client/modules/psm'\ + ')': (414, + 46, + 924, + 1000), 'File open failed': (545, 553, 510, 93), - 'productmodelversion.py (arena/PanGalactic/pangalactic/enterprise)': (40, - 30, - 650, - 1080), - '__init__.py (/usr/lib/python2.2/site-packages/reportlab)': (110, - 100, - 650, - 1010), + 'test_xmlrpcinterface.py (arena/PanGalactic/pangalactic/client/tests'\ + ')': (80, + 60, + 650, + 1050), 'nauo.py (arena/PanGalactic_bak/pangalactic/common)': (30, 10, 650, @@ -1636,14 +1638,14 @@ 102, 993, 875), + 'productmodelmaster.py (arena/PanGalactic/pangalactic/enterprise)': (70, + 50, + 650, + 1060), 'Interactive Python Shell': (559, 196, 1006, 620), - 'model.py (arena/Twisted/twisted/web/woven)': (704, - 0, - 650, - 981), 'localdb.py (arena/PanGalactic/pangalactic/common/utils)': (30, 20, 650, @@ -1656,9 +1658,13 @@ 293, 562, 613), - 'searchframe.py (arena/PanGalactic/pangalactic/client/modules/psm)': (0, - 28, - 894, + 'productmaster.py (arena/PanGalactic/pangalactic/enterprise)': (60, + 40, + 650, + 1070), + 'fnord_py22.iss (arena/PanGalactic/pangalactic/client)': (267, + 55, + 1092, 1000), 'pgefedittree.py (arena/PanGalactic_bak/pangalactic/client/modules/p'\ 'sm)': (278, @@ -1694,10 +1700,10 @@ 68, 759, 1050), - 'fnord_py22.iss (arena/PanGalactic/pangalactic/client)': (267, - 55, - 1092, - 1000), + 'grid.py (/usr/lib/python2.2/site-packages/wxPython)': (90, + 90, + 650, + 1020), 'test_gidep_problem_advisory.py (arena/PanGalactic_bak/pangalactic/c'\ 'lient/tests)': (0, 28, @@ -1711,26 +1717,31 @@ 115, 650, 932), - 'pgefmaintree.py (arena/PanGalactic/pangalactic/client/modules/psm)': (110, - 70, + 'pgeftree.py (arena/PanGalactic_bak/pangalactic/client/modules/psm)': (120, + 80, 650, - 1040), + 1030), 'xmlrpcinterface.py (arena/PanGalactic/pangalactic/utils)': (512, 32, - 650, + 953, 1066), - 'toolbarpanel.py (arena/PanGalactic/pangalactic/client/modules/psm)': (440, - 167, - 814, - 882), + 'Select files': (550, + 450, + 500, + 300), 'psmtool.py (arena/PanGalactic_bak/pangalactic/client/modules/psm)': (410, 91, 822, 1000), - 'data_utils.py (arena/PanGalactic/pangalactic/client/dataobjects)': (436, - 43, - 760, - 1000), + 'fnord.py (/windows/arena/PanGalactic/pangalactic/client)': (80, + 70, + 650, + 1040), + 'itemeditframe.py (arena/PanGalactic_bak/pangalactic/client/modules/'\ + 'psm)': (209, + 127, + 1045, + 1000), 'Open File': (550, 350, 500, @@ -1743,6 +1754,10 @@ 15, 825, 1090), + 'otherdocform.py (arena/PanGalactic/pangalactic/client/modules/psm)': (546, + 46, + 875, + 1000), 'test_person.py (arena/PanGalactic_bak/pangalactic/client/tests)': (0, 28, 650, @@ -1751,19 +1766,27 @@ 109, 999, 931), + 'productversion.py (arena/PanGalactic_bak/pangalactic/enterprise)': (20, + 10, + 650, + 1090), 'xlate_list.py (arena/PanGalactic/pangalactic/tools)': (509, 42, 928, 1000), - 'otherdocform.py (arena/PanGalactic/pangalactic/client/modules/psm)': (546, - 46, - 875, + 'canvas.py (/usr/lib/python2.2/site-packages/reportlab/pdfgen)': (110, + 110, + 650, 1000), 'propertiesform.py (arena/PanGalactic/pangalactic/client/modules/psm'\ ')': (568, 215, 997, 861), + 'test_nauo.py (arena/PanGalactic_bak/pangalactic/client/tests)': (391, + 276, + 650, + 852), 'wbgmapper.py': (155, 15, 836, @@ -1772,10 +1795,10 @@ 538, 510, 123), - 'textreport.py (arena/PanGalactic/pangalactic/client/io)': (30, - 20, + 'itemdataform.wdr (arena/PanGalactic/pangalactic/client/modules/psm)': (100, + 90, 650, - 1090), + 1020), 'configdbbrowser.py (arena/PanGalactic/pangalactic/client/support)': (269, 159, 877, @@ -1784,10 +1807,6 @@ 111, 650, 1000), - 'pgefadvisory.py (arena/PanGalactic/pangalactic/client/modules/dm)': (135, - 44, - 650, - 1070), 'role.py (arena/PanGalactic/pangalactic/common)': (90, 90, 650, @@ -1796,10 +1815,10 @@ 28, 650, 1000), - 'Project: PanGalactic_wingide_proj (arena/PanGalactic)': (35, - 18, - 526, - 908), + 'Project: PanGalactic_wingide_proj (arena/PanGalactic)': (58, + 10, + 340, + 883), 'mvc.py (arena/Twisted/twisted/python)': (498, 28, 792, @@ -1825,12 +1844,12 @@ 246, 920, 841), - 'project.py (arena/PanGalactic/pangalactic/common)': (411, - 138, + 'pgefadvisory.py (arena/PanGalactic/pangalactic/client/modules/dm)': (135, + 44, 650, - 982), - 'fnord.py (arena/PanGalactic/pangalactic/client)': (424, - 112, + 1070), + 'fnord.py (arena/PanGalactic/pangalactic/client)': (383, + 152, 971, 851), 'baseobjecttest.py (arena/PanGalactic_bak/pangalactic/client/tests)': (271, @@ -1881,11 +1900,11 @@ '[(z[0], z[1]) for z in x]', "[(z[0], z[1].replace('self.','')) for z in x]"]}), ('code/lst1.py', - {'display-font-size': {}, - 'last-window-loc': (569, + {'last-window-loc': (569, 75, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('configdbbrowser.py', {'visual-state': {'first-line': 0, 'selection_start': 332, @@ -1898,201 +1917,201 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (50, 50, 650, - 1060)}), + 1060), + 'display-font-size': {}}), ('hack.py', - {'display-font-size': {}, - 'last-window-loc': (60, + {'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('oid_doc.txt', - {'display-font-size': {}, - 'last-window-loc': (324, + {'last-window-loc': (324, 80, 1262, - 705)}), + 705), + 'display-font-size': {}}), ('pangalactic/Twisted/doc/examples/xmlrpc.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (40, 40, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('pangalactic/client/README', {'visual-state': {'first-line': 97, 'selection_start': 4195, 'selection_end': 4195}, + 'display-font-size': {}, 'last-window-loc': (423, 6, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/checkout.txt', {'visual-state': {'first-line': 0, 'selection_start': 1307, 'selection_end': 1307}, - 'display-font-size': {}, 'last-window-loc': (112, 44, 1399, - 1070)}), + 1070), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/constants.py', {'visual-state': {'first-line': 0, 'selection_start': 176, 'selection_end': 176}, - 'display-font-size': {}, 'last-window-loc': (487, 51, 650, - 568)}), + 568), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/data_utils.py', {'visual-state': {'first-line': 0, 'selection_start': 1041, 'selection_end': 1041}, + 'display-font-size': {}, 'last-window-loc': (436, 43, 760, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/dataobjects/datamanager.py', {'visual-state': {'first-line': 0, 'selection_start': 105, 'selection_end': 105}, - 'display-font-size': {}, 'last-window-loc': (405, 12, 907, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/datamanager.py_new', {'visual-state': {'first-line': 0, 'selection_start': 1468, 'selection_end': 1468}, - 'display-font-size': {}, 'last-window-loc': (462, 116, 650, - 1001)}), + 1001), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/epimsproject.py', {'visual-state': {'first-line': 0, 'selection_start': 676, 'selection_end': 676}, - 'display-font-size': {}, 'last-window-loc': (239, 259, 759, - 642)}), + 642), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/idr.py', {'visual-state': {'first-line': 0, 'selection_start': 947, 'selection_end': 947}, + 'display-font-size': {}, 'last-window-loc': (508, 155, 650, - 825), - 'display-font-size': {}}), + 825)}), ('pangalactic/client/dataobjects/item.py', {'visual-state': {'first-line': 53, 'selection_start': 3895, 'selection_end': 3895}, - 'display-font-size': {}, 'last-window-loc': (741, 89, 709, - 877)}), + 877), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/localdb.py', {'visual-state': {'first-line': 0, 'selection_start': 1012, 'selection_end': 1012}, - 'display-font-size': {}, 'last-window-loc': (388, 109, 999, - 931)}), + 931), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/mixin_security.py', {'visual-state': {'first-line': 0, 'selection_start': 783, 'selection_end': 783}, + 'display-font-size': {}, 'last-window-loc': (450, 219, 989, - 936), - 'display-font-size': {}}), + 936)}), ('pangalactic/client/dataobjects/nauo.py', {'visual-state': {'first-line': 0, 'selection_start': 52, 'selection_end': 52}, - 'display-font-size': {}, 'last-window-loc': (701, 167, 650, - 875)}), + 875), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/nedobject.py', - {'display-font-size': {}, - 'last-window-loc': (383, + {'last-window-loc': (383, 137, 1118, - 737)}), + 737), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/objectstatus.py', {'visual-state': {'first-line': 0, 'selection_start': 322, 'selection_end': 322}, + 'display-font-size': {}, 'last-window-loc': (216, 327, 650, - 565), - 'display-font-size': {}}), + 565)}), ('pangalactic/client/dataobjects/part.py', {'visual-state': {'first-line': 0, 'selection_start': 615, 'selection_end': 632}, - 'display-font-size': {}, 'last-window-loc': (569, 58, 650, - 1011)}), + 1011), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/partslist.py', {'visual-state': {'first-line': 20, 'selection_start': 677, 'selection_end': 677}, - 'display-font-size': {}, 'last-window-loc': (367, 172, 1000, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/pdmdocument.py', {'visual-state': {'first-line': 0, 'selection_start': 240, 'selection_end': 240}, + 'display-font-size': {}, 'last-window-loc': (607, 54, 650, - 854), - 'display-font-size': {}}), + 854)}), ('pangalactic/client/dataobjects/pdmexceptions.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (411, 51, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/pdmobject.py', {'visual-state': {'first-line': 209, 'selection_start': 8740, 'selection_end': 8740}, 'ignored_exceptions': {124: 1}, - 'display-font-size': {}, 'last-window-loc': (463, 108, 935, - 966)}), + 966), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/pdmobjecttest.py', {'visual-state': {'first-line': 0, 'selection_start': 472, @@ -2105,60 +2124,60 @@ {'visual-state': {'first-line': 8, 'selection_start': 547, 'selection_end': 547}, - 'display-font-size': {}, 'last-window-loc': (501, 46, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/safelistappend.py', {'visual-state': {'first-line': 0, 'selection_start': 575, 'selection_end': 575}, - 'display-font-size': {}, 'last-window-loc': (394, 22, 901, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/securitymanager.py', {'visual-state': {'first-line': 117, 'selection_start': 4536, 'selection_end': 4536}, + 'display-font-size': {}, 'last-window-loc': (432, 51, 650, - 867), - 'display-font-size': {}}), + 867)}), ('pangalactic/client/dataobjects/user.py', {'visual-state': {'first-line': 0, 'selection_start': 1213, 'selection_end': 1213}, - 'display-font-size': {}, 'last-window-loc': (455, 50, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/dataobjects/uuid.py', {'visual-state': {'first-line': 0, 'selection_start': 144, 'selection_end': 144}, - 'display-font-size': {}, 'last-window-loc': (477, 244, 984, - 697)}), + 697), + 'display-font-size': {}}), ('pangalactic/client/fnord.iss', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (50, 50, 1061, - 1060)}), + 1060), + 'display-font-size': {}}), ('pangalactic/client/fnord.py', - {'visual-state': {'first-line': 463, - 'selection_start': 20438, - 'selection_end': 20438}, + {'visual-state': {'first-line': 327, + 'selection_start': 13154, + 'selection_end': 13154}, 'which-pyexec': {'linux': 'project'}, 'which-rundir': {'linux': 'project'}, 'env-vars': {'linux': []}, @@ -2171,8 +2190,8 @@ 'buildcmd': {'linux': ''}, 'pypath': {'linux': ''}, 'showargsdialog': 1, - 'last-window-loc': (424, - 112, + 'last-window-loc': (383, + 152, 971, 851), 'rundir': {'linux': ''}, @@ -2182,168 +2201,168 @@ {'visual-state': {'first-line': 0, 'selection_start': 1694, 'selection_end': 1694}, - 'display-font-size': {}, 'last-window-loc': (267, 55, 1092, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/images/ToolkitImages.py', {'visual-state': {'first-line': 911, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (60, 40, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('pangalactic/client/images/maketoolkitimages.py', {'visual-state': {'first-line': 0, 'selection_start': 1018, 'selection_end': 1018}, - 'display-font-size': {}, 'last-window-loc': (70, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/client/io/acrobatwrapper.py', {'visual-state': {'first-line': 0, 'selection_start': 5, 'selection_end': 5}, - 'display-font-size': {}, 'last-window-loc': (182, 5, 875, - 1090)}), + 1090), + 'display-font-size': {}}), ('pangalactic/client/io/advisory.py', {'visual-state': {'first-line': 242, 'selection_start': 8074, 'selection_end': 8074}, - 'display-font-size': {}, 'last-window-loc': (401, 281, 849, - 1030)}), + 1030), + 'display-font-size': {}}), ('pangalactic/client/io/objectreport.py', {'visual-state': {'first-line': 46, 'selection_start': 2867, 'selection_end': 2867}, - 'display-font-size': {}, 'last-window-loc': (429, 293, 835, - 744)}), + 744), + 'display-font-size': {}}), ('pangalactic/client/io/pdfoptions.py', {'visual-state': {'first-line': 25, 'selection_start': 2357, 'selection_end': 2357}, + 'display-font-size': {}, 'last-window-loc': (399, 246, 920, - 841), - 'display-font-size': {}}), + 841)}), ('pangalactic/client/io/pdfreport.py', {'visual-state': {'first-line': 2, 'selection_start': 882, 'selection_end': 882}, + 'display-font-size': {}, 'last-window-loc': (401, 60, 949, - 836), - 'display-font-size': {}}), + 836)}), ('pangalactic/client/io/reportlab_blocks.py', {'visual-state': {'first-line': 286, 'selection_start': 9996, 'selection_end': 9996}, - 'display-font-size': {}, 'last-window-loc': (410, 61, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('pangalactic/client/io/sm_pdf_tables.py', {'visual-state': {'first-line': 45, 'selection_start': 2017, 'selection_end': 2017}, - 'display-font-size': {}, 'last-window-loc': (411, 191, 829, - 890)}), + 890), + 'display-font-size': {}}), ('pangalactic/client/io/textreport.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (30, 20, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('pangalactic/client/io/treereport.py', {'visual-state': {'first-line': 0, 'selection_start': 1205, 'selection_end': 1205}, + 'display-font-size': {}, 'last-window-loc': (403, 19, 917, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/loginclass.py', {'visual-state': {'first-line': 0, 'selection_start': 1521, 'selection_end': 1521}, - 'display-font-size': {}, 'last-window-loc': (560, 150, 746, - 966)}), + 966), + 'display-font-size': {}}), ('pangalactic/client/modules/dm/dmtool.py', {'visual-state': {'first-line': 302, 'selection_start': 13459, 'selection_end': 13459}, - 'display-font-size': {}, 'last-window-loc': (208, 107, 1068, - 896)}), + 896), + 'display-font-size': {}}), ('pangalactic/client/modules/dm/gidep_problem_adviso'\ 'ry.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/dm/nasa_advisory_gui.py', {'visual-state': {'first-line': 247, 'selection_start': 14139, 'selection_end': 14143}, - 'display-font-size': {}, 'last-window-loc': (90, 90, 650, - 1020)}), + 1020), + 'display-font-size': {}}), ('pangalactic/client/modules/dm/pgefadvisory.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (135, 44, 650, - 1070), - 'display-font-size': {}}), + 1070)}), ('pangalactic/client/modules/plm/epimsevent.py', - {'display-font-size': {}, - 'last-window-loc': (60, + {'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/modules/plm/epimsgrid.py', - {'display-font-size': {}, - 'last-window-loc': (609, + {'last-window-loc': (609, 55, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/client/modules/plm/ms2file.py', {'visual-state': {'first-line': 23, 'selection_start': 1541, @@ -2352,65 +2371,65 @@ {'visual-state': {'first-line': 171, 'selection_start': 7775, 'selection_end': 7775}, - 'display-font-size': {}, 'last-window-loc': (560, 7, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('pangalactic/client/modules/plm/plmtool.py', {'visual-state': {'first-line': 18, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (373, 50, 885, - 1076)}), + 1076), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/aboutbox.py', {'visual-state': {'first-line': 0, 'selection_start': 1193, 'selection_end': 1193}, + 'display-font-size': {}, 'last-window-loc': (550, 82, 751, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/modules/psm/aboutbox_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 747, 'selection_end': 747}, - 'display-font-size': {}, 'last-window-loc': (0, 16, 885, - 1070)}), + 1070), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/bitmaps.py', {'visual-state': {'first-line': 19, 'selection_start': 705, 'selection_end': 705}, - 'display-font-size': {}, 'last-window-loc': (80, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/bitmaps_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (90, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/checkedoutgrid.py', {'visual-state': {'first-line': 0, 'selection_start': 107, 'selection_end': 107}, + 'display-font-size': {}, 'last-window-loc': (414, 46, 924, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/modules/psm/clientgui.py', {'visual-state': {'first-line': 2914, 'selection_start': 1031, @@ -2436,50 +2455,50 @@ {'visual-state': {'first-line': 58, 'selection_start': 3372, 'selection_end': 3372}, + 'display-font-size': {}, 'last-window-loc': (591, 24, 877, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/modules/psm/dataforms.wdr', - {'display-font-size': {}, - 'last-window-loc': (60, + {'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/dataforms_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 59402, 'selection_end': 59402}, - 'display-font-size': {}, 'last-window-loc': (127, 75, 650, - 1036)}), + 1036), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/docdroptarget.py', {'visual-state': {'first-line': 0, 'selection_start': 208, 'selection_end': 208}, + 'display-font-size': {}, 'last-window-loc': (625, 139, 761, - 806), - 'display-font-size': {}}), + 806)}), ('pangalactic/client/modules/psm/gridforms_wdr.py', {'visual-state': {'first-line': 28, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (190, 88, 801, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/gridformsgui.py', - {'display-font-size': {}, - 'last-window-loc': (80, + {'last-window-loc': (80, 80, 650, - 1030)}), + 1030), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/hack.py', {'last-window-loc': (60, 60, @@ -2489,279 +2508,284 @@ {'visual-state': {'first-line': 0, 'selection_start': 921, 'selection_end': 921}, + 'display-font-size': {}, 'last-window-loc': (473, 9, 765, - 797), - 'display-font-size': {}}), + 797)}), ('pangalactic/client/modules/psm/itemdataform.wdr', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (100, 90, 650, - 1020)}), + 1020), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/itemdataform_wdr.py', {'visual-state': {'first-line': 54, 'selection_start': 3803, 'selection_end': 3803}, - 'display-font-size': {}, 'last-window-loc': (130, 110, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/itemdroptarget.py', {'visual-state': {'first-line': 0, 'selection_start': 34, 'selection_end': 34}, + 'display-font-size': {}, 'last-window-loc': (597, 254, 916, - 748), - 'display-font-size': {}}), + 748)}), ('pangalactic/client/modules/psm/itemeditframe.py', - {'visual-state': {'first-line': 363, - 'selection_start': 18109, - 'selection_end': 18109}, - 'display-font-size': {}, - 'last-window-loc': (494, - 22, - 956, - 933)}), + {'visual-state': {'first-line': 0, + 'selection_start': 196944, + 'selection_end': 196944}, + 'last-window-loc': (502, + 129, + 957, + 933), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/itemsearchform.py', {'visual-state': {'first-line': 68, 'selection_start': 2, 'selection_end': 2}, + 'display-font-size': {}, 'last-window-loc': (449, 40, 919, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/modules/psm/loginform.wdr', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/loginform_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/nedgrid.py', - {'display-font-size': {}, - 'last-window-loc': (375, + {'last-window-loc': (375, 36, 1116, - 824)}), + 824), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/otherdocform.py', {'visual-state': {'first-line': 100, 'selection_start': 7615, 'selection_end': 7615}, + 'display-font-size': {}, 'last-window-loc': (546, 46, 875, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/modules/psm/partslistform.py', {'visual-state': {'first-line': 0, 'selection_start': 1359, 'selection_end': 1359}, - 'display-font-size': {}, 'last-window-loc': (407, 32, 870, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/partslisttreeframe.'\ 'py', {'visual-state': {'first-line': 0, 'selection_start': 2207, 'selection_end': 2207}, - 'display-font-size': {}, 'last-window-loc': (605, 95, 795, - 933)}), + 933), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/partslistview.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (544, 17, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pdmdoctree.py', {'visual-state': {'first-line': 94, 'selection_start': 5877, 'selection_end': 5877}, - 'display-font-size': {}, 'last-window-loc': (419, 302, 650, - 1078)}), + 1078), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pdmedittree.py', {'visual-state': {'first-line': 0, 'selection_start': 1911, 'selection_end': 1919}, - 'display-font-size': {}, 'last-window-loc': (293, 205, 918, - 915)}), + 915), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pdmgrid.py', {'visual-state': {'first-line': 13, 'selection_start': 2033, 'selection_end': 2033}, - 'display-font-size': {}, 'last-window-loc': (482, 64, 900, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pdmtree.py', {'visual-state': {'first-line': 263, 'selection_start': 11514, 'selection_end': 11514}, - 'display-font-size': {}, 'last-window-loc': (518, 45, 872, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pdmtreeevents.py', - {'display-font-size': {}, - 'last-window-loc': (110, + {'last-window-loc': (110, 110, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pgefdatatable.py', {'visual-state': {'first-line': 124, 'selection_start': 7162, 'selection_end': 7162}, + 'display-font-size': {}, 'last-window-loc': (311, 35, 788, - 1045), - 'display-font-size': {}}), + 1045)}), ('pangalactic/client/modules/psm/pgefdoctree.py', {'visual-state': {'first-line': 236, 'selection_start': 10886, 'selection_end': 10886}, - 'display-font-size': {}, 'last-window-loc': (474, 52, 650, - 1060)}), + 1060), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pgefedittree.py', - {'visual-state': {'first-line': 154, + {'visual-state': {'first-line': 149, 'selection_start': 8036, 'selection_end': 8036}, - 'display-font-size': {}, 'last-window-loc': (519, 99, 969, - 987)}), + 987), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pgefgrid.py', - {'visual-state': {'first-line': 222, - 'selection_start': 14313, - 'selection_end': 14313}, - 'display-font-size': {}, + {'visual-state': {'first-line': 0, + 'selection_start': 19268, + 'selection_end': 19268}, 'last-window-loc': (442, 114, 941, - 801)}), + 801), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pgefmaintree.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (110, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/pgeftree.py', - {'visual-state': {'first-line': 275, - 'selection_start': 13686, - 'selection_end': 13686}, - 'display-font-size': {}, - 'last-window-loc': (415, + {'visual-state': {'first-line': 209, + 'selection_start': 10839, + 'selection_end': 10864}, + 'last-window-loc': (424, 23, 998, - 971)}), + 971), + 'display-font-size': {}}), + ('pangalactic/client/modules/psm/pgefversiontree.py', + {'visual-state': {'first-line': 47, + 'selection_start': 3691, + 'selection_end': 3691}, + 'last-window-loc': (333, + 120, + 969, + 987), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/productdataform.py', - {'visual-state': {'first-line': 198, - 'selection_start': 8168, - 'selection_end': 8168}, - 'breakpoints': {251: (0, - None, - 1, - 0)}, + {'visual-state': {'first-line': 0, + 'selection_start': 1018, + 'selection_end': 1018}, + 'display-font-size': {}, 'last-window-loc': (502, 102, 993, - 875), - 'display-font-size': {}}), + 875)}), ('pangalactic/client/modules/psm/projectframe.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (50, 50, 650, - 1060)}), + 1060), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/propertiesform.py', {'visual-state': {'first-line': 0, 'selection_start': 1194, 'selection_end': 1194}, + 'display-font-size': {}, 'last-window-loc': (568, 215, 997, - 861), - 'display-font-size': {}}), + 861)}), ('pangalactic/client/modules/psm/psmevents.py', - {'last-window-loc': (750, + {'display-font-size': {}, + 'last-window-loc': (750, 255, 704, - 599), - 'display-font-size': {}}), + 599)}), ('pangalactic/client/modules/psm/psmtool.py', - {'visual-state': {'first-line': 540, - 'selection_start': 24797, - 'selection_end': 24797}, + {'visual-state': {'first-line': 277, + 'selection_start': 138606, + 'selection_end': 138606}, 'show-eol': 0, - 'display-font-size': {}, - 'show-whitespace': 0, - 'last-window-loc': (406, - 52, + 'last-window-loc': (415, + 56, 1034, - 904)}), + 904), + 'show-whitespace': 0, + 'display-font-size': {}}), ('pangalactic/client/modules/psm/quickcreate.py', {'visual-state': {'first-line': 0, 'selection_start': 1752, 'selection_end': 1752}, - 'display-font-size': {}, 'last-window-loc': (486, 31, 750, - 1068)}), + 1068), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/searchframe.py', {'visual-state': {'first-line': 114, 'selection_start': 8680, 'selection_end': 8680}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 894, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/temp.txt', {'visual-state': {'first-line': 0, 'selection_start': 0, @@ -2770,29 +2794,29 @@ {'visual-state': {'first-line': 0, 'selection_start': 224, 'selection_end': 224}, - 'display-font-size': {}, 'last-window-loc': (179, 40, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('pangalactic/client/modules/psm/toolbarpanel.py', {'visual-state': {'first-line': 0, 'selection_start': 1868, 'selection_end': 1868}, + 'display-font-size': {}, 'last-window-loc': (440, 167, 814, - 882), - 'display-font-size': {}}), + 882)}), ('pangalactic/client/modules/psm/toolpanel_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (70, 70, 650, - 1040), - 'display-font-size': {}}), + 1040)}), ('pangalactic/client/nedtoolkit.py', {'which-pyexec': {'linux': 'project'}, 'which-rundir': {'linux': 'project'}, @@ -2816,29 +2840,29 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (835, 18, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('pangalactic/client/pgpdm.cfg', {'visual-state': {'first-line': 0, 'selection_start': 34, 'selection_end': 46}, - 'display-font-size': {}, 'last-window-loc': (539, 277, 650, - 714)}), + 714), + 'display-font-size': {}}), ('pangalactic/client/pgpdm.log', {'visual-state': {'first-line': 0, 'selection_start': 141901, 'selection_end': 141901}, - 'display-font-size': {}, 'last-window-loc': (163, 212, 1169, - 862)}), + 862), + 'display-font-size': {}}), ('pangalactic/client/pgpdm.py', {'visual-state': {'first-line': 1085, 'selection_start': 180, @@ -2980,60 +3004,60 @@ 'visual-state': {'first-line': 0, 'selection_start': 2, 'selection_end': 2}, - 'display-font-size': {}, - 'show-whitespace': 0, 'last-window-loc': (372, 241, 996, - 617)}), + 617), + 'show-whitespace': 0, + 'display-font-size': {}}), ('pangalactic/client/proxyclass.py', - {'last-window-loc': (644, + {'display-font-size': {}, + 'last-window-loc': (644, 182, 650, - 628), - 'display-font-size': {}}), + 628)}), ('pangalactic/client/setup.py', {'visual-state': {'first-line': 0, 'selection_start': 772, 'selection_end': 772}, - 'display-font-size': {}, 'last-window-loc': (80, 80, 1137, - 1030)}), + 1030), + 'display-font-size': {}}), ('pangalactic/client/support/SOAP.py', - {'display-font-size': {}, - 'last-window-loc': (111, + {'last-window-loc': (111, 110, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/support/configdbbrowser.py', {'visual-state': {'first-line': 0, 'selection_start': 145, 'selection_end': 145}, + 'display-font-size': {}, 'last-window-loc': (269, 159, 877, - 995), - 'display-font-size': {}}), + 995)}), ('pangalactic/client/support/configdbbrowser_wdr.py', {'visual-state': {'first-line': 58, 'selection_start': 9709, 'selection_end': 9709}, - 'display-font-size': {}, 'last-window-loc': (483, 68, 759, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/support/convert.py', {'visual-state': {'first-line': 0, 'selection_start': 415, 'selection_end': 415}, - 'display-font-size': {}, 'last-window-loc': (897, 175, 650, - 684)}), + 684), + 'display-font-size': {}}), ('pangalactic/client/support/dbbrowser.py', {'visual-state': {'first-line': 84, 'selection_start': 3814, @@ -3060,11 +3084,11 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (60, 60, 1160, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/support/documentation', {'last-window-loc': (362, 33, @@ -3074,20 +3098,20 @@ {'visual-state': {'first-line': 64, 'selection_start': 3416, 'selection_end': 3416}, + 'display-font-size': {}, 'last-window-loc': (483, 57, 836, - 1063), - 'display-font-size': {}}), + 1063)}), ('pangalactic/client/support/httpserverinterface.py', {'visual-state': {'first-line': 0, 'selection_start': 482, 'selection_end': 482}, - 'display-font-size': {}, 'last-window-loc': (314, 96, 762, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/support/nedtoolkit_project_wing'\ 'ide', {'open-files': ['file:/home/bmuir/arena/pgpdm/datao'\ @@ -3103,15 +3127,6 @@ 31, 340, 963)),), - 'expr-history': ['import os', - 'from pydoc import *', - 'help(isinstance)', - 'import unittest', - 'help(unittest)', - 'q', - 'quit', - 'dir()', - 'dir(unittest)'], 'mgr-window-loc': {'Debug Properties: pgpdm.py (ar'\ 'ena/nedtoolkit)': (521, 332, @@ -3186,8 +3201,8 @@ 46, 650, 1000), - 'advisory.py (arena/pgpdm/io)': (235, - 82, + 'gridformsgui.py (arena/pgpdm/modules/psm)': (80, + 80, 650, 1030), 'item.py (arena/pgpdm/dataobjects)': (741, @@ -3234,26 +3249,26 @@ 255, 704, 599), - 'Suspicious Indentation in File': (545, - 467, - 510, - 266), - 'aboutbox.py (arena/pgpdm/modules/psm)': (550, - 82, - 751, - 1000), - 'convert.py (arena/pgpdm/support)': (897, - 175, - 650, - 684), 'unittestgui.py (arena/pgpdm/tests)': (70, 70, 650, 1040), + 'aboutbox.py (arena/pgpdm/modules/psm)': (550, + 82, + 751, + 1000), 'Debugger': (4, 28, 650, 993), + 'Suspicious Indentation in File': (545, + 467, + 510, + 266), + 'convert.py (arena/pgpdm/support)': (897, + 175, + 650, + 684), 'loginform.wdr (arena/pgpdm/modules/psm)': (60, 60, 650, @@ -3262,10 +3277,10 @@ 51, 650, 1070), - 'Debug Properties: nedtoolkit.py (arena/nedtoolkit)': (297, - 164, - 557, - 536), + 'searchframe.py (arena/pgpdm/modules/psm)': (370, + 86, + 954, + 1000), 'tasks.txt (arena/pgpdm/support)': (422, 39, 976, @@ -3286,6 +3301,10 @@ 60, 650, 1050), + 'loginform_wdr.py (arena/pgpdm/modules/psm)': (0, + 28, + 650, + 1000), 'itemsearchform.py (arena/pgpdm/modules/psm)': (435, 49, 650, @@ -3298,10 +3317,10 @@ 300, 600, 600), - 'proxy.txt': (30, - 79, - 650, - 1080), + 'test_nasa_advisory.py (arena/pgpdm/tests)': (422, + 55, + 1063, + 1000), 'Debug Properties: pgpdm.py (arena/pgpdm)': (521, 332, 614, @@ -3330,10 +3349,6 @@ 150, 500, 400), - 'Source Browser': (364, - 27, - 650, - 752), 'unittest.py (arena/pgpdm/tests)': (95, 64, 650, @@ -3358,10 +3373,10 @@ 60, 650, 1050), - 'objectreport.py (arena/pgpdm/io)': (404, - 94, - 963, - 794), + 'tasks.txt (arena/pgpdm)': (369, + 44, + 650, + 1090), 'gridforms_wdr.py (arena/pgpdm/modules/psm)': (190, 88, 801, @@ -3378,10 +3393,10 @@ 70, 650, 1040), - 'ToolkitImages.py (arena/pgpdm/images)': (60, - 40, - 650, - 1070), + 'test_pdmobject.py (arena/pgpdm/support)': (475, + 90, + 919, + 724), 'psmtool.py (arena/pgpdm_old/modules/psm)': (80, 80, 650, @@ -3418,10 +3433,10 @@ 13, 754, 1000), - 'Project: untitled_1.wpr': (54, - 44, - 340, - 1090), + 'clientgui.py (arena/pgpdm/modules/psm) #1': (332, + 84, + 1120, + 673), 'basewxpythontest.py (arena/pgpdm/tests)': (750, 96, 650, @@ -3454,14 +3469,14 @@ 90, 858, 983), - 'Project: nedserver_project (arena/ned_server)': (28, - 24, - 340, + 'acrobatwrapper.py (arena/pgpdm/io)': (182, + 5, + 875, 1090), - 'loginclass.py (arena/pgpdm)': (560, - 150, - 746, - 966), + 'Confirm overwrite': (545, + 550, + 510, + 100), 'Attach to Debug Process': (547, 435, 506, @@ -3518,8 +3533,8 @@ 6, 650, 1000), - 'gridformsgui.py (arena/pgpdm/modules/psm)': (80, - 80, + 'advisory.py (arena/pgpdm/io)': (235, + 82, 650, 1030), 'oid_doc.txt': (324, @@ -3538,10 +3553,10 @@ 161, 650, 1010), - 'searchframe.py (arena/pgpdm/modules/psm)': (370, - 86, - 954, - 1000), + 'Debug Properties: nedtoolkit.py (arena/nedtoolkit)': (297, + 164, + 557, + 536), 'Disk file is newer': (545, 546, 510, @@ -3550,10 +3565,10 @@ 100, 441, 1000), - 'aboutbox_wdr.py (arena/pgpdm/tests/modules/psm)': (671, - 29, - 871, - 1000), + 'Source Browser': (364, + 27, + 650, + 752), 'Debug Properties: clientgui.py (arena/nedtoolkit/modules/psm)': (521, 332, 557, @@ -3562,18 +3577,18 @@ 30, 340, 718), - 'clientgui.py (arena/pgpdm/modules/psm) #1': (332, - 84, - 1120, - 673), + 'Project: untitled_1.wpr': (54, + 44, + 340, + 1090), 'nauo.py (arena/pgpdm/dataobjects)': (701, 167, 650, 875), - 'Confirm overwrite': (545, - 550, - 510, - 100), + 'loginclass.py (arena/pgpdm)': (560, + 150, + 746, + 966), 'properties.py (/usr/lib/python2.1/site-packages/logging)': (60, 60, 650, @@ -3639,18 +3654,18 @@ 108, 935, 966), - 'acrobatwrapper.py (arena/pgpdm/io)': (182, - 5, - 875, + 'Project: nedserver_project (arena/ned_server)': (28, + 24, + 340, 1090), 'test_pdmobject.py (arena/pgpdm/tests)': (386, 36, 650, 1000), - 'test_datamanager.py (arena/pgpdm/tests)': (477, - 25, - 838, - 861), + 'bitmaps_wdr.py (arena/pgpdm/modules/psm)': (90, + 70, + 650, + 1040), 'rdbinterface.py (arena/ned_server)': (338, 41, 650, @@ -3683,18 +3698,18 @@ 124, 949, 836), - 'test_nasa_advisory.py (arena/pgpdm/tests)': (422, - 55, - 1063, - 1000), + 'proxy.txt': (30, + 79, + 650, + 1080), 'epimsproject.py (arena/pgpdm/dataobjects)': (239, 259, 759, 642), - 'test_pdmobject.py (arena/pgpdm/support)': (475, - 90, - 919, - 724), + 'ToolkitImages.py (arena/pgpdm/images)': (60, + 40, + 650, + 1070), 'clientgui.py (arena/pgpdm/modules/psm)': (369, 374, 1120, @@ -3747,10 +3762,14 @@ 30, 295, 1000), - 'bitmaps_wdr.py (arena/pgpdm/modules/psm)': (90, - 70, - 650, - 1040), + 'aboutbox_wdr.py (arena/pgpdm/tests/modules/psm)': (671, + 29, + 871, + 1000), + 'test_datamanager.py (arena/pgpdm/tests)': (477, + 25, + 838, + 861), 'Project: herbtutor.wpr (arena/herbtutor)': (16, 34, 340, @@ -3791,10 +3810,6 @@ 60, 650, 1050), - 'objectreport.py (arena/pgpdm)': (835, - 18, - 650, - 1070), 'runall.py (arena/pgpdm/tests)': (660, 60, 650, @@ -3851,10 +3866,10 @@ 107, 970, 945), - 'tasks.txt (arena/pgpdm)': (369, - 44, - 650, - 1090), + 'objectreport.py (arena/pgpdm/io)': (404, + 94, + 963, + 794), 'Bad file name': (545, 550, 510, @@ -3871,10 +3886,10 @@ 45, 1037, 1000), - 'loginform_wdr.py (arena/pgpdm/modules/psm)': (0, - 28, + 'objectreport.py (arena/pgpdm)': (835, + 18, 650, - 1000), + 1070), 'Could not start debug process': (545, 553, 510, @@ -3914,7 +3929,16 @@ 'test_user.py (arena/pgpdm/tests)': (401, 21, 893, - 1000)}}), + 1000)}, + 'expr-history': ['import os', + 'from pydoc import *', + 'help(isinstance)', + 'import unittest', + 'help(unittest)', + 'q', + 'quit', + 'dir()', + 'dir(unittest)']}), ('pangalactic/client/support/pgefclient_wingide', {'mgr-window-loc': {'Project: pgefclient_wingide (a'\ 'rena/PanGalactic/pangalactic/client/support)': (35, @@ -3933,11 +3957,11 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (703, 221, 650, - 470)}), + 470), + 'display-font-size': {}}), ('pangalactic/client/support/security_temp.py', {'visual-state': {'first-line': 0, 'selection_start': 14, @@ -3950,28 +3974,28 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (686, 115, 650, - 932), - 'display-font-size': {}}), + 932)}), ('pangalactic/client/support/sessionlog1.py', - {'last-window-loc': (429, + {'display-font-size': {}, + 'last-window-loc': (429, 67, 650, - 932), - 'display-font-size': {}}), + 932)}), ('pangalactic/client/support/tasks.txt', {'visual-state': {'first-line': 167, 'selection_start': 16153, 'selection_end': 16153}, 'show-eol': 0, - 'display-font-size': {}, - 'show-whitespace': 0, 'last-window-loc': (262, 17, 1166, - 1015)}), + 1015), + 'show-whitespace': 0, + 'display-font-size': {}}), ('pangalactic/client/support/test_itemsearchform.py', {'visual-state': {'first-line': 0, 'selection_start': 700, @@ -3992,65 +4016,65 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (791, 147, 650, - 510)}), + 510), + 'display-font-size': {}}), ('pangalactic/client/support/unknown:untitled-1.py', {'visual-state': {'first-line': 0, 'selection_start': 81, 'selection_end': 81}, 'show-eol': 0, - 'display-font-size': {'linux': ('lucidatypewriter', - 24)}, - 'show-whitespace': 0, 'last-window-loc': (362, 33, 911, - 1090)}), + 1090), + 'show-whitespace': 0, + 'display-font-size': {'linux': ('lucidatypewriter', + 24)}}), ('pangalactic/client/support/unknown:untitled-2.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (60, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/support/unknown:untitled-3.py', - {'display-font-size': {}, - 'last-window-loc': (825, + {'last-window-loc': (825, 128, 650, - 574)}), + 574), + 'display-font-size': {}}), ('pangalactic/client/support/unknown:untitled-4.py', - {'display-font-size': {}, - 'last-window-loc': (755, + {'last-window-loc': (755, 196, 761, - 806)}), + 806), + 'display-font-size': {}}), ('pangalactic/client/support/unknown:untitled-5.py', {'visual-state': {'first-line': 0, 'selection_start': 55, 'selection_end': 55}, - 'display-font-size': {}, 'last-window-loc': (640, 140, 650, - 876)}), + 876), + 'display-font-size': {}}), ('pangalactic/client/support/unknown:untitled-6.py', - {'display-font-size': {}, - 'last-window-loc': (80, + {'last-window-loc': (80, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/client/support/unknown:untitled-7.py', - {'display-font-size': {}, - 'last-window-loc': (417, + {'last-window-loc': (417, 225, 1136, - 861)}), + 861), + 'display-font-size': {}}), ('pangalactic/client/support/unknown:untitled_1.wpr', {'open-files': []}), ('pangalactic/client/support/unknown:untitled_2.wpr', @@ -4059,66 +4083,66 @@ {'visual-state': {'first-line': 0, 'selection_start': 200, 'selection_end': 200}, - 'display-font-size': {}, 'last-window-loc': (447, 146, 650, - 971)}), + 971), + 'display-font-size': {}}), ('pangalactic/client/support/xmlrpclib_orig.py', {'visual-state': {'first-line': 831, 'selection_start': 28416, 'selection_end': 28416}, + 'display-font-size': {}, 'last-window-loc': (518, 34, 768, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/support/xmlrpclib_proxy.py', {'visual-state': {'first-line': 960, 'selection_start': 33811, 'selection_end': 33811}, 'show-eol': 0, + 'display-font-size': {}, + 'show-whitespace': 0, 'last-window-loc': (420, 28, 761, - 829), - 'show-whitespace': 0, - 'display-font-size': {}}), + 829)}), ('pangalactic/client/tasks.txt', {'show-eol': 1, - 'display-font-size': {}, - 'show-whitespace': 1, 'last-window-loc': (369, 44, 650, - 1090)}), + 1090), + 'show-whitespace': 1, + 'display-font-size': {}}), ('pangalactic/client/temp/aboutbox.py', {'visual-state': {'first-line': 0, 'selection_start': 929, 'selection_end': 929}, - 'display-font-size': {}, 'last-window-loc': (114, 34, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/temp/aboutbox_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 1353, 'selection_end': 1353}, - 'display-font-size': {}, 'last-window-loc': (794, 36, 650, - 1060)}), + 1060), + 'display-font-size': {}}), ('pangalactic/client/temp/test_aboutbox.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 598}, - 'display-font-size': {}, 'last-window-loc': (361, 78, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/temptest.py', {'visual-state': {'first-line': 0, 'selection_start': 118, @@ -4146,20 +4170,20 @@ {'visual-state': {'first-line': 0, 'selection_start': 1994, 'selection_end': 1994}, - 'display-font-size': {}, 'last-window-loc': (372, 32, 960, - 995)}), + 995), + 'display-font-size': {}}), ('pangalactic/client/tests/baseobjecttest.py', {'visual-state': {'first-line': 0, 'selection_start': 1816, 'selection_end': 1816}, - 'display-font-size': {}, 'last-window-loc': (271, 188, 749, - 898)}), + 898), + 'display-font-size': {}}), ('pangalactic/client/tests/basewxpythontest.py', {'visual-state': {'first-line': 0, 'selection_start': 140, @@ -4173,20 +4197,20 @@ {'visual-state': {'first-line': 11, 'selection_start': 2702, 'selection_end': 2702}, - 'display-font-size': {}, 'last-window-loc': (671, 29, 871, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/objecttestcase.py', {'visual-state': {'first-line': 0, 'selection_start': 419, 'selection_end': 419}, - 'display-font-size': {}, 'last-window-loc': (563, 262, 876, - 767)}), + 767), + 'display-font-size': {}}), ('pangalactic/client/tests/runall.py', {'visual-state': {'first-line': 0, 'selection_start': 857, @@ -4315,527 +4339,545 @@ {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (415, 50, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_datamanager.py', {'visual-state': {'first-line': 0, 'selection_start': 2, 'selection_end': 2}, + 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/tests/test_epimsproject.py', {'visual-state': {'first-line': 0, 'selection_start': 69, 'selection_end': 69}, + 'display-font-size': {}, 'last-window-loc': (769, 104, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/tests/test_gidep_alert.py', {'visual-state': {'first-line': 0, 'selection_start': 57, 'selection_end': 57}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_gidep_problem_adviso'\ 'ry.py', {'visual-state': {'first-line': 0, 'selection_start': 68, 'selection_end': 68}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_idr.py', {'visual-state': {'first-line': 0, 'selection_start': 663, 'selection_end': 663}, - 'display-font-size': {}, 'last-window-loc': (367, 79, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_item.py', {'visual-state': {'first-line': 0, 'selection_start': 2471, 'selection_end': 2508}, + 'display-font-size': {}, 'last-window-loc': (117, 19, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/tests/test_itemdataform.py', {'visual-state': {'first-line': 3, 'selection_start': 2278, 'selection_end': 2342}, + 'display-font-size': {}, 'last-window-loc': (483, 83, 920, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/tests/test_itemeditframe.py', {'visual-state': {'first-line': 0, 'selection_start': 2, 'selection_end': 2}, + 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/tests/test_itemsearchform.py', {'visual-state': {'first-line': 0, 'selection_start': 891, 'selection_end': 891}, - 'display-font-size': {}, 'last-window-loc': (654, 95, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_localdb.py', {'visual-state': {'first-line': 0, 'selection_start': 689, 'selection_end': 689}, + 'display-font-size': {}, 'last-window-loc': (692, 83, 650, - 697), - 'display-font-size': {}}), + 697)}), ('pangalactic/client/tests/test_loginform.py', {'visual-state': {'first-line': 0, 'selection_start': 121, 'selection_end': 121}, + 'display-font-size': {}, 'last-window-loc': (876, 488, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/tests/test_nasa_advisory.py', {'visual-state': {'first-line': 0, 'selection_start': 843, 'selection_end': 843}, - 'display-font-size': {}, 'last-window-loc': (422, 55, 1063, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_nauo.py', {'visual-state': {'first-line': 0, 'selection_start': 146, 'selection_end': 146}, - 'display-font-size': {}, 'last-window-loc': (391, 276, 650, - 852)}), + 852), + 'display-font-size': {}}), ('pangalactic/client/tests/test_otherdocform.py', {'visual-state': {'first-line': 34, 'selection_start': 4862, 'selection_end': 4862}, + 'display-font-size': {}, 'last-window-loc': (372, 65, 920, - 984), - 'display-font-size': {}}), + 984)}), ('pangalactic/client/tests/test_part.py', {'visual-state': {'first-line': 0, 'selection_start': 266, 'selection_end': 266}, - 'display-font-size': {}, 'last-window-loc': (440, 21, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_partslist.py', {'visual-state': {'first-line': 0, 'selection_start': 97, 'selection_end': 97}, - 'display-font-size': {}, 'last-window-loc': (497, 33, 831, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_partslistform.py', {'visual-state': {'first-line': 0, 'selection_start': 157, 'selection_end': 183}, + 'display-font-size': {}, 'last-window-loc': (306, 150, 1139, - 991), - 'display-font-size': {}}), + 991)}), ('pangalactic/client/tests/test_pdmobject.py', {'visual-state': {'first-line': 0, 'selection_start': 17, 'selection_end': 17}, - 'display-font-size': {}, 'last-window-loc': (386, 36, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_person.py', {'visual-state': {'first-line': 0, 'selection_start': 63, 'selection_end': 63}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_pgefobject.py', {'visual-state': {'first-line': 0, 'selection_start': 42, 'selection_end': 42}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_pgpdm.py', {'visual-state': {'first-line': 0, 'selection_start': 677, 'selection_end': 677}, + 'display-font-size': {}, 'last-window-loc': (447, 16, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/client/tests/test_product.py', {'visual-state': {'first-line': 0, 'selection_start': 260, 'selection_end': 260}, - 'display-font-size': {}, 'last-window-loc': (0, 28, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_propertiesform.py', {'visual-state': {'first-line': 0, 'selection_start': 890, 'selection_end': 890}, - 'display-font-size': {}, 'last-window-loc': (387, 58, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_psmtool.py', {'visual-state': {'first-line': 0, 'selection_start': 944, 'selection_end': 944}, + 'display-font-size': {}, 'last-window-loc': (706, 53, 792, - 823), - 'display-font-size': {}}), + 823)}), ('pangalactic/client/tests/test_user.py', {'visual-state': {'first-line': 1, 'selection_start': 265, 'selection_end': 265}, - 'display-font-size': {}, 'last-window-loc': (351, 36, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/test_xmlrpcinterface.py', {'visual-state': {'first-line': 0, 'selection_start': 146, 'selection_end': 146}, - 'display-font-size': {}, 'last-window-loc': (80, 60, 650, - 1050)}), + 1050), + 'display-font-size': {}}), ('pangalactic/client/tests/unittest.py', {'visual-state': {'first-line': 0, 'selection_start': 49742, 'selection_end': 49742}, - 'display-font-size': {}, 'last-window-loc': (95, 64, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/tests/unittestgui.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (70, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/client/toolframe.py', {'visual-state': {'first-line': 35, 'selection_start': 1954, 'selection_end': 1954}, - 'display-font-size': {}, 'last-window-loc': (336, 45, 1037, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/client/wxButtonBar.py', - {'display-font-size': {}, - 'last-window-loc': (100, + {'last-window-loc': (100, 100, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('pangalactic/common/assemblycomponentusage.py', {'visual-state': {'first-line': 0, 'selection_start': 5766, 'selection_end': 5766}, - 'display-font-size': {}, 'last-window-loc': (0, 626, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('pangalactic/common/document.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (40, 30, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('pangalactic/common/link.py', {'visual-state': {'first-line': 0, 'selection_start': 285, 'selection_end': 285}, - 'display-font-size': {}, 'last-window-loc': (203, 52, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('pangalactic/common/nauo.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (30, 10, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('pangalactic/common/partslistfilerelationship.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (30, 20, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('pangalactic/common/person.py', {'visual-state': {'first-line': 0, 'selection_start': 1679, 'selection_end': 1679}, - 'display-font-size': {}, 'last-window-loc': (424, 130, 650, - 990)}), + 990), + 'display-font-size': {}}), ('pangalactic/common/pgefobject.py', {'visual-state': {'first-line': 0, 'selection_start': 1234, 'selection_end': 1234}, - 'display-font-size': {}, 'last-window-loc': (595, 9, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/common/product.py', {'visual-state': {'first-line': 0, 'selection_start': 1064, 'selection_end': 1064}, - 'display-font-size': {}, 'last-window-loc': (426, 162, 650, - 958)}), + 958), + 'display-font-size': {}}), ('pangalactic/common/productcomponentusage.py', {'visual-state': {'first-line': 0, 'selection_start': 430, 'selection_end': 430}, - 'display-font-size': {}, 'last-window-loc': (624, 129, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/common/productfilerelationship.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (100, 100, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('pangalactic/common/productmaster.py', {'visual-state': {'first-line': 64, 'selection_start': 4554, 'selection_end': 4554}, - 'display-font-size': {}, 'last-window-loc': (71, 111, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/common/productmodelmaster.py', {'visual-state': {'first-line': 90, 'selection_start': 4477, 'selection_end': 4477}, - 'display-font-size': {}, 'last-window-loc': (478, 164, 650, - 713)}), + 713), + 'display-font-size': {}}), ('pangalactic/common/productmodelversion.py', {'visual-state': {'first-line': 0, 'selection_start': 1165, 'selection_end': 1165}, - 'display-font-size': {}, 'last-window-loc': (131, 101, 650, - 883)}), + 883), + 'display-font-size': {}}), ('pangalactic/common/productversion.py', {'visual-state': {'first-line': 86, 'selection_start': 4325, 'selection_end': 4325}, - 'display-font-size': {}, 'last-window-loc': (413, 44, 650, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/common/project.py', {'visual-state': {'first-line': 29, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (411, 138, 650, - 982)}), + 982), + 'display-font-size': {}}), ('pangalactic/common/role.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (90, 90, 650, - 1020)}), + 1020), + 'display-font-size': {}}), ('pangalactic/common/utils/datamanager.py', {'visual-state': {'first-line': 0, 'selection_start': 261, 'selection_end': 261}, + 'display-font-size': {}, 'last-window-loc': (522, 27, 846, - 752), - 'display-font-size': {}}), + 752)}), ('pangalactic/common/utils/dbbrowser.py', {'visual-state': {'first-line': 111, 'selection_start': 6011, 'selection_end': 6016}, - 'display-font-size': {}, 'last-window-loc': (100, 100, 650, - 1010)}), + 1010), + 'display-font-size': {}}), ('pangalactic/common/utils/localdb.py', {'visual-state': {'first-line': 105, 'selection_start': 5263, 'selection_end': 5263}, + 'display-font-size': {}, 'last-window-loc': (30, 20, 650, - 1090), - 'display-font-size': {}}), + 1090)}), ('pangalactic/common/utils/pgefdatatable.py', {'visual-state': {'first-line': 0, 'selection_start': 1169, 'selection_end': 1174}, - 'display-font-size': {}, 'last-window-loc': (40, 40, 650, - 1070)}), + 1070), + 'display-font-size': {}}), ('pangalactic/enterprise/pgefadvisory.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (60, 60, 848, - 1050), - 'display-font-size': {}}), + 1050)}), ('pangalactic/enterprise/pgefobject.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (50, 50, 650, - 1060), - 'display-font-size': {}}), - ('pangalactic/enterprise/productmodelversion.py', - {'visual-state': {'first-line': 21, + 1060)}), + ('pangalactic/enterprise/productmaster.py', + {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, + 'last-window-loc': (60, + 40, + 650, + 1070), + 'display-font-size': {}}), + ('pangalactic/enterprise/productmodelmaster.py', + {'visual-state': {'first-line': 83, + 'selection_start': 4948, + 'selection_end': 4948}, + 'last-window-loc': (70, + 50, + 650, + 1060), + 'display-font-size': {}}), + ('pangalactic/enterprise/productmodelversion.py', + {'visual-state': {'first-line': 112, + 'selection_start': 5665, + 'selection_end': 5665}, 'last-window-loc': (40, 30, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('pangalactic/enterprise/productversion.py', - {'visual-state': {'first-line': 75, + {'visual-state': {'first-line': 96, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (110, 110, 650, - 1000), - 'display-font-size': {}}), + 1000)}), ('pangalactic/herbtutor/Cayenne.txt', - {'display-font-size': {}, - 'last-window-loc': (4, + {'last-window-loc': (4, 55, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('pangalactic/herbtutor/Cayenne.xml', - {'display-font-size': {}, - 'last-window-loc': (30, + {'last-window-loc': (30, 30, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('pangalactic/herbtutor/MENU.PY', - {'display-font-size': {}, - 'last-window-loc': (40, + {'last-window-loc': (40, 40, 650, - 680)}), + 680), + 'display-font-size': {}}), ('pangalactic/herbtutor/herbs', - {'display-font-size': {}, - 'last-window-loc': (763, + {'last-window-loc': (763, 256, 650, - 700)}), + 700), + 'display-font-size': {}}), ('pangalactic/herbtutor/herbtutor.py', {'show-eol': 0, - 'display-font-size': {}, - 'show-whitespace': 0, 'last-window-loc': (430, 116, 777, - 635)}), + 635), + 'show-whitespace': 0, + 'display-font-size': {}}), ('pangalactic/herbtutor/herbtutor.wpr', {'open-files': [], 'mgr-window-loc': {'Project: untitled_3.wpr': (28, @@ -4862,34 +4904,34 @@ 24, 340, 1090)}, - 'display-font-size': {}, 'last-window-loc': (382, 51, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('pangalactic/herbtutor/herbxml.py', - {'display-font-size': {}, - 'last-window-loc': (571, + {'last-window-loc': (571, 5, 774, - 1121)}), + 1121), + 'display-font-size': {}}), ('pangalactic/herbtutor/menu.py', - {'display-font-size': {}, - 'last-window-loc': (489, + {'last-window-loc': (489, 64, 650, - 1060)}), + 1060), + 'display-font-size': {}}), ('pangalactic/herbtutor/test.py', {'last-window-loc': (103, 77, 650, 1050)}), ('pangalactic/herbtutor/unknown:untitled-1.py', - {'display-font-size': {}, - 'last-window-loc': (254, + {'last-window-loc': (254, 82, 650, - 635)}), + 635), + 'display-font-size': {}}), ('pangalactic/herbtutor/unknown:untitled_1.wpr', {'open-files': []}), ('pangalactic/herbtutor/unknown:untitled_2.wpr', @@ -4897,77 +4939,77 @@ ('pangalactic/herbtutor/unknown:untitled_3.wpr', {'open-files': []}), ('pangalactic/ned_client/client.py', - {'display-font-size': {}, - 'last-window-loc': (137, + {'last-window-loc': (137, 27, 742, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/ned_client/clientgui.py', - {'display-font-size': {}, - 'last-window-loc': (129, + {'last-window-loc': (129, 58, 922, - 734)}), + 734), + 'display-font-size': {}}), ('pangalactic/ned_client/dataforms_wdr.py', - {'display-font-size': {}, - 'last-window-loc': (80, + {'last-window-loc': (80, 80, 650, - 694)}), + 694), + 'display-font-size': {}}), ('pangalactic/ned_client/httpserverinterface.py', - {'display-font-size': {}, - 'last-window-loc': (175, + {'last-window-loc': (175, 14, 797, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/ned_client/modules/plm/ms2filemain.py', - {'display-font-size': {}, - 'last-window-loc': (110, + {'last-window-loc': (110, 110, 650, - 664)}), + 664), + 'display-font-size': {}}), ('pangalactic/ned_client/modules/plm/plmtool.py', - {'display-font-size': {}, - 'last-window-loc': (365, + {'last-window-loc': (365, 29, 650, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/ned_client/modules/psm/clientgui.py', - {'display-font-size': {}, - 'last-window-loc': (114, + {'last-window-loc': (114, 45, 999, - 726)}), + 726), + 'display-font-size': {}}), ('pangalactic/ned_client/modules/psm/psmtool.py', - {'display-font-size': {}, - 'last-window-loc': (184, + {'last-window-loc': (184, 31, 783, - 724)}), + 724), + 'display-font-size': {}}), ('pangalactic/ned_client/ned/constants.py', - {'display-font-size': {}, - 'last-window-loc': (172, + {'last-window-loc': (172, 62, 650, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/ned_client/ned/datamanager.py', - {'display-font-size': {}, - 'last-window-loc': (50, + {'last-window-loc': (50, 40, 650, - 734)}), + 734), + 'display-font-size': {}}), ('pangalactic/ned_client/ned/item.py', - {'display-font-size': {}, - 'last-window-loc': (104, + {'last-window-loc': (104, 112, 692, - 705)}), + 705), + 'display-font-size': {}}), ('pangalactic/ned_client/ned/partslist.py', - {'display-font-size': {}, - 'last-window-loc': (214, + {'last-window-loc': (214, 84, 1008, - 536)}), + 536), + 'display-font-size': {}}), ('pangalactic/ned_client/ned_client', {'open-files': [], 'mgr-window-loc': {'Source Browser': (375, @@ -4979,61 +5021,61 @@ 340, 751)}}), ('pangalactic/ned_client/nedtoolkit.py', - {'display-font-size': {}, - 'last-window-loc': (152, + {'last-window-loc': (152, 62, 897, - 724)}), + 724), + 'display-font-size': {}}), ('pangalactic/ned_client/pdmtool.py', - {'display-font-size': {}, - 'last-window-loc': (40, + {'last-window-loc': (40, 40, 857, - 734)}), + 734), + 'display-font-size': {}}), ('pangalactic/ned_client/psmtool.py', - {'display-font-size': {}, - 'last-window-loc': (166, + {'last-window-loc': (166, 34, 875, - 714)}), + 714), + 'display-font-size': {}}), ('pangalactic/ned_client/unknown:untitled-1.py', - {'display-font-size': {}, - 'last-window-loc': (790, + {'last-window-loc': (790, 79, 650, - 704)}), + 704), + 'display-font-size': {}}), ('pangalactic/ned_client/unknown:untitled-2.py', - {'display-font-size': {}, - 'last-window-loc': (40, + {'last-window-loc': (40, 30, 847, - 744)}), + 744), + 'display-font-size': {}}), ('pangalactic/ned_client/unknown:untitled_1.wpr', {'open-files': []}), ('pangalactic/ned_client/wxButtonBar.py', - {'display-font-size': {}, - 'last-window-loc': (110, + {'last-window-loc': (110, 110, 890, - 664)}), + 664), + 'display-font-size': {}}), ('pangalactic/ned_data_objects/datamanager.py', - {'display-font-size': {}, - 'last-window-loc': (30, + {'last-window-loc': (30, 30, 650, - 744)}), + 744), + 'display-font-size': {}}), ('pangalactic/ned_data_objects/item.py', - {'display-font-size': {}, - 'last-window-loc': (521, + {'last-window-loc': (521, 73, 650, - 724)}), + 724), + 'display-font-size': {}}), ('pangalactic/ned_data_objects/nauo.py', - {'display-font-size': {}, - 'last-window-loc': (100, + {'last-window-loc': (100, 31, 650, - 744)}), + 744), + 'display-font-size': {}}), ('pangalactic/ned_server/ned_server', {'open-files': [], 'mgr-window-loc': {'Source Browser': (375, @@ -5058,11 +5100,11 @@ 340, 831)),)}), ('pangalactic/ned_server/nedbroker.py', - {'display-font-size': {}, - 'last-window-loc': (30, + {'last-window-loc': (30, 30, 650, - 744)}), + 744), + 'display-font-size': {}}), ('pangalactic/ned_server/nedserver_project', {'open-files': [], 'mgr-window-loc': {'Project: nedserver_project (ar'\ @@ -5074,76 +5116,76 @@ {'visual-state': {'first-line': 243, 'selection_start': 9763, 'selection_end': 9763}, - 'display-font-size': {}, 'last-window-loc': (338, 41, 650, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/ned_server/unknown:untitled_1.wpr', {'open-files': []}), ('pangalactic/ned_server/unknown:untitled_2.wpr', {'open-files': []}), ('pangalactic/nedold/modules/psm/clientgui.py', - {'display-font-size': {}, - 'last-window-loc': (30, + {'last-window-loc': (30, 30, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/dataobjects/constants.py', - {'display-font-size': {}, - 'last-window-loc': (97, + {'last-window-loc': (97, 59, 650, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/dataobjects/datamanager.py', - {'display-font-size': {}, - 'last-window-loc': (385, + {'last-window-loc': (385, 28, 650, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/dataobjects/item.py', - {'display-font-size': {}, - 'last-window-loc': (71, + {'last-window-loc': (71, 83, 650, - 714)}), + 714), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/dataobjects/nedobject.py', - {'display-font-size': {}, - 'last-window-loc': (401, + {'last-window-loc': (401, 53, 650, - 724)}), + 724), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/modules/psm/clientgui.py', - {'display-font-size': {}, - 'last-window-loc': (380, + {'last-window-loc': (380, 31, 811, - 1089)}), + 1089), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/modules/psm/gridforms_wdr.p'\ 'y', - {'display-font-size': {}, - 'last-window-loc': (70, + {'last-window-loc': (70, 70, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/modules/psm/gridformsgui.py', - {'display-font-size': {}, - 'last-window-loc': (80, + {'last-window-loc': (80, 80, 650, - 1030)}), + 1030), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/modules/psm/nedgrid.py', - {'display-font-size': {}, - 'last-window-loc': (815, + {'last-window-loc': (815, 33, 650, - 1069)}), + 1069), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/modules/psm/psmtool.py', - {'display-font-size': {}, - 'last-window-loc': (30, + {'last-window-loc': (30, 30, 650, - 744)}), + 744), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/nedtoolkit.py', {'which-pyexec': {'linux': 'project'}, 'which-rundir': {'linux': 'project'}, @@ -5169,11 +5211,11 @@ 1090)}), ('pangalactic/nedtoolkit/support/httpserverinterface'\ '.py', - {'display-font-size': {}, - 'last-window-loc': (420, + {'last-window-loc': (420, 28, 845, - 754)}), + 754), + 'display-font-size': {}}), ('pangalactic/nedtoolkit/support/nedtoolkit_project_'\ 'wingide', {'open-files': [], @@ -5209,13 +5251,13 @@ ('pangalactic/nedtoolkit/support/unknown:untitled-1.'\ 'py', {'show-eol': 0, - 'display-font-size': {'linux': ('lucidatypewriter', - 24)}, - 'show-whitespace': 0, 'last-window-loc': (362, 33, 911, - 1090)}), + 1090), + 'show-whitespace': 0, + 'display-font-size': {'linux': ('lucidatypewriter', + 24)}}), ('pangalactic/nedtoolkit/support/unknown:untitled_1.'\ 'wpr', {'open-files': []}), @@ -5223,11 +5265,11 @@ {'visual-state': {'first-line': 372, 'selection_start': 17113, 'selection_end': 17113}, - 'display-font-size': {}, 'last-window-loc': (80, 80, 650, - 1030)}), + 1030), + 'display-font-size': {}}), ('pangalactic/pgpdm_test/support/nedtoolkit_project_'\ 'wingide', {'open-windows': (('manager', @@ -5249,134 +5291,170 @@ {'visual-state': {'first-line': 0, 'selection_start': 311, 'selection_end': 311}, - 'display-font-size': {}, 'last-window-loc': (509, 42, 928, - 1000)}), + 1000), + 'display-font-size': {}}), ('pangalactic/tools/xlate_list.py_new', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, - 'display-font-size': {}, 'last-window-loc': (862, 78, 650, - 1040)}), + 1040), + 'display-font-size': {}}), ('pangalactic/tools/xlator.py', {'visual-state': {'first-line': 0, 'selection_start': 334, 'selection_end': 334}, - 'display-font-size': {}, 'last-window-loc': (425, 31, 866, - 1000)}), + 1000), + 'display-font-size': {}}), + ('pangalactic/utils/basegrid.py', + {'visual-state': {'first-line': 187, + 'selection_start': 7413, + 'selection_end': 7413}, + 'last-window-loc': (287, + 53, + 650, + 1060), + 'display-font-size': {}}), + ('pangalactic/utils/configdbbrowser.py', + {'visual-state': {'first-line': 143, + 'selection_start': 0, + 'selection_end': 0}, + 'last-window-loc': (343, + 48, + 828, + 1000), + 'display-font-size': {}}), ('pangalactic/utils/customizegrid_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 0, 'selection_end': 0}, + 'display-font-size': {}, 'last-window-loc': (20, 10, 650, - 1090), + 1090)}), + ('pangalactic/utils/data_utils.py', + {'visual-state': {'first-line': 3, + 'selection_start': 645, + 'selection_end': 1392}, + 'last-window-loc': (485, + 137, + 1039, + 936), 'display-font-size': {}}), ('pangalactic/utils/datamanager.py', - {'visual-state': {'first-line': 0, - 'selection_start': 64109, - 'selection_end': 64109}, - 'last-window-loc': (398, - 43, + {'visual-state': {'first-line': 812, + 'selection_start': 9745, + 'selection_end': 9795}, + 'display-font-size': {}, + 'last-window-loc': (407, + 47, 1053, - 1040), - 'display-font-size': {}}), + 1040)}), ('pangalactic/utils/localdb.py', - {'visual-state': {'first-line': 279, - 'selection_start': 11885, - 'selection_end': 11893}, - 'last-window-loc': (445, - 63, - 835, - 1050), - 'display-font-size': {}}), + {'visual-state': {'first-line': 1498, + 'selection_start': 35786, + 'selection_end': 35786}, + 'display-font-size': {}, + 'last-window-loc': (454, + 67, + 961, + 1050)}), ('pangalactic/utils/objectreport.py', {'visual-state': {'first-line': 14, 'selection_start': 2953, 'selection_end': 2953}, + 'display-font-size': {}, 'last-window-loc': (666, 61, 750, - 1008), - 'display-font-size': {}}), + 1008)}), ('pangalactic/utils/pdfreport.py', {'visual-state': {'first-line': 0, 'selection_start': 1761, 'selection_end': 1761}, + 'display-font-size': {}, 'last-window-loc': (501, 15, 825, - 1090), - 'display-font-size': {}}), + 1090)}), ('pangalactic/utils/pgefdatatable.py', {'visual-state': {'first-line': 6, 'selection_start': 1389, 'selection_end': 1389}, + 'display-font-size': {}, 'last-window-loc': (408, 15, 850, - 1080), - 'display-font-size': {}}), - ('pangalactic/utils/xmlrpcinterface.py', - {'visual-state': {'first-line': 0, - 'selection_start': 0, - 'selection_end': 0}, - 'last-window-loc': (512, - 32, + 1080)}), + ('pangalactic/utils/pystrptime.py', + {'visual-state': {'first-line': 435, + 'selection_start': 875, + 'selection_end': 875}, + 'display-font-size': {}, + 'last-window-loc': (100, + 100, 650, - 1066), - 'display-font-size': {}}), + 1010)}), + ('pangalactic/utils/xmlrpcinterface.py', + {'visual-state': {'first-line': 54, + 'selection_start': 2213, + 'selection_end': 2213}, + 'display-font-size': {}, + 'last-window-loc': (521, + 36, + 953, + 1066)}), ('proxy.txt', {'visual-state': {'first-line': 16, 'selection_start': 4388, 'selection_end': 4419}, - 'display-font-size': {}, 'last-window-loc': (30, 79, 650, - 1080)}), + 1080), + 'display-font-size': {}}), ('tambo1.txt', {'visual-state': {'first-line': 0, 'selection_start': 1457, 'selection_end': 1457}, - 'display-font-size': {}, 'last-window-loc': (420, 399, 650, - 711)}), + 711), + 'display-font-size': {}}), ('temp/unnamed_wdr.py', {'visual-state': {'first-line': 0, 'selection_start': 1979, 'selection_end': 2040}, - 'display-font-size': {}, 'last-window-loc': (20, 20, 650, - 1090)}), + 1090), + 'display-font-size': {}}), ('unknown:untitled-1.py', - {'display-font-size': {}, - 'last-window-loc': (712, + {'last-window-loc': (712, 299, 758, - 626)}), + 626), + 'display-font-size': {}}), ('unknown:untitled-2.py', {'visual-state': {'first-line': 0, 'selection_start': 19, 'selection_end': 19}, - 'display-font-size': {}, 'last-window-loc': (80, 80, 650, - 1030)}), + 1030), + 'display-font-size': {}}), ('unknown:untitled_2.wpr', {'open-windows': (('manager', (('Project: untitled_2.wpr', @@ -5394,20 +5472,20 @@ 551, 708)),)}), ('unnamed_wdr.py', - {'display-font-size': {}, - 'last-window-loc': (215, + {'last-window-loc': (215, 35, 650, - 754)}), + 754), + 'display-font-size': {}}), ('xmlrpclib-1.0.1/xmlrpclib_proxy.py', {'visual-state': {'first-line': 1193, 'selection_start': 39617, 'selection_end': 39617}, - 'display-font-size': {}, 'last-window-loc': (475, 19, 916, - 1080)})] + 1080), + 'display-font-size': {}})] version = '1.0' which-console = {'linux': 'default'} which-env-vars = {'linux': 'default'} From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:03:38 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:03:39 2003 Subject: [Pangalactic-commits] added versiontree to repository Message-ID: <200310071803.h97I3co6004551@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py None 1.1 Log message: added versiontree to repository From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:06:48 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:06:50 2003 Subject: [Pangalactic-commits] removed some debug prints Message-ID: <200310071806.h97I6mgh004652@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.1 1.2 PanGalactic/pangalactic/utils/localdb.py 1.34 1.35 Log message: removed some debug prints Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.34 PanGalactic/pangalactic/utils/localdb.py:1.35 --- PanGalactic/pangalactic/utils/localdb.py:1.34 Tue Oct 7 13:59:04 2003 +++ PanGalactic/pangalactic/utils/localdb.py Tue Oct 7 14:06:47 2003 @@ -1538,7 +1538,6 @@ def getPvByPm(self, pm_id, pm_context): results = [] dict_contents = self.dbroot[self.PVBYPRIMARYKEY].items() - print 'pvbyprimary:',dict_contents for key, object in dict_contents: if key[:-1] == (pm_id, pm_context): results.append(object) Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.1 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.2 --- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.1 Tue Oct 7 14:03:36 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py Tue Oct 7 14:06:46 2003 @@ -159,7 +159,6 @@ objs = datamanager.getVersionTreeObjects(version_obj) - print 'tree objs:',objs if objs: self.SetItemHasChildren(version_node, true) @@ -182,17 +181,4 @@ self.Expand(pv_treeid) if temp_pmm: self.Expand(pmm_treeid) - - - #if objs: - #self.SetItemHasChildren(rootnode, true) - - #for obj in objs: - #if obj.state <> objectstatus.DELETE: - - #foo = obj.of_pm_id + "." + obj.of_pm_id_context - #treeid = self.AppendItem(rootnode, foo) - #self.SetPyData(treeid, ['version', obj.pgef_oid]) - #self.SetItemImage(treeid, self.itemicon) - #self.SetItemImage(treeid, self.itemicon, wxTreeItemIcon_Selected) - #self.Expand(rootnode) + From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:12:32 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:12:33 2003 Subject: [Pangalactic-commits] fixed names in version tree Message-ID: <200310071812.h97ICW57004815@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.2 1.3 PanGalactic/pangalactic/utils/datamanager.py 1.38 1.39 Log message: fixed names in version tree Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.2 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.3 --- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.2 Tue Oct 7 14:06:46 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py Tue Oct 7 14:12:30 2003 @@ -150,7 +150,7 @@ version_node = pv_treeid if temp_pmm: - spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pmm.id + spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + '.' + temp_pmm.id pmm_treeid = self.AppendItem(pv_treeid, spam) self.Expand(pmm_treeid) version_obj = temp_pmm Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.38 PanGalactic/pangalactic/utils/datamanager.py:1.39 --- PanGalactic/pangalactic/utils/datamanager.py:1.38 Tue Oct 7 13:59:04 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Tue Oct 7 14:12:30 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.38 $"[11:-2] +__version__ = "$Revision: 1.39 $"[11:-2] import time import mx.DateTime @@ -101,7 +101,7 @@ product_master = ProductMaster(id = PartNumber, project_id = self.currentProject, id_context = self.currentProject) - print product_master + #print product_master if product_master and Revision: #print 'Creating product version' @@ -109,7 +109,7 @@ project_id = self.currentProject, id = Revision, id_context = self.currentProject) - print product_version + #print product_version if product_version and ModelType: #print 'Creating product model master' From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:19:20 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:19:22 2003 Subject: [Pangalactic-commits] removed prints from data-utils Message-ID: <200310071819.h97IJKAV004999@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/data_utils.py 1.5 1.6 Log message: removed prints from data-utils Index: PanGalactic/pangalactic/utils/data_utils.py diff -u PanGalactic/pangalactic/utils/data_utils.py:1.5 PanGalactic/pangalactic/utils/data_utils.py:1.6 --- PanGalactic/pangalactic/utils/data_utils.py:1.5 Tue Oct 7 13:59:04 2003 +++ PanGalactic/pangalactic/utils/data_utils.py Tue Oct 7 14:19:19 2003 @@ -6,10 +6,10 @@ from pangalactic.enterprise.docrep import DocRep def createCompoundKey(obj): + print obj # if we have a pmv, compound key is # (id, of_pmm_id, of_pv_id, of_pm_id, of_pm_id_context) -# if obj.__class__.__name__ == 'ProductModelVersion': if obj.__class__.__name__ == 'ProductModelVersion': # DEBUGGING # print "creating compound key for obj of class %s" % obj.__class__.__name__ @@ -23,14 +23,7 @@ elif obj.__class__.__name__ == 'ProductMaster': temp = (obj.id) - - #print temp return temp - #else: - # print '---------------------------------------------' - # print 'create compoundkey: returning None' - # print '---------------------------------------------' - def createACUSearchByComponent(acu_obj): search_str = [] From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:23:06 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:23:07 2003 Subject: [Pangalactic-commits] added obj checknig in save object Message-ID: <200310071823.h97IN6Bn005065@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/localdb.py 1.35 1.36 Log message: added obj checknig in save object Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.35 PanGalactic/pangalactic/utils/localdb.py:1.36 --- PanGalactic/pangalactic/utils/localdb.py:1.35 Tue Oct 7 14:06:47 2003 +++ PanGalactic/pangalactic/utils/localdb.py Tue Oct 7 14:23:05 2003 @@ -973,14 +973,17 @@ self.dbroot[savedict][id] = obj self.dbroot[self.OIDLOOKUP][obj.pgef_oid] = savedict #print "saved local object", savedict, id - compound_key = data_utils.createCompoundKey(obj) - print 'compound_key is:', compound_key - self.saveCompoundKey(obj, compound_key) + if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']: + compound_key = data_utils.createCompoundKey(obj) + #print 'compound_key is:', compound_key + self.saveCompoundKey(obj, compound_key) except Exception, e: print "Eek. An EXCEPTION. localdb.saveObject" print e import traceback traceback.print_exc() + + def saveCompoundKey(self, obj, key): if obj.__class__.__name__ == 'ProductModelVersion': From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:24:24 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:24:25 2003 Subject: [Pangalactic-commits] remove the print yet again Message-ID: <200310071824.h97IOO1d005124@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/data_utils.py 1.6 1.7 Log message: remove the print yet again Index: PanGalactic/pangalactic/utils/data_utils.py diff -u PanGalactic/pangalactic/utils/data_utils.py:1.6 PanGalactic/pangalactic/utils/data_utils.py:1.7 --- PanGalactic/pangalactic/utils/data_utils.py:1.6 Tue Oct 7 14:19:19 2003 +++ PanGalactic/pangalactic/utils/data_utils.py Tue Oct 7 14:24:22 2003 @@ -6,7 +6,7 @@ from pangalactic.enterprise.docrep import DocRep def createCompoundKey(obj): - print obj + #print obj # if we have a pmv, compound key is # (id, of_pmm_id, of_pv_id, of_pm_id, of_pm_id_context) From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:27:51 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:27:52 2003 Subject: [Pangalactic-commits] removed cruft Message-ID: <200310071827.h97IRp2W005176@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/localdb.py 1.36 1.37 Log message: removed cruft Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.36 PanGalactic/pangalactic/utils/localdb.py:1.37 --- PanGalactic/pangalactic/utils/localdb.py:1.36 Tue Oct 7 14:23:05 2003 +++ PanGalactic/pangalactic/utils/localdb.py Tue Oct 7 14:27:49 2003 @@ -962,10 +962,6 @@ except: return None - # remove next time you see me - #def SaveObject(self, savedict, id, obj): - ##eventuall remove this when all calls have been renamed - #self.saveObject(savedict, id, obj) def saveObject(self, savedict, id, obj): #print "localdb.saveobject", savedict, id From bmuir at ned.gsfc.nasa.gov Tue Oct 7 15:35:03 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 7 14:35:05 2003 Subject: [Pangalactic-commits] changed label creation in pgefversiontree Message-ID: <200310071835.h97IZ3dx005227@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.3 1.4 Log message: changed label creation in pgefversiontree Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.3 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.4 --- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.3 Tue Oct 7 14:12:30 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py Tue Oct 7 14:35:01 2003 @@ -166,8 +166,8 @@ for obj in objs: if obj.state <> objectstatus.DELETE: - foo = obj.of_pm_id + "." + obj.of_pm_id_context - treeid = self.AppendItem(version_node, foo) + treelabel = self.createTreeLabel(obj) + treeid = self.AppendItem(version_node, treelabel) self.SetPyData(treeid, ['version', obj.pgef_oid]) self.SetItemImage(treeid, self.itemicon) self.SetItemImage(treeid, self.itemicon, wxTreeItemIcon_Selected) @@ -181,4 +181,15 @@ self.Expand(pv_treeid) if temp_pmm: self.Expand(pmm_treeid) + + def createTreeLabel(self, obj): + if obj.__class__.__name__ == 'ProductModelVersion': + temp = '%s.%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id) + elif obj.__class__.__name__ == 'ProductModelMaster': + temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id) + elif obj.__class__.__name__ == 'ProductVersion': + temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.id) + elif obj.__class__.__name__ == 'ProductMaster': + temp = '%s.%s' % (obj.id, obj.id_context) + return temp From waterbug at ned.gsfc.nasa.gov Tue Oct 7 15:46:08 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 14:46:08 2003 Subject: [Pangalactic-commits] Updated unit test for new XmlrpcInterface. Message-ID: <200310071846.h97Ik89a005317@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py 1.4 1.5 Log message: Updated unit test for new XmlrpcInterface. Index: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py diff -u PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.4 PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.5 --- PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.4 Sat Sep 20 18:15:19 2003 +++ PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py Tue Oct 7 14:46:06 2003 @@ -1,90 +1,59 @@ -import dataobjects.item -import dataobjects.nauo -import dataobjects.user -import dataobjects.part -import xmlrpclib +# $Source: /repo/step_testbed/PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py,v $ +""" +Functional test for pangalactic.util.xmlrpcinterface + - this test code assumes there is a PGER Server instance + running +""" + +import os +from pprint import pprint +from pangalactic.utils.xmlrpcinterface import XmlrpcInterface +from pangalactic.enterprise.project import Project +from pangalactic.enterprise.productmaster import ProductMaster as PM +from pangalactic.enterprise.productversion import ProductVersion as PV +from pangalactic.enterprise.productmodelmaster import ProductModelMaster as PMM +from pangalactic.enterprise.productmodelversion import ProductModelVersion as PMV + +f = open('../../test/IDTEST') +savedid = f.read() + +testid = str(int(savedid) + 1) +f.close() +f = open('../../test/IDTEST', 'w') +f.write(testid) +f.close() + +# create test data +teststring = 'XMLRPC-Test-' +projid = teststring + testid +projname = teststring + testid + ' Project' +pmid = teststring + testid + '-PM' +pmname = teststring + testid + ' Product (Master)' +pvname = teststring + testid + ' Product, Version A' +pvid = teststring + testid + '-PV' +pmmid = teststring + testid + '-PMM' +pmvid = teststring + testid + '-PMV' +pmmname = teststring + testid + ' Model (Master)' +pmvname = teststring + testid + ' Model, Version A-1' + +# create test objects +p = Project(id=projid, id_context='TEST', name=projname) +p.popTestData() +pm = PM(id=pmid, id_context='TEST', _project=p, name=pmname) +pm.popTestData() +pv = PV(id=pvid, id_context='TEST', _of_master=pm, name=pvname) +pv.popTestData() +pmm = PMM(id=pmmid, id_context='TEST', _of_version=pv, name=pmmname) +pmm.popTestData() +pmv = PMV(id=pmvid, id_context='TEST', _of_model_master=pmm, name=pmvname) +pmv.popTestData() + +xcli = XmlrpcInterface('beeblebrox.gsfc.nasa.gov', '8080') + +# create a pm just for getting its pv's ... +h2g2 = Project(id='H2G2', id_context='TEST') +pm1 = PM(id='HOG', id_context='TEST', _project=h2g2) +res = xcli.getPvByPm(pm1) +print res[0] - -class XmlrpcInterface: - def __init__(self, server, port): - self._SERVER = server - self._PORT = port - self._RPC = None - - def Connect(self): - self._RPC = xmlrpclib.Server('%s%s:%s' % ('http://' , self._SERVER, self._PORT)) - - def Disconnect(self): - self._SERVER = None - self._PORT = None - self._RPC = None - - def GetItemByProject(self, project): - return self._RPC.GetItemByProject(project) - - def GetItem(self, ItemId): - return self._RPC.GetItem(ItemId) - - def GetNauo(self, NauoId): - return self._RPC.GetNAUO(NauoId) - - def GetNauosByAssemblyID(self, AssemblyId): - return self._RPC.GetNauosByAssemblyId(AssemblyId) - - def GetNauosByComponentID(self, ComponentId): - return self._RPC.GetNAUOsByComponentID(ComponentId) - - def GetPerson(self, UserName): - return self._RPC.GetPerson(UserName) - - def GetPersonRoles(self, UserName): - return self._RPC.GetPersonRoles(UserName) - - def GetProject(self, project): - return self._RPC.GetProject(project) - - def SearchItem(self, ItemId): - return self._RPC.SearchItem(ItemId) - - def AddItem(self, itemobj): - return self._RPC.AddItem(itemobj) - - def AddNauo(self, nauoobj): - return self._RPC.AddNauo(nauoobj) - - def DelObjects(self, objlist): - return self._RPC.DelObjects(objlist) - - def AddObjects(self, objlist): - return self._RPC.AddObjects(objlist) - - def DelNauo(self, nauo): - return self._RPC.delNauo(nauo) - - def DelIdr(self, idr): - return self._RPC.delIdr(idr) - - def AddPartsList(self, partslist): - return self._RPC.AddPartsList(partslist) - - def GetPartsList(self, partslistid): - return self._RPC.GetPartsList(partslistid) - - def AddDocument(self, doc): - return self._RPC.AddDocument(doc) - - def GetDocument(self, docid): - return self._RPC.GetDocument(docid) - - def AddIDR(self, idr): - return self._RPC.AddIDR(idr) - - def GetIDR(self, idrid): - return self._RPC.GetIDR(idrid) - - def GetIDRByDocumentID(self, docid): - return self._RPC.GetIDRByDocumentID(docid) - - def GetIDRByItemID(self, itemid): - return self._RPC.GetIDRByItemID(itemid) From pbear at ned.gsfc.nasa.gov Tue Oct 7 16:16:16 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 7 15:16:18 2003 Subject: [Pangalactic-commits] More tweaking for wfprocesses Message-ID: <200310071916.h97JGGbe006011@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.36 1.37 PanGalactic/pangalactic/utils/localdb.py 1.37 1.38 Log message: More tweaking for wfprocesses Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.36 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.37 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.36 Tue Oct 7 13:53:54 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Tue Oct 7 15:16:14 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.36 2003/10/07 17:53:54 pbear Exp $ +# $Id: pgefadvisory.py,v 1.37 2003/10/07 19:16:14 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.36 $"[11:-2] +__version__ = "$Revision: 1.37 $"[11:-2] import os.path import string @@ -67,7 +67,7 @@ # leave this here... I use it to generate old data -vwk # # now = mx.DateTime.DateFromTicks(mx.DateTime.now()) -# earlier = now + mx.DateTime.RelativeDateTime(days=-15) +# earlier = now + mx.DateTime.RelativeDateTime(days=-10) # self.pger_create_datetime = earlier # self.pger_mod_datetime = earlier # self.create_datetime = earlier Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.37 PanGalactic/pangalactic/utils/localdb.py:1.38 --- PanGalactic/pangalactic/utils/localdb.py:1.37 Tue Oct 7 14:27:49 2003 +++ PanGalactic/pangalactic/utils/localdb.py Tue Oct 7 15:16:15 2003 @@ -183,8 +183,8 @@ #print "localdb.savepmv:", prod._of_master.id self.dbroot[self.PRODUCTMODELVERSION][prod.pgef_oid] = prod self.dbroot[self.OIDLOOKUP][prod.pgef_oid] = self.PRODUCTMODELVERSION - compound_key = data_utils.createCompoundKey(prod) - self.dbroot[self.PMVBYPRIMARYKEY][compound_key] = prod + #compound_key = data_utils.createCompoundKey(prod) + #self.dbroot[self.PMVBYPRIMARYKEY][compound_key] = prod # self.SavePMVParents(prod) self.Commit() @@ -971,17 +971,23 @@ #print "saved local object", savedict, id if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']: compound_key = data_utils.createCompoundKey(obj) - #print 'compound_key is:', compound_key - self.saveCompoundKey(obj, compound_key) + self.saveCompoundKey(obj, compound_key) + except Exception, e: - print "Eek. An EXCEPTION. localdb.saveObject" - print e - import traceback - traceback.print_exc() + print "Eek. An EXCEPTION. localdb.saveObject", e +# print e +# import traceback +# traceback.print_exc() - + def makeCompoundKey(self, obj): + compound_key = None + if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']: + compound_key = data_utils.createCompoundKey(obj) + return compound_key + def saveCompoundKey(self, obj, key): + dictname = None if obj.__class__.__name__ == 'ProductModelVersion': dictname = self.PMVBYPRIMARYKEY elif obj.__class__.__name__ == 'ProductModelMaster': @@ -990,7 +996,8 @@ dictname = self.PVBYPRIMARYKEY elif obj.__class__.__name__ == 'ProductMaster': dictname = self.PMBYPRIMARYKEY - self.dbroot[dictname][key] = obj + if dictname: + self.dbroot[dictname][key] = obj def AppendUncommittedData(self, uncommitteddict, unsavedlist): From waterbug at ned.gsfc.nasa.gov Tue Oct 7 16:45:55 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 15:45:56 2003 Subject: [Pangalactic-commits] First cut at XmlrpcInterface -- still more methods to do! Message-ID: <200310071945.h97Jjt2M006768@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.7 1.8 Log message: First cut at XmlrpcInterface -- still more methods to do! Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.7 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.8 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.7 Fri Sep 26 14:42:57 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 7 15:45:53 2003 @@ -1,3 +1,12 @@ +# $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/xmlrpcinterface.py,v $ + +""" +PanGalactic Client XMLRPC Interfaces + +@version: $Revision: 1.8 $ +""" + +__version__ = "$Revision: 1.8 $"[11:-2] import xmlrpclib import types @@ -38,13 +47,15 @@ if isinstance(object_list, types.ListType): extracts = [ self._factory.extract(o) for o in object_list ] - date_time_stamp = self._RPC.addObjects(extracts) + newexts = self._RPC.addObjects(extracts) + newobjects = self._factory.rememberAll(newexts) else: extracts = [ self._factory.extract(o) ] - date_time_stamp = self._RPC.addObjects(extracts) + newexts = self._RPC.addObjects(extracts) + newobjects = self._factory.rememberAll(newexts) #print 'sent one object extract:' #print extracts - return date_time_stamp + return newobjects # TODO: implement this ... @@ -61,44 +72,59 @@ # return 1 - def GetDataByOid(self, dataname, fieldname, oid): + def getObjects(self, classname, fields, refs=0, subtypes=0, + objs=[]): + # eventually call only this? --vwk 23may2003 + data = self._RPC.getObjects(dataname, refs, subtypes, fields) + if data: + if refs: + return [self._factory.rememberAll(data, objs)] + else: + return [self._factory.remember(data, objs)] + + def getDataByOid(self, dataname, fieldname, oid): # eventually call only this? --vwk 23may2003 # e.g., GetDataByOid("ProjectModelVersion", "pgef_oid", obj.pgef_oid) - data = self._RPC.getObjects(dataname, '%s=%s' % (fieldname, oid)) + crit = dict([fieldname, oid]) + data = self._RPC.getObjects(dataname, 0, 0, crit) if data: - return [self._factory.reconstitute(x) for x in data] - - def getPvByPm(self, pm_id, pm_id_context): - args = ('of_pm_id=%s' % pm_id, - 'of_pm_id_context=%s' % pm_id_context) - data = self._RPC.getObjects('ProductVersion', *args) + return [self._factory.rememberAll(data)] + + def getPvByPm(self, pm): + crit = {'of_pm_id' : pm.id, + 'of_pm_id_context' : pm.id_context} + data = self._RPC.getObjects('ProductVersion', 0, 0, crit) if data: - return [self._factory.reconstitute(x) for x in data] - - def getPmmByPv(self, pm_id, pm_id_context, pv_id): - args = ('of_pm_id=%s' % pm_id, - 'of_pm_id_context=%s' % pm_id_context, - 'of_pv_id=%s'%pv_id) - data = self._RPC.getObjects('ProductModelMaster', *args) + return [self._factory.remember(x, [pm]) + for x in data] + + def getPmmByPv(self, pv): + crit = {'of_pm_id' : pv.of_pm_id, + 'of_pm_id_context' : pv.of_pm_id_context, + 'of_pv_id' : pv.id} + data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit) if data: - return [self._factory.reconstitute(x) for x in data] - - def getPmvByPmm(self, pm_id, pm_id_context, pv_id, pmm_id): - args = ('of_pm_id=%s' % pm_id, - 'of_pm_id_context=%s' % pm_id_context, - 'of_pv_id=%s'%pv_id, - 'of_pmm_id=%s'%pmm_id) - data = self._RPC.getObjects('ProductModelMaster', *args) + return [self._factory.remember(x, [pv, pv._of_master]) + for x in data] + + def getPmvByPmm(self, pmm): + crit = {'of_pm_id' : pmm.of_pm_id, + 'of_pm_id_context' : pmm.of_pm_id_context, + 'of_pv_id' : pmm.of_pv_id} + 'of_pmm_id' : pmm.id) + data = self._RPC.getObjects('ProductModelMaster', crit) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) + for x in data] def GetPmByProject(self, project): #print "getpmbyproject" #print 'ProductMaster' + ' ' + 'project = %s' % project data = self._RPC.getObjects('ProductMaster', 'project_id=%s' % project) if data: - return [self._factory.reconstitute(x) for x in data] - + return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) + for x in data] + def GetPmmByProject(self, project): #print "getpmmbyproject" #print 'ProductModelMaster' + ' ' + 'project = %s' % project From waterbug at ned.gsfc.nasa.gov Tue Oct 7 16:55:52 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 15:55:53 2003 Subject: [Pangalactic-commits] All getXByProject methods done. Message-ID: <200310071955.h97Jtqvp007086@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.8 1.9 Log message: All getXByProject methods done. Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.8 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.9 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.8 Tue Oct 7 15:45:53 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 7 15:55:50 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.8 $ +@version: $Revision: 1.9 $ """ -__version__ = "$Revision: 1.8 $"[11:-2] +__version__ = "$Revision: 1.9 $"[11:-2] import xmlrpclib import types @@ -80,7 +80,7 @@ if refs: return [self._factory.rememberAll(data, objs)] else: - return [self._factory.remember(data, objs)] + return [self._factory.rememberAll(data, objs)] def getDataByOid(self, dataname, fieldname, oid): # eventually call only this? --vwk 23may2003 @@ -112,41 +112,44 @@ 'of_pm_id_context' : pmm.of_pm_id_context, 'of_pv_id' : pmm.of_pv_id} 'of_pmm_id' : pmm.id) - data = self._RPC.getObjects('ProductModelMaster', crit) + data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit) if data: return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) for x in data] - def GetPmByProject(self, project): + def GetPmByProject(self, project, objs=[]): #print "getpmbyproject" #print 'ProductMaster' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductMaster', 'project_id=%s' % project) + data = self._RPC.getObjects('ProductMaster', 1, 0, + {'project_id' : project}) if data: - return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) - for x in data] + return self._factory.rememberAll(data, objs) - def GetPmmByProject(self, project): + def GetPmmByProject(self, project, objs=[]): #print "getpmmbyproject" #print 'ProductModelMaster' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductModelMaster', 'project_id=%s' % project) + data = self._RPC.getObjects('ProductModelMaster', 1, 0, + {'project_id' : project}) if data: - return [self._factory.reconstitute(x) for x in data] - - def GetPvByProject(self, project): + return self._factory.rememberAll(data, objs) + + def GetPvByProject(self, project, objs=[]): #print "getpvbyproject" #print 'ProductVersion' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductVersion', 'project_id=%s' % project) + data = self._RPC.getObjects('ProductVersion', 1, 0, + {'project_id' : project}) if data: - return [self._factory.reconstitute(x) for x in data] - - def GetPmvByProject(self, project): + return self._factory.rememberAll(data, objs) + + def GetPmvByProject(self, project, objs=[]): #print "getpmvbyproject" #print 'ProductModelVersion' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductModelVersion', 'project_id=%s' % project) + data = self._RPC.getObjects('ProductModelVersion', 1, 0, + {'project_id' : project}) if data: - return [self._factory.reconstitute(x) for x in data] - - def GetPMV(self, ItemId): + return self._factory.rememberAll(data, objs) + + def GetPMV(self, ItemId, objs=[]): data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId) if data: return [self._factory.reconstitute(x) for x in data] From waterbug at ned.gsfc.nasa.gov Tue Oct 7 16:56:41 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 15:56:43 2003 Subject: [Pangalactic-commits] Bug fixes. Message-ID: <200310071956.h97JufKT007141@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/factory.py 1.4 1.5 Log message: Bug fixes. Index: PanGalactic/pangalactic/utils/factory.py diff -u PanGalactic/pangalactic/utils/factory.py:1.4 PanGalactic/pangalactic/utils/factory.py:1.5 --- PanGalactic/pangalactic/utils/factory.py:1.4 Mon Oct 6 01:11:18 2003 +++ PanGalactic/pangalactic/utils/factory.py Tue Oct 7 15:56:40 2003 @@ -1,12 +1,12 @@ -# $Id: factory.py,v 1.4 2003/10/06 05:11:18 waterbug Exp $ +# $Id: factory.py,v 1.5 2003/10/07 19:56:40 waterbug Exp $ """ Functions to extract persistable data from L{pangalactic.enterprise} objects. -@version: $Revision: 1.4 $ +@version: $Revision: 1.5 $ """ -__version__ = "$Revision: 1.4 $"[11:-2] +__version__ = "$Revision: 1.5 $"[11:-2] import types import string @@ -37,25 +37,20 @@ attribute is to be converted """ # *_datetime attributes: - # pypgsql returns a DateTime object, which can't - # be jellied, so convert to GMT string ... if datatype == 'DateTime': if attr: return str(attr) else: return '' # *_flag attributes: - # pypgsql returns a PgBoolean object, which can't be - # jellied, so convert value to 0 or 1 ... if datatype == 'bool': # print "%s is a flag -- setting it to 1 or 0." % attr if attr: return 1 else: return 0 - # special case: for a null, pypgsql returns a - # None object, which can't be jellied, so convert - # to an empty string ... + # special case: for a null, pypgsql returns a None + # object, so convert to an empty string ... if isinstance(attr, types.NoneType): # print "%s is None -- setting it to an empty string." % attr return '' @@ -172,7 +167,7 @@ def remember(self, extr, objs=[]): """ - Re-member (wink ;^) an object from an extract and a list + Re-member (heh ;^) an object from an extract and a list of candidates to use for its referenced objects (i.e., those in _refd). (Use case: update of an object of which the referenced objects already exist locally.) @@ -195,13 +190,12 @@ kw[a] = self.uncook(extr[1][a], klass._schema[a]) if klass._refd: for a in klass._refd: + kw[a] = None for o in objs: if (o.__class__.__name__ == klass._refd[a] and ([getattr(o, pka) for pka in o._pk] == [kw[fka] for fka in klass._fk[a]])): kw[a] = o - else: - kw[a] = None return klass(**kw) def rememberAll(self, extracts, objs=[]): @@ -227,7 +221,7 @@ # make a list of all classes in the extracts cnames = utils.unique([string.split(e[0], '.')[-1] for e in extracts]) - print 'cnames = %s' % str(cnames) + # print 'cnames = %s' % str(cnames) # build a dictionary of lists of extracts by class edict = {} for cname in cnames: @@ -235,7 +229,7 @@ for e in extracts: if cname == string.split(e[0], '.')[-1]: edict[cname].append(e) - print 'edict = %s' % str(edict) + # print 'edict = %s' % str(edict) # make a dictionary of lists of instances by class byclass = {} for c in cnames: @@ -246,33 +240,33 @@ byclass[c].append(o) else: byclass[c] = [o] - print 'byclass = %s' % str(byclass) + # print 'byclass = %s' % str(byclass) # so in theory, at this point everything is remembered. # now hook up as many refs as we can ... using the # registry a little bit: for c in cnames: - print '- adding refs to %s instances ...' % c + # print '- adding refs to %s instances ...' % c refd = self._registry.pgef_classes[c]._refd - print ' - refd is %s' % str(refd) + # print ' - refd is %s' % str(refd) if refd: for attr in refd: - print ' - %s has type %s' % (attr, refd[attr]) - print ' - looking for %s instances' % refd[attr] + # print ' - %s has type %s' % (attr, refd[attr]) + # print ' - looking for %s instances' % refd[attr] if refd[attr] in byclass: - print ' - we have %s instances' % refd[attr] + # print ' - we have %s instances' % refd[attr] for o in byclass[c]: - print ' - looking at fk attrs of %s' % repr(o) + # print ' - looking at fk attrs of %s' % repr(o) fkattrs = o._fk[attr] fkvals = [getattr(o, a) for a in fkattrs] - print ' - fk vals are %s' % str(fkvals) + # print ' - fk vals are %s' % str(fkvals) for oo in byclass[refd[attr]]: pkattrs = oo._pk pkvals = [getattr(oo, a) for a in pkattrs] if fkvals == pkvals: setattr(o, attr, oo) - break + break remembered += byclass[c] return remembered From pbear at ned.gsfc.nasa.gov Tue Oct 7 17:00:08 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 7 16:00:09 2003 Subject: [Pangalactic-commits] fixed typo Message-ID: <200310072000.h97K08di007221@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.9 1.10 Log message: fixed typo Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.9 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.10 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.9 Tue Oct 7 15:55:50 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 7 16:00:07 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.9 $ +@version: $Revision: 1.10 $ """ -__version__ = "$Revision: 1.9 $"[11:-2] +__version__ = "$Revision: 1.10 $"[11:-2] import xmlrpclib import types @@ -110,8 +110,8 @@ def getPmvByPmm(self, pmm): crit = {'of_pm_id' : pmm.of_pm_id, 'of_pm_id_context' : pmm.of_pm_id_context, - 'of_pv_id' : pmm.of_pv_id} - 'of_pmm_id' : pmm.id) + 'of_pv_id' : pmm.of_pv_id, + 'of_pmm_id' : pmm.id} data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit) if data: return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) From waterbug at ned.gsfc.nasa.gov Tue Oct 7 17:03:35 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 16:03:36 2003 Subject: [Pangalactic-commits] Mods to enterprise objects. Message-ID: <200310072003.h97K3ZPr007371@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefobject.py 1.26 1.27 PanGalactic/pangalactic/enterprise/productmaster.py 1.17 1.18 PanGalactic/pangalactic/enterprise/productmodelversion.py 1.21 1.22 Log message: Mods to enterprise objects. Index: PanGalactic/pangalactic/enterprise/productmodelversion.py diff -u PanGalactic/pangalactic/enterprise/productmodelversion.py:1.21 PanGalactic/pangalactic/enterprise/productmodelversion.py:1.22 --- PanGalactic/pangalactic/enterprise/productmodelversion.py:1.21 Thu Oct 2 12:19:57 2003 +++ PanGalactic/pangalactic/enterprise/productmodelversion.py Tue Oct 7 16:03:33 2003 @@ -1,10 +1,10 @@ -# $Id: productmodelversion.py,v 1.21 2003/10/02 16:19:57 waterbug Exp $ +# $Id: productmodelversion.py,v 1.22 2003/10/07 20:03:33 waterbug Exp $ """ Version-dependent product model data. """ -__version__ = "$Revision: 1.21 $"[11:-2] +__version__ = "$Revision: 1.22 $"[11:-2] from pangalactic.enterprise.project import Project from pangalactic.enterprise.productversion import ProductVersion @@ -84,12 +84,6 @@ # PgerObjectFactory. # TODO: implement _owner, _creator, etc. ... _refd = { - # '_owner' : 'Person', - # '_creator' : 'Person', - # '_modifier' : 'Person', - # '_pger_owner' : 'Person', - # '_pger_creator' : 'Person', - # '_pger_modifier' : 'Person', '_project' : 'Project', '_of_master' : 'ProductMaster', '_of_version' : 'ProductVersion', Index: PanGalactic/pangalactic/enterprise/pgefobject.py diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.26 PanGalactic/pangalactic/enterprise/pgefobject.py:1.27 --- PanGalactic/pangalactic/enterprise/pgefobject.py:1.26 Thu Oct 2 12:19:57 2003 +++ PanGalactic/pangalactic/enterprise/pgefobject.py Tue Oct 7 16:03:33 2003 @@ -1,8 +1,8 @@ -# $Id: pgefobject.py,v 1.26 2003/10/02 16:19:57 waterbug Exp $ +# $Id: pgefobject.py,v 1.27 2003/10/07 20:03:33 waterbug Exp $ """ The Mother of all PGEF application classes. -@version: $Revision: 1.26 $ +@version: $Revision: 1.27 $ """ # TODO: @@ -24,7 +24,7 @@ # should we jettison this? # Nope. -__version__ = "$Revision: 1.26 $"[11:-2] +__version__ = "$Revision: 1.27 $"[11:-2] import types import string @@ -35,23 +35,6 @@ from pangalactic.utils import datetimes from pangalactic.utils import pgefexceptions -def FillSampleObject(sampleobj): - """ - Fill an object's attributes with some sample data. - - @type sampleobj: L{pangalactic.enterprise.pgefobject.PgefObject} - @param sampleobj: the instance whose attributes are to be filled - """ - sampleobj.pgef_oid = "1234" - sampleobj.objtype = None - sampleobj.state = "" - sampleobj.owner = "me" - sampleobj.id = "idthis" - sampleobj.project = "Philadelphia Experiment" - sampleobj.creator = "Einstein" - sampleobj.create_datetime = time.strftime("%Y/%m/%d %H:%M:%S") - sampleobj.InitialCommitDateTime = "" - class PgefObject(object, pb.Cacheable, pb.RemoteCache): """ This is the base class for all of the Pgef data classes. @@ -559,4 +542,25 @@ + a) raise pgefexceptions.RequiredDataError, msg return True + + def popTestData(self): + """ + Populate an instance's unpopulated attributes with some + test data. (This method may be extended in subclasses.) + """ + # this id is not very useful for testing, but a test + # script will have to set it to something anyway ... + self.id = self.id or "idthis" + self.id_context = self.id_context or "TEST" + # make sure foreign keys to "person" table are valid for + # testing purposes ... + for a in ['owner', + 'creator', + 'modifier', + 'pger_owner', + 'pger_creator', + 'pger_modifier']: + if not getattr(self, a): + setattr(self, a, 'tester1@default') + setattr(self, a + '_context', 'TEST') Index: PanGalactic/pangalactic/enterprise/productmaster.py diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.17 PanGalactic/pangalactic/enterprise/productmaster.py:1.18 --- PanGalactic/pangalactic/enterprise/productmaster.py:1.17 Thu Oct 2 12:19:57 2003 +++ PanGalactic/pangalactic/enterprise/productmaster.py Tue Oct 7 16:03:33 2003 @@ -1,26 +1,14 @@ -# $Id: productmaster.py,v 1.17 2003/10/02 16:19:57 waterbug Exp $ +# $Id: productmaster.py,v 1.18 2003/10/07 20:03:33 waterbug Exp $ """ Version-independent product data. """ -__version__ = "$Revision: 1.17 $"[11:-2] +__version__ = "$Revision: 1.18 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project -def FillSampleProductMaster(pm): - """ - Fill in some test data. - - @type pm: L{pangalactic.enterprise.productmaster.ProductMaster} - @param pm: object to be populated. - """ - pm.name = 'test Name Code' - pm.short_description = 'Test Name' - pm.owner = 'joe@schmoe.com' - pm.creator = 'moi@moi.com' - class ProductMaster(PgefObject): """ I encapsulate the version-independent data about a product. @@ -97,4 +85,14 @@ if project: self.project_id = project.id self.project_id_context = project.id_context + + def popTestData(self): + """ + Populate an instance's unpopulated attributes with some + test data. + """ + PgefObject.popTestData(self) + self.name = self.name or 'Test ProductMaster' + self.short_description = (self.short_description or + 'This is a ProductMaster for testing') From pbear at ned.gsfc.nasa.gov Tue Oct 7 17:15:04 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 7 16:15:07 2003 Subject: [Pangalactic-commits] fixed compound key stuff Message-ID: <200310072015.h97KF4Np007731@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/data_utils.py 1.7 1.8 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.10 1.11 Log message: fixed compound key stuff Index: PanGalactic/pangalactic/utils/data_utils.py diff -u PanGalactic/pangalactic/utils/data_utils.py:1.7 PanGalactic/pangalactic/utils/data_utils.py:1.8 --- PanGalactic/pangalactic/utils/data_utils.py:1.7 Tue Oct 7 14:24:22 2003 +++ PanGalactic/pangalactic/utils/data_utils.py Tue Oct 7 16:15:03 2003 @@ -27,7 +27,7 @@ def createACUSearchByComponent(acu_obj): search_str = [] - value_list = createCompoundKey(acu_obj, 'ProductModelVersion') + value_list = createCompoundKey(acu_obj)#, 'ProductModelVersion') name_list = ('component_id=', 'component_of_pmm_id=', 'component_of_pv_id=', 'component_of_pm_id=', 'component_of_pm_id_context=') for ndx in range(5): search_str.append(name_list[ndx] + value_list[ndx]) @@ -36,13 +36,20 @@ def createACUSearchByAssembly(acu_obj): - search_str = [] - value_list = createCompoundKey(acu_obj, 'ProductModelVersion') - name_list = ('assembly_id=', 'assembly_of_pmm_id=', 'assembly_of_pv_id=', 'assembly_of_pm_id=', 'assembly_of_pm_id_context=') +# search_str = [] +# value_list = createCompoundKey(acu_obj)#, 'ProductModelVersion') +# name_list = ('assembly_id=', 'assembly_of_pmm_id=', 'assembly_of_pv_id=', 'assembly_of_pm_id=', 'assembly_of_pm_id_context=') +# for ndx in range(5): +# search_str.append(name_list[ndx] + value_list[ndx]) +# +# return tuple(search_str) + search_str = {} + value_list = createCompoundKey(acu_obj)#, 'ProductModelVersion') + name_list = ('assembly_id', 'assembly_of_pmm_id', 'assembly_of_pv_id', 'assembly_of_pm_id', 'assembly_of_pm_id_context') for ndx in range(5): - search_str.append(name_list[ndx] + value_list[ndx]) + search_str[name_list[ndx]] = value_list[ndx] - return tuple(search_str) + return search_str def createACUAssemblyTuple(acu_obj): Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.10 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.11 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.10 Tue Oct 7 16:00:07 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 7 16:15:03 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.10 $ +@version: $Revision: 1.11 $ """ -__version__ = "$Revision: 1.10 $"[11:-2] +__version__ = "$Revision: 1.11 $"[11:-2] import xmlrpclib import types @@ -175,12 +175,14 @@ return [self._factory.reconstitute(x) for x in data] def GetAcusByCompKey(self, comp_key): - #print "getacusbycompkey" + print "getacusbycompkey" #print 'comp key was: %s' % repr(comp_key) - data = self._RPC.getObjects('AssemblyComponentUsage', *comp_key) + #data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, *comp_key) + print "compkey", comp_key + data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, comp_key) #print 'reply was: \n %s' % data if data: - return [self._factory.reconstitute(x) for x in data] + return self._factory.rememberAll(data) def GetPerson(self, user_tuple): data = self._RPC.getObjects('Person', *UserName) From waterbug at ned.gsfc.nasa.gov Wed Oct 8 00:29:29 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 23:29:30 2003 Subject: [Pangalactic-commits] Singularized buildSelectFromRowKey(). Message-ID: <200310080329.h983TTbG013131@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/sql.py 1.7 1.8 Log message: Singularized buildSelectFromRowKey(). Index: PanGalactic/pangalactic/utils/sql.py diff -u PanGalactic/pangalactic/utils/sql.py:1.7 PanGalactic/pangalactic/utils/sql.py:1.8 --- PanGalactic/pangalactic/utils/sql.py:1.7 Mon Oct 6 00:41:21 2003 +++ PanGalactic/pangalactic/utils/sql.py Tue Oct 7 23:29:27 2003 @@ -1,6 +1,6 @@ """SQL Tools""" -# $Id: sql.py,v 1.7 2003/10/06 04:41:21 waterbug Exp $ +# $Id: sql.py,v 1.8 2003/10/08 03:29:27 waterbug Exp $ import re, types @@ -96,21 +96,13 @@ selectargs = (sqlstmt,) return selectargs -def buildSelectFromRowKeys(rowkeys): +def buildSelectFromRowKey(rowkey): """ - Take a list of rowkeys (for def of a rowkey, see - L{pangalactic.repo.factory.records2RowKeys}) and - return an SQL select statement that will select the - corresponding rows from the appropriate tables. + Build arguments for a select from a rowkey (for def of a + rowkey, see L{pangalactic.repo.factory.record2RowKey}). """ - allsql = '' - allargs = [] - for rk in rowkeys: - args = [(a, rk[1][a], '=') for a in rk[1]] - parms = buildSelect(rk[0], 0, *args) - allsql += parms[0] + '; ' - allargs += parms[1:] - return allsql, allargs + args = [(a, rowkey[1][a], '=') for a in rowkey[1]] + return buildSelect(rowkey[0], 0, *args) def buildInsert(table, parmdict): """ From waterbug at ned.gsfc.nasa.gov Wed Oct 8 00:31:32 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 23:31:33 2003 Subject: [Pangalactic-commits] Some more work; probably not done yet, but all Get[x]ByProject and GetAcusByCompKey appear to work now. Message-ID: <200310080331.h983VWuj013229@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.11 1.12 Log message: Some more work; probably not done yet, but all Get[x]ByProject and GetAcusByCompKey appear to work now. Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.11 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.12 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.11 Tue Oct 7 16:15:03 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 7 23:31:30 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.11 $ +@version: $Revision: 1.12 $ """ -__version__ = "$Revision: 1.11 $"[11:-2] +__version__ = "$Revision: 1.12 $"[11:-2] import xmlrpclib import types @@ -152,7 +152,7 @@ def GetPMV(self, ItemId, objs=[]): data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] def GetCategories(self, context): # Category is a subclass of DataElement. FSC is a @@ -160,19 +160,19 @@ print "xmlrpc.getcategories" data = self._RPC.getObjects('Category', "id_context=%s" % context) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] def GetOrganizations(self): print "xmlrpc.getorgs" data = self._RPC.getObjects('Organization', "id_context=DEMO") ## NOT staying. Demo only!! --vwk 28feb2003 if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] def GetOrganization(self, ObjId): print "getorganization" data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] def GetAcusByCompKey(self, comp_key): print "getacusbycompkey" @@ -187,19 +187,19 @@ def GetPerson(self, user_tuple): data = self._RPC.getObjects('Person', *UserName) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] def GetPersonRoles(self, UserName): data = self._RPC.getObjects('Role', 'UserId=%s' % UserName) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] #def GetProject(self, project): def SearchPMV(self, search_tuple): data = self._RPC.getObjects('ProductModelVersion', *search_tuple) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] #def AddItem(self, itemobj): @@ -216,14 +216,14 @@ def GetPartsList(self, partslistid): data = self._RPC.getObjects('PartsList', 'pgef_oid=%s' % partslistid) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] #def AddDocument(self, doc): def GetDocument(self, docid): data = self._RPC.getObjects('Document' , 'pgef_oid=%s' % docid) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] #def DelPdr(self, pdr): @@ -232,17 +232,17 @@ def GetPdr(self, pdrid): data = self._RPC.getObjects('ProductDocumentRelationship', 'pgef_oid=%s' % pdrid) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] def GetPDRByDocumentID(self, docid): data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % docid) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] def GetPDRByItemID(self, itemid): data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % itemid) if data: - return [self._factory.reconstitute(x) for x in data] + return [self._factory.remember(x) for x in data] # OBE vwk 28oct02 # def DelIdr(self, idr): From waterbug at ned.gsfc.nasa.gov Wed Oct 8 00:33:22 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 23:33:23 2003 Subject: [Pangalactic-commits] Added test for GetAcusByCompKey() (expected: gets one acu from test data). Message-ID: <200310080333.h983XMJr013271@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py 1.5 1.6 Log message: Added test for GetAcusByCompKey() (expected: gets one acu from test data). Index: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py diff -u PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.5 PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.6 --- PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.5 Tue Oct 7 14:46:06 2003 +++ PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py Tue Oct 7 23:33:21 2003 @@ -52,8 +52,27 @@ xcli = XmlrpcInterface('beeblebrox.gsfc.nasa.gov', '8080') # create a pm just for getting its pv's ... + h2g2 = Project(id='H2G2', id_context='TEST') pm1 = PM(id='HOG', id_context='TEST', _project=h2g2) res = xcli.getPvByPm(pm1) +print res[0] + +# ACU test + +comp_key = { + 'assembly_id' : '1', + 'assembly_of_pmm_id' : 'Default Model', + 'assembly_of_pv_id' : '42', + 'assembly_of_pm_id' : 'HOG', + 'assembly_of_pm_id_context' : 'TEST', + 'component_id' : '1', + 'component_of_pmm_id' : 'Default Model', + 'component_of_pv_id' : '3B', + 'component_of_pm_id' : 'IDrive', + 'component_of_pm_id_context' : 'TEST' + } + +res = xcli.GetAcusByCompKey(comp_key) print res[0] From waterbug at ned.gsfc.nasa.gov Wed Oct 8 00:35:51 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 23:35:52 2003 Subject: [Pangalactic-commits] More upgrades to server unit tests. Message-ID: <200310080335.h983ZplJ013313@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/IDTEST 1.17 1.18 PanGalactic/pangalactic/test/README 1.21 1.22 PanGalactic/pangalactic/test/test_db_getByRowKey.py 1.1 1.2 PanGalactic/pangalactic/test/test_factory_record2RowKey.py 1.1 1.2 PanGalactic/pangalactic/test/test_pger_addExtracts.py 1.2 1.3 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.9 1.10 Log message: More upgrades to server unit tests. Index: PanGalactic/pangalactic/test/test_pger_addExtracts.py diff -u PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.2 PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.3 --- PanGalactic/pangalactic/test/test_pger_addExtracts.py:1.2 Mon Oct 6 17:16:32 2003 +++ PanGalactic/pangalactic/test/test_pger_addExtracts.py Tue Oct 7 23:35:50 2003 @@ -1,12 +1,10 @@ -# $Id: test_pger_addExtracts.py,v 1.2 2003/10/06 21:16:32 waterbug Exp $ +# $Source: /repo/step_testbed/PanGalactic/pangalactic/test/test_pger_addExtracts.py,v $ """ Functional test for pangalactic.repo.Pger.addExtracts() - initializes PgerDb, PgerObjectRegistry, and Pger - executes Pger interface call: - addExtracts() - - returns a datetime stamp (the pger_create_datetime and - pger_mod_datetime for all committed data) """ from pprint import pprint @@ -55,8 +53,7 @@ extracts = [pe, pme, pve] def success(result): - for defres in result: - defres.addCallback(lambda x: pprint(x)) + pprint(result) reactor.stop() def failure(error): Index: PanGalactic/pangalactic/test/test_db_getByRowKey.py diff -u PanGalactic/pangalactic/test/test_db_getByRowKey.py:1.1 PanGalactic/pangalactic/test/test_db_getByRowKey.py:1.2 --- PanGalactic/pangalactic/test/test_db_getByRowKey.py:1.1 Mon Oct 6 17:16:31 2003 +++ PanGalactic/pangalactic/test/test_db_getByRowKey.py Tue Oct 7 23:35:49 2003 @@ -1,4 +1,4 @@ -# $Id: test_db_getByRowKey.py,v 1.1 2003/10/06 21:16:31 waterbug Exp $ +# $Id: test_db_getByRowKey.py,v 1.2 2003/10/08 03:35:49 waterbug Exp $ """ Test for inserting a row using pangalactic.repo.db module @@ -18,32 +18,40 @@ fac = POF(reg) pgerdb = PgerDb() -rowkeys = [['project', {'id' : 'H2G2', - 'id_context' : 'TEST'}], - ['product_master', {'id' : 'HOG', - 'id_context' : 'TEST'}], - ['product_version', {'id' : '42', +rk1 = ['project', {'id' : 'H2G2', + 'id_context' : 'TEST'}] + +rk2 = ['product_master', {'id' : 'HOG', + 'id_context' : 'TEST'}] + +rk3 = ['product_version', {'id' : '42', 'id_context' : 'PGER', - 'of_pm_id' : 'HOG'}], - ['product_master', {'id' : 'IDrive', + 'of_pm_id' : 'HOG'}] + +rk4 = ['product_master', {'id' : 'IDrive', 'id_context' : 'TEST'}] - ] -for rk in rowkeys: +def success(stuff): + print '=========================================' + print 'pgef_class is %s' % stuff[0].pgef_class + print 'results are:' + pprint(stuff) + +def failure(error): + print error + +a = pgerdb.getByRowKey(rk1) +a.addCallbacks(success, failure) - def success(stuff): - print '=========================================' - print 'pgef_class is %s' % stuff[0].pgef_class - print 'results are:' - pprint(stuff) - reactor.stop() +b = pgerdb.getByRowKey(rk2) +b.addCallbacks(success, failure) - def failure(error): - print error - reactor.stop() +c = pgerdb.getByRowKey(rk3) +c.addCallbacks(success, failure) - d = pgerdb.getByRowKey(rk) - d.addCallbacks(success, failure) +d = pgerdb.getByRowKey(rk4) +d.addCallbacks(success, failure) - reactor.run() +reactor.run() +reactor.stop() Index: PanGalactic/pangalactic/test/test_factory_record2RowKey.py diff -u PanGalactic/pangalactic/test/test_factory_record2RowKey.py:1.1 PanGalactic/pangalactic/test/test_factory_record2RowKey.py:1.2 --- PanGalactic/pangalactic/test/test_factory_record2RowKey.py:1.1 Mon Oct 6 17:16:32 2003 +++ PanGalactic/pangalactic/test/test_factory_record2RowKey.py Tue Oct 7 23:35:50 2003 @@ -11,14 +11,14 @@ fac = POF(reg) extracts = fac.extractall([pm]) print '=====================' -print 'extracts:' +print 'extracts (%s):' % len(extracts) print extracts recs = [fac.extract2Record(e) for e in extracts] print '=====================' -print 'records:' +print 'records (%s):' % len(recs) print recs rowkeys = [fac.record2RowKey(rec) for rec in recs] print '=====================' -print 'rowkeys:' -print pprint(rowkeys) +print 'rowkeys (%s):' % len(rowkeys) +print rowkeys Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.17 PanGalactic/pangalactic/test/IDTEST:1.18 --- PanGalactic/pangalactic/test/IDTEST:1.17 Mon Oct 6 17:16:31 2003 +++ PanGalactic/pangalactic/test/IDTEST Tue Oct 7 23:35:49 2003 @@ -1 +1 @@ -269 \ No newline at end of file +291 \ No newline at end of file Index: PanGalactic/pangalactic/test/README diff -u PanGalactic/pangalactic/test/README:1.21 PanGalactic/pangalactic/test/README:1.22 --- PanGalactic/pangalactic/test/README:1.21 Mon Oct 6 17:16:31 2003 +++ PanGalactic/pangalactic/test/README Tue Oct 7 23:35:49 2003 @@ -1,4 +1,4 @@ -$Id: README,v 1.21 2003/10/06 21:16:31 waterbug Exp $ +$Id: README,v 1.22 2003/10/08 03:35:49 waterbug Exp $ Pan Galactic Engineering Repository Test Scripts ================================================ @@ -16,17 +16,21 @@ test_db_runsequencequery.py test_db_addrow.py test_db_addrows.py test_registry.py +test_db_getByRowKey.py \ / test_factory_test.py test_factory_sync.py test_factory_extractall.py test_factory_extract2Record.py test_factory_makeObjects.py + test_factory_record2RowKey.py test_factory_unmakeObject.py | - test_pger_getresultsets.py + test_pger_get.py + test_pger_getResultSets.py test_pger_gettuplers.py test_pger_getobjects.py + test_pger_getRefdRowKeys.py test_pger_addExtracts.py test_pger_addObjects.py test_pger_create.py Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.9 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.10 --- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.9 Mon Oct 6 17:16:32 2003 +++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py Tue Oct 7 23:35:50 2003 @@ -1,4 +1,4 @@ -# $Id: test_xmlrpc_getobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $ +# $Id: test_xmlrpc_getobjects.py,v 1.10 2003/10/08 03:35:50 waterbug Exp $ """ Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService @@ -26,19 +26,17 @@ pprint(stuff) print "====================================" print "\n*** Remembered objects:" - olist = [] - for x in stuff: - o = pgr._factory.remember(x) - olist.append(o) + olist = pgr._factory.rememberAll(stuff) print "%s %s(s) found" % (len(olist), typename) if olist: print "====================================" pprint(olist) print "====================================" - print """\nHere's the first %s:""" % typename - print "====================================" - print olist[0] + print """\nHere they are:""" print "====================================" + for o in olist: + print o + print "====================================" reactor.stop() def failure(error): From waterbug at ned.gsfc.nasa.gov Wed Oct 8 00:37:32 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 23:37:33 2003 Subject: [Pangalactic-commits] Add test for getResultSets with refs=1. Message-ID: <200310080337.h983bW85013354@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py None 1.1 Log message: Add test for getResultSets with refs=1. From waterbug at ned.gsfc.nasa.gov Wed Oct 8 00:39:37 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 7 23:39:39 2003 Subject: [Pangalactic-commits] A heaping helping of new server code. Message-ID: <200310080339.h983dbN0013400@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/db.py 1.23 1.24 PanGalactic/pangalactic/repo/factory.py 1.29 1.30 PanGalactic/pangalactic/repo/pger.py 1.43 1.44 PanGalactic/pangalactic/repo/xmlrpc.py 1.21 1.22 Log message: A heaping helping of new server code. Index: PanGalactic/pangalactic/repo/factory.py diff -u PanGalactic/pangalactic/repo/factory.py:1.29 PanGalactic/pangalactic/repo/factory.py:1.30 --- PanGalactic/pangalactic/repo/factory.py:1.29 Mon Oct 6 00:30:58 2003 +++ PanGalactic/pangalactic/repo/factory.py Tue Oct 7 23:39:36 2003 @@ -1,11 +1,11 @@ -# $Id: factory.py,v 1.29 2003/10/06 04:30:58 waterbug Exp $ +# $Id: factory.py,v 1.30 2003/10/08 03:39:36 waterbug Exp $ """ Pan Galactic Object Factory module -@version: $Revision: 1.29 $ +@version: $Revision: 1.30 $ """ -__version__ = "$Revision: 1.29 $"[11:-2] +__version__ = "$Revision: 1.30 $"[11:-2] import types from pprint import pprint @@ -52,71 +52,80 @@ """ pass - def resultsets2Extracts(self, resultsets): + def resultset2Extract(self, res): """ - Convert a sequence of pyPgSQL resultsets into "extract" - format (see L{pangalactic.utils.factory}). + Convert a pyPgSQL resultset into an "extract" + (see L{pangalactic.utils.factory.extract}). """ - extracts = [] - if resultsets: - for res in resultsets: - obj = self._registry.pgerdb_classes[res.pgef_class] - schema = obj._schema - module = obj.__module__ - s = [ (a, self.cook(getattr(res, a), schema[a])) - for a in schema ] - instdict = dict(s) - name = module + '.' + res.pgef_class - extr = [ name, instdict ] - extracts.append(extr) - return extracts - else: - return [] + obj = self._registry.pgerdb_classes[res.pgef_class] + schema = obj._schema + module = obj.__module__ + s = [ (a, self.cook(getattr(res, a), schema[a])) + for a in schema ] + instdict = dict(s) + name = module + '.' + res.pgef_class + e = [ name, instdict ] + return e + + def resultlist2Extract(self, reslist): + """ + Convert a pyPgSQL resultlist into an "extract" + (see L{pangalactic.utils.factory.extract}). + """ + # This code depends on the fact that 'pgef_class' is the + # second attribute in *all* PGER tables (because it is + # the second attribute of PgefObject). + obj = self._registry.pgerdb_classes[reslist[1]] + schema = obj._schema + module = obj.__module__ + s = [ (a, self.cook(reslist[self._registry.table_cols.index(a)], + schema[a])) + for a in schema ] + instdict = dict(s) + name = module + '.' + res.pgef_class + e = [ name, instdict ] + return e - def extracts2Records(self, extracts): + def extract2Record(self, e): """ Take a list of extracts and convert them to a list of "records" for use in the addRows() method of L{pangalactic.repo.db.PgerDb}. - @type extracts: a list - @param extracts: a list of extracts -- see - L{pangalactic.utils.factory.extract} + @type e: list + @param e: an extract -- see + L{pangalactic.utils.factory.extract} @rtype: list - @return: a list of "records". A record has the following - structure: [tablename, {colname : value, ...}] + @return: a "record", which has the following structure: + [tablename, {colname : value, ...}] """ - recs = [] - for e in extracts: - classname = e[0].split('.')[-1] - schema = self._registry.pgef_classes[classname]._schema - table = self._registry.getTableName(classname) - for a in e[1]: - e[1][a] = self.uncook(e[1][a], schema[a]) - recs.append([table, e[1]]) - return recs - - def records2RowKeys(self, records): - """ - Take a list of records and extracts the rowkeys -- i.e., - the values of the primary key for each record. - - @type records: a list - @param records: a list of records -- see - L{pangalactic.repo.factory.extracts2Records} + classname = e[0].split('.')[-1] + schema = self._registry.pgef_classes[classname]._schema + table = self._registry.getTableName(classname) + for a in e[1]: + e[1][a] = self.uncook(e[1][a], schema[a]) + rec = [table, e[1]] + return rec + + def record2RowKey(self, record): + """ + Take a record and extract the rowkey -- i.e., the values + of the primary key. + + @type record: list + @param record: a "record" -- see + L{pangalactic.repo.factory.extract2Record} @rtype: list @return: a list of "rowkeys". A rowkey has the following structure: [tablename, {pkcolname : value, ...}] """ - rowkeys = [] - for rec in records: - pk = self._registry.table_pkeys[rec[0]] - pks = [(a, rec[1][a]) for a in pk] - key = dict(pks) - rowkeys.append([rec[0], key]) - return rowkeys + pk = self._registry.table_pkeys[record[0]] + pks = [(a, record[1][a]) for a in pk] + key = dict(pks) + rowkey = [record[0], key] + return rowkey def unmakeObject(self, obj): """ Index: PanGalactic/pangalactic/repo/db.py diff -u PanGalactic/pangalactic/repo/db.py:1.23 PanGalactic/pangalactic/repo/db.py:1.24 --- PanGalactic/pangalactic/repo/db.py:1.23 Sun Oct 5 17:28:45 2003 +++ PanGalactic/pangalactic/repo/db.py Tue Oct 7 23:39:36 2003 @@ -1,10 +1,10 @@ """ Pan Galactic Engineering Repository Database Interface -@version: $Revision: 1.23 $ +@version: $Revision: 1.24 $ """ -__version__ = "$Revision: 1.23 $"[11:-2] +__version__ = "$Revision: 1.24 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/db.py,v $ # Twisted imports ... @@ -29,7 +29,7 @@ def doPgerdbQuery(self, table, subtypes, *args, **kw): """ - Runs a query submitted as a list of args against a + Run a query submitted as a list of args against a specified table. @type table: string @@ -61,6 +61,20 @@ else: raise TypeError, 'I need at least one search parameter' + def getByRowKey(self, rowkey): + """ + Get the resultset for this rowkey. + + @type rowkey: list + @param rowkey: a rowkey (for more about rowkeys, see + L{pangalactic.repo.factory.record2RowKey}) + + @rtype: a PgResultSet + @return: the result set that matches this rowkey. + """ + sqlargs = sql.buildSelectFromRowKey(rowkey) + return self.runQuery(*sqlargs) + def addRow(self, table, *args, **kw): """ Add a row to the specified table. @@ -93,7 +107,7 @@ """ Add a series of rows, in a single transaction, from a list of records (for a description of "records", see - L{pangalactic.repo.factory.extracts2Records}). + L{pangalactic.repo.factory.extract2Record}). @type records: list @param records: a list of records -- see @@ -104,40 +118,40 @@ sqlstmt, parms = sql.buildTransactionalInsert(records) d = self.runOperation(sqlstmt, *parms) logmsg = 'addRows: rows added to tables %s.' % str(tables) - d.addCallback(lambda x: self._addRowsDone(x, logmsg)) + d.addCallback(lambda x: self._addRowsConfirm(x, logmsg)) d.addErrback(self.interactionError) return d - def _addRowsDone(self, d, logmsg): + def _addRowsConfirm(self, d, logmsg): """ Callback for addRows success. """ - log.msg("%s operation %s" % (reflect.qual(self.__class__), logmsg)) + log.msg("%s %s" % (reflect.qual(self.__class__), logmsg)) return d def operationDone(self, done): """ Callback for database operation success. """ - log.msg("%s Operation Done: %s" % (reflect.qual(self.__class__), done)) + log.msg("%s Operation done: %s" % (reflect.qual(self.__class__), done)) def operationError(self, error): """ Callback for database operation failure. """ - log.msg("%s Operation Failed: %s" % (reflect.qual(self.__class__), error)) + log.msg("%s Operation failed: %s" % (reflect.qual(self.__class__), error)) log.err(error) def interactionDone(self, done): """ Callback for database interaction success. """ - log.msg("%s Interaction Done: %s" % (reflect.qual(self.__class__), done)) + log.msg("%s Interaction done: %s" % (reflect.qual(self.__class__), done)) def interactionError(self, error): """ Callback for database interaction failure. """ - log.msg("%s Interaction Failed: %s" % (reflect.qual(self.__class__), error)) + log.msg("%s Interaction failed: %s" % (reflect.qual(self.__class__), error)) log.err(error) Index: PanGalactic/pangalactic/repo/pger.py diff -u PanGalactic/pangalactic/repo/pger.py:1.43 PanGalactic/pangalactic/repo/pger.py:1.44 --- PanGalactic/pangalactic/repo/pger.py:1.43 Sun Oct 5 17:34:30 2003 +++ PanGalactic/pangalactic/repo/pger.py Tue Oct 7 23:39:36 2003 @@ -1,21 +1,22 @@ """ Pan Galactic Entropy Reverser module -@version: $Revision: 1.43 $ +@version: $Revision: 1.44 $ """ -__version__ = "$Revision: 1.43 $"[11:-2] +__version__ = "$Revision: 1.44 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $ import time +from pprint import pprint from mx.DateTime.ISO import ParseDateTime # Twisted imports ... from twisted.internet import defer from twisted.spread import pb from twisted.enterprise import adbapi -from twisted.python import log +from twisted.python import log, reflect # PanGalactic imports ... -from pangalactic.utils import pgefexceptions from pangalactic.utils import oid +from pangalactic.utils import utils from pangalactic.repo.pgerpb import DefaultPgerPerspective from pangalactic.repo.registry import PgerObjectRegistry from pangalactic.repo.factory import PgerObjectFactory @@ -86,7 +87,7 @@ """ pb.Service.startService(self) - def getResultSets(self, typename, refs=1, subtypes=0, **kw): + def getResultSets(self, typename, refs=0, subtypes=0, **kw): """ From the table corresponding to the specified type, get all PGERDB rows that match the supplied kw parameters. @@ -103,7 +104,7 @@ @type refs: integer @param refs: specifies whether to include the objects referenced by the specified class. - 0: do not get references + 0: (default) do not get refs 1: get all references (in future, refs may specify how many reference levels to follow ...) @@ -112,12 +113,15 @@ @param subtypes: specifies whether to include only the specified class (the default) or all subtypes. - 0: only this type + 0: (default) only this type 1: include subtypes @param kw: keyword arguments of the form: key: an attribute of the object value: the value to be selected by + + @rtype: list + @return: list of pyPgSQL result sets """ table = self._registry.getTableName(typename) if kw: @@ -126,19 +130,59 @@ for a in kw.keys(): if not a in self._registry.table_cols[table]: raise ValueError, '%s is not in the schema of %s' % (a, typename) - dbargs.append((a, kw[a])) + dbargs.append((a, kw[a], '=')) # TODO: implement refs and subtypes ... - rset = self._pgerdb.doPgerdbQuery(table, 0, *dbargs) - rset.addErrback(log.err) - return rset + dres = self._pgerdb.doPgerdbQuery(table, 0, *dbargs) + dres.addErrback(log.err) + if not refs: + return dres + else: + dres.addCallback(self._getRefdRowKeys) + dres.addCallback(lambda x: + [self._pgerdb.getByRowKey(rk) + for rk in x]) + dres.addCallback(defer.gatherResults) + return dres else: - # return a deferred empty list -- has to be deferred - # because that's the expected result (maybe raise an - # error when we have better error handling). d = defer.Deferred() d.callback([]) return d + + def _getRefdRowKeys(self, rsets): + """ + Get all rowkeys of objects referenced by a list of + resultsets (including rowkeys of the objects represented + in the resultsets themselves). + """ + if rsets: + rowkeys = [] + for rs in rsets: + cname = rs.pgef_class + table = self._registry.getTableName(cname) + klass = self._registry.pgef_classes[cname] + refd = klass._refd + pk = klass._pk + fk = klass._fk + rowdict = {} + for key in pk: + rowdict[key] = getattr(rs, key) + rk = [table, rowdict] + rowkeys.append(rk) + if refd: + for a in refd: + table = self._registry.getTableName(refd[a]) + refdpk = self._registry.pgef_classes[refd[a]]._pk + rowdict = {} + for key in refdpk: + rowdict[key] = getattr(rs, + fk[a][refdpk.index(key)]) + rk = [table, rowdict] + rowkeys.append(rk) + return rowkeys + else: + return [] + def getObjects(self, typename, refs=1, subtypes=0, **kw): """ Get all PGEF objects of a specified type that match the @@ -190,12 +234,7 @@ return result.addCallback(lambda res: self._factory.makeObjects(tn, res)) else: - # for now, return all objects. - result = self._pgerdb.doPgerdbQuery(table, 0) - result.addErrback(log.err) - return result.addCallback(lambda res: - self._factory.makeObjects(tn, res)) - # might need some more error handling here ... + raise ValueError, 'No criteria were supplied.' def getDisplayMappings(self, typename=None): """ @@ -377,21 +416,61 @@ pger_create_datetime and pger_mod_datetime for all the committed objects - @type elist: a list of extracts of instances of subclasses of - L{pangalactic.enterprise.pgefobject.PgefObject} - @param elist: a list of extracts of PGEF objects + @type extracts: list + @param extracts: list of extracts of instances of subclasses of + L{pangalactic.enterprise.pgefobject.PgefObject} + + @rtype: list + @return: list of extracts the PGEF objects + L{pangalactic.enterprise.pgefobject.PgefObject} + that were added """ # TODO: role-based authorization checks based on object # type, etc. - parmdict = {} dt = time.strftime("%Y-%m-%d %H:%M:%S") - parmdict['pger_create_datetime'] = dt - parmdict['pger_mod_datetime'] = dt + datetimes = {} + datetimes['pger_create_datetime'] = dt + datetimes['pger_mod_datetime'] = dt for e in extracts: - e[1].update(parmdict) - recs = self._factory.extracts2Records(extracts) - self._pgerdb.addRows(recs) - return dt + e[1].update(datetimes) + recs = [self._factory.extract2Record(e) + for e in extracts] + d = self._pgerdb.addRows(recs) + d.addCallback(lambda x: self._verifyAddExtract(recs)) + d.addCallback(lambda x: + [self._factory.resultset2Extract(rsl[0]) + for rsl in x]) + return d + # okay, the "rsl[0]" is because _verifyAddExtract returns + # a list of *lists* of resultsets (sheesh!), but there + # is only one resultset in each list because getByRowKey + # just returns one record (it had better!) -- hence the + # rsl[0] is safe ... if weird + + def _verifyAddExtract(self, recs): + """ + Verify that a list of records have been added to PGERDB + by doing a query on the rowkeys of the records to check + that they are in the database. + + @type records: list + @param records: a list of records -- see + L{pangalactic.repo.factory.extract2Record} + """ + return defer.gatherResults( + [self._pgerdb.getByRowKey( + self._factory.record2RowKey(rec)) + for rec in recs]) + + def _addExtractsError(self, error): + """ + Callback for error in addExtracts. + + @type error: a deferred error + @param error: the error propagated by failure of a deferred + """ + log.msg("%s addExtracts failed: %s" % (reflect.qual(self.__class__), error)) + log.err(error) def createProductMaster(self, id, id_context, project_id, project_id_context, **kw): """Creates a ProductMaster in PGER from kw data Index: PanGalactic/pangalactic/repo/xmlrpc.py diff -u PanGalactic/pangalactic/repo/xmlrpc.py:1.21 PanGalactic/pangalactic/repo/xmlrpc.py:1.22 --- PanGalactic/pangalactic/repo/xmlrpc.py:1.21 Sun Oct 5 17:36:05 2003 +++ PanGalactic/pangalactic/repo/xmlrpc.py Tue Oct 7 23:39:36 2003 @@ -1,9 +1,9 @@ """ PGER XML-RPC Interfaces module -@version: $Revision: 1.21 $ +@version: $Revision: 1.22 $ """ -__version__ = "$Revision: 1.21 $"[11:-2] +__version__ = "$Revision: 1.22 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/xmlrpc.py,v $ from twisted.web import xmlrpc @@ -49,50 +49,70 @@ s += """ya gotta have somethin' ...!""" return s - def xmlrpc_getObjects(self, typename, refs, subtypes, *args): + def xmlrpc_getObjects(self, typename, refs, + subtypes, criteria): """ XMLRPC getObjects: get the set of objects that exactly match a specified set of attribute-value pairs, returning - the result encoded in the "extract" format -- see + the result as a list of "extracts" -- see L{pangalactic.utils.factory.extract}) - usage: getObjects([object type], [kw-string, ...]) - - ... where kw-strings have the form: 'param=value' - (i.e., they are not real keyword parameters since - XMLRPC doesn't support keyword parameters; they are - quoted strings that will be parsed by the server). + @type typename: string + @param typename: the name of a class that extends + L{pangalactic.enterprise.pgefobject.PgefObject} + + @type refs: boolean + @param refs: whether to return all referenced objects or + only the specified class + 0: (default) only the specified class + 1: include all reference objects + + @type subtypes: boolean + @param subtypes: whether to return all subtypes of the + requested type or not + 0: (default) not + 1: include all subtypes + + @type criteria: list or dictionary + @param criteria: the selection criteria can take either + of two forms: + - list: a list of [attr, value] pairs + - dict: a dictionary: {attr : value, ...} """ - if args: - kw = {} - tuples = [] - for a in args: - if a and isinstance(a, list): - tuples.append(a) - if a and isinstance(a, dict): - kw.update(a) - if tuples: - kw.update(dict(tuples)) + if criteria: + if isinstance(criteria, list): + kw = dict(criteria) + elif isinstance(criteria, dict): + kw = criteria res = self.PGER.getResultSets(typename, refs, subtypes, **kw) - res.addCallback(self.PGER._factory.resultsets2Extracts) - res.addCallbacks(succeed, fail) + if refs: + res.addCallback(lambda x: + [self.PGER._factory.resultset2Extract(rsl[0]) + for rsl in x]) + else: + res.addCallback(lambda x: + [self.PGER._factory.resultset2Extract(rs) + for rs in x]) return res else: return """I'm sorry, Dave, I'm afraid I can't do that.""" - def xmlrpc_addObjects(self, elist): + def xmlrpc_addObjects(self, extracts): """xmlrpc method to add objects. - usage: addObjects(list of jellied objects) + usage: addObjects(list of extracts) """ # TODO: it would be more efficient to convert the extract # directly into the (classname, kw) used by PgerDb's # addRow(), rather than making an object and then # creating the (classname, kw) from that. But this is # easier for now ... - if elist: - return self.PGER.addExtracts(elist) + if extracts: + # need some error checking here! + # also, could make it so arg could be either a single + # extract or a list of extracts ... + return self.PGER.addExtracts(extracts) else: return """I'm sorry, Dave, I'm afraid I can't do that.""" From waterbug at ned.gsfc.nasa.gov Wed Oct 8 02:53:01 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 8 01:53:03 2003 Subject: [Pangalactic-commits] Replaced GetAcusByCompKey() with GetAcusByAssembly(), which takes a PMV object as its arg. Message-ID: <200310080553.h985r1b9013930@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.12 1.13 Log message: Replaced GetAcusByCompKey() with GetAcusByAssembly(), which takes a PMV object as its arg. Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.12 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.13 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.12 Tue Oct 7 23:31:30 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Wed Oct 8 01:52:59 2003 @@ -3,14 +3,15 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.12 $ +@version: $Revision: 1.13 $ """ -__version__ = "$Revision: 1.12 $"[11:-2] +__version__ = "$Revision: 1.13 $"[11:-2] import xmlrpclib import types from pangalactic.utils.factory import PgefFactory +from pangalactic.enterprise.assemblycomponentusage import AssemblyComponentUsage as ACU #getObjects('Product', 'name=Mr. Fusion') @@ -174,13 +175,17 @@ if data: return [self._factory.remember(x) for x in data] - def GetAcusByCompKey(self, comp_key): - print "getacusbycompkey" - #print 'comp key was: %s' % repr(comp_key) - #data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, *comp_key) - print "compkey", comp_key - data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, comp_key) - #print 'reply was: \n %s' % data + def GetAcusByAssembly(self, assembly): + """ + Get all AssemblyComponentUsages in which the argument (a + L{pangalactic.enterprise.productmodelversion.ProductModelVersion} + is the _assembly (the object that contains the _component + object). + """ + print "in xmlrpcinterface.GetAcusByAssembly" + acu = ACU(_assembly=assembly) + keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']]) + data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict) if data: return self._factory.rememberAll(data) From waterbug at ned.gsfc.nasa.gov Wed Oct 8 02:56:30 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 8 01:56:31 2003 Subject: [Pangalactic-commits] Substituted new GetAcusByAssembly() method for GetAcusByCompKey(). Message-ID: <200310080556.h985uUCs014000@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/datamanager.py 1.39 1.40 Log message: Substituted new GetAcusByAssembly() method for GetAcusByCompKey(). Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.39 PanGalactic/pangalactic/utils/datamanager.py:1.40 --- PanGalactic/pangalactic/utils/datamanager.py:1.39 Tue Oct 7 14:12:30 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Wed Oct 8 01:56:29 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.39 $"[11:-2] +__version__ = "$Revision: 1.40 $"[11:-2] import time import mx.DateTime @@ -356,9 +356,9 @@ objlist = [] for id in AssemblyIDList: - #print "checking " + id + print "checking " + id temp_obj = self.localDB.GetItem(id) - objlist = self.server.GetAcusByCompKey(createACUSearchByAssembly(temp_obj)) + objlist = self.server.GetAcusByAssembly(temp_obj) if not objlist: return None From waterbug at ned.gsfc.nasa.gov Wed Oct 8 04:57:07 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 8 03:57:09 2003 Subject: [Pangalactic-commits] Test for GetAcusByAssembly(). Message-ID: <200310080757.h987v77V015427@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py 1.6 1.7 Log message: Test for GetAcusByAssembly(). Index: PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py diff -u PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.6 PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.7 --- PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py:1.6 Tue Oct 7 23:33:21 2003 +++ PanGalactic/pangalactic/client/tests/test_xmlrpcinterface.py Wed Oct 8 03:57:05 2003 @@ -14,6 +14,7 @@ from pangalactic.enterprise.productversion import ProductVersion as PV from pangalactic.enterprise.productmodelmaster import ProductModelMaster as PMM from pangalactic.enterprise.productmodelversion import ProductModelVersion as PMV +from pangalactic.enterprise.assemblycomponentusage import AssemblyComponentUsage as ACU f = open('../../test/IDTEST') savedid = f.read() @@ -60,19 +61,12 @@ # ACU test -comp_key = { - 'assembly_id' : '1', - 'assembly_of_pmm_id' : 'Default Model', - 'assembly_of_pv_id' : '42', - 'assembly_of_pm_id' : 'HOG', - 'assembly_of_pm_id_context' : 'TEST', - 'component_id' : '1', - 'component_of_pmm_id' : 'Default Model', - 'component_of_pv_id' : '3B', - 'component_of_pm_id' : 'IDrive', - 'component_of_pm_id_context' : 'TEST' - } +pmvHOG = PMV(id='1', + of_pmm_id='Default Model', + of_pv_id='42', + of_pm_id='HOG', + of_pm_id_context='TEST') -res = xcli.GetAcusByCompKey(comp_key) -print res[0] +res = xcli.GetAcusByAssembly(pmvHOG) +print res From waterbug at ned.gsfc.nasa.gov Wed Oct 8 06:18:44 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 8 05:18:46 2003 Subject: [Pangalactic-commits] First cut at a wrapper for Express Engine. Message-ID: <200310080918.h989Iidb016265@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/expressengine.py None 1.1 Log message: First cut at a wrapper for Express Engine. From pbear at ned.gsfc.nasa.gov Wed Oct 8 12:30:49 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 8 11:30:50 2003 Subject: [Pangalactic-commits] changed from obj._of_xxx.id to obj.of_xxx_id; only get pmvs on login; typo in xmlrpc Message-ID: <200310081530.h98FUnXb022161@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py 1.30 1.31 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.104 1.105 PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py 1.18 1.19 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py 1.30 1.31 PanGalactic/pangalactic/client/modules/psm/pgeftree.py 1.27 1.28 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.4 1.5 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.116 1.117 PanGalactic/pangalactic/utils/datamanager.py 1.40 1.41 PanGalactic/pangalactic/utils/localdb.py 1.38 1.39 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.13 1.14 Log message: changed from obj._of_xxx.id to obj.of_xxx_id; only get pmvs on login; typo in xmlrpc Index: PanGalactic/pangalactic/client/modules/psm/pgeftree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.27 PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.28 --- PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.27 Mon Sep 29 15:18:19 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgeftree.py Wed Oct 8 11:30:46 2003 @@ -9,7 +9,7 @@ import pangalactic.utils.objectstatus as objectstatus import cPickle, types -__version__ = "$Revision: 1.27 $"[11:-2] +__version__ = "$Revision: 1.28 $"[11:-2] class PgefTree(wxTreeCtrl): @@ -185,20 +185,21 @@ print " maybe need to rebuild datamanager.nauoIDs?" print " nauonodes", NauoNodes - #print "num nauonodes:" + str(len(NauoNodes)) + #print "num nauonodes", len(NauoNodes) #print "nauonodes:", NauoNodes treeid = roottreenode for id in NauoNodes: nauoobj = parent.DataManager.localDB.GetNauo(id) - #print "nauoobj", id + #print "nauoobj", nauoobj itemobj = nauoobj._component + #print "itemobj", itemobj if itemobj and nauoobj.state <> objectstatus.DELETE: #print "itemobj", itemobj #print "nauoobj.component:", nauoobj.component, "; action: ", str(nauoobj.state) #print "product id:", itemobj.id, "; action:", itemobj.state, "; parent:", itemobj.has_parts_flag - foo = itemobj._of_master.id + "." + itemobj._of_version.id + foo = itemobj.of_pm_id + "." + itemobj.of_pv_id #print "appending foo", foo treeid = self.AppendItem(roottreenode, foo) self.SetPyData(treeid, [nauoobj.pgef_oid, itemobj.pgef_oid]) @@ -244,7 +245,7 @@ #print itemobj.name, itemobj.has_parts_flag if itemobj.state <> objectstatus.DELETE: #print "appending", itemobj.name - foo = itemobj._of_master.id + "." + itemobj._of_version.id + foo = itemobj.of_pm_id + "." + itemobj.of_pv_id treeid = self.AppendItem(roottreenode, foo) self.SetPyData(treeid, ['TOPLEVEL', itemobj.pgef_oid]) self.SetItemImage(treeid, self.itemicon) Index: PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py diff -u PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py:1.30 PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py:1.31 --- PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py:1.30 Mon Sep 29 15:18:19 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemdroptarget.py Wed Oct 8 11:30:46 2003 @@ -9,7 +9,7 @@ from wxPython.wx import wxCustomDataObject, wxCustomDataFormat, wxPyDropTarget from wxPython.wx import true, false, wxPoint, wxTreeItemIcon_Selected -__version__ = "$Revision: 1.30 $"[11:-2] +__version__ = "$Revision: 1.31 $"[11:-2] #constants @@ -202,7 +202,7 @@ # create the new tree node dropobj = [newnauo.pgef_oid, dropitem.pgef_oid] - foo = dropitem._of_master.id + "." + dropitem._of_version.id + foo = dropitem.of_pm_id + "." + dropitem.of_pv_id id = self.tree.AppendItem(targetnode, foo) self.tree.SetItemImage(id, self.tree.itemicon) self.tree.SetItemImage(id, self.tree.itemicon, wxTreeItemIcon_Selected) Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.13 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.14 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.13 Wed Oct 8 01:52:59 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Wed Oct 8 11:30:47 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.13 $ +@version: $Revision: 1.14 $ """ -__version__ = "$Revision: 1.13 $"[11:-2] +__version__ = "$Revision: 1.14 $"[11:-2] import xmlrpclib import types @@ -113,7 +113,7 @@ 'of_pm_id_context' : pmm.of_pm_id_context, 'of_pv_id' : pmm.of_pv_id, 'of_pmm_id' : pmm.id} - data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit) + data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit) if data: return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) for x in data] @@ -148,6 +148,7 @@ data = self._RPC.getObjects('ProductModelVersion', 1, 0, {'project_id' : project}) if data: + #print "have data", len(data) return self._factory.rememberAll(data, objs) def GetPMV(self, ItemId, objs=[]): @@ -164,13 +165,13 @@ return [self._factory.remember(x) for x in data] def GetOrganizations(self): - print "xmlrpc.getorgs" + print "xmlrpc.getorganizations" data = self._RPC.getObjects('Organization', "id_context=DEMO") ## NOT staying. Demo only!! --vwk 28feb2003 if data: return [self._factory.remember(x) for x in data] def GetOrganization(self, ObjId): - print "getorganization" + print "xmlrpc.getorganization" data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId) if data: return [self._factory.remember(x) for x in data] @@ -182,11 +183,13 @@ is the _assembly (the object that contains the _component object). """ - print "in xmlrpcinterface.GetAcusByAssembly" + #print "in xmlrpcinterface.GetAcusByAssembly" acu = ACU(_assembly=assembly) keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']]) + #print "keydict", keydict data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict) if data: + #print "have data" return self._factory.rememberAll(data) def GetPerson(self, user_tuple): Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.4 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.5 --- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.4 Tue Oct 7 14:35:01 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py Wed Oct 8 11:30:46 2003 @@ -28,7 +28,7 @@ self.DeleteAllItems() rootitem = datamanager.localDB.GetItem(rootitemid) - foo = rootitem._of_master.id + "." + rootitem._of_version.id + foo = rootitem.of_pm_id + "." + rootitem.of_pv_id self.nodeStack.append(self.AddRoot(foo)) rootnode = self.GetRootItem() Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.104 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.105 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.104 Tue Oct 7 13:59:03 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Wed Oct 8 11:30:46 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.104 $"[11:-2] +__version__ = "$Revision: 1.105 $"[11:-2] # Python imports import copy @@ -1223,21 +1223,21 @@ elif self.pm_pv_form.EditingProductMaster: #print 'editing Product Master' olditem = self.DataManager.localDB.GetItem(itemid) - save_object = olditem._of_master + save_object = olditem #._of_master self.pm_pv_form.FillPMWithFormData(save_object) save_object.state = pangalactic.utils.objectstatus.MODIFY elif self.pm_pv_form.EditingProductVersion: #print 'editing Product Version' olditem = self.DataManager.localDB.GetItem(itemid) - save_object = olditem._of_version + save_object = olditem #._of_version self.pm_pv_form.FillPVWithFormData(save_object) save_object.state = pangalactic.utils.objectstatus.MODIFY elif self.pmm_pmv_form.EditingProductModelMaster: #print 'editing Product Model Master' olditem = self.DataManager.localDB.GetItem(itemid) - save_object = olditem._of_model_master + save_object = olditem #._of_model_master self.pmm_pmv_form.FillPMMWithFormData(save_object) save_object.state = pangalactic.utils.objectstatus.MODIFY Index: PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.18 PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.19 --- PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.18 Wed Sep 17 13:12:24 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py Wed Oct 8 11:30:46 2003 @@ -54,7 +54,7 @@ #print "pgefdoctree: loadtreefrompls" self.DeleteAllItems() rootitem = datamanager.localDB.GetItem(rootitemid) - foo = rootitem._of_master.id + "." + rootitem._of_version.id + foo = rootitem.of_pm_id + "." + rootitem.of_pv_id self.nodeStack.append(self.AddRoot(foo)) rootnode = self.GetRootItem() @@ -147,7 +147,7 @@ self.DeleteAllItems() rootitem = datamanager.localDB.GetItem(rootitemid) - foo = rootitem._of_master.id + "." + rootitem._of_version.id + foo = rootitem.of_pm_id + "." + rootitem.of_pv_id self.nodeStack.append(self.AddRoot(foo)) rootnode = self.GetRootItem() Index: PanGalactic/pangalactic/client/modules/psm/pgefedittree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.30 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.31 --- PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.30 Mon Sep 29 15:18:19 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefedittree.py Wed Oct 8 11:30:46 2003 @@ -34,7 +34,7 @@ self.DeleteAllItems() rootitem = datamanager.localDB.GetItem(rootitemid) - foo = rootitem._of_master.id + "." + rootitem._of_version.id + foo = rootitem.of_pm_id + "." + rootitem.of_pv_id self.nodeStack.append(self.AddRoot(foo)) rootnode = self.GetRootItem() @@ -98,12 +98,12 @@ if classname == "ProductMaster": foo = rootitem.id elif classname == "ProductModelMaster": - foo = rootitem._of_master.id + "." + rootitem._of_version.id + foo = rootitem.of_pm_id + "." + rootitem.of_pv_id elif classname == "ProductVersion": - foo = rootitem._of_master.id + "." + rootitem.id + foo = rootitem.of_pm_id + "." + rootitem.id elif classname == "ProductModelVersion": - foo = rootitem._of_master.id + "." + rootitem._of_version.id -# foo = rootitem._of_master.id + "." + rootitem._of_version.id + foo = rootitem.of_pm_id + "." + rootitem.of_pv_id + self.nodeStack.append(self.AddRoot(foo)) # self.nodeStack.append(self.AddRoot(rootitem.name)) changed name to foo here and below. vwk. rootnode = self.GetRootItem() @@ -201,11 +201,7 @@ #print "component: " + itemobj.id if itemobj and nauoobj.state <> objectstatus.DELETE: -# if len(itemobj.name) > 0: -# foo = itemobj.name -# else: -# foo = itemobj.id - foo = itemobj._of_master.id + "." + itemobj._of_version.id + foo = itemobj.of_pm_id + "." + itemobj.of_pv_id treeid = self.AppendItem(rootnode, foo) self.SetPyData(treeid, [nauoobj.pgef_oid, itemobj.pgef_oid]) self.SetItemImage(treeid, self.itemicon) Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.116 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.117 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.116 Tue Oct 7 13:59:03 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Wed Oct 8 11:30:46 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.116 $"[11:-2] +__version__ = "$Revision: 1.117 $"[11:-2] import os import sys @@ -285,11 +285,11 @@ def onGridGlickGetVersions(self, event): - print 'model master grid was clicked' + #print 'model master grid was clicked' ndx = event.GetRow() obj = event.GetEventObject().GetDataObj(ndx) objs = self.version_tree.LoadTreefromObjects(self.DataManager, obj) - print objs + #print objs # WDR: methods for MyFrame def SelectView(self, event): @@ -300,7 +300,7 @@ currentpage = self.remainingSpace.GetSelection() if currentpage != 0: self.tree_notebook.SetSelection(1) - print 'changed tree' + #print 'changed tree' def GetCurrentGrid(self): currentpage = self.remainingSpace.GetSelection() @@ -978,7 +978,7 @@ def ItemClicked(self, itemobj): #ndx): - #print "psmtool.itemclicked", itemobj._of_master.id + #print "psmtool.itemclicked" # itemid = self.itemgrid.GetObjectOid(ndx) itemid = itemobj.pgef_oid self.State.treeroot = itemid @@ -1093,47 +1093,6 @@ #print "numitems", numitems self.FillItemWidgetFromProject(project) -## localitemdict = self.DataManager.localDB.GetLocalProducts(project, pmv = 1) -## itemlist = [] -## for objid, obj in localitemdict.items(): -## localobj = localitemdict[objid] -## if localobj.name: -## foo = localobj._of_master.id + "." + localobj._of_version.id + " (" + localobj.name + ")" -## else: -## foo = localobj._of_master.id + "." + localobj._of_version.id -## itemlist.append([foo, obj]) - -### if len(itemlist) == 0: -### wxEndBusyCursor() -### if dlg: -### dlg.Destroy() -### return -### else: -## if len(itemlist) > 0: -## itemlist.sort() - -## # moved this here so Export is only enabled if there is stuff to export -## wgt = self.Parent.menuBar.FindMenuItem('File', 'Export') -## self.Parent.menuBar.Enable(wgt, true) - -## self.FillGridWithProducts(self.itemgrid, itemlist) -## self.itemgrid.ClearGrid() -## self.itemgrid.DefaultBackgroundColour() -## self.itemgrid.ClearSelection() - -## self.itemgrid.BeginBatch() -## for name, item in itemlist: -## self.itemgrid.AddData(item) - -## self.itemgrid.MakeCellVisible(0, 0) -## self.itemgrid.EndBatch() -## self.topWindow.toppanel.FillItemWidget(itemlist, "Select a Product Model") -## self.itemlistcount = len(itemlist) - -## # wgt = self.topWindow.toppanel.GetItemWidget() -## # wgt.Enable(true) -## # wgt.SetSelection(0) - if numitems > 0: wgt = self.Parent.menuBar.FindMenuItem('File', 'Export') self.Parent.menuBar.Enable(wgt, true) @@ -1225,9 +1184,9 @@ if classname == "ProductModelVersion": #print " append pmv" if newitem.name: - foo = newitem._of_master.id + "." + newitem._of_version.id + " (" + newitem.name + ")" + foo = newitem.of_pm_id + "." + newitem.of_pv_id + " (" + newitem.name + ")" else: - foo = newitem._of_master.id + "." + newitem._of_version.id + foo = newitem.of_pm_id + "." + newitem.of_pv_id wgt.AddData(foo, newitem) # commented out for now. don't automatically change the selected item. vwk @@ -1273,15 +1232,15 @@ pm_list.append([item.id, item]) elif classname == "ProductModelMaster": - foo = item._of_master.id + "." + item._of_version.id + foo = item.of_pm_id + "." + item.of_pv_id pmm_list.append([foo, item]) elif classname == "ProductVersion": - foo = item._of_master.id + "." + item.id + foo = item.of_pm_id + "." + item.id pv_list.append([foo, item]) elif classname == "ProductModelVersion": - foo = item._of_master.id + "." + item._of_version.id + foo = item.of_pm_id + "." + item.of_pv_id pmv_list.append([foo, item]) pm_list.sort() @@ -1311,29 +1270,13 @@ itemlist = [] for item in localpmvs: if item.name: - foo = item._of_master.id + "." + item._of_version.id + " (" + item.name + ")" + foo = item.of_pm_id + "." + item.of_pv_id + " (" + item.name + ")" else: - foo = item._of_master.id + "." + item._of_version.id + foo = item.of_pm_id + "." + item.of_pv_id itemlist.append([foo, item]) itemlist.sort() self.topWindow.toppanel.FillItemWidget(itemlist, "Select a Product Model") -# self.FillItemWidget(localpmvs) -# widget.SetSelection(0) - - -# def FillItemWidget(self, itemlist): -# print "psmtool.fillitemwgt" -# widget = self.topWindow.toppanel.GetItemWidget() -# widget.Clear() -# widget.Append('Select a Product Model') -# for item in itemlist: -# if item.name: -# foo = item._of_master.id + "." + item._of_version.id + " (" + item.name + ")" -# else: -# foo = item._of_master.id + "." + item._of_version.id -# widget.Append(foo) -# widget.SetSelection(0) def FillGridWithProducts(self, grid, productlist): #print "fillgridwithproducts" @@ -1530,11 +1473,11 @@ def OnEditComponent(self, event): - print "psmtool.oneditcomponent" + #print "psmtool.oneditcomponent" node = self.tree.GetSelection() if node.IsOk(): nodedata = self.tree.GetPyData(node) - print "nodedata", nodedata + #print "nodedata", nodedata if node == self.tree.GetRootItem(): if nodedata[1] == "ROOT": return @@ -1632,7 +1575,7 @@ wxSafeYield() def QuickCreate(self, event = None): - print "psmtool.quickcreate" + #print "psmtool.quickcreate" create_results = quickcreate.showQuickCreate(self) if create_results: #print 'in psmtools, quickcreate' Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.40 PanGalactic/pangalactic/utils/datamanager.py:1.41 --- PanGalactic/pangalactic/utils/datamanager.py:1.40 Wed Oct 8 01:56:29 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Wed Oct 8 11:30:47 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.40 $"[11:-2] +__version__ = "$Revision: 1.41 $"[11:-2] import time import mx.DateTime @@ -257,9 +257,11 @@ try: #data = self.server.CallServerFunction(projectlist,'GetItemByProject', self.auth) data = self.server.GetPmvByProject(projectlist[0]) - pms = self.server.GetPmByProject(projectlist[0]) - pvs = self.server.GetPvByProject(projectlist[0]) - pmms = self.server.GetPmmByProject(projectlist[0]) + + # only need to get the lowest level??? --vwk 8oct2003 + #pms = self.server.GetPmByProject(projectlist[0]) + #pvs = self.server.GetPvByProject(projectlist[0]) + #pmms = self.server.GetPmmByProject(projectlist[0]) #print 'items for project: %s are: %s' % (projectlist[0], data) except Exception, e: print "no items in project" @@ -289,6 +291,7 @@ if len(tempobjlist) > 0: + #print len(tempobjlist) self.localDB.Save(tempobjlist) # tbd - need to revisit after the project info is ironed out as this will not work for more than 1 project @@ -350,15 +353,16 @@ def getNAUOByAssemblyID(self, AssemblyIDList, NauoID = 'ROOT'): """Retrieves all of the NAUOs associated with an AssemblyID""" - #print "getnauobyassemblyid" + #print "datamanager.getnauobyassemblyid" retlist = [] objlist = [] for id in AssemblyIDList: - print "checking " + id + #print "checking " + id temp_obj = self.localDB.GetItem(id) objlist = self.server.GetAcusByAssembly(temp_obj) + #print "len objlist", len(objlist) if not objlist: return None @@ -371,15 +375,18 @@ continue if obj.__class__.__name__ == "AssemblyComponentUsage": -# if isinstance(obj, AssemblyComponentUsage): nauoobjs.append(obj) + #print "appending", obj.__class__.__name__ + #print obj elif obj.__class__.__name__ == "ProductModelVersion": -# elif isinstance(obj, ProductModelVersion): itemobjs.append(obj) + #print "appending", obj.__class__.__name__ + #print obj if len(nauoobjs) > 0: updatedacuobjs = [] nauoids = [] + #print "saving nauoobjs", len(nauoobjs) updatedacuobjs = self.localDB.Save(nauoobjs) #add the nauos to the projectobject dictionary in localdb @@ -406,14 +413,13 @@ for obj in objlist: if obj.__class__.__name__ == "AssemblyComponentUsage": -# if isinstance(obj, AssemblyComponentUsage): nauo = self.localDB.GetNauo(obj.pgef_oid) retlist.append(nauo) elif obj.__class__.__name__ == "ProductModelVersion": -# elif isinstance(obj, ProductModelVersion): item = self.localDB.GetItem(obj.pgef_oid) retlist.append(item) + #print "len retlist", len(retlist) return retlist @@ -869,17 +875,17 @@ def getVersionTreeObjects(self, root_object): objs = [] if self.user._loggedin: - print 'logged in' + #print 'logged in' if root_object.__class__.__name__ == 'ProductMaster': - objs = self.server.GetPvByPm(root_object._of_pm_id, root_object._of_pm_id_context) + objs = self.server.getPvByPm(root_object) elif root_object.__class__.__name__ == 'ProductVersion': - objs = self.server.GetPmmByPv(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id) + objs = self.server.getPmmByPv(root_object) elif root_object.__class__.__name__ == 'ProductModelMaster': - objs = self.server.GetPmvByPm(root_object._of_pm_id, root_object._of_pm_id_context, root_object._of_pv_id, root_object._of_pmm_id) + objs = self.server.getPmvByPmm(root_object) elif root_object.__class__.__name__ == 'ProductModelVersion': return None else: - print 'not logged in' + #print 'not logged in' objs = self.localDB.getVersionTreeObjects(root_object) return objs Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.38 PanGalactic/pangalactic/utils/localdb.py:1.39 --- PanGalactic/pangalactic/utils/localdb.py:1.38 Tue Oct 7 15:16:15 2003 +++ PanGalactic/pangalactic/utils/localdb.py Wed Oct 8 11:30:47 2003 @@ -263,7 +263,6 @@ def SaveACU(self, aculist): #print "localdb.SaveACU" - #import pprint retlist = [] for acuobj in aculist: try: @@ -275,20 +274,19 @@ component_tuple = data_utils.createACUComponentTuple(acuobj) if not self.dbroot[self.ACUBYASSEMBLY].has_key((assembly_tuple, component_tuple)): - #print "no key", assembly_tuple, component_tuple + #print "no acubyassembly key", assembly_tuple, component_tuple updated_acu = self.updateACU(acuobj) self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu self.dbroot[self.ACUBYASSEMBLY][(assembly_tuple, component_tuple)] = updated_acu - #pprint.pprint(acuobj.__dict__) retlist.append(updated_acu) else: - #print "have key", assembly_tuple, component_tuple + #print "have acubyassembly key", assembly_tuple, component_tuple updated_acu = self.dbroot[self.ACUBYASSEMBLY][(assembly_tuple, component_tuple)] self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu # add this to fix itemdropdown selection bug??? vwk retlist.append(updated_acu) self.Commit() - #print "len retlist", len(retlist)#, retlist + #print "len retlist", len(retlist) #print "acudict", self.GetACUDict() return retlist @@ -302,11 +300,13 @@ if assembly_pmv: acu_obj._assembly = assembly_pmv else: + #print "saving assemblypmv" self.SavePMV([acu_obj._assembly]) if component_pmv: acu_obj._component = component_pmv else: + #print "saving componentpmv" self.SavePMV([acu_obj._component]) return acu_obj @@ -658,6 +658,8 @@ def getProductByCompoundKey(self, comp_key, type): + #print "localdb.getproductbycompoundkey" + dict = None if type == 'pmv': dict = self.PMVBYPRIMARYKEY elif type == 'pmm': @@ -666,12 +668,18 @@ dict = self.PVBYPRIMARYKEY elif type == 'pm': dict = self.PMBYPRIMARYKEY - - temp = self.dbroot[dict][comp_key] - if temp: - return temp - else: - return None + + if dict: + try: + temp = self.dbroot[dict][comp_key] + if temp: + #print "found", temp + return temp + except: + #print "no product for key", comp_key, "in dict", dict + return None + + return None def GetDocumentDict(self): @@ -1019,15 +1027,10 @@ #print "localdb.save" retlist = [] if unsavedlist: - #print "have unsaved list + len: " + str(len(unsavedlist)) + #print "have unsaved list; len: " + str(len(unsavedlist)) for obj in unsavedlist: - #print type(obj) - #print isinstance(obj,ProductModelVersion) - #print obj.__class__.__name__ - # print "have obj" - #if isinstance(obj, nauo.NAUO): + #print obj.__class__.__name__, obj.id, obj.name if obj.__class__.__name__ == "AssemblyComponentUsage": -# if isinstance(obj, AssemblyComponentUsage): #pcu #print "localdb.save.acu" if self.dbroot[self.ACUDICT].has_key(obj.pgef_oid): #print "have key" @@ -1037,19 +1040,17 @@ #print "have state" #print "obj.state " + str(obj.state) if override: - #print "override", obj.pgef_oid + #print "override", obj.pgef_oid, obj.id retlist.extend(self.SaveACU([obj])) else: - #print "no state", obj.pgef_oid + #print "no state", obj.pgef_oid, obj.id retlist.extend(self.SaveACU([obj])) else: - #print "no key", obj.pgef_oid + #print "no key", obj.pgef_oid, obj.id retlist.extend(self.SaveACU([obj])) elif obj.__class__.__name__ == "ProductModelVersion": -# elif isinstance(obj, ProductModelVersion): #print "have ProductModelVersion" - #print obj.pgpdm_oid if self.dbroot[self.ITEMDICT].has_key(obj.pgef_oid): #print "have key" #print "obj state: " + str(obj.state) @@ -1240,8 +1241,7 @@ # retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfTransition([obj]) else: - print "have unknown obj to save" - #print repr(obj) + print "have unknown obj to save", obj.__class__.__name__, obj.id self.Commit() #print "retlist", retlist return retlist From waterbug at ned.gsfc.nasa.gov Wed Oct 8 21:28:58 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 8 20:29:00 2003 Subject: [Pangalactic-commits] Updates. Message-ID: <200310090028.h990SwLl028607@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/xml/pgerdb.dtd None 1.1 PanGalactic/src/xml/pgefdb.dtd 1.1.1.1 None Log message: Updates. From waterbug at ned.gsfc.nasa.gov Wed Oct 8 21:30:01 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 8 20:30:02 2003 Subject: [Pangalactic-commits] Clean-up. Message-ID: <200310090030.h990U1ak028656@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/glimpseserver.py 1.7 1.8 Log message: Clean-up. Index: PanGalactic/pangalactic/repo/glimpseserver.py diff -u PanGalactic/pangalactic/repo/glimpseserver.py:1.7 PanGalactic/pangalactic/repo/glimpseserver.py:1.8 --- PanGalactic/pangalactic/repo/glimpseserver.py:1.7 Tue Jul 15 14:20:42 2003 +++ PanGalactic/pangalactic/repo/glimpseserver.py Wed Oct 8 20:29:59 2003 @@ -2,14 +2,13 @@ PGER GlimpseServer module: a very simple Python wrapper for the server interface of the full-text search engine, Glimpse. -@version: $Revision: 1.7 $ +@version: $Revision: 1.8 $ """ -__version__ = "$Revision: 1.7 $"[11:-2] +__version__ = "$Revision: 1.8 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/glimpseserver.py,v $ import os -from twisted.spread import pb from twisted.internet.utils import getProcessOutput class GlimpseServer: From waterbug at ned.gsfc.nasa.gov Wed Oct 8 21:32:10 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 8 20:32:11 2003 Subject: [Pangalactic-commits] Mods to use ACU in tests. Message-ID: <200310090032.h990WASW028716@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/IDTEST 1.18 1.19 PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py 1.1 1.2 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py 1.10 1.11 Log message: Mods to use ACU in tests. Index: PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py diff -u PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.10 PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.11 --- PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py:1.10 Tue Oct 7 23:35:50 2003 +++ PanGalactic/pangalactic/test/test_xmlrpc_getobjects.py Wed Oct 8 20:32:08 2003 @@ -1,4 +1,4 @@ -# $Id: test_xmlrpc_getobjects.py,v 1.10 2003/10/08 03:35:50 waterbug Exp $ +# $Id: test_xmlrpc_getobjects.py,v 1.11 2003/10/09 00:32:08 waterbug Exp $ """ Functional test for pangalactic.repo.xmlrpc.PgerXmlrpcService @@ -16,18 +16,18 @@ from pangalactic.repo.pger import Pger from pangalactic.repo.xmlrpc import PgerXmlrpcService -typename = 'ProductMaster' +typename = 'AssemblyComponentUsage' def success(stuff): print "\n*** XMLRPC Command:" - print """ Server.getObjects('ProductMaster', 1, 0, ['name', 'Mr. Fusion'])\n""" + print """ Server.getObjects('AssemblyComponentUsage', 1, 0, ['assembly_of_pm_id', 'HOG'])\n""" print "*** Extract list obtained as result:" print "====================================" pprint(stuff) print "====================================" print "\n*** Remembered objects:" olist = pgr._factory.rememberAll(stuff) - print "%s %s(s) found" % (len(olist), typename) + print "%s objects found" % len(olist) if olist: print "====================================" pprint(olist) @@ -47,7 +47,7 @@ pgr = Pger(db) xmlsrv = PgerXmlrpcService(pgr) -res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, [['name', 'Mr. Fusion']]) +res = xmlsrv.xmlrpc_getObjects(typename, 1, 0, [['assembly_of_pm_id', 'HOG']]) res.addCallbacks(success, failure) reactor.run() Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.18 PanGalactic/pangalactic/test/IDTEST:1.19 --- PanGalactic/pangalactic/test/IDTEST:1.18 Tue Oct 7 23:35:49 2003 +++ PanGalactic/pangalactic/test/IDTEST Wed Oct 8 20:32:08 2003 @@ -1 +1 @@ -291 \ No newline at end of file +298 \ No newline at end of file Index: PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py diff -u PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py:1.1 PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py:1.2 --- PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py:1.1 Tue Oct 7 23:37:31 2003 +++ PanGalactic/pangalactic/test/test_pger_getResultSetsWithRefs.py Wed Oct 8 20:32:08 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_getResultSetsWithRefs.py,v 1.1 2003/10/08 03:37:31 waterbug Exp $ +# $Id: test_pger_getResultSetsWithRefs.py,v 1.2 2003/10/09 00:32:08 waterbug Exp $ """ Functional test for pangalactic.repo.pger module @@ -13,7 +13,7 @@ from pangalactic.repo.db import PgerDb from pangalactic.repo.pger import Pger -typename = "ProductModelVersion" +typename = "AssemblyComponentUsage" def success(resultsets): pprint(resultsets) @@ -27,7 +27,7 @@ pgr = Pger(pgrdb) out = pgr.getResultSets(typename, 1, 0, - name='Blooper Twanging Assembly') + assembly_of_pm_id='HOG') out.addCallbacks(success, failure) From bmuir at ned.gsfc.nasa.gov Thu Oct 9 14:00:20 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Thu Oct 9 13:00:23 2003 Subject: [Pangalactic-commits] highlight of selected object in the version tree Message-ID: <200310091700.h99H0KO0004904@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.5 1.6 Log message: highlight of selected object in the version tree Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.5 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.6 --- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.5 Wed Oct 8 11:30:46 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py Thu Oct 9 13:00:19 2003 @@ -26,59 +26,60 @@ def LoadTreefromProject(self, datamanager, rootitemid, rootpdrid, currentdata = None): """Loads the tree from the dicts in the DataManager""" - self.DeleteAllItems() - rootitem = datamanager.localDB.GetItem(rootitemid) - foo = rootitem.of_pm_id + "." + rootitem.of_pv_id - self.nodeStack.append(self.AddRoot(foo)) - rootnode = self.GetRootItem() - - if rootitem.has_parts_lists_flag: - self.SetItemHasChildren(rootnode, true) - - if datamanager.user._loggedin: - if not self.IsExpanded(rootnode): - datamanager.getPDRByItemID([rootitemid]) - - self.SetPyData(rootnode, [rootpdrid, rootitemid]) - self.SetItemImage(rootnode, self.itemicon) - self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected) - - lookupid = rootitemid - tmppdrid = rootpdrid - - PdrNodes = [] - highlightednode = None - if datamanager.pdrIDs.has_key(lookupid): - #print "found lookupid" - PdrNodes = datamanager.pdrIDs[lookupid] - - elif datamanager.inLocalMode: - for pdrid, pdrobj in datamanager.localDB.GetPDRDict().items(): - if pdrobj.pgef_oid == rootitemid: - PdrNodes.append(pdrid) - - for id in PdrNodes: - pdrobj = datamanager.localDB.GetPDR(id) - plobj = datamanager.localDB.GetPartsList(pdrobj.pgef_oid) - - if plobj: - treeid = self.AppendItem(rootnode, plobj.id) - self.SetPyData(treeid, [pdrobj.pgef_oid, plobj.pgef_oid]) - self.SetItemImage(treeid, self.partslisticon) - self.SetItemImage(treeid, self.partslisticon, wxTreeItemIcon_Selected) - - if currentdata: - if plobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]: - #print "found a node to highlight: " + str(plobj.identification) - highlightednode = treeid - - self.SortChildren(rootnode) - self.Expand(rootnode) - - if highlightednode: - self.SelectItem(highlightednode) - else: - self.SelectItem(rootnode) + #self.DeleteAllItems() + #rootitem = datamanager.localDB.GetItem(rootitemid) + #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id + #self.nodeStack.append(self.AddRoot(foo)) + #rootnode = self.GetRootItem() + + #if rootitem.has_parts_lists_flag: + #self.SetItemHasChildren(rootnode, true) + + #if datamanager.user._loggedin: + #if not self.IsExpanded(rootnode): + #datamanager.getPDRByItemID([rootitemid]) + + #self.SetPyData(rootnode, [rootpdrid, rootitemid]) + #self.SetItemImage(rootnode, self.itemicon) + #self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected) + + #lookupid = rootitemid + #tmppdrid = rootpdrid + + #PdrNodes = [] + #highlightednode = None + #if datamanager.pdrIDs.has_key(lookupid): + ##print "found lookupid" + #PdrNodes = datamanager.pdrIDs[lookupid] + + #elif datamanager.inLocalMode: + #for pdrid, pdrobj in datamanager.localDB.GetPDRDict().items(): + #if pdrobj.pgef_oid == rootitemid: + #PdrNodes.append(pdrid) + + #for id in PdrNodes: + #pdrobj = datamanager.localDB.GetPDR(id) + #plobj = datamanager.localDB.GetPartsList(pdrobj.pgef_oid) + + #if plobj: + #treeid = self.AppendItem(rootnode, plobj.id) + #self.SetPyData(treeid, [pdrobj.pgef_oid, plobj.pgef_oid]) + #self.SetItemImage(treeid, self.partslisticon) + #self.SetItemImage(treeid, self.partslisticon, wxTreeItemIcon_Selected) + + #if currentdata: + #if plobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]: + ##print "found a node to highlight: " + str(plobj.identification) + #highlightednode = treeid + + #self.SortChildren(rootnode) + #self.Expand(rootnode) + + #if highlightednode: + #self.SelectItem(highlightednode) + #else: + #self.SelectItem(rootnode) + pass def buildVersionString(self, obj): if obj.__class__.__name__ == 'ProductModelVersion': @@ -155,8 +156,6 @@ self.Expand(pmm_treeid) version_obj = temp_pmm version_node = pmm_treeid - - objs = datamanager.getVersionTreeObjects(version_obj) @@ -181,6 +180,7 @@ self.Expand(pv_treeid) if temp_pmm: self.Expand(pmm_treeid) + self.SelectItem(version_node) def createTreeLabel(self, obj): if obj.__class__.__name__ == 'ProductModelVersion': From pbear at ned.gsfc.nasa.gov Thu Oct 9 14:05:20 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 9 13:05:21 2003 Subject: [Pangalactic-commits] call xmlrpcinterface.getObjects instead of getxxx; not fully tested. best of luck. Message-ID: <200310091705.h99H5KNT004985@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.28 1.29 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.5 1.6 PanGalactic/pangalactic/utils/datamanager.py 1.41 1.42 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.14 1.15 Log message: call xmlrpcinterface.getObjects instead of getxxx; not fully tested. best of luck. Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.28 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.29 --- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.28 Mon Sep 29 14:47:56 2003 +++ PanGalactic/pangalactic/client/modules/psm/productdataform.py Thu Oct 9 13:05:17 2003 @@ -113,7 +113,7 @@ def EnablePV(self, state): self.GetPvDesc().SetEditable(state) - self.GetPvRevision().SetEditable(state) + self.GetPvRevision().SetEditable(false) self.GetPvName().SetEditable(state) self.GetPvNomenclature() .SetEditable(state) self.GetPvPoc().SetEditable(state) @@ -158,7 +158,7 @@ if self.GetTogglePm().GetValue(): self.GetPmIdentifier().SetFocus() elif self.GetTogglePv().GetValue(): - self.GetPvRevision().SetFocus() + self.GetPvName().SetFocus() def EditingMode(self): #print "productdataform.pmpv.editingmode" @@ -325,7 +325,6 @@ def SavePM(self, pmv): self.FillPMWithFormData(pmv._of_master) - def SavePV(self,pmv): self.FillPVWithFormData(pmv._of_version) @@ -473,7 +472,7 @@ def EnablePMV(self, state): self.GetPmvDesc().SetEditable(state) - self.GetPmvRevision().SetEditable(state) + self.GetPmvRevision().SetEditable(false) self.GetPmvName().SetEditable(state) self.GetPmvNomenclature() .SetEditable(state) self.GetPmvPoc().SetEditable(state) @@ -518,7 +517,7 @@ if self.GetTogglePmm().GetValue(): self.GetPmmIdentifier().SetFocus() elif self.GetTogglePmv().GetValue(): - self.GetPmvRevision().SetFocus() + self.GetPmvName().SetFocus() def EditingMode(self): #print "productdataform.pmmpmv.editingmode" Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.5 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.6 --- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.5 Tue Oct 7 13:53:54 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py Thu Oct 9 13:05:18 2003 @@ -26,7 +26,7 @@ The metadata for all the workflows stored in the local database are displayed in a grid, one per row. - + You can right click on a row (which will select it), and see a menu. More on this in workflowgrid. Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.41 PanGalactic/pangalactic/utils/datamanager.py:1.42 --- PanGalactic/pangalactic/utils/datamanager.py:1.41 Wed Oct 8 11:30:47 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Thu Oct 9 13:05:18 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.41 $"[11:-2] +__version__ = "$Revision: 1.42 $"[11:-2] import time import mx.DateTime @@ -256,13 +256,29 @@ try: #data = self.server.CallServerFunction(projectlist,'GetItemByProject', self.auth) - data = self.server.GetPmvByProject(projectlist[0]) - # only need to get the lowest level??? --vwk 8oct2003 + #data = self.server.GetPmvByProject(projectlist[0]) #pms = self.server.GetPmByProject(projectlist[0]) #pvs = self.server.GetPvByProject(projectlist[0]) #pmms = self.server.GetPmmByProject(projectlist[0]) + + # only need to get the lowest level??? --vwk 8oct2003 + # need to make sure we get all the referenced objects filled in. pass in objs + + fieldnames = {"project_id" : projectlist[0]} + data = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + + #fieldnames = {"project_id" : projectlist[0]} + #pvs = self.server.getObjects("ProductVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + + #fieldnames = {"project_id" : projectlist[0]} + #pms = self.server.getObjects("ProductMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + + #fieldnames = {"project_id" : projectlist[0]} + #pmms = self.server.getObjects("ProductModelMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + #print 'items for project: %s are: %s' % (projectlist[0], data) + except Exception, e: print "no items in project" print e @@ -472,7 +488,9 @@ self.addNauoIDsEntry(nobj, nauo2add, nauo_dict) def getItem(self, itemid): - obj = self.server.GetPMV(itemid) + #obj = self.server.GetPMV(itemid) + fieldnames = {"pgef_oid" : itemid} + obj = self.server.getObject("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) if obj: return obj else: @@ -876,13 +894,29 @@ objs = [] if self.user._loggedin: #print 'logged in' - if root_object.__class__.__name__ == 'ProductMaster': - objs = self.server.getPvByPm(root_object) - elif root_object.__class__.__name__ == 'ProductVersion': - objs = self.server.getPmmByPv(root_object) - elif root_object.__class__.__name__ == 'ProductModelMaster': - objs = self.server.getPmvByPmm(root_object) - elif root_object.__class__.__name__ == 'ProductModelVersion': + classname = root_object.__class__.__name + if classname == 'ProductMaster': + fieldnames = {'of_pm_id' : root_object.id, + 'of_pm_id_context' : root_object.id_context} + objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + #objs = self.server.getPvByPm(root_object) + + elif classname == 'ProductVersion': + fieldnames = {'of_pm_id' : root_object.of_pm_id, + 'of_pm_id_context' : root_object.of_pm_id_context, + 'of_pv_id' : root_object.id} + objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + #objs = self.server.getPmmByPv(root_object) + + elif classname == 'ProductModelMaster': + fieldnames = {'of_pm_id' : root_object.of_pm_id, + 'of_pm_id_context' : root_object.of_pm_id_context, + 'of_pv_id' : root_object.of_pv_id, + 'of_pmm_id' : root_object.id} + objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + #objs = self.server.getPmvByPmm(root_object) + + elif classname == 'ProductModelVersion': return None else: #print 'not logged in' Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.14 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.15 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.14 Wed Oct 8 11:30:47 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Thu Oct 9 13:05:18 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.14 $ +@version: $Revision: 1.15 $ """ -__version__ = "$Revision: 1.14 $"[11:-2] +__version__ = "$Revision: 1.15 $"[11:-2] import xmlrpclib import types @@ -73,88 +73,91 @@ # return 1 - def getObjects(self, classname, fields, refs=0, subtypes=0, - objs=[]): - # eventually call only this? --vwk 23may2003 - data = self._RPC.getObjects(dataname, refs, subtypes, fields) - if data: - if refs: - return [self._factory.rememberAll(data, objs)] - else: - return [self._factory.rememberAll(data, objs)] - - def getDataByOid(self, dataname, fieldname, oid): - # eventually call only this? --vwk 23may2003 - # e.g., GetDataByOid("ProjectModelVersion", "pgef_oid", obj.pgef_oid) - crit = dict([fieldname, oid]) - data = self._RPC.getObjects(dataname, 0, 0, crit) - if data: - return [self._factory.rememberAll(data)] - - def getPvByPm(self, pm): - crit = {'of_pm_id' : pm.id, - 'of_pm_id_context' : pm.id_context} - data = self._RPC.getObjects('ProductVersion', 0, 0, crit) - if data: - return [self._factory.remember(x, [pm]) - for x in data] - - def getPmmByPv(self, pv): - crit = {'of_pm_id' : pv.of_pm_id, - 'of_pm_id_context' : pv.of_pm_id_context, - 'of_pv_id' : pv.id} - data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit) - if data: - return [self._factory.remember(x, [pv, pv._of_master]) - for x in data] + def getObjects(self, classname, fields, refs=0, subtypes=0, objs=[]): + """ + Retrieve the objects specified by the field-value pairs in fieldvaluedict. + + @type classname: string + @param classname: class name of desired objects - def getPmvByPmm(self, pmm): - crit = {'of_pm_id' : pmm.of_pm_id, - 'of_pm_id_context' : pmm.of_pm_id_context, - 'of_pv_id' : pmm.of_pv_id, - 'of_pmm_id' : pmm.id} - data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit) - if data: - return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) - for x in data] + @type fields: dictionary + @param fields: search criteria as attribute:value pairs - def GetPmByProject(self, project, objs=[]): - #print "getpmbyproject" - #print 'ProductMaster' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductMaster', 1, 0, - {'project_id' : project}) - if data: - return self._factory.rememberAll(data, objs) + @type refs: integer (0 or 1) + @param refs: flag for whether or not referenced object are also retrieved. - def GetPmmByProject(self, project, objs=[]): - #print "getpmmbyproject" - #print 'ProductModelMaster' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductModelMaster', 1, 0, - {'project_id' : project}) - if data: - return self._factory.rememberAll(data, objs) + @type subtypes: integer (0 or 1) + @param subtypes: flag for whether or not subclasses of classname are also retrieved. - def GetPvByProject(self, project, objs=[]): - #print "getpvbyproject" - #print 'ProductVersion' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductVersion', 1, 0, - {'project_id' : project}) + @type objs: list + @param objs: objects to be hooked up. Don't worry if you pass an irrelevent object. + """ + # eventually call only this? --vwk 23may2003 + data = self._RPC.getObjects(dataname, refs, subtypes, fields) if data: - return self._factory.rememberAll(data, objs) + return [self._factory.rememberAll(data, objs)] - def GetPmvByProject(self, project, objs=[]): - #print "getpmvbyproject" - #print 'ProductModelVersion' + ' ' + 'project = %s' % project - data = self._RPC.getObjects('ProductModelVersion', 1, 0, - {'project_id' : project}) - if data: - #print "have data", len(data) - return self._factory.rememberAll(data, objs) - def GetPMV(self, ItemId, objs=[]): - data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId) - if data: - return [self._factory.remember(x) for x in data] +## def getPvByPm(self, pm): +## crit = {'of_pm_id' : pm.id, +## 'of_pm_id_context' : pm.id_context} +## data = self._RPC.getObjects('ProductVersion', 0, 0, crit) +## if data: +## return [self._factory.remember(x, [pm]) +## for x in data] + +## def getPmmByPv(self, pv): +## crit = {'of_pm_id' : pv.of_pm_id, +## 'of_pm_id_context' : pv.of_pm_id_context, +## 'of_pv_id' : pv.id} +## data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit) +## if data: +## return [self._factory.remember(x, [pv, pv._of_master]) +## for x in data] + +## def getPmvByPmm(self, pmm): +## crit = {'of_pm_id' : pmm.of_pm_id, +## 'of_pm_id_context' : pmm.of_pm_id_context, +## 'of_pv_id' : pmm.of_pv_id, +## 'of_pmm_id' : pmm.id} +## data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit) +## if data: +## return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) +## for x in data] + +## def GetPmByProject(self, project, objs=[]): +## #print "getpmbyproject" +## #print 'ProductMaster' + ' ' + 'project = %s' % project +## data = self._RPC.getObjects('ProductMaster', 1, 0, {'project_id' : project}) +## if data: +## return self._factory.rememberAll(data, objs) + +## def GetPmmByProject(self, project, objs=[]): +## #print "getpmmbyproject" +## #print 'ProductModelMaster' + ' ' + 'project = %s' % project +## data = self._RPC.getObjects('ProductModelMaster', 1, 0, {'project_id' : project}) +## if data: +## return self._factory.rememberAll(data, objs) + +## def GetPvByProject(self, project, objs=[]): +## #print "getpvbyproject" +## #print 'ProductVersion' + ' ' + 'project = %s' % project +## data = self._RPC.getObjects('ProductVersion', 1, 0, {'project_id' : project}) +## if data: +## return self._factory.rememberAll(data, objs) + +## def GetPmvByProject(self, project, objs=[]): +## #print "getpmvbyproject" +## #print 'ProductModelVersion' + ' ' + 'project = %s' % project +## data = self._RPC.getObjects('ProductModelVersion', 1, 0, {'project_id' : project}) +## if data: +## #print "have data", len(data) +## return self._factory.rememberAll(data, objs) + +## def GetPMV(self, ItemId, objs=[]): +## data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId) +## if data: +## return [self._factory.remember(x) for x in data] def GetCategories(self, context): # Category is a subclass of DataElement. FSC is a From pbear at ned.gsfc.nasa.gov Thu Oct 9 14:33:24 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 9 13:33:27 2003 Subject: [Pangalactic-commits] call xmlrpcinterface.getObjects instead of getxxx; not fully tested. best of luck. Message-ID: <200310091733.h99HXO0g005746@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/datamanager.py 1.42 1.43 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.15 1.16 Log message: call xmlrpcinterface.getObjects instead of getxxx; not fully tested. best of luck. Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.42 PanGalactic/pangalactic/utils/datamanager.py:1.43 --- PanGalactic/pangalactic/utils/datamanager.py:1.42 Thu Oct 9 13:05:18 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Thu Oct 9 13:33:23 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.42 $"[11:-2] +__version__ = "$Revision: 1.43 $"[11:-2] import time import mx.DateTime @@ -490,7 +490,7 @@ def getItem(self, itemid): #obj = self.server.GetPMV(itemid) fieldnames = {"pgef_oid" : itemid} - obj = self.server.getObject("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + obj = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) if obj: return obj else: @@ -501,7 +501,9 @@ def getDocument(self, docid): - obj = self.server.GetDocument(docid) + #obj = self.server.GetDocument(docid) + fieldnames = {"pgef_oid" : docid} + obj = self.server.getObjects("Document", fields = fieldnames, refs = 0, subtypes = 1, objs = []) if obj: return obj else: @@ -523,8 +525,10 @@ print "Document retrieval is not yet implemented" return - for id in ItemIdList: - objlist = self.server.GetPDRByItemID(id) + for objid in ItemIdList: + #objlist = self.server.GetPDRByItemID(objid) + fieldnames = {"document" : objid} + objlist = self.server.getObjects("ProductDocumentRelationship", fields = fieldnames, refs = 1, subtypes = 0, objs = []) pdrids = [] pdrobjs = [] itemobjs = [] @@ -535,18 +539,16 @@ if obj.IsEmpty(): continue - if obj.__class__.__name__ == "ProductDocumentRelationship": -# if isinstance(obj, ProductDocumentRelationship): + classname = obj.__class__.__name__ + if classname == "ProductDocumentRelationship": pdrids.append(obj.pgef_oid) pdrobjs.append(obj) - elif obj.__class__.__name__ == "PartsList": -# elif isinstance(obj, PartsList): + elif classname == "PartsList": self.partsListIDs[obj.pgef_oid] = obj.id partslistobjs.append(obj) - elif obj.__class__.__name__ == "Document": -# elif isinstance(obj, Document): + elif classname == "Document": self.documentIDs[obj.pgef_oid] = obj.id documentobjs.append(obj) Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.15 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.16 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.15 Thu Oct 9 13:05:18 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Thu Oct 9 13:33:23 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.15 $ +@version: $Revision: 1.16 $ """ -__version__ = "$Revision: 1.15 $"[11:-2] +__version__ = "$Revision: 1.16 $"[11:-2] import xmlrpclib import types @@ -14,8 +14,6 @@ from pangalactic.enterprise.assemblycomponentusage import AssemblyComponentUsage as ACU -#getObjects('Product', 'name=Mr. Fusion') - class XmlrpcInterface: def __init__(self, server, port, proxy = None, proxyport = None): if proxy and proxyport: @@ -59,7 +57,7 @@ return newobjects - # TODO: implement this ... + # TODO: implement this ... # def addAlerts(self, object_list): # if object_list: # try: @@ -75,7 +73,7 @@ def getObjects(self, classname, fields, refs=0, subtypes=0, objs=[]): """ - Retrieve the objects specified by the field-value pairs in fieldvaluedict. + Retrieve the objects that have the field-value pairs in fieldvaluedict. @type classname: string @param classname: class name of desired objects @@ -93,72 +91,11 @@ @param objs: objects to be hooked up. Don't worry if you pass an irrelevent object. """ # eventually call only this? --vwk 23may2003 - data = self._RPC.getObjects(dataname, refs, subtypes, fields) + data = self._RPC.getObjects(classname, refs, subtypes, fields) if data: return [self._factory.rememberAll(data, objs)] -## def getPvByPm(self, pm): -## crit = {'of_pm_id' : pm.id, -## 'of_pm_id_context' : pm.id_context} -## data = self._RPC.getObjects('ProductVersion', 0, 0, crit) -## if data: -## return [self._factory.remember(x, [pm]) -## for x in data] - -## def getPmmByPv(self, pv): -## crit = {'of_pm_id' : pv.of_pm_id, -## 'of_pm_id_context' : pv.of_pm_id_context, -## 'of_pv_id' : pv.id} -## data = self._RPC.getObjects('ProductModelMaster', 0, 0, crit) -## if data: -## return [self._factory.remember(x, [pv, pv._of_master]) -## for x in data] - -## def getPmvByPmm(self, pmm): -## crit = {'of_pm_id' : pmm.of_pm_id, -## 'of_pm_id_context' : pmm.of_pm_id_context, -## 'of_pv_id' : pmm.of_pv_id, -## 'of_pmm_id' : pmm.id} -## data = self._RPC.getObjects('ProductModelVersion', 0, 0, crit) -## if data: -## return [self._factory.remember(x, [pmm, pmm._of_version, pmm._of_master]) -## for x in data] - -## def GetPmByProject(self, project, objs=[]): -## #print "getpmbyproject" -## #print 'ProductMaster' + ' ' + 'project = %s' % project -## data = self._RPC.getObjects('ProductMaster', 1, 0, {'project_id' : project}) -## if data: -## return self._factory.rememberAll(data, objs) - -## def GetPmmByProject(self, project, objs=[]): -## #print "getpmmbyproject" -## #print 'ProductModelMaster' + ' ' + 'project = %s' % project -## data = self._RPC.getObjects('ProductModelMaster', 1, 0, {'project_id' : project}) -## if data: -## return self._factory.rememberAll(data, objs) - -## def GetPvByProject(self, project, objs=[]): -## #print "getpvbyproject" -## #print 'ProductVersion' + ' ' + 'project = %s' % project -## data = self._RPC.getObjects('ProductVersion', 1, 0, {'project_id' : project}) -## if data: -## return self._factory.rememberAll(data, objs) - -## def GetPmvByProject(self, project, objs=[]): -## #print "getpmvbyproject" -## #print 'ProductModelVersion' + ' ' + 'project = %s' % project -## data = self._RPC.getObjects('ProductModelVersion', 1, 0, {'project_id' : project}) -## if data: -## #print "have data", len(data) -## return self._factory.rememberAll(data, objs) - -## def GetPMV(self, ItemId, objs=[]): -## data = self._RPC.getObjects('ProductModelVersion', 'pgef_oid=%s' % ItemId) -## if data: -## return [self._factory.remember(x) for x in data] - def GetCategories(self, context): # Category is a subclass of DataElement. FSC is a # Category; it's passed in as the context @@ -205,63 +142,34 @@ if data: return [self._factory.remember(x) for x in data] - #def GetProject(self, project): - def SearchPMV(self, search_tuple): data = self._RPC.getObjects('ProductModelVersion', *search_tuple) if data: return [self._factory.remember(x) for x in data] - #def AddItem(self, itemobj): - - #def AddNauo(self, nauoobj): - - #def DelObjects(self, objlist): - - #def AddObjects(self, objlist): - - #def DelNauo(self, nauo): - - #def AddPartsList(self, partslist): - - def GetPartsList(self, partslistid): - data = self._RPC.getObjects('PartsList', 'pgef_oid=%s' % partslistid) - if data: - return [self._factory.remember(x) for x in data] - - #def AddDocument(self, doc): - - def GetDocument(self, docid): - data = self._RPC.getObjects('Document' , 'pgef_oid=%s' % docid) - if data: - return [self._factory.remember(x) for x in data] +## def GetPartsList(self, partslistid): +## data = self._RPC.getObjects('PartsList', 'pgef_oid=%s' % partslistid) +## if data: +## return [self._factory.remember(x) for x in data] - #def DelPdr(self, pdr): +## def GetDocument(self, docid): +## data = self._RPC.getObjects('Document' , 'pgef_oid=%s' % docid) +## if data: +## return [self._factory.remember(x) for x in data] - #def AddPdr(self, pdr): - def GetPdr(self, pdrid): - data = self._RPC.getObjects('ProductDocumentRelationship', 'pgef_oid=%s' % pdrid) - if data: - return [self._factory.remember(x) for x in data] +## def GetPdr(self, pdrid): +## data = self._RPC.getObjects('ProductDocumentRelationship', 'pgef_oid=%s' % pdrid) +## if data: +## return [self._factory.remember(x) for x in data] - def GetPDRByDocumentID(self, docid): - data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % docid) - if data: - return [self._factory.remember(x) for x in data] +## def GetPDRByDocumentID(self, docid): +## data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % docid) +## if data: +## return [self._factory.remember(x) for x in data] - def GetPDRByItemID(self, itemid): - data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % itemid) - if data: - return [self._factory.remember(x) for x in data] +## def GetPDRByItemID(self, itemid): +## data = self._RPC.getObjects('ProductDocumentRelationship', 'document=%s' % itemid) +## if data: +## return [self._factory.remember(x) for x in data] -# OBE vwk 28oct02 -# def DelIdr(self, idr): -# -# def AddIDR(self, idr): -# -# def GetIDR(self, idrid): -# -# def GetIDRByDocumentID(self, docid): -# -# def GetIDRByItemID(self, itemid): From waterbug at ned.gsfc.nasa.gov Fri Oct 10 12:36:50 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Fri Oct 10 11:36:55 2003 Subject: [Pangalactic-commits] Tweak (mainly to test cvstoys ;^). Message-ID: <200310101536.h9AFao46019442@ned.gsfc.nasa.gov> Modified files: PanGalactic/INSTALL 1.9 1.10 Log message: Tweak (mainly to test cvstoys ;^). Index: PanGalactic/INSTALL diff -u PanGalactic/INSTALL:1.9 PanGalactic/INSTALL:1.10 --- PanGalactic/INSTALL:1.9 Thu Aug 21 14:00:26 2003 +++ PanGalactic/INSTALL Fri Oct 10 11:36:49 2003 @@ -34,7 +34,7 @@ (1) Required for All PGEF Configurations: - - Python (version 2.3 is recommended; 2.2.3 at minimum) + - Python (version 2.3.2 or greater is recommended; 2.2.3 at minimum) http://python.org Configuration: Python has several binary installers for various platforms and can also be compiled and installed from @@ -217,4 +217,4 @@ twistd -f pger.tap ----------------------------------------------------------------- -$Id: INSTALL,v 1.9 2003/08/21 18:00:26 waterbug Exp $ +$Id: INSTALL,v 1.10 2003/10/10 15:36:49 waterbug Exp $ From pbear at ned.gsfc.nasa.gov Tue Oct 14 12:51:38 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 14 11:51:41 2003 Subject: [Pangalactic-commits] fixed typo in getVersionTreeObjects Message-ID: <200310141551.h9EFpcfr001596@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/datamanager.py 1.43 1.44 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.17 1.18 Log message: fixed typo in getVersionTreeObjects Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.43 PanGalactic/pangalactic/utils/datamanager.py:1.44 --- PanGalactic/pangalactic/utils/datamanager.py:1.43 Thu Oct 9 13:33:23 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Tue Oct 14 11:51:37 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.43 $"[11:-2] +__version__ = "$Revision: 1.44 $"[11:-2] import time import mx.DateTime @@ -896,7 +896,7 @@ objs = [] if self.user._loggedin: #print 'logged in' - classname = root_object.__class__.__name + classname = root_object.__class__.__name__ if classname == 'ProductMaster': fieldnames = {'of_pm_id' : root_object.id, 'of_pm_id_context' : root_object.id_context} Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.17 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.18 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.17 Fri Oct 10 11:02:49 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 14 11:51:37 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.17 $ +@version: $Revision: 1.18 $ """ -__version__ = "$Revision: 1.17 $"[11:-2] +__version__ = "$Revision: 1.18 $"[11:-2] import xmlrpclib import types @@ -91,7 +91,7 @@ @param objs: objects to be hooked up. Don't worry if you pass an irrelevent object. """ # eventually call only this? --vwk 23may2003 - print "xmlrpc.getObjects", classname + print "xmlrpc.getObjects", classname, fields, refs, subtypes data = self._RPC.getObjects(classname, refs, subtypes, fields) if data: return self._factory.rememberAll(data, objs) From pbear at ned.gsfc.nasa.gov Tue Oct 14 14:02:30 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 14 13:02:32 2003 Subject: [Pangalactic-commits] fixed more typos in getversiontreeobjects Message-ID: <200310141702.h9EH2UIu002579@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/datamanager.py 1.44 1.45 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.18 1.19 Log message: fixed more typos in getversiontreeobjects Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.44 PanGalactic/pangalactic/utils/datamanager.py:1.45 --- PanGalactic/pangalactic/utils/datamanager.py:1.44 Tue Oct 14 11:51:37 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Tue Oct 14 13:02:29 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.44 $"[11:-2] +__version__ = "$Revision: 1.45 $"[11:-2] import time import mx.DateTime @@ -893,37 +893,38 @@ self.refresh = False def getVersionTreeObjects(self, root_object): - objs = [] + #print "datamanager.getversiontreeobjects", root_object + objlist = [] if self.user._loggedin: #print 'logged in' classname = root_object.__class__.__name__ if classname == 'ProductMaster': - fieldnames = {'of_pm_id' : root_object.id, - 'of_pm_id_context' : root_object.id_context} - objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) - #objs = self.server.getPvByPm(root_object) + fieldnames = {'id' : root_object.id, + 'id_context' : root_object.id_context} + objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + #objlist = self.server.getPvByPm(root_object) elif classname == 'ProductVersion': fieldnames = {'of_pm_id' : root_object.of_pm_id, 'of_pm_id_context' : root_object.of_pm_id_context, - 'of_pv_id' : root_object.id} - objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) - #objs = self.server.getPmmByPv(root_object) + 'id' : root_object.id} + objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + #objlist = self.server.getPmmByPv(root_object) elif classname == 'ProductModelMaster': fieldnames = {'of_pm_id' : root_object.of_pm_id, 'of_pm_id_context' : root_object.of_pm_id_context, 'of_pv_id' : root_object.of_pv_id, - 'of_pmm_id' : root_object.id} - objs = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) - #objs = self.server.getPmvByPmm(root_object) + 'id' : root_object.id} + objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + #objlist = self.server.getPmvByPmm(root_object) elif classname == 'ProductModelVersion': return None else: #print 'not logged in' - objs = self.localDB.getVersionTreeObjects(root_object) - return objs + objlist = self.localDB.getVersionTreeObjects(root_object) + return objlist Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.18 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.19 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.18 Tue Oct 14 11:51:37 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 14 13:02:29 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.18 $ +@version: $Revision: 1.19 $ """ -__version__ = "$Revision: 1.18 $"[11:-2] +__version__ = "$Revision: 1.19 $"[11:-2] import xmlrpclib import types @@ -91,7 +91,7 @@ @param objs: objects to be hooked up. Don't worry if you pass an irrelevent object. """ # eventually call only this? --vwk 23may2003 - print "xmlrpc.getObjects", classname, fields, refs, subtypes + print "xmlrpc.getObjects", classname #, fields, refs, subtypes data = self._RPC.getObjects(classname, refs, subtypes, fields) if data: return self._factory.rememberAll(data, objs) From pbear at ned.gsfc.nasa.gov Tue Oct 14 17:20:39 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 14 16:20:42 2003 Subject: [Pangalactic-commits] moved alert tests to nars Message-ID: <200310142020.h9EKKdUR007540@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/runall.py 1.3 1.4 PanGalactic/pangalactic/client/tests/test_gidep_alert.py 1.4 None PanGalactic/pangalactic/client/tests/test_gidep_problem_advisory.py 1.4 None PanGalactic/pangalactic/client/tests/test_nasa_advisory.py 1.4 None Log message: moved alert tests to nars Index: PanGalactic/pangalactic/client/tests/runall.py diff -u PanGalactic/pangalactic/client/tests/runall.py:1.3 PanGalactic/pangalactic/client/tests/runall.py:1.4 --- PanGalactic/pangalactic/client/tests/runall.py:1.3 Sat Sep 20 18:15:19 2003 +++ PanGalactic/pangalactic/client/tests/runall.py Tue Oct 14 16:20:38 2003 @@ -9,9 +9,6 @@ import test_localdb import test_aboutbox import test_itemeditframe -import test_gidep_problem_advisory -import test_gidep_alert -import test_nasa_advisory import test_psmtool import test_itemdataform import test_itemsearchform @@ -35,9 +32,6 @@ all_tests.addTest(test_datamanager.suite()) #core all_tests.addTest(test_aboutbox.suite()) all_tests.addTest(test_itemeditframe.suite()) - all_tests.addTest(test_gidep_problem_advisory.suite()) - all_tests.addTest(test_gidep_alert.suite()) - all_tests.addTest(test_nasa_advisory.suite()) #core all_tests.addTest(test_psmtool.suite()) all_tests.addTest(test_itemdataform.suite()) all_tests.addTest(test_itemsearchform.suite()) @@ -48,8 +42,6 @@ all_tests.addTest(test_partslistview.suite()) all_tests.addTest(test_propertiesform.suite()) all_tests.addTest(test_searchframe.suite()) - - return all_tests From bmuir at ned.gsfc.nasa.gov Wed Oct 15 12:03:21 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Wed Oct 15 11:03:23 2003 Subject: [Pangalactic-commits] updated aboutbox tests, and half of datamanager tests Message-ID: <200310151503.h9FF3Lk3017652@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/aboutbox.py 1.2 1.3 PanGalactic/pangalactic/client/modules/psm/aboutbox.wdr 1.2 1.3 PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py 1.2 1.3 PanGalactic/pangalactic/client/tests/test_aboutbox.py 1.1.1.1 1.2 PanGalactic/pangalactic/client/tests/test_datamanager.py 1.7 1.8 PanGalactic/pangalactic/client/tests/unittest.py 1.1.1.1 None PanGalactic/pangalactic/client/tests/unittestgui.py 1.1.1.1 None Log message: updated aboutbox tests, and half of datamanager tests Index: PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py diff -u PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.2 PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.3 --- PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.2 Wed Mar 12 17:07:20 2003 +++ PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py Wed Oct 15 11:03:19 2003 @@ -3,20 +3,23 @@ # Do not modify this file, all changes will be lost! #----------------------------------------------------------------------------- +# -*- coding: iso-8859-1 -*- + # Include wxWindows' modules from wxPython.wx import * +from wxPython.grid import * # Window functions -ID_TEXT = wxNewId() -ID_VERSION = wxNewId() -ID_BUILD_DATE = wxNewId() -ID_BUTTON_ABOUTOK = wxNewId() -ID_LINE = wxNewId() -ID_STATICBITMAP_PYTHON = wxNewId() -ID_STATICBITMAP_WXPYTHON = wxNewId() +ID_TEXT = 10000 +ID_VERSION = 10001 +ID_BUILD_DATE = 10002 +ID_BUTTON_ABOUTOK = 10003 +ID_LINE = 10004 +ID_STATICBITMAP_PYTHON = 10005 +ID_STATICBITMAP_WXPYTHON = 10006 -def AboutFunc( parent, call_fit = true, set_sizer = true ): +def AboutFunc( parent, call_fit = True, set_sizer = True ): item0 = wxBoxSizer( wxVERTICAL ) item1 = wxFlexGridSizer( 0, 2, 0, 0 ) @@ -39,10 +42,10 @@ item0.AddSizer( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ) - item0.AddSpacer( 20, 20, 0, wxALIGN_CENTRE|wxALL, 5 ) + item0.AddSpacer( 20, 20, 0, wxALIGN_CENTER|wxALL, 5 ) item6 = wxButton( parent, ID_BUTTON_ABOUTOK, "OK", wxDefaultPosition, wxDefaultSize, 0 ) - item0.AddWindow( item6, 0, wxALIGN_CENTRE|wxALL, 5 ) + item0.AddWindow( item6, 0, wxALIGN_CENTER|wxALL, 5 ) item7 = wxStaticLine( parent, ID_LINE, wxDefaultPosition, wxSize(20,-1), wxLI_HORIZONTAL ) item0.AddWindow( item7, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ) @@ -50,17 +53,17 @@ item8 = wxBoxSizer( wxHORIZONTAL ) item9 = wxStaticBitmap( parent, ID_STATICBITMAP_PYTHON, About( 0 ), wxDefaultPosition, wxDefaultSize ) - item8.AddWindow( item9, 0, wxALIGN_CENTRE|wxALL, 5 ) + item8.AddWindow( item9, 0, wxALIGN_CENTER|wxALL, 5 ) item10 = wxStaticBitmap( parent, ID_STATICBITMAP_WXPYTHON, About( 1 ), wxDefaultPosition, wxDefaultSize ) - item8.AddWindow( item10, 0, wxALIGN_CENTRE|wxALL, 5 ) + item8.AddWindow( item10, 0, wxALIGN_CENTER|wxALL, 5 ) - item0.AddSizer( item8, 0, wxALIGN_CENTRE|wxALL, 5 ) + item0.AddSizer( item8, 0, wxALIGN_CENTER|wxALL, 5 ) - if set_sizer == true: - parent.SetAutoLayout( true ) + if set_sizer == True: + parent.SetAutoLayout( True ) parent.SetSizer( item0 ) - if call_fit == true: + if call_fit == True: item0.Fit( parent ) item0.SetSizeHints( parent ) Index: PanGalactic/pangalactic/client/tests/test_aboutbox.py diff -u PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.2 --- PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.1.1.1 Mon Nov 4 14:47:26 2002 +++ PanGalactic/pangalactic/client/tests/test_aboutbox.py Wed Oct 15 11:03:20 2003 @@ -1,20 +1,20 @@ import unittest import modules.psm.aboutbox from wxPython.wx import * -wxInitAllImageHandlers() + class AboutBox(unittest.TestCase): def Title(self): print '\nAboutbox tests' def testCreateAboutbox(self): - + app = wxPySimpleApp() self.VERSION = 'TEST' self.BUILD_DATE = '111111' dlg = None - dlg = modules.psm.aboutbox.AboutBox(NULL, -1, "About PGEF", wxPoint(20,20), wxSize(500,340)) - dlg.GetVersion().SetLabel(str(VERSION)) - dlg.GetBuildDate().SetLabel(str(BUILD_DATE)) + dlg = modules.psm.aboutbox.AboutBox(None, -1, "About PGEF", wxPoint(20,20), wxSize(500,340)) + dlg.GetVersion().SetLabel(str(self.VERSION)) + dlg.GetBuildDate().SetLabel(str(self.BUILD_DATE)) dlg.CentreOnParent() assert dlg != None, 'Couldnt create AboutBox' @@ -31,4 +31,5 @@ if __name__ == '__main__': - main() \ No newline at end of file + main() + Index: PanGalactic/pangalactic/client/modules/psm/aboutbox.py diff -u PanGalactic/pangalactic/client/modules/psm/aboutbox.py:1.2 PanGalactic/pangalactic/client/modules/psm/aboutbox.py:1.3 --- PanGalactic/pangalactic/client/modules/psm/aboutbox.py:1.2 Wed Jan 8 12:56:56 2003 +++ PanGalactic/pangalactic/client/modules/psm/aboutbox.py Wed Oct 15 11:03:19 2003 @@ -9,7 +9,6 @@ style = wxDEFAULT_DIALOG_STYLE ): wxFrame.__init__(self, parent, id, title, pos, size, style) AboutFunc( self, true ) - # WDR: handler declarations for AboutBox EVT_BUTTON(self, ID_BUTTON_ABOUTOK, self.onOK) Index: PanGalactic/pangalactic/client/tests/test_datamanager.py diff -u PanGalactic/pangalactic/client/tests/test_datamanager.py:1.7 PanGalactic/pangalactic/client/tests/test_datamanager.py:1.8 --- PanGalactic/pangalactic/client/tests/test_datamanager.py:1.7 Fri Jun 27 03:24:49 2003 +++ PanGalactic/pangalactic/client/tests/test_datamanager.py Wed Oct 15 11:03:20 2003 @@ -1,6 +1,6 @@ import unittest import types, os -import pangalactic.enterprise.product +#import pangalactic.enterprise.product from pangalactic.utils import datamanager from pangalactic.utils import securitymanager import pangalactic.utils.pgefexceptions @@ -52,6 +52,9 @@ def testValidLogin(self): self.dm = datamanager.DataManager(self, true) + self.dm.serverName = 'ned.gsfc.nasa.gov' + self.dm.serverPort = '8080' + self.dm.createServer() self.WatchDog = securitymanager.SecurityManager(self.dm) result = self.dm.login('tstuser','test') self.dm.localDB.Commit() @@ -70,20 +73,11 @@ del self.dm del self.WatchDog - def testGetItemsByProject(self): - self.dm = datamanager.DataManager(self, true) - self.WatchDog = securitymanager.SecurityManager(self.dm) - self.dm.login('tstuser','test') - self.dm.localDB.Commit() - self.dm.getItemsByProject(['TEST']) - #self.dm.localDB.Commit() - assert len(self.dm.topLevelItemIDs) > 0, 'Error retrieving items for the test project' - self.dm.localDB.db.close() - del self.dm - del self.WatchDog - def testFillProjectList(self): self.dm = datamanager.DataManager(self, true) + self.dm.serverName = 'ned.gsfc.nasa.gov' + self.dm.serverPort = '8080' + self.dm.createServer() self.WatchDog = securitymanager.SecurityManager(self.dm) self.dm.login('tstuser','test') @@ -93,155 +87,70 @@ assert len(self.dm.projects) > 0, 'Error retrieving items for the test project' self.dm.localDB.db.close() del self.dm - del self.WatchDog - - def testGetNAUOByAssemblyID(self): - self.dm = datamanager.DataManager(self, true) - self.WatchDog = securitymanager.SecurityManager(self.dm) - self.dm.login('tstuser','test') - result = self.dm.getNAUOByAssemblyID(['ned.gsfc.nasa.gov__tstuser__1']) - #self.dm.localDB.Commit() - assert len(result) > 0, 'Error retrieving items by AssemblyID' - self.dm.localDB.db.close() - del self.dm - del self.WatchDog - - def testGetItem(self): - self.dm = datamanager.DataManager(self, true) - self.WatchDog = securitymanager.SecurityManager(self.dm) - self.dm.login('tstuser','test') - result = self.dm.getItem('ned.gsfc.nasa.gov__tstuser__1') - self.dm.localDB.Commit() - assert len(result) > 0, 'Error retrieving item by ID' - self.dm.localDB.db.close() - del self.dm - del self.WatchDog + del self.WatchDog - - def testGetParentNauosForItemID_None(self): + def testQuickCreate(self): self.dm = datamanager.DataManager(self, true) + self.dm.serverName = 'ned.gsfc.nasa.gov' + self.dm.serverPort = '8080' + self.dm.createServer() self.WatchDog = securitymanager.SecurityManager(self.dm) self.dm.login('tstuser','test') - childitem = pangalactic.enterprise.product.Product() - dataobjects.item.FillSampleItem(childitem) - childitem.pgef_oid = 'xxxx' - result = self.dm.getParentNauosForItemID(childitem) - self.dm.localDB.Commit() - assert len(result) == 0, 'Error should not have found NAUOs' - self.dm.localDB.db.close() - del self.dm - del self.WatchDog - - def testAddNauo(self): - self.dm = datamanager.DataManager(self, true) - self.WatchDog = securitymanager.SecurityManager(self.dm) - self.dm.localDB.Clear() - self.dm.login('tstuser','test') - oldlength = len(self.dm.localDB.dbroot['UncommittedObjects'].keys()) - #parentnauo = nauo.NAUO() - parentnauo = acu.AssemblyComponentUsage(subtype = 'nauo') - parentnauo.assembly = '-1' - parentnauo.component = '1' - self.dm.addNAUO(parentnauo, 'TOPLEVEL') - self.dm.localDB.Commit() - - #childnauo = nauo.NAUO() - childnauo = acu.AssemblyComponentUsage(subtype = 'nauo') - childnauo.assembly = '1' - childnauo.component = '2' - self.dm.addNAUO(childnauo, parentnauo) + results = self.dm.quickCreate(['1', '2', '3', '4']) + self.dm.localDB.Commit() - newlength = len(self.dm.localDB.dbroot['UncommittedObjects'].keys()) - assert (newlength - oldlength) == 2, 'No NAUOs found' + assert len(results) == 4, 'Error performing quickCreate' self.dm.localDB.db.close() del self.dm del self.WatchDog - def testGetParentNauosForItemID_Some(self): + + def testsetCurrentProject(self): self.dm = datamanager.DataManager(self, true) + self.dm.serverName = 'ned.gsfc.nasa.gov' + self.dm.serverPort = '8080' + self.dm.createServer() self.WatchDog = securitymanager.SecurityManager(self.dm) self.dm.login('tstuser','test') - self.dm.setCurrentProject('TEST') - parentitem = dataobjects.item.Item() - dataobjects.item.FillSampleItem(parentitem) - #parentnauo = nauo.NAUO() - parentnauo = acu.AssemblyComponentUsage(subtype = 'nauo') - parentnauo.assembly = '-1' - parentnauo.component = parentitem.pgef_oid - childitem = dataobjects.item.Item() - dataobjects.item.FillSampleItem(childitem) - #childnauo = nauo.NAUO() - childnauo = acu.AssemblyComponentUsage(subtype = 'nauo') - childnauo.assembly = parentitem.pgef_oid - childnauo.component = childitem.pgef_oid - self.dm.localDB.Save([childnauo, parentnauo, parentitem, childitem]) - result = self.dm.getParentNauosForItemID(childitem) + self.dm.setCurrentProject('testing') + self.dm.localDB.Commit() - assert len(result) > 0, 'Error could not retrieve NAUOs' + assert self.dm.currentProject == 'testing', 'Error performing setCurrentProject' self.dm.localDB.db.close() del self.dm - del self.WatchDog - - def testGetChildNauosForItemID_None(self): - self.dm = datamanager.DataManager(self, true) - self.WatchDog = securitymanager.SecurityManager(self.dm) + del self.WatchDog - self.dm.login('tstuser','test') - childitem = dataobjects.item.Item() - dataobjects.item.FillSampleItem(childitem) - childitem.pgef_oid = 'xxxx' - result = self.dm.getChildNauosForItemID(childitem) - self.dm.localDB.Commit() - assert len(result) == 0, 'Error should not have found NAUOs' - self.dm.localDB.db.close() - del self.dm - del self.WatchDog - - def testGetChildNauosForItemID_Some(self): + def testgetItemsByProject(self): self.dm = datamanager.DataManager(self, true) + self.dm.serverName = 'ned.gsfc.nasa.gov' + self.dm.serverPort = '8080' + self.dm.createServer() self.WatchDog = securitymanager.SecurityManager(self.dm) self.dm.login('tstuser','test') - self.dm.setCurrentProject('TEST') - parentitem = dataobjects.item.Item() - dataobjects.item.FillSampleItem(parentitem) - parentnauo = acu.AssemblyComponentUsage(subtype='nauo') - parentnauo.assembly = '-1' - parentnauo.component = parentitem.pgef_oid - childitem = dataobjects.item.Item() - dataobjects.item.FillSampleItem(childitem) - childnauo = acu.AssemblyComponentUsage(subtype='nauo') - childnauo.assembly = parentitem.pgef_oid - childnauo.component = childitem.pgef_oid - self.dm.localDB.Save([childnauo, parentnauo, parentitem, childitem]) - result = self.dm.getChildNauosForItemID(parentitem) + num_objs = self.dm.getItemsByProject(['H2G2']) + self.dm.localDB.Commit() - assert len(result) > 0, 'Error could not retrieve NAUOs' + assert num_objs > 1, 'Error - No data returned for getItemsByProject' self.dm.localDB.db.close() del self.dm - del self.WatchDog - + del self.WatchDog + def suite(): suite = unittest.TestSuite() - #suite.addTest(DataManagerTestCase("testGetItemsByProject")) suite.addTest(DataManagerTestCase("Title")) suite.addTest(DataManagerCreationTest("testCreation")) suite.addTest(DataManagerTestCase("testGetServerList")) suite.addTest(DataManagerTestCase("testCreateServer")) - #suite.addTest(DataManagerTestCase("testValidLogin")) - suite.addTest(DataManagerTestCase("testInvalidLogin")) - #suite.addTest(DataManagerTestCase("testFillProjectList")) - #suite.addTest(DataManagerTestCase("testGetNAUOByAssemblyID")) - #suite.addTest(DataManagerTestCase("testGetItem")) - #suite.addTest(DataManagerTestCase("testGetParentNauosForItemID_None")) - #suite.addTest(DataManagerTestCase("testGetParentNauosForItemID_Some")) - #suite.addTest(DataManagerTestCase("testGetChildNauosForItemID_None")) - #suite.addTest(DataManagerTestCase("testGetChildNauosForItemID_Some")) - suite.addTest(DataManagerTestCase("testAddNauo")) - + suite.addTest(DataManagerTestCase("testValidLogin")) + #suite.addTest(DataManagerTestCase("testInvalidLogin")) + suite.addTest(DataManagerTestCase("testFillProjectList")) + suite.addTest(DataManagerTestCase("testQuickCreate")) + suite.addTest(DataManagerTestCase("testsetCurrentProject")) + suite.addTest(DataManagerTestCase("testgetItemsByProject")) return suite def main(): From pbear at ned.gsfc.nasa.gov Wed Oct 15 12:12:20 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 15 11:12:21 2003 Subject: [Pangalactic-commits] updated tests for nasa_advisory, gidep_alert, and gidep_problem_advisory Message-ID: <200310151512.h9FFCKlg017863@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/advisoryreport.py 1.3 1.4 PanGalactic/pangalactic/utils/datepanel.py 1.1 1.2 PanGalactic/pangalactic/utils/reportlab_blocks.py 1.3 1.4 Log message: updated tests for nasa_advisory, gidep_alert, and gidep_problem_advisory Index: PanGalactic/pangalactic/utils/reportlab_blocks.py diff -u PanGalactic/pangalactic/utils/reportlab_blocks.py:1.3 PanGalactic/pangalactic/utils/reportlab_blocks.py:1.4 --- PanGalactic/pangalactic/utils/reportlab_blocks.py:1.3 Wed Jun 25 04:32:12 2003 +++ PanGalactic/pangalactic/utils/reportlab_blocks.py Wed Oct 15 11:12:18 2003 @@ -54,12 +54,13 @@ def LogoBlock(canvas, x, y, width, height, label_lines, show_center = None, imagename = None): """x, y are lower left coordinates""" - #print "logoblock" + #print "blocks.logoblock" canvas.saveState() try: #logo = PIL_Image.open(imagename) logoimage = ToolkitImages.getmeatballImage() + #print "have logoimage" logo = convertimage.wx2PIL(logoimage) drawsize = (65, 55) # logo.size #print "logo size", drawsize, logo.size @@ -83,6 +84,7 @@ canvas.drawString(xplus, yplus, label_lines[2]) canvas.restoreState() + #print "end blocks.logoblock" def TwoTitleBlock(canvas, x, y, width, height, label_lines, font = HelveticaBold, fontsize = FontSize): Index: PanGalactic/pangalactic/utils/advisoryreport.py diff -u PanGalactic/pangalactic/utils/advisoryreport.py:1.3 PanGalactic/pangalactic/utils/advisoryreport.py:1.4 --- PanGalactic/pangalactic/utils/advisoryreport.py:1.3 Sat Aug 23 23:56:42 2003 +++ PanGalactic/pangalactic/utils/advisoryreport.py Wed Oct 15 11:12:18 2003 @@ -4,7 +4,7 @@ Output formatting functions for the PgefAdvisory document class and its subtypes. """ -__version__ = "$Revision: 1.3 $"[11:-2] +__version__ = "$Revision: 1.4 $"[11:-2] # Python imports import types @@ -67,7 +67,7 @@ @param filepath: path of file into which XML is to be written """ - print "advisoryreport.init" + #print "advisoryreport.init" self.filename = filepath self.author = "" self.creationdate = "" @@ -76,7 +76,7 @@ self.docname = docname self.layoutname = self.docname + "_layout.pgef" self.numrows = 0 - print "layoutname", self.layoutname + #print "layoutname", self.layoutname self.forminfo = [] self.docinfo = [] self.remnant_ndxs = [] @@ -92,12 +92,12 @@ """ Generate a PDF formatted advisory document. """ - print "pgefadvisory.generatePDF" - print "name", self.docname + #print "advisoryreport.generatePDF" + #print "name", self.docname #print "shdesc", doc.short_description self._setData(docdata) retval = self._generatePDF(attachments) - #print "end pgefadvisory.Generate", retval + #print "end advisory.Generate", retval return retval @@ -110,8 +110,10 @@ generated """ - print "pgefadvisory.generatexml" - self._generateXML([], doc.__dict__) + #print "advisory._generatexml" + retval = self._generateXML([], doc.__dict__) + #print "end generatexml" + return retval def _loadLayoutFile(self, layoutfilename): @@ -147,10 +149,10 @@ elif line.startswith(""): layout = True elif line.startswith(""): -# print "start remnant" + #print "start remnant" getremnants = True elif line.startswith(""): -# print "end remnant" + #print "end remnant" getremnants = False elif line.startswith(""): formlayout = True @@ -241,13 +243,13 @@ def _setData(self, datalist): - #print "\n\nadvisoryreport.setdata" + #print "advisoryreport.setdata" for ndx in range(len(self.docinfo)): olditem = self.docinfo[ndx] tmplist = list(olditem) tmplist[1] = datalist[ndx] self.docinfo[ndx] = tmplist - #print "\n\n" + def _generateFirstPage(self, canvas, doc): #print "firstpage" @@ -352,13 +354,16 @@ imagename = iteminfo[1] # nasa1 = "National Aeronautics and" # nasa2 = "Space Administration" + #print "itemlabel", itemlabel label_lines = itemlabel # label_lines.append(nasa1) # label_lines.append(nasa2) # label_lines.append(itemlabel) #print "show_center", self.show_center blocks.LogoBlock(self.canvas, x, y, width, height, label_lines, self.show_center, imagename) + #print "end logo; start box" blocks.Box(self.canvas, x, y, width, height) + #print "end logo block" elif itemstyle == IMAGE: pass @@ -369,6 +374,7 @@ y = self.margin - blocks.TinyFontSize*2 - 4 blocks.TinyPrint(self.canvas, x, y, self.formrev) self.canvas.restoreState() + #print "end emptyform" def _fillForm(self): @@ -403,7 +409,7 @@ topdown_y = self.margin + ((row-1) * self.rowsize) y = hspace - topdown_y -# print ndx, itemlabel, row, span, "x1y1", x, y, width, height +# #print ndx, itemlabel, row, span, "x1y1", x, y, width, height if itemstyle == NORMAL: blocks.SingleLineBlock(self.canvas, x, y, itemlabel, width, height, iteminfo[1], CourierBold, FontSize) @@ -479,7 +485,6 @@ except: print "unable to attach image", filename - return elements @@ -546,7 +551,7 @@ def _generatePDF(self, attachment_filenames): - #print "advisoryreport.generate", self.filename + #print "advisoryreport._generatepdf", self.filename self._setup() elements = [] @@ -575,6 +580,7 @@ elif docstyle == PARAGRAPH: tmplist = self.remnant[ndx][0].split("\n\n") + #print "remnant[%i] %s" % (ndx, self.remnant[ndx]) #print "tmplist", tmplist if len(tmplist) > 0: if len(tmplist[0]) > 0: @@ -582,6 +588,8 @@ for paratext in tmplist: elements.append(Paragraph(paratext, style)) #styleSheet['Normal'])) # elements.append(FrameBreak()) + #else: + #print "empty remnant; skip it" imglist = [] imglist = self._getImageList(attachment_filenames) @@ -601,6 +609,7 @@ def _generateXML(self, outputdata, classdict): + #print "_generatexml" xmllist = [] dtdlist = [] datalist = [] @@ -655,11 +664,13 @@ xmllist.extend(datalist) xmllist.append('') -# for item in xmllist: -# print item + #for item in xmllist: + # print item xmlfile = open(self.filename, 'w') for item in xmllist: xmlfile.write(item + "\n") xmlfile.close() + #print "end _generatexml" + return "generated" Index: PanGalactic/pangalactic/utils/datepanel.py diff -u PanGalactic/pangalactic/utils/datepanel.py:1.1 PanGalactic/pangalactic/utils/datepanel.py:1.2 --- PanGalactic/pangalactic/utils/datepanel.py:1.1 Wed Jun 25 01:25:03 2003 +++ PanGalactic/pangalactic/utils/datepanel.py Wed Oct 15 11:12:18 2003 @@ -143,11 +143,12 @@ else: return None + def GetFormattedDateStr(self, formatstr = None): + return self.GetDateStr(formatstr) + def GetDateStr(self, formatstr = None): # returns if format is not specified - #print "datepanel.GetDateStr" - #print "format", formatstr #print "default_fmt", DEFAULT_FMT y = self.YearWgt.GetValue() m = self.MonthWgt.GetSelection() From bmuir at ned.gsfc.nasa.gov Wed Oct 15 13:51:15 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Wed Oct 15 12:51:15 2003 Subject: [Pangalactic-commits] removed itemdataform, it was replaced by productdataform, also updated test_loginform Message-ID: <200310151651.h9FGpFBU019651@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.105 1.106 PanGalactic/pangalactic/client/modules/psm/itemdataform.py 1.13 None PanGalactic/pangalactic/client/modules/psm/itemdataform.wdr 1.2 None PanGalactic/pangalactic/client/modules/psm/itemdataform_wdr.py 1.3 None PanGalactic/pangalactic/client/tests/test_productdataform.py None 1.1 PanGalactic/pangalactic/client/tests/runall.py 1.4 1.5 PanGalactic/pangalactic/client/tests/test_itemsearchform.py 1.1.1.1 1.2 PanGalactic/pangalactic/client/tests/test_loginform.py 1.1.1.1 1.2 PanGalactic/pangalactic/client/tests/test_partslistform.py 1.1.1.1 1.2 PanGalactic/pangalactic/client/tests/test_itemdataform.py 1.1.1.1 None PanGalactic/pangalactic/utils/datamanager.py 1.45 1.46 PanGalactic/pangalactic/utils/localdb.py 1.39 1.40 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.19 1.20 Log message: removed itemdataform, it was replaced by productdataform, also updated test_loginform Index: PanGalactic/pangalactic/client/tests/runall.py diff -u PanGalactic/pangalactic/client/tests/runall.py:1.4 PanGalactic/pangalactic/client/tests/runall.py:1.5 --- PanGalactic/pangalactic/client/tests/runall.py:1.4 Tue Oct 14 16:20:38 2003 +++ PanGalactic/pangalactic/client/tests/runall.py Wed Oct 15 12:51:12 2003 @@ -10,7 +10,7 @@ import test_aboutbox import test_itemeditframe import test_psmtool -import test_itemdataform +import test_productdataform import test_itemsearchform import test_loginform import test_otherdocform @@ -22,26 +22,26 @@ def runTest(): all_tests = unittest.TestSuite() - all_tests.addTest(test_pgefobject.suite()) - all_tests.addTest(test_product.suite()) - all_tests.addTest(test_pcu.suite()) - all_tests.addTest(test_part.suite()) - all_tests.addTest(test_partslist.suite()) - all_tests.addTest(test_person.suite()) - all_tests.addTest(test_localdb.suite()) + #all_tests.addTest(test_pgefobject.suite()) + #all_tests.addTest(test_product.suite()) + #all_tests.addTest(test_pcu.suite()) + #all_tests.addTest(test_part.suite()) + #all_tests.addTest(test_partslist.suite()) + #all_tests.addTest(test_person.suite()) + #all_tests.addTest(test_localdb.suite()) all_tests.addTest(test_datamanager.suite()) -#core all_tests.addTest(test_aboutbox.suite()) - all_tests.addTest(test_itemeditframe.suite()) -#core all_tests.addTest(test_psmtool.suite()) - all_tests.addTest(test_itemdataform.suite()) - all_tests.addTest(test_itemsearchform.suite()) - all_tests.addTest(test_loginform.suite()) - all_tests.addTest(test_otherdocform.suite()) - all_tests.addTest(test_partslistform.suite()) - all_tests.addTest(test_partslistsearch.suite()) - all_tests.addTest(test_partslistview.suite()) - all_tests.addTest(test_propertiesform.suite()) - all_tests.addTest(test_searchframe.suite()) + all_tests.addTest(test_aboutbox.suite()) + #all_tests.addTest(test_itemeditframe.suite()) + #all_tests.addTest(test_psmtool.suite()) + #all_tests.addTest(test_productdataform.suite()) + #all_tests.addTest(test_itemsearchform.suite()) + #all_tests.addTest(test_loginform.suite()) + #all_tests.addTest(test_otherdocform.suite()) + #all_tests.addTest(test_partslistform.suite()) + #all_tests.addTest(test_partslistsearch.suite()) + #all_tests.addTest(test_partslistview.suite()) + #all_tests.addTest(test_propertiesform.suite()) + #all_tests.addTest(test_searchframe.suite()) return all_tests Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.19 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.20 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.19 Tue Oct 14 13:02:29 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Wed Oct 15 12:51:13 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.19 $ +@version: $Revision: 1.20 $ """ -__version__ = "$Revision: 1.19 $"[11:-2] +__version__ = "$Revision: 1.20 $"[11:-2] import xmlrpclib import types @@ -27,7 +27,7 @@ self.Connect() def Connect(self): - print '%s%s:%s' % ('http://' , self._SERVER, self._PORT) + #print '%s%s:%s' % ('http://' , self._SERVER, self._PORT) self._RPC = xmlrpclib.Server('%s%s:%s' % ('http://' , self._SERVER, self._PORT)) def Disconnect(self): @@ -91,7 +91,7 @@ @param objs: objects to be hooked up. Don't worry if you pass an irrelevent object. """ # eventually call only this? --vwk 23may2003 - print "xmlrpc.getObjects", classname #, fields, refs, subtypes + #print "xmlrpc.getObjects", classname data = self._RPC.getObjects(classname, refs, subtypes, fields) if data: return self._factory.rememberAll(data, objs) Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.39 PanGalactic/pangalactic/utils/localdb.py:1.40 --- PanGalactic/pangalactic/utils/localdb.py:1.39 Wed Oct 8 11:30:47 2003 +++ PanGalactic/pangalactic/utils/localdb.py Wed Oct 15 12:51:13 2003 @@ -1240,8 +1240,31 @@ #print "no key", obj.pgef_oid # retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfTransition([obj]) + elif obj.__class__.__name__ == "Project": +# elif isinstance(obj, WfTransition): + #print "localdb.save.wfeventaudit" + if self.dbroot[self.PROJECTOBJECTS].has_key(obj.pgef_oid): + #print "have key" + #print "objid: " + obj.pgef_oid + #print "obj state: " + str(obj.state) + if self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid].state: + #print "have state" + #print "obj.state " + str(obj.state) + if override: + #print "override", obj.pgef_oid +# retlist.extend(self.SaveWfEventAudit([obj])) + self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj + else: + #print "no state", obj.pgef_oid +# retlist.extend(self.SaveWfEventAudit([obj])) + self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj + else: + #print "no key", obj.pgef_oid +# retlist.extend(self.SaveWfEventAudit([obj])) + self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj else: print "have unknown obj to save", obj.__class__.__name__, obj.id + self.Commit() #print "retlist", retlist return retlist Index: PanGalactic/pangalactic/client/tests/test_itemsearchform.py diff -u PanGalactic/pangalactic/client/tests/test_itemsearchform.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_itemsearchform.py:1.2 --- PanGalactic/pangalactic/client/tests/test_itemsearchform.py:1.1.1.1 Mon Nov 4 14:47:26 2002 +++ PanGalactic/pangalactic/client/tests/test_itemsearchform.py Wed Oct 15 12:51:12 2003 @@ -8,21 +8,20 @@ def testCreation(self): testframe = wxFrame(None, -1, 'Test Frame') - testframe.itemdataform = None + testframe.productdataform = None testframe.itemsearchform = modules.psm.itemsearchform.ItemSearchForm(testframe, -1) assert testframe.itemsearchform != None, 'Couldnt create ItemSearchForm' del testframe.itemsearchform def testPrepareQueryItem(self): testframe = wxFrame(None, -1, 'Test Frame') - testframe.itemdataform = None + testframe.productdataform = None testframe.itemsearchform = modules.psm.itemsearchform.ItemSearchForm(testframe, -1) testframe.itemsearchform.GetTextctrlNameCode().SetValue('testnamecode') testframe.itemsearchform.GetComboItemType().SetValue('Board') queryitem = testframe.itemsearchform.PrepareQueryItem() assert queryitem.name == 'testnamecode', 'NameCode incorrect' assert queryitem.short_description == 'testnamecode', 'Name incorrect' -##==> (postgres) removed from schema assert queryitem.Type == 'Board' del testframe.itemsearchform def suite(): Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.105 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.106 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.105 Wed Oct 8 11:30:46 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Wed Oct 15 12:51:12 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.105 $"[11:-2] +__version__ = "$Revision: 1.106 $"[11:-2] # Python imports import copy @@ -13,7 +13,6 @@ from pangalactic.client.dataobjects import partslistinfo from pangalactic.client.dataobjects import partslistmap -#from pangalactic.client.modules.psm import itemdataform from pangalactic.client.modules.psm import otherdocform from pangalactic.client.modules.psm import partslistform from pangalactic.client.modules.psm import partslistview @@ -129,7 +128,6 @@ self.vsplitter.SetMinimumPaneSize(20) self.vsplitter.SplitVertically(self.itemtree, self.editnb, 175) -# EVT_BUTTON(self, itemdataform.DELETE_BUTTON, self.OnDeleteNauo) EVT_BUTTON(self, productdataform.DELETE_MM_MV, self.OnDeleteNauo) EVT_BUTTON(self, productdataform.ID_NEW_MM_MV, self.onNewProduct) Index: PanGalactic/pangalactic/client/tests/test_loginform.py diff -u PanGalactic/pangalactic/client/tests/test_loginform.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_loginform.py:1.2 --- PanGalactic/pangalactic/client/tests/test_loginform.py:1.1.1.1 Mon Nov 4 14:47:26 2002 +++ PanGalactic/pangalactic/client/tests/test_loginform.py Wed Oct 15 12:51:12 2003 @@ -1,5 +1,5 @@ import unittest -import loginclass +from pangalactic.utils import loginclass from wxPython.wx import * class TestLoginForm(unittest.TestCase): @@ -7,10 +7,11 @@ print '\nLoginform suite' def testCreation(self): + app = wxPySimpleApp() testframe = wxFrame(None, -1, 'Test Frame') testframe.loginclass = None testframe.loginclass = loginclass.LoginClass(testframe,-1,'testing login') - assert testframe.loginclass != None, 'Couldnt create ItemDataform' + assert testframe.loginclass != None, 'Couldnt create LoginForm' def suite(): loginform_suite = unittest.TestSuite() Index: PanGalactic/pangalactic/client/tests/test_partslistform.py diff -u PanGalactic/pangalactic/client/tests/test_partslistform.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_partslistform.py:1.2 --- PanGalactic/pangalactic/client/tests/test_partslistform.py:1.1.1.1 Mon Nov 4 14:47:26 2002 +++ PanGalactic/pangalactic/client/tests/test_partslistform.py Wed Oct 15 12:51:12 2003 @@ -14,7 +14,7 @@ testframe.partslistform = None testframe.State = support.psmstate.PSMState() testframe.partslistform = modules.psm.partslistform.PartsListForm(testframe,-1,testframe.State) - assert testframe.partslistform != None, 'Couldnt create ItemDataform' + assert testframe.partslistform != None, 'Couldnt create PartsListform' def testRootMode(self): Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.45 PanGalactic/pangalactic/utils/datamanager.py:1.46 --- PanGalactic/pangalactic/utils/datamanager.py:1.45 Tue Oct 14 13:02:29 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Wed Oct 15 12:51:13 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.45 $"[11:-2] +__version__ = "$Revision: 1.46 $"[11:-2] import time import mx.DateTime @@ -178,9 +178,7 @@ else: proxyhost = None proxyport = None - -# self.server = support.httpserverinterface.HTTPServerInterface(self.serverName, self.serverPort, -# proxyhost, proxyport) + self.server = xmlrpcinterface.XmlrpcInterface(self.serverName, self.serverPort, proxyhost, proxyport) @@ -321,6 +319,7 @@ self.localDB.SetProjectObjects(projectobjects) else: print "no data" + return len(tempobjlist) def save(self, savelist): self.localDB.Save(savelist) From bmuir at ned.gsfc.nasa.gov Wed Oct 15 13:54:18 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Wed Oct 15 12:54:19 2003 Subject: [Pangalactic-commits] updated runall for available tests Message-ID: <200310151654.h9FGsIFP019679@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/runall.py 1.5 1.6 Log message: updated runall for available tests Index: PanGalactic/pangalactic/client/tests/runall.py diff -u PanGalactic/pangalactic/client/tests/runall.py:1.5 PanGalactic/pangalactic/client/tests/runall.py:1.6 --- PanGalactic/pangalactic/client/tests/runall.py:1.5 Wed Oct 15 12:51:12 2003 +++ PanGalactic/pangalactic/client/tests/runall.py Wed Oct 15 12:54:17 2003 @@ -1,24 +1,24 @@ import unittest -import test_pgefobject -import test_product -import test_pcu -import test_part -import test_partslist -import test_person +#import test_pgefobject +#import test_product +#import test_pcu +#import test_part +#import test_partslist +#import test_person import test_datamanager -import test_localdb +#import test_localdb import test_aboutbox -import test_itemeditframe -import test_psmtool -import test_productdataform -import test_itemsearchform +#import test_itemeditframe +#import test_psmtool +#import test_productdataform +#import test_itemsearchform import test_loginform -import test_otherdocform -import test_partslistform -import test_partslistsearch -import test_partslistview -import test_propertiesform -import test_searchframe +#import test_otherdocform +#import test_partslistform +#import test_partslistsearch +#import test_partslistview +#import test_propertiesform +#import test_searchframe def runTest(): all_tests = unittest.TestSuite() @@ -35,7 +35,7 @@ #all_tests.addTest(test_psmtool.suite()) #all_tests.addTest(test_productdataform.suite()) #all_tests.addTest(test_itemsearchform.suite()) - #all_tests.addTest(test_loginform.suite()) + all_tests.addTest(test_loginform.suite()) #all_tests.addTest(test_otherdocform.suite()) #all_tests.addTest(test_partslistform.suite()) #all_tests.addTest(test_partslistsearch.suite()) From bmuir at ned.gsfc.nasa.gov Wed Oct 15 14:26:35 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Wed Oct 15 13:26:37 2003 Subject: [Pangalactic-commits] fixed searchframe tests Message-ID: <200310151726.h9FHQZVZ020472@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_searchframe.py 1.1.1.1 1.2 Log message: fixed searchframe tests Index: PanGalactic/pangalactic/client/tests/test_searchframe.py diff -u PanGalactic/pangalactic/client/tests/test_searchframe.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_searchframe.py:1.2 --- PanGalactic/pangalactic/client/tests/test_searchframe.py:1.1.1.1 Mon Nov 4 14:47:26 2002 +++ PanGalactic/pangalactic/client/tests/test_searchframe.py Wed Oct 15 13:26:33 2003 @@ -1,20 +1,23 @@ import unittest import modules.psm.searchframe -import dataobjects.datamanager +from pangalactic.utils import datamanager import support.psmstate from wxPython.wx import * class TestSearchFrame(unittest.TestCase): + def Title(self): + print '\nSearchFrame suite' def testCreateSearchFrame(self): state = support.psmstate.PSMState() testframe = wxFrame(None, -1, 'Test Frame') - dm = dataobjects.datamanager.DataManager(testframe, true) + dm = datamanager.DataManager(testframe, true) searchframe = None searchframe = modules.psm.searchframe.SearchFrame(testframe, -1, 'Search', dm) assert searchframe != None, 'Couldnt create AboutBox' def suite(): searchframe_suite = unittest.TestSuite() + searchframe_suite.addTest(TestSearchFrame("Title")) searchframe_suite.addTest(TestSearchFrame("testCreateSearchFrame")) return searchframe_suite From pbear at ned.gsfc.nasa.gov Wed Oct 15 14:48:03 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 15 13:48:05 2003 Subject: [Pangalactic-commits] fixed alert xml output Message-ID: <200310151748.h9FHm3iI020853@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.37 1.38 PanGalactic/pangalactic/utils/advisoryreport.py 1.4 1.5 Log message: fixed alert xml output Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.37 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.38 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.37 Tue Oct 7 15:16:14 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Wed Oct 15 13:48:01 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.37 2003/10/07 19:16:14 pbear Exp $ +# $Id: pgefadvisory.py,v 1.38 2003/10/15 17:48:01 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.37 $"[11:-2] +__version__ = "$Revision: 1.38 $"[11:-2] import os.path import string @@ -81,7 +81,7 @@ return Document.__getattr__(self, name) def setName(self, name): - print "name", name + #print "name", name self.name = name def getPrettyDocType(self): Index: PanGalactic/pangalactic/utils/advisoryreport.py diff -u PanGalactic/pangalactic/utils/advisoryreport.py:1.4 PanGalactic/pangalactic/utils/advisoryreport.py:1.5 --- PanGalactic/pangalactic/utils/advisoryreport.py:1.4 Wed Oct 15 11:12:18 2003 +++ PanGalactic/pangalactic/utils/advisoryreport.py Wed Oct 15 13:48:02 2003 @@ -4,7 +4,7 @@ Output formatting functions for the PgefAdvisory document class and its subtypes. """ -__version__ = "$Revision: 1.4 $"[11:-2] +__version__ = "$Revision: 1.5 $"[11:-2] # Python imports import types @@ -110,8 +110,8 @@ generated """ - #print "advisory._generatexml" - retval = self._generateXML([], doc.__dict__) + #print "advisory.generatexml" + retval = self._generateXML(doc) #print "end generatexml" return retval @@ -608,13 +608,16 @@ return "generated" - def _generateXML(self, outputdata, classdict): - #print "_generatexml" + def _generateXML(self, doc): + #print "advisory._generatexml" xmllist = [] dtdlist = [] datalist = [] + outputdata = doc.outputdata + classdict = doc.__dict__ outputdata_elements = ", ".join(outputdata) + #print "outputdata \n%s\n" % outputdata # DTD xmllist.append('') From bmuir at ned.gsfc.nasa.gov Wed Oct 15 15:57:05 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Wed Oct 15 14:57:05 2003 Subject: [Pangalactic-commits] fixed part of the pgefobject tests Message-ID: <200310151857.h9FIv5Nq021785@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/baseobjecttest.py 1.7 1.8 PanGalactic/pangalactic/client/tests/runall.py 1.6 1.7 PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.3 1.4 Log message: fixed part of the pgefobject tests Index: PanGalactic/pangalactic/client/tests/runall.py diff -u PanGalactic/pangalactic/client/tests/runall.py:1.6 PanGalactic/pangalactic/client/tests/runall.py:1.7 --- PanGalactic/pangalactic/client/tests/runall.py:1.6 Wed Oct 15 12:54:17 2003 +++ PanGalactic/pangalactic/client/tests/runall.py Wed Oct 15 14:57:03 2003 @@ -1,5 +1,5 @@ import unittest -#import test_pgefobject +import test_pgefobject #import test_product #import test_pcu #import test_part @@ -18,11 +18,11 @@ #import test_partslistsearch #import test_partslistview #import test_propertiesform -#import test_searchframe +import test_searchframe def runTest(): all_tests = unittest.TestSuite() - #all_tests.addTest(test_pgefobject.suite()) + all_tests.addTest(test_pgefobject.suite()) #all_tests.addTest(test_product.suite()) #all_tests.addTest(test_pcu.suite()) #all_tests.addTest(test_part.suite()) @@ -41,7 +41,7 @@ #all_tests.addTest(test_partslistsearch.suite()) #all_tests.addTest(test_partslistview.suite()) #all_tests.addTest(test_propertiesform.suite()) - #all_tests.addTest(test_searchframe.suite()) + all_tests.addTest(test_searchframe.suite()) return all_tests Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.3 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.4 --- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.3 Wed Jun 25 03:43:51 2003 +++ PanGalactic/pangalactic/client/tests/test_pgefobject.py Wed Oct 15 14:57:03 2003 @@ -1,13 +1,13 @@ import unittest -import pangalactic.enterprise.pgefobject +from pangalactic.enterprise import pgefobject import baseobjecttest class PGEFObjectTestCase(baseobjecttest.BaseObjectTests): def setUp(self): - self.obj1 = dataobjects.pgefobject.PGEFObject() - self.obj2 = dataobjects.pgefobject.PGEFObject() + self.obj1 = pgefobject.PgefObject() + self.obj2 = pgefobject.PgefObject() def Title(self): print '\nPGEFobject suite' @@ -17,11 +17,11 @@ suite.addTest(PGEFObjectTestCase("testDefaultObjectValues")) suite.addTest(PGEFObjectTestCase("testIsEqual")) suite.addTest(PGEFObjectTestCase("testIsEmpty")) - suite.addTest(PGEFObjectTestCase("testIsNotEmpty")) - suite.addTest(PGEFObjectTestCase("testConvertDataToList")) - suite.addTest(PGEFObjectTestCase("testAllDisplayTypesFilledIn")) - suite.addTest(PGEFObjectTestCase("testDataMemberNames")) - suite.addTest(PGEFObjectTestCase("testValidate")) + #suite.addTest(PGEFObjectTestCase("testIsNotEmpty")) + #suite.addTest(PGEFObjectTestCase("testConvertDataToList")) + #suite.addTest(PGEFObjectTestCase("testAllDisplayTypesFilledIn")) + #suite.addTest(PGEFObjectTestCase("testDataMemberNames")) + #suite.addTest(PGEFObjectTestCase("testValidate")) return suite def main(): Index: PanGalactic/pangalactic/client/tests/baseobjecttest.py diff -u PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.7 PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.8 --- PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.7 Fri Jun 27 03:24:49 2003 +++ PanGalactic/pangalactic/client/tests/baseobjecttest.py Wed Oct 15 14:57:03 2003 @@ -1,10 +1,10 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/tests/baseobjecttest.py,v $ import unittest -import dataobjects.objectstatus +#import pangalactic.utils.objectstatus from pangalactic.utils import pgefexceptions -__version__ = "$Revision: 1.7 $"[11:-2] +__version__ = "$Revision: 1.8 $"[11:-2] class BaseObjectTests(unittest.TestCase): @@ -21,16 +21,12 @@ #assert self.obj1.pgef_oid == None , 'incorrect initial value for oid' assert self.obj1.state == '', 'Status not empty' assert self.obj1.owner == '', 'incorrect initial value for Point of Contact' - assert self.obj1.project == '', 'Incorrect initial value for ProjectNameCode' assert self.obj1.creator == '', 'Incorrect initial value for Creator' - assert self.obj1.version == '', 'Incorrect initial value for Version' - assert self.obj1.create_datetime != '', 'Incorrect initial value for CreationDateTime' - assert self.obj1.mod_datetime == '', 'Incorrect initial value for ModifiedDateTime' def testIsEqual(self): """Check to see that the IsEqual method functions properly""" - pangalactic.enterprise.pgefobject.FillSampleObject(self.obj1) - pangalactic.enterprise.pgefobject.FillSampleObject(self.obj2) + self.obj1.popTestData() + self.obj2.popTestData() assert self.obj1.IsEqual(self.obj2), 'Object1 and object2 are not equal' def testIsEmpty(self): @@ -70,7 +66,7 @@ suite.addTest(BaseObjectTests("testIsEqual")) suite.addTest(BaseObjectTests("testIsEmpty")) suite.addTest(BaseObjectTests("testIsNotEmpty")) - suite.addTest(BaseObjectTests("testConvertDataToList")) - suite.addTest(BaseObjectTests("testDataMemberNames")) + #suite.addTest(BaseObjectTests("testConvertDataToList")) + #suite.addTest(BaseObjectTests("testDataMemberNames")) #suite.addTest(BaseObjectTests("testValidate")) return suite From waterbug at ned.gsfc.nasa.gov Wed Oct 15 19:49:49 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 15 18:49:51 2003 Subject: [Pangalactic-commits] Add document table. Message-ID: <200310152249.h9FMnnto023634@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbTables.sql 1.63 1.64 Log message: Add document table. Index: PanGalactic/src/sql/createPgerDbTables.sql diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.63 PanGalactic/src/sql/createPgerDbTables.sql:1.64 --- PanGalactic/src/sql/createPgerDbTables.sql:1.63 Thu Oct 2 13:39:06 2003 +++ PanGalactic/src/sql/createPgerDbTables.sql Wed Oct 15 18:49:47 2003 @@ -1,6 +1,6 @@ /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */ -/* $Id: createPgerDbTables.sql,v 1.63 2003/10/02 17:39:06 waterbug Exp $ +/* $Id: createPgerDbTables.sql,v 1.64 2003/10/15 22:49:47 waterbug Exp $ * * *** TO DO *** * -- TBR (Text-Based Requirements) @@ -1245,6 +1245,45 @@ CONSTRAINT dr_has_of_version FOREIGN KEY (of_dv_id, of_dm_id, of_dm_id_context) REFERENCES doc_version + ON UPDATE CASCADE + ON DELETE CASCADE + DEFERRABLE +) +INHERITS (pgef_object); + + +CREATE TABLE document + /* Document is a container object that provides access to the + * current version of a document and all related objects. + * Document is the primary object that applications will deal + * directly with. */ +( + pgef_oid TEXT UNIQUE, + /* (This attribute is inherited from PgefObject.) + * pgef_oid is constructed as the concatenation of the + * transaction owner's id and the timestamp of the + * transaction in Universal Time. */ + pgef_class TEXT DEFAULT 'Document', + /* pgef_class indicates what type of application object a + * given database row is mapped into. The default + * pgef_class for each table is set at table creation + * time, but it may be overridden for any specific row + * and set to a custom application object class. */ + master TEXT, + /* pgef_oid of the associated DocMaster. */ + current_version TEXT, + /* pgef_oid of the latest DocVersion associated with that + * DocMaster. */ + PRIMARY KEY (pgef_oid), + CONSTRAINT doc_has_master + FOREIGN KEY (master) + REFERENCES doc_master(pgef_oid) + ON UPDATE CASCADE + ON DELETE CASCADE + DEFERRABLE, + CONSTRAINT doc_has_current_version + FOREIGN KEY (current_version) + REFERENCES doc_version(pgef_oid) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE From pbear at ned.gsfc.nasa.gov Thu Oct 16 12:17:22 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 16 11:17:25 2003 Subject: [Pangalactic-commits] added test for workflow creation Message-ID: <200310161517.h9GFHMFK029537@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_workflow_wizard.py None 1.1 PanGalactic/pangalactic/client/tests/runall.py 1.7 1.8 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.16 1.17 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.18 1.19 PanGalactic/pangalactic/utils/datamanager.py 1.46 1.47 Log message: added test for workflow creation Index: PanGalactic/pangalactic/client/tests/runall.py diff -u PanGalactic/pangalactic/client/tests/runall.py:1.7 PanGalactic/pangalactic/client/tests/runall.py:1.8 --- PanGalactic/pangalactic/client/tests/runall.py:1.7 Wed Oct 15 14:57:03 2003 +++ PanGalactic/pangalactic/client/tests/runall.py Thu Oct 16 11:17:20 2003 @@ -19,6 +19,7 @@ #import test_partslistview #import test_propertiesform import test_searchframe +import test_workflow_wizard def runTest(): all_tests = unittest.TestSuite() @@ -42,6 +43,7 @@ #all_tests.addTest(test_partslistview.suite()) #all_tests.addTest(test_propertiesform.suite()) all_tests.addTest(test_searchframe.suite()) + all_tests.addTest(test_workflow_wizard.suite()) return all_tests Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.46 PanGalactic/pangalactic/utils/datamanager.py:1.47 --- PanGalactic/pangalactic/utils/datamanager.py:1.46 Wed Oct 15 12:51:13 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Thu Oct 16 11:17:21 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.46 $"[11:-2] +__version__ = "$Revision: 1.47 $"[11:-2] import time import mx.DateTime @@ -743,6 +743,10 @@ return obj + def getActivity(self, oid): + obj = self.localDB.GetLocalObject(self.localDB.WFACTIVITY, oid) + return obj + def getUncommittedWorkflows(self): return self.localDB.getUncommittedWorkflows() Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.16 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.17 --- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.16 Tue Oct 7 10:53:48 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py Thu Oct 16 11:17:20 2003 @@ -146,8 +146,11 @@ def FillGrid(self, workflowlist): - # duh. - #print "wfprocessoverview.fillgrid", workflowlist + """ + Gee. I guess this fills the grid. + """ + + # print "wfprocessoverview.fillgrid", workflowlist if self.grid: if len(workflowlist) > 0: self.workflowlist = workflowlist @@ -216,8 +219,8 @@ 'Yes', 'No', size = wxSize(250, 120)) result = dlg.ShowModal() if result == wxID_OK: - transitions = wizard.GetTransitions() - activities = wizard.GetActivities() + #transitions = wizard.GetTransitions() + #activities = wizard.GetActivities() wfobj = wizard.Save() #print "wfobj", wfobj if wfobj: @@ -337,8 +340,8 @@ 'Yes', 'No', size = wxSize(250, 120)) result = dlg.ShowModal() if result == wxID_OK: - transitions = editor.GetTransitions() - activities = editor.GetActivities() + #transitions = editor.GetTransitions() + #activities = editor.GetActivities() wfobj = editor.Save() if wfobj: self.grid.AddData(wfobj, wxLIGHT_GREY) @@ -481,18 +484,3 @@ print "workflowoverview.gridtopdf tbd" -#---------------------------------------------------------------------------- -if __name__ == '__main__': - - class MyApp(wxApp): - - def OnInit(self): - frame = wxFrame(NULL, -1, "Workflow Workflow", wxDefaultPosition, wxSize(800, 600)) - main = WorkflowOverview(frame,-1, wxDefaultPosition, wxSize(800, 600)) - frame.Show(true) - self.SetTopWindow(frame) - return true - - #---------------------------------------------------------------------------- - app = MyApp(0) - app.MainLoop() Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.18 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.19 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.18 Tue Oct 7 10:53:48 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Thu Oct 16 11:17:20 2003 @@ -117,6 +117,8 @@ self.transitiongrid.SetRowLabelSize(40) self.transitiongrid.EnableEditing(True) + self.displayWgt = None + self.MoveTo = None self.ActNextRow = 0 @@ -218,7 +220,7 @@ def createWorkflow(self, name, activities, transitions): - #print "wizard.createWorkflow" + print "wizard.createWorkflow" process = wffactory.simpleWfProcess(name) @@ -284,7 +286,8 @@ if name: self.workflow = self.createWorkflow(name, activities, transitions) self.DataManager.addWorkflow(self.workflow) - self.displayWgt.AddData(self.workflow) + if self.displayWgt: + self.displayWgt.AddData(self.workflow) self.saved_workflow = True return self.workflow else: @@ -311,7 +314,8 @@ else: self.DataManager.creatingWorkflow = True self.workflow = self.Save() - self.displayWgt.AddData(self.workflow) + if self.displayWgt: + self.displayWgt.AddData(self.workflow) return self.workflow else: return None From bmuir at ned.gsfc.nasa.gov Thu Oct 16 14:22:20 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Thu Oct 16 13:22:22 2003 Subject: [Pangalactic-commits] fixed the rest of the tests for pgefobject Message-ID: <200310161722.h9GHMKHC031051@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/baseobjecttest.py 1.8 1.9 PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.4 1.5 Log message: fixed the rest of the tests for pgefobject Index: PanGalactic/pangalactic/client/tests/baseobjecttest.py diff -u PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.8 PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.9 --- PanGalactic/pangalactic/client/tests/baseobjecttest.py:1.8 Wed Oct 15 14:57:03 2003 +++ PanGalactic/pangalactic/client/tests/baseobjecttest.py Thu Oct 16 13:22:19 2003 @@ -4,7 +4,7 @@ #import pangalactic.utils.objectstatus from pangalactic.utils import pgefexceptions -__version__ = "$Revision: 1.8 $"[11:-2] +__version__ = "$Revision: 1.9 $"[11:-2] class BaseObjectTests(unittest.TestCase): @@ -31,17 +31,19 @@ def testIsEmpty(self): """Check to see that the IsEmpty returns true when the object is empty""" - assert self.obj1.IsEmpty() == 1 , 'New object should have been empty' + result = self.obj1.IsEmpty() + assert result == 1 , 'New object should have been empty' def testIsNotEmpty(self): """Check to see that the IsEmpty returns false when the object is empty""" self.obj1.creator = '123' - assert self.obj1.IsEmpty() == None , 'Object should not have been empty' + result = self.obj1.IsEmpty() + assert result == False , 'Object should not have been empty' self.obj1.creator = '' def testConvertDataToList(self): """Check to see that ConvertDataToList returns the proper number of entries""" - temp = self.obj1.ConvertDataToList() + temp = self.obj1.convertDataToList() assert len(temp) == len(self.obj1._gridmap) def testDataMemberNames(self): @@ -66,7 +68,7 @@ suite.addTest(BaseObjectTests("testIsEqual")) suite.addTest(BaseObjectTests("testIsEmpty")) suite.addTest(BaseObjectTests("testIsNotEmpty")) - #suite.addTest(BaseObjectTests("testConvertDataToList")) - #suite.addTest(BaseObjectTests("testDataMemberNames")) - #suite.addTest(BaseObjectTests("testValidate")) + suite.addTest(BaseObjectTests("testConvertDataToList")) + suite.addTest(BaseObjectTests("testDataMemberNames")) + suite.addTest(BaseObjectTests("testValidate")) return suite Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.4 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.5 --- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.4 Wed Oct 15 14:57:03 2003 +++ PanGalactic/pangalactic/client/tests/test_pgefobject.py Thu Oct 16 13:22:19 2003 @@ -17,11 +17,10 @@ suite.addTest(PGEFObjectTestCase("testDefaultObjectValues")) suite.addTest(PGEFObjectTestCase("testIsEqual")) suite.addTest(PGEFObjectTestCase("testIsEmpty")) - #suite.addTest(PGEFObjectTestCase("testIsNotEmpty")) - #suite.addTest(PGEFObjectTestCase("testConvertDataToList")) - #suite.addTest(PGEFObjectTestCase("testAllDisplayTypesFilledIn")) - #suite.addTest(PGEFObjectTestCase("testDataMemberNames")) - #suite.addTest(PGEFObjectTestCase("testValidate")) + suite.addTest(PGEFObjectTestCase("testIsNotEmpty")) + suite.addTest(PGEFObjectTestCase("testConvertDataToList")) + suite.addTest(PGEFObjectTestCase("testDataMemberNames")) + suite.addTest(PGEFObjectTestCase("testValidate")) return suite def main(): From pbear at ned.gsfc.nasa.gov Thu Oct 16 14:24:51 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 16 13:24:51 2003 Subject: [Pangalactic-commits] addef test for workflow factory; fixed firstcap to camelcap method calls Message-ID: <200310161724.h9GHOpwk031126@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_wffactory.py None 1.1 PanGalactic/pangalactic/enterprise/workflow/wffactory.py 1.7 1.8 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.20 1.21 Log message: addef test for workflow factory; fixed firstcap to camelcap method calls Index: PanGalactic/pangalactic/enterprise/workflow/wffactory.py diff -u PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.7 PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.8 --- PanGalactic/pangalactic/enterprise/workflow/wffactory.py:1.7 Tue Oct 7 10:53:48 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wffactory.py Thu Oct 16 13:24:49 2003 @@ -4,8 +4,8 @@ import copy -from pangalactic.enterprise.workflow.wfprocess import WfProcess -from pangalactic.enterprise.workflow.wfactivity import WfActivity +from pangalactic.enterprise.workflow.wfprocess import WfProcess +from pangalactic.enterprise.workflow.wfactivity import WfActivity from pangalactic.enterprise.workflow.wftransition import WfTransition DEFAULT_WORKFLOW = ("WF0", Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.20 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.21 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.20 Wed Oct 15 12:51:13 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Thu Oct 16 13:24:49 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.20 $ +@version: $Revision: 1.21 $ """ -__version__ = "$Revision: 1.20 $"[11:-2] +__version__ = "$Revision: 1.21 $"[11:-2] import xmlrpclib import types @@ -97,7 +97,7 @@ return self._factory.rememberAll(data, objs) - def GetCategories(self, context): + def getCategories(self, context): # Category is a subclass of DataElement. FSC is a # Category; it's passed in as the context print "xmlrpc.getcategories" @@ -105,13 +105,13 @@ if data: return [self._factory.remember(x) for x in data] - def GetOrganizations(self): + def getOrganizations(self): print "xmlrpc.getorganizations" data = self._RPC.getObjects('Organization', "id_context=DEMO") ## NOT staying. Demo only!! --vwk 28feb2003 if data: return [self._factory.remember(x) for x in data] - def GetOrganization(self, ObjId): + def getOrganization(self, ObjId): print "xmlrpc.getorganization" data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId) if data: From waterbug at ned.gsfc.nasa.gov Thu Oct 16 15:01:41 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 16 14:01:44 2003 Subject: [Pangalactic-commits] Cat -> Category in FSC test data. Message-ID: <200310161801.h9GI1fFp031990@ned.gsfc.nasa.gov> Modified files: PanGalactic/data/cats.tsv 1.3 1.4 Log message: Cat -> Category in FSC test data. Index: PanGalactic/data/cats.tsv diff -u PanGalactic/data/cats.tsv:1.3 PanGalactic/data/cats.tsv:1.4 --- PanGalactic/data/cats.tsv:1.3 Fri Aug 29 14:54:21 2003 +++ PanGalactic/data/cats.tsv Thu Oct 16 14:01:39 2003 @@ -1,645 +1,645 @@ -\N Cat 1005 FSC 0 Guns, through 30mm Guns, through 30mm Includes Machine Guns; Brushes, Machine Gun and Pistol. Excludes Turrets, Aircraft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1010 FSC 0 Guns, over 30mm up to 75mm Guns, over 30mm up to 75mm Includes Breech Mechanisms; Mounts; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic-Firing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1015 FSC 0 Guns, 75mm through 125mm Guns, 75mm through 125mm Includes Breech Mechanisms; Mounts; Rammers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1020 FSC 0 Guns, over 125mm through 150mm Guns, over 125mm through 150mm Includes Breech Mechanisms; Power Drives; Gun Shields. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1025 FSC 0 Guns, over 150mm through 200mm Guns, over 150mm through 200mm Includes Firing Platforms; Mounts; Gun Shields. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1030 FSC 0 Guns, over 200mm through 300mm Guns, over 200mm through 300mm Includes Gun Yokes; Rammers; Reflectors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1035 FSC 0 Guns, over 300mm Guns, over 300mm Includes Breech Mechanisms; Training Gears; Power Drives. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1040 FSC 0 Chemical Weapons and Equipment Chemical Weapons and Equipment Includes Flame Throwers; Smoke Generators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1045 FSC 0 Launchers, Torpedo and Depth Charge Launchers, Torpedo and Depth Charge Includes Depth Charge Tracks; Torpedo Tubes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1055 FSC 0 Launchers, Rocket and Pyrotechnic Launchers, Rocket and Pyrotechnic Includes Airborne Rocket Launchers adaptable to guided missile use. Excludes Specifically designed Airborne Guided Missile Launchers; Jettisonable Rocket Launchers; Launcher Fairings designed for specific airframes; Rifle Grenade Launchers; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic Firing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1070 FSC 0 Nets and Booms, Ordnance Nets and Booms, Ordnance Note-This class includes nets and booms for harbor defense only. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1075 FSC 0 Degaussing and Mine Sweeping Equipment Degaussing and Mine Sweeping Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1080 FSC 0 Camouflage and Deception Equipment Camouflage and Deception Equipment Includes Dummy Artillery, Aircraft and Vehicles; Garnished Nets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1090 FSC 0 Assemblies Interchangeable Between Weapons in Two or More Classes Assemblies Interchangeable Between Weapons in Two or More Classes Includes Components and Accessories used on or with weapons falling in two or more classes of Group 10. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1095 FSC 0 Miscellaneous Weapons Miscellaneous Weapons Includes Line Throwing Guns; Catapult Guns; Bayonets; Saluting Guns; Signal Guns; Flare Guns; Barrage Balloons; Accessories, not elsewhere classifiable, for weapons in this group; Expendable Bomb Dispensers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1105 FSC 0 Nuclear Bombs Nuclear Bombs Note-This class includes nuclear weapons (including bombs), which are designed to be dropped from an aircraft. Includes Ballistic cases, tail assemblies, retardation devices, and other peculiar components which are not classifiable elsewhere. Excludes Parachute canopies and canopy hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1110 FSC 0 Nuclear Projectiles Nuclear Projectiles Note- This class includes nuclear weapons which are designed to be propelled from a recoilless rifle, gun, howitzer, or the like, and which are not designed to be self-propelled. Includes Ogive sections, body sections, bases, and other peculiar components which are not classifiable elsewhere. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1115 FSC 0 Nuclear Warheads and Warhead Sections Nuclear Warheads and Warhead Sections Note This class includes nuclear warheads (without or assembled with case sections, adaption kits, and/or fuzing and firing components) which are to be used in or with bombs, rockets, projectiles, missiles, demolition charges, or the like. Also includes case sections, nose cones, flare sections, center sections, and auxiliary structural components of missiles, rockets, and re-entry vehicles which are designed or constructed for exclusive use with or for housing of nuclear warheads and/or warhead sections. Includes Components and parts peculiar to the warhead or warhead section, which are not classifiable in more specific classes. Excludes Such components as fuzing and firing devices, nuclear components, high explosive components, classifiable in more specific classes, and items such as projectiles and bombs which include the entire outer case of a weapon. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1120 FSC 0 Nuclear Depth Charges Nuclear Depth Charges Note-This class includes nuclear weapons which consist of depth charge bodies assembled with nuclear warheads. It includes training weapons and all specially designed components which are not classifiable elsewhere. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1125 FSC 0 Nuclear Demolition Charges Nuclear Demolition Charges Note-This class includes nuclear weapons which are designed to be emplaced in or near a structure, area, or the like, which is to be destroyed. The weapons may include accessories. Includes Outer cases, case sections, and other peculiar components, which are not classifiable elsewhere. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1127 FSC 0 Nuclear Rockets Nuclear Rockets Note-This class includes nuclear weapons, consisting of rocket bodies assembled with nuclear warheads, which comprise a single item of supply and are issued as such. Includes Components peculiar to assembled rockets which are not classifiable elsewhere. Excludes Rocket Motors; Warhead Components; Rocket Components classified in other FSC classes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1130 FSC 0 Conversion Kits, Nuclear Ordnance Conversion Kits, Nuclear Ordnance Note-This class includes collections of items used for the purpose of converting nuclear weapons from one configuration to another. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1135 FSC 0 Fuzing and Firing Devices, Nuclear Ordnance Fuzing and Firing Devices, Nuclear Ordnance Includes such items as fuzes, power supplies, firing sets, x-units, cables, safing devices, adaption kits, and re-entry vehicle nuclear ordnance arming and fuzing systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1140 FSC 0 Nuclear Components Nuclear Components Includes All components which contain or simulate nuclear active materials. Excludes end items, such as bombs, projectiles, warheads, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1145 FSC 0 Explosive and Pyrotechnic Components, Nuclear Ordnance Explosive and Pyrotechnic Components, Nuclear Ordnance Note-This class includes actual and simulated explosive and pyrotechnic components peculiar to all nuclear ordnance end items, such as bombs, demolition charges, rockets, projectiles, warheads, and related systems. Excluded from this class are all explosive and pyrotechnic components designed for other than nuclear ordnance applications. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1190 FSC 0 Specialized Test and Handling Equipment, Nuclear Ordnance Specialized Test and Handling Equipment, Nuclear Ordnance Includes Specially designed trucks and trailers for nuclear ordnance; Specially designed slings and hoists; Operational, test, and setting devices, and cradles; Conditioning Kits and Sets, Controlled Environment. Excludes Hand tools; Instruments for use on both nuclear ordnance and other equipment; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes in the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1195 FSC 0 Miscellaneous Nuclear Ordnance Miscellaneous Nuclear Ordnance Includes Items common to more than one class or items not properly fitting into the foregoing classes of nuclear ordnance. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1210 FSC 0 Fire Control Directors Fire Control Directors admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1220 FSC 0 Fire Control Computing Sights and Devices Fire Control Computing Sights and Devices admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1230 FSC 0 Fire Control Systems, Complete Fire Control Systems, Complete Note-This class includes only complete fire control systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in fire control systems are classified in classes other than this class. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1240 FSC 0 Optical Sighting and Ranging Equipment Optical Sighting and Ranging Equipment Includes Periscopes for Submarines; Range and Height Finders; Telescopic Sights; Optical Instruments Integrated with Fire Control Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1250 FSC 0 Fire Control Stabilizing Mechanisms Fire Control Stabilizing Mechanisms admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1260 FSC 0 Fire Control Designating and Indicating Equipment Fire Control Designating and Indicating Equipment Includes Turret, Gun, Torpedo Mount, and Searchlight Indicating Equipment; Target Designating Equipment; Synchro Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1265 FSC 0 Fire Control Transmitting and Receiving Equipment, except Airborne Fire Control Transmitting and Receiving Equipment, except Airborne Includes Fire Control Transmitters, Transmitter-Receivers, Receivers, Receiver-Regulators. Excludes Fire Control Transmitting and Receiving Equipment, Specially Designed for use on or with Fire Control Radar Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1270 FSC 0 Aircraft Gunnery Fire Control Components Aircraft Gunnery Fire Control Components Includes Turrets, Aircraft; Computers, specifically designed; Complete Gyro Mechanisms. Excludes Gun Chargers; Ammunition Boxes; Gun Heaters; Field and Link Chutes; Ammunition Boosters; Gyro Components; Complete Fire Control Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1280 FSC 0 Aircraft Bombing Fire Control Components Aircraft Bombing Fire Control Components Includes Computers, specifically designed; Complete Gyro Mechanisms; Optical Instruments for Bombing Fire Control. Excludes Gyro Components; Optical Elements, such as Lens, Prisms, Filters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1285 FSC 0 Fire Control Radar Equipment, except Airborne Fire Control Radar Equipment, except Airborne Includes Radar Sets, Assemblies, Subassemblies, and Components Specially Designed for use on or with Fire Control Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1287 FSC 0 Fire Control Sonar Equipment Fire Control Sonar Equipment Note-This class includes airborne, shipborne, and submarineborne sonar sets, assemblies, subassemblies, and components designed specificially for use with underwater fire control equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1290 FSC 0 Miscellaneous Fire Control Equipment Miscellaneous Fire Control Equipment Includes Fuze Setters; Ordnance Cable Systems; Aiming Circles; Flash and Sound Ranging Sets; Fire Control Components and Subassemblies Not Classifiable in Other Classes of Group 12. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1305 FSC 0 Ammunition, through 30mm Ammunition, through 30mm Includes Components. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1310 FSC 0 Ammunition, over 30mm up to 75mm Ammunition, over 30mm up to 75mm Includes Components, except Fuzes and Primers; Chemical Warfare Cartridges. Excludes Fuzes and Primers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1315 FSC 0 Ammunition, 75mm through 125mm Ammunition, 75mm through 125mm Includes Components, except Fuzes and Primers; Pyrotechnic Cartridges and Projectiles; Chemical Warfare Cartridges and Projectiles. Excludes Fuzes and Primers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1320 FSC 0 Ammunition, over 125mm Ammunition, over 125mm Includes Components, except Fuzes and Primers; Chemical Warfare Projectiles. Excludes Fuzes and Primers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1325 FSC 0 Bombs Bombs Includes Components; Photoflash Bombs; Chemical Warfare Bombs; Bomb Clusters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1330 FSC 0 Grenades Grenades Includes Components; Hand and Rifle Grenades; Smoke Grenades. Excludes Firing Devices (Launchers). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1336 FSC 0 Guided Missile Warheads and Explosive Components Guided Missile Warheads and Explosive Components Includes Warheads Containing Military Chemical Agents; Exercise Heads, Guided Missile. Excludes Atomic Ordnance Warheads; All other Warheads for use on other than guided missiles; Liquid Propulsion Units; Rocket Engines (Liquid Propellant Units); JATO Units; Rocket Motors (Solid Propellant Units) for Guided Missiles; Solid Fuel Propulsion Units; Propellant Chemicals encased in consumable containers, such as squibs and cartridges for insertion into missile propulsion systems as integral parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1337 FSC 0 Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; All Explosive Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Solid Propellants encased in consumable containers, such as squibs and cartridges, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets; Solid Propellants predetermined to specific quantity and quality, but packaged in reusable containers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1338 FSC 0 Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components. Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components. Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1340 FSC 0 Rockets, Rocket Ammunition and Rocket Components Rockets, Rocket Ammunition and Rocket Components Includes Complete Rounds; Explosive Components, Including Warheads; Pyrotechnic Rockets; Solid Fuel JATO Units; Rocket Motors (Solid Propellant Units) for Rockets; Covers, Protective Rocket Warhead; Jettisonable Rocket Launchers; Conditioning Kits and Sets, Controlled Environment; and other peculiar components which are not classified elsewhere. Excludes Nuclear rockets, Nuclear warheads; all other warheads for use on other than rockets; and rockets with built-in guiding devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1345 FSC 0 Land Mines Land Mines Includes Components; Antipersonnel Mines; Antitank Mines; Fuzes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1346 FSC 0 Remote Munitions Remote Munitions Munitions items/systems that are not held by the soldier but are deployed for future activation. They may be put in place separately by the soldier or delivered from vehicles or aircraft by mechanical distribution methods. They may be command controlled or may use self - initiated firing systems that do not require soldier monitoring. All items in this class can be armed/disarmed remotely. Remote Munition Items and Systems used singularly or in combination to defeat a variety of threats; Fuzes; Safe and Arming devises; Self Destruction Mechanisms; Communication Modules; Command and Control systems and various other pertinent components. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1350 FSC 0 Underwater Mine and Components, Inert Underwater Mine and Components, Inert Includes Parachute Packs; Inert Mine Cases; Booster Cans; Clock Delays; Clock Starters; Search Coils; Extenders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1351 FSC 0 Underwater Mines and Components, Explosive Underwater Mines and Components, Explosive Includes Loaded Cases; Boosters; Detonators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1352 FSC 0 Underwater Mine Disposal Inert Devices Underwater Mine Disposal Inert Devices Note: Version of Underwater Mine Disposal Explosive Device without destructive charge. Intended for underwater mine hunting and reconnaissance. May also be used for training purposes. Includes: Complete operating units, such as an underwater mine reconnaissance device, as well as component parts, practice, training, blank, and dummies. Excludes: Torpedo Inert components, depth charges, and underwater mines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1353 FSC 0 Underwater Mine Disposal Explosive Devices Underwater Mine Disposal Explosive Devices Note: Complete explosive devices, including destructive charge. It is fired, guided to target and detonated from a vessel or other remote site. Includes Complete explosive device, including ammunition, detonating charge, and component parts. Excludes Underwater Mine Explosive Components (FSC 1351), Torpedo Explosive Components (FSC 1356), Military Chemical Agents (FSC 1365). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1355 FSC 0 Torpedos and Components, Inert Torpedos and Components, Inert admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1356 FSC 0 Torpedos and Components, Explosive Torpedos and Components, Explosive Includes Warheads; Boosters; Detonators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1360 FSC 0 Depth Charges and Components, Inert Depth Charges and Components, Inert Includes Inert Firing Mechanisms; Pistols without Detonators; Extenders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1361 FSC 0 Depth Charges and Components, Explosive Depth Charges and Components, Explosive Includes Cases; Boosters; Detonators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1365 FSC 0 Military Chemical Agents Military Chemical Agents Includes War Gases; Screening Smokes; Incendiary and thickening Agents; Signaling Smokes. Excludes Ammunition containing Military Chemical Agents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1367 FSC 0 Tactical Sets, Kits, and Outfits Tactical Sets, Kits, and Outfits A collection of items, which are used for a specific purpose. Each collection must include at least one item of ordnance classified in Group 13. Ordnance may be non-lethal (as defined in the Department of Defense Directive 3000.3). These sets, kits and outfits may include such items as uniforms, weapons, body armor, and the like. By themselves, each of these components belongs in an FSC other than 1367. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1370 FSC 0 Pyrotechnics Pyrotechnics Includes Flares; Signals; Fireworks; Pistol Rocket Signals. Excludes Pyrotechnic Cartridges and Projectiles; Photoflash Bombs; Pyrotechnic Rockets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1375 FSC 0 Demolition Materials Demolition Materials Includes Items for construction, quarrying and demolition work such as Dynamite and other explosives packed in cylindrical paper cartridges or in bags, Demolition Charges, Blasting Caps, Blasting Time Fuses, Detonating Cord, Demolition Firing Devices; Booby Trap Mechanisms; Bangalore Torpedoes; Inert accessories and components such as Blasting Machines, Priming Adapters, and Detonating Cord Clips. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Safety-in-Flight Explosive Items and Devices such as, Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers, and similar items, as shown in the indexes to the FSC, Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Nuclear Ordnance Components; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1376 FSC 0 Bulk Explosives Bulk Explosives Includes Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Explosive Loaded Devices and Components as shown in the indexes to the FSC. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Blasting and Demolition Materials; Safety-in-Flight Explosive Items and Devices such as Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections; similiar items, as shown in the indexes to the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1430 FSC 0 Guided Missile Remote Control Systems Guided Missile Remote Control Systems Note-This class includes airborne and nonairborne guided missile remote control systems, components, and accessories, designed specifically for use therewith. Excluded from this class are fire control assemblies, subassemblies, and components modified for use with guided missile remote control systems, and fire control assemblies designed specifically for shipboard use. Includes Specially Designed Components of Guided Missile Remote Control Systems. Excludes Guided Missile Internal (Built-in) Control Systems; Components used in both guided missiles and other than guided missiles (including fire control components). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1440 FSC 0 Launchers, Guided Missile Launchers, Guided Missile Includes Airborne and Nonairborne Guided Missile Launchers. Excludes Aircraft Launchers; Rocket Launchers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1377 FSC 0 Cartridge and Propellant Actuated Devices and Components Cartridge and Propellant Actuated Devices and Components Note-This class includes safety-in-flight explosive items, consisting of a quantity of propellant (either encased in a cartridge or in molded form) and a means of activation, designed to be inserted into or attached to one or more devices to provide the energy required to operate devices requiring a time delay, or not requiring a time delay, in their operating sequence. Also included are devices designed to utilize energy generated by the items described above. Includes Impulse Cartridges; Delay Cartridges; Engine Starter Cartridges (explosive filled); Fire Extinguisher Cartridges (used to activate by remote control); Aircraft Ejection Seat Catapults; Rocket Motors (Solid Propellant Units) for Aircraft Ejection Seats; Aircraft Canopy Removers; Thrusters, propellant and cartridge actuated; Initiators; Explosive Bolts and Explosive Bolt Cartridges; Cutters, cartridge or propellant actuated, Reefing Line; Powder actuated Tool Cartridges; Explosive Loaded Devices and Components which are not specifically classified elsewhere. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants, encased in consumable containers for insertion into missile propulsion systems as an integral part; Guided Missile Explosive Devices; Bulk and Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Blasting and Demolition Materials; Rocket Motors, Warheads and Propulsion Sections for Rockets and Guided Missiles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1385 FSC 0 Surface Use Explosive Ordnance Disposal Tools and Equipment Surface Use Explosive Ordnance Disposal Tools and Equipment Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD) personnel. Excludes Nonspecialized or common tools and equipment not developed exclusively for use by qualified EOD personnel; specialized demolition material; explosive loaded shaped charges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1386 FSC 0 Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD), personnel, Underwater Demolition Teams (UDT), and/or Sea-Air-Land (SEAL) personnel Excludes Nonspecialized or common tools not developed exclusively for use by qualified EOD, UDT, and/or SEAL personnel; specialized demolition material; explosive loaded shaped charges admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1390 FSC 0 Fuzes and Primers Fuzes and Primers Note-This class includes only fuzes and primers for use in ammunition classified in Classes 1310, 1315, and 1320. Excludes Fuzes and Primers for ammunition not classified in Classes 1310, 1315, and 1320. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1395 FSC 0 Miscellaneous Ammunition Miscellaneous Ammunition Includes Ammunition Shapes, such as Blanks, Disks, Slugs, Cups, and Rotating Bands (Shell Bands). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1398 FSC 0 Specialized Ammunition Handling and Servicing Equipment Specialized Ammunition Handling and Servicing Equipment Includes Handling and servicing equipment specially designed for use on or with rockets and conventional ammunition. Excludes Handling and servicing equipment specially designed for use on or with rocket and pyrotechnic launchers; Ammunition maintenance and repair shop specialized equipment; Handling equipment specially designed for aircraft or airfield use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1410 FSC 0 Guided Missiles Guided Missiles Note-This class includes only complete guided missiles, with or without warheads and explosive components, whether in assembled or unassembled form. End items, assemblies, parts, attachments, or accessories for use in or on guided missiles are classified in classes other than this class. Includes Complete Drones, initially designed as missiles, but converted to drone use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1420 FSC 0 Guided Missile Components Guided Missile Components Includes Structural Components; Components and Accessories Specially Designed for use on or with guided missiles, including Complete Gyro Mechanisms, Hydraulic Pumps, Automatic Pilot Mechanisms and Specially Designed Assemblies, and Electronic Guidance Equipment installed in missiles. Excludes Electronic Remote Guidance Equipment used to guide missiles; Solid and Liquid Propellant Units; Components of Gyro Mechanisms. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1425 FSC 0 Guided Missile Systems, Complete Guided Missile Systems, Complete Note-This class includes only complete guided missile systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in guided missile systems are classified in classes other than this class. Excludes Guided Missile Subsystems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1427 FSC 0 Guided Missile Subsystems Guided Missile Subsystems Note-This class includes only combinations or assemblies of two or more end items, each of which is properly classified in other classes of this group, identified as single items of supply. Excluded from this class are individual end items, assemblies, subassemblies, attachments, accessories or parts classified in other classes of this group, not combined as single items of supply. Excludes Complete Guided Missile Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1450 FSC 0 Guided Missile Handling and Servicing Equipment Guided Missile Handling and Servicing Equipment Includes Specially Designed Trucks and Trailers for use in transporting guided missiles; Specially Designed Slings, Hoists, Jacks, and Blowers; Self-propelled Vehicles and Trailers, Specially Designed for Guided Missile Handling or Servicing; Covers, Guided Missile; Conditioning Kits and Sets, Controlled Environment. Excludes Guided Missile Launchers (FSC 1440); Aircraft Handling and Servicing Equipment (FSC 1730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1510 FSC 0 Aircraft, Fixed Wing Aircraft, Fixed Wing Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on fixed wing aircraft are classified in classes other than this class. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1520 FSC 0 Aircraft, Rotary Wing Aircraft, Rotary Wing Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on rotary wing aircraft are classified in classes other than this class. Includes Helicopters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1540 FSC 0 Gliders Gliders Note-This class includes only complete gliders. End items, assemblies, parts, attachments, or accessories for use in or on gliders are classified in classes other than this class. Includes Motorized Gliders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1550 FSC 0 Drones Drones Note-This class includes only complete drones. End items, assemblies, parts, attachments, or accessories for use in or on drones are classified in classes other than this class. Includes Drones specifically designed for such uses as targets, training, surveillance, missile evaluation, and photographic reconnaissance. Excludes Piloted aircraft and guided missiles converted to drone use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1560 FSC 0 Airframe Structural Components Airframe Structural Components Note-This class includes fabricated system parts that are permanently attached or peculiar to the integral airframe of an aircraft, such as support structural components, spars, ribs, ailerons, stabilizers, bulkheads. Includes Flight Control Surfaces; Internal and External Auxiliary Fuel Tanks; Exhaust Systems; Pylons, Trim Tabs; Aircraft. Excludes Fitted Covers; Helicopter Rotor Brake System Components; Aircraft Loose Equipment and Alternate Mission Configuration Equipment stored on board the aircraft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1610 FSC 0 Aircraft Propellers and Components Aircraft Propellers and Components Includes Aircraft Propellers; Propeller Blades, Cams, Cones, Hubs, Nuts, and Spinners; Test Clubs; Synchronizers; Power Control Units; Integral Oil Control Measures and Propeller Governors. Excludes Rotary Rudder and Rotary Wing Blades (FSC 1615). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1615 FSC 0 Helicopter Rotor Blades, Drive Mechanisms and Components. Helicopter Rotor Blades, Drive Mechanisms and Components. Note-This class includes miscellaneous component parts specifically designed for, and used exclusively in, helicopter drive mechanisms and rotor blades when not specifically classified elsewhere in the FSC indexes. Includes Helicopter dynamic components and specially designed parts that transmit power from the aircraft power plant to the rotary wing and rotary rudder. Also included in this class are Rotors; Blades; Rotor Blade, Trim, Tabs; Blade Sets; Yokes; Clutches and Transmissions. Excludes Propellers (FSC 1610); Rotor Brake Systems Components (FSC 1630); Rotor Blade Hydraulic Folding System Components (FSC 1650); Hydraulic Servo System Components (FSC 1650). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1620 FSC 0 Aircraft Landing Gear Components Aircraft Landing Gear Components Includes Shock Struts and Components; Installation Elements, such as Torsion Bars, Vibration Links, Drag Struts; Landing Gear Trunions, Axles and Shimmy Dampeners; Specially designed hydraulic power steering system components. Excludes Mounting Braces and Mounting Plates permanently installed on aircraft (FSC 1680); Landing Wheels, Skis, and Floats (FSC 1630); Wheel Brakes and Wheel Brake Cylinders (FSC 1630). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1630 FSC 0 Aircraft Wheel and Brake Systems Aircraft Wheel and Brake Systems Includes Skis; Floats; Tracks; Landing Wheel Skid Detectors; Valves specifically designed for use with hydraulic or pneumatic wheel and brake systems; Helicopter Rotor Brake System Components. Excludes Landing Gear Axles (FSC 1620). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1640 FSC 0 Aircraft Control Cable Products Aircraft Control Cable Products Note - Wire rope, with attachments or terminations and pulleys, used in aircraft control applications, will be classified in this class. Includes Wire Rope; Single Leg Wire Assemblies; Wire Strands; Control Pulleys; Turnbuckle Lock Clips and other wire rope attachments and terminations. Excludes General use Chain and Wire Rope (FSC 4010); general use Pulleys (FSC 3020); general use Miscellaneous Hardware (FSC 5340); general use Fittings for Rope, Cable and Chain (FSC 4030). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1650 FSC 0 Aircraft Hydraulic, Vacuum, and De-icing System Components Aircraft Hydraulic, Vacuum, and De-icing System Components Note-This class includes only those components specifically designed for aircraft use. Includes Hydraulic and Pneumatic Accumulators, Pumps, Motors, Actuating Cylinders, and Filters; De-icing Boots; Fluid Type De-icing Pumps, Valves and Filters; Vacuum System Oil Separators; Pneumatic Pressurization Equipment other than that for pressurizing cabins and compartments. Excludes Jet Engine Hydraulic Components (FSC 2840); Valves specifically designed for air conditioning, heating, ventilating, cabin pressurizing, and thermal de-icing (FSC 1660); Valves specifically designed for use with Aircraft Engines (FSC 2840); Guided Missiles and Guided Missile Engines (FSC 1338), Landing Gear (FSC 1620), Wheel and Brake System Components (FSC 1630); Oxygen Breathing System Components (FSC 1660); In-flight Refueling System Hydraulic components (FSC 1680); Specifically designed hydraulic power steering system components (FSC 1620). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1660 FSC 0 Aircraft Air Conditioning, Heating, and Pressurizing Equipment Aircraft Air Conditioning, Heating, and Pressurizing Equipment Note-This class includes components specifically designed for use in aircraft air conditioning, heating, and pressurizing equipment. Also included are specially designed components of oxygen breathing systems used in aircraft. Includes Cabin Supercharging Equipment; Canisters; Cylinder Assemblies; Masks; Fixed Oxygen System; Specially Designed Aircraft Valves; Cabin Pressure Regulators; Heat Exchangers; Air Expansion Turbines; Aircraft Heaters; Ventilating System Components; Air Conditioning and Heating Duct Assemblies; Thermal De-icing Equipment; Cabin and Compartment Pressurizing Equipment; Air Diffusers; Cabin Pressure Selectors; Liquid Oxygen Converters. Excludes Oxygen Pressure Signals and Warning Devices; Tubing; Ground Type Heaters and Coolers; Pressurizing Equipment other than that used for Cabin and Compartment Pressurization; Fluid De-icing Equipment; Valves specifically designed for use with Aircraft Engines, Guided Missiles, and Guided Missile Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1670 FSC 0 Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment Note-Includes specifically designed items, sets, and systems for air-to-air, air-to-surface, and surface-to-air delivery, pick up, and recovery operations, unless parts, attachments, assemblies, for use in or on such systems (i.e., space vehicle aerial recovery systems) are specifically indexed to other classes of the FSC (i.e., Transmitting Radio Buoys and Direction Finding Subsystem Components). Excludes Fitting Assemblies built into the aircraft structure. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1680 FSC 0 Miscellaneous Aircraft Accessories and Components Miscellaneous Aircraft Accessories and Components Includes Control Assemblies, Push-Pull; Brace, Positioning Cargo Ramp stowed on board; Cockpit Mounted Control Quadrants; Actuators, Electro-Mechanical and Mechanical; Ventilators; Relief Tubes; Map Holders; Aerial Glider Towing Accessories attached to Aircraft; Belts, Safety and Lap; Harness, Shoulder and Safety; Litter Attaching Supports;Electric Windshield Wipers;Aircraft Onboard Inert Gas Generators;Aircraft Furniture;Aircraft Mounted Winches and Hoists;In-Flight Refueling System Components, including Fuel Components;Aircraft Curtains;Cable Tension Regulators;Sun Visors;Rear-View Mirrors;Mechanical Transmissions, Gearboxes and Constant Speed drives Specially designed for aircraft. Excludes Engine Mounted Control Assemblies; Fitted Covers, Aircraft Pylons; Helicopter Roter Brake System Components; Helicopter Automatic Stabilization Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1710 FSC 0 Aircraft Landing Equipment. Aircraft Landing Equipment. Includes Aircraft Arresting Barriers. Excludes Airport Runway Marker Lights (FSC 6220). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1720 FSC 0 Aircraft Launching Equipment Aircraft Launching Equipment Includes Catapults. Excludes Guided Missile Launchers (FSC 1440) and Space Vehicle Launchers (FSC 1840). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1730 FSC 0 Aircraft Ground Servicing Equipment Aircraft Ground Servicing Equipment Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, 2540, 2590. Includes Energizers; Engine Preheaters; Mooring Assemblies; Wheel Chocks; Beaching Equipment; Aileron, Elevator, and Rudder Locks; Passenger Loading Ramps; Maintenance Platforms; Aircraft Maintenance and Boarding Ladders; Aircraft Maintenance Slings and Hoists; Aircraft Fin Tilting Jacks; Airfield Specialized Lift Trucks and Trailers; Fitted Covers for Airframe Components; Aircraft Engine Covers. Excludes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies (FSC 1740); Maintenance Stands designed for support of aircraft assemblies during repair or overhaul (FSC 4920); Test Stands (FSC 4920); General Purpose Jacks (FSC 5120); Slings (FSC 3940), and Hoists (FSC 3950); Trailers (FSC 2330), Liquid Oxygen, Aircraft Servicing (FSC 1660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1740 FSC 0 Airfield Specialized Trucks and Trailers Airfield Specialized Trucks and Trailers Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, and 2590. Includes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies; Trailers: Afterburner, Engine, Propeller, Fuselage, and Wing; Trucks, Aircraft Fuselage and Aircraft Wing; Skids, Engine Transport; Stands, Engine Transport; Bomb Trailers, Airfield; Trucks, Crashed Aircraft Removing. Excludes Airfield Specialized Lift Trucks (FSC 3930), and Trailers (FSC 2330); Highway Type Trucks (FSC 2320), and Trailers (FSC 2330); Cargo Loading and Unloading Trailers (FSC 2330) and Trucks (FSC 2320). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1810 FSC 0 Space Vehicles Space Vehicles Note-This class includes only complete space vehicles, whether in assembled or unassembled form. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1820 FSC 0 Space Vehicle Components Space Vehicle Components Includes Structural Components; Components and Accessories specially designed for installation in or on Space Vehicles; Internal (Built-in) Control Systems. Excludes Remote Guidance Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1830 FSC 0 Space Vehicle Remote Control Systems Space Vehicle Remote Control Systems Includes Specifically designed Components of Space Vehicle Remote Control Systems. Excludes Internal (Built-in) Control Systems; Components designed for use with both Guided Missile and Space Vehicle Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1840 FSC 0 Space Vehicle Launchers Space Vehicle Launchers Includes Launchers specifically designed for Space Vehicles. Excludes Launchers used with both Guided Missiles and Space Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1850 FSC 0 Space Vehicle Handling and Servicing Equipment Space Vehicle Handling and Servicing Equipment Note-This class does not include space vehicle aerial recovery system which are classified in Class 1670. Includes Specially designed Trucks and Trailers for use in transporting Space Vehicles; Specially designed Slings, Hoists, Jacks, and Blowers, Self-propelled Vehicles, specially designed for space vehicle handling or servicing; Covers, space vehicle Excludes Equipment used in handling or servicing both Guided Missile and Space Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1860 FSC 0 Space Survival Equipment Space Survival Equipment Includes Food and Water Production Equipment; Air Production Equipment; Shelter Equipment; Power Generation and Conversion Equipment. Excludes Items which are integral components of Space Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1905 FSC 0 Combat Ships and Landing Vessels Combat Ships and Landing Vessels Includes Aircraft Carriers; Battleships; Cruisers; Destroyers; Submarines; Frigates and Corvettes; Gunboats; Motor Torpedo Boats; Subchasers; Landing Barges; Minelaying and Mine Sweeping Craft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1910 FSC 0 Transport Vessels, Passenger and Troop Transport Vessels, Passenger and Troop admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1915 FSC 0 Cargo and Tanker Vessels Cargo and Tanker Vessels admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1920 FSC 0 Fishing Vessels Fishing Vessels admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1925 FSC 0 Special Service Vessels Special Service Vessels Includes Tugs; Towboats; Fire Boats; Ice Breakers; Repair Ships; Tender Vessels (Buoy, Lighthouse, Destroyer); Lightships; Cable Ships; Salvage and Submarine Rescue Vessels. Excludes Combat Vessels; Dredges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1930 FSC 0 Barges and Lighters, Cargo Barges and Lighters, Cargo Includes Aircraft Lighters, Car Floats, and other Transportation Barges, Depot Barges; Scows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1935 FSC 0 Barges and Lighters, Special Purpose Barges and Lighters, Special Purpose Includes Derrick, Piledriver, and Rock Cutter Barges; Barrage Balloon, Catapult Lighter, and Torpedo Testing Barges; Concrete Mixing Plant, Mechanical Bank Grader, and other Bank Revetment Barges; Fire, Smudge Removal, and other Pump Barges; Houseboats, except Yacht Type; Power Plant Barges; Refrigeration Barges; Barge Mounted Cranes, Flexible Towed Barges. Excludes Combat Landing Barges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1940 FSC 0 Small Craft Small Craft Includes Powered and Unpowered Small Craft; Lifesaving Boats; Airplane Crash Boats; Reconnaissance Boats; Yachts; Pneumatic Boats. Excludes Fishing Craft; Life Rafts, including Pneumatic; Bridge Floats and Pontoons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1945 FSC 0 Pontoons and Floating Docks Pontoons and Floating Docks Includes Camels; Pontoon Stanchions; Pontoon Ramps. Excludes Floating Drydocks; Bridge Floats and Pontoons; Pontoon Hardware (Jewelry). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1950 FSC 0 Floating Drydocks Floating Drydocks admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1955 FSC 0 Dredges Dredges Includes Dredges, without Hull; Ocean-Going Dredges; Floating Dredges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 1990 FSC 0 Miscellaneous Vessels Miscellaneous Vessels Includes Commercial Sailing Vessels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2010 FSC 0 Ship and Boat Propulsion Components Ship and Boat Propulsion Components Includes Propulsion Shafts; Ship Proppellers. Marine Transmissions, Reverse and Reduction Gear Type. Excludes Engines (FSC 2810, 2815); Turbines (FSC 2825, 2835, 2840). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2020 FSC 0 Rigging and Rigging Gear Rigging and Rigging Gear Includes Masts; Kingposts; Sail Booms; Shipborne Booms not attached to Cranes and Derricks. Excludes Tackle Blocks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2030 FSC 0 Deck Machinery Deck Machinery Includes Steering Gears and Controls; Boat Davits. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2040 FSC 0 Marine Hardware and Hull Items Marine Hardware and Hull Items Includes Anchors; Grapnels; Sea Anchors; Watertight Doors; Ship Ventilators; Hatches; Manholes; Scuttles; Air Ports; Fenders; Sea Chests; Scuppers; Rudders; Stern Tubes; Chain Pipes; Hawse Pipes; Boiler Uptakes and Stacks; Chocks; Mast and Boom Fittings; Oars; Paddles; Oarlocks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2050 FSC 0 Buoys Buoys admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2060 FSC 0 Commercial Fishing Equipment Commercial Fishing Equipment Excludes Fishing Vessels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2090 FSC 0 Miscellaneous Ship and Marine Equipment Miscellaneous Ship and Marine Equipment Includes Sails; Chain Ladders; Rope Ladders; Marine Furniture. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2210 FSC 0 Locomotives Locomotives Note-This class includes only complete locomotives and tenders. End items, assemblies, parts, attachments, or accessories for use in or on locomotives and tenders are classified in classes other than this class. Excludes Self-Propelled Cars. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2220 FSC 0 Rail Cars Rail Cars Note-This class includes only complete rail cars. End items, assemblies, parts, attachments, or accessories for use in or on rail cars are classified in classes other than this class. Includes Trailed Cars; Self-Propelled Cars. Excludes Aerial Tramway Cars. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2230 FSC 0 Right-of-Way Construction and Maintenance Equipment, Railroad Right-of-Way Construction and Maintenance Equipment, Railroad Includes Rail Laying, Joining and Shifting Equipment; Self-propelled and Car Mounted Cranes. Excludes Hand Tools (FSG 51). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2240 FSC 0 Locomotive and Rail Car Accessories and Components Locomotive and Rail Car Accessories and Components Includes Brake Beams and Components; Couplers; Trucks and Components; Journals and Components; Wheel Sets and Components. Excludes Railroad Furniture (FSG 71). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2250 FSC 0 Track Material, Railroad Track Material, Railroad Includes Railroad Rails; Railroad Tie Plates; Railroad Turnouts and Components; Railroad Spikes. Excludes Ballast (FSC 5610); Railroad Ties (FSC 5510). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2305 FSC 0 Ground Effect Vehicles Ground Effect Vehicles admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2310 FSC 0 Passenger Motor Vehicles Passenger Motor Vehicles Note-This class includes only complete passenger motor vehicles, and chassic therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on passenger motor vehicles are classified in classes other than this class. Includes Cars, Motor, Highway; Busses; Chassis, Passenger Motor Vehicle; Hearses; Ambulances. Excludes Amphibious Personnel Carriers; All Truck Chassis. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2320 FSC 0 Trucks and Truck Tractors, Wheeled Trucks and Truck Tractors, Wheeled Note-This class includes only complete wheel mounted trucks and truck tractors, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories other than complete chassis, for use in or on such trucks or truck tractors are classified in classes other than this class. The combined chassis and body of a special purpose truck, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped truck mounted machine shop, is excluded from this class. Includes Panel, Delivery and Pick Up Trucks, Tactical and Administrative Military Cargo Carrying Vehicles, including Wheel Mounted Amphibian Vehicles; Truck Tractors and Trailer Combinations; Armored Cars. Excludes Fire Trucks; Special Construction Type Earth and Rock Hauling Trucks; Motorized Air Compressors; Motorized Concrete Mixers; Construction Specialized Machinery Generally; Specially designed trucks for use in and around airfields, hangers, and warehouses; Tracked and Halftracked Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2330 FSC 0 Trailers Trailers Note-This class includes only complete trailers, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on trailers are classified in classes other than this class. The combined chassis and body of a special purpose trailer, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped trailermounted machine shop, is excluded from this class. Includes Semitrailers; Semitrailer Dollies; Cargo Trailers; Passenger and House Trailers; Special Purpose Trailers, such as Ammunition. Excludes Fire Fighting Trailers; Specially designed trailers for use in and around airfields, hangers, and warehouses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2340 FSC 0 Motorcycles, Motor Scooters, and Bicycles Motorcycles, Motor Scooters, and Bicycles Note-This class includes only complete motorcycles, complete motor scooters, and complete bicycles. End items, assemblies, parts, attachments, or accessories for use in or on motorcycles, motor scooters, or bicycles are classified in classes other than this class. Includes Sidecars; Tricycles. Excludes Children's Wheeled Goods. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2350 FSC 0 Combat, Assault, and Tactical Vehicles, Tracked Combat, Assault, and Tactical Vehicles, Tracked Note-This class includes only complete combat, assault, and tactical tracked vehicles, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on such vehicles are classified in classes other than this class. Includes Tanks and Tracked Self-Propelled Weapons and Vehicles with or without amphibian capabilities; Armored Halftracks; Self-Propelled Sleds; and Self-Propelled Flame Throwers. Excludes Wheel Mounted Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2410 FSC 0 Tractor, Full Tracked, Low Speed Tractor, Full Tracked, Low Speed Note-This class includes only complete low speed, full track tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on low speed, full track tractors, are classified in classes other than this class. Excludes High Speed Tractors (FSC 2430); Armored Dozer-Scrapper Combination Tractors (FSC 2350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2420 FSC 0 Tractors, Wheeled Tractors, Wheeled Note-This class includes only complete wheeled tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on wheeled tractors, are classified in classes other than this class. Includes Agricultural Tractors; High Speed Tractors; Industrial Tractors. Excludes Aircraft Towing Tractors and Crashed Aircraft Moving Tractors (FSC 1740); Aircraft Towing-Power Servicing Tractors (FSC 1730); Warehouse Tractors (FSC 3930). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2430 FSC 0 Tractors, Full Tracked, High Speed Tractors, Full Tracked, High Speed Note-This class includes only complete high speed track laying tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on high speed track laying tractors, are classified in classes other than this class. Excludes Low Speed Tractor (FSC 2410); Armored Dozer-Scraper Combination Tractors (FSC 2350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2510 FSC 0 Vehicular Cab, Body, and Frame Structural Components Vehicular Cab, Body, and Frame Structural Components Includes Leaf Type Vehicular Springs; Suspension Type Shock Absorbers. Excludes Vehicular Hardware (FSG 53); Specialized Vehicular Furniture (FSC 2540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2520 FSC 0 Vehicular Power Transmission Components Vehicular Power Transmission Components Includes Transfer Transmission Assemblies; Clutch Assemblies; Universal Joints; Propeller Shafts; Automotive Torque Converters; Power Takeoffs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2530 FSC 0 Vehicular Brake, Steering, Axle, Wheel, and Track Components. Vehicular Brake, Steering, Axle, Wheel, and Track Components. Includes Turrent Brakes; Clutch Brakes, Tank Turret. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2540 FSC 0 Vehicular Furniture and Accessories Vehicular Furniture and Accessories Includes Automobile Seat Covers; Shock Absorbers; Bumpers; Windshield Wipers; Bumper Guards; Mirrors, Rear View and Side View; Vehicle Heaters. Excludes Speedometers (FSC 6680); Suspension Type Shock Absorbers (FSC 2510). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2541 FSC 0 Weapons Systems Specific Vehicular Accessories Weapons Systems Specific Vehicular Accessories Includes: Accessory Kits and Boxes, Parts Kits, and individual components used in the repair and/or modification of Weapons System type Vehicles such as Tanks, Personnel Carriers, Mobile Howitzers, and the like. Excludes: Items used in the repair and/or modifications of Commercial Type Vehicles (FSC 2540), vehicular type light fixtures (FSC 6220), and electronic switches, parts kits, and modification kits (FSG 59). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2590 FSC 0 Miscellaneous Vehicular Components Miscellaneous Vehicular Components Includes Attachments for Tanks, Self-propelled Weapons, and High Speed Tractors; A-frames and Winches specifically designed for truck mounting; Cranes and Crane Booms for Wrecker Trucks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2610 FSC 0 Tires and Tubes, Pneumatic, Except Aircraft Tires and Tubes, Pneumatic, Except Aircraft Excludes Aircraft Pneumatic Tires and Tubes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2620 FSC 0 Tires and Tubes, Pneumatic, Aircraft Tires and Tubes, Pneumatic, Aircraft admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2630 FSC 0 Tires, Solid and Cushion Tires, Solid and Cushion Includes Rubber Track Laying Treads. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2640 FSC 0 Tire Rebuilding and Tire and Tube Repair Materials Tire Rebuilding and Tire and Tube Repair Materials Includes Tread Gum; Cold Patches; Friction Cord Fabric; Vulcanizing Patches; Padding Stock; Quick-Cure Gum; Tire and Tube Repair Kits; Camelback; Valves; Valve Cores. Excludes Vulcanizing Machinery and Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2805 FSC 0 Gasoline Reciprocating Engines, Except Aircraft; and Components Gasoline Reciprocating Engines, Except Aircraft; and Components Includes Gas Reciprocating Engines; All Gasoline Reciprocating Engines except Aircraft Prime Moving. Excludes Engine Accessories (FSC 2990). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2810 FSC 0 Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components Note Engines and components classified in this FSC must be desinged specifically for use as/on an aircraft prime mover. Auxiliary engines and their components will be classified in the appropriate FSC elsewhere in FSG 28. Includes Complete Engine Assemblies; Piston Rings; Cylinders; Pistons; Camshafts; Crankshafts. Excludes Fuel System Components (Carburetors; Carburetor Floats; Fuel Pumps; Fuel Controls; Fuel Valves) (FSC 2915); Electrical System Components (Spark Plug Adapters; Ignition Distributors; Ignition Coils, Electrical Starters) (FSC 2925); Engine Cooling System Components (Engine Oil Coolers; Cooling Radiators) (FSC 2935); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2945); Miscellaneous Engine Accessories (Pneumatic Starters, Cowling Mounts, Control Assemblies) (FSC 2995). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2815 FSC 0 Diesel Engines and Components Diesel Engines and Components Includes Automotive, Industrial, Marine, Locomotive, and all other types of Diesel and Semi-Diesel Engines. Excludes Engines Accessories (FSC 2990). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2820 FSC 0 Steam Engines, Reciprocating; and Components Steam Engines, Reciprocating; and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2825 FSC 0 Steam Turbines and Components Steam Turbines and Components Includes Mercury Vapor Turbines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2830 FSC 0 Water Turbines and Water Wheels; and Components Water Turbines and Water Wheels; and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2835 FSC 0 Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components Note Engines and Components classified in this FSC are primarily for use on non-aircraft prime mover (e.g., Naval ship applications), aircraft non-prime mover (e.g., airframe mounted auxiliary power units), and for aircraft ground support equipment (e.g., start carts). Includes Airflow Deflectors; Combustion Chambers, Compressors, Turbines, Accessory Gear Boxes and their Components. Excludes Components for Gas Turbines and Jet Engines, Aircraft Prime Mover (FSC 2840); Engine Fuel Systems (FSC 2910); Engine Electrical Systems (FSC 2920); Engine Cooling Systems (FSC 2930); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2940); Engine Accessories (Air Duct Heaters, Engine Mounted Control Assemblies) (FSC 2990). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2840 FSC 0 Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components Note Engines and Components classified in this FSC are intended for use as/on aircraft and/or guided missile prime movers. Includes Compressor and Turbine Rotors; Blades; Combustion Chamber; Accessory Gear Box; Afterburner; Exhaust Cone; Reservoirs, Hydraulic; Tank, Oil. Excludes Oil, Air, Anti-icing, and Hydraulic Regulators, Valves, and Pumps specially designed for Gas Turbines and Jet Engines (FSC 2995); Control Assemblies, Push-Pull (FSC 2995); Engine Mounted Control Assemblies (FSC 2995); Fuel System Components (FSC 2915); Engine Electrical System Components (FSC 2925); Engine Cooling System Components (FSC 2935); Engine Air/Oil Cleaner/Filter/Strainers (FSC 2945). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2845 FSC 0 Rocket Engines and Components Rocket Engines and Components Includes Rocket Prime Movers, Liquid Type, including Liquid Jet Assisted Take Off (JATO) Units, for use in aircraft, rockets, and guided missiles; Liquid Propellants encased in consumable containers, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors - Solid Propellant Units (FSC 1337); Liquid Propellants predetermined to specific quantity and quality, but packaged in reusable containers; Solid Propellant Squibs and Cartridges, whether intended for insertion into Liquid Propellent Systems or not (FSC 1337). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2850 FSC 0 Gasoline Rotary Engines and Components Gasoline Rotary Engines and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2895 FSC 0 Miscellaneous Engines and Components Miscellaneous Engines and Components Includes Wind and Compressed Air Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2910 FSC 0 Engine Fuel System Components, Nonaircraft Engine Fuel System Components, Nonaircraft Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Tanks; Components for all engines except Aircraft and Guided Missile Prime Moving. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2915 FSC 0 Engine Fuel System Components, Aircraft and Missile Prime Movers Engine Fuel System Components, Aircraft and Missile Prime Movers Note Fuel components specially designed for propulsion fuel systems, aircraft and missiles are to be placed in this FSC. Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Controls, Jet Engine; Fuel Primers; Water Injection Controls and Valves; Fuel Valves Fuel Flow Regulators; Components of Smoke Abatement Systems. Excludes Aircraft Fuel Tanks (FSC 1560); In-flight Refueling System Fuel Components (FSC 1680). Fuel System Components not specifically designed for use with Aircraft Engines or Missile Prime-movers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2920 FSC 0 Engine Electrical System Components, Nonaircraft Engine Electrical System Components, Nonaircraft Includes Generators; Magnetos; Spark Plugs; Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines. Excludes Vehicular Lighting Fixtures (FSC 6220) and Aircraft Generators (FSC 2925). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2925 FSC 0 Engine Electrical System Components, Aircraft Prime Moving Engine Electrical System Components, Aircraft Prime Moving Note Items designed for specific use on aircraft and guided missile prime movers are to be placed in this FSC. Includes Magnetos; Igniters (Spark Plugs); Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines; Engine Accessory Generators. Excludes Aircraft Lighting Fixtures (FSC 6220); Auxiliary Aircraft Generators (FSC 6115). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2930 FSC 0 Engine Cooling System Components, Nonaircraft Engine Cooling System Components, Nonaircraft Includes Cooling Fans; Radiators; Water Pumps; Water Hose Assemblies; Engine Coolant Filters; Components for all Engines except Aircraft and Guided Missile Prime Moving. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2935 FSC 0 Engine System Cooling Components, Aircraft Prime Moving Engine System Cooling Components, Aircraft Prime Moving Note This class includes only cooling system components for aircraft and/or guided missile prime movers only. Includes Radiators; Cooling System Pumps; Water Hose Assemblies; Lubricating Oil Coolers and Control Valves; Oil Temperature Regulators. Excludes Cooling System Components not specifically designed for use with Aircraft Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2940 FSC 0 Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft Includes Components for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Air and Oil Filters (FSC 4310, 4330), Strainers (FSC 4730) and Cleaners (FSC 4310) not specifically designed for use with engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2945 FSC 0 Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving Note Items placed in this FSC should be specifically designed for use on aircraft or guided missile prime movers only. Includes Air Filters; Oil Filters; Strainers; Cleaners. Excludes Fuel Filters (FSC 2915); Items designed for other than Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2950 FSC 0 Turbosupercharger and components Turbosupercharger and components Note All turbosuperchargers and their components not elsewhere classifiable will be classified in this FSC. Includes Turbosupercharged Regulators; Engine Turbosuperchargers. Excludes Engine Integrated Superchargers (FSG 28). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2990 FSC 0 Miscellaneous Engine Accessories, Nonaircraft Miscellaneous Engine Accessories, Nonaircraft Includes Engine Dynafocal Suspension Mounts; Engine Driven Superchargers (not integrated with engine); Starter Cranks; Engine Starter Ropes; Exhaust Mufflers; Hand Inertia Starters; Air Duck Heaters; Engine Governors; Intake Mufflers; Combustion Type Starters; Miscellaneous Accessories for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Electrical Starters Non-Aircraft (FSC 2920); Aircraft (FSC 2925). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 2995 FSC 0 Miscellaneous Engine Accessories, Aircraft Miscellaneous Engine Accessories, Aircraft Note Items classified in this class must be specifically designed for use with aircraft or quided missile primemovers only. Includes Engine Dynafocal Suspension Mounts; Engine Cowling Mounts; Engine Mounted Control Assemblies; Pneumatic Starters; Push-Pull Control Assemblies;Specially designed Jet Engine Air, Oil, Anti-icing and Hydraulic Regulators; Valves and Pumps; Starting Units. Excludes Exhaust System; (FSC 1560); Jet Engine Hydraulic Reservoirs (FSC 2840); Jet Engine Oil Tanks (FSC 2840); Electrical Starters (FSC 2925); Cockpit Mounted Control Quadrants (FSC 1680); Aircraft Engine Covers (FSC 1730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3010 FSC 0 Torque Converters and Speed Changers Torque Converters and Speed Changers Includes Fluid Couplings; Nonvehicular Clutches and Couplings; Horizontal Right Angle Drive Gear Units. Excludes Automotive Torque Converters (FSC 2520); Vehicular Power Transmission Components (FSC 2520); Rotary Aircraft Transmission Gear Units (FSC 1615). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3020 FSC 0 Gears, Pulleys, Sprockets, and Transmission Chain Gears, Pulleys, Sprockets, and Transmission Chain Includes Power Transmission Chain; Matched Gear Sets. Excludes Reduction Gears (FSC 3010). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3030 FSC 0 Belting, Drive Belts, Fan Belts, and Accessories Belting, Drive Belts, Fan Belts, and Accessories Includes Belt Lacings; Belt Pins. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3040 FSC 0 Miscellaneous Power Transmission Equipment Miscellaneous Power Transmission Equipment Includes Shafts and Shafting; Collars; Gearshafts; Ball Joints; Actuating Cylinders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3110 FSC 0 Bearings, Antifriction, Unmounted Bearings, Antifriction, Unmounted Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Ball Bearings; Roller Bearings; Balls; Races. Excludes Plain Bearings (FSC 3120); Jewel Bearings (FSC 3120) admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3120 FSC 0 Bearings, Plain, Unmounted Bearings, Plain, Unmounted Note Bearings in this class are generally one piece that retain and position moving and/or rotating parts. They may have lubrication grooves/fittings/facilities or include pre-lubrication. Includes Sleeve Bearings; Split Bearings; Washer Type Bearings; Jewel Bearings. Excludes Antifriction Bearings (FSC 3110); Mounted Bearings (FSC 3130). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3130 FSC 0 Bearings, Mounted Bearings, Mounted Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Pillow Block Units; Cartridge Units; Flange Units; Takeup Units; Hanger Box Units; Flat Box Units; Step Box Units. Excludes Antifriction Bearings (FSC 3110); Plain Unmounted Bearings (FSC 3120). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3210 FSC 0 Sawmill and Planing Mill Machinery Sawmill and Planing Mill Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3220 FSC 0 Woodworking Machines Woodworking Machines Includes Mortisers; Tenoners; Veneer Lathes. Excludes Hand Held Power Driven Tools; Hand Held Tools Operated by Flexible Shaft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3230 FSC 0 Tools and Attachments for Woodworking Machinery Tools and Attachments for Woodworking Machinery Includes Circular and Band Saw Blades; Cutter Heads; Jointer and Notcher Heads; Cutters. Excludes Head Turning Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3405 FSC 0 Saws and Filing Machines Saws and Filing Machines Includes Cutoff Machines; Saw Blade Dressing Machines; Retoothing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3408 FSC 0 Machining Centers and Way-Type Machines Machining Centers and Way-Type Machines Note-The following definitions apply to "Machining Centers" and "Way-type Machines". a. "Machining Center", refers to a multipurpose numerically controlled machine tool for the complete and automatic machining of parts requiring multiple operations such as milling, drilling, tapping, boring, and reaming, having an integral tool storage device and an integral means for positioning various faces of the work piece. It must have facilities for automatic interchanging of varied cutting tools between successive operations. Excluded from this class are multipurpose numerically controlled machine tools, such as Boring-Drilling-Milling Machines, which require the use of an attachment or accessory for tool storage and/or to position the various faces of a work piece. These types of equipment are classified in other appropriate classes within group 34. b. "Way-type Machine", refers to a special machine tool of station type design consisting of individually mounted self-contained machining units and facilities for indexing the work piece to each station in a predetermined sequence. The machining unit(s) may be disassembled and rearranged to accommodate different work piece configurations. Machine is capable of performing single or multiple operations on the work piece simultaneously or in sequence to each station. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3410 FSC 0 Electrical and Ultrasonic Erosion Machines Electrical and Ultrasonic Erosion Machines Includes Electrical Discharge Machines; Electrolytic Grinding Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3411 FSC 0 Boring Machines Boring Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3412 FSC 0 Broaching Machines Broaching Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3413 FSC 0 Drilling and Tapping Machines Drilling and Tapping Machines Includes Multiple Spindle Drilling-Tapping Machines. Excludes Way-Type Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3414 FSC 0 Gear Cutting and Finishing Machines. Gear Cutting and Finishing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3415 FSC 0 Grinding Machines Grinding Machines Excludes Electrolytic Grinding Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3416 FSC 0 Lathes Lathes Includes Screw Machines Excludes Speed Lathes; Metal Spinning Lathes; Cartridge Case and Shell Lathes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3417 FSC 0 Milling Machines Milling Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3418 FSC 0 Planers and Shapers Planers and Shapers Includes Combination Shaper-Planers. Excludes Gear Shapers; Planer Type Milling Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3419 FSC 0 Miscellaneous Machine Tools Miscellaneous Machine Tools Includes Gun Rifling Machines; Speed Lathes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3422 FSC 0 Rolling Mills and Drawing Machines Rolling Mills and Drawing Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3424 FSC 0 Metal Heat Treating and Non-Thermal Treating Equipment Metal Heat Treating and Non-Thermal Treating Equipment Includes Hardening, Annealing, Tempering, Normalizing, Cyaniding, and Carburizing Equipment; Furnaces, Flue Welding, Non-Thermal Stress Relieving Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3426 FSC 0 Metal Finishing Equipment Metal Finishing Equipment Includes Galvanizing, Tinning, Oiling, Pickling; Electroplating, and Anodizing Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3431 FSC 0 Electric Arc Welding Equipment Electric Arc Welding Equipment Includes Gas Shielded Arc Welding Machines; Arc Bonding Machines; Semi-Automatic and Automatic Arc Welding Machines. Excludes Welding Supplies, and Associated Equipment such as: Flux Recovery Mchines; Flux Dispensers; Tacker Panels; Welding Panels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3432 FSC 0 Electric Resistance Welding Equipment Electric Resistance Welding Equipment Includes Electric Resistance Brazing Machines; Band Saw Brazers; Stored Energy Resistance Welding Machines. Excludes Electric Induction Brazing and Soldering Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3433 FSC 0 Gas Welding, Heat Cutting, and Metalizing Equipment Gas Welding, Heat Cutting, and Metalizing Equipment Includes Metal Spray Guns; Arc Cutting Machines; Torches and Tips; Gas Brazing Machines; Flame Cutting Machines; Vacuum Metalizers; Spark Discharge Metalizers. Excludes Welding Supplies; Disintegrating Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3436 FSC 0 Welding Positioners and Manipulators Welding Positioners and Manipulators Includes Welding Tables. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3438 FSC 0 Miscellaneous Welding Equipment Miscellaneous Welding Equipment Includes Thermite Welding Equipment; Flux Recovery Machines; Flux Dispensers; Arc Converters; Welding Panels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3439 FSC 0 Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories Includes Soldering Irons; Welding Electrodes and Rods; Brazing Fluxes; Soldering Fluxes; Solder. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3441 FSC 0 Bending and Forming Machines Bending and Forming Machines Excludes Wire and Metal Ribbon Forming Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3442 FSC 0 Hydraulic and Pneumatic Presses, Power Driven Hydraulic and Pneumatic Presses, Power Driven Includes Metal Powder Compacting Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3443 FSC 0 Mechanical Presses, Power Driven Mechanical Presses, Power Driven Includes Metal Powder Compacting Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3444 FSC 0 Manual Presses Manual Presses Includes Arbor, Straightening, Forcing, and Assembly Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3445 FSC 0 Punching and Shearing Machines Punching and Shearing Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3446 FSC 0 Forging Machinery and Hammers Forging Machinery and Hammers Excludes Forging Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3447 FSC 0 Wire and Metal Ribbon Forming Machines Wire and Metal Ribbon Forming Machines Excludes Roll Forming Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3448 FSC 0 Riveting Machines Riveting Machines Excludes Power Driven Hand Riveting Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3449 FSC 0 Miscellaneous Secondary Metal Forming and Cutting Machines Miscellaneous Secondary Metal Forming and Cutting Machines Includes Metal Spinning Lathes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3450 FSC 0 Machine Tools, Portable Machine Tools, Portable Includes Portable Abrasive Cutting Machines; Portable Drilling Machines; Portable Slotters and Shapers. Excludes Stationary Type Machine Tools mounted on portable devices such as wheel or leg type stands. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3455 FSC 0 Cutting Tools for Machine Tools Cutting Tools for Machine Tools Includes Broaches; Files; Milling Cutters; Reamers; Saws. Excludes Flame Cutting Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3456 FSC 0 Cutting and Forming Tools for Secondary Metalworking Machinery Cutting and Forming Tools for Secondary Metalworking Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3460 FSC 0 Machine Tool accessories Machine Tool accessories Excludes Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3461 FSC 0 Accessories for Secondary Metalworking Machinery Accessories for Secondary Metalworking Machinery Excludes Parts Feeders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3465 FSC 0 Production Jigs, Fixtures, and Templates Production Jigs, Fixtures, and Templates Note-This class includes jigs, fixtures, and templates used in conjection with the metalworking machinery classified in Group 34. Jigs, fixtures, and templates used in conjunction with maintenance and repair shop specialized equipment are classified in Group 49. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3470 FSC 0 Machine Shop Sets, Kits, and Outfits Machine Shop Sets, Kits, and Outfits admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3510 FSC 0 Laundry and Dry Cleaning Equipment Laundry and Dry Cleaning Equipment Includes Washing Machines; Extractors; Wringers; Drying Tumblers; Ironers; Presses; Starching Machines; Marking Equipment; Mobile Laundry and Dry Cleaning Units. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3520 FSC 0 Shoe Repairing Equipment Shoe Repairing Equipment Includes Shoe Sewing Machines; Mobile Shoe Repair Shops. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3530 FSC 0 Industrial Sewing Machines and Mobile Textile Repair Shops Industrial Sewing Machines and Mobile Textile Repair Shops Excludes Shoe Sewing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3540 FSC 0 Wrapping and Packaging Machinery Wrapping and Packaging Machinery Includes Filling Machines; Container Capping Machines; Label Applying Machines; Package Sealing Machines; Paperboard Box, Case and Tray Making Machines; Strapping Machines; Stapling Machines, except Office Type. Excludes Paperboard Manufacturing Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3550 FSC 0 Vending and Coin Operated Machines Vending and Coin Operated Machines Includes Fare Recording Devices; Parking Meters; Turnstiles; Coin Operated Phonographs. Excludes Coin and Currency Handling Machines; Coin Operated Scales. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3590 FSC 0 Miscellaneous Service and Trade Equipment Miscellaneous Service and Trade Equipment Includes Manicure Tables. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3605 FSC 0 Food Products Machinery and Equipment Food Products Machinery and Equipment Includes Industrial Food Products Equipment. Excludes Kitchen and Galley Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3610 FSC 0 Printing, Duplicating, and Bookbinding Equipment Printing, Duplicating, and Bookbinding Equipment Includes Offset Presses; Typesetting Machinery; Bookbinding Machinery; Photoengraving Machinery; Printing Type; Rules; Leads; Slugs; Line Gages; Quoins; Plate Hooks; Gelatine Process Machines; Spirit Process Machines; Stencil Process Machines; Offset Process Machines; Photostat Machines; Blueprint Printing and Developing Machines; Print Shop Furniture. Excludes Microfilm Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3611 FSC 0 Industrial Marking Machines Industrial Marking Machines Note-Marking machines which make permanent indentations in metal are classified in Group 34. Excludes Marking Machines, Laundry; Printing Machine, Label; Printing Press, Label; Embossing Machines, Office Type; and Marking Machines, Office Type. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3615 FSC 0 Pulp and Paper Industries Machinery Pulp and Paper Industries Machinery Includes Chippers; Digestors; Beaters; Bleaching Equipment; Paperboard Manufacturing Machinery. Excludes Paperboard Box, Case and Tray Making Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3620 FSC 0 Rubber and Plastics Working Machinery Rubber and Plastics Working Machinery Includes Plasticators; Presses; Synthetic Rubber Working Machinery; Thread Extruding Machinery; Vulcanizing Machinery. Excludes Protective Covering Laminating Presses; Tire Maintenance and Repair Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3625 FSC 0 Textile Industries Machinery Textile Industries Machinery Includes Cotton Ginning Machinery; Looms; Button Covering Machines; Rope Laying Machines; Lace Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3630 FSC 0 Clay and Concrete Products Industries Machinery Clay and Concrete Products Industries Machinery Includes Brickmaking Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3635 FSC 0 Crystal and Glass Industries Machinery Crystal and Glass Industries Machinery Includes Optical Goods Manufacturing Machinery. Excludes Ophthalmic Lens Cutting, Drilling, Edging, and Grinding Machines; Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3640 FSC 0 Tobacco Manufacturing Machinery Tobacco Manufacturing Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3645 FSC 0 Leather Tanning and Leather Working Industries Machinery Leather Tanning and Leather Working Industries Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3650 FSC 0 Chemical and Pharmaceutical Products Manufacturing Machinery Chemical and Pharmaceutical Products Manufacturing Machinery Includes Crushers and Mills for Chemical Materials; Pharmaceutical Briquetting and Tabletting Presses; Chemical Explosive Manufacturing Machinery. Excludes Construction Materials Crushers, Mills and Pulverizers; Plastic Products Manufacturing Machinery; Pharmaceutical Products Wrapping and Packaging Machinery; Laboratory and Shop Type Mills and Mixers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3655 FSC 0 Gas Generating and Dispensing Systems, Fixed or Mobile Gas Generating and Dispensing Systems, Fixed or Mobile Note-Included in this class are gaseous dispensing systems, both mobile and installed. Includes liquefied gaseous storage tanks, mounted on a common base with, or integral to, gas generating equipment included in this class. Also includes those liquefied gaseous storage tanks, either trailer mounted or skid mounted, used to store liquefied gaseous products until needed. Excluded from this class are those storage tanks designed to be used as an integral part of guided missile propellant servicing trailers, rocket power plants or test stations, and aircraft oxygen converters which are classified as specified by the indexes and structure of the FSC. Excludes Meteorological Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3660 FSC 0 Industrial Size Reduction Machinery Industrial Size Reduction Machinery Note-This class includes general use machinery related to two or more manufacturing industries. Excludes Chemical Products and Construction and Mining Type Crushing, Pulverizing, Screening and Mixing Machinery; Maintenance and Repair Shop Type Mixers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3670 FSC 0 Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery Note-This class includes, and is restricted to, equipment specifically designed for manufacturing semiconductor devices (FSC 5961), microcircuits (FSC 5962), and printed circuit boards (FSC 5998). Excludes items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC. Includes Substrate Preparation Equipment; Circuit Pattern Forming Equipment; Interconnecting and Packaging Equipment. Excludes Assembly Machines for Mounting Discrete Components on Printed Wiring Boards. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3680 FSC 0 Foundry Machinery, Related Equipment and Supplies Foundry Machinery, Related Equipment and Supplies Includes Molding Machines; Tumbling Mills, Foundry Dextrine; Core Paste. Excludes Crucible Furnaces; Cupola Furnaces; Foundry Hand Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3685 FSC 0 Specialized Metal Container Manufacturing Machinery and Related Equipment Specialized Metal Container Manufacturing Machinery and Related Equipment Note-This class includes only those machines specifically designed for manufacturing metal containers. Closing machines designed to seam the tops of filled containers will be classified in Class 3540. Includes Drum and Jerrican Manufacturing Machinery; Specially Designed Container Leak Testing Machines; Can Making Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3690 FSC 0 Specialized Ammunition and Ordnance Machinery and Related Equipment Specialized Ammunition and Ordnance Machinery and Related Equipment Includes Ammunition and Explosive Loading (Filling and Assembling) Specialized Machinery; Small Arms Ammunition Manufacturing Machinery; Artillery and Anti-Aircraft Shell Manufacturing Machinery. Excludes Ammunition and Weapons Maintenance and Repair Shop Specialized Equipment; Nonspecialized or Standard Machinery not designed exclusively for manufacturing or assembling ammunition and ordnance equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3693 FSC 0 Industrial Assembly Machines Industrial Assembly Machines Note-This class includes equipment specifically designed to assemble prefabricated components without further design machining of the components. Equipment designed to perform combined machining and assembling operations which result in material removal are classified in classes other than this class. Also excluded are items for which more specific classifications are suitable. Includes Industrial Production Type Power Screwdriving Machines; Circuit Card Assembly Machines. Excludes Specialized Ammunition and Ordnance Assembly Machines; Wrapping and Packaging Machinery; Metalworking Machinery; Hand Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3694 FSC 0 Clean Work Stations, Controlled Environment, and Related Equipment Clean Work Stations, Controlled Environment, and Related Equipment Includes Laminar and Nonlaminar Flow Enclosures; Dust Controlled Facilities; Air Showers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3695 FSC 0 Miscellaneous Special Industry Machinery Miscellaneous Special Industry Machinery Includes Communication Wire Dispenser Fabricating Machinery; Specialized Logging Equipment; Petroleum Refinery Machinery; Shoemaking Machinery; Production Type Impregnating Equipment. Excludes Opthalmic Lens Cutting and Grinding Machinery; Clothing Impregnating Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3710 FSC 0 Soil Preparation Equipment Soil Preparation Equipment Includes Harrows; Plows; Seed Drills; Seeder Attachments; Sprayers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3720 FSC 0 Harvesting Equipment Harvesting Equipment Includes Hayrakers; Mowers. Excludes Mower Attachments (FSC 3750); Sickle Bar Attachments (FSC 3750). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3730 FSC 0 Dairy, Poultry, and Livestock Equipment Dairy, Poultry, and Livestock Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3740 FSC 0 Pest, Disease, and Frost Control Equipment Pest, Disease, and Frost Control Equipment Includes Atomizers; Delousing Outfits; Dusters; Fly Swatters; Flypaper; Fog Generators; Sprayers; Traps. Excludes Self Pressurized Spray Kits (FSC 4940). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3750 FSC 0 Gardening Implements and Tools Gardening Implements and Tools Includes Garden Tractors, Walking Type; Lawn Mowers, Powered and Nonpowered; Hedge Trimers; Lawn Seeders; Fertilizer Spreaders; Gardening Rakes, Forks, Hoes, and Other Gardening Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3770 FSC 0 Saddlery, Harness, Whips, and Related Animal Furnishings Saddlery, Harness, Whips, and Related Animal Furnishings Includes Dog Harnesses; Leads. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3805 FSC 0 Earth Moving and Excavating Equipment Earth Moving and Excavating Equipment Includes Scrapers; Ditchers; Loaders; Graders; Special Construction Type Earth and Rock Hauling Trucks and Trailers; Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability. The Power Section is designed to be coupled with a Work Section to form a functional piece of Construction Equipment. Excludes Standard Tractors (FSG 24); Trailers (FSC 2330); Trucks (FSC 2320). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3810 FSC 0 Cranes and Crane-Shovels Cranes and Crane-Shovels Includes Cranes; Crane-Semitractors; Crane-Shovels; Crane-Tractors. Excludes Barge Mounted Cranes (FSC 1935); Locomotive Cranes (FSC 2230). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3815 FSC 0 Crane and Crane-Shovel Attachments Crane and Crane-Shovel Attachments Includes Backhoes; Buckets; Dippers; Fairleads; Gantries; Grapples; Lifting Magnets; Shovels; Wrecking Balls. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3820 FSC 0 Mining, Rock Drilling, Earth Boring, and Related Equipment Mining, Rock Drilling, Earth Boring, and Related Equipment Includes Augers; Crushers; Crushing, Screening, and Washing Plants and Units; Drilling Machines; Paving Breakers; Rock Drills. Excludes Tampers (FSC 3895). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3825 FSC 0 Road Clearing, Cleaning, and Marking Equipment Road Clearing, Cleaning, and Marking Equipment Includes Pavement Scrubbing Machines; Snow Removal Units; Sweepers; Road Marking Machines; Vacuum Cleaners; Water Distributors; Weed Burners. Excludes Standard Tractors with Road Clearing or Cleaning Attachments (FSC 2410, 2420, 2430); Timber Sawing Equipment (FSC 5130, 5110). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3830 FSC 0 Truck and Tractor Attachments Truck and Tractor Attachments Includes Angledozers; Augers; Backhoes; Bullclams; Bulldozer-Shovels; Cranes; Grubbers; Loaders; Rakes; Rippers; Rollers; Scarifiers; Snow Removal Units; Snowplows; Sweepers; Treedozers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3835 FSC 0 Petroleum Production and Distribution Equipment Petroleum Production and Distribution Equipment Includes Well Heads; Pumping Equipment; Gas Distribution Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3895 FSC 0 Miscellaneous Construction Equipment Miscellaneous Construction Equipment Includes Asphalt Elevators; Asphalt Heaters; Asphalt Kettles; Asphalt Transfer Equipment; Batching Plants; Stabilizing and Compacting Equipment; Concrete Mixers (All Types); Concrete Vibrators; Bituminous and Concrete Pavers; Asphalt Distributors; Sheepfoot Rollers; Rooters; Rippers; Pile Drivers; Bitumen Heaters; Cable Laying, Lashing, Spinning, and Reeling Equipment. Excludes Earth Moving and Excavating Equipment (FSC 3805 & 3810); Pile Driving Attachments for Cranes and Crane-Shovels (FSC 3815); Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability (FSC 3805). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3910 FSC 0 Conveyors Conveyors Includes Pneumatic Tube Systems; Portable, Stationary, Powered, and Nonpowered Conveyors; Conveyor Feeders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3915 FSC 0 Materials Feeders Materials Feeders Note-Materials Handling equipment included in this class is restricted to those materials feeders and parts feeders that serve as a conveying device, and by which the rate of delivery of bulk materials, packages, or objects may be controlled. Items included in this class are synchronized with companion machinery, feeding predetermined amounts, by volume, of specific materials accurately and continuesly from storage bins or hoppers to process or mixing machines, and are interchangable between machines. Excluded from this class are conveyor feeders (i.e., apron, belt, chain, flight, pan, etc., adapted for feeder service) that are classifiable in Class 3910 and/or Class 3895, as appropriate. Includes Dry Materials Feeders; Parts Feeders Excludes Aggregate and Fines Feeders; Conveyor Feeders; Water Purification Dry Chemical Feeders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3920 FSC 0 Material Handling Equipment, Nonself-Propelled Material Handling Equipment, Nonself-Propelled Includes Dolly Trucks; Pushcarts; Handcarts; Wheelbarrows; Hand Trucks; Materials Handling Trailers. Excludes Conveyors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3930 FSC 0 Warehouse Trucks and Tractors, Self-Propelled Warehouse Trucks and Tractors, Self-Propelled Includes Tug Jockeys; Fork Lift Trucks; Platform Trucks; Straddle Trucks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3940 FSC 0 Blocks, Tackle, Rigging, and Slings Blocks, Tackle, Rigging, and Slings Excludes Load Chain; Chain and Metal Rope Fittings; Wire Rope; Hoists; Ship Rigging. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3950 FSC 0 Winches, Hoists, Cranes, and Derricks Winches, Hoists, Cranes, and Derricks Includes Windlasses: Capstans: Ore Bridges: Gypsies: Warehouse Cranes: Wharf Cranes, Mobile or Fixed: Overhead Traveling Cranes. Excludes Crane-Shovels (FSC 3810); Barge Mounted Cranes (FSC 1935); Winches for Integral Mounting on Trucks or Tractors (FSC 3830); Locomotive Cranes (FSC 2230). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3960 FSC 0 Freight Elevators Freight Elevators admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 3990 FSC 0 Miscellaneous Materials Handling Equipment Miscellaneous Materials Handling Equipment Includes Skids; Pallets. Excludes Airfield Engine Transport Skids. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4010 FSC 0 Chain and Wire Rope Chain and Wire Rope Note-Chain and wire rope, with attachments or terminations will be classified in this class when they are for general use. a. Chain is a series of flexible links and/or rings fitted into one another used for supporting, lifting,restraining, dragging, or transmitting power. b. Wire rope is formed from strands of twisted wire. Includes Bead Chain; Weldless Chain; Single Leg Chain Assemblies; Wire Rope; Wire Cord; Single Leg Wire Assemblies. Excludes Power Transmission Chain (FSC 3020); Slings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4020 FSC 0 Fiber Rope, Cordage, and Twine Fiber Rope, Cordage, and Twine Note-Fiber rope is classified in this class when it is bulk material or for general use. Items with attachments and/or terminations are identified in this class unless a more specific item name is used. a. Fiber rope is flexible twisted strands of manila, nylon or other fiber. b. Cordage is ropes or cords used in rigging (see item name definitions for parameters). c. Twine is two or more strands twisted together. Includes Fibrous Cord Assemblies; Fibrous Cord; Fibrous Rope; Fibrous Twine. Excludes Wire Rope (FSC 4010); Slings (FSC 3940). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4030 FSC 0 Fittings for Rope, Cable, and Chain Fittings for Rope, Cable, and Chain Note All items, including specially designed, will be classified in this FSC. Fittings classified in this FSC are items used in conjunction with chain, rope, and are attached to perform certain functions, (e.g., hooks, shackles, and wedges) refer to item name definitions for parameters. Includes Anchor Guys; Wire Stranded Bands; Wire Rope Clamps; Cargo Hooks; Shackles; Swivels; Rope Terminals; Rope Wedges. Excludes Clamp Blocks (FSC 5340); Support Hooks (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4240 FSC 0 Safety and Rescue Equipment Safety and Rescue Equipment Includes Portable Fire Escapes; Safety Nets, Nonbuoyant. Excludes Divers' Suits; Fixed Fire Escapes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4250 FSC 0 Recycling and Reclamation Equipment Recycling and Reclamation Equipment Includes Material and Machinery designed to remove, neutralize and/or prepare for possible re-use of substances otherwise considered to be un-reclaimable. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4310 FSC 0 Compressors and Vacuum Pumps Compressors and Vacuum Pumps Includes Truck Mounted and Trailer Mounted Compressors. Excludes Refrigeration Compressors (FSC 4130). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4320 FSC 0 Power and Hand Pumps Power and Hand Pumps Excludes Laboratory Jet Pumps (FSG 65 and 66). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4110 FSC 0 Refrigeration Equipment Refrigeration Equipment Note-This class includes only complete refrigeration equipment, whether refrigerated from an integral or remote mechanical refrigeration unit or system. Also included in this class are refrigeration plants, and complete "packaged" refrigeration units and systems containing a power driven compressor, condenser, evaporator, and all other necessary components to refrigerate an enclosed space. Nonoperating accessories such as ice trays, shelves, and panels are included in this class. Excluded from this class are operating components, assemblies, parts, attachments, or accessories, for use in or on complete refrigeration equipment, plants, systems, or the "packaged" refrigeration units, and which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Grocery Type Display Cases; Ice Cream Cabinets; Drinking Fountains (except Portable and stationary types classified in Class 4510); Professional and Scientific Refrigerators; Rivet Coolers; Photographic Refrigerators; Mortuary Refrigerators; Household and Commercial Refrigerators; Grocery Type Showcases; and other types of refrigeration equipment of the commissary or food store type. Excludes Cafeteria Type Refrigerated Display Cases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Carbonators; Combination Heated-Refrigerated Food Serving Equipment; Cafeteria Type Showcases; Chilling Equipment Used for Display and Serving of Food (see Class 7310 for these items). Also excluded from this class are refrigeration components (see Class 4130). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4120 FSC 0 Air Conditioning Equipment Air Conditioning Equipment Note-This class includes only complete air conditioning equipment, systems, and plants. Also included are specially designed nonoperating accessories such as a window panel used with a window type air conditioning unit to facilitate mounting. Excluded from this class are operating components, assemblies, parts, attachments, or accessories for use in or on air conditioning equipment, which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Store Type Units; Window and Room Type Units; Marine, and Vehicular Air Conditioning Units; Air Conditioning Plants and Systems. Excludes Air Conditioning Components (FSC 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4130 FSC 0 Refrigeration and Air Conditioning Components Refrigeration and Air Conditioning Components Includes Heat Exchanger Equipment; Refrigerant Strainers; Refrigeration Compressors; Air Conditioning and Refrigeration Servicing Equipment, such as Charging and testing manifolds, Lines and Units; Operating Components of Refrigeration and Air Conditioning Equipment, Plants, and Systems classified in classes 4110 and 4120. Excludes Refrigeration and Air Conditioning Plants (see classes 4110 and 4120): Collections of Refrigeration Components "packaged" as a unit including a refrigeration compressor, condenser, evaporator, etc., specifically designed and tailored for applications such as walk-in type refrigerators. Individual components of the "packaged" unit will be classified in class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. The complete "package" unit will be classified in class 4110. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4140 FSC 0 Fans, Air Circulators, and Blower Equipment Fans, Air Circulators, and Blower Equipment Note-Fans and impellers which are specifically designed for use with specific individual types of equipment are to be classified in the same classes as their next higher assemblies or in the appropriate components or accessories classes (as in Group 25 or 29 or Class 1680) as prescribed by the indexes and structure of the FSC. Includes Wall Type Fans; Pedestal Type Fans; Household Type and Attic Type Exhaust Fans; Floor Fans; Forged Draft Exhaust and Disposal Kits; Fans, Air Circulators, and Blower Equipment, whether designated as "industrial" or "nonindustrial" by application and/or use. Excludes Combination Heater-Fans (FSC 4520). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4150 FSC 0 Vortex Tubes and Other Related Cooling Tubes Vortex Tubes and Other Related Cooling Tubes Includes Tool Grinding spot coolers; machining spot coolers; electronic equipment spot coolers; and electronic cabinet spot coolers. Excludes Refrigeration and Air Conditioning Plants (Classes 4110 and 4120); Air Conditioning Components and Cooler Unit, Air (Class 4130); Cooler, Air, Evaporative (Class 4120) and Pipe and Tube (Group 47). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4210 FSC 0 Fire Fighting Equipment Fire Fighting Equipment Includes Fire Extinguishers; Fire Axes; Fire Rakes; Fire Beaters; Fire Trucks; Fire Hose; Play Pipes; Hose Fittings having one or more Fire Hose End Connections; Fire Hose Reels; Fire Fighting Trailers; Fire Hydrants; Sprinkler Heads. Excludes Wrecking Bars (FSC 5120, 1385). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4220 FSC 0 Marine Lifesaving and Diving Equipment Marine Lifesaving and Diving Equipment Includes Diving and Salvage Apparatus, including Pressurized Divers' Suits; Rescue Nets, Buoyant; Inflatable Life Vests; Life Rafts. Excludes Lifesaving Boats (FSC 1940). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4230 FSC 0 Decontaminating and Impregnating Equipment Decontaminating and Impregnating Equipment Note-Excludes production type equipment designed for impregnation of metal castings and electronic components, processing of leather and textiles, and for similar industrial processing operations. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4235 FSC 0 Hazardous Material Spill Containment and Clean-up Equipment and Material Hazardous Material Spill Containment and Clean-up Equipment and Material Includes Secondary Spill Containment Sumps; Liquid Spill Containment Pallets; Spill Containment Basins; Spill Containment Systems; Absorbent, Sorbent and Blotting Materials. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4330 FSC 0 Centrifugals, Separators, and Pressure and Vacuum Filters Centrifugals, Separators, and Pressure and Vacuum Filters Excludes Laboratory Centrifuges (FSG 65 and 66); Water Purification Filters (FSC 4610). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4410 FSC 0 Industrial Boilers Industrial Boilers Includes Steam Boilers, over 15 pounds WSP. Marine Boilers; Boiler Drums; Water Heaters, Low Pressure (over 100 gallon recovery capacity). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4420 FSC 0 Heat Exchangers and Steam Condensers Heat Exchangers and Steam Condensers admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4430 FSC 0 Industrial Furnaces, Kilns, Lehrs, and Ovens Industrial Furnaces, Kilns, Lehrs, and Ovens Includes Crucible Furnaces; Cupola Furnaces. Excludes Food Industry Ovens (FSC 7310); Metal Heat Treating Furnaces (FSC 3424); Laboratory Type Furnaces (FSC 6640). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4440 FSC 0 Driers, Dehydrators, and Anhydrators Driers, Dehydrators, and Anhydrators Includes Evaporators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4460 FSC 0 Air Purification Equipment Air Purification Equipment Includes Electronic Precipitators; Dust Collection Equipment. Excludes Fan and Blower Equipment (FSC 4140); Air Conditioning Equipment (FSC 4120). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4470 FSC 0 Nuclear Reactors Nuclear Reactors Note-This class includes all types of nuclear reactors and those items which are specifically designed for use within nuclear reactors, their primary cooling systems, auxiliary fluid systems, special propulsion plant systems, handling and servicing equipment, electrical and control systems, and associated special test and water chemistry control items. Excluded from this class are those items for which more specific classifications are suitable. Includes Refueling Machines; Ion Chamber Seals; Thermal Barriers; Control Rods; Steam Generators, Pressurized Water; Reactor Vessel Shells; Handling Carts; Hoisting Units, New and Spent Cartridge. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4510 FSC 0 Plumbing Fixtures and Accessories Plumbing Fixtures and Accessories Includes Bathtubs; Commodes; Lavatories; Shower Cabinets; Sinks; Water Closets; Accessories and Component Parts, such as Dispensers, Faucets, Holders, Racks, Shower Heads, Flush Valves and Stop Valves. Excludes Fittings and Specialties for Hose, Pipe and Tube (FSC 4730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4520 FSC 0 Space and Water Heating Equipment Space and Water Heating Equipment Includes Boilers, 15 pounds WSP and under (for boilers over 15 pounds WSP, see FSC 4410); Domestic Water Storage Tanks through 100 gallon capacity; Fireplace Heaters; Furnaces; Space Heaters; Heating Radiators; Immersion Heaters; Water Heaters, through 100 gallon recovery capacity (for heaters over 100 gallons recovery capacity, see FSC 4410). Excludes Vehicle Heaters; (FSC 2540); Aircraft Heaters (FSC 1660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4530 FSC 0 Fuel Burning Equipment Units Fuel Burning Equipment Units Includes Oil Burners; Stokers; Gas Burners. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4540 FSC 0 Waste Disposal Equipment Waste Disposal Equipment Includes Compactors; Destructors; Garbage Disposals; Incinerators; Septic Tanks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4610 FSC 0 Water Purification Equipment Water Purification Equipment Includes Demineralizers; Filtration Equipment; Ice and Snow Melters. Excludes Water Purification Compounds (FSC 6810 and 7930); Water Softening Compounds (FSC 6810 and 7930). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4620 FSC 0 Water Distillation Equipment, Marine and Industrial Water Distillation Equipment, Marine and Industrial Excludes Laboratory Distillation Apparatus (FSC 6640). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4630 FSC 0 Sewage Treatment Equipment Sewage Treatment Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4710 FSC 0 Pipe, Tube and Rigid Tubing Pipe, Tube and Rigid Tubing Includes Culvert Pipes; Culvert Pipe Connector Bands; Metallic Pipes; Plastic Pipes; Tubes and Rigid Tubing and their assemblies. Excludes Air Conditioning-Heating Pipes (FSC 4520); Asbestos and Cement, Bituminized Fiber, Clay and Concrete Pipes (FSC 5630); Conduit Pipes and their assemblies (FSC 5975); Downspout Pipes (FSC 5670); Exhaust Pipes (FSC 1560, 2990, and 4520); Fire Extinguishing Systems Pipes and Tubes and their assemblies (FSC 4210); Flexible Tubing (FSC 4720); Glass Tubing (FSC 6640, and 9340); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4720 FSC 0 Hose and Flexible Tubing Hose and Flexible Tubing Includes Air Duct, Metallic, Nonmetallic, and Textile Fiber Hoses and their assemblies; Flexible Tubing and their assemblies. Excludes Conduit and their assemblies (FSC 5975); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515); Rigid Tubing and their assemblies (FSC 4710). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4730 FSC 0 Hose, Pipe, Tube, Lubrication, and Railing Fittings Hose, Pipe, Tube, Lubrication, and Railing Fittings Includes Adapters; Bends; Caps; Clamps; Connectors; Couplings; Crosses; Elbows; Expansion Joints; Ferrules; Flanges; Laterals; Lubrication Fittings; Manifolds; Nipples; Nozzles; Outlets; Plugs; Reducers; Swing and Swivel Joints; Tees; Traps; Unions; Wyes. Excludes Air Conditioning-Heating Fittings (FSC 4520); Bituminized Fiber and Concrete Fittings (FSC 5630); Conduit Boxes and Fittings (FSC 5975); Downspout Fittings (FSC 5670); Medical and Surgical Fittings (FSC 6515); Laboratory Fittings (FSC 6640); Post Caps and Rail Ends (FSC 5660); Machine Thread Bushings and Plugs (FSC 5365). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4810 FSC 0 Valves, Powered Valves, Powered Includes Electric Motor Operated Valves; Hydraulic Operated Valves; Solenoid Operated Valves. Excludes Engine Intake and Exhaust valves (FSC 2990, 2815); Valves specifically designed for use with fire fighting equipment (FSC 4210); plumbing equipment, and the like (FSC 4540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4820 FSC 0 Valves, Nonpowered Valves, Nonpowered Includes Automatic Nonpowered Valves; Gate, Globe, Angle, Check, and Relief Valves; Cocks. Excludes Fire Hydrants (FSC 4210); Sprinkler Heads (FSC 4210); Valves specifically designed for use with fire fighting Equipment (FSC 4210); plumbing equipment, and the like (FSC 4540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4910 FSC 0 Motor Vehicle Maintenance and Repair Shop Specialized Equipment Motor Vehicle Maintenance and Repair Shop Specialized Equipment Includes Automotive Lifts; Wheel Aligners; Brake Service Equipment; Tire Maintenance and Repair Equipment; Test stands and test equipment specially designed for use with motor vehicles. Excludes Hand Tools (FSG 51); Lubrication and Fuel Dispensing Equipment (FSC 4930); Basic types of electrical and electronic test instruments, including those specifically designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments as shown in the indexes in the FSC (FSC 6625). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4920 FSC 0 Aircraft Maintenance and Repair Shop Specialized Equipment Aircraft Maintenance and Repair Shop Specialized Equipment Includes Maintenance stands designed for support of aircraft assemblies during repair or overhaul; Test Stands and Test Equipment specially designed for maintenance and repair of aircraft components such as: engines, generators, hydraulic systems, armament, automatic pilot, fire control, flight control, and navigational systems. Excludes Hand Tools; Airfield Maintenance Platforms; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4921 FSC 0 Torpedo Maintenance, Repair, and Checkout Specialized Equipment Torpedo Maintenance, Repair, and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of torpedoes, torpedo components; adapters, fixtures, inspection and holding fixtures, leveling jack assemblies, fuel filling and syphon assemblies, control surface adapter and protractor assemblies, afterbody cradle adapter and tilting mount assemblies, pressure air heater assemblies, motor drier and puller assemblies, test stand levels and stands for overhaul, maintenance, test, checkout, and repair of torpedo and torpedo components, test panels, fixtures, and test sets for electrical circuits, firing circuits and torpedo test sets. Excludes Specially designed maintenance test, checkout and repair shop specialized equipment for maintenance and repair of ammunition, guided missiles, rockets, fire control, space vehicles, underwater mines, depth charges and nuclear ordnance. Also excludes "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4923 FSC 0 Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout and repair shop specialized equipment for maintenance and repair of depth charges and underwater mines; adapters, inspection, test and holding fixtures; stands for overhaul, maintenance, test, checkout, and repair of underwater mines and depth charges; test fixtures, panels plus assemblies and test sets for leak test, pressure test, firing circuits and timing devices. Excludes Specially designed maintenance, test, checkout, and repair shop equipment designed for nuclear ordnance, guided missiles, ammunition, torpedoes, rockets, fire control, space vehicles and "basic" types of electrical and electronic test instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4925 FSC 0 Ammunition Maintenance, Repair, and Checkout Specialized Equipment Ammunition Maintenance, Repair, and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment, for maintenance and repair of ammunition items; adapters, ammunition feeders and hoppers; inspection and holding fixtures; linkers, linkers-delinkers, and delinkers to assemble and disassemble ammunition belts; surveillance ovens; explosimeters; primer firing device fixtures; mandrels; repositioning machines; gas bomb service kits; test fixtures; panels; plug assemblies; and test sets for ammunition maintenance, checkout and repair. Excludes Maintenance, repair, checkout and test equipment specially designed for use with guided missiles, guided missile remote control systems, guided missile systems; fire control; nuclear ordnance; rockets, underwater mines and depth charges; torpedoes; space vehicles and test equipment for aircraft weapon launchers; basic types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4927 FSC 0 Rocket Maintenance, Repair and Checkout Specialized Equipment Rocket Maintenance, Repair and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of rockets and rocket components; rocket maintenance stands; test stands; fixtures; jigs; and shop equipment designed for maintenance and repair of rockets, rocket motors and other rocket components. Excludes Specially designed maintenance, test, checkout, and repair shop equipment specifically designed for nuclear ordnance, guided missiles, fire control, torpedoes, underwater mines, depth charges, ammunition, space vehicles; test equipment for aircraft rocket launchers and "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4930 FSC 0 Lubrication and Fuel Dispensing Equipment Lubrication and Fuel Dispensing Equipment Includes Hand Grease Guns; Centralized Lubrication Systems; Hydrostatic Lubricators; Oil and Gasoline Dispensing Pumps; Fuel Oil Dispensing Pumps; Hand Oilers; Grease Dispensers; Pressure Gun Attachments; Sight Feed Lubricators. Excludes Alemite and Lubrication Fittings (FSC 4730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4931 FSC 0 Fire Control Maintenance and Repair Shop Specialized Equipment Fire Control Maintenance and Repair Shop Specialized Equipment Includes Specially Designed Test Equipment, Maintenance Fixtures and Stands. Excludes Instruments for use on both Fire Control and other Equipment; Airborne Fire Control Maintenance and Repair Shop Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4933 FSC 0 Weapons Maintenance and Repair Shop Specialized Equipment Weapons Maintenance and Repair Shop Specialized Equipment Includes Maintenance Stands, Fixtures, and Jigs. Excludes Atomic Ordnance Maintenance and Repair Shop Specialized Equipment; Airborne Weapons Maintenance and Repair Shop Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4935 FSC 0 Guided Missile Maintenance, Repair, and Checkout Specialized Equipment Guided Missile Maintenance, Repair, and Checkout Specialized Equipment Includes Checkout equipment and test equipment specially designed for use with guided missiles and guided missile remote control systems. Excludes Specially designed internal (built-in) checkout equipment for guided missile remote control systems; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4940 FSC 0 Miscellaneous Maintenance and Repair Shop Specialized Equipment Miscellaneous Maintenance and Repair Shop Specialized Equipment Includes Paint Spraying Equipment. Excludes Hand Tools (FSG 51). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4960 FSC 0 Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment Includes Checkout and Test Equipment specially designed for use with Space Vehicles, including Remote Control Systems. Excludes Checkout and Test Equipment used with both Guided Missiles and Space Vehicles; Specially designed Internal (Built-in) Checkout Equipment for Remote Control Systems; Basic types of Electrical and Electronic Test Instruments, including those specially designed, such as ammeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 4970 FSC 0 Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment Note Maintenance, test, checkout and repair shop equipment designed to test, maintain, fault isolate and repair multiple guided weapon systems. For equipment designed to be used with only one specific system see the individual FSC indexed (i.e., 4921, 4927, 4935). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5110 FSC 0 Hand Tools, Edged, Nonpowered Hand Tools, Edged, Nonpowered Includes Chisels; Files; Pipe Cutters; Rasps; Saws; Screw Plates; Axes; Hatchets; Machetes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5120 FSC 0 Hand Tools, Nonedged, Nonpowered Hand Tools, Nonedged, Nonpowered Includes Hammers; Picks; Pliers, except pliers for cutting only; Screwdrivers; Shovels; Construction Rakes, Forks and Hoes; Jacks, including Contractors' Jacks; Wrecking Bars; Glue Pots; Blowtorches. Excludes Craftsman's Measuring Tools; Gardening Rakes, Forks, Hoes, and other Garden Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5130 FSC 0 Hand Tools, Power Driven Hand Tools, Power Driven Includes Drills; Riveters; Portable Electric Saws; Pneumatic Tools; Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5133 FSC 0 Drill Bits, Counterbores, and Countersinks: Hand and Machine Drill Bits, Counterbores, and Countersinks: Hand and Machine admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5136 FSC 0 Taps, Dies, and Collets; Hand and Machine Taps, Dies, and Collets; Hand and Machine Excludes Punching, Stamping, and Marking Dies. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5140 FSC 0 Tool and Hardware Boxes Tool and Hardware Boxes admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5180 FSC 0 Sets, Kits, and Outfits of Hand Tools Sets, Kits, and Outfits of Hand Tools Note-This class includes sets, kits and outfits consisting of several different items classifiable either in a single class or in several classes. Excluded from this class are sets, kits and outfits consisting of variations (such as size or color) of an item. Classify these items in the same class as the individual item. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5210 FSC 0 Measuring Tools, Craftsmen's Measuring Tools, Craftsmen's Note-This class does not include special inspection gages, which are classified in Class 5220. Includes Calipers; Levels; Micrometers; Plumb Bobs; Precision Tapes; Squares; Angle Gages; Center Gages; Depth Gages; Draw Gages; Drill Point Gages; Fillet and Radius Gages; Glaziers' Gages; Height Gages (Vernier); Planer Gages; Rivet Selector Gages; Saw Tooth Set Gages; Screw Pitch Gages; Surface Gages; Telescoping Gages; Thickness Gages; Tube Bead Gages; Tube Flare Gages; Twist Drill Gages; Twist Drill and Rod Gages; Twist Drill and Tap Gages; Taper-Wire-Thickness Gages; Wire Gages; Tool Setting Planer and Shaper Gages; Gage Blocks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5220 FSC 0 Inspection Gages and Precision Layout Tools Inspection Gages and Precision Layout Tools Note-Special inspection gages are included in this class. Includes Go and Not-Go Gages, including Plug, Ring, Snap, Thread, and Length Gages; Profile Gages; Fixture Gages; Special Inspection Gages. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5280 FSC 0 Sets, Kits, and Outfits of Measuring Tools Sets, Kits, and Outfits of Measuring Tools admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5305 FSC 0 Screws Screws admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5306 FSC 0 Bolts Bolts admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5307 FSC 0 Studs Studs admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5310 FSC 0 Nuts and Washers Nuts and Washers Note Nuts and washers, including specially designed, are to be classified in this FSC. a. Nuts are a small metal block made in a variety of shapes such as square and hexagonal which is drilled and internally threaded. b. Washers are a perforated piece of metal, leather, or other materials of various shapes or forms. They are used primarily as a seat for a bolt, nut, screw, rivet or nail to distribute pressure and prevent endwise motion over an area and/or to prevent movement between two parts by means of restraining features created by the shape of its edges. Includes Locknuts; Eye Nuts; Plain Nuts; Castellated Nuts; Wing Nuts; Plate Nuts; Push on Nuts; Concave and Convex Washers; Flat Washers; Keyed Washers; Lock Washers; Shouldered Washers; Split Washers. Excludes Bearing Thrust Washers (FSC 3120); Shims (FSC 5365); Ring Spacers (FSC 5365); Plate Spacers (FSC 5365); Lock Rings (FSC 5365). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5315 FSC 0 Nails, Machine Keys, and Pins Nails, Machine Keys, and Pins Note Nails, machine keys, and pins, including specially designed, will be classified in this FSC. a. Nails are slender, usually pointed fasteners with a head, and designed for insertion by impact. b. Machine keys are items generally inserted between two items, usually in a groove, to prevent relative rotation e.g., shaft and hub. c. Pins are cylindrical items of various materials used to align/attach two or more parts together and may allow for angular movement. Includes Dowel Pins, Split Pins; Spikes; Tacks; Nonoffice Type Staples; Machine Keys; Brads; Shouldered Pins; Cotter Pins; Nails. Excludes Shafts (FSC 3040); Lock Keys (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5320 FSC 0 Rivets Rivets admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5325 FSC 0 Fastening Devices Fastening Devices Includes Eyelets; Grommets; Aircraft Cowling Fasteners; Textile Fasteners; Retaining Rings; Threaded Inserts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5330 FSC 0 Packing and Gasket Materials Packing and Gasket Materials Note This FSC includes only seals and gaskets designed for standard use. Seals, gaskets and packing are made from materials specifically designed and constructed to resist deterioration from the action of heat, gas, chemicals, liquids, and used to fill a cavity and create a tight seal. Similar materials used to make seals, gaskets, and packing are available in bulk form, refer to FSG 93, FSG 80, and FSG 83. Includes General Purpose Oil Grease, Air, Liquid, Gas, and chemical Seals; Oakum; Prefabricated Gaskets and Seals designed for a single specific application. Excludes O-Rings (FSC 5331); Bulk material items, such as; Rubber, Cork, and Asbestos Sheets and Strips (FSG 93); Liquid Gasket Materials (RTV, Permatex, etc.) (FSG 80); RFI and EMI Seals and Gaskets (FSC 5999), and all Seal Retainers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5331 FSC 0 O-Ring O-Ring Excludes Packing and Gasket Material (FSC 5330). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5335 FSC 0 Metal Screening Metal Screening Note Metal Screening is a perforated plate or cylinder or a meshed wire fabric usually mounted and used to separate coarse from finer parts. Includes Insect Screening; Industrial Metal Cloth; Industrial Metal Mesh. Excludes Fencing (FSC 5660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5340 FSC 0 Hardware, Commercial Hardware, Commercial Note Common hardware designed primarily for commercial use will be classified in this FSC. Hardware is the physical, tangible and permanent components of end items that may not be classified elsewhere. It consists also of common items that are commonly used in construction and/or manufacturing (e.g., hinges, door locks). Includes Access Covers; Bumpers; Casters; Cabinet and Door Hardware; Clevises; Hinges; Latches; Straps and Strapping; Turnbuckles; Webbed Straps. Excludes Weapons System Hardware (FSC 5342). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5341 FSC 0 Brackets Brackets Note All brackets, including specially designed for specific use an/or application, will be classified in this FSC. Brackets are items of rigid construction that sustain a secondary item. Includes Angle Brackets; Double Angle Brackets; Mounting Brackets. Excludes Corner Braces (FSC 5340); "T" Braces (FSC 5340); Mending Plates (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5342 FSC 0 Hardware, Weapon System Hardware, Weapon System Note Hardware designed for weapon systems unique applications will be classified in this FSC. Includes Adapters; Anchor Plates and Straps; Anodes; Bellows; Couplings; Control Rods; Access Doors; Fairleads; Mounts; Tie Rods; Yokes. Excludes Commercial Hardware (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5345 FSC 0 Disks and Stones, Abrasive Disks and Stones, Abrasive Includes Abrasive Belts and Belting; Hones; Abrasive Wheels, Multiapplication. Excludes Dental Abrasives; Abrasive Cones, and other Abrasive Attachments for equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5350 FSC 0 Abrasive Materials Abrasive Materials Includes Cloth; Papers; Powders; Abrasive Polishing Compounds; Metal Finishing Abrasives; Industrial Diamonds; Diamond Dust; Rouge. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5355 FSC 0 Knobs and Pointers Knobs and Pointers Includes Knobs, including Calibrated Knobs; Dials, Scale. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5360 FSC 0 Coil, Flat, Leaf, and Wire Springs Coil, Flat, Leaf, and Wire Springs Note-All springs, including specially designed, will be classified in this FSC. A spring is an elastic mechanical device that regains its original shape after being compressed, extended or deflected. Includes Compression Springs; Torsion Springs; Leaf Spring Assemblies; Flat Springs; Extension Springs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5365 FSC 0 Bushings, Rings, Shims, and Spacers Bushings, Rings, Shims, and Spacers Note-All items, including specially designed, will be classified in this FSC. a. A bushing is cylindrical in shape, hollow, and designed primarily to be inserted into a hole to reduce the effective inside diameter of the hole, and to protect the body structure about the hole from damage resulting from stress, strain, and vibration. b. A ring is cylindrical in shape, usually flat with a center hole. Rings are multi-applicational. See specific item name for designated usage. c. A shim is a thin, sometimes tapered, piece of material used to fill in space between things. See specific item name for dimensional parameters. d. A spacer is a device for holding two members at a given distance from each other. Includes Externally Threaded Rings; Keyed and Serrated Lock Rings; Dee Rings; Instrument Retaining Rings; Shim Sets and Assortments; Plate Spacers; Ring Spacers; Sleeve Spacers; Stepped Spacers; Spacer Sets and Assortments; Sleeve Bushings; Machine Threaded Bushings; Machine Threaded Plugs. Excludes Sleeve Bearings (FSC 3120); Pipe Threaded Plugs (FSC 4730); Piston Rings (FSC 2520, 2805, 2810, 2815, 2825, 2990, 3040, 4310, and 4820); Retaining Rings (FSC 5325); Shim Stock (FSC 9515). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5410 FSC 0 Prefabricated and Portable Buildings Prefabricated and Portable Buildings Includes Prefabricated Panels; Inflatable Shelters; Metal Screens and Metal Windows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5411 FSC 0 Rigid Wall Shelters Rigid Wall Shelters Includes Expandable and nonexpandable shelters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5419 FSC 0 Collective Modular Support System Collective Modular Support System Note Includes Self-Contained habitat, containing facilities normally expected in a "Rest and Recreational" area, such as; billeting, food services, laundry, shower/hygiene services, recreational and support services that enhance morale and welfare. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5420 FSC 0 Bridges, Fixed and Floating Bridges, Fixed and Floating Includes Special Bridge Erection Equipment; Bridge Floats and Pontoons; Tramways; Trestles. Excludes Pontoons and Floating Docks (FSC 1945). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5430 FSC 0 Storage Tanks Storage Tanks Includes Assembled and Unassembled Tanks for storage only; Enclosures for Pressure and Vacuum Tanks; Petroleum Bulk Storage Tanks. Excludes Boiler Tanks (FSC 4410); Hot Water Tanks (FSC 4520). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5440 FSC 0 Scaffolding Equipment and Concrete Forms Scaffolding Equipment and Concrete Forms Includes Prefabricated Concrete Placing Forms; Builders' Ladders and Stepladders; Suspension stages. Excludes Aircraft Ladders (FSC 1730); Fire Fighting Ladders (FSC 4210); Maintenance Ladders (FSC 4940); Marine Vessel Ladders (FSC 2090); Vehicle Ladders (FSC 2540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5445 FSC 0 Prefabricated Tower Structures Prefabricated Tower Structures Includes Power Transmission Towers; Radar Towers; Searchlight Towers; Control Towers; Prefabricated Tower Components, such as Anchor Rails, Tie Rods, Braces, Steps, Guy Assemblies; Specialized Tower Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5450 FSC 0 Miscellaneous Prefabricated Structures Miscellaneous Prefabricated Structures Includes Bleachers; Grandstands. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5510 FSC 0 Lumber and Related Basic Wood Materials Lumber and Related Basic Wood Materials Includes Dimensional Lumber; Wood Flooring; Mine Timbers; Poles; Railroad Ties; Wood Siding; Molding; Stakes. Excludes Millwork (FSC 5520); Plywood and Veneer (FSC 5530); Prefabricated Non-Wood Items (FSC 5670). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5520 FSC 0 Millwork Millwork Includes Door Frames; Doors; Window Frames; Window Sashes. Excludes Molding (FSC 5510); Prefabricated Non-Wood Items (FSC 5670). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5530 FSC 0 Plywood and Veneer Plywood and Veneer Includes Plywood and Veneered Panels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5610 FSC 0 Mineral Construction Materials, Bulk Mineral Construction Materials, Bulk Includes Asphalt; Cinders; Gravel; Lime; Sand; Rough Dimension Stone, including Rubble; Cement; Ballast. Excludes Block, Shaped; Brick. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5620 FSC 0 Tile, Brick and Block Tile, Brick and Block Includes Concrete Building Block; Cinder Block; Slag Brick; Cut Stone; Cut and Polished Stone; Ceramic Floor and Wall Tile; Architectural Terra Cotta; Concrete Slabs and Grilles. Excludes Glass Building Block (FSC 9340) admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5630 FSC 0 Pipe and Conduit, Nonmetallic Pipe and Conduit, Nonmetallic Includes Concrete Pipe and Conduit; Clay Pipe and Conduit for underground use; Drain Tile; Nonmetallic Pipe Fittings for underground use. Excludes Nonmetallic Pipe, Conduit, and Fittings for laboratory or electrical use; Hose and Tubing, Flexible Nonmetallic. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5640 FSC 0 Wallboard, Building Paper, and Thermal Insulation Materials Wallboard, Building Paper, and Thermal Insulation Materials Includes Paper Building Board; Ceiling Board; Gypsum Board; Insulating Board; Plasterboard; Soundproofing Board; Tar Paper; Wallpaper; Mineral Wool; Glass Wool Batts; Pipe Covering. Excludes Electrical Insulation Materials. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5650 FSC 0 Roofing and Siding Materials Roofing and Siding Materials Includes Roofing (all materials), including Sheet Metal; Roofing Felt; Roll Roofing; Roofing Tile; Shingles. Excludes Tar Paper; Bulk Sheet Metal Roofing and Siding; Wood Siding. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5660 FSC 0 Fencing, Fences, Gates and Components Fencing, Fences, Gates and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5670 FSC 0 Building Components, Prefabricated Building Components, Prefabricated Note-Items specified as wooden are classified in 5520 Includes Door Frames; Window Frames; Window Sashes; Eave Troughs (Gutters); Gratings; Grilles; Shutters; Fixed Fire Escapes; Mounted Partitions. Excludes Plumbing and associated components such as Sinks; Wallbaord and items classified as furniture. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5675 FSC 0 Nonwood Construction Lumber and Related Materials Nonwood Construction Lumber and Related Materials Includes Nonwood Dimensional Lumber; Flooring; Special Turning and Carvings; Nonwood Veneer. Excludes Millwork and Wood Veneer (FSCs 5520 and 5530); Items specified as Wooden (FSC 5510). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5680 FSC 0 Miscellaneous Construction Materials Miscellaneous Construction Materials Includes Expanded Metal Lath; Airplane Landing Mats; Traction Mats. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5805 FSC 0 Telephone and Telegraph Equipment Telephone and Telegraph Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5810 FSC 0 Communications Security Equipment and Components Communications Security Equipment and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5811 FSC 0 Other Cryptologic Equipment and Components Other Cryptologic Equipment and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5815 FSC 0 Teletype and Facsimile Equipment Teletype and Facsimile Equipment Includes Ticker Tape and Sigtot Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5820 FSC 0 Radio and Television Communication Equipment, Except Airborne Radio and Television Communication Equipment, Except Airborne Includes Telemetering Equipment. Excludes Home Type Radio and Television Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5821 FSC 0 Radio and Television Communication Equipment, Airborne Radio and Television Communication Equipment, Airborne Includes Telemetering Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5825 FSC 0 Radio Navigation Equipment, Except Airborne Radio Navigation Equipment, Except Airborne Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5826 FSC 0 Radio Navigation Equipment, Airborne Radio Navigation Equipment, Airborne Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5830 FSC 0 Intercommunication and Public Address Systems, Except Airborne Intercommunication and Public Address Systems, Except Airborne Includes Wired Audio Systems; Office Type Systems; Shipboard Systems; Tank Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5831 FSC 0 Intercommunication and Public Address Systems, Airborne Intercommunication and Public Address Systems, Airborne admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5835 FSC 0 Sound Recording and Reproducing Equipment Sound Recording and Reproducing Equipment Excludes Phonographs, Home Type; Dictating Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5836 FSC 0 Video Recording and Reproducing Equipment Video Recording and Reproducing Equipment Note This class includes, and is restricted to electronic video equipment such as video monitors, televisions, cameras, printers and recorders/reproducers used with miscellaneous communication equipment. Also included is associated equipment such as cleaners, splicers, rewinders, reels and tapes designed for use with video recording-reproducing equipment. Excluded from the class is photographic type equipment (Group 67), ADP type computer monitors (Group 70), and video equipment which includes radio receivers/transmitters (properly classified in more specific classes in Group 58). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5840 FSC 0 Radar Equipment, Except Airborne Radar Equipment, Except Airborne Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5841 FSC 0 Radar Equipment, Airborne Radar Equipment, Airborne Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5845 FSC 0 Underwater Sound Equipment Underwater Sound Equipment Note-This class excludes items specifically designed for fire control sonar systems. Includes Sonar Equipment; Underwater Listening Equipment; Sonobuoys; Sonobuoy Launchers; Fathometers; Sofar Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5850 FSC 0 Visible and Invisible Light Communication Equipment Visible and Invisible Light Communication Equipment Note-This class includes only communication types of infrared equipment. Excluded from this class are infrared assemblies, subassemblies, and components designed specifically for use in fire control systems, guided missile systems, test and maintenance specialized equipment, night vision equipment, and other noncommunication types of equipment. Includes Heliographs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5855 FSC 0 Night Vision Equipment, Emitted and Reflected Radiation Night Vision Equipment, Emitted and Reflected Radiation Note-This class includes image forming devices and associated aids, their subassemblies and components, utilizing passive and/or active techniques for detection, observation, and identification of terrain and objects at night, while maintaining concealment afforded by darkness. Includes items having multiapplication for purposes of fire control, and/or night observation, and/or detection. Excluded from this class are items for which more specific classifications are suitable as prescribed by the structure and indexes of the FSC. Includes Sighting and Observation Devices, Target Detectors and Locators, Remote Viewing Systems utilizing heat radiation emitted from object(s), associated Radiation Sources, Image Converters and Image Intensifiers, Optical Cells and other components designed for Night Vision Equipment. Holders and Lens used with Infrared Equipment are also included in this FSC. Excludes Optical Sighting devices which incorporate both day and night viewing characteristics within an integral unit for fire control purpose, nonnight vision type items designed for use with guided missiles, communications, or laboratory equipment, and Optical Elements, such as Lens, Prisms, Windows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5860 FSC 0 Stimulated Coherent Radiation Devices, Components, and Accessories Stimulated Coherent Radiation Devices, Components, and Accessories Note-This class includes, and is restricted to, devices the operation of which is based on principles involving the stimulated emission of radiation, and to associated components and accessories directly related to stimulated coherent radiation techniques. The methods for producing the radiation are those obtained by LASER (Light Amplification by Stimulated Emission of Radiation) and by MASER (Microwave and/or Molecular Amplification by Stimulated Emission of Radiation) techniques. Only those items specifically designed for stimulated coherent radiation applications, and having no other application, are to be included in this class. Assemblies or major systems containing such devices are excluded from this class. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5865 FSC 0 Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment Note-This class includes, and is restricted to, passive and active electronic equipment, systems, and subsystems designed to prevent or reduce an enemy's effective use of radiated electromagnetic energy or designed to insure our own effective use of radiated electromagnetic energy. Includes Electronic Countermeasures, Electronic Counter-Countermeasures, Electronic Support Measures, and Quick Reaction Capability Equipment and components specially designed therefore which are not classifiable elsewhere in the FSC Structure. Excluded from this class are non-electronic items which are properly classified in more specific classes in accordance with the FSC structure and indexes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5895 FSC 0 Miscellaneous Communication Equipment Miscellaneous Communication Equipment Note-This class includes miscellaneous communication equipment that is not classified in more specific classes (see the NOTE for FSG 58). Includes Modems. Excludes Electronic Countermeasures Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5905 FSC 0 Resistors Resistors Includes Varistors; Resistive ballast Tubes; Rheostats; Resistor Networks; Resistor Mounting Hardware; Thermistors. Excludes Resistance Wire. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5910 FSC 0 Capacitors Capacitors Includes Interference Filter Capacitors; Capacitor Mounting Hardware. Excludes Semiconductor Devices and Associated Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5915 FSC 0 Filters and Networks Filters and Networks Note-This class includes those filters and networks which consist of a combination of resistors, capacitors, or coils, but not a combination of resistors only (classified in 5905), capacitors only (classified in 5910), or coils only (classified in 5950). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5920 FSC 0 Fuses, Arrestors, Absorbers, and Protectors Fuses, Arrestors, Absorbers, and Protectors Includes Fuseholders; Fuse Boxes; Fuse Posts; Fuse Links; Fuse Blocks; Current Limiters; Corona Balls; Electrostatic Dischargers. Excludes Circuit Breakers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5925 FSC 0 Circuit Breakers Circuit Breakers Includes Circuit Breakers and Cutouts. Excludes Relays. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5930 FSC 0 Switches Switches Includes Rotary, Knife, Toggle, Push Button, Mercury, Thermostatic, and Differential Pressure Switches. Excludes Switchgear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5935 FSC 0 Connectors, Electrical Connectors, Electrical Includes Plugs; Jacks; Receptacles, Electronic Component Sockets and Associated Accessories Excludes Interconnectors, Fiber Optic admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5940 FSC 0 Lugs, Terminals, and Terminal Strips Lugs, Terminals, and Terminal Strips Includes Binding Posts; Battery Clips; Stud Terminals; Test Clips. Excludes Caps, Electrical; Clips, Electrical; and Contacts, Electrical. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5945 FSC 0 Relays and Solenoids Relays and Solenoids Includes Electromagnetic Actuators. Excludes Contractors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5950 FSC 0 Coils and Transformers Coils and Transformers Includes Coils, except ignition and magneto; coil assemblies; magnetic amplifiers; reactors; transformers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5955 FSC 0 Oscillators and Piezoelectric Crystals Oscillators and Piezoelectric Crystals Includes Crystal Units, Processed Unmounted Crystals, Crystal Controlled Oscillators and Noncrystal Controlled Oscillators Excludes Crystal Controlled Oscillators and Noncrystal Controlled Oscillators which meet the definition of the term "electronic module" as defined for FSC 5963 and Microcircuits admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5960 FSC 0 Electron Tubes and Associated Hardware Electron Tubes and Associated Hardware Includes Rectifying Tubes; Photoelectric Tubes; Electron Vibrator Tubes. Excludes Transistors; Tube Sockets; X-ray Tubes; Semiconductor Devices and Associated Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5961 FSC 0 Semiconductor Devices and Associated Hardware Semiconductor Devices and Associated Hardware Includes Semiconductor Assemblies; Semiconductor Diodes; Semiconductor Rectifiers, Semiconductor Thyristors; Transistors; Unitized Semiconductors; Associated Hardware except Sockets. Excludes Microcircuits; Optoelectronic Devices and Associated Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5962 FSC 0 Microcircuits, Electronic Microcircuits, Electronic Note-(1) A microcircuit is defined as follows: A small circuit having a high equivalent circuit element density, which is considered as a single part composed of interconnected elements placed and/or formed on or within a single substrate to perform an electronic circuit function. The elements may be formed on or within a semiconductor material substrate; may consist of conductive film(s) formed on an insulating substrate; or may be a combination of one or both of these types with discrete elements. (2) The term "microcircuit", as applied to circuit devices included in this class, is delimited to exclude items consisting solely of interconnected "microcomponents" (discrete miniaturized components). Also excluded are items fabricated in the form of monolithic thick-film or thin-film structures that in themselves are not functional electronic circuits (e.g., Capacitors, Resistors, Transistors, or "arrays" thereof). Includes Integrated Circuit Devices; Integrated Circuit Modules, Integrated Electronic Devices: Hybrid, Magnetic, Molecular, Opto-Electronic, and Thin Film. Excludes Single Circuit Elements such as Capacitors; Resistors; Diodes and Transistors; Printed Circuit Boards and Circuit Card Assemblies; and Filters and Networks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5963 FSC 0 Electronic Modules Electronic Modules Note-The term "electronic module" as used in this class designates an electronic component designed for use in various equipment or end item applications, and capable of controlling voltage and/or current to produce gain, oscillation, switching, or similar integral electronic functions. It consists of a collection of miniaturized electronic parts and/or elements in a single replaceable package with plug-in mounting which will also complete the required electrical connections. It is not normally subject to disassembly as distinguished from such items as CIRCUIT CARD ASSEMBLY and ELECTRONIC COMPONENTS ASSEMBLY. These modules conform to industry or government specifications/standards that define all physical dimensions and electrical parameters required to promote commonality and ensure proper operational performance. Excludes MICROCIRCUITS; Electronic Test Equipment Plug-In Units. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5965 FSC 0 Headsets, Handsets, Microphones and Speakers Headsets, Handsets, Microphones and Speakers admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5970 FSC 0 Electrical Insulators and Insulating Materials Electrical Insulators and Insulating Materials Includes Tube, Knob, Cleat, Strain, and Standoff Insulators; Feed Thru Insulators; Bead Insulators; Varnish Cambric Tape; Friction Tape. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5975 FSC 0 Electrical Hardware and Supplies Electrical Hardware and Supplies Includes Conduit; Raceways; Face Plates; Condulets; Outlet and Junction Boxes; Pole Line Hardware, not elsewhere classifiable. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5977 FSC 0 Electrical Contact Brushes and Electrodes Electrical Contact Brushes and Electrodes Includes Brushes for electrical rotating equipment; Carbon Stock for Brushes; Brush Arm and Holders; Lighting Electrodes. Excludes Anodes; Cathodes; Welding Electrodes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5980 FSC 0 Optoelectronic Devices and Associated Hardware Optoelectronic Devices and Associated Hardware Includes Optoelectronic devices and assemblies which display numeric, alpha-numeric, symbolic, or graphic information, emitters, and nondisplay optoelectronic devices, such as couplers, detectors, and switches which perform an active function in an electronic system% Excludes electric lighting fixtures, lamps, and associated hardware% admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5985 FSC 0 Antennas, Waveguides, and Related Equipment Antennas, Waveguides, and Related Equipment Includes Aerials; Masts; Tower Equipment; Attenuators; Couplers; Transmission Lines. Excludes Tower Structures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5990 FSC 0 Synchros and Resolvers Synchros and Resolvers Excludes Synchro Systems; Servo Mechanisms. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5995 FSC 0 Cable, Cord, and Wire Assemblies: Communication Equipment Cable, Cord, and Wire Assemblies: Communication Equipment Note-This class includes only those types of cable, cord, and Wire Assemblies and Sets (and Wiring Harnesses) used on or with equipment and components covered by Groups 58 and 59. Cable, Cord, Wire Assemblies, and Sets (Wiring Harnesses) used on or with equipment classified in FSC Groups other than Groups 58 or 59 are classified in FSC Class 6150 if multiapplication, or classified with the next higher classifiable assembly if specially designed. Excludes Cable Assemblies, Fiber Optic. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5996 FSC 0 Amplifiers Amplifiers Includes Audio Amplifiers, Complementary Amplifiers, Amplifiers, Operational Amplifiers, Power Amplifiers, Radio Frequency Amplifiers, Signal Amplifiers, and Video Amplifiers. Excludes multi-functional items such as Amplifier-Detector, Amplifier-Mixer and microcircuit devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5998 FSC 0 Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware Excludes circuit card and electronic component assemblies which can be identified to a more definitive Approved Item Name. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 5999 FSC 0 Miscellaneous Electrical and Electronic Components Miscellaneous Electrical and Electronic Components Includes Permanent Magnets and Magnetostriction Elements; Caps, Clips, and Contacts, Electrical. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6010 FSC 0 Fiber Optic Conductors Fiber Optic Conductors Note-Included in this class are bulk discrete fibers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6015 FSC 0 Fiber Optic Cables Fiber Optic Cables Note-Included in this class are one or more discrete fiber optic conductors with a common protective covering in bulk form. May include electrical conductors/cables and/or reinforcing material. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6020 FSC 0 Fiber Optic Cable Assemblies and Harnesses Fiber Optic Cable Assemblies and Harnesses Note-Included in this class are items used for communication and/or data transmission having one or more fiber optic conductors/cables with processed end(s) or terminated in fitting(s). Excluded from this class are items used for illumination and/or image transmission. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6021 FSC 0 Fiber Optic Switches Fiber Optic Switches Note-Included in this class are switches used for line selection in fiber optic systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6030 FSC 0 Fiber Optic Devices Fiber Optic Devices Note Included in this class are such items as transmitters, receivers, multiplexers, demultiplexers, modulators, demodulators, repeaters, attenuators, filters, integrated optical ciruuits, and the like, used in fiber optic systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6032 FSC 0 Fiber Optic Light Sources and Photo Detectors Fiber Optic Light Sources and Photo Detectors Note Included in this class are light emitting and laser diodes and photo detectors used in fiber optic systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6035 FSC 0 Fiber Optic Light Transfer and Image Transfer Devices Fiber Optic Light Transfer and Image Transfer Devices Note-Included in this class are fiber optic devices used for illumination and/or image transmission. Excluded from this class are items used for communication and/or data transmission. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6060 FSC 0 Fiber Optic Interconnectors Fiber Optic Interconnectors Note Included in this class are all types of fiber optic terminations, such as connectors, dividers, couplers, rotary and nonrotary joints, splitters, mixers and splicers and the like. Excludes electrical connectors admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6070 FSC 0 Fiber Optic Accessories and Supplies Fiber Optic Accessories and Supplies Note-Included in this class are mode stripping materials, index matching materials and other related supplies. Excluded from this class are hardware and supplies common to both electrical and fiber optic applications which are classifiable on FSC 5975. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6080 FSC 0 Fiber Optic Kits and Sets Fiber Optic Kits and Sets Note-Included in this class are kits and sets which consist of fiber optic components only; fiber optic components and related parts; fiber optic components and related tools; or fiber optic components, related parts and related tools. Excluded from this class are tool kits and sets which are classifiable in FSC 5180; test sets/instruments classifiable in FSG 66; and end item sets/equipment utilizing fiber optic components which are classifiable in the applicable equipment FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6099 FSC 0 Miscellaneous Fiber Optic Components Miscellaneous Fiber Optic Components Note-Included in this class are fiber optic items which are not classifiable in a more specific class. (See the "Note" for FSG 60.) admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6105 FSC 0 Motors, Electrical Motors, Electrical Excludes Starting Motors for Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6110 FSC 0 Electrical Control Equipment Electrical Control Equipment Includes Contactors; Motor Controllers; Power Servomechanisms; Switchgear; Voltage Regulators. Excludes Automatic Pilot Mechanisms; Relays; Resistors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6115 FSC 0 Generators and Generator Sets, Electrical Generators and Generator Sets, Electrical Includes Engine, Turbine, Wind, and Hand Driven Generator Sets and Auxiliary Aircraft Generators. Excludes Motor-Converters; Motor-Generator Sets; Engine Generators; Engine Accessory Generators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6116 FSC 0 Fuel Cell Power Units, Components, and Accessories Fuel Cell Power Units, Components, and Accessories Note-This class includes items that are designed to produce an electromotive force directly from an oxidation-reduction type of chemical reaction. A complete power unit must include tanks, pumps, and associated control equipment, and requires a continuous, uninterrupted supply of liquid or gaseous fuel and oxidizers. Includes Complete Functioning Fuel Cell Power Units; Fuel Cells; Fuel Cell Assemblies or Modules; Fuel Cell Reactant Chambers; Fuel Feed Mechanisms; Electrolyte Heaters; Heat Exchangers; and other internal components peculiar to, and used exclusively on or with, Fuel Cell Power Units classified in this class. Excludes Primary Batteries (FSC 6135); Secondary Batteries (FSC 6140); Generators and Generating Sets (FSC 6115); and items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6117 FSC 0 Solar Electric Power Systems Solar Electric Power Systems Note-This class includes items which are designed for the direct conversion of solar energy into electrical power. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6120 FSC 0 Transformers: Distribution and Power Station Transformers: Distribution and Power Station Note This class includes transformers with a kilovolt-ampere rating above 1 kva. Excludes Potential and Current Transformers admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6125 FSC 0 Converters, Electrical, Rotating Converters, Electrical, Rotating Note-This class includes devices employing mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Excluded from this class are electrical generators and generator sets (FSC 6115). Includes Complete Battery Charging Equipment, Rotating; Dynamotors; Motor-Converters; Motor-Generator Sets; Phase Converters; Rotating Equipment; Synchronous Converters. Excludes Nonrotating Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6130 FSC 0 Converters, Electrical, Nonrotating Converters, Electrical, Nonrotating Note This class includes devices employing a means other than mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Includes Complete Battery Charging Equipment, Nonrotating; Power Supplies, Multiapplication. Excludes Rectifying Tubes; (FSC 5960); Rectifying Crystals (FSC 5961); Rotating Equipment (FSC 6125); Transformers (FSC 5950); and Semiconductor Devices and Associated Hardware (FSC 5961). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6135 FSC 0 Batteries, Nonrechargeable Batteries, Nonrechargeable Includes Cells and Dry Batteries; Nuclear Batteries. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6140 FSC 0 Batteries, Rechargeable Batteries, Rechargeable Includes Rechargeable Cells and Batteries. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6145 FSC 0 Wire and Cable, Electrical Wire and Cable, Electrical Note-This class includes only bulk electrical wire and cable. Excluded from this class are electrical wire and cable items of definite length either with processed ends, or terminated in fittings. Includes Insulated and Noninsulated, Wire and Cable, such as, Antenna Wire, Coaxial Cable, Fuse and Resistance Wire, and Magnet Wire. Excludes Radio Frequency Transmission Line (FSC 5985); Fiber Optic Cable (FSC 6015); Communication Cable Assemblies (FSC 5995); Distribution and Power Transmission Cable Assemblies (FSC 6150). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6150 FSC 0 Miscellaneous Electric Power and Distribution Equipment Miscellaneous Electric Power and Distribution Equipment Includes Appliance and Extension Cords; Electric Power and Distribution Cable with Attachments, Multiapplication; Common Components of Electrical Rotating Equipment, such as End Bells and Frames. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6160 FSC 0 Miscellaneous Battery Retaining Fixtures and Liners Miscellaneous Battery Retaining Fixtures and Liners Includes Battery Boxes, Covers, Liners, Racks, Retainers, and Trays. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6210 FSC 0 Indoor and Outdoor Electric Lighting Fixtures Indoor and Outdoor Electric Lighting Fixtures Includes Airport, Railroad Platform, Stadium, and Street Lighting Fixtures. Excludes Nonelectrical Outdoor Fixtures; Signal Fixtures; Nonelectrical Indoor Fixtures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6220 FSC 0 Electric Vehicular Lights and Fixtures Electric Vehicular Lights and Fixtures Includes Automotive, Marine, Railroad, and Aircraft Lights and Fixtures. Excludes Nonelectrical Vehicular Fixtures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6230 FSC 0 Electric Portable and Hand Lighting Equipment Electric Portable and Hand Lighting Equipment Includes Floodlights; Searchlights; Extension Lights. Excludes Nonelectrical Portable and Hand Lighting Equipment; Signal and Alarm Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6240 FSC 0 Electric Lamps Electric Lamps Includes Fluorescent Lamps; Incandescent Lamps, Large and Miniature; Mercury Lamps; Sodium Lamps. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6250 FSC 0 Ballasts, Lampholders, and Starters Ballasts, Lampholders, and Starters admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6260 FSC 0 Nonelectrical Lighting Fixtures Nonelectrical Lighting Fixtures Includes Lanterns, Nonelectrical; Hand and Portable Carbide Lamps; Candles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6310 FSC 0 Traffic and Transit Signal Systems Traffic and Transit Signal Systems Excludes Railroad Signals. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6320 FSC 0 Shipboard Alarm and Signal Systems Shipboard Alarm and Signal Systems admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6330 FSC 0 Railroad Signal and Warning Devices Railroad Signal and Warning Devices Includes Railroad Gates; Flasher Lights; Block Signals. Excludes Semaphore Flag Signals. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6340 FSC 0 Aircraft Alarm and Signal Systems Aircraft Alarm and Signal Systems Includes Oxygen Pressure Signals and Warning Devices; such as Air Pressure Warning Signals, Aircraft Crew Warning Signals, Altitude Warning Signals, Alarm Controls, Audible Landing Gear Alarms. Excludes Aircraft Engine Oil and Fuel Warning Devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6350 FSC 0 Miscellaneous Alarm, Signal, and Security Detection Systems Miscellaneous Alarm, Signal, and Security Detection Systems Includes Anti-intrusion Alarm Systems; Foghorns; Gongs; Chimes; Bells; Burglar Alarm Systems; Fire Alarms; Police Alarm Systems; Sounding Devices; Manual Gas Alarms; Landing Wands. Excludes Loran; Radar; Sonar; Engine Oil and Fuel Warning Devices; Aircraft Oxygen Warning Devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6505 FSC 0 Drugs and Biologicals Drugs and Biologicals Only items specifically formulated for human use are appropriate to this class. Includes all drugs, medicinal grade chemicals, and Biologicals subject to the Federal Food, Drug and Cosmetic Act, listed in the Monograph section of the U.S. Pharmacopeia or the National Formulary or covered by the United States Adopted Names (USAN). Other nations may apply their own legal documents. Excludes medicated cosmetics and toiletries classifiable in FSC 6508 and in vitro diagnostic substances and reagents classifiable in FSC 6550, and Veterinary Drugs and Biologicals classifiable in FSC 6509. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6508 FSC 0 Medicated Cosmetics and Toiletries Medicated Cosmetics and Toiletries Includes medicated cosmetics and toiletries that have been determined to be drugs in accordance with the Federal Food, Drug, and Cosmetic Act. Excludes nonmedicated cosmetics and toiletries which are classifiable in Group 85. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6509 FSC 0 Drugs and Biologicals, Veterinary Use Drugs and Biologicals, Veterinary Use Includes All Drugs, medicinal grade chemical, and Biologicals subject to the provisions of the Department of Agriculture (Veterinary Drugs and Biologicals) specifically formulated for Veterinary use. Other Nations may apply their own legal documents. Excludes Drugs and Biologicals specifically formulated for Human use classifiable in FSC 6505. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6510 FSC 0 Surgical Dressing Materials Surgical Dressing Materials Includes Bandages, Compresses, Dressings, Gauze, Pads, Sponges, and impregnated surgical dressing materials. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6515 FSC 0 Medical and Surgical Instruments, Equipment, and Supplies Medical and Surgical Instruments, Equipment, and Supplies Includes Anesthesia Apparatus; Blood Transfusion Apparatus; Oxygen Therapy Apparatus; Respirators; Orthopedic Supplies; Arch Supports; Clinical Thermometers; Sutures; Hearing Aids; Veterinary Equipment; Endoscopes, Fiber Optic. Excludes Opthalmic Instruments, Equipment, and Supplies; Non-Medical Endoscopes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6520 FSC 0 Dental Instruments, Equipment, and Supplies Dental Instruments, Equipment, and Supplies Includes Dental Engines; Dental Laboratory Equipment; Operating Chairs; Orthodontic Appliances; Teeth; Dental Metals; Dental Abrasives; Dental Laboratory Furniture. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6525 FSC 0 X-ray Equipment and Supplies: Medical, Dental, Veterinary X-ray Equipment and Supplies: Medical, Dental, Veterinary Includes Medical X-ray Film; Medical X-Ray Film Viewing Equipment; Medical X-Ray Film Processing and Finishing Equipment and Supplies; X-Ray Tubes. Excludes Industrial X-Ray Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6530 FSC 0 Hospital Furniture, Equipment, Utensils, and Supplies Hospital Furniture, Equipment, Utensils, and Supplies Includes Orthopedic Equipment; Operating Lights; Physiotherapy Equipment; Sterilizers; WheelChairs; Litters; Hospital Beds; Restraint Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6532 FSC 0 Hospital and Surgical Clothing and Related Special Purpose Items Hospital and Surgical Clothing and Related Special Purpose Items Includes Only those clothing items which are required exclusively for use in hospital operations, or in medical or dental facilities, which have no functional counterpart elsewhere in Federal Organizations participating in the Federal Catalog System. Excludes General purpose items of clothing and fabricated textile material. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6540 FSC 0 Ophthalmic Instruments, Equipment, and Supplies Ophthalmic Instruments, Equipment, and Supplies Includes Ophthalmic Lens Cutting and Grinding Machine; Ophthalmic Lenses and Lens Blanks; Spectacle Frames; Ophthalmological and Optometric Instruments, Equipment, and Supplies. Excludes Optical Lens Cutting and Grinding Machines: Ophthalmoscope and Otoscope Set; Surgical Instruments and Supplies that can be used by other medical disciplines; i.e., sutures, eye pads, eye shields, eye bath, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6545 FSC 0 Replenishable Field Medical Sets, Kits, and Outfits Replenishable Field Medical Sets, Kits, and Outfits Excludes Sets and kits which can be logically classified in another FSC Class in Group 65, such as Insect Sting Kit; Otoscope and Opthalmoscope Set; In Vitro Diagnostic Test Kits; and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6550 FSC 0 In Vitro Diagnostic Substances, Reagents, Test Kits and Sets In Vitro Diagnostic Substances, Reagents, Test Kits and Sets Includes In vitro diagnostic aids, such as test tablets, test slides, test strips, test cards, test papers, test solutions, reagents; sets and kits designated for in vitro qualitative and quantitative tests on specimens, such as blood, urine, feces, and the like, for the purposes of aiding in the medical diagnosis of disease, determining body organ dysfunction, or other abnormal conditions. Excludes In vitro diagnostic substances classifiable in FSC 6505. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6605 FSC 0 Navigational Instruments Navigational Instruments Includes Azimuths; Sextants; Octants; Compasses; Plotting Boards; Underwater Log Equipment; Air Position Indicators; Drift Meters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6610 FSC 0 Flight Instruments Flight Instruments Includes Air Speed Indicators; Rate of Climb Indicators; Bank and Turn Indicators; Pitot Tubes; Gyro Horizon Indicators; Attitude Gyro Indicators. Excludes Navigational Instruments (FSC 6605). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6615 FSC 0 Automatic Pilot Mechanisms and Airborne Gyro Components Automatic Pilot Mechanisms and Airborne Gyro Components Note Included in this class are gyro components of guided missiles. Excluded are complete gyro mechanisms and nonairborne gyro components, both of which are classified in the same classes as their next higher assemblies. Includes Automatic Pilot Regulators; Directional, Vertical, Bank and Turn, and Hydraulic Surface Gyro Controls; Airborne and Shipborne Automatic Pilot Mechanisms; Helicopter Automatic Stabilization Equipment. Excludes Automatic Pilot Training Devices (FSC 6930); and Automatic Pilot Mechanisms, Guided Missile (FSC 1420). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6620 FSC 0 Engine Instruments Engine Instruments Note-Instruments designed for use on both engines and other than engines are not included in this class and should be classified in the appropriate instruments class of Group 66. Includes All Engine Instruments, including Aircraft, Marine, and Vehicular; Fuel Pressure Gages; Manifold Pressure Gages; Oil Pressure Gages; Fuel Mixture Indicators; Engine Oil and Fuel Warning Devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6625 FSC 0 Electrical and Electronic Properties Measuring and Testing Instruments Electrical and Electronic Properties Measuring and Testing Instruments Note-This class includes all "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, even if specially designed. Excluded from this class by the modifier "except specially designed" are test instruments, other than "basic" instruments, which are specially designed for use with atomic ordnance, fire control, guided missile, motor vehicle, aircraft, or photographic equipment. Such specially designed test instruments are to be classified in other classes in the Federal Supply Classification. This class includes communications test equipment, infrared test equipment designed for communication, and night vision maintenance and test specialized equipment. Includes Test Leads and Test Lead Attachments; Test instruments designed for communication equipment; Test instruments designed for use with electronic equipment classified in two or more FSC groups. Excludes Radiac Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6630 FSC 0 Chemical Analysis Instruments Chemical Analysis Instruments Includes Acidity (pH) Meters; Gas Analyzers; Alakalinity Measuring Instruments; Colorimeters. Excludes Gas Detecting Equipment; Manual Gas Alarms; Chemicals; In Vitro Diagnostic Substances and Reagents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6635 FSC 0 Physical Properties Testing and Inspection Physical Properties Testing and Inspection Includes Destructive and Nondestructive Inspection Equipment such as Fluorescent Penetrant Inspection Units; Magnetic Inspection Units; Industrial X-Ray Machines; Industrial X-Ray Film; Tensiometers; Material Hardness Testers. Excludes General prupose Measuring Tools (FSC 5210) and Precision Measuring Tools and Inspection Gages (FSC 5220). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6720 FSC 0 Cameras, Still Picture Cameras, Still Picture Includes Aerial, Mapping, Microfilm, Photocopy, and Studio Cameras. Excludes X-Ray Cameras (FSC 6525), and Industrial X-Ray Machine (FSC 6635). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6730 FSC 0 Photographic Projection Equipment Photographic Projection Equipment Includes Screens; Viewers; Photomap Projectors; Integrated Viewers/Printer and Microform storage and retrieval systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6636 FSC 0 Environmental Chambers and Related Equipment Environmental Chambers and Related Equipment Note This class includes only those environmental chambers used exclusively to perform controlled tests, under simulated conditions, to determine physical damage and/or changes in operating characteristics for equipments and components such as Humidity; Immersion; Moisture; Altitude; Explosion; Thermal Shock; Sand and Dust; Flammability; Seal. Environmental chambers included in this class provide data regarding service life and behavior of various items equivalent to actual service conditions existing in the field. Includes Chambers; Wind Tunnels; Enclosures specifically designed to simulate an environmental condition; Weatherometers; Fadeometers; Specially designed equipment and components exclusively related to environmental chambers. Excludes General purpose prefabricated buildings, chambers, panels, and components (FSC 5410); Controlled Environmental Conditioning Kits and Sets (FSC 4240); Baths (FSC 4510); Ovens (FSC 7310); Kilns (FSC 3630); Radiosonde Baseline Check Sets (FSC 6660); Divers Recompression Chambers (FSC 4220); Altitude Training Decompression Chambers (FSC 6930); and Chambers used as training devices (FSC 6930); Checkout and Test Equipment (FSC 6625); Chemical Analysis Instruments (FSC 6630); Electrical and Electronic Properties Measuring and Testing Instruments (FSC 6625); and Meteorological Instruments (FSC 6660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6640 FSC 0 Laboratory Equipment and Supplies Laboratory Equipment and Supplies Includes Laboratory Glassware; Laboratory Funnels; Laboratory Furnaces; Glass Beads; Laboratory White Sand; Litmus Paper; Paper Filters; Insect Transfixion Pins; Laboratory Glass Wool; Laboratory Furniture, except Dental Laboratory. Excludes Instruments covered by other classes in group 66; Dental Laboratory Equipment; Laboratory Scales and Balances; In Vitro Diagnostic Substances and Reagents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6645 FSC 0 Time Measuring Instruments Time Measuring Instruments Includes Clocks; Job Recording Devices; Time Recorders; Time Stamps, Watch and Clock Movements; Watches. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6650 FSC 0 Optical Instruments, Test Equipment, Components and Accessories Optical Instruments, Test Equipment, Components and Accessories Includes Binoculars; Magnifiers; Microscopes; Periscopes; Telescopes; Optical Elements; such as Lens, Prisms, Windows; Optical Benches and Associated Devices; Endoscopes, Fiber Optics (Non-Medical). Excludes Fire Control Instruments, Optical; Surveying Instruments, Optical; Photogrammetric Instruments; Octants; and Sextants; Optical Instruments Integrated with Fire Control Equipment; Opthalmological Instruments; Electronic Fiber Optic Test Equipment; Medical Endoscopes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6655 FSC 0 Geophysical Instruments Geophysical Instruments Includes Geodetic, Oceanographic and Seismographic Instruments. Excludes Telescopes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6660 FSC 0 Meteorological Instruments and Apparatus Meteorological Instruments and Apparatus Includes Meteorological Ballons; Radiosonde Sets; Radarsonde Sets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6665 FSC 0 Hazard-Detecting Instruments and Apparatus Hazard-Detecting Instruments and Apparatus Includes Radiac Equipment; Gas Detecting Equipment; Land Mine Detecting Equipment. Excludes Manual Gas Alarms (FSC 6350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6670 FSC 0 Scales and Balances Scales and Balances Includes Coin Operated, Household, Industrial, Postal, and Laboratory Scales and Balances. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6675 FSC 0 Drafting, Surveying, and Mapping Instruments Drafting, Surveying, and Mapping Instruments Includes Drawing Instruments, Drafting Tools; Engineering and Architectural Scales; Levels; Transits; Photogrammetric Instruments; Astrolabes; Level Rods; Plane Tables; Surveying Altimeters; Theodolites. Excludes Surveyors' Tapes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6680 FSC 0 Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments Includes Liquid Level Float Instruments; Revolution Counters; Speedometers; Rotation Measuring Instruments and Apparatus; Oxygen Flow Indicators; Tachometers, including Engine Tachometers. Excludes Combination Instruments; (FSC 6695); Meteorological Instruments (FSC 6660); and Automatic Control Valves (FSG 48). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6685 FSC 0 Pressure, Temperature, and Humidity Measuring and Controlling Instruments Pressure, Temperature, and Humidity Measuring and Controlling Instruments Includes Thermometers, including Engine Thermometers; Pressure Gages; Thermocouple Leads; Resistance Bulbs. Excludes Clinical Therometers; (FSC 6515); Thermostatic and Differential Pressure Switches (FSC 5930); and Meteorological Instruments (FSC 6660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6695 FSC 0 Combination and Miscellaneous Instruments Combination and Miscellaneous Instruments Includes Flow-Pressure Instruments; Taximeters; Dynamometers. Excludes Dental, Medical, Surgical, and Veterinary Instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6710 FSC 0 Cameras, Motion Picture Cameras, Motion Picture Includes Aerial and Mapping Cameras. Excludes Television Cameras, Nonairborne (FSC 5820); Television Cameras, Airborne (FSC 5821); Video Cameras (FSC 5836). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6740 FSC 0 Photographic Developing and Finishing Equipment Photographic Developing and Finishing Equipment Includes Editing Equipment; Enlargers; Driers; Pressers; Printers; Washers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6750 FSC 0 Photographic Supplies Photographic Supplies Includes Sensitized Photographic Paper; Special Purpose Photographic Chemicals; Unprocessed Film; Photoflash Lamps. Excludes X-Ray Film (Medical Class 6525 or Industrial Class 6635); Electrographic (Facsimile) Paper for direct electrostatic printing or copying (FSC 7530). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6760 FSC 0 Photographic Equipment and Accessories Photographic Equipment and Accessories Includes Light Meters; Tripods; Filters; Range-finders; Photographic Floodlight Fixtures; Lenses; Specialized Photographic Test Equipment. Excludes Lamps (bulbs) (FSC 6240); Photoflash Lamps (FSC 6750). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6770 FSC 0 Film, Processed Film, Processed Includes Motion Picture Film, Silent and Sound; Still Picture Film. Excludes X-Ray Film (Medical class 6525 or Industrial class 6635); Training and Educational Film (FSC 6910); Processed Microfilm (FSC 7670). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6780 FSC 0 Photographic Sets, Kits, and Outfits Photographic Sets, Kits, and Outfits admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6810 FSC 0 Chemicals Chemicals Includes Naphtha Solvents; Water Softening Compounds; Tanning Materials, Natural or Synthetic; Dextrines and Starches; Inedible Gelatins; Acetone; Propellant Chemicals, Bulk, not Specialized Solely for Guided Missile Use. Excludes Medicinal Chemicals; Gases; Foundry dextrines; Radiographic and Photographic Chemicals; In Vitro Diagnostic Substances and Reagents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6820 FSC 0 Dyes Dyes Includes Household Tints admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6830 FSC 0 Gases: Compressed and Liquefied Gases: Compressed and Liquefied Includes Fuel Gases. Excludes Military Chemical Gases; Medical Gases; Empty Gas Cylinders and their caps, valves, and valve spare parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6840 FSC 0 Pest Control Agents and Disinfectants Pest Control Agents and Disinfectants Includes Insect Repellents; Fungicides; Insecticides; Rodenticides; Weed Killers. Excludes Personal Deodorants. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6850 FSC 0 Miscellaneous Chemical Specialties Miscellaneous Chemical Specialties Includes Antifogging Compounds; Wetting Agents; Etching and Fountain Solutions for Lithographing; Blanket Repair Solutions for Lithographing; Antifreeze. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6910 FSC 0 Training Aids Training Aids Includes Mockups; Cutaway Models; Scale Models; Training Films; Training Aid Maps; Navigational Training Aids; Flight Instrument Training Aids; Aircraft Instrument Training Aids; Vehicle Training Aids; Engine Instrument Training Aids; Hydraulic System Training Aids; Cutaway, Mockup, or Sectionalized Ammunition only; Training Equipment normally used in classroom training. Excludes Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6920 FSC 0 Armament Training Devices Armament Training Devices Includes Bombing Trainers; Gunnery Trainers; Tow Targets; Gunnery Targets; Guided Missile Training Sets. Excludes Target Drones; Drones for such use as training, surveillance, missile evaluation, and photographic reconnaissance; Atomic Ordnance Training Devices; Training Aids; Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6930 FSC 0 Operation Training Devices Operation Training Devices Includes Link Trainers; Automatic Pilot Training Devices; Drift Meter Training Devices; Celestial Navigation Trainers; Dead Reckoning Navigation Trainers; Instrument Flying and Landing Trainers; Terrain Projection Trainers; All operational training devices except communication and armament. Excludes Training Aids. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 6940 FSC 0 Communication Training Devices Communication Training Devices Includes Supersonic Radar Trainers; Navigational Radar Trainers; Search and Detecting Radar Trainers; Code Practice Equipment. Excludes Training Aids. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7010 FSC 0 ADPE System Configuration ADPE System Configuration Note-a group of general purpose analog, digital, or hybrid electronic or electromechanical devices that are interconnected to operate as a system. Frequently referred to as an ADP system, although the term "system" is not considered definitive. Includes an assembly of devices consisting of a central processing unit (CPU) and the necessary input/output devices, accessorial devices, analog measurement devices, software and/or firmware required to perform the desired objectives. Also includes sub-assemblies and units in which input/output devices, CPUs, and/or accessorial devices or components are incorporated into a single assembly or unit. A specially designed device incorporated into a system shall not influence the classification of the base assembly or unit. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7020 FSC 0 ADP Central Processing Unit (CPU, Computer), Analog ADP Central Processing Unit (CPU, Computer), Analog Note-An analog is a representation in one form of a physical condition existing in another form (e.g., the level of mercury in a tube represents temperature in a thermometer; the angular position of a needle represents speed on a speedometer). This class includes only CPUs that accept as inputs the electrical equivalent of physical conditions such as flow, temperature, pressure, angular position or voltage and perform computations by manipulating these electrical equivalents to produce results for further use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7021 FSC 0 ADP Central Processing Unit (CPU, Computer), Digital ADP Central Processing Unit (CPU, Computer), Digital Note-Digital refers to the representation of discrete numbers, symbols and alphabetic characters by a predetermined, coded combination of electrical impulses. This class includes only CPUs that accept information represented by digital impulses. Specifically, a device capable of performing sequences of arithmetic and logic operations (a program) not only on data but also on the program which is contained in its internal memory (storage) without intervention of an operator. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7022 FSC 0 ADP Central Processing Unit (CPU, Computer), Hybrid ADP Central Processing Unit (CPU, Computer), Hybrid Note-Hybrid refers to a combination of analog and digital capability as defined in Classes 7020 and 7021 with conversion capability required for intercommunication. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7025 FSC 0 ADP Input/Output and Storage Devices ADP Input/Output and Storage Devices Note This class includes devices used to control and transfer information to and from a Computer (as modified). The input device is used for transferring data and instructions into a computer. The output device is used to transfer results of processing by the computer to ADP peripheral devices. Input/output devices combine the above functions in the same device. This class includes printers, display units, disk drive units (magnetic, optical and floptical), tape drive units, terminals, data entry devices and transfer units. Also includes Optical Compact Disk (CD) devices used for the storage and retrieval of data and firmware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7030 FSC 0 ADP Software ADP Software Note-Software is a series of instructions or statements in a form acceptable to a CPU, designed to cause the ADPE configuration to execute an operation or operations; or a collection of data in a form capable of being processed and operated on by a computer. Includes System programs, such as operating systems, assemblers, compilers, executive routines, interpreters, translators; utility programs, such as sort/merge programs, media conversion, maintenance diagnostic programs; and application programs, such as payroll, inventory control, and engineering analysis programs. Excludes Software designed to Government specifications to satisfy the requirements of a particular user or for use with ADPE properly classifiable in an FSG other than FSG 70. Also excludes operating manuals and programmers' manuals properly classified in FSG 76. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7035 FSC 0 ADP Support Equipment ADP Support Equipment Note This class includes various devices and associated control units which are designed for use in combination or conjunction with an ADPE configuration but are not part of the configuration itself. ADP support equipment includes magnetic tape testing, certifying, and cleaning equipment; disk pack testing, certifying and cleaning equipment; tape equipment, rewinders, splicers, spoolers and card reconditioners. Included in this class are complete units and components of related general purpose commercially available support equipment which are not specifically designed for use as part of a system such as a weapon system, control system, digital image processing system, missile system, communication system or navigation system. Also included are support control systems and components not specifically designed for use with process control such as automatic machine tool processing operations in which flow, pressure, temperature or other parameters are controlled by instrument regulations in automatic machine tool and process operations. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7040 FSC 0 Punched Card Equipment Punched Card Equipment Includes Collating machines, key punch machines, tabulating machines; verifiers; reproducers; summary punches, sorters; interpreters. Excludes Card actuated machines designed for use with an ADPE system. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7042 FSC 0 Mini and Micro Computer Control Devices Mini and Micro Computer Control Devices Includes Mini or micro computers used as control mechanisms where computer technology is essential in controlling, monitoring, measuring, and directing processes, devices, instruments or other equipment. Excludes Mini and micro computer control devices which are designed specifically for use in and/or integral to higher order systems, e.g., aircraft fire control systems, numerically controlled machine tools, sequence controlled printing equipment, motion measuring instruments, office information system equipment, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7045 FSC 0 ADP Supplies ADP Supplies Note This class includes ADP tape seal bands, reels and hubs, carrying cases, canisters, and the like. Also includes all nonrecorded magnetic recording media designed to be used with ADP equipment, such as magnetic tape, removable disk packs, magnetic cards, cassettes, and diskettes. Also includes Optical Disks used for the storage of data. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7050 FSC 0 ADP Components ADP Components Note-This class includes ADP Component Assemblies that are parts of analog, digital or hybrid data processing devices. Excluded from the class are items for which more specific classifications are suitable. The FSC structure and indexes will govern the classification of those items permitted classification in a single class only. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7105 FSC 0 Household Furniture Household Furniture Includes Bedsprings, Open Style (All-metallic); Folding Chairs; Camp Furniture; Mirrors, Wall Mounting and Furniture Types; Smoking Stands. Excludes Hospital Beds and Bedsprings; Ash Trays; Mattresses; Bedsprings, Box Style (Fabric Covered). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7110 FSC 0 Office Furniture Office Furniture Includes Filing Cabinets; Safes; Post Office Furniture; School Furniture; Blackboards. Excludes Dental X-Ray Film Protective Safes; Visible Record Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7125 FSC 0 Cabinets, Lockers, Bins, and Shelving Cabinets, Lockers, Bins, and Shelving Includes Kitchen Cabinets; Sectional Shelving. Excludes Foot Lockers; Filing Cabinets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7195 FSC 0 Miscellaneous Furniture and Fixtures Miscellaneous Furniture and Fixtures Includes Stone, Clay, and Concrete Furniture; Auditorium and Theater Furniture; Library Furniture; Cashier Stands. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7210 FSC 0 Household Furnishings Household Furnishings Includes Household Furnishings of Textiles, Plastics, Paper, Rubber, and other materials; Sheets, Pillows, Blankets, and other Bedding; Insect Bars; Tablecloths; Towels; Steamer Rugs; Mattresses; Bedsprings, Box style (Fabric Covered); Bedspring and Mattress Sets. Excludes Floor Coverings; Curtains; Draperies; Paper Napkins; Paper Doilies; Bedsprings, Open Style (All-Metallic). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7220 FSC 0 Floor Coverings Floor Coverings Includes Linoleum; Rubber and Asphalt Tile; Carpets; Rugs; Rug Pads. Excludes Vehicular Floor Mats. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7230 FSC 0 Draperies, Awnings, and Shades Draperies, Awnings, and Shades Includes Curtains; Specialized Hardware and Fittings for Curtains, Draperies, Venetian Blinds, and Window Shades. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7240 FSC 0 Household and Commercial Utility Containers Household and Commercial Utility Containers Includes Refuse Cans; Sprinkling Cans; Clothes Hampers; Household Basket; Fabric Utility Containers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7290 FSC 0 Miscellaneous Household and Commercial Furnishings and Appliances Miscellaneous Household and Commercial Furnishings and Appliances Includes Fireplace Sets; Vases and Urns; Household Sewing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7310 FSC 0 Food Cooking, Baking, and Serving Equipment Food Cooking, Baking, and Serving Equipment Note-This class includes warming and/or chilling equipment used for the display and serving of food. Includes Warming and/or Chilling Tables, Stationary and Portable; Serving Carts; Field and Mobile Baking Ovens; Toasters; Waffle Irons; Grills; Special Aircraft, Marine, and Railway Type Food Cooking Equipment; Utensils with Integral Heating Units; Cafeteria Type Display Cases and Showcases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Combination Heated-Refrigerated Food Serving Equipment; Carbonators; and other types of refrigerated food serving and display equipment commonly used in cafeterias, mess hall kitchens, and the like. Excludes Carts other than Serving; Commissary or Food Store Type Refrigeration Equipment; Commercial Household, or Professional and Scientific Refrigerators; Drinking Fountains; (see Class 4110 for items excluded from Class 7310). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7320 FSC 0 Kitchen Equipment and Appliances Kitchen Equipment and Appliances Includes Dishwashing Machines; Food Slicing Machines; Food Mixers; Utility Carts Specially designed for use in Kitchen and Dining Area. Excludes Sinks; Serving Carts (see Class 7310 for Food Serving Carts). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7330 FSC 0 Kitchen Hand Tools and Utensils Kitchen Hand Tools and Utensils Includes Pots; Pans; Can Openers; Graters; Food Mashers; Cleavers; Vacuum Bottles and Jugs. Excludes Utensils with Integral Heating Units; Knives; Forks; Spoons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7340 FSC 0 Cutlery and Flatware Cutlery and Flatware Includes Knives; Forks; Spoons; Hunting Knives. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7350 FSC 0 Tableware Tableware Includes China and Earthenware; Glassware; Paper Plates and Cups. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7360 FSC 0 Sets, Kits, Outfits and Modules, Food Preperation and Serving Sets, Kits, Outfits and Modules, Food Preperation and Serving admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7420 FSC 0 Accounting and Calculating Machines Accounting and Calculating Machines Includes Accounting and adding machines and electronic calculators. Excludes Punched card system machines; Machines or devices that can be applied to a variety of problems by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7430 FSC 0 Typewriters and Office Type Composing Machines Typewriters and Office Type Composing Machines Includes Typewriters and office type composing machines with built-in electric/electronic functions such as margins, headings, tabs, centering and related actions. Excludes Typewriters and office type composing machines which are designed primarily for use as a component of an ADPE system or that are user programmable, and that can be applied to a variety of applications by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by some form of general purpose data processing language. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7435 FSC 0 Office Information System Equipment Office Information System Equipment Includes Minicomputer and microcomputer controlled systems specifically designed for user programmable processing of the office information application; Connected peripheral equipment; Automatic repetitive typewriters; Text editing typewriters and video display text editing typewriters. Excludes General purpose ADPE which is designed primarily to be applied through the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language, to process a variety of applications such as financial management, logistics, scientific, communications, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7450 FSC 0 Office Type Sound Recording and Reproducing Machines Office Type Sound Recording and Reproducing Machines Includes Dictating Machines; Transcribing Machines; Combination Dictating and Transcribing Machines. Excludes Communication Type Sound Recording and Reproducing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7460 FSC 0 Visible Record Equipment Visible Record Equipment Includes Manually operated and power operated visible record equipment; visible index files, rotary and stationary; specially designed components, such as Wire and Bar Pockets, Cover Plates, Stop Wires, and Channel Stops; Control Boards; Binder Racks; devices and systems designed to automatically store and retrieve hard copy documents. For those microform automatic retrieval systems that contain an integral viewer or view/printer, see Class 6730. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7490 FSC 0 Miscellaneous Office Machines Miscellaneous Office Machines Includes Addressing Machines; Check Handling Machines; Coin Counting Machines; Mailing Machines, Currency Handling Machines. Excludes Pencil Sharpeners; Staplers, Office Type; Duplicating Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7510 FSC 0 Office Supplies Office Supplies Includes Crayons; Erasers; File Holders; Writing Ink; Printing Ink; Paper Fasteners; Pencils; Penholders and Pen Points; Rulers, Office Type; Art Supplies; Tape, Pressure Sensitive Adhesive. Excludes Office Devices; Fountain Pens; Artists' Brushes; Paper Stationery; Record Forms; Mechanical Pencils. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7520 FSC 0 Office Devices and Accessories Office Devices and Accessories Includes Copyholders; Fountain Pens and Pen Desk Sets; Pencil Sharpeners; Paper Punches; Staplers, Office Type; Artists' Accessories, such as Easels, Airbrushes; Slide Rules. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7530 FSC 0 Stationery and Record Forms Stationery and Record Forms Includes Business Forms; Record Books; Surveyors' Computation Forms; Electric Accounting Machine (EAM) Cards; Forms approved for use within individual government activities. Excludes Standard forms approved for government-wide use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7540 FSC 0 Standard Forms Standard Forms Includes Only those standard forms approved for government-wide use by the government activities empowered to do so (such as the U.S. Bureau of the Budget and the U.S. General Accounting Office, and similar organizations in other NATO countries). Excludes Forms approved for use within individual government activities. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7610 FSC 0 Books and Pamphlets Books and Pamphlets Includes Technical and Nontechnical Books and Pamphlets; Regulations; Instruction Manuals; Technical Orders. Excludes Sheet and Book Music; Periodicals; Bibles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7630 FSC 0 Newspapers and Periodicals Newspapers and Periodicals admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7640 FSC 0 Maps, Atlases, Charts, and Globes Maps, Atlases, Charts, and Globes Excludes Training Aid Maps admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7641 FSC 0 Aeronautical Maps, Charts and Geodetic Products Aeronautical Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7642 FSC 0 Hydrographic Maps, Charts and Geodetic Products Hydrographic Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7643 FSC 0 Topographic Maps, Charts and Geodetic Products Topographic Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7644 FSC 0 Digital Maps, Charts and Geodetic Products Digital Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7650 FSC 0 Drawings and Specifications Drawings and Specifications Includes Federal, Military, and Departmental Specifications. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7660 FSC 0 Sheet and Book Music Sheet and Book Music Excludes Hymnbooks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7670 FSC 0 Microfilm, Processed Microfilm, Processed admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7690 FSC 0 Miscellaneous Printed Matter Miscellaneous Printed Matter Includes Decals; Printed Posters; Printed Labels. Excludes Sheet and Book Music. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7710 FSC 0 Musical Instruments Musical Instruments Note-This class includes only complete musical instruments. Assemblies, parts, attachments, or accessories for use in or on musical instruments are classified in classes other than this class. Excludes Phonographs; Radios; Television Sets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7720 FSC 0 Musical Instrument Parts and Accessories Musical Instrument Parts and Accessories Includes Instrument Cases; Music Stands; Tuning Forks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7730 FSC 0 Phonographs, Radios, and Television Sets: Home Type Phonographs, Radios, and Television Sets: Home Type Note-This class includes only complete home-type phonographs, complete home-type radios, and complete home-type television sets. End items, assemblies, parts, attachments, or accessories for use in or on the above are classified in classes other than this class. Includes Combination Sets. Excludes Coin Operated Phonographs; Wire and Tape Recorders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7740 FSC 0 Phonograph Records Phonograph Records Excludes Training Aid Records. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7810 FSC 0 Athletic and Sporting Equipment Athletic and Sporting Equipment Includes Baseball Equipment; Basketballs; Boxing Gloves; Fencing Masks; Fishing Tackle, except Commercial; Handballs; Shin Guards, Hockey. Excludes Athletic and Sports Clothing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7820 FSC 0 Games, Toys, and Wheeled Goods Games, Toys, and Wheeled Goods Includes Baby Carriages; Checkers; Doll Carriages; Dolls; Playing Cards; Velocipedes; Handicraft Kits, not elsewhere classifiable. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7830 FSC 0 Recreational and Gymnastic Equipment Recreational and Gymnastic Equipment Includes Slides; Swings; Amusement Park and Shooting Gallery Equipment; Play Yard and Playground Equipment; Billiard and Pool Tables and Equipment; Gymnasium Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7910 FSC 0 Floor Polishers and Vacuum Cleaning Equipment Floor Polishers and Vacuum Cleaning Equipment Includes Domestic and Industrial Vacuum Cleaning Equipment; Carpet Sweepers. Excludes Self-propelled and Trailer Mounted Vacuum Cleaners. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7920 FSC 0 Brooms, Brushes, Mops, and Sponges Brooms, Brushes, Mops, and Sponges Includes Squeegees; Whisk Brooms. Excludes Hair Brushes; Toothbrushes; Paint and Artists' Brushes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 7930 FSC 0 Cleaning and Polishing Compounds and Preparations Cleaning and Polishing Compounds and Preparations Includes Scouring Powders; Washing Compounds; Detergents; Nontoilet Soaps; Automobile and Household Polishes and Waxes. Excludes Shaving Soap; Toilet Soap; Abrasive Polishing Compounds; Metal Finishing Abrasives; Surgical Detergents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8010 FSC 0 Paints, Dopes, Varnishes, and Related Products Paints, Dopes, Varnishes, and Related Products Includes Water Paints; Oil Paints and Latex; Driers; Paint Primers; Lacquers; Paint Sealers; Pigments for Coloring; Stains; Turpentine; Paint Removers. Excludes Acetone, Wood and Wall Fillers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8020 FSC 0 Paint and Artists' Brushes Paint and Artists' Brushes Excludes Airbrushes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8030 FSC 0 Preservative and Sealing Compounds Preservative and Sealing Compounds Includes Fire Resistant Compounds; Water Resistant Compounds; Weather Resistant Compounds; Belt Dressing; Antiseize Compounds; Calking and Glazing Compounds; Putties; Wood and Metal Fillers. Excludes Food Preservative Compounds. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8040 FSC 0 Adhesives Adhesives Includes Glue; Mucilage; Sizes; Adhesive Cements. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8105 FSC 0 Bags and Sacks Bags and Sacks Includes Shipping and Protective Envelopes; Liners for Bags and Sacks; Textile and Paper Laminated Shipping Bags; Closures for Bags and Sacks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8110 FSC 0 Drums and Cans Drums and Cans Includes Barrels; Kegs; Shipping and Storage Pails; Collapsible Tubes; Mailing and Filing Tubes; Closures for Drums and Cans. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8115 FSC 0 Boxes, Cartons, and Crates Boxes, Cartons, and Crates Includes Shoe Boxes; Beer Cases; Pill Boxes; Piano Cases; Engine Boxes; Bombsight Boxes. Excludes Special boxes, packages, and containers designed primarily for shipping, storage, and handling of ammunition, nuclear ordnance, explosives, guided missiles, military chemical agents; and repairable/reusable containers specially designed for specialized equipment such as the "Shipping and Storage Container" for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8120 FSC 0 Commercial and Industrial Gas Cylinders Commercial and Industrial Gas Cylinders Note-This class includes empty commercial and industrial gas cylinders and their caps, valves, and valve spare parts. Excludes Filled gas cylinders and items related to gaseous and liquefied gaseous dispensing systems, both mobile and installed. All components of installed gas dispensing systems are classified by "application" or "function" with the end equipment for which designed. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8125 FSC 0 Bottles and Jars Bottles and Jars Includes Shipping Jugs and Carboys; Ampoules. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8130 FSC 0 Reels and Spools Reels and Spools admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8135 FSC 0 Packaging and Packing Bulk Materials Packaging and Packing Bulk Materials Includes Wrapping Paper; Moisture Vapor Barrier Paper; Excelsior; Wadding for Packing; Corrugated Paper; Baling Bands, Baling Ties; Shipping Tags; Gummed Paper Tape; Separators; Box Liners; Packaging Staples; Baling Wire; Preformed Cushioning Inserts. Excludes Adhesives; Aluminum Foil other than for food handling and processing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8140 FSC 0 Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers Note-This class includes only containers and fittings which are specifically designed for the storage, handling, and shipping of ammunition, explosives, and military chemical agents. Includes All shipping and storage containers specially designed for guided missiles, major missile sections, missile warheads, and other guided missile components. Excludes General Purpose Containers, Shipping and storage reusable/repairable containers specially designed for components of aircraft, space vehicles, automotive vehicles, ships, and ground communication equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8145 FSC 0 Specialized Shipping and Storage Containers Specialized Shipping and Storage Containers Note-This class includes only reusable and repairable containers specially designed for shipping and storage of specialized equipment; i.e., shipping and storage containers for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment, etc. Includes Specially designed components (not elsewhere classifiable) peculiar to special shipping and storage containers as delimited under this class. Excludes General purpose containers; specially designed containers for ammunition, nuclear ordnance, explosives, military chemical agents and guided missile components. Excluded from this class are items for which more specific classifications are suitable. The FSC Indexes and Structure will govern the classification of those items permitted classification in a single class only. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8305 FSC 0 Textile Fabrics Textile Fabrics Note-This class includes only textiles in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Canvas Materials; Plastic Fabrics; Felt Materials; Netting, Plastic and Textile; Oilcloth; Textile Scrap. Excludes Carpeting. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8310 FSC 0 Yarn and Thread Yarn and Thread admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8315 FSC 0 Notions and Apparel Findings Notions and Apparel Findings Includes Buttons; Dressmakers' Pins; Needles; Shoulder Pads; Embroideries; Stamped Art Goods for Embroidery and Art Needlework; Hair Nets; Sewing Kits. Excludes Yarn; Thread; General Purpose Buckles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8320 FSC 0 Padding and Stuffing Materials Padding and Stuffing Materials Includes Feathers and Downs, Processed; Spanish Moss, Processed; Cotton Wadding and Batting; Kapok. Excludes Feathers and Downs, Unprocessed. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8325 FSC 0 Fur Materials Fur Materials Note-This class includes only fur materials in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Crosses; Sacs; Fur Plates; Fur Mats. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8330 FSC 0 Leather Leather Includes Garment Leather; Patent Leather; Glove Leather; Shoe Leather; Upholstery Leather; Industrial Leather. Excludes Belting; Shoe Findings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8335 FSC 0 Shoe Findings and Soling Materials Shoe Findings and Soling Materials Includes Counters; Taps; Shoe Laces; Lasts and Last Sole Patterns; Ornamental Shoe Buckles and Bows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8340 FSC 0 Tents and Tarpaulins Tents and Tarpaulins Note-Fitted covers which are specifically designed for use on or with specific individual types of equipment are excluded from this class and are to be classified in the same classes as the items for which they are designed, or in such other classes as are appropriate. Includes Tent Pins; Tent Poles; Multiple purpose covers of woven or unwoven fabrics, not for permanent installation. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8345 FSC 0 Flags and Pennants Flags and Pennants Includes Signalling Flags; Flagstaffs; Signal Shapes; Flagpoles; Flagstaff Trucks; Speed Cones; Flagstaff Belts; Semaphore Flags. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8405 FSC 0 Outerwear, Men's Outerwear, Men's Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Trousers; Coats. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8410 FSC 0 Outerwear, Women's Outerwear, Women's Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Skirts; Blouses. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8415 FSC 0 Clothing, Special Purpose Clothing, Special Purpose Note-This class includes conventional winter, summer, and intermediate flight clothing ensembles and their components. Excluded from this class are specialized antiexposure, antigravity, partial pressure, and full pressure, flight ensembles and their specialized components. Includes Special Purpose Headwear, including Helmets, except Ballistic Protective; Safety and Protective Clothing; Athletic Clothing; Safety, Combat, Protective, and Work Gloves; Submarine Deck Exposure Clothing; Flight Clothing Components designed for use with both Specialized and Conventional Ensembles. Excludes Sporting and Athletic Gloves; Athletic Footwear; Safety Footwear; Personal Armor; Special Hospital and Surgical Clothing. Excludes special purpose clothing wherein the primary purpose is ballistic resistant protection. This class will include common use components of both ballistic and conventional end items. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8420 FSC 0 Underwear and Nightwear, Men's Underwear and Nightwear, Men's admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8425 FSC 0 Underwear and Nightwear, Women's Underwear and Nightwear, Women's Includes Corsets; Girdles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8430 FSC 0 Footwear, Men's Footwear, Men's Includes Rubber Footwear; Athletic Footwear; Safety Footwear; Submarine Deck Exposure Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8435 FSC 0 Footwear, Women's Footwear, Women's Includes Rubber Footwear; Athletic Footwear; Safety Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8440 FSC 0 Hoisery, Handwear, and Clothing Accessories, Men's Hoisery, Handwear, and Clothing Accessories, Men's Includes Handkerchiefs; Suspenders; Garters; Belts; Dress Handwear; Leggings, Nonsafety Type. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8445 FSC 0 Hoisery, Handwear, and Clothing Accessories, Women's Hoisery, Handwear, and Clothing Accessories, Women's Includes Handkerchiefs; Garters; Belts; Neckerchiefs; Handbags; Dress Handwear; Leggings, Nonsafety Type. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8450 FSC 0 Children's and Infants' Apparel and Accessories Children's and Infants' Apparel and Accessories Includes Footwear; Outerwear; Headwear; Handwear; Underwear; Nightwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8455 FSC 0 Badges and Insignia Badges and Insignia Note-This class includes only items worn or carried on the person. Excludes Nonpersonal Insignia. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8460 FSC 0 Luggage Luggage Includes Foot Lockers; Brief Cases; Trunks; Suitcases. Excludes Duffel Bags; Musette Bags admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8465 FSC 0 Individual Equipment Individual Equipment Includes Musette Bags; Duffel Bags; Ammunition Belts; Pistol Belts; Handcuffs; Packboards; Sleeping Bags; Knapsacks; Hikers' Packs; Sunglasses; Skis; Snowshoes; Swords with Scabbards. Excludes Toilet Articles; Mess Gear; Fabric Utility Containers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8470 FSC 0 Armor, Personal Armor, Personal Includes Clothing specially designed for use as personal armor. Excludes All specialized flight clothing and accessories which may contain ballistic resistant properties as a secondary function. Excludes special purpose clothing wherein the primary function is for purposes other than ballistic protection admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8475 FSC 0 Specialized Flight Clothing and Accessories Specialized Flight Clothing and Accessories Includes Specialized Antiexposure, Antigravity, Partial Pressure, and Full Pressure Ensembles, and Specialized Components therefor, including Unpressurized Protective Helmets, Eye Protective Devices, and items with Sound Attenuating Features. Excludes Conventional Winter, Summer, and Intermediate Flight Clothing Ensembles, and Components therefor; Components designed for use with both Specialized and Conventional Flight Clothing Ensembles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8510 FSC 0 Perfumes, Toilet Preparations, and Powders Perfumes, Toilet Preparations, and Powders Includes Colognes; Cosmetics; Deodorants; Depilatories; Toilet Waters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8520 FSC 0 Toilet Soap, Shaving Preparations, and Dentifrices Toilet Soap, Shaving Preparations, and Dentifrices Includes Toothpaste; Shaving Soap. Excludes Medicated Soaps. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8530 FSC 0 Personal Toiletry Articles Personal Toiletry Articles Includes Hair Brushes; Nail Brushes; Nail Files; Toothbrushes; Manicure and Pedicure Implements; Razors and Blades. Excludes Dental Floss. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8540 FSC 0 Toiletry Paper Products Toiletry Paper Products Includes Facial Tissues; Paper Toilet Seat Covers; Toilet Paper; Paper Napkins; Doilies. Excludes Towel Dispensers; Paper Plates and Cups. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8710 FSC 0 Forage and Feed Forage and Feed Includes Hay; Manufactured Feed; Straw; Zoological Animal Food. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8720 FSC 0 Fertilizers Fertilizers Includes Natural and Synthetic Fertilizers; Peat Moss; Animal Manures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8730 FSC 0 Seeds and Nursery Stock Seeds and Nursery Stock Includes Cut Flowers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8810 FSC 0 Live Animals, Raised for Food Live Animals, Raised for Food admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8820 FSC 0 Live Animals, Not Raised for Food Live Animals, Not Raised for Food admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8905 FSC 0 Meat, Poultry, and Fish Meat, Poultry, and Fish Includes Game Birds; Shellfish; Sausage Casings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8910 FSC 0 Dairy Foods and Eggs Dairy Foods and Eggs Includes Ice Cream; Frozen Custards; Ice Cream Mixes; Rennet; Milk Sherbets; Ices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8915 FSC 0 Fruits and Vegetables Fruits and Vegetables Includes Baked Beans; Juices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8920 FSC 0 Bakery and Cereal Products Bakery and Cereal Products Includes Flour; Prepared Flour; Prepared Cereals; Macaroni. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8925 FSC 0 Sugar, Confectionery, and Nuts Sugar, Confectionery, and Nuts Includes Candy; Chewing Gum; Honey; Maple Syrup. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8930 FSC 0 Jams, Jellies, and Preserves Jams, Jellies, and Preserves admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8935 FSC 0 Soups and Bouillons Soups and Bouillons admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8940 FSC 0 Special Dietary Foods and Food Specialty Preparations Special Dietary Foods and Food Specialty Preparations Includes Infant Foods; Potato Chips; Prepared Pie and Cake Fillings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8945 FSC 0 Food, Oils and Fats Food, Oils and Fats admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8950 FSC 0 Condiments and Related Products Condiments and Related Products Includes Salad Dressings; Spices; Seasonings; Flavoring Extracts; Yeast; Olives. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8955 FSC 0 Coffee, Tea, and Cocoa Coffee, Tea, and Cocoa Includes Postum; Yerba Mate; Chicory. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8960 FSC 0 Beverages, Nonalcoholic Beverages, Nonalcoholic Includes Soft Drinks; Ice. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8965 FSC 0 Beverages, Alcoholic Beverages, Alcoholic Includes Beer; Whisky; Wine; Liqueur. Excludes Sacramental Wine and Medicinal grade Brandy, Whisky, and Wine. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8970 FSC 0 Composite Food Packages Composite Food Packages Includes Ration Packs and Emergency Rations; Care Packages. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 8975 FSC 0 Tobacco Products Tobacco Products Includes Snuff; Cigarettes; Cigars. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9110 FSC 0 Fuels, Solid Fuels, Solid Includes Ration Heating Tablets; Cordwood; Charcoal; Briquettes; Coke. Excludes Peat. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9130 FSC 0 Liquid Propellants and Fuels, Petroleum Base Liquid Propellants and Fuels, Petroleum Base Note-This class includes liquid propellants with more than 50 percent or higher petroleum content. Includes All Aviation Gasoline; JP-1, 3, 4, and 5 Jet Fuel; Combat Vehicle and Automotive Gasoline (all types and grades); Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9135 FSC 0 Liquid Propellant Fuels and Oxidizers, Chemical Base Liquid Propellant Fuels and Oxidizers, Chemical Base Note-This class includes liquid propellants with more than 50 percent or higher chemical content. Includes Liquid chemicals designed exclusively for use as propellant fuels and oxidizers; Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Multiple-use chemicals, such as Nitrogen, Technical; Ammonia, Technical; Furfuryl Alcohol, Technical; Aniline, Technical; Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9140 FSC 0 Fuel Oils Fuel Oils Includes Light Burner Fuels; Diesel Fuels; Kerosine; Military Specification Type Residuals; Special and Heavy Grade Turbine Vessel Propulsion Fuels; Federal Specification Heavy Burner Fuels; Bunker "C" Commercial Grade Fuel; Heavy Fuel and other Black (Boiler Type) Fuels; Illuminating Oils. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9150 FSC 0 Oils and Greases: Cutting, Lubricating, and Hydraulic Oils and Greases: Cutting, Lubricating, and Hydraulic Includes Petrolatum, except USP. Excludes Rust Preventive Compounds; Antiseizing Compounds; Petrolatum, USP. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9160 FSC 0 Miscellaneous Waxes, Oils, and Fats Miscellaneous Waxes, Oils, and Fats Includes Animal, Vegetable, and Petroleum Waxes; Wool Grease (Lanolin); Tallow; Marine Oils; Coconut Oil; Soap Stock; Essential Oils, except USP or NF grades. Excludes Edible Fats and Oils; Household and Automobile Waxes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9310 FSC 0 Paper and Paperboard Paper and Paperboard Includes Book Paper Stock; Newsprint; Paperboard; Bulk Paper Materials. Excludes Corrugated Paper; Wrapping Paper; Building Board; Insulating Board; Stationery; Construction Paper; Paper Towels; Facial Tissues; Blank Books; Containers; Shipping and Identification Tags. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9320 FSC 0 Rubber Fabricated Materials Rubber Fabricated Materials Includes Natural and Synthetic Rubber Fabricated Materials, such as Rubber Sheets, Structural Rubber Shapes, Strips. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9330 FSC 0 Plastics Fabricated Materials Plastics Fabricated Materials Includes Cellulose Acetate and other plastics; Bars, Rods, Sheets, and Strips. Excludes Cable, Fiber Optic. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9340 FSC 0 Glass Fabricated Materials Glass Fabricated Materials Includes Glass Rods, Bars, and Tubing; Optical Glass Blanks; Structural and Building Glass; Glass Blocks. Excludes Insulators (FSC 5970); Ophthalmic Glass Blanks (FSC 6540); and Cable, Fiber Optics (FSCs 6015 and 6615). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9350 FSC 0 Refractories and Fire Surfacing Materials Refractories and Fire Surfacing Materials admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9390 FSC 0 Miscellaneous Fabricated Nonmetallic Materials Miscellaneous Fabricated Nonmetallic Materials Includes Cork Fabricated Basic Materials; Asbestos Fabricated Materials; Manufactured Mica; Minerals for scientific and technical use (cut but not mounted); Pottery Supplies; Catgut and Wormgut; Vegetable Brush Fibers; Bagasse. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9410 FSC 0 Crude Grades of Plant Materials Crude Grades of Plant Materials Includes Flavoring Materials; Crude Drugs of Plant-Origin; Crude Materials for Perfume; Tobacco, Unmanufactured. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9420 FSC 0 Fibers: Vegetable, Animal, and Synthetic Fibers: Vegetable, Animal, and Synthetic Includes Cotton, Wool, Silk, Horsehair, Rayon, and Nylon Fibers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9430 FSC 0 Miscellaneous Crude Animal Products, Inedible Miscellaneous Crude Animal Products, Inedible Includes Feathers and Downs, Unprocessed; Ivory; Bristles; Hides and Fur Skins, Crude. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9440 FSC 0 Miscellaneous Crude Agricultural and Forestry Products Miscellaneous Crude Agricultural and Forestry Products Includes Cereal Grains; Sugar Crops; Crude Rubber. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9450 FSC 0 Nonmetallic Scrap, Except Textile Nonmetallic Scrap, Except Textile admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9505 FSC 0 Wire, Nonelectrical Wire, Nonelectrical Note- This class contains bulk material only. Specially designed items should be placed in a more appropriate class. Wire is a thin, flexible, continuous length of metal, usually of circular cross-section. Includes Bulk Nonelectrical Wire Excludes Wire having electrical resistivity or conductivity rating (FSC 6145). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9510 FSC 0 Bars and Rods Bars and Rods Note This class contains bulk material only. Specially designed items should be placed in a more appropriae class. a. Bars are elongated pieces of metal of simple uniform cross-sections usually rectangular, circular, or hexagonal produced by forging or hot-rolling, also known as barstock. b. Rods are thin round metal bar, differentiated by dimensional parameters, listed in the item name definition. Includes Metal Bars and Rods Excludes Muck Bar (FSC 9640); Rods for Wire (FSC 9640); Sheet Bar (FSC 9640); Threaded Rods (FSC 5306); Grooved Rod (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9515 FSC 0 Plate, Sheet, Strip, Foil, and Leaf Plate, Sheet, Strip, Foil, and Leaf Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. The items covered by this class are all similar in that they are flat, generally rolled metal, the difference is covered by dsimensional parameters in the item name definition. Includes Armor Plate; Black Plate; Floor Plate; Leaf; Perforated Sheet and Strip; Shim Stock. Excludes Bale Ties (FSC 8135); Baling Bands (FSC 8135); Mending Plates (FSC 5340); Mounting Plates (FSC 5340); T Plates (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9520 FSC 0 Structural Shapes Structural Shapes Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. This class includes items usually used in building, bridge and similar construction, such as, I beams, angles, and the like. Includes Bar Size Shapes (under 3 inches); Metal Piles and Piling; Angles; Channels; Tees; Zees. Excludes Plate, Sheet and Strip Materials (FSC 9515). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9525 FSC 0 Wire, Nonelectrical, Nonferrous Base Metal Wire, Nonelectrical, Nonferrous Base Metal Excludes Wire having electrical resistivity or conductivity rating. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9530 FSC 0 Bars and Rods, Nonferrous Base Metal Bars and Rods, Nonferrous Base Metal admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9535 FSC 0 Plate, Sheet, Strip, and Foil; Nonferrous Base Metal Plate, Sheet, Strip, and Foil; Nonferrous Base Metal Includes Leaf; Perforated Sheet and Strips. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9540 FSC 0 Structural Shapes, Nonferrous Base Metal Structural Shapes, Nonferrous Base Metal Includes Angles; Channels; Tees; Zees. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9545 FSC 0 Plate, Sheet, Strip, Foil, and Wire: Precious Metal Plate, Sheet, Strip, Foil, and Wire: Precious Metal Includes Bars; Leaf; Ribbon; Rods; Tubing. Excludes Precious Metals for dental use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9610 FSC 0 Ores Ores Note-Only bulk material will be identified in this class. Ores are a naturally occurring material from which economically valuable minerals can be obtained. Includes Bauxite; Ferrous Ores; Lead Ores; Precious Metal Ores; Radioactive Metal Ores; Zinc Ores. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9620 FSC 0 Minerals, Natural and Synthetic Minerals, Natural and Synthetic Note-Only bulk material will be identified in this class. Minerals are naturally occurring substances with a characteristic chemical composition that can be expressed by a formula. Includes Clays and other Earths; Mica; Asbestos; Crude Petroleum; Graphite. Excludes Gravel (FSC 5610); Sand (FSC 5610); Abrasives (FSC 5350); Refractory Clays (FSC 9350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9630 FSC 0 Additive Metal Materials Additive Metal Materials Note-Only bulk material will be identified in this class. Additive metal materials are those which are added to metals to improve their characteristics as required (e.g., lead added to steel to improve the machinability). Includes Alloying Additives (Aluminum, Antimony, Copper, and Others). Excludes Fuel Inhibiting Additives (FSC 6850). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9640 FSC 0 Iron and Steel Primary and Semifinished Products Iron and Steel Primary and Semifinished Products Note-Only bulk material will be identified in this class. a. Primary products are raw unfinished ingots, pigs, that require refinement to be usable. b. Semi-finished items are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Pigs; Billets; Blooms; Muck Bar; Rods for Wire; Sheet Bar; Skelp; Tube Rounds. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9650 FSC 0 Nonferrous Base Metal Refinery and Intermediate Forms Nonferrous Base Metal Refinery and Intermediate Forms Note-Only Bulk material will be identified in this class. a. Refinery Forms are raw unfinished ingots, pigs, that require refinement to be usable. b. Intermediate forms are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Slabs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9660 FSC 0 Precious Metals Primary Forms Precious Metals Primary Forms Note-Only bulk material will be identified in this class. Primary Forms are raw unfinished ingots, pigs, that require refinement to be usable and are made of precious metals. Includes Bullion; Ingot. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9670 FSC 0 Iron and Steel Scrap Iron and Steel Scrap admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9680 FSC 0 Nonferrous Scrap Nonferrous Scrap admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9905 FSC 0 Signs, Advertising Displays, and Identification Plates Signs, Advertising Displays, and Identification Plates Includes Electric Signs; Sign Boards; Display Stands; Mannequins and other display forms; Printed Signs; General Purpose Identification Tags and Blanks, Nonpersonal; Plates and Tags for specific applications. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9910 FSC 0 Jewelry Jewelry Includes Jewelers' Findings; Precious Stones, Cut; Costume Jewelry; Natural Gems and Ornamental Stones, Cut. Excludes Watches; Clocks; Tableware; Scientific Instruments; Toilet Articles; Smokers' Articles; Industrial Diamonds. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9915 FSC 0 Collectors' and/or Historical Items Collectors' and/or Historical Items Includes Antiques; Artifacts; Coins; Stamps; Rare Books; Works of Art, Collectors and/or Historical Gems; Jewelry, and Cut Precious Stones; Natural History Items. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9920 FSC 0 Smokers' Articles and Matches Smokers' Articles and Matches Includes Cigarette Lighters; Lighter Fluid; Pipe Reamers; Ash Trays; Tobacco Humidors; Packaged Cigarette Paper. Excludes Ash receivers and lighters specifically designed for installation in or on equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9925 FSC 0 Ecclesiastical Equipment, Furnishings, and Supplies Ecclesiastical Equipment, Furnishings, and Supplies Includes Vestments; Altars; Communion Sets; Ecclesiastical Candelabra; Chalices; Patens; Altar Cloths; Ecclesiastical Statuary; Sacramental Wine. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9930 FSC 0 Memorials; Cemeterial and Mortuary Equipment and Supplies Memorials; Cemeterial and Mortuary Equipment and Supplies Includes Grave Markers; Burial Vaults; Burial Urns; Caskets; Burial Boxes; Morticians' Supplies; Monuments; Gasket Shipping Cases. Excludes Hearses; Mortuary Refrigerators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 -\N Cat 9999 FSC 0 Miscellaneous Items Miscellaneous Items Includes only those items which cannot conceivably be classified in any existing classes admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1005 FSC 0 Guns, through 30mm Guns, through 30mm Includes Machine Guns; Brushes, Machine Gun and Pistol. Excludes Turrets, Aircraft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1010 FSC 0 Guns, over 30mm up to 75mm Guns, over 30mm up to 75mm Includes Breech Mechanisms; Mounts; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic-Firing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1015 FSC 0 Guns, 75mm through 125mm Guns, 75mm through 125mm Includes Breech Mechanisms; Mounts; Rammers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1020 FSC 0 Guns, over 125mm through 150mm Guns, over 125mm through 150mm Includes Breech Mechanisms; Power Drives; Gun Shields. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1025 FSC 0 Guns, over 150mm through 200mm Guns, over 150mm through 200mm Includes Firing Platforms; Mounts; Gun Shields. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1030 FSC 0 Guns, over 200mm through 300mm Guns, over 200mm through 300mm Includes Gun Yokes; Rammers; Reflectors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1035 FSC 0 Guns, over 300mm Guns, over 300mm Includes Breech Mechanisms; Training Gears; Power Drives. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1040 FSC 0 Chemical Weapons and Equipment Chemical Weapons and Equipment Includes Flame Throwers; Smoke Generators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1045 FSC 0 Launchers, Torpedo and Depth Charge Launchers, Torpedo and Depth Charge Includes Depth Charge Tracks; Torpedo Tubes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1055 FSC 0 Launchers, Rocket and Pyrotechnic Launchers, Rocket and Pyrotechnic Includes Airborne Rocket Launchers adaptable to guided missile use. Excludes Specifically designed Airborne Guided Missile Launchers; Jettisonable Rocket Launchers; Launcher Fairings designed for specific airframes; Rifle Grenade Launchers; Grenade Launchers for Integral-Cartridge Grenades, Single-Shot or Auto-Loading or Automatic Firing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1070 FSC 0 Nets and Booms, Ordnance Nets and Booms, Ordnance Note-This class includes nets and booms for harbor defense only. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1075 FSC 0 Degaussing and Mine Sweeping Equipment Degaussing and Mine Sweeping Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1080 FSC 0 Camouflage and Deception Equipment Camouflage and Deception Equipment Includes Dummy Artillery, Aircraft and Vehicles; Garnished Nets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1090 FSC 0 Assemblies Interchangeable Between Weapons in Two or More Classes Assemblies Interchangeable Between Weapons in Two or More Classes Includes Components and Accessories used on or with weapons falling in two or more classes of Group 10. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1095 FSC 0 Miscellaneous Weapons Miscellaneous Weapons Includes Line Throwing Guns; Catapult Guns; Bayonets; Saluting Guns; Signal Guns; Flare Guns; Barrage Balloons; Accessories, not elsewhere classifiable, for weapons in this group; Expendable Bomb Dispensers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1105 FSC 0 Nuclear Bombs Nuclear Bombs Note-This class includes nuclear weapons (including bombs), which are designed to be dropped from an aircraft. Includes Ballistic cases, tail assemblies, retardation devices, and other peculiar components which are not classifiable elsewhere. Excludes Parachute canopies and canopy hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1110 FSC 0 Nuclear Projectiles Nuclear Projectiles Note- This class includes nuclear weapons which are designed to be propelled from a recoilless rifle, gun, howitzer, or the like, and which are not designed to be self-propelled. Includes Ogive sections, body sections, bases, and other peculiar components which are not classifiable elsewhere. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1115 FSC 0 Nuclear Warheads and Warhead Sections Nuclear Warheads and Warhead Sections Note This class includes nuclear warheads (without or assembled with case sections, adaption kits, and/or fuzing and firing components) which are to be used in or with bombs, rockets, projectiles, missiles, demolition charges, or the like. Also includes case sections, nose cones, flare sections, center sections, and auxiliary structural components of missiles, rockets, and re-entry vehicles which are designed or constructed for exclusive use with or for housing of nuclear warheads and/or warhead sections. Includes Components and parts peculiar to the warhead or warhead section, which are not classifiable in more specific classes. Excludes Such components as fuzing and firing devices, nuclear components, high explosive components, classifiable in more specific classes, and items such as projectiles and bombs which include the entire outer case of a weapon. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1120 FSC 0 Nuclear Depth Charges Nuclear Depth Charges Note-This class includes nuclear weapons which consist of depth charge bodies assembled with nuclear warheads. It includes training weapons and all specially designed components which are not classifiable elsewhere. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1125 FSC 0 Nuclear Demolition Charges Nuclear Demolition Charges Note-This class includes nuclear weapons which are designed to be emplaced in or near a structure, area, or the like, which is to be destroyed. The weapons may include accessories. Includes Outer cases, case sections, and other peculiar components, which are not classifiable elsewhere. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1127 FSC 0 Nuclear Rockets Nuclear Rockets Note-This class includes nuclear weapons, consisting of rocket bodies assembled with nuclear warheads, which comprise a single item of supply and are issued as such. Includes Components peculiar to assembled rockets which are not classifiable elsewhere. Excludes Rocket Motors; Warhead Components; Rocket Components classified in other FSC classes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1130 FSC 0 Conversion Kits, Nuclear Ordnance Conversion Kits, Nuclear Ordnance Note-This class includes collections of items used for the purpose of converting nuclear weapons from one configuration to another. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1135 FSC 0 Fuzing and Firing Devices, Nuclear Ordnance Fuzing and Firing Devices, Nuclear Ordnance Includes such items as fuzes, power supplies, firing sets, x-units, cables, safing devices, adaption kits, and re-entry vehicle nuclear ordnance arming and fuzing systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1140 FSC 0 Nuclear Components Nuclear Components Includes All components which contain or simulate nuclear active materials. Excludes end items, such as bombs, projectiles, warheads, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1145 FSC 0 Explosive and Pyrotechnic Components, Nuclear Ordnance Explosive and Pyrotechnic Components, Nuclear Ordnance Note-This class includes actual and simulated explosive and pyrotechnic components peculiar to all nuclear ordnance end items, such as bombs, demolition charges, rockets, projectiles, warheads, and related systems. Excluded from this class are all explosive and pyrotechnic components designed for other than nuclear ordnance applications. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1190 FSC 0 Specialized Test and Handling Equipment, Nuclear Ordnance Specialized Test and Handling Equipment, Nuclear Ordnance Includes Specially designed trucks and trailers for nuclear ordnance; Specially designed slings and hoists; Operational, test, and setting devices, and cradles; Conditioning Kits and Sets, Controlled Environment. Excludes Hand tools; Instruments for use on both nuclear ordnance and other equipment; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes in the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1195 FSC 0 Miscellaneous Nuclear Ordnance Miscellaneous Nuclear Ordnance Includes Items common to more than one class or items not properly fitting into the foregoing classes of nuclear ordnance. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1210 FSC 0 Fire Control Directors Fire Control Directors admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1220 FSC 0 Fire Control Computing Sights and Devices Fire Control Computing Sights and Devices admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1230 FSC 0 Fire Control Systems, Complete Fire Control Systems, Complete Note-This class includes only complete fire control systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in fire control systems are classified in classes other than this class. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1240 FSC 0 Optical Sighting and Ranging Equipment Optical Sighting and Ranging Equipment Includes Periscopes for Submarines; Range and Height Finders; Telescopic Sights; Optical Instruments Integrated with Fire Control Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1250 FSC 0 Fire Control Stabilizing Mechanisms Fire Control Stabilizing Mechanisms admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1260 FSC 0 Fire Control Designating and Indicating Equipment Fire Control Designating and Indicating Equipment Includes Turret, Gun, Torpedo Mount, and Searchlight Indicating Equipment; Target Designating Equipment; Synchro Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1265 FSC 0 Fire Control Transmitting and Receiving Equipment, except Airborne Fire Control Transmitting and Receiving Equipment, except Airborne Includes Fire Control Transmitters, Transmitter-Receivers, Receivers, Receiver-Regulators. Excludes Fire Control Transmitting and Receiving Equipment, Specially Designed for use on or with Fire Control Radar Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1270 FSC 0 Aircraft Gunnery Fire Control Components Aircraft Gunnery Fire Control Components Includes Turrets, Aircraft; Computers, specifically designed; Complete Gyro Mechanisms. Excludes Gun Chargers; Ammunition Boxes; Gun Heaters; Field and Link Chutes; Ammunition Boosters; Gyro Components; Complete Fire Control Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1280 FSC 0 Aircraft Bombing Fire Control Components Aircraft Bombing Fire Control Components Includes Computers, specifically designed; Complete Gyro Mechanisms; Optical Instruments for Bombing Fire Control. Excludes Gyro Components; Optical Elements, such as Lens, Prisms, Filters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1285 FSC 0 Fire Control Radar Equipment, except Airborne Fire Control Radar Equipment, except Airborne Includes Radar Sets, Assemblies, Subassemblies, and Components Specially Designed for use on or with Fire Control Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1287 FSC 0 Fire Control Sonar Equipment Fire Control Sonar Equipment Note-This class includes airborne, shipborne, and submarineborne sonar sets, assemblies, subassemblies, and components designed specificially for use with underwater fire control equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1290 FSC 0 Miscellaneous Fire Control Equipment Miscellaneous Fire Control Equipment Includes Fuze Setters; Ordnance Cable Systems; Aiming Circles; Flash and Sound Ranging Sets; Fire Control Components and Subassemblies Not Classifiable in Other Classes of Group 12. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1305 FSC 0 Ammunition, through 30mm Ammunition, through 30mm Includes Components. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1310 FSC 0 Ammunition, over 30mm up to 75mm Ammunition, over 30mm up to 75mm Includes Components, except Fuzes and Primers; Chemical Warfare Cartridges. Excludes Fuzes and Primers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1315 FSC 0 Ammunition, 75mm through 125mm Ammunition, 75mm through 125mm Includes Components, except Fuzes and Primers; Pyrotechnic Cartridges and Projectiles; Chemical Warfare Cartridges and Projectiles. Excludes Fuzes and Primers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1320 FSC 0 Ammunition, over 125mm Ammunition, over 125mm Includes Components, except Fuzes and Primers; Chemical Warfare Projectiles. Excludes Fuzes and Primers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1325 FSC 0 Bombs Bombs Includes Components; Photoflash Bombs; Chemical Warfare Bombs; Bomb Clusters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1330 FSC 0 Grenades Grenades Includes Components; Hand and Rifle Grenades; Smoke Grenades. Excludes Firing Devices (Launchers). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1336 FSC 0 Guided Missile Warheads and Explosive Components Guided Missile Warheads and Explosive Components Includes Warheads Containing Military Chemical Agents; Exercise Heads, Guided Missile. Excludes Atomic Ordnance Warheads; All other Warheads for use on other than guided missiles; Liquid Propulsion Units; Rocket Engines (Liquid Propellant Units); JATO Units; Rocket Motors (Solid Propellant Units) for Guided Missiles; Solid Fuel Propulsion Units; Propellant Chemicals encased in consumable containers, such as squibs and cartridges for insertion into missile propulsion systems as integral parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1337 FSC 0 Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components Guided Missile and Space Vehicle Explosive Propulsion Units, Solid Fuel; and Components Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; All Explosive Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Solid Propellants encased in consumable containers, such as squibs and cartridges, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets; Solid Propellants predetermined to specific quantity and quality, but packaged in reusable containers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1338 FSC 0 Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components. Guided Missile and Space Vehicle Inert Propulsion Units, Solid Fuel; and Components. Includes Rocket Motors (Solid Propellant Units) for Guided Missiles, Inert-Loaded or Empty; All Inert (Nonexplosive) Components for Guided Missile and Space Vehicle Solid Fuel Propulsion Units. Excludes Rocket Motors (Solid Propellant Units) for Guided Missiles, Explosive-Loaded; Guided Missile Warheads and Components; Rocket Propulsion Units; Rocket Motors (Solid Propellant Units) for Rockets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1340 FSC 0 Rockets, Rocket Ammunition and Rocket Components Rockets, Rocket Ammunition and Rocket Components Includes Complete Rounds; Explosive Components, Including Warheads; Pyrotechnic Rockets; Solid Fuel JATO Units; Rocket Motors (Solid Propellant Units) for Rockets; Covers, Protective Rocket Warhead; Jettisonable Rocket Launchers; Conditioning Kits and Sets, Controlled Environment; and other peculiar components which are not classified elsewhere. Excludes Nuclear rockets, Nuclear warheads; all other warheads for use on other than rockets; and rockets with built-in guiding devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1345 FSC 0 Land Mines Land Mines Includes Components; Antipersonnel Mines; Antitank Mines; Fuzes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1346 FSC 0 Remote Munitions Remote Munitions Munitions items/systems that are not held by the soldier but are deployed for future activation. They may be put in place separately by the soldier or delivered from vehicles or aircraft by mechanical distribution methods. They may be command controlled or may use self - initiated firing systems that do not require soldier monitoring. All items in this class can be armed/disarmed remotely. Remote Munition Items and Systems used singularly or in combination to defeat a variety of threats; Fuzes; Safe and Arming devises; Self Destruction Mechanisms; Communication Modules; Command and Control systems and various other pertinent components. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1350 FSC 0 Underwater Mine and Components, Inert Underwater Mine and Components, Inert Includes Parachute Packs; Inert Mine Cases; Booster Cans; Clock Delays; Clock Starters; Search Coils; Extenders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1351 FSC 0 Underwater Mines and Components, Explosive Underwater Mines and Components, Explosive Includes Loaded Cases; Boosters; Detonators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1352 FSC 0 Underwater Mine Disposal Inert Devices Underwater Mine Disposal Inert Devices Note: Version of Underwater Mine Disposal Explosive Device without destructive charge. Intended for underwater mine hunting and reconnaissance. May also be used for training purposes. Includes: Complete operating units, such as an underwater mine reconnaissance device, as well as component parts, practice, training, blank, and dummies. Excludes: Torpedo Inert components, depth charges, and underwater mines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1353 FSC 0 Underwater Mine Disposal Explosive Devices Underwater Mine Disposal Explosive Devices Note: Complete explosive devices, including destructive charge. It is fired, guided to target and detonated from a vessel or other remote site. Includes Complete explosive device, including ammunition, detonating charge, and component parts. Excludes Underwater Mine Explosive Components (FSC 1351), Torpedo Explosive Components (FSC 1356), Military Chemical Agents (FSC 1365). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1355 FSC 0 Torpedos and Components, Inert Torpedos and Components, Inert admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1356 FSC 0 Torpedos and Components, Explosive Torpedos and Components, Explosive Includes Warheads; Boosters; Detonators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1360 FSC 0 Depth Charges and Components, Inert Depth Charges and Components, Inert Includes Inert Firing Mechanisms; Pistols without Detonators; Extenders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1361 FSC 0 Depth Charges and Components, Explosive Depth Charges and Components, Explosive Includes Cases; Boosters; Detonators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1365 FSC 0 Military Chemical Agents Military Chemical Agents Includes War Gases; Screening Smokes; Incendiary and thickening Agents; Signaling Smokes. Excludes Ammunition containing Military Chemical Agents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1367 FSC 0 Tactical Sets, Kits, and Outfits Tactical Sets, Kits, and Outfits A collection of items, which are used for a specific purpose. Each collection must include at least one item of ordnance classified in Group 13. Ordnance may be non-lethal (as defined in the Department of Defense Directive 3000.3). These sets, kits and outfits may include such items as uniforms, weapons, body armor, and the like. By themselves, each of these components belongs in an FSC other than 1367. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1370 FSC 0 Pyrotechnics Pyrotechnics Includes Flares; Signals; Fireworks; Pistol Rocket Signals. Excludes Pyrotechnic Cartridges and Projectiles; Photoflash Bombs; Pyrotechnic Rockets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1375 FSC 0 Demolition Materials Demolition Materials Includes Items for construction, quarrying and demolition work such as Dynamite and other explosives packed in cylindrical paper cartridges or in bags, Demolition Charges, Blasting Caps, Blasting Time Fuses, Detonating Cord, Demolition Firing Devices; Booby Trap Mechanisms; Bangalore Torpedoes; Inert accessories and components such as Blasting Machines, Priming Adapters, and Detonating Cord Clips. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Safety-in-Flight Explosive Items and Devices such as, Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers, and similar items, as shown in the indexes to the FSC, Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Nuclear Ordnance Components; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1376 FSC 0 Bulk Explosives Bulk Explosives Includes Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Explosive Loaded Devices and Components as shown in the indexes to the FSC. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants encased in consumable containers, for insertion into missile propulsion systems as integral parts; Guided Missile Explosive Devices; Blasting and Demolition Materials; Safety-in-Flight Explosive Items and Devices such as Impulse Cartridges, Delay Cartridges, Aircraft Ejection Seat Catapults, Aircraft Canopy Removers; Rocket and Guided Missile Motors, Warheads, and Propulsion Sections; similiar items, as shown in the indexes to the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1430 FSC 0 Guided Missile Remote Control Systems Guided Missile Remote Control Systems Note-This class includes airborne and nonairborne guided missile remote control systems, components, and accessories, designed specifically for use therewith. Excluded from this class are fire control assemblies, subassemblies, and components modified for use with guided missile remote control systems, and fire control assemblies designed specifically for shipboard use. Includes Specially Designed Components of Guided Missile Remote Control Systems. Excludes Guided Missile Internal (Built-in) Control Systems; Components used in both guided missiles and other than guided missiles (including fire control components). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1440 FSC 0 Launchers, Guided Missile Launchers, Guided Missile Includes Airborne and Nonairborne Guided Missile Launchers. Excludes Aircraft Launchers; Rocket Launchers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1377 FSC 0 Cartridge and Propellant Actuated Devices and Components Cartridge and Propellant Actuated Devices and Components Note-This class includes safety-in-flight explosive items, consisting of a quantity of propellant (either encased in a cartridge or in molded form) and a means of activation, designed to be inserted into or attached to one or more devices to provide the energy required to operate devices requiring a time delay, or not requiring a time delay, in their operating sequence. Also included are devices designed to utilize energy generated by the items described above. Includes Impulse Cartridges; Delay Cartridges; Engine Starter Cartridges (explosive filled); Fire Extinguisher Cartridges (used to activate by remote control); Aircraft Ejection Seat Catapults; Rocket Motors (Solid Propellant Units) for Aircraft Ejection Seats; Aircraft Canopy Removers; Thrusters, propellant and cartridge actuated; Initiators; Explosive Bolts and Explosive Bolt Cartridges; Cutters, cartridge or propellant actuated, Reefing Line; Powder actuated Tool Cartridges; Explosive Loaded Devices and Components which are not specifically classified elsewhere. Excludes Liquid Propellant Fuels and Oxidizers; Solid Propellants, encased in consumable containers for insertion into missile propulsion systems as an integral part; Guided Missile Explosive Devices; Bulk and Solid Propellants, predetermined to specific quantity and quality, packaged in reusable containers; Blasting and Demolition Materials; Rocket Motors, Warheads and Propulsion Sections for Rockets and Guided Missiles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1385 FSC 0 Surface Use Explosive Ordnance Disposal Tools and Equipment Surface Use Explosive Ordnance Disposal Tools and Equipment Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD) personnel. Excludes Nonspecialized or common tools and equipment not developed exclusively for use by qualified EOD personnel; specialized demolition material; explosive loaded shaped charges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1386 FSC 0 Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment Underwater Use Explosive Ordnance Disposal and Swimmer Weapons Systems Tools and Equipment Note-This class includes only specialized tools and equipment developed for and used by qualified Explosive Ordnance Disposal (EOD), personnel, Underwater Demolition Teams (UDT), and/or Sea-Air-Land (SEAL) personnel Excludes Nonspecialized or common tools not developed exclusively for use by qualified EOD, UDT, and/or SEAL personnel; specialized demolition material; explosive loaded shaped charges admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1390 FSC 0 Fuzes and Primers Fuzes and Primers Note-This class includes only fuzes and primers for use in ammunition classified in Classes 1310, 1315, and 1320. Excludes Fuzes and Primers for ammunition not classified in Classes 1310, 1315, and 1320. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1395 FSC 0 Miscellaneous Ammunition Miscellaneous Ammunition Includes Ammunition Shapes, such as Blanks, Disks, Slugs, Cups, and Rotating Bands (Shell Bands). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1398 FSC 0 Specialized Ammunition Handling and Servicing Equipment Specialized Ammunition Handling and Servicing Equipment Includes Handling and servicing equipment specially designed for use on or with rockets and conventional ammunition. Excludes Handling and servicing equipment specially designed for use on or with rocket and pyrotechnic launchers; Ammunition maintenance and repair shop specialized equipment; Handling equipment specially designed for aircraft or airfield use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1410 FSC 0 Guided Missiles Guided Missiles Note-This class includes only complete guided missiles, with or without warheads and explosive components, whether in assembled or unassembled form. End items, assemblies, parts, attachments, or accessories for use in or on guided missiles are classified in classes other than this class. Includes Complete Drones, initially designed as missiles, but converted to drone use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1420 FSC 0 Guided Missile Components Guided Missile Components Includes Structural Components; Components and Accessories Specially Designed for use on or with guided missiles, including Complete Gyro Mechanisms, Hydraulic Pumps, Automatic Pilot Mechanisms and Specially Designed Assemblies, and Electronic Guidance Equipment installed in missiles. Excludes Electronic Remote Guidance Equipment used to guide missiles; Solid and Liquid Propellant Units; Components of Gyro Mechanisms. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1425 FSC 0 Guided Missile Systems, Complete Guided Missile Systems, Complete Note-This class includes only complete guided missile systems. Anything less than a complete system, such as individual end items, assemblies, parts, attachments, or accessories for use in guided missile systems are classified in classes other than this class. Excludes Guided Missile Subsystems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1427 FSC 0 Guided Missile Subsystems Guided Missile Subsystems Note-This class includes only combinations or assemblies of two or more end items, each of which is properly classified in other classes of this group, identified as single items of supply. Excluded from this class are individual end items, assemblies, subassemblies, attachments, accessories or parts classified in other classes of this group, not combined as single items of supply. Excludes Complete Guided Missile Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1450 FSC 0 Guided Missile Handling and Servicing Equipment Guided Missile Handling and Servicing Equipment Includes Specially Designed Trucks and Trailers for use in transporting guided missiles; Specially Designed Slings, Hoists, Jacks, and Blowers; Self-propelled Vehicles and Trailers, Specially Designed for Guided Missile Handling or Servicing; Covers, Guided Missile; Conditioning Kits and Sets, Controlled Environment. Excludes Guided Missile Launchers (FSC 1440); Aircraft Handling and Servicing Equipment (FSC 1730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1510 FSC 0 Aircraft, Fixed Wing Aircraft, Fixed Wing Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on fixed wing aircraft are classified in classes other than this class. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1520 FSC 0 Aircraft, Rotary Wing Aircraft, Rotary Wing Note-This class includes only complete aircraft. End items, assemblies, parts, attachments, or accessories for use in or on rotary wing aircraft are classified in classes other than this class. Includes Helicopters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1540 FSC 0 Gliders Gliders Note-This class includes only complete gliders. End items, assemblies, parts, attachments, or accessories for use in or on gliders are classified in classes other than this class. Includes Motorized Gliders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1550 FSC 0 Drones Drones Note-This class includes only complete drones. End items, assemblies, parts, attachments, or accessories for use in or on drones are classified in classes other than this class. Includes Drones specifically designed for such uses as targets, training, surveillance, missile evaluation, and photographic reconnaissance. Excludes Piloted aircraft and guided missiles converted to drone use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1560 FSC 0 Airframe Structural Components Airframe Structural Components Note-This class includes fabricated system parts that are permanently attached or peculiar to the integral airframe of an aircraft, such as support structural components, spars, ribs, ailerons, stabilizers, bulkheads. Includes Flight Control Surfaces; Internal and External Auxiliary Fuel Tanks; Exhaust Systems; Pylons, Trim Tabs; Aircraft. Excludes Fitted Covers; Helicopter Rotor Brake System Components; Aircraft Loose Equipment and Alternate Mission Configuration Equipment stored on board the aircraft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1610 FSC 0 Aircraft Propellers and Components Aircraft Propellers and Components Includes Aircraft Propellers; Propeller Blades, Cams, Cones, Hubs, Nuts, and Spinners; Test Clubs; Synchronizers; Power Control Units; Integral Oil Control Measures and Propeller Governors. Excludes Rotary Rudder and Rotary Wing Blades (FSC 1615). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1615 FSC 0 Helicopter Rotor Blades, Drive Mechanisms and Components. Helicopter Rotor Blades, Drive Mechanisms and Components. Note-This class includes miscellaneous component parts specifically designed for, and used exclusively in, helicopter drive mechanisms and rotor blades when not specifically classified elsewhere in the FSC indexes. Includes Helicopter dynamic components and specially designed parts that transmit power from the aircraft power plant to the rotary wing and rotary rudder. Also included in this class are Rotors; Blades; Rotor Blade, Trim, Tabs; Blade Sets; Yokes; Clutches and Transmissions. Excludes Propellers (FSC 1610); Rotor Brake Systems Components (FSC 1630); Rotor Blade Hydraulic Folding System Components (FSC 1650); Hydraulic Servo System Components (FSC 1650). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1620 FSC 0 Aircraft Landing Gear Components Aircraft Landing Gear Components Includes Shock Struts and Components; Installation Elements, such as Torsion Bars, Vibration Links, Drag Struts; Landing Gear Trunions, Axles and Shimmy Dampeners; Specially designed hydraulic power steering system components. Excludes Mounting Braces and Mounting Plates permanently installed on aircraft (FSC 1680); Landing Wheels, Skis, and Floats (FSC 1630); Wheel Brakes and Wheel Brake Cylinders (FSC 1630). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1630 FSC 0 Aircraft Wheel and Brake Systems Aircraft Wheel and Brake Systems Includes Skis; Floats; Tracks; Landing Wheel Skid Detectors; Valves specifically designed for use with hydraulic or pneumatic wheel and brake systems; Helicopter Rotor Brake System Components. Excludes Landing Gear Axles (FSC 1620). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1640 FSC 0 Aircraft Control Cable Products Aircraft Control Cable Products Note - Wire rope, with attachments or terminations and pulleys, used in aircraft control applications, will be classified in this class. Includes Wire Rope; Single Leg Wire Assemblies; Wire Strands; Control Pulleys; Turnbuckle Lock Clips and other wire rope attachments and terminations. Excludes General use Chain and Wire Rope (FSC 4010); general use Pulleys (FSC 3020); general use Miscellaneous Hardware (FSC 5340); general use Fittings for Rope, Cable and Chain (FSC 4030). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1650 FSC 0 Aircraft Hydraulic, Vacuum, and De-icing System Components Aircraft Hydraulic, Vacuum, and De-icing System Components Note-This class includes only those components specifically designed for aircraft use. Includes Hydraulic and Pneumatic Accumulators, Pumps, Motors, Actuating Cylinders, and Filters; De-icing Boots; Fluid Type De-icing Pumps, Valves and Filters; Vacuum System Oil Separators; Pneumatic Pressurization Equipment other than that for pressurizing cabins and compartments. Excludes Jet Engine Hydraulic Components (FSC 2840); Valves specifically designed for air conditioning, heating, ventilating, cabin pressurizing, and thermal de-icing (FSC 1660); Valves specifically designed for use with Aircraft Engines (FSC 2840); Guided Missiles and Guided Missile Engines (FSC 1338), Landing Gear (FSC 1620), Wheel and Brake System Components (FSC 1630); Oxygen Breathing System Components (FSC 1660); In-flight Refueling System Hydraulic components (FSC 1680); Specifically designed hydraulic power steering system components (FSC 1620). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1660 FSC 0 Aircraft Air Conditioning, Heating, and Pressurizing Equipment Aircraft Air Conditioning, Heating, and Pressurizing Equipment Note-This class includes components specifically designed for use in aircraft air conditioning, heating, and pressurizing equipment. Also included are specially designed components of oxygen breathing systems used in aircraft. Includes Cabin Supercharging Equipment; Canisters; Cylinder Assemblies; Masks; Fixed Oxygen System; Specially Designed Aircraft Valves; Cabin Pressure Regulators; Heat Exchangers; Air Expansion Turbines; Aircraft Heaters; Ventilating System Components; Air Conditioning and Heating Duct Assemblies; Thermal De-icing Equipment; Cabin and Compartment Pressurizing Equipment; Air Diffusers; Cabin Pressure Selectors; Liquid Oxygen Converters. Excludes Oxygen Pressure Signals and Warning Devices; Tubing; Ground Type Heaters and Coolers; Pressurizing Equipment other than that used for Cabin and Compartment Pressurization; Fluid De-icing Equipment; Valves specifically designed for use with Aircraft Engines, Guided Missiles, and Guided Missile Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1670 FSC 0 Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment Parachutes; Aerial Pick Up, Delivery, Recovery Systems; and Cargo Tie Down Equipment Note-Includes specifically designed items, sets, and systems for air-to-air, air-to-surface, and surface-to-air delivery, pick up, and recovery operations, unless parts, attachments, assemblies, for use in or on such systems (i.e., space vehicle aerial recovery systems) are specifically indexed to other classes of the FSC (i.e., Transmitting Radio Buoys and Direction Finding Subsystem Components). Excludes Fitting Assemblies built into the aircraft structure. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1680 FSC 0 Miscellaneous Aircraft Accessories and Components Miscellaneous Aircraft Accessories and Components Includes Control Assemblies, Push-Pull; Brace, Positioning Cargo Ramp stowed on board; Cockpit Mounted Control Quadrants; Actuators, Electro-Mechanical and Mechanical; Ventilators; Relief Tubes; Map Holders; Aerial Glider Towing Accessories attached to Aircraft; Belts, Safety and Lap; Harness, Shoulder and Safety; Litter Attaching Supports;Electric Windshield Wipers;Aircraft Onboard Inert Gas Generators;Aircraft Furniture;Aircraft Mounted Winches and Hoists;In-Flight Refueling System Components, including Fuel Components;Aircraft Curtains;Cable Tension Regulators;Sun Visors;Rear-View Mirrors;Mechanical Transmissions, Gearboxes and Constant Speed drives Specially designed for aircraft. Excludes Engine Mounted Control Assemblies; Fitted Covers, Aircraft Pylons; Helicopter Roter Brake System Components; Helicopter Automatic Stabilization Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1710 FSC 0 Aircraft Landing Equipment. Aircraft Landing Equipment. Includes Aircraft Arresting Barriers. Excludes Airport Runway Marker Lights (FSC 6220). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1720 FSC 0 Aircraft Launching Equipment Aircraft Launching Equipment Includes Catapults. Excludes Guided Missile Launchers (FSC 1440) and Space Vehicle Launchers (FSC 1840). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1730 FSC 0 Aircraft Ground Servicing Equipment Aircraft Ground Servicing Equipment Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, 2540, 2590. Includes Energizers; Engine Preheaters; Mooring Assemblies; Wheel Chocks; Beaching Equipment; Aileron, Elevator, and Rudder Locks; Passenger Loading Ramps; Maintenance Platforms; Aircraft Maintenance and Boarding Ladders; Aircraft Maintenance Slings and Hoists; Aircraft Fin Tilting Jacks; Airfield Specialized Lift Trucks and Trailers; Fitted Covers for Airframe Components; Aircraft Engine Covers. Excludes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies (FSC 1740); Maintenance Stands designed for support of aircraft assemblies during repair or overhaul (FSC 4920); Test Stands (FSC 4920); General Purpose Jacks (FSC 5120); Slings (FSC 3940), and Hoists (FSC 3950); Trailers (FSC 2330), Liquid Oxygen, Aircraft Servicing (FSC 1660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1740 FSC 0 Airfield Specialized Trucks and Trailers Airfield Specialized Trucks and Trailers Note-This class excludes "vehicular components" such as those listed under FSC's 2520, 2530, and 2590. Includes Airfield Specialized Trucks and Trailers designed primarily for transporting aircraft assemblies; Trailers: Afterburner, Engine, Propeller, Fuselage, and Wing; Trucks, Aircraft Fuselage and Aircraft Wing; Skids, Engine Transport; Stands, Engine Transport; Bomb Trailers, Airfield; Trucks, Crashed Aircraft Removing. Excludes Airfield Specialized Lift Trucks (FSC 3930), and Trailers (FSC 2330); Highway Type Trucks (FSC 2320), and Trailers (FSC 2330); Cargo Loading and Unloading Trailers (FSC 2330) and Trucks (FSC 2320). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1810 FSC 0 Space Vehicles Space Vehicles Note-This class includes only complete space vehicles, whether in assembled or unassembled form. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1820 FSC 0 Space Vehicle Components Space Vehicle Components Includes Structural Components; Components and Accessories specially designed for installation in or on Space Vehicles; Internal (Built-in) Control Systems. Excludes Remote Guidance Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1830 FSC 0 Space Vehicle Remote Control Systems Space Vehicle Remote Control Systems Includes Specifically designed Components of Space Vehicle Remote Control Systems. Excludes Internal (Built-in) Control Systems; Components designed for use with both Guided Missile and Space Vehicle Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1840 FSC 0 Space Vehicle Launchers Space Vehicle Launchers Includes Launchers specifically designed for Space Vehicles. Excludes Launchers used with both Guided Missiles and Space Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1850 FSC 0 Space Vehicle Handling and Servicing Equipment Space Vehicle Handling and Servicing Equipment Note-This class does not include space vehicle aerial recovery system which are classified in Class 1670. Includes Specially designed Trucks and Trailers for use in transporting Space Vehicles; Specially designed Slings, Hoists, Jacks, and Blowers, Self-propelled Vehicles, specially designed for space vehicle handling or servicing; Covers, space vehicle Excludes Equipment used in handling or servicing both Guided Missile and Space Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1860 FSC 0 Space Survival Equipment Space Survival Equipment Includes Food and Water Production Equipment; Air Production Equipment; Shelter Equipment; Power Generation and Conversion Equipment. Excludes Items which are integral components of Space Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1905 FSC 0 Combat Ships and Landing Vessels Combat Ships and Landing Vessels Includes Aircraft Carriers; Battleships; Cruisers; Destroyers; Submarines; Frigates and Corvettes; Gunboats; Motor Torpedo Boats; Subchasers; Landing Barges; Minelaying and Mine Sweeping Craft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1910 FSC 0 Transport Vessels, Passenger and Troop Transport Vessels, Passenger and Troop admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1915 FSC 0 Cargo and Tanker Vessels Cargo and Tanker Vessels admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1920 FSC 0 Fishing Vessels Fishing Vessels admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1925 FSC 0 Special Service Vessels Special Service Vessels Includes Tugs; Towboats; Fire Boats; Ice Breakers; Repair Ships; Tender Vessels (Buoy, Lighthouse, Destroyer); Lightships; Cable Ships; Salvage and Submarine Rescue Vessels. Excludes Combat Vessels; Dredges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1930 FSC 0 Barges and Lighters, Cargo Barges and Lighters, Cargo Includes Aircraft Lighters, Car Floats, and other Transportation Barges, Depot Barges; Scows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1935 FSC 0 Barges and Lighters, Special Purpose Barges and Lighters, Special Purpose Includes Derrick, Piledriver, and Rock Cutter Barges; Barrage Balloon, Catapult Lighter, and Torpedo Testing Barges; Concrete Mixing Plant, Mechanical Bank Grader, and other Bank Revetment Barges; Fire, Smudge Removal, and other Pump Barges; Houseboats, except Yacht Type; Power Plant Barges; Refrigeration Barges; Barge Mounted Cranes, Flexible Towed Barges. Excludes Combat Landing Barges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1940 FSC 0 Small Craft Small Craft Includes Powered and Unpowered Small Craft; Lifesaving Boats; Airplane Crash Boats; Reconnaissance Boats; Yachts; Pneumatic Boats. Excludes Fishing Craft; Life Rafts, including Pneumatic; Bridge Floats and Pontoons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1945 FSC 0 Pontoons and Floating Docks Pontoons and Floating Docks Includes Camels; Pontoon Stanchions; Pontoon Ramps. Excludes Floating Drydocks; Bridge Floats and Pontoons; Pontoon Hardware (Jewelry). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1950 FSC 0 Floating Drydocks Floating Drydocks admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1955 FSC 0 Dredges Dredges Includes Dredges, without Hull; Ocean-Going Dredges; Floating Dredges. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 1990 FSC 0 Miscellaneous Vessels Miscellaneous Vessels Includes Commercial Sailing Vessels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2010 FSC 0 Ship and Boat Propulsion Components Ship and Boat Propulsion Components Includes Propulsion Shafts; Ship Proppellers. Marine Transmissions, Reverse and Reduction Gear Type. Excludes Engines (FSC 2810, 2815); Turbines (FSC 2825, 2835, 2840). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2020 FSC 0 Rigging and Rigging Gear Rigging and Rigging Gear Includes Masts; Kingposts; Sail Booms; Shipborne Booms not attached to Cranes and Derricks. Excludes Tackle Blocks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2030 FSC 0 Deck Machinery Deck Machinery Includes Steering Gears and Controls; Boat Davits. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2040 FSC 0 Marine Hardware and Hull Items Marine Hardware and Hull Items Includes Anchors; Grapnels; Sea Anchors; Watertight Doors; Ship Ventilators; Hatches; Manholes; Scuttles; Air Ports; Fenders; Sea Chests; Scuppers; Rudders; Stern Tubes; Chain Pipes; Hawse Pipes; Boiler Uptakes and Stacks; Chocks; Mast and Boom Fittings; Oars; Paddles; Oarlocks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2050 FSC 0 Buoys Buoys admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2060 FSC 0 Commercial Fishing Equipment Commercial Fishing Equipment Excludes Fishing Vessels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2090 FSC 0 Miscellaneous Ship and Marine Equipment Miscellaneous Ship and Marine Equipment Includes Sails; Chain Ladders; Rope Ladders; Marine Furniture. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2210 FSC 0 Locomotives Locomotives Note-This class includes only complete locomotives and tenders. End items, assemblies, parts, attachments, or accessories for use in or on locomotives and tenders are classified in classes other than this class. Excludes Self-Propelled Cars. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2220 FSC 0 Rail Cars Rail Cars Note-This class includes only complete rail cars. End items, assemblies, parts, attachments, or accessories for use in or on rail cars are classified in classes other than this class. Includes Trailed Cars; Self-Propelled Cars. Excludes Aerial Tramway Cars. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2230 FSC 0 Right-of-Way Construction and Maintenance Equipment, Railroad Right-of-Way Construction and Maintenance Equipment, Railroad Includes Rail Laying, Joining and Shifting Equipment; Self-propelled and Car Mounted Cranes. Excludes Hand Tools (FSG 51). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2240 FSC 0 Locomotive and Rail Car Accessories and Components Locomotive and Rail Car Accessories and Components Includes Brake Beams and Components; Couplers; Trucks and Components; Journals and Components; Wheel Sets and Components. Excludes Railroad Furniture (FSG 71). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2250 FSC 0 Track Material, Railroad Track Material, Railroad Includes Railroad Rails; Railroad Tie Plates; Railroad Turnouts and Components; Railroad Spikes. Excludes Ballast (FSC 5610); Railroad Ties (FSC 5510). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2305 FSC 0 Ground Effect Vehicles Ground Effect Vehicles admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2310 FSC 0 Passenger Motor Vehicles Passenger Motor Vehicles Note-This class includes only complete passenger motor vehicles, and chassic therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on passenger motor vehicles are classified in classes other than this class. Includes Cars, Motor, Highway; Busses; Chassis, Passenger Motor Vehicle; Hearses; Ambulances. Excludes Amphibious Personnel Carriers; All Truck Chassis. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2320 FSC 0 Trucks and Truck Tractors, Wheeled Trucks and Truck Tractors, Wheeled Note-This class includes only complete wheel mounted trucks and truck tractors, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories other than complete chassis, for use in or on such trucks or truck tractors are classified in classes other than this class. The combined chassis and body of a special purpose truck, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped truck mounted machine shop, is excluded from this class. Includes Panel, Delivery and Pick Up Trucks, Tactical and Administrative Military Cargo Carrying Vehicles, including Wheel Mounted Amphibian Vehicles; Truck Tractors and Trailer Combinations; Armored Cars. Excludes Fire Trucks; Special Construction Type Earth and Rock Hauling Trucks; Motorized Air Compressors; Motorized Concrete Mixers; Construction Specialized Machinery Generally; Specially designed trucks for use in and around airfields, hangers, and warehouses; Tracked and Halftracked Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2330 FSC 0 Trailers Trailers Note-This class includes only complete trailers, and chassis therefor. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on trailers are classified in classes other than this class. The combined chassis and body of a special purpose trailer, such as a machine shop, mobile laundry, or dental laboratory, is classified in this class. The complete mobile unit, consisting of chassis, body, and additional equipment, as in an equipped trailermounted machine shop, is excluded from this class. Includes Semitrailers; Semitrailer Dollies; Cargo Trailers; Passenger and House Trailers; Special Purpose Trailers, such as Ammunition. Excludes Fire Fighting Trailers; Specially designed trailers for use in and around airfields, hangers, and warehouses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2340 FSC 0 Motorcycles, Motor Scooters, and Bicycles Motorcycles, Motor Scooters, and Bicycles Note-This class includes only complete motorcycles, complete motor scooters, and complete bicycles. End items, assemblies, parts, attachments, or accessories for use in or on motorcycles, motor scooters, or bicycles are classified in classes other than this class. Includes Sidecars; Tricycles. Excludes Children's Wheeled Goods. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2350 FSC 0 Combat, Assault, and Tactical Vehicles, Tracked Combat, Assault, and Tactical Vehicles, Tracked Note-This class includes only complete combat, assault, and tactical tracked vehicles, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on such vehicles are classified in classes other than this class. Includes Tanks and Tracked Self-Propelled Weapons and Vehicles with or without amphibian capabilities; Armored Halftracks; Self-Propelled Sleds; and Self-Propelled Flame Throwers. Excludes Wheel Mounted Vehicles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2410 FSC 0 Tractor, Full Tracked, Low Speed Tractor, Full Tracked, Low Speed Note-This class includes only complete low speed, full track tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on low speed, full track tractors, are classified in classes other than this class. Excludes High Speed Tractors (FSC 2430); Armored Dozer-Scrapper Combination Tractors (FSC 2350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2420 FSC 0 Tractors, Wheeled Tractors, Wheeled Note-This class includes only complete wheeled tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on wheeled tractors, are classified in classes other than this class. Includes Agricultural Tractors; High Speed Tractors; Industrial Tractors. Excludes Aircraft Towing Tractors and Crashed Aircraft Moving Tractors (FSC 1740); Aircraft Towing-Power Servicing Tractors (FSC 1730); Warehouse Tractors (FSC 3930). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2430 FSC 0 Tractors, Full Tracked, High Speed Tractors, Full Tracked, High Speed Note-This class includes only complete high speed track laying tractors, and chassis. Any end items, assemblies, parts, attachments, or accessories, other than complete chassis, for use in or on high speed track laying tractors, are classified in classes other than this class. Excludes Low Speed Tractor (FSC 2410); Armored Dozer-Scraper Combination Tractors (FSC 2350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2510 FSC 0 Vehicular Cab, Body, and Frame Structural Components Vehicular Cab, Body, and Frame Structural Components Includes Leaf Type Vehicular Springs; Suspension Type Shock Absorbers. Excludes Vehicular Hardware (FSG 53); Specialized Vehicular Furniture (FSC 2540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2520 FSC 0 Vehicular Power Transmission Components Vehicular Power Transmission Components Includes Transfer Transmission Assemblies; Clutch Assemblies; Universal Joints; Propeller Shafts; Automotive Torque Converters; Power Takeoffs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2530 FSC 0 Vehicular Brake, Steering, Axle, Wheel, and Track Components. Vehicular Brake, Steering, Axle, Wheel, and Track Components. Includes Turrent Brakes; Clutch Brakes, Tank Turret. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2540 FSC 0 Vehicular Furniture and Accessories Vehicular Furniture and Accessories Includes Automobile Seat Covers; Shock Absorbers; Bumpers; Windshield Wipers; Bumper Guards; Mirrors, Rear View and Side View; Vehicle Heaters. Excludes Speedometers (FSC 6680); Suspension Type Shock Absorbers (FSC 2510). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2541 FSC 0 Weapons Systems Specific Vehicular Accessories Weapons Systems Specific Vehicular Accessories Includes: Accessory Kits and Boxes, Parts Kits, and individual components used in the repair and/or modification of Weapons System type Vehicles such as Tanks, Personnel Carriers, Mobile Howitzers, and the like. Excludes: Items used in the repair and/or modifications of Commercial Type Vehicles (FSC 2540), vehicular type light fixtures (FSC 6220), and electronic switches, parts kits, and modification kits (FSG 59). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2590 FSC 0 Miscellaneous Vehicular Components Miscellaneous Vehicular Components Includes Attachments for Tanks, Self-propelled Weapons, and High Speed Tractors; A-frames and Winches specifically designed for truck mounting; Cranes and Crane Booms for Wrecker Trucks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2610 FSC 0 Tires and Tubes, Pneumatic, Except Aircraft Tires and Tubes, Pneumatic, Except Aircraft Excludes Aircraft Pneumatic Tires and Tubes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2620 FSC 0 Tires and Tubes, Pneumatic, Aircraft Tires and Tubes, Pneumatic, Aircraft admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2630 FSC 0 Tires, Solid and Cushion Tires, Solid and Cushion Includes Rubber Track Laying Treads. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2640 FSC 0 Tire Rebuilding and Tire and Tube Repair Materials Tire Rebuilding and Tire and Tube Repair Materials Includes Tread Gum; Cold Patches; Friction Cord Fabric; Vulcanizing Patches; Padding Stock; Quick-Cure Gum; Tire and Tube Repair Kits; Camelback; Valves; Valve Cores. Excludes Vulcanizing Machinery and Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2805 FSC 0 Gasoline Reciprocating Engines, Except Aircraft; and Components Gasoline Reciprocating Engines, Except Aircraft; and Components Includes Gas Reciprocating Engines; All Gasoline Reciprocating Engines except Aircraft Prime Moving. Excludes Engine Accessories (FSC 2990). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2810 FSC 0 Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components Gasoline Reciprocating Engines, Aircraft Prime Mover; and Components Note Engines and components classified in this FSC must be desinged specifically for use as/on an aircraft prime mover. Auxiliary engines and their components will be classified in the appropriate FSC elsewhere in FSG 28. Includes Complete Engine Assemblies; Piston Rings; Cylinders; Pistons; Camshafts; Crankshafts. Excludes Fuel System Components (Carburetors; Carburetor Floats; Fuel Pumps; Fuel Controls; Fuel Valves) (FSC 2915); Electrical System Components (Spark Plug Adapters; Ignition Distributors; Ignition Coils, Electrical Starters) (FSC 2925); Engine Cooling System Components (Engine Oil Coolers; Cooling Radiators) (FSC 2935); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2945); Miscellaneous Engine Accessories (Pneumatic Starters, Cowling Mounts, Control Assemblies) (FSC 2995). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2815 FSC 0 Diesel Engines and Components Diesel Engines and Components Includes Automotive, Industrial, Marine, Locomotive, and all other types of Diesel and Semi-Diesel Engines. Excludes Engines Accessories (FSC 2990). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2820 FSC 0 Steam Engines, Reciprocating; and Components Steam Engines, Reciprocating; and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2825 FSC 0 Steam Turbines and Components Steam Turbines and Components Includes Mercury Vapor Turbines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2830 FSC 0 Water Turbines and Water Wheels; and Components Water Turbines and Water Wheels; and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2835 FSC 0 Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components Gas Turbines and Jet Engines; Non-Aircraft Prime Mover, Aircraft Non-Prime Mover, and Components Note Engines and Components classified in this FSC are primarily for use on non-aircraft prime mover (e.g., Naval ship applications), aircraft non-prime mover (e.g., airframe mounted auxiliary power units), and for aircraft ground support equipment (e.g., start carts). Includes Airflow Deflectors; Combustion Chambers, Compressors, Turbines, Accessory Gear Boxes and their Components. Excludes Components for Gas Turbines and Jet Engines, Aircraft Prime Mover (FSC 2840); Engine Fuel Systems (FSC 2910); Engine Electrical Systems (FSC 2920); Engine Cooling Systems (FSC 2930); Engine Air/Oil Cleaners/Filters/Strainers (FSC 2940); Engine Accessories (Air Duct Heaters, Engine Mounted Control Assemblies) (FSC 2990). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2840 FSC 0 Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components Gas Turbines and Jet Engines, Aircraft, Prime Moving; and Components Note Engines and Components classified in this FSC are intended for use as/on aircraft and/or guided missile prime movers. Includes Compressor and Turbine Rotors; Blades; Combustion Chamber; Accessory Gear Box; Afterburner; Exhaust Cone; Reservoirs, Hydraulic; Tank, Oil. Excludes Oil, Air, Anti-icing, and Hydraulic Regulators, Valves, and Pumps specially designed for Gas Turbines and Jet Engines (FSC 2995); Control Assemblies, Push-Pull (FSC 2995); Engine Mounted Control Assemblies (FSC 2995); Fuel System Components (FSC 2915); Engine Electrical System Components (FSC 2925); Engine Cooling System Components (FSC 2935); Engine Air/Oil Cleaner/Filter/Strainers (FSC 2945). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2845 FSC 0 Rocket Engines and Components Rocket Engines and Components Includes Rocket Prime Movers, Liquid Type, including Liquid Jet Assisted Take Off (JATO) Units, for use in aircraft, rockets, and guided missiles; Liquid Propellants encased in consumable containers, intended for insertion into missile propulsion systems as integral parts. Excludes Rocket Motors - Solid Propellant Units (FSC 1337); Liquid Propellants predetermined to specific quantity and quality, but packaged in reusable containers; Solid Propellant Squibs and Cartridges, whether intended for insertion into Liquid Propellent Systems or not (FSC 1337). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2850 FSC 0 Gasoline Rotary Engines and Components Gasoline Rotary Engines and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2895 FSC 0 Miscellaneous Engines and Components Miscellaneous Engines and Components Includes Wind and Compressed Air Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2910 FSC 0 Engine Fuel System Components, Nonaircraft Engine Fuel System Components, Nonaircraft Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Tanks; Components for all engines except Aircraft and Guided Missile Prime Moving. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2915 FSC 0 Engine Fuel System Components, Aircraft and Missile Prime Movers Engine Fuel System Components, Aircraft and Missile Prime Movers Note Fuel components specially designed for propulsion fuel systems, aircraft and missiles are to be placed in this FSC. Includes Carburetors; Fuel Pumps; Engine Fuel Filters; Fuel Controls, Jet Engine; Fuel Primers; Water Injection Controls and Valves; Fuel Valves Fuel Flow Regulators; Components of Smoke Abatement Systems. Excludes Aircraft Fuel Tanks (FSC 1560); In-flight Refueling System Fuel Components (FSC 1680). Fuel System Components not specifically designed for use with Aircraft Engines or Missile Prime-movers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2920 FSC 0 Engine Electrical System Components, Nonaircraft Engine Electrical System Components, Nonaircraft Includes Generators; Magnetos; Spark Plugs; Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines. Excludes Vehicular Lighting Fixtures (FSC 6220) and Aircraft Generators (FSC 2925). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2925 FSC 0 Engine Electrical System Components, Aircraft Prime Moving Engine Electrical System Components, Aircraft Prime Moving Note Items designed for specific use on aircraft and guided missile prime movers are to be placed in this FSC. Includes Magnetos; Igniters (Spark Plugs); Ignition Coils; Ignition Distributors; Engine Voltage Regulators; Ignition Harness Assemblies; Starting Motors for Engines; Engine Accessory Generators. Excludes Aircraft Lighting Fixtures (FSC 6220); Auxiliary Aircraft Generators (FSC 6115). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2930 FSC 0 Engine Cooling System Components, Nonaircraft Engine Cooling System Components, Nonaircraft Includes Cooling Fans; Radiators; Water Pumps; Water Hose Assemblies; Engine Coolant Filters; Components for all Engines except Aircraft and Guided Missile Prime Moving. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2935 FSC 0 Engine System Cooling Components, Aircraft Prime Moving Engine System Cooling Components, Aircraft Prime Moving Note This class includes only cooling system components for aircraft and/or guided missile prime movers only. Includes Radiators; Cooling System Pumps; Water Hose Assemblies; Lubricating Oil Coolers and Control Valves; Oil Temperature Regulators. Excludes Cooling System Components not specifically designed for use with Aircraft Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2940 FSC 0 Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft Engine Air and Oil Filters, Strainers, and Cleaners, Nonaircraft Includes Components for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Air and Oil Filters (FSC 4310, 4330), Strainers (FSC 4730) and Cleaners (FSC 4310) not specifically designed for use with engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2945 FSC 0 Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving Engine Air and Oil Filters, Cleaners, Aircraft Prime Moving Note Items placed in this FSC should be specifically designed for use on aircraft or guided missile prime movers only. Includes Air Filters; Oil Filters; Strainers; Cleaners. Excludes Fuel Filters (FSC 2915); Items designed for other than Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2950 FSC 0 Turbosupercharger and components Turbosupercharger and components Note All turbosuperchargers and their components not elsewhere classifiable will be classified in this FSC. Includes Turbosupercharged Regulators; Engine Turbosuperchargers. Excludes Engine Integrated Superchargers (FSG 28). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2990 FSC 0 Miscellaneous Engine Accessories, Nonaircraft Miscellaneous Engine Accessories, Nonaircraft Includes Engine Dynafocal Suspension Mounts; Engine Driven Superchargers (not integrated with engine); Starter Cranks; Engine Starter Ropes; Exhaust Mufflers; Hand Inertia Starters; Air Duck Heaters; Engine Governors; Intake Mufflers; Combustion Type Starters; Miscellaneous Accessories for all Engines except Aircraft and Guided Missile Prime Moving. Excludes Electrical Starters Non-Aircraft (FSC 2920); Aircraft (FSC 2925). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 2995 FSC 0 Miscellaneous Engine Accessories, Aircraft Miscellaneous Engine Accessories, Aircraft Note Items classified in this class must be specifically designed for use with aircraft or quided missile primemovers only. Includes Engine Dynafocal Suspension Mounts; Engine Cowling Mounts; Engine Mounted Control Assemblies; Pneumatic Starters; Push-Pull Control Assemblies;Specially designed Jet Engine Air, Oil, Anti-icing and Hydraulic Regulators; Valves and Pumps; Starting Units. Excludes Exhaust System; (FSC 1560); Jet Engine Hydraulic Reservoirs (FSC 2840); Jet Engine Oil Tanks (FSC 2840); Electrical Starters (FSC 2925); Cockpit Mounted Control Quadrants (FSC 1680); Aircraft Engine Covers (FSC 1730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3010 FSC 0 Torque Converters and Speed Changers Torque Converters and Speed Changers Includes Fluid Couplings; Nonvehicular Clutches and Couplings; Horizontal Right Angle Drive Gear Units. Excludes Automotive Torque Converters (FSC 2520); Vehicular Power Transmission Components (FSC 2520); Rotary Aircraft Transmission Gear Units (FSC 1615). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3020 FSC 0 Gears, Pulleys, Sprockets, and Transmission Chain Gears, Pulleys, Sprockets, and Transmission Chain Includes Power Transmission Chain; Matched Gear Sets. Excludes Reduction Gears (FSC 3010). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3030 FSC 0 Belting, Drive Belts, Fan Belts, and Accessories Belting, Drive Belts, Fan Belts, and Accessories Includes Belt Lacings; Belt Pins. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3040 FSC 0 Miscellaneous Power Transmission Equipment Miscellaneous Power Transmission Equipment Includes Shafts and Shafting; Collars; Gearshafts; Ball Joints; Actuating Cylinders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3110 FSC 0 Bearings, Antifriction, Unmounted Bearings, Antifriction, Unmounted Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Ball Bearings; Roller Bearings; Balls; Races. Excludes Plain Bearings (FSC 3120); Jewel Bearings (FSC 3120) admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3120 FSC 0 Bearings, Plain, Unmounted Bearings, Plain, Unmounted Note Bearings in this class are generally one piece that retain and position moving and/or rotating parts. They may have lubrication grooves/fittings/facilities or include pre-lubrication. Includes Sleeve Bearings; Split Bearings; Washer Type Bearings; Jewel Bearings. Excludes Antifriction Bearings (FSC 3110); Mounted Bearings (FSC 3130). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3130 FSC 0 Bearings, Mounted Bearings, Mounted Note This class includes bearings that generally have roller or balls confined by an inner and outer ring to relieve friction in/on/around rotating/moving mechanisms. Includes Pillow Block Units; Cartridge Units; Flange Units; Takeup Units; Hanger Box Units; Flat Box Units; Step Box Units. Excludes Antifriction Bearings (FSC 3110); Plain Unmounted Bearings (FSC 3120). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3210 FSC 0 Sawmill and Planing Mill Machinery Sawmill and Planing Mill Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3220 FSC 0 Woodworking Machines Woodworking Machines Includes Mortisers; Tenoners; Veneer Lathes. Excludes Hand Held Power Driven Tools; Hand Held Tools Operated by Flexible Shaft. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3230 FSC 0 Tools and Attachments for Woodworking Machinery Tools and Attachments for Woodworking Machinery Includes Circular and Band Saw Blades; Cutter Heads; Jointer and Notcher Heads; Cutters. Excludes Head Turning Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3405 FSC 0 Saws and Filing Machines Saws and Filing Machines Includes Cutoff Machines; Saw Blade Dressing Machines; Retoothing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3408 FSC 0 Machining Centers and Way-Type Machines Machining Centers and Way-Type Machines Note-The following definitions apply to "Machining Centers" and "Way-type Machines". a. "Machining Center", refers to a multipurpose numerically controlled machine tool for the complete and automatic machining of parts requiring multiple operations such as milling, drilling, tapping, boring, and reaming, having an integral tool storage device and an integral means for positioning various faces of the work piece. It must have facilities for automatic interchanging of varied cutting tools between successive operations. Excluded from this class are multipurpose numerically controlled machine tools, such as Boring-Drilling-Milling Machines, which require the use of an attachment or accessory for tool storage and/or to position the various faces of a work piece. These types of equipment are classified in other appropriate classes within group 34. b. "Way-type Machine", refers to a special machine tool of station type design consisting of individually mounted self-contained machining units and facilities for indexing the work piece to each station in a predetermined sequence. The machining unit(s) may be disassembled and rearranged to accommodate different work piece configurations. Machine is capable of performing single or multiple operations on the work piece simultaneously or in sequence to each station. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3410 FSC 0 Electrical and Ultrasonic Erosion Machines Electrical and Ultrasonic Erosion Machines Includes Electrical Discharge Machines; Electrolytic Grinding Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3411 FSC 0 Boring Machines Boring Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3412 FSC 0 Broaching Machines Broaching Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3413 FSC 0 Drilling and Tapping Machines Drilling and Tapping Machines Includes Multiple Spindle Drilling-Tapping Machines. Excludes Way-Type Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3414 FSC 0 Gear Cutting and Finishing Machines. Gear Cutting and Finishing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3415 FSC 0 Grinding Machines Grinding Machines Excludes Electrolytic Grinding Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3416 FSC 0 Lathes Lathes Includes Screw Machines Excludes Speed Lathes; Metal Spinning Lathes; Cartridge Case and Shell Lathes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3417 FSC 0 Milling Machines Milling Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3418 FSC 0 Planers and Shapers Planers and Shapers Includes Combination Shaper-Planers. Excludes Gear Shapers; Planer Type Milling Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3419 FSC 0 Miscellaneous Machine Tools Miscellaneous Machine Tools Includes Gun Rifling Machines; Speed Lathes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3422 FSC 0 Rolling Mills and Drawing Machines Rolling Mills and Drawing Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3424 FSC 0 Metal Heat Treating and Non-Thermal Treating Equipment Metal Heat Treating and Non-Thermal Treating Equipment Includes Hardening, Annealing, Tempering, Normalizing, Cyaniding, and Carburizing Equipment; Furnaces, Flue Welding, Non-Thermal Stress Relieving Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3426 FSC 0 Metal Finishing Equipment Metal Finishing Equipment Includes Galvanizing, Tinning, Oiling, Pickling; Electroplating, and Anodizing Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3431 FSC 0 Electric Arc Welding Equipment Electric Arc Welding Equipment Includes Gas Shielded Arc Welding Machines; Arc Bonding Machines; Semi-Automatic and Automatic Arc Welding Machines. Excludes Welding Supplies, and Associated Equipment such as: Flux Recovery Mchines; Flux Dispensers; Tacker Panels; Welding Panels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3432 FSC 0 Electric Resistance Welding Equipment Electric Resistance Welding Equipment Includes Electric Resistance Brazing Machines; Band Saw Brazers; Stored Energy Resistance Welding Machines. Excludes Electric Induction Brazing and Soldering Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3433 FSC 0 Gas Welding, Heat Cutting, and Metalizing Equipment Gas Welding, Heat Cutting, and Metalizing Equipment Includes Metal Spray Guns; Arc Cutting Machines; Torches and Tips; Gas Brazing Machines; Flame Cutting Machines; Vacuum Metalizers; Spark Discharge Metalizers. Excludes Welding Supplies; Disintegrating Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3436 FSC 0 Welding Positioners and Manipulators Welding Positioners and Manipulators Includes Welding Tables. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3438 FSC 0 Miscellaneous Welding Equipment Miscellaneous Welding Equipment Includes Thermite Welding Equipment; Flux Recovery Machines; Flux Dispensers; Arc Converters; Welding Panels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3439 FSC 0 Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories Miscellaneous Welding, Soldering, and Brazing Supplies and Accessories Includes Soldering Irons; Welding Electrodes and Rods; Brazing Fluxes; Soldering Fluxes; Solder. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3441 FSC 0 Bending and Forming Machines Bending and Forming Machines Excludes Wire and Metal Ribbon Forming Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3442 FSC 0 Hydraulic and Pneumatic Presses, Power Driven Hydraulic and Pneumatic Presses, Power Driven Includes Metal Powder Compacting Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3443 FSC 0 Mechanical Presses, Power Driven Mechanical Presses, Power Driven Includes Metal Powder Compacting Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3444 FSC 0 Manual Presses Manual Presses Includes Arbor, Straightening, Forcing, and Assembly Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3445 FSC 0 Punching and Shearing Machines Punching and Shearing Machines admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3446 FSC 0 Forging Machinery and Hammers Forging Machinery and Hammers Excludes Forging Presses. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3447 FSC 0 Wire and Metal Ribbon Forming Machines Wire and Metal Ribbon Forming Machines Excludes Roll Forming Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3448 FSC 0 Riveting Machines Riveting Machines Excludes Power Driven Hand Riveting Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3449 FSC 0 Miscellaneous Secondary Metal Forming and Cutting Machines Miscellaneous Secondary Metal Forming and Cutting Machines Includes Metal Spinning Lathes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3450 FSC 0 Machine Tools, Portable Machine Tools, Portable Includes Portable Abrasive Cutting Machines; Portable Drilling Machines; Portable Slotters and Shapers. Excludes Stationary Type Machine Tools mounted on portable devices such as wheel or leg type stands. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3455 FSC 0 Cutting Tools for Machine Tools Cutting Tools for Machine Tools Includes Broaches; Files; Milling Cutters; Reamers; Saws. Excludes Flame Cutting Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3456 FSC 0 Cutting and Forming Tools for Secondary Metalworking Machinery Cutting and Forming Tools for Secondary Metalworking Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3460 FSC 0 Machine Tool accessories Machine Tool accessories Excludes Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3461 FSC 0 Accessories for Secondary Metalworking Machinery Accessories for Secondary Metalworking Machinery Excludes Parts Feeders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3465 FSC 0 Production Jigs, Fixtures, and Templates Production Jigs, Fixtures, and Templates Note-This class includes jigs, fixtures, and templates used in conjection with the metalworking machinery classified in Group 34. Jigs, fixtures, and templates used in conjunction with maintenance and repair shop specialized equipment are classified in Group 49. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3470 FSC 0 Machine Shop Sets, Kits, and Outfits Machine Shop Sets, Kits, and Outfits admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3510 FSC 0 Laundry and Dry Cleaning Equipment Laundry and Dry Cleaning Equipment Includes Washing Machines; Extractors; Wringers; Drying Tumblers; Ironers; Presses; Starching Machines; Marking Equipment; Mobile Laundry and Dry Cleaning Units. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3520 FSC 0 Shoe Repairing Equipment Shoe Repairing Equipment Includes Shoe Sewing Machines; Mobile Shoe Repair Shops. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3530 FSC 0 Industrial Sewing Machines and Mobile Textile Repair Shops Industrial Sewing Machines and Mobile Textile Repair Shops Excludes Shoe Sewing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3540 FSC 0 Wrapping and Packaging Machinery Wrapping and Packaging Machinery Includes Filling Machines; Container Capping Machines; Label Applying Machines; Package Sealing Machines; Paperboard Box, Case and Tray Making Machines; Strapping Machines; Stapling Machines, except Office Type. Excludes Paperboard Manufacturing Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3550 FSC 0 Vending and Coin Operated Machines Vending and Coin Operated Machines Includes Fare Recording Devices; Parking Meters; Turnstiles; Coin Operated Phonographs. Excludes Coin and Currency Handling Machines; Coin Operated Scales. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3590 FSC 0 Miscellaneous Service and Trade Equipment Miscellaneous Service and Trade Equipment Includes Manicure Tables. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3605 FSC 0 Food Products Machinery and Equipment Food Products Machinery and Equipment Includes Industrial Food Products Equipment. Excludes Kitchen and Galley Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3610 FSC 0 Printing, Duplicating, and Bookbinding Equipment Printing, Duplicating, and Bookbinding Equipment Includes Offset Presses; Typesetting Machinery; Bookbinding Machinery; Photoengraving Machinery; Printing Type; Rules; Leads; Slugs; Line Gages; Quoins; Plate Hooks; Gelatine Process Machines; Spirit Process Machines; Stencil Process Machines; Offset Process Machines; Photostat Machines; Blueprint Printing and Developing Machines; Print Shop Furniture. Excludes Microfilm Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3611 FSC 0 Industrial Marking Machines Industrial Marking Machines Note-Marking machines which make permanent indentations in metal are classified in Group 34. Excludes Marking Machines, Laundry; Printing Machine, Label; Printing Press, Label; Embossing Machines, Office Type; and Marking Machines, Office Type. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3615 FSC 0 Pulp and Paper Industries Machinery Pulp and Paper Industries Machinery Includes Chippers; Digestors; Beaters; Bleaching Equipment; Paperboard Manufacturing Machinery. Excludes Paperboard Box, Case and Tray Making Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3620 FSC 0 Rubber and Plastics Working Machinery Rubber and Plastics Working Machinery Includes Plasticators; Presses; Synthetic Rubber Working Machinery; Thread Extruding Machinery; Vulcanizing Machinery. Excludes Protective Covering Laminating Presses; Tire Maintenance and Repair Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3625 FSC 0 Textile Industries Machinery Textile Industries Machinery Includes Cotton Ginning Machinery; Looms; Button Covering Machines; Rope Laying Machines; Lace Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3630 FSC 0 Clay and Concrete Products Industries Machinery Clay and Concrete Products Industries Machinery Includes Brickmaking Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3635 FSC 0 Crystal and Glass Industries Machinery Crystal and Glass Industries Machinery Includes Optical Goods Manufacturing Machinery. Excludes Ophthalmic Lens Cutting, Drilling, Edging, and Grinding Machines; Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3640 FSC 0 Tobacco Manufacturing Machinery Tobacco Manufacturing Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3645 FSC 0 Leather Tanning and Leather Working Industries Machinery Leather Tanning and Leather Working Industries Machinery admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3650 FSC 0 Chemical and Pharmaceutical Products Manufacturing Machinery Chemical and Pharmaceutical Products Manufacturing Machinery Includes Crushers and Mills for Chemical Materials; Pharmaceutical Briquetting and Tabletting Presses; Chemical Explosive Manufacturing Machinery. Excludes Construction Materials Crushers, Mills and Pulverizers; Plastic Products Manufacturing Machinery; Pharmaceutical Products Wrapping and Packaging Machinery; Laboratory and Shop Type Mills and Mixers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3655 FSC 0 Gas Generating and Dispensing Systems, Fixed or Mobile Gas Generating and Dispensing Systems, Fixed or Mobile Note-Included in this class are gaseous dispensing systems, both mobile and installed. Includes liquefied gaseous storage tanks, mounted on a common base with, or integral to, gas generating equipment included in this class. Also includes those liquefied gaseous storage tanks, either trailer mounted or skid mounted, used to store liquefied gaseous products until needed. Excluded from this class are those storage tanks designed to be used as an integral part of guided missile propellant servicing trailers, rocket power plants or test stations, and aircraft oxygen converters which are classified as specified by the indexes and structure of the FSC. Excludes Meteorological Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3660 FSC 0 Industrial Size Reduction Machinery Industrial Size Reduction Machinery Note-This class includes general use machinery related to two or more manufacturing industries. Excludes Chemical Products and Construction and Mining Type Crushing, Pulverizing, Screening and Mixing Machinery; Maintenance and Repair Shop Type Mixers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3670 FSC 0 Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery Specialized Semiconductor, Microcircuit, and Printed Circuit Board Manufacturing Machinery Note-This class includes, and is restricted to, equipment specifically designed for manufacturing semiconductor devices (FSC 5961), microcircuits (FSC 5962), and printed circuit boards (FSC 5998). Excludes items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC. Includes Substrate Preparation Equipment; Circuit Pattern Forming Equipment; Interconnecting and Packaging Equipment. Excludes Assembly Machines for Mounting Discrete Components on Printed Wiring Boards. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3680 FSC 0 Foundry Machinery, Related Equipment and Supplies Foundry Machinery, Related Equipment and Supplies Includes Molding Machines; Tumbling Mills, Foundry Dextrine; Core Paste. Excludes Crucible Furnaces; Cupola Furnaces; Foundry Hand Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3685 FSC 0 Specialized Metal Container Manufacturing Machinery and Related Equipment Specialized Metal Container Manufacturing Machinery and Related Equipment Note-This class includes only those machines specifically designed for manufacturing metal containers. Closing machines designed to seam the tops of filled containers will be classified in Class 3540. Includes Drum and Jerrican Manufacturing Machinery; Specially Designed Container Leak Testing Machines; Can Making Machinery. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3690 FSC 0 Specialized Ammunition and Ordnance Machinery and Related Equipment Specialized Ammunition and Ordnance Machinery and Related Equipment Includes Ammunition and Explosive Loading (Filling and Assembling) Specialized Machinery; Small Arms Ammunition Manufacturing Machinery; Artillery and Anti-Aircraft Shell Manufacturing Machinery. Excludes Ammunition and Weapons Maintenance and Repair Shop Specialized Equipment; Nonspecialized or Standard Machinery not designed exclusively for manufacturing or assembling ammunition and ordnance equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3693 FSC 0 Industrial Assembly Machines Industrial Assembly Machines Note-This class includes equipment specifically designed to assemble prefabricated components without further design machining of the components. Equipment designed to perform combined machining and assembling operations which result in material removal are classified in classes other than this class. Also excluded are items for which more specific classifications are suitable. Includes Industrial Production Type Power Screwdriving Machines; Circuit Card Assembly Machines. Excludes Specialized Ammunition and Ordnance Assembly Machines; Wrapping and Packaging Machinery; Metalworking Machinery; Hand Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3694 FSC 0 Clean Work Stations, Controlled Environment, and Related Equipment Clean Work Stations, Controlled Environment, and Related Equipment Includes Laminar and Nonlaminar Flow Enclosures; Dust Controlled Facilities; Air Showers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3695 FSC 0 Miscellaneous Special Industry Machinery Miscellaneous Special Industry Machinery Includes Communication Wire Dispenser Fabricating Machinery; Specialized Logging Equipment; Petroleum Refinery Machinery; Shoemaking Machinery; Production Type Impregnating Equipment. Excludes Opthalmic Lens Cutting and Grinding Machinery; Clothing Impregnating Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3710 FSC 0 Soil Preparation Equipment Soil Preparation Equipment Includes Harrows; Plows; Seed Drills; Seeder Attachments; Sprayers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3720 FSC 0 Harvesting Equipment Harvesting Equipment Includes Hayrakers; Mowers. Excludes Mower Attachments (FSC 3750); Sickle Bar Attachments (FSC 3750). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3730 FSC 0 Dairy, Poultry, and Livestock Equipment Dairy, Poultry, and Livestock Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3740 FSC 0 Pest, Disease, and Frost Control Equipment Pest, Disease, and Frost Control Equipment Includes Atomizers; Delousing Outfits; Dusters; Fly Swatters; Flypaper; Fog Generators; Sprayers; Traps. Excludes Self Pressurized Spray Kits (FSC 4940). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3750 FSC 0 Gardening Implements and Tools Gardening Implements and Tools Includes Garden Tractors, Walking Type; Lawn Mowers, Powered and Nonpowered; Hedge Trimers; Lawn Seeders; Fertilizer Spreaders; Gardening Rakes, Forks, Hoes, and Other Gardening Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3770 FSC 0 Saddlery, Harness, Whips, and Related Animal Furnishings Saddlery, Harness, Whips, and Related Animal Furnishings Includes Dog Harnesses; Leads. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3805 FSC 0 Earth Moving and Excavating Equipment Earth Moving and Excavating Equipment Includes Scrapers; Ditchers; Loaders; Graders; Special Construction Type Earth and Rock Hauling Trucks and Trailers; Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability. The Power Section is designed to be coupled with a Work Section to form a functional piece of Construction Equipment. Excludes Standard Tractors (FSG 24); Trailers (FSC 2330); Trucks (FSC 2320). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3810 FSC 0 Cranes and Crane-Shovels Cranes and Crane-Shovels Includes Cranes; Crane-Semitractors; Crane-Shovels; Crane-Tractors. Excludes Barge Mounted Cranes (FSC 1935); Locomotive Cranes (FSC 2230). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3815 FSC 0 Crane and Crane-Shovel Attachments Crane and Crane-Shovel Attachments Includes Backhoes; Buckets; Dippers; Fairleads; Gantries; Grapples; Lifting Magnets; Shovels; Wrecking Balls. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3820 FSC 0 Mining, Rock Drilling, Earth Boring, and Related Equipment Mining, Rock Drilling, Earth Boring, and Related Equipment Includes Augers; Crushers; Crushing, Screening, and Washing Plants and Units; Drilling Machines; Paving Breakers; Rock Drills. Excludes Tampers (FSC 3895). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3825 FSC 0 Road Clearing, Cleaning, and Marking Equipment Road Clearing, Cleaning, and Marking Equipment Includes Pavement Scrubbing Machines; Snow Removal Units; Sweepers; Road Marking Machines; Vacuum Cleaners; Water Distributors; Weed Burners. Excludes Standard Tractors with Road Clearing or Cleaning Attachments (FSC 2410, 2420, 2430); Timber Sawing Equipment (FSC 5130, 5110). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3830 FSC 0 Truck and Tractor Attachments Truck and Tractor Attachments Includes Angledozers; Augers; Backhoes; Bullclams; Bulldozer-Shovels; Cranes; Grubbers; Loaders; Rakes; Rippers; Rollers; Scarifiers; Snow Removal Units; Snowplows; Sweepers; Treedozers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3835 FSC 0 Petroleum Production and Distribution Equipment Petroleum Production and Distribution Equipment Includes Well Heads; Pumping Equipment; Gas Distribution Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3895 FSC 0 Miscellaneous Construction Equipment Miscellaneous Construction Equipment Includes Asphalt Elevators; Asphalt Heaters; Asphalt Kettles; Asphalt Transfer Equipment; Batching Plants; Stabilizing and Compacting Equipment; Concrete Mixers (All Types); Concrete Vibrators; Bituminous and Concrete Pavers; Asphalt Distributors; Sheepfoot Rollers; Rooters; Rippers; Pile Drivers; Bitumen Heaters; Cable Laying, Lashing, Spinning, and Reeling Equipment. Excludes Earth Moving and Excavating Equipment (FSC 3805 & 3810); Pile Driving Attachments for Cranes and Crane-Shovels (FSC 3815); Special Individual Work and Power Sections of Construction Equipment with a quick connect/disconnect capability (FSC 3805). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3910 FSC 0 Conveyors Conveyors Includes Pneumatic Tube Systems; Portable, Stationary, Powered, and Nonpowered Conveyors; Conveyor Feeders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3915 FSC 0 Materials Feeders Materials Feeders Note-Materials Handling equipment included in this class is restricted to those materials feeders and parts feeders that serve as a conveying device, and by which the rate of delivery of bulk materials, packages, or objects may be controlled. Items included in this class are synchronized with companion machinery, feeding predetermined amounts, by volume, of specific materials accurately and continuesly from storage bins or hoppers to process or mixing machines, and are interchangable between machines. Excluded from this class are conveyor feeders (i.e., apron, belt, chain, flight, pan, etc., adapted for feeder service) that are classifiable in Class 3910 and/or Class 3895, as appropriate. Includes Dry Materials Feeders; Parts Feeders Excludes Aggregate and Fines Feeders; Conveyor Feeders; Water Purification Dry Chemical Feeders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3920 FSC 0 Material Handling Equipment, Nonself-Propelled Material Handling Equipment, Nonself-Propelled Includes Dolly Trucks; Pushcarts; Handcarts; Wheelbarrows; Hand Trucks; Materials Handling Trailers. Excludes Conveyors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3930 FSC 0 Warehouse Trucks and Tractors, Self-Propelled Warehouse Trucks and Tractors, Self-Propelled Includes Tug Jockeys; Fork Lift Trucks; Platform Trucks; Straddle Trucks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3940 FSC 0 Blocks, Tackle, Rigging, and Slings Blocks, Tackle, Rigging, and Slings Excludes Load Chain; Chain and Metal Rope Fittings; Wire Rope; Hoists; Ship Rigging. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3950 FSC 0 Winches, Hoists, Cranes, and Derricks Winches, Hoists, Cranes, and Derricks Includes Windlasses: Capstans: Ore Bridges: Gypsies: Warehouse Cranes: Wharf Cranes, Mobile or Fixed: Overhead Traveling Cranes. Excludes Crane-Shovels (FSC 3810); Barge Mounted Cranes (FSC 1935); Winches for Integral Mounting on Trucks or Tractors (FSC 3830); Locomotive Cranes (FSC 2230). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3960 FSC 0 Freight Elevators Freight Elevators admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 3990 FSC 0 Miscellaneous Materials Handling Equipment Miscellaneous Materials Handling Equipment Includes Skids; Pallets. Excludes Airfield Engine Transport Skids. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4010 FSC 0 Chain and Wire Rope Chain and Wire Rope Note-Chain and wire rope, with attachments or terminations will be classified in this class when they are for general use. a. Chain is a series of flexible links and/or rings fitted into one another used for supporting, lifting,restraining, dragging, or transmitting power. b. Wire rope is formed from strands of twisted wire. Includes Bead Chain; Weldless Chain; Single Leg Chain Assemblies; Wire Rope; Wire Cord; Single Leg Wire Assemblies. Excludes Power Transmission Chain (FSC 3020); Slings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4020 FSC 0 Fiber Rope, Cordage, and Twine Fiber Rope, Cordage, and Twine Note-Fiber rope is classified in this class when it is bulk material or for general use. Items with attachments and/or terminations are identified in this class unless a more specific item name is used. a. Fiber rope is flexible twisted strands of manila, nylon or other fiber. b. Cordage is ropes or cords used in rigging (see item name definitions for parameters). c. Twine is two or more strands twisted together. Includes Fibrous Cord Assemblies; Fibrous Cord; Fibrous Rope; Fibrous Twine. Excludes Wire Rope (FSC 4010); Slings (FSC 3940). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4030 FSC 0 Fittings for Rope, Cable, and Chain Fittings for Rope, Cable, and Chain Note All items, including specially designed, will be classified in this FSC. Fittings classified in this FSC are items used in conjunction with chain, rope, and are attached to perform certain functions, (e.g., hooks, shackles, and wedges) refer to item name definitions for parameters. Includes Anchor Guys; Wire Stranded Bands; Wire Rope Clamps; Cargo Hooks; Shackles; Swivels; Rope Terminals; Rope Wedges. Excludes Clamp Blocks (FSC 5340); Support Hooks (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4240 FSC 0 Safety and Rescue Equipment Safety and Rescue Equipment Includes Portable Fire Escapes; Safety Nets, Nonbuoyant. Excludes Divers' Suits; Fixed Fire Escapes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4250 FSC 0 Recycling and Reclamation Equipment Recycling and Reclamation Equipment Includes Material and Machinery designed to remove, neutralize and/or prepare for possible re-use of substances otherwise considered to be un-reclaimable. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4310 FSC 0 Compressors and Vacuum Pumps Compressors and Vacuum Pumps Includes Truck Mounted and Trailer Mounted Compressors. Excludes Refrigeration Compressors (FSC 4130). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4320 FSC 0 Power and Hand Pumps Power and Hand Pumps Excludes Laboratory Jet Pumps (FSG 65 and 66). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4110 FSC 0 Refrigeration Equipment Refrigeration Equipment Note-This class includes only complete refrigeration equipment, whether refrigerated from an integral or remote mechanical refrigeration unit or system. Also included in this class are refrigeration plants, and complete "packaged" refrigeration units and systems containing a power driven compressor, condenser, evaporator, and all other necessary components to refrigerate an enclosed space. Nonoperating accessories such as ice trays, shelves, and panels are included in this class. Excluded from this class are operating components, assemblies, parts, attachments, or accessories, for use in or on complete refrigeration equipment, plants, systems, or the "packaged" refrigeration units, and which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Grocery Type Display Cases; Ice Cream Cabinets; Drinking Fountains (except Portable and stationary types classified in Class 4510); Professional and Scientific Refrigerators; Rivet Coolers; Photographic Refrigerators; Mortuary Refrigerators; Household and Commercial Refrigerators; Grocery Type Showcases; and other types of refrigeration equipment of the commissary or food store type. Excludes Cafeteria Type Refrigerated Display Cases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Carbonators; Combination Heated-Refrigerated Food Serving Equipment; Cafeteria Type Showcases; Chilling Equipment Used for Display and Serving of Food (see Class 7310 for these items). Also excluded from this class are refrigeration components (see Class 4130). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4120 FSC 0 Air Conditioning Equipment Air Conditioning Equipment Note-This class includes only complete air conditioning equipment, systems, and plants. Also included are specially designed nonoperating accessories such as a window panel used with a window type air conditioning unit to facilitate mounting. Excluded from this class are operating components, assemblies, parts, attachments, or accessories for use in or on air conditioning equipment, which are to be classified in Class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. Includes Store Type Units; Window and Room Type Units; Marine, and Vehicular Air Conditioning Units; Air Conditioning Plants and Systems. Excludes Air Conditioning Components (FSC 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4130 FSC 0 Refrigeration and Air Conditioning Components Refrigeration and Air Conditioning Components Includes Heat Exchanger Equipment; Refrigerant Strainers; Refrigeration Compressors; Air Conditioning and Refrigeration Servicing Equipment, such as Charging and testing manifolds, Lines and Units; Operating Components of Refrigeration and Air Conditioning Equipment, Plants, and Systems classified in classes 4110 and 4120. Excludes Refrigeration and Air Conditioning Plants (see classes 4110 and 4120): Collections of Refrigeration Components "packaged" as a unit including a refrigeration compressor, condenser, evaporator, etc., specifically designed and tailored for applications such as walk-in type refrigerators. Individual components of the "packaged" unit will be classified in class 4130, or as otherwise specifically prescribed by the indexes and structure of the FSC. The complete "package" unit will be classified in class 4110. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4140 FSC 0 Fans, Air Circulators, and Blower Equipment Fans, Air Circulators, and Blower Equipment Note-Fans and impellers which are specifically designed for use with specific individual types of equipment are to be classified in the same classes as their next higher assemblies or in the appropriate components or accessories classes (as in Group 25 or 29 or Class 1680) as prescribed by the indexes and structure of the FSC. Includes Wall Type Fans; Pedestal Type Fans; Household Type and Attic Type Exhaust Fans; Floor Fans; Forged Draft Exhaust and Disposal Kits; Fans, Air Circulators, and Blower Equipment, whether designated as "industrial" or "nonindustrial" by application and/or use. Excludes Combination Heater-Fans (FSC 4520). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4150 FSC 0 Vortex Tubes and Other Related Cooling Tubes Vortex Tubes and Other Related Cooling Tubes Includes Tool Grinding spot coolers; machining spot coolers; electronic equipment spot coolers; and electronic cabinet spot coolers. Excludes Refrigeration and Air Conditioning Plants (Classes 4110 and 4120); Air Conditioning Components and Cooler Unit, Air (Class 4130); Cooler, Air, Evaporative (Class 4120) and Pipe and Tube (Group 47). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4210 FSC 0 Fire Fighting Equipment Fire Fighting Equipment Includes Fire Extinguishers; Fire Axes; Fire Rakes; Fire Beaters; Fire Trucks; Fire Hose; Play Pipes; Hose Fittings having one or more Fire Hose End Connections; Fire Hose Reels; Fire Fighting Trailers; Fire Hydrants; Sprinkler Heads. Excludes Wrecking Bars (FSC 5120, 1385). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4220 FSC 0 Marine Lifesaving and Diving Equipment Marine Lifesaving and Diving Equipment Includes Diving and Salvage Apparatus, including Pressurized Divers' Suits; Rescue Nets, Buoyant; Inflatable Life Vests; Life Rafts. Excludes Lifesaving Boats (FSC 1940). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4230 FSC 0 Decontaminating and Impregnating Equipment Decontaminating and Impregnating Equipment Note-Excludes production type equipment designed for impregnation of metal castings and electronic components, processing of leather and textiles, and for similar industrial processing operations. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4235 FSC 0 Hazardous Material Spill Containment and Clean-up Equipment and Material Hazardous Material Spill Containment and Clean-up Equipment and Material Includes Secondary Spill Containment Sumps; Liquid Spill Containment Pallets; Spill Containment Basins; Spill Containment Systems; Absorbent, Sorbent and Blotting Materials. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4330 FSC 0 Centrifugals, Separators, and Pressure and Vacuum Filters Centrifugals, Separators, and Pressure and Vacuum Filters Excludes Laboratory Centrifuges (FSG 65 and 66); Water Purification Filters (FSC 4610). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4410 FSC 0 Industrial Boilers Industrial Boilers Includes Steam Boilers, over 15 pounds WSP. Marine Boilers; Boiler Drums; Water Heaters, Low Pressure (over 100 gallon recovery capacity). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4420 FSC 0 Heat Exchangers and Steam Condensers Heat Exchangers and Steam Condensers admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4430 FSC 0 Industrial Furnaces, Kilns, Lehrs, and Ovens Industrial Furnaces, Kilns, Lehrs, and Ovens Includes Crucible Furnaces; Cupola Furnaces. Excludes Food Industry Ovens (FSC 7310); Metal Heat Treating Furnaces (FSC 3424); Laboratory Type Furnaces (FSC 6640). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4440 FSC 0 Driers, Dehydrators, and Anhydrators Driers, Dehydrators, and Anhydrators Includes Evaporators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4460 FSC 0 Air Purification Equipment Air Purification Equipment Includes Electronic Precipitators; Dust Collection Equipment. Excludes Fan and Blower Equipment (FSC 4140); Air Conditioning Equipment (FSC 4120). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4470 FSC 0 Nuclear Reactors Nuclear Reactors Note-This class includes all types of nuclear reactors and those items which are specifically designed for use within nuclear reactors, their primary cooling systems, auxiliary fluid systems, special propulsion plant systems, handling and servicing equipment, electrical and control systems, and associated special test and water chemistry control items. Excluded from this class are those items for which more specific classifications are suitable. Includes Refueling Machines; Ion Chamber Seals; Thermal Barriers; Control Rods; Steam Generators, Pressurized Water; Reactor Vessel Shells; Handling Carts; Hoisting Units, New and Spent Cartridge. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4510 FSC 0 Plumbing Fixtures and Accessories Plumbing Fixtures and Accessories Includes Bathtubs; Commodes; Lavatories; Shower Cabinets; Sinks; Water Closets; Accessories and Component Parts, such as Dispensers, Faucets, Holders, Racks, Shower Heads, Flush Valves and Stop Valves. Excludes Fittings and Specialties for Hose, Pipe and Tube (FSC 4730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4520 FSC 0 Space and Water Heating Equipment Space and Water Heating Equipment Includes Boilers, 15 pounds WSP and under (for boilers over 15 pounds WSP, see FSC 4410); Domestic Water Storage Tanks through 100 gallon capacity; Fireplace Heaters; Furnaces; Space Heaters; Heating Radiators; Immersion Heaters; Water Heaters, through 100 gallon recovery capacity (for heaters over 100 gallons recovery capacity, see FSC 4410). Excludes Vehicle Heaters; (FSC 2540); Aircraft Heaters (FSC 1660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4530 FSC 0 Fuel Burning Equipment Units Fuel Burning Equipment Units Includes Oil Burners; Stokers; Gas Burners. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4540 FSC 0 Waste Disposal Equipment Waste Disposal Equipment Includes Compactors; Destructors; Garbage Disposals; Incinerators; Septic Tanks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4610 FSC 0 Water Purification Equipment Water Purification Equipment Includes Demineralizers; Filtration Equipment; Ice and Snow Melters. Excludes Water Purification Compounds (FSC 6810 and 7930); Water Softening Compounds (FSC 6810 and 7930). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4620 FSC 0 Water Distillation Equipment, Marine and Industrial Water Distillation Equipment, Marine and Industrial Excludes Laboratory Distillation Apparatus (FSC 6640). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4630 FSC 0 Sewage Treatment Equipment Sewage Treatment Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4710 FSC 0 Pipe, Tube and Rigid Tubing Pipe, Tube and Rigid Tubing Includes Culvert Pipes; Culvert Pipe Connector Bands; Metallic Pipes; Plastic Pipes; Tubes and Rigid Tubing and their assemblies. Excludes Air Conditioning-Heating Pipes (FSC 4520); Asbestos and Cement, Bituminized Fiber, Clay and Concrete Pipes (FSC 5630); Conduit Pipes and their assemblies (FSC 5975); Downspout Pipes (FSC 5670); Exhaust Pipes (FSC 1560, 2990, and 4520); Fire Extinguishing Systems Pipes and Tubes and their assemblies (FSC 4210); Flexible Tubing (FSC 4720); Glass Tubing (FSC 6640, and 9340); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4720 FSC 0 Hose and Flexible Tubing Hose and Flexible Tubing Includes Air Duct, Metallic, Nonmetallic, and Textile Fiber Hoses and their assemblies; Flexible Tubing and their assemblies. Excludes Conduit and their assemblies (FSC 5975); Laboratory Tubes (FSC 6640); Medical and Surgical Tubes (FSC 6515); Rigid Tubing and their assemblies (FSC 4710). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4730 FSC 0 Hose, Pipe, Tube, Lubrication, and Railing Fittings Hose, Pipe, Tube, Lubrication, and Railing Fittings Includes Adapters; Bends; Caps; Clamps; Connectors; Couplings; Crosses; Elbows; Expansion Joints; Ferrules; Flanges; Laterals; Lubrication Fittings; Manifolds; Nipples; Nozzles; Outlets; Plugs; Reducers; Swing and Swivel Joints; Tees; Traps; Unions; Wyes. Excludes Air Conditioning-Heating Fittings (FSC 4520); Bituminized Fiber and Concrete Fittings (FSC 5630); Conduit Boxes and Fittings (FSC 5975); Downspout Fittings (FSC 5670); Medical and Surgical Fittings (FSC 6515); Laboratory Fittings (FSC 6640); Post Caps and Rail Ends (FSC 5660); Machine Thread Bushings and Plugs (FSC 5365). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4810 FSC 0 Valves, Powered Valves, Powered Includes Electric Motor Operated Valves; Hydraulic Operated Valves; Solenoid Operated Valves. Excludes Engine Intake and Exhaust valves (FSC 2990, 2815); Valves specifically designed for use with fire fighting equipment (FSC 4210); plumbing equipment, and the like (FSC 4540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4820 FSC 0 Valves, Nonpowered Valves, Nonpowered Includes Automatic Nonpowered Valves; Gate, Globe, Angle, Check, and Relief Valves; Cocks. Excludes Fire Hydrants (FSC 4210); Sprinkler Heads (FSC 4210); Valves specifically designed for use with fire fighting Equipment (FSC 4210); plumbing equipment, and the like (FSC 4540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4910 FSC 0 Motor Vehicle Maintenance and Repair Shop Specialized Equipment Motor Vehicle Maintenance and Repair Shop Specialized Equipment Includes Automotive Lifts; Wheel Aligners; Brake Service Equipment; Tire Maintenance and Repair Equipment; Test stands and test equipment specially designed for use with motor vehicles. Excludes Hand Tools (FSG 51); Lubrication and Fuel Dispensing Equipment (FSC 4930); Basic types of electrical and electronic test instruments, including those specifically designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments as shown in the indexes in the FSC (FSC 6625). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4920 FSC 0 Aircraft Maintenance and Repair Shop Specialized Equipment Aircraft Maintenance and Repair Shop Specialized Equipment Includes Maintenance stands designed for support of aircraft assemblies during repair or overhaul; Test Stands and Test Equipment specially designed for maintenance and repair of aircraft components such as: engines, generators, hydraulic systems, armament, automatic pilot, fire control, flight control, and navigational systems. Excludes Hand Tools; Airfield Maintenance Platforms; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4921 FSC 0 Torpedo Maintenance, Repair, and Checkout Specialized Equipment Torpedo Maintenance, Repair, and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of torpedoes, torpedo components; adapters, fixtures, inspection and holding fixtures, leveling jack assemblies, fuel filling and syphon assemblies, control surface adapter and protractor assemblies, afterbody cradle adapter and tilting mount assemblies, pressure air heater assemblies, motor drier and puller assemblies, test stand levels and stands for overhaul, maintenance, test, checkout, and repair of torpedo and torpedo components, test panels, fixtures, and test sets for electrical circuits, firing circuits and torpedo test sets. Excludes Specially designed maintenance test, checkout and repair shop specialized equipment for maintenance and repair of ammunition, guided missiles, rockets, fire control, space vehicles, underwater mines, depth charges and nuclear ordnance. Also excludes "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4923 FSC 0 Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment Depth Charges and Underwater Mines Maintenance, Repair, and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout and repair shop specialized equipment for maintenance and repair of depth charges and underwater mines; adapters, inspection, test and holding fixtures; stands for overhaul, maintenance, test, checkout, and repair of underwater mines and depth charges; test fixtures, panels plus assemblies and test sets for leak test, pressure test, firing circuits and timing devices. Excludes Specially designed maintenance, test, checkout, and repair shop equipment designed for nuclear ordnance, guided missiles, ammunition, torpedoes, rockets, fire control, space vehicles and "basic" types of electrical and electronic test instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4925 FSC 0 Ammunition Maintenance, Repair, and Checkout Specialized Equipment Ammunition Maintenance, Repair, and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment, for maintenance and repair of ammunition items; adapters, ammunition feeders and hoppers; inspection and holding fixtures; linkers, linkers-delinkers, and delinkers to assemble and disassemble ammunition belts; surveillance ovens; explosimeters; primer firing device fixtures; mandrels; repositioning machines; gas bomb service kits; test fixtures; panels; plug assemblies; and test sets for ammunition maintenance, checkout and repair. Excludes Maintenance, repair, checkout and test equipment specially designed for use with guided missiles, guided missile remote control systems, guided missile systems; fire control; nuclear ordnance; rockets, underwater mines and depth charges; torpedoes; space vehicles and test equipment for aircraft weapon launchers; basic types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4927 FSC 0 Rocket Maintenance, Repair and Checkout Specialized Equipment Rocket Maintenance, Repair and Checkout Specialized Equipment Includes Specially designed maintenance, test, checkout, and repair shop specialized equipment for maintenance and repair of rockets and rocket components; rocket maintenance stands; test stands; fixtures; jigs; and shop equipment designed for maintenance and repair of rockets, rocket motors and other rocket components. Excludes Specially designed maintenance, test, checkout, and repair shop equipment specifically designed for nuclear ordnance, guided missiles, fire control, torpedoes, underwater mines, depth charges, ammunition, space vehicles; test equipment for aircraft rocket launchers and "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, galvanometers and similar instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4930 FSC 0 Lubrication and Fuel Dispensing Equipment Lubrication and Fuel Dispensing Equipment Includes Hand Grease Guns; Centralized Lubrication Systems; Hydrostatic Lubricators; Oil and Gasoline Dispensing Pumps; Fuel Oil Dispensing Pumps; Hand Oilers; Grease Dispensers; Pressure Gun Attachments; Sight Feed Lubricators. Excludes Alemite and Lubrication Fittings (FSC 4730). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4931 FSC 0 Fire Control Maintenance and Repair Shop Specialized Equipment Fire Control Maintenance and Repair Shop Specialized Equipment Includes Specially Designed Test Equipment, Maintenance Fixtures and Stands. Excludes Instruments for use on both Fire Control and other Equipment; Airborne Fire Control Maintenance and Repair Shop Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4933 FSC 0 Weapons Maintenance and Repair Shop Specialized Equipment Weapons Maintenance and Repair Shop Specialized Equipment Includes Maintenance Stands, Fixtures, and Jigs. Excludes Atomic Ordnance Maintenance and Repair Shop Specialized Equipment; Airborne Weapons Maintenance and Repair Shop Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4935 FSC 0 Guided Missile Maintenance, Repair, and Checkout Specialized Equipment Guided Missile Maintenance, Repair, and Checkout Specialized Equipment Includes Checkout equipment and test equipment specially designed for use with guided missiles and guided missile remote control systems. Excludes Specially designed internal (built-in) checkout equipment for guided missile remote control systems; Basic types of electrical and electronic test instruments, including those specially designed, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC; Test Apparatus used for both communications and other electrical and electronic equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4940 FSC 0 Miscellaneous Maintenance and Repair Shop Specialized Equipment Miscellaneous Maintenance and Repair Shop Specialized Equipment Includes Paint Spraying Equipment. Excludes Hand Tools (FSG 51). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4960 FSC 0 Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment Space Vehicle Maintenance, Repair, and Checkout Specialized Equipment Includes Checkout and Test Equipment specially designed for use with Space Vehicles, including Remote Control Systems. Excludes Checkout and Test Equipment used with both Guided Missiles and Space Vehicles; Specially designed Internal (Built-in) Checkout Equipment for Remote Control Systems; Basic types of Electrical and Electronic Test Instruments, including those specially designed, such as ammeters, ohmmeters, multimeters, and similar instruments, as shown in the indexes to the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 4970 FSC 0 Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment Multiple Guided Weapons, Specialized Maintenance and Repair Shop Equipment Note Maintenance, test, checkout and repair shop equipment designed to test, maintain, fault isolate and repair multiple guided weapon systems. For equipment designed to be used with only one specific system see the individual FSC indexed (i.e., 4921, 4927, 4935). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5110 FSC 0 Hand Tools, Edged, Nonpowered Hand Tools, Edged, Nonpowered Includes Chisels; Files; Pipe Cutters; Rasps; Saws; Screw Plates; Axes; Hatchets; Machetes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5120 FSC 0 Hand Tools, Nonedged, Nonpowered Hand Tools, Nonedged, Nonpowered Includes Hammers; Picks; Pliers, except pliers for cutting only; Screwdrivers; Shovels; Construction Rakes, Forks and Hoes; Jacks, including Contractors' Jacks; Wrecking Bars; Glue Pots; Blowtorches. Excludes Craftsman's Measuring Tools; Gardening Rakes, Forks, Hoes, and other Garden Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5130 FSC 0 Hand Tools, Power Driven Hand Tools, Power Driven Includes Drills; Riveters; Portable Electric Saws; Pneumatic Tools; Abrasive Wheels, Cones, and other Abrasive Attachments for use only on Hand Held Power Tools. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5133 FSC 0 Drill Bits, Counterbores, and Countersinks: Hand and Machine Drill Bits, Counterbores, and Countersinks: Hand and Machine admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5136 FSC 0 Taps, Dies, and Collets; Hand and Machine Taps, Dies, and Collets; Hand and Machine Excludes Punching, Stamping, and Marking Dies. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5140 FSC 0 Tool and Hardware Boxes Tool and Hardware Boxes admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5180 FSC 0 Sets, Kits, and Outfits of Hand Tools Sets, Kits, and Outfits of Hand Tools Note-This class includes sets, kits and outfits consisting of several different items classifiable either in a single class or in several classes. Excluded from this class are sets, kits and outfits consisting of variations (such as size or color) of an item. Classify these items in the same class as the individual item. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5210 FSC 0 Measuring Tools, Craftsmen's Measuring Tools, Craftsmen's Note-This class does not include special inspection gages, which are classified in Class 5220. Includes Calipers; Levels; Micrometers; Plumb Bobs; Precision Tapes; Squares; Angle Gages; Center Gages; Depth Gages; Draw Gages; Drill Point Gages; Fillet and Radius Gages; Glaziers' Gages; Height Gages (Vernier); Planer Gages; Rivet Selector Gages; Saw Tooth Set Gages; Screw Pitch Gages; Surface Gages; Telescoping Gages; Thickness Gages; Tube Bead Gages; Tube Flare Gages; Twist Drill Gages; Twist Drill and Rod Gages; Twist Drill and Tap Gages; Taper-Wire-Thickness Gages; Wire Gages; Tool Setting Planer and Shaper Gages; Gage Blocks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5220 FSC 0 Inspection Gages and Precision Layout Tools Inspection Gages and Precision Layout Tools Note-Special inspection gages are included in this class. Includes Go and Not-Go Gages, including Plug, Ring, Snap, Thread, and Length Gages; Profile Gages; Fixture Gages; Special Inspection Gages. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5280 FSC 0 Sets, Kits, and Outfits of Measuring Tools Sets, Kits, and Outfits of Measuring Tools admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5305 FSC 0 Screws Screws admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5306 FSC 0 Bolts Bolts admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5307 FSC 0 Studs Studs admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5310 FSC 0 Nuts and Washers Nuts and Washers Note Nuts and washers, including specially designed, are to be classified in this FSC. a. Nuts are a small metal block made in a variety of shapes such as square and hexagonal which is drilled and internally threaded. b. Washers are a perforated piece of metal, leather, or other materials of various shapes or forms. They are used primarily as a seat for a bolt, nut, screw, rivet or nail to distribute pressure and prevent endwise motion over an area and/or to prevent movement between two parts by means of restraining features created by the shape of its edges. Includes Locknuts; Eye Nuts; Plain Nuts; Castellated Nuts; Wing Nuts; Plate Nuts; Push on Nuts; Concave and Convex Washers; Flat Washers; Keyed Washers; Lock Washers; Shouldered Washers; Split Washers. Excludes Bearing Thrust Washers (FSC 3120); Shims (FSC 5365); Ring Spacers (FSC 5365); Plate Spacers (FSC 5365); Lock Rings (FSC 5365). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5315 FSC 0 Nails, Machine Keys, and Pins Nails, Machine Keys, and Pins Note Nails, machine keys, and pins, including specially designed, will be classified in this FSC. a. Nails are slender, usually pointed fasteners with a head, and designed for insertion by impact. b. Machine keys are items generally inserted between two items, usually in a groove, to prevent relative rotation e.g., shaft and hub. c. Pins are cylindrical items of various materials used to align/attach two or more parts together and may allow for angular movement. Includes Dowel Pins, Split Pins; Spikes; Tacks; Nonoffice Type Staples; Machine Keys; Brads; Shouldered Pins; Cotter Pins; Nails. Excludes Shafts (FSC 3040); Lock Keys (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5320 FSC 0 Rivets Rivets admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5325 FSC 0 Fastening Devices Fastening Devices Includes Eyelets; Grommets; Aircraft Cowling Fasteners; Textile Fasteners; Retaining Rings; Threaded Inserts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5330 FSC 0 Packing and Gasket Materials Packing and Gasket Materials Note This FSC includes only seals and gaskets designed for standard use. Seals, gaskets and packing are made from materials specifically designed and constructed to resist deterioration from the action of heat, gas, chemicals, liquids, and used to fill a cavity and create a tight seal. Similar materials used to make seals, gaskets, and packing are available in bulk form, refer to FSG 93, FSG 80, and FSG 83. Includes General Purpose Oil Grease, Air, Liquid, Gas, and chemical Seals; Oakum; Prefabricated Gaskets and Seals designed for a single specific application. Excludes O-Rings (FSC 5331); Bulk material items, such as; Rubber, Cork, and Asbestos Sheets and Strips (FSG 93); Liquid Gasket Materials (RTV, Permatex, etc.) (FSG 80); RFI and EMI Seals and Gaskets (FSC 5999), and all Seal Retainers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5331 FSC 0 O-Ring O-Ring Excludes Packing and Gasket Material (FSC 5330). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5335 FSC 0 Metal Screening Metal Screening Note Metal Screening is a perforated plate or cylinder or a meshed wire fabric usually mounted and used to separate coarse from finer parts. Includes Insect Screening; Industrial Metal Cloth; Industrial Metal Mesh. Excludes Fencing (FSC 5660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5340 FSC 0 Hardware, Commercial Hardware, Commercial Note Common hardware designed primarily for commercial use will be classified in this FSC. Hardware is the physical, tangible and permanent components of end items that may not be classified elsewhere. It consists also of common items that are commonly used in construction and/or manufacturing (e.g., hinges, door locks). Includes Access Covers; Bumpers; Casters; Cabinet and Door Hardware; Clevises; Hinges; Latches; Straps and Strapping; Turnbuckles; Webbed Straps. Excludes Weapons System Hardware (FSC 5342). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5341 FSC 0 Brackets Brackets Note All brackets, including specially designed for specific use an/or application, will be classified in this FSC. Brackets are items of rigid construction that sustain a secondary item. Includes Angle Brackets; Double Angle Brackets; Mounting Brackets. Excludes Corner Braces (FSC 5340); "T" Braces (FSC 5340); Mending Plates (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5342 FSC 0 Hardware, Weapon System Hardware, Weapon System Note Hardware designed for weapon systems unique applications will be classified in this FSC. Includes Adapters; Anchor Plates and Straps; Anodes; Bellows; Couplings; Control Rods; Access Doors; Fairleads; Mounts; Tie Rods; Yokes. Excludes Commercial Hardware (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5345 FSC 0 Disks and Stones, Abrasive Disks and Stones, Abrasive Includes Abrasive Belts and Belting; Hones; Abrasive Wheels, Multiapplication. Excludes Dental Abrasives; Abrasive Cones, and other Abrasive Attachments for equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5350 FSC 0 Abrasive Materials Abrasive Materials Includes Cloth; Papers; Powders; Abrasive Polishing Compounds; Metal Finishing Abrasives; Industrial Diamonds; Diamond Dust; Rouge. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5355 FSC 0 Knobs and Pointers Knobs and Pointers Includes Knobs, including Calibrated Knobs; Dials, Scale. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5360 FSC 0 Coil, Flat, Leaf, and Wire Springs Coil, Flat, Leaf, and Wire Springs Note-All springs, including specially designed, will be classified in this FSC. A spring is an elastic mechanical device that regains its original shape after being compressed, extended or deflected. Includes Compression Springs; Torsion Springs; Leaf Spring Assemblies; Flat Springs; Extension Springs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5365 FSC 0 Bushings, Rings, Shims, and Spacers Bushings, Rings, Shims, and Spacers Note-All items, including specially designed, will be classified in this FSC. a. A bushing is cylindrical in shape, hollow, and designed primarily to be inserted into a hole to reduce the effective inside diameter of the hole, and to protect the body structure about the hole from damage resulting from stress, strain, and vibration. b. A ring is cylindrical in shape, usually flat with a center hole. Rings are multi-applicational. See specific item name for designated usage. c. A shim is a thin, sometimes tapered, piece of material used to fill in space between things. See specific item name for dimensional parameters. d. A spacer is a device for holding two members at a given distance from each other. Includes Externally Threaded Rings; Keyed and Serrated Lock Rings; Dee Rings; Instrument Retaining Rings; Shim Sets and Assortments; Plate Spacers; Ring Spacers; Sleeve Spacers; Stepped Spacers; Spacer Sets and Assortments; Sleeve Bushings; Machine Threaded Bushings; Machine Threaded Plugs. Excludes Sleeve Bearings (FSC 3120); Pipe Threaded Plugs (FSC 4730); Piston Rings (FSC 2520, 2805, 2810, 2815, 2825, 2990, 3040, 4310, and 4820); Retaining Rings (FSC 5325); Shim Stock (FSC 9515). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5410 FSC 0 Prefabricated and Portable Buildings Prefabricated and Portable Buildings Includes Prefabricated Panels; Inflatable Shelters; Metal Screens and Metal Windows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5411 FSC 0 Rigid Wall Shelters Rigid Wall Shelters Includes Expandable and nonexpandable shelters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5419 FSC 0 Collective Modular Support System Collective Modular Support System Note Includes Self-Contained habitat, containing facilities normally expected in a "Rest and Recreational" area, such as; billeting, food services, laundry, shower/hygiene services, recreational and support services that enhance morale and welfare. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5420 FSC 0 Bridges, Fixed and Floating Bridges, Fixed and Floating Includes Special Bridge Erection Equipment; Bridge Floats and Pontoons; Tramways; Trestles. Excludes Pontoons and Floating Docks (FSC 1945). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5430 FSC 0 Storage Tanks Storage Tanks Includes Assembled and Unassembled Tanks for storage only; Enclosures for Pressure and Vacuum Tanks; Petroleum Bulk Storage Tanks. Excludes Boiler Tanks (FSC 4410); Hot Water Tanks (FSC 4520). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5440 FSC 0 Scaffolding Equipment and Concrete Forms Scaffolding Equipment and Concrete Forms Includes Prefabricated Concrete Placing Forms; Builders' Ladders and Stepladders; Suspension stages. Excludes Aircraft Ladders (FSC 1730); Fire Fighting Ladders (FSC 4210); Maintenance Ladders (FSC 4940); Marine Vessel Ladders (FSC 2090); Vehicle Ladders (FSC 2540). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5445 FSC 0 Prefabricated Tower Structures Prefabricated Tower Structures Includes Power Transmission Towers; Radar Towers; Searchlight Towers; Control Towers; Prefabricated Tower Components, such as Anchor Rails, Tie Rods, Braces, Steps, Guy Assemblies; Specialized Tower Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5450 FSC 0 Miscellaneous Prefabricated Structures Miscellaneous Prefabricated Structures Includes Bleachers; Grandstands. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5510 FSC 0 Lumber and Related Basic Wood Materials Lumber and Related Basic Wood Materials Includes Dimensional Lumber; Wood Flooring; Mine Timbers; Poles; Railroad Ties; Wood Siding; Molding; Stakes. Excludes Millwork (FSC 5520); Plywood and Veneer (FSC 5530); Prefabricated Non-Wood Items (FSC 5670). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5520 FSC 0 Millwork Millwork Includes Door Frames; Doors; Window Frames; Window Sashes. Excludes Molding (FSC 5510); Prefabricated Non-Wood Items (FSC 5670). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5530 FSC 0 Plywood and Veneer Plywood and Veneer Includes Plywood and Veneered Panels. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5610 FSC 0 Mineral Construction Materials, Bulk Mineral Construction Materials, Bulk Includes Asphalt; Cinders; Gravel; Lime; Sand; Rough Dimension Stone, including Rubble; Cement; Ballast. Excludes Block, Shaped; Brick. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5620 FSC 0 Tile, Brick and Block Tile, Brick and Block Includes Concrete Building Block; Cinder Block; Slag Brick; Cut Stone; Cut and Polished Stone; Ceramic Floor and Wall Tile; Architectural Terra Cotta; Concrete Slabs and Grilles. Excludes Glass Building Block (FSC 9340) admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5630 FSC 0 Pipe and Conduit, Nonmetallic Pipe and Conduit, Nonmetallic Includes Concrete Pipe and Conduit; Clay Pipe and Conduit for underground use; Drain Tile; Nonmetallic Pipe Fittings for underground use. Excludes Nonmetallic Pipe, Conduit, and Fittings for laboratory or electrical use; Hose and Tubing, Flexible Nonmetallic. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5640 FSC 0 Wallboard, Building Paper, and Thermal Insulation Materials Wallboard, Building Paper, and Thermal Insulation Materials Includes Paper Building Board; Ceiling Board; Gypsum Board; Insulating Board; Plasterboard; Soundproofing Board; Tar Paper; Wallpaper; Mineral Wool; Glass Wool Batts; Pipe Covering. Excludes Electrical Insulation Materials. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5650 FSC 0 Roofing and Siding Materials Roofing and Siding Materials Includes Roofing (all materials), including Sheet Metal; Roofing Felt; Roll Roofing; Roofing Tile; Shingles. Excludes Tar Paper; Bulk Sheet Metal Roofing and Siding; Wood Siding. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5660 FSC 0 Fencing, Fences, Gates and Components Fencing, Fences, Gates and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5670 FSC 0 Building Components, Prefabricated Building Components, Prefabricated Note-Items specified as wooden are classified in 5520 Includes Door Frames; Window Frames; Window Sashes; Eave Troughs (Gutters); Gratings; Grilles; Shutters; Fixed Fire Escapes; Mounted Partitions. Excludes Plumbing and associated components such as Sinks; Wallbaord and items classified as furniture. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5675 FSC 0 Nonwood Construction Lumber and Related Materials Nonwood Construction Lumber and Related Materials Includes Nonwood Dimensional Lumber; Flooring; Special Turning and Carvings; Nonwood Veneer. Excludes Millwork and Wood Veneer (FSCs 5520 and 5530); Items specified as Wooden (FSC 5510). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5680 FSC 0 Miscellaneous Construction Materials Miscellaneous Construction Materials Includes Expanded Metal Lath; Airplane Landing Mats; Traction Mats. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5805 FSC 0 Telephone and Telegraph Equipment Telephone and Telegraph Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5810 FSC 0 Communications Security Equipment and Components Communications Security Equipment and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5811 FSC 0 Other Cryptologic Equipment and Components Other Cryptologic Equipment and Components admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5815 FSC 0 Teletype and Facsimile Equipment Teletype and Facsimile Equipment Includes Ticker Tape and Sigtot Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5820 FSC 0 Radio and Television Communication Equipment, Except Airborne Radio and Television Communication Equipment, Except Airborne Includes Telemetering Equipment. Excludes Home Type Radio and Television Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5821 FSC 0 Radio and Television Communication Equipment, Airborne Radio and Television Communication Equipment, Airborne Includes Telemetering Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5825 FSC 0 Radio Navigation Equipment, Except Airborne Radio Navigation Equipment, Except Airborne Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5826 FSC 0 Radio Navigation Equipment, Airborne Radio Navigation Equipment, Airborne Includes Loran Equipment; Shoran Equipment; Direction Finding Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5830 FSC 0 Intercommunication and Public Address Systems, Except Airborne Intercommunication and Public Address Systems, Except Airborne Includes Wired Audio Systems; Office Type Systems; Shipboard Systems; Tank Systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5831 FSC 0 Intercommunication and Public Address Systems, Airborne Intercommunication and Public Address Systems, Airborne admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5835 FSC 0 Sound Recording and Reproducing Equipment Sound Recording and Reproducing Equipment Excludes Phonographs, Home Type; Dictating Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5836 FSC 0 Video Recording and Reproducing Equipment Video Recording and Reproducing Equipment Note This class includes, and is restricted to electronic video equipment such as video monitors, televisions, cameras, printers and recorders/reproducers used with miscellaneous communication equipment. Also included is associated equipment such as cleaners, splicers, rewinders, reels and tapes designed for use with video recording-reproducing equipment. Excluded from the class is photographic type equipment (Group 67), ADP type computer monitors (Group 70), and video equipment which includes radio receivers/transmitters (properly classified in more specific classes in Group 58). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5840 FSC 0 Radar Equipment, Except Airborne Radar Equipment, Except Airborne Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5841 FSC 0 Radar Equipment, Airborne Radar Equipment, Airborne Note-Radar assemblies and subassemblies designed specifically for use with fire control equipment or guided missiles are excluded from this class and are included in the appropriate classes of Group 12 or Group 14. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5845 FSC 0 Underwater Sound Equipment Underwater Sound Equipment Note-This class excludes items specifically designed for fire control sonar systems. Includes Sonar Equipment; Underwater Listening Equipment; Sonobuoys; Sonobuoy Launchers; Fathometers; Sofar Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5850 FSC 0 Visible and Invisible Light Communication Equipment Visible and Invisible Light Communication Equipment Note-This class includes only communication types of infrared equipment. Excluded from this class are infrared assemblies, subassemblies, and components designed specifically for use in fire control systems, guided missile systems, test and maintenance specialized equipment, night vision equipment, and other noncommunication types of equipment. Includes Heliographs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5855 FSC 0 Night Vision Equipment, Emitted and Reflected Radiation Night Vision Equipment, Emitted and Reflected Radiation Note-This class includes image forming devices and associated aids, their subassemblies and components, utilizing passive and/or active techniques for detection, observation, and identification of terrain and objects at night, while maintaining concealment afforded by darkness. Includes items having multiapplication for purposes of fire control, and/or night observation, and/or detection. Excluded from this class are items for which more specific classifications are suitable as prescribed by the structure and indexes of the FSC. Includes Sighting and Observation Devices, Target Detectors and Locators, Remote Viewing Systems utilizing heat radiation emitted from object(s), associated Radiation Sources, Image Converters and Image Intensifiers, Optical Cells and other components designed for Night Vision Equipment. Holders and Lens used with Infrared Equipment are also included in this FSC. Excludes Optical Sighting devices which incorporate both day and night viewing characteristics within an integral unit for fire control purpose, nonnight vision type items designed for use with guided missiles, communications, or laboratory equipment, and Optical Elements, such as Lens, Prisms, Windows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5860 FSC 0 Stimulated Coherent Radiation Devices, Components, and Accessories Stimulated Coherent Radiation Devices, Components, and Accessories Note-This class includes, and is restricted to, devices the operation of which is based on principles involving the stimulated emission of radiation, and to associated components and accessories directly related to stimulated coherent radiation techniques. The methods for producing the radiation are those obtained by LASER (Light Amplification by Stimulated Emission of Radiation) and by MASER (Microwave and/or Molecular Amplification by Stimulated Emission of Radiation) techniques. Only those items specifically designed for stimulated coherent radiation applications, and having no other application, are to be included in this class. Assemblies or major systems containing such devices are excluded from this class. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5865 FSC 0 Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment Electronic Countermeasures, Counter-Countermeasures and Quick Reaction Capability Equipment Note-This class includes, and is restricted to, passive and active electronic equipment, systems, and subsystems designed to prevent or reduce an enemy's effective use of radiated electromagnetic energy or designed to insure our own effective use of radiated electromagnetic energy. Includes Electronic Countermeasures, Electronic Counter-Countermeasures, Electronic Support Measures, and Quick Reaction Capability Equipment and components specially designed therefore which are not classifiable elsewhere in the FSC Structure. Excluded from this class are non-electronic items which are properly classified in more specific classes in accordance with the FSC structure and indexes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5895 FSC 0 Miscellaneous Communication Equipment Miscellaneous Communication Equipment Note-This class includes miscellaneous communication equipment that is not classified in more specific classes (see the NOTE for FSG 58). Includes Modems. Excludes Electronic Countermeasures Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5905 FSC 0 Resistors Resistors Includes Varistors; Resistive ballast Tubes; Rheostats; Resistor Networks; Resistor Mounting Hardware; Thermistors. Excludes Resistance Wire. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5910 FSC 0 Capacitors Capacitors Includes Interference Filter Capacitors; Capacitor Mounting Hardware. Excludes Semiconductor Devices and Associated Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5915 FSC 0 Filters and Networks Filters and Networks Note-This class includes those filters and networks which consist of a combination of resistors, capacitors, or coils, but not a combination of resistors only (classified in 5905), capacitors only (classified in 5910), or coils only (classified in 5950). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5920 FSC 0 Fuses, Arrestors, Absorbers, and Protectors Fuses, Arrestors, Absorbers, and Protectors Includes Fuseholders; Fuse Boxes; Fuse Posts; Fuse Links; Fuse Blocks; Current Limiters; Corona Balls; Electrostatic Dischargers. Excludes Circuit Breakers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5925 FSC 0 Circuit Breakers Circuit Breakers Includes Circuit Breakers and Cutouts. Excludes Relays. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5930 FSC 0 Switches Switches Includes Rotary, Knife, Toggle, Push Button, Mercury, Thermostatic, and Differential Pressure Switches. Excludes Switchgear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5935 FSC 0 Connectors, Electrical Connectors, Electrical Includes Plugs; Jacks; Receptacles, Electronic Component Sockets and Associated Accessories Excludes Interconnectors, Fiber Optic admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5940 FSC 0 Lugs, Terminals, and Terminal Strips Lugs, Terminals, and Terminal Strips Includes Binding Posts; Battery Clips; Stud Terminals; Test Clips. Excludes Caps, Electrical; Clips, Electrical; and Contacts, Electrical. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5945 FSC 0 Relays and Solenoids Relays and Solenoids Includes Electromagnetic Actuators. Excludes Contractors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5950 FSC 0 Coils and Transformers Coils and Transformers Includes Coils, except ignition and magneto; coil assemblies; magnetic amplifiers; reactors; transformers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5955 FSC 0 Oscillators and Piezoelectric Crystals Oscillators and Piezoelectric Crystals Includes Crystal Units, Processed Unmounted Crystals, Crystal Controlled Oscillators and Noncrystal Controlled Oscillators Excludes Crystal Controlled Oscillators and Noncrystal Controlled Oscillators which meet the definition of the term "electronic module" as defined for FSC 5963 and Microcircuits admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5960 FSC 0 Electron Tubes and Associated Hardware Electron Tubes and Associated Hardware Includes Rectifying Tubes; Photoelectric Tubes; Electron Vibrator Tubes. Excludes Transistors; Tube Sockets; X-ray Tubes; Semiconductor Devices and Associated Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5961 FSC 0 Semiconductor Devices and Associated Hardware Semiconductor Devices and Associated Hardware Includes Semiconductor Assemblies; Semiconductor Diodes; Semiconductor Rectifiers, Semiconductor Thyristors; Transistors; Unitized Semiconductors; Associated Hardware except Sockets. Excludes Microcircuits; Optoelectronic Devices and Associated Hardware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5962 FSC 0 Microcircuits, Electronic Microcircuits, Electronic Note-(1) A microcircuit is defined as follows: A small circuit having a high equivalent circuit element density, which is considered as a single part composed of interconnected elements placed and/or formed on or within a single substrate to perform an electronic circuit function. The elements may be formed on or within a semiconductor material substrate; may consist of conductive film(s) formed on an insulating substrate; or may be a combination of one or both of these types with discrete elements. (2) The term "microcircuit", as applied to circuit devices included in this class, is delimited to exclude items consisting solely of interconnected "microcomponents" (discrete miniaturized components). Also excluded are items fabricated in the form of monolithic thick-film or thin-film structures that in themselves are not functional electronic circuits (e.g., Capacitors, Resistors, Transistors, or "arrays" thereof). Includes Integrated Circuit Devices; Integrated Circuit Modules, Integrated Electronic Devices: Hybrid, Magnetic, Molecular, Opto-Electronic, and Thin Film. Excludes Single Circuit Elements such as Capacitors; Resistors; Diodes and Transistors; Printed Circuit Boards and Circuit Card Assemblies; and Filters and Networks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5963 FSC 0 Electronic Modules Electronic Modules Note-The term "electronic module" as used in this class designates an electronic component designed for use in various equipment or end item applications, and capable of controlling voltage and/or current to produce gain, oscillation, switching, or similar integral electronic functions. It consists of a collection of miniaturized electronic parts and/or elements in a single replaceable package with plug-in mounting which will also complete the required electrical connections. It is not normally subject to disassembly as distinguished from such items as CIRCUIT CARD ASSEMBLY and ELECTRONIC COMPONENTS ASSEMBLY. These modules conform to industry or government specifications/standards that define all physical dimensions and electrical parameters required to promote commonality and ensure proper operational performance. Excludes MICROCIRCUITS; Electronic Test Equipment Plug-In Units. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5965 FSC 0 Headsets, Handsets, Microphones and Speakers Headsets, Handsets, Microphones and Speakers admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5970 FSC 0 Electrical Insulators and Insulating Materials Electrical Insulators and Insulating Materials Includes Tube, Knob, Cleat, Strain, and Standoff Insulators; Feed Thru Insulators; Bead Insulators; Varnish Cambric Tape; Friction Tape. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5975 FSC 0 Electrical Hardware and Supplies Electrical Hardware and Supplies Includes Conduit; Raceways; Face Plates; Condulets; Outlet and Junction Boxes; Pole Line Hardware, not elsewhere classifiable. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5977 FSC 0 Electrical Contact Brushes and Electrodes Electrical Contact Brushes and Electrodes Includes Brushes for electrical rotating equipment; Carbon Stock for Brushes; Brush Arm and Holders; Lighting Electrodes. Excludes Anodes; Cathodes; Welding Electrodes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5980 FSC 0 Optoelectronic Devices and Associated Hardware Optoelectronic Devices and Associated Hardware Includes Optoelectronic devices and assemblies which display numeric, alpha-numeric, symbolic, or graphic information, emitters, and nondisplay optoelectronic devices, such as couplers, detectors, and switches which perform an active function in an electronic system% Excludes electric lighting fixtures, lamps, and associated hardware% admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5985 FSC 0 Antennas, Waveguides, and Related Equipment Antennas, Waveguides, and Related Equipment Includes Aerials; Masts; Tower Equipment; Attenuators; Couplers; Transmission Lines. Excludes Tower Structures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5990 FSC 0 Synchros and Resolvers Synchros and Resolvers Excludes Synchro Systems; Servo Mechanisms. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5995 FSC 0 Cable, Cord, and Wire Assemblies: Communication Equipment Cable, Cord, and Wire Assemblies: Communication Equipment Note-This class includes only those types of cable, cord, and Wire Assemblies and Sets (and Wiring Harnesses) used on or with equipment and components covered by Groups 58 and 59. Cable, Cord, Wire Assemblies, and Sets (Wiring Harnesses) used on or with equipment classified in FSC Groups other than Groups 58 or 59 are classified in FSC Class 6150 if multiapplication, or classified with the next higher classifiable assembly if specially designed. Excludes Cable Assemblies, Fiber Optic. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5996 FSC 0 Amplifiers Amplifiers Includes Audio Amplifiers, Complementary Amplifiers, Amplifiers, Operational Amplifiers, Power Amplifiers, Radio Frequency Amplifiers, Signal Amplifiers, and Video Amplifiers. Excludes multi-functional items such as Amplifier-Detector, Amplifier-Mixer and microcircuit devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5998 FSC 0 Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware Electrical and Electronic assemblies, Boards, Cards, and Associated Hardware Excludes circuit card and electronic component assemblies which can be identified to a more definitive Approved Item Name. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 5999 FSC 0 Miscellaneous Electrical and Electronic Components Miscellaneous Electrical and Electronic Components Includes Permanent Magnets and Magnetostriction Elements; Caps, Clips, and Contacts, Electrical. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6010 FSC 0 Fiber Optic Conductors Fiber Optic Conductors Note-Included in this class are bulk discrete fibers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6015 FSC 0 Fiber Optic Cables Fiber Optic Cables Note-Included in this class are one or more discrete fiber optic conductors with a common protective covering in bulk form. May include electrical conductors/cables and/or reinforcing material. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6020 FSC 0 Fiber Optic Cable Assemblies and Harnesses Fiber Optic Cable Assemblies and Harnesses Note-Included in this class are items used for communication and/or data transmission having one or more fiber optic conductors/cables with processed end(s) or terminated in fitting(s). Excluded from this class are items used for illumination and/or image transmission. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6021 FSC 0 Fiber Optic Switches Fiber Optic Switches Note-Included in this class are switches used for line selection in fiber optic systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6030 FSC 0 Fiber Optic Devices Fiber Optic Devices Note Included in this class are such items as transmitters, receivers, multiplexers, demultiplexers, modulators, demodulators, repeaters, attenuators, filters, integrated optical ciruuits, and the like, used in fiber optic systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6032 FSC 0 Fiber Optic Light Sources and Photo Detectors Fiber Optic Light Sources and Photo Detectors Note Included in this class are light emitting and laser diodes and photo detectors used in fiber optic systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6035 FSC 0 Fiber Optic Light Transfer and Image Transfer Devices Fiber Optic Light Transfer and Image Transfer Devices Note-Included in this class are fiber optic devices used for illumination and/or image transmission. Excluded from this class are items used for communication and/or data transmission. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6060 FSC 0 Fiber Optic Interconnectors Fiber Optic Interconnectors Note Included in this class are all types of fiber optic terminations, such as connectors, dividers, couplers, rotary and nonrotary joints, splitters, mixers and splicers and the like. Excludes electrical connectors admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6070 FSC 0 Fiber Optic Accessories and Supplies Fiber Optic Accessories and Supplies Note-Included in this class are mode stripping materials, index matching materials and other related supplies. Excluded from this class are hardware and supplies common to both electrical and fiber optic applications which are classifiable on FSC 5975. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6080 FSC 0 Fiber Optic Kits and Sets Fiber Optic Kits and Sets Note-Included in this class are kits and sets which consist of fiber optic components only; fiber optic components and related parts; fiber optic components and related tools; or fiber optic components, related parts and related tools. Excluded from this class are tool kits and sets which are classifiable in FSC 5180; test sets/instruments classifiable in FSG 66; and end item sets/equipment utilizing fiber optic components which are classifiable in the applicable equipment FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6099 FSC 0 Miscellaneous Fiber Optic Components Miscellaneous Fiber Optic Components Note-Included in this class are fiber optic items which are not classifiable in a more specific class. (See the "Note" for FSG 60.) admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6105 FSC 0 Motors, Electrical Motors, Electrical Excludes Starting Motors for Engines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6110 FSC 0 Electrical Control Equipment Electrical Control Equipment Includes Contactors; Motor Controllers; Power Servomechanisms; Switchgear; Voltage Regulators. Excludes Automatic Pilot Mechanisms; Relays; Resistors. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6115 FSC 0 Generators and Generator Sets, Electrical Generators and Generator Sets, Electrical Includes Engine, Turbine, Wind, and Hand Driven Generator Sets and Auxiliary Aircraft Generators. Excludes Motor-Converters; Motor-Generator Sets; Engine Generators; Engine Accessory Generators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6116 FSC 0 Fuel Cell Power Units, Components, and Accessories Fuel Cell Power Units, Components, and Accessories Note-This class includes items that are designed to produce an electromotive force directly from an oxidation-reduction type of chemical reaction. A complete power unit must include tanks, pumps, and associated control equipment, and requires a continuous, uninterrupted supply of liquid or gaseous fuel and oxidizers. Includes Complete Functioning Fuel Cell Power Units; Fuel Cells; Fuel Cell Assemblies or Modules; Fuel Cell Reactant Chambers; Fuel Feed Mechanisms; Electrolyte Heaters; Heat Exchangers; and other internal components peculiar to, and used exclusively on or with, Fuel Cell Power Units classified in this class. Excludes Primary Batteries (FSC 6135); Secondary Batteries (FSC 6140); Generators and Generating Sets (FSC 6115); and items for which more suitable classes are specifically prescribed by the indexes and structure of the FSC. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6117 FSC 0 Solar Electric Power Systems Solar Electric Power Systems Note-This class includes items which are designed for the direct conversion of solar energy into electrical power. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6120 FSC 0 Transformers: Distribution and Power Station Transformers: Distribution and Power Station Note This class includes transformers with a kilovolt-ampere rating above 1 kva. Excludes Potential and Current Transformers admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6125 FSC 0 Converters, Electrical, Rotating Converters, Electrical, Rotating Note-This class includes devices employing mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Excluded from this class are electrical generators and generator sets (FSC 6115). Includes Complete Battery Charging Equipment, Rotating; Dynamotors; Motor-Converters; Motor-Generator Sets; Phase Converters; Rotating Equipment; Synchronous Converters. Excludes Nonrotating Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6130 FSC 0 Converters, Electrical, Nonrotating Converters, Electrical, Nonrotating Note This class includes devices employing a means other than mechanical rotation for changing electrical energy from one form to another (i.e., AC to AC, DC to DC, AC to DC, and DC to AC). Includes Complete Battery Charging Equipment, Nonrotating; Power Supplies, Multiapplication. Excludes Rectifying Tubes; (FSC 5960); Rectifying Crystals (FSC 5961); Rotating Equipment (FSC 6125); Transformers (FSC 5950); and Semiconductor Devices and Associated Hardware (FSC 5961). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6135 FSC 0 Batteries, Nonrechargeable Batteries, Nonrechargeable Includes Cells and Dry Batteries; Nuclear Batteries. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6140 FSC 0 Batteries, Rechargeable Batteries, Rechargeable Includes Rechargeable Cells and Batteries. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6145 FSC 0 Wire and Cable, Electrical Wire and Cable, Electrical Note-This class includes only bulk electrical wire and cable. Excluded from this class are electrical wire and cable items of definite length either with processed ends, or terminated in fittings. Includes Insulated and Noninsulated, Wire and Cable, such as, Antenna Wire, Coaxial Cable, Fuse and Resistance Wire, and Magnet Wire. Excludes Radio Frequency Transmission Line (FSC 5985); Fiber Optic Cable (FSC 6015); Communication Cable Assemblies (FSC 5995); Distribution and Power Transmission Cable Assemblies (FSC 6150). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6150 FSC 0 Miscellaneous Electric Power and Distribution Equipment Miscellaneous Electric Power and Distribution Equipment Includes Appliance and Extension Cords; Electric Power and Distribution Cable with Attachments, Multiapplication; Common Components of Electrical Rotating Equipment, such as End Bells and Frames. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6160 FSC 0 Miscellaneous Battery Retaining Fixtures and Liners Miscellaneous Battery Retaining Fixtures and Liners Includes Battery Boxes, Covers, Liners, Racks, Retainers, and Trays. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6210 FSC 0 Indoor and Outdoor Electric Lighting Fixtures Indoor and Outdoor Electric Lighting Fixtures Includes Airport, Railroad Platform, Stadium, and Street Lighting Fixtures. Excludes Nonelectrical Outdoor Fixtures; Signal Fixtures; Nonelectrical Indoor Fixtures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6220 FSC 0 Electric Vehicular Lights and Fixtures Electric Vehicular Lights and Fixtures Includes Automotive, Marine, Railroad, and Aircraft Lights and Fixtures. Excludes Nonelectrical Vehicular Fixtures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6230 FSC 0 Electric Portable and Hand Lighting Equipment Electric Portable and Hand Lighting Equipment Includes Floodlights; Searchlights; Extension Lights. Excludes Nonelectrical Portable and Hand Lighting Equipment; Signal and Alarm Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6240 FSC 0 Electric Lamps Electric Lamps Includes Fluorescent Lamps; Incandescent Lamps, Large and Miniature; Mercury Lamps; Sodium Lamps. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6250 FSC 0 Ballasts, Lampholders, and Starters Ballasts, Lampholders, and Starters admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6260 FSC 0 Nonelectrical Lighting Fixtures Nonelectrical Lighting Fixtures Includes Lanterns, Nonelectrical; Hand and Portable Carbide Lamps; Candles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6310 FSC 0 Traffic and Transit Signal Systems Traffic and Transit Signal Systems Excludes Railroad Signals. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6320 FSC 0 Shipboard Alarm and Signal Systems Shipboard Alarm and Signal Systems admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6330 FSC 0 Railroad Signal and Warning Devices Railroad Signal and Warning Devices Includes Railroad Gates; Flasher Lights; Block Signals. Excludes Semaphore Flag Signals. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6340 FSC 0 Aircraft Alarm and Signal Systems Aircraft Alarm and Signal Systems Includes Oxygen Pressure Signals and Warning Devices; such as Air Pressure Warning Signals, Aircraft Crew Warning Signals, Altitude Warning Signals, Alarm Controls, Audible Landing Gear Alarms. Excludes Aircraft Engine Oil and Fuel Warning Devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6350 FSC 0 Miscellaneous Alarm, Signal, and Security Detection Systems Miscellaneous Alarm, Signal, and Security Detection Systems Includes Anti-intrusion Alarm Systems; Foghorns; Gongs; Chimes; Bells; Burglar Alarm Systems; Fire Alarms; Police Alarm Systems; Sounding Devices; Manual Gas Alarms; Landing Wands. Excludes Loran; Radar; Sonar; Engine Oil and Fuel Warning Devices; Aircraft Oxygen Warning Devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6505 FSC 0 Drugs and Biologicals Drugs and Biologicals Only items specifically formulated for human use are appropriate to this class. Includes all drugs, medicinal grade chemicals, and Biologicals subject to the Federal Food, Drug and Cosmetic Act, listed in the Monograph section of the U.S. Pharmacopeia or the National Formulary or covered by the United States Adopted Names (USAN). Other nations may apply their own legal documents. Excludes medicated cosmetics and toiletries classifiable in FSC 6508 and in vitro diagnostic substances and reagents classifiable in FSC 6550, and Veterinary Drugs and Biologicals classifiable in FSC 6509. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6508 FSC 0 Medicated Cosmetics and Toiletries Medicated Cosmetics and Toiletries Includes medicated cosmetics and toiletries that have been determined to be drugs in accordance with the Federal Food, Drug, and Cosmetic Act. Excludes nonmedicated cosmetics and toiletries which are classifiable in Group 85. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6509 FSC 0 Drugs and Biologicals, Veterinary Use Drugs and Biologicals, Veterinary Use Includes All Drugs, medicinal grade chemical, and Biologicals subject to the provisions of the Department of Agriculture (Veterinary Drugs and Biologicals) specifically formulated for Veterinary use. Other Nations may apply their own legal documents. Excludes Drugs and Biologicals specifically formulated for Human use classifiable in FSC 6505. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6510 FSC 0 Surgical Dressing Materials Surgical Dressing Materials Includes Bandages, Compresses, Dressings, Gauze, Pads, Sponges, and impregnated surgical dressing materials. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6515 FSC 0 Medical and Surgical Instruments, Equipment, and Supplies Medical and Surgical Instruments, Equipment, and Supplies Includes Anesthesia Apparatus; Blood Transfusion Apparatus; Oxygen Therapy Apparatus; Respirators; Orthopedic Supplies; Arch Supports; Clinical Thermometers; Sutures; Hearing Aids; Veterinary Equipment; Endoscopes, Fiber Optic. Excludes Opthalmic Instruments, Equipment, and Supplies; Non-Medical Endoscopes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6520 FSC 0 Dental Instruments, Equipment, and Supplies Dental Instruments, Equipment, and Supplies Includes Dental Engines; Dental Laboratory Equipment; Operating Chairs; Orthodontic Appliances; Teeth; Dental Metals; Dental Abrasives; Dental Laboratory Furniture. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6525 FSC 0 X-ray Equipment and Supplies: Medical, Dental, Veterinary X-ray Equipment and Supplies: Medical, Dental, Veterinary Includes Medical X-ray Film; Medical X-Ray Film Viewing Equipment; Medical X-Ray Film Processing and Finishing Equipment and Supplies; X-Ray Tubes. Excludes Industrial X-Ray Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6530 FSC 0 Hospital Furniture, Equipment, Utensils, and Supplies Hospital Furniture, Equipment, Utensils, and Supplies Includes Orthopedic Equipment; Operating Lights; Physiotherapy Equipment; Sterilizers; WheelChairs; Litters; Hospital Beds; Restraint Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6532 FSC 0 Hospital and Surgical Clothing and Related Special Purpose Items Hospital and Surgical Clothing and Related Special Purpose Items Includes Only those clothing items which are required exclusively for use in hospital operations, or in medical or dental facilities, which have no functional counterpart elsewhere in Federal Organizations participating in the Federal Catalog System. Excludes General purpose items of clothing and fabricated textile material. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6540 FSC 0 Ophthalmic Instruments, Equipment, and Supplies Ophthalmic Instruments, Equipment, and Supplies Includes Ophthalmic Lens Cutting and Grinding Machine; Ophthalmic Lenses and Lens Blanks; Spectacle Frames; Ophthalmological and Optometric Instruments, Equipment, and Supplies. Excludes Optical Lens Cutting and Grinding Machines: Ophthalmoscope and Otoscope Set; Surgical Instruments and Supplies that can be used by other medical disciplines; i.e., sutures, eye pads, eye shields, eye bath, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6545 FSC 0 Replenishable Field Medical Sets, Kits, and Outfits Replenishable Field Medical Sets, Kits, and Outfits Excludes Sets and kits which can be logically classified in another FSC Class in Group 65, such as Insect Sting Kit; Otoscope and Opthalmoscope Set; In Vitro Diagnostic Test Kits; and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6550 FSC 0 In Vitro Diagnostic Substances, Reagents, Test Kits and Sets In Vitro Diagnostic Substances, Reagents, Test Kits and Sets Includes In vitro diagnostic aids, such as test tablets, test slides, test strips, test cards, test papers, test solutions, reagents; sets and kits designated for in vitro qualitative and quantitative tests on specimens, such as blood, urine, feces, and the like, for the purposes of aiding in the medical diagnosis of disease, determining body organ dysfunction, or other abnormal conditions. Excludes In vitro diagnostic substances classifiable in FSC 6505. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6605 FSC 0 Navigational Instruments Navigational Instruments Includes Azimuths; Sextants; Octants; Compasses; Plotting Boards; Underwater Log Equipment; Air Position Indicators; Drift Meters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6610 FSC 0 Flight Instruments Flight Instruments Includes Air Speed Indicators; Rate of Climb Indicators; Bank and Turn Indicators; Pitot Tubes; Gyro Horizon Indicators; Attitude Gyro Indicators. Excludes Navigational Instruments (FSC 6605). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6615 FSC 0 Automatic Pilot Mechanisms and Airborne Gyro Components Automatic Pilot Mechanisms and Airborne Gyro Components Note Included in this class are gyro components of guided missiles. Excluded are complete gyro mechanisms and nonairborne gyro components, both of which are classified in the same classes as their next higher assemblies. Includes Automatic Pilot Regulators; Directional, Vertical, Bank and Turn, and Hydraulic Surface Gyro Controls; Airborne and Shipborne Automatic Pilot Mechanisms; Helicopter Automatic Stabilization Equipment. Excludes Automatic Pilot Training Devices (FSC 6930); and Automatic Pilot Mechanisms, Guided Missile (FSC 1420). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6620 FSC 0 Engine Instruments Engine Instruments Note-Instruments designed for use on both engines and other than engines are not included in this class and should be classified in the appropriate instruments class of Group 66. Includes All Engine Instruments, including Aircraft, Marine, and Vehicular; Fuel Pressure Gages; Manifold Pressure Gages; Oil Pressure Gages; Fuel Mixture Indicators; Engine Oil and Fuel Warning Devices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6625 FSC 0 Electrical and Electronic Properties Measuring and Testing Instruments Electrical and Electronic Properties Measuring and Testing Instruments Note-This class includes all "basic" types of electrical and electronic test instruments, such as ammeters, voltmeters, ohmmeters, multimeters, and similar instruments, even if specially designed. Excluded from this class by the modifier "except specially designed" are test instruments, other than "basic" instruments, which are specially designed for use with atomic ordnance, fire control, guided missile, motor vehicle, aircraft, or photographic equipment. Such specially designed test instruments are to be classified in other classes in the Federal Supply Classification. This class includes communications test equipment, infrared test equipment designed for communication, and night vision maintenance and test specialized equipment. Includes Test Leads and Test Lead Attachments; Test instruments designed for communication equipment; Test instruments designed for use with electronic equipment classified in two or more FSC groups. Excludes Radiac Equipment admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6630 FSC 0 Chemical Analysis Instruments Chemical Analysis Instruments Includes Acidity (pH) Meters; Gas Analyzers; Alakalinity Measuring Instruments; Colorimeters. Excludes Gas Detecting Equipment; Manual Gas Alarms; Chemicals; In Vitro Diagnostic Substances and Reagents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6635 FSC 0 Physical Properties Testing and Inspection Physical Properties Testing and Inspection Includes Destructive and Nondestructive Inspection Equipment such as Fluorescent Penetrant Inspection Units; Magnetic Inspection Units; Industrial X-Ray Machines; Industrial X-Ray Film; Tensiometers; Material Hardness Testers. Excludes General prupose Measuring Tools (FSC 5210) and Precision Measuring Tools and Inspection Gages (FSC 5220). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6720 FSC 0 Cameras, Still Picture Cameras, Still Picture Includes Aerial, Mapping, Microfilm, Photocopy, and Studio Cameras. Excludes X-Ray Cameras (FSC 6525), and Industrial X-Ray Machine (FSC 6635). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6730 FSC 0 Photographic Projection Equipment Photographic Projection Equipment Includes Screens; Viewers; Photomap Projectors; Integrated Viewers/Printer and Microform storage and retrieval systems. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6636 FSC 0 Environmental Chambers and Related Equipment Environmental Chambers and Related Equipment Note This class includes only those environmental chambers used exclusively to perform controlled tests, under simulated conditions, to determine physical damage and/or changes in operating characteristics for equipments and components such as Humidity; Immersion; Moisture; Altitude; Explosion; Thermal Shock; Sand and Dust; Flammability; Seal. Environmental chambers included in this class provide data regarding service life and behavior of various items equivalent to actual service conditions existing in the field. Includes Chambers; Wind Tunnels; Enclosures specifically designed to simulate an environmental condition; Weatherometers; Fadeometers; Specially designed equipment and components exclusively related to environmental chambers. Excludes General purpose prefabricated buildings, chambers, panels, and components (FSC 5410); Controlled Environmental Conditioning Kits and Sets (FSC 4240); Baths (FSC 4510); Ovens (FSC 7310); Kilns (FSC 3630); Radiosonde Baseline Check Sets (FSC 6660); Divers Recompression Chambers (FSC 4220); Altitude Training Decompression Chambers (FSC 6930); and Chambers used as training devices (FSC 6930); Checkout and Test Equipment (FSC 6625); Chemical Analysis Instruments (FSC 6630); Electrical and Electronic Properties Measuring and Testing Instruments (FSC 6625); and Meteorological Instruments (FSC 6660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6640 FSC 0 Laboratory Equipment and Supplies Laboratory Equipment and Supplies Includes Laboratory Glassware; Laboratory Funnels; Laboratory Furnaces; Glass Beads; Laboratory White Sand; Litmus Paper; Paper Filters; Insect Transfixion Pins; Laboratory Glass Wool; Laboratory Furniture, except Dental Laboratory. Excludes Instruments covered by other classes in group 66; Dental Laboratory Equipment; Laboratory Scales and Balances; In Vitro Diagnostic Substances and Reagents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6645 FSC 0 Time Measuring Instruments Time Measuring Instruments Includes Clocks; Job Recording Devices; Time Recorders; Time Stamps, Watch and Clock Movements; Watches. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6650 FSC 0 Optical Instruments, Test Equipment, Components and Accessories Optical Instruments, Test Equipment, Components and Accessories Includes Binoculars; Magnifiers; Microscopes; Periscopes; Telescopes; Optical Elements; such as Lens, Prisms, Windows; Optical Benches and Associated Devices; Endoscopes, Fiber Optics (Non-Medical). Excludes Fire Control Instruments, Optical; Surveying Instruments, Optical; Photogrammetric Instruments; Octants; and Sextants; Optical Instruments Integrated with Fire Control Equipment; Opthalmological Instruments; Electronic Fiber Optic Test Equipment; Medical Endoscopes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6655 FSC 0 Geophysical Instruments Geophysical Instruments Includes Geodetic, Oceanographic and Seismographic Instruments. Excludes Telescopes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6660 FSC 0 Meteorological Instruments and Apparatus Meteorological Instruments and Apparatus Includes Meteorological Ballons; Radiosonde Sets; Radarsonde Sets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6665 FSC 0 Hazard-Detecting Instruments and Apparatus Hazard-Detecting Instruments and Apparatus Includes Radiac Equipment; Gas Detecting Equipment; Land Mine Detecting Equipment. Excludes Manual Gas Alarms (FSC 6350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6670 FSC 0 Scales and Balances Scales and Balances Includes Coin Operated, Household, Industrial, Postal, and Laboratory Scales and Balances. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6675 FSC 0 Drafting, Surveying, and Mapping Instruments Drafting, Surveying, and Mapping Instruments Includes Drawing Instruments, Drafting Tools; Engineering and Architectural Scales; Levels; Transits; Photogrammetric Instruments; Astrolabes; Level Rods; Plane Tables; Surveying Altimeters; Theodolites. Excludes Surveyors' Tapes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6680 FSC 0 Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments Liquid and Gas Flow, Liquid Level, and Mechanical Motion Measuring Instruments Includes Liquid Level Float Instruments; Revolution Counters; Speedometers; Rotation Measuring Instruments and Apparatus; Oxygen Flow Indicators; Tachometers, including Engine Tachometers. Excludes Combination Instruments; (FSC 6695); Meteorological Instruments (FSC 6660); and Automatic Control Valves (FSG 48). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6685 FSC 0 Pressure, Temperature, and Humidity Measuring and Controlling Instruments Pressure, Temperature, and Humidity Measuring and Controlling Instruments Includes Thermometers, including Engine Thermometers; Pressure Gages; Thermocouple Leads; Resistance Bulbs. Excludes Clinical Therometers; (FSC 6515); Thermostatic and Differential Pressure Switches (FSC 5930); and Meteorological Instruments (FSC 6660). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6695 FSC 0 Combination and Miscellaneous Instruments Combination and Miscellaneous Instruments Includes Flow-Pressure Instruments; Taximeters; Dynamometers. Excludes Dental, Medical, Surgical, and Veterinary Instruments. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6710 FSC 0 Cameras, Motion Picture Cameras, Motion Picture Includes Aerial and Mapping Cameras. Excludes Television Cameras, Nonairborne (FSC 5820); Television Cameras, Airborne (FSC 5821); Video Cameras (FSC 5836). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6740 FSC 0 Photographic Developing and Finishing Equipment Photographic Developing and Finishing Equipment Includes Editing Equipment; Enlargers; Driers; Pressers; Printers; Washers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6750 FSC 0 Photographic Supplies Photographic Supplies Includes Sensitized Photographic Paper; Special Purpose Photographic Chemicals; Unprocessed Film; Photoflash Lamps. Excludes X-Ray Film (Medical Class 6525 or Industrial Class 6635); Electrographic (Facsimile) Paper for direct electrostatic printing or copying (FSC 7530). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6760 FSC 0 Photographic Equipment and Accessories Photographic Equipment and Accessories Includes Light Meters; Tripods; Filters; Range-finders; Photographic Floodlight Fixtures; Lenses; Specialized Photographic Test Equipment. Excludes Lamps (bulbs) (FSC 6240); Photoflash Lamps (FSC 6750). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6770 FSC 0 Film, Processed Film, Processed Includes Motion Picture Film, Silent and Sound; Still Picture Film. Excludes X-Ray Film (Medical class 6525 or Industrial class 6635); Training and Educational Film (FSC 6910); Processed Microfilm (FSC 7670). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6780 FSC 0 Photographic Sets, Kits, and Outfits Photographic Sets, Kits, and Outfits admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6810 FSC 0 Chemicals Chemicals Includes Naphtha Solvents; Water Softening Compounds; Tanning Materials, Natural or Synthetic; Dextrines and Starches; Inedible Gelatins; Acetone; Propellant Chemicals, Bulk, not Specialized Solely for Guided Missile Use. Excludes Medicinal Chemicals; Gases; Foundry dextrines; Radiographic and Photographic Chemicals; In Vitro Diagnostic Substances and Reagents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6820 FSC 0 Dyes Dyes Includes Household Tints admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6830 FSC 0 Gases: Compressed and Liquefied Gases: Compressed and Liquefied Includes Fuel Gases. Excludes Military Chemical Gases; Medical Gases; Empty Gas Cylinders and their caps, valves, and valve spare parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6840 FSC 0 Pest Control Agents and Disinfectants Pest Control Agents and Disinfectants Includes Insect Repellents; Fungicides; Insecticides; Rodenticides; Weed Killers. Excludes Personal Deodorants. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6850 FSC 0 Miscellaneous Chemical Specialties Miscellaneous Chemical Specialties Includes Antifogging Compounds; Wetting Agents; Etching and Fountain Solutions for Lithographing; Blanket Repair Solutions for Lithographing; Antifreeze. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6910 FSC 0 Training Aids Training Aids Includes Mockups; Cutaway Models; Scale Models; Training Films; Training Aid Maps; Navigational Training Aids; Flight Instrument Training Aids; Aircraft Instrument Training Aids; Vehicle Training Aids; Engine Instrument Training Aids; Hydraulic System Training Aids; Cutaway, Mockup, or Sectionalized Ammunition only; Training Equipment normally used in classroom training. Excludes Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6920 FSC 0 Armament Training Devices Armament Training Devices Includes Bombing Trainers; Gunnery Trainers; Tow Targets; Gunnery Targets; Guided Missile Training Sets. Excludes Target Drones; Drones for such use as training, surveillance, missile evaluation, and photographic reconnaissance; Atomic Ordnance Training Devices; Training Aids; Drill, Dummy, Exercise, Practice, or Simulated Ammunition and Weapons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6930 FSC 0 Operation Training Devices Operation Training Devices Includes Link Trainers; Automatic Pilot Training Devices; Drift Meter Training Devices; Celestial Navigation Trainers; Dead Reckoning Navigation Trainers; Instrument Flying and Landing Trainers; Terrain Projection Trainers; All operational training devices except communication and armament. Excludes Training Aids. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 6940 FSC 0 Communication Training Devices Communication Training Devices Includes Supersonic Radar Trainers; Navigational Radar Trainers; Search and Detecting Radar Trainers; Code Practice Equipment. Excludes Training Aids. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7010 FSC 0 ADPE System Configuration ADPE System Configuration Note-a group of general purpose analog, digital, or hybrid electronic or electromechanical devices that are interconnected to operate as a system. Frequently referred to as an ADP system, although the term "system" is not considered definitive. Includes an assembly of devices consisting of a central processing unit (CPU) and the necessary input/output devices, accessorial devices, analog measurement devices, software and/or firmware required to perform the desired objectives. Also includes sub-assemblies and units in which input/output devices, CPUs, and/or accessorial devices or components are incorporated into a single assembly or unit. A specially designed device incorporated into a system shall not influence the classification of the base assembly or unit. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7020 FSC 0 ADP Central Processing Unit (CPU, Computer), Analog ADP Central Processing Unit (CPU, Computer), Analog Note-An analog is a representation in one form of a physical condition existing in another form (e.g., the level of mercury in a tube represents temperature in a thermometer; the angular position of a needle represents speed on a speedometer). This class includes only CPUs that accept as inputs the electrical equivalent of physical conditions such as flow, temperature, pressure, angular position or voltage and perform computations by manipulating these electrical equivalents to produce results for further use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7021 FSC 0 ADP Central Processing Unit (CPU, Computer), Digital ADP Central Processing Unit (CPU, Computer), Digital Note-Digital refers to the representation of discrete numbers, symbols and alphabetic characters by a predetermined, coded combination of electrical impulses. This class includes only CPUs that accept information represented by digital impulses. Specifically, a device capable of performing sequences of arithmetic and logic operations (a program) not only on data but also on the program which is contained in its internal memory (storage) without intervention of an operator. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7022 FSC 0 ADP Central Processing Unit (CPU, Computer), Hybrid ADP Central Processing Unit (CPU, Computer), Hybrid Note-Hybrid refers to a combination of analog and digital capability as defined in Classes 7020 and 7021 with conversion capability required for intercommunication. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7025 FSC 0 ADP Input/Output and Storage Devices ADP Input/Output and Storage Devices Note This class includes devices used to control and transfer information to and from a Computer (as modified). The input device is used for transferring data and instructions into a computer. The output device is used to transfer results of processing by the computer to ADP peripheral devices. Input/output devices combine the above functions in the same device. This class includes printers, display units, disk drive units (magnetic, optical and floptical), tape drive units, terminals, data entry devices and transfer units. Also includes Optical Compact Disk (CD) devices used for the storage and retrieval of data and firmware. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7030 FSC 0 ADP Software ADP Software Note-Software is a series of instructions or statements in a form acceptable to a CPU, designed to cause the ADPE configuration to execute an operation or operations; or a collection of data in a form capable of being processed and operated on by a computer. Includes System programs, such as operating systems, assemblers, compilers, executive routines, interpreters, translators; utility programs, such as sort/merge programs, media conversion, maintenance diagnostic programs; and application programs, such as payroll, inventory control, and engineering analysis programs. Excludes Software designed to Government specifications to satisfy the requirements of a particular user or for use with ADPE properly classifiable in an FSG other than FSG 70. Also excludes operating manuals and programmers' manuals properly classified in FSG 76. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7035 FSC 0 ADP Support Equipment ADP Support Equipment Note This class includes various devices and associated control units which are designed for use in combination or conjunction with an ADPE configuration but are not part of the configuration itself. ADP support equipment includes magnetic tape testing, certifying, and cleaning equipment; disk pack testing, certifying and cleaning equipment; tape equipment, rewinders, splicers, spoolers and card reconditioners. Included in this class are complete units and components of related general purpose commercially available support equipment which are not specifically designed for use as part of a system such as a weapon system, control system, digital image processing system, missile system, communication system or navigation system. Also included are support control systems and components not specifically designed for use with process control such as automatic machine tool processing operations in which flow, pressure, temperature or other parameters are controlled by instrument regulations in automatic machine tool and process operations. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7040 FSC 0 Punched Card Equipment Punched Card Equipment Includes Collating machines, key punch machines, tabulating machines; verifiers; reproducers; summary punches, sorters; interpreters. Excludes Card actuated machines designed for use with an ADPE system. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7042 FSC 0 Mini and Micro Computer Control Devices Mini and Micro Computer Control Devices Includes Mini or micro computers used as control mechanisms where computer technology is essential in controlling, monitoring, measuring, and directing processes, devices, instruments or other equipment. Excludes Mini and micro computer control devices which are designed specifically for use in and/or integral to higher order systems, e.g., aircraft fire control systems, numerically controlled machine tools, sequence controlled printing equipment, motion measuring instruments, office information system equipment, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7045 FSC 0 ADP Supplies ADP Supplies Note This class includes ADP tape seal bands, reels and hubs, carrying cases, canisters, and the like. Also includes all nonrecorded magnetic recording media designed to be used with ADP equipment, such as magnetic tape, removable disk packs, magnetic cards, cassettes, and diskettes. Also includes Optical Disks used for the storage of data. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7050 FSC 0 ADP Components ADP Components Note-This class includes ADP Component Assemblies that are parts of analog, digital or hybrid data processing devices. Excluded from the class are items for which more specific classifications are suitable. The FSC structure and indexes will govern the classification of those items permitted classification in a single class only. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7105 FSC 0 Household Furniture Household Furniture Includes Bedsprings, Open Style (All-metallic); Folding Chairs; Camp Furniture; Mirrors, Wall Mounting and Furniture Types; Smoking Stands. Excludes Hospital Beds and Bedsprings; Ash Trays; Mattresses; Bedsprings, Box Style (Fabric Covered). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7110 FSC 0 Office Furniture Office Furniture Includes Filing Cabinets; Safes; Post Office Furniture; School Furniture; Blackboards. Excludes Dental X-Ray Film Protective Safes; Visible Record Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7125 FSC 0 Cabinets, Lockers, Bins, and Shelving Cabinets, Lockers, Bins, and Shelving Includes Kitchen Cabinets; Sectional Shelving. Excludes Foot Lockers; Filing Cabinets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7195 FSC 0 Miscellaneous Furniture and Fixtures Miscellaneous Furniture and Fixtures Includes Stone, Clay, and Concrete Furniture; Auditorium and Theater Furniture; Library Furniture; Cashier Stands. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7210 FSC 0 Household Furnishings Household Furnishings Includes Household Furnishings of Textiles, Plastics, Paper, Rubber, and other materials; Sheets, Pillows, Blankets, and other Bedding; Insect Bars; Tablecloths; Towels; Steamer Rugs; Mattresses; Bedsprings, Box style (Fabric Covered); Bedspring and Mattress Sets. Excludes Floor Coverings; Curtains; Draperies; Paper Napkins; Paper Doilies; Bedsprings, Open Style (All-Metallic). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7220 FSC 0 Floor Coverings Floor Coverings Includes Linoleum; Rubber and Asphalt Tile; Carpets; Rugs; Rug Pads. Excludes Vehicular Floor Mats. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7230 FSC 0 Draperies, Awnings, and Shades Draperies, Awnings, and Shades Includes Curtains; Specialized Hardware and Fittings for Curtains, Draperies, Venetian Blinds, and Window Shades. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7240 FSC 0 Household and Commercial Utility Containers Household and Commercial Utility Containers Includes Refuse Cans; Sprinkling Cans; Clothes Hampers; Household Basket; Fabric Utility Containers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7290 FSC 0 Miscellaneous Household and Commercial Furnishings and Appliances Miscellaneous Household and Commercial Furnishings and Appliances Includes Fireplace Sets; Vases and Urns; Household Sewing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7310 FSC 0 Food Cooking, Baking, and Serving Equipment Food Cooking, Baking, and Serving Equipment Note-This class includes warming and/or chilling equipment used for the display and serving of food. Includes Warming and/or Chilling Tables, Stationary and Portable; Serving Carts; Field and Mobile Baking Ovens; Toasters; Waffle Irons; Grills; Special Aircraft, Marine, and Railway Type Food Cooking Equipment; Utensils with Integral Heating Units; Cafeteria Type Display Cases and Showcases; Soda Fountains; Milk, Soda, and/or Ice Cream Dispensers; Cold Food Counters; Combination Heated-Refrigerated Food Serving Equipment; Carbonators; and other types of refrigerated food serving and display equipment commonly used in cafeterias, mess hall kitchens, and the like. Excludes Carts other than Serving; Commissary or Food Store Type Refrigeration Equipment; Commercial Household, or Professional and Scientific Refrigerators; Drinking Fountains; (see Class 4110 for items excluded from Class 7310). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7320 FSC 0 Kitchen Equipment and Appliances Kitchen Equipment and Appliances Includes Dishwashing Machines; Food Slicing Machines; Food Mixers; Utility Carts Specially designed for use in Kitchen and Dining Area. Excludes Sinks; Serving Carts (see Class 7310 for Food Serving Carts). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7330 FSC 0 Kitchen Hand Tools and Utensils Kitchen Hand Tools and Utensils Includes Pots; Pans; Can Openers; Graters; Food Mashers; Cleavers; Vacuum Bottles and Jugs. Excludes Utensils with Integral Heating Units; Knives; Forks; Spoons. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7340 FSC 0 Cutlery and Flatware Cutlery and Flatware Includes Knives; Forks; Spoons; Hunting Knives. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7350 FSC 0 Tableware Tableware Includes China and Earthenware; Glassware; Paper Plates and Cups. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7360 FSC 0 Sets, Kits, Outfits and Modules, Food Preperation and Serving Sets, Kits, Outfits and Modules, Food Preperation and Serving admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7420 FSC 0 Accounting and Calculating Machines Accounting and Calculating Machines Includes Accounting and adding machines and electronic calculators. Excludes Punched card system machines; Machines or devices that can be applied to a variety of problems by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7430 FSC 0 Typewriters and Office Type Composing Machines Typewriters and Office Type Composing Machines Includes Typewriters and office type composing machines with built-in electric/electronic functions such as margins, headings, tabs, centering and related actions. Excludes Typewriters and office type composing machines which are designed primarily for use as a component of an ADPE system or that are user programmable, and that can be applied to a variety of applications by the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by some form of general purpose data processing language. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7435 FSC 0 Office Information System Equipment Office Information System Equipment Includes Minicomputer and microcomputer controlled systems specifically designed for user programmable processing of the office information application; Connected peripheral equipment; Automatic repetitive typewriters; Text editing typewriters and video display text editing typewriters. Excludes General purpose ADPE which is designed primarily to be applied through the internal execution of a series of instructions, not limited to specific keystroke functions, but controlled by a general purpose data processing language, to process a variety of applications such as financial management, logistics, scientific, communications, and the like. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7450 FSC 0 Office Type Sound Recording and Reproducing Machines Office Type Sound Recording and Reproducing Machines Includes Dictating Machines; Transcribing Machines; Combination Dictating and Transcribing Machines. Excludes Communication Type Sound Recording and Reproducing Machines. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7460 FSC 0 Visible Record Equipment Visible Record Equipment Includes Manually operated and power operated visible record equipment; visible index files, rotary and stationary; specially designed components, such as Wire and Bar Pockets, Cover Plates, Stop Wires, and Channel Stops; Control Boards; Binder Racks; devices and systems designed to automatically store and retrieve hard copy documents. For those microform automatic retrieval systems that contain an integral viewer or view/printer, see Class 6730. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7490 FSC 0 Miscellaneous Office Machines Miscellaneous Office Machines Includes Addressing Machines; Check Handling Machines; Coin Counting Machines; Mailing Machines, Currency Handling Machines. Excludes Pencil Sharpeners; Staplers, Office Type; Duplicating Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7510 FSC 0 Office Supplies Office Supplies Includes Crayons; Erasers; File Holders; Writing Ink; Printing Ink; Paper Fasteners; Pencils; Penholders and Pen Points; Rulers, Office Type; Art Supplies; Tape, Pressure Sensitive Adhesive. Excludes Office Devices; Fountain Pens; Artists' Brushes; Paper Stationery; Record Forms; Mechanical Pencils. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7520 FSC 0 Office Devices and Accessories Office Devices and Accessories Includes Copyholders; Fountain Pens and Pen Desk Sets; Pencil Sharpeners; Paper Punches; Staplers, Office Type; Artists' Accessories, such as Easels, Airbrushes; Slide Rules. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7530 FSC 0 Stationery and Record Forms Stationery and Record Forms Includes Business Forms; Record Books; Surveyors' Computation Forms; Electric Accounting Machine (EAM) Cards; Forms approved for use within individual government activities. Excludes Standard forms approved for government-wide use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7540 FSC 0 Standard Forms Standard Forms Includes Only those standard forms approved for government-wide use by the government activities empowered to do so (such as the U.S. Bureau of the Budget and the U.S. General Accounting Office, and similar organizations in other NATO countries). Excludes Forms approved for use within individual government activities. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7610 FSC 0 Books and Pamphlets Books and Pamphlets Includes Technical and Nontechnical Books and Pamphlets; Regulations; Instruction Manuals; Technical Orders. Excludes Sheet and Book Music; Periodicals; Bibles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7630 FSC 0 Newspapers and Periodicals Newspapers and Periodicals admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7640 FSC 0 Maps, Atlases, Charts, and Globes Maps, Atlases, Charts, and Globes Excludes Training Aid Maps admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7641 FSC 0 Aeronautical Maps, Charts and Geodetic Products Aeronautical Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7642 FSC 0 Hydrographic Maps, Charts and Geodetic Products Hydrographic Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7643 FSC 0 Topographic Maps, Charts and Geodetic Products Topographic Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7644 FSC 0 Digital Maps, Charts and Geodetic Products Digital Maps, Charts and Geodetic Products admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7650 FSC 0 Drawings and Specifications Drawings and Specifications Includes Federal, Military, and Departmental Specifications. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7660 FSC 0 Sheet and Book Music Sheet and Book Music Excludes Hymnbooks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7670 FSC 0 Microfilm, Processed Microfilm, Processed admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7690 FSC 0 Miscellaneous Printed Matter Miscellaneous Printed Matter Includes Decals; Printed Posters; Printed Labels. Excludes Sheet and Book Music. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7710 FSC 0 Musical Instruments Musical Instruments Note-This class includes only complete musical instruments. Assemblies, parts, attachments, or accessories for use in or on musical instruments are classified in classes other than this class. Excludes Phonographs; Radios; Television Sets. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7720 FSC 0 Musical Instrument Parts and Accessories Musical Instrument Parts and Accessories Includes Instrument Cases; Music Stands; Tuning Forks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7730 FSC 0 Phonographs, Radios, and Television Sets: Home Type Phonographs, Radios, and Television Sets: Home Type Note-This class includes only complete home-type phonographs, complete home-type radios, and complete home-type television sets. End items, assemblies, parts, attachments, or accessories for use in or on the above are classified in classes other than this class. Includes Combination Sets. Excludes Coin Operated Phonographs; Wire and Tape Recorders. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7740 FSC 0 Phonograph Records Phonograph Records Excludes Training Aid Records. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7810 FSC 0 Athletic and Sporting Equipment Athletic and Sporting Equipment Includes Baseball Equipment; Basketballs; Boxing Gloves; Fencing Masks; Fishing Tackle, except Commercial; Handballs; Shin Guards, Hockey. Excludes Athletic and Sports Clothing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7820 FSC 0 Games, Toys, and Wheeled Goods Games, Toys, and Wheeled Goods Includes Baby Carriages; Checkers; Doll Carriages; Dolls; Playing Cards; Velocipedes; Handicraft Kits, not elsewhere classifiable. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7830 FSC 0 Recreational and Gymnastic Equipment Recreational and Gymnastic Equipment Includes Slides; Swings; Amusement Park and Shooting Gallery Equipment; Play Yard and Playground Equipment; Billiard and Pool Tables and Equipment; Gymnasium Equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7910 FSC 0 Floor Polishers and Vacuum Cleaning Equipment Floor Polishers and Vacuum Cleaning Equipment Includes Domestic and Industrial Vacuum Cleaning Equipment; Carpet Sweepers. Excludes Self-propelled and Trailer Mounted Vacuum Cleaners. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7920 FSC 0 Brooms, Brushes, Mops, and Sponges Brooms, Brushes, Mops, and Sponges Includes Squeegees; Whisk Brooms. Excludes Hair Brushes; Toothbrushes; Paint and Artists' Brushes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 7930 FSC 0 Cleaning and Polishing Compounds and Preparations Cleaning and Polishing Compounds and Preparations Includes Scouring Powders; Washing Compounds; Detergents; Nontoilet Soaps; Automobile and Household Polishes and Waxes. Excludes Shaving Soap; Toilet Soap; Abrasive Polishing Compounds; Metal Finishing Abrasives; Surgical Detergents. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8010 FSC 0 Paints, Dopes, Varnishes, and Related Products Paints, Dopes, Varnishes, and Related Products Includes Water Paints; Oil Paints and Latex; Driers; Paint Primers; Lacquers; Paint Sealers; Pigments for Coloring; Stains; Turpentine; Paint Removers. Excludes Acetone, Wood and Wall Fillers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8020 FSC 0 Paint and Artists' Brushes Paint and Artists' Brushes Excludes Airbrushes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8030 FSC 0 Preservative and Sealing Compounds Preservative and Sealing Compounds Includes Fire Resistant Compounds; Water Resistant Compounds; Weather Resistant Compounds; Belt Dressing; Antiseize Compounds; Calking and Glazing Compounds; Putties; Wood and Metal Fillers. Excludes Food Preservative Compounds. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8040 FSC 0 Adhesives Adhesives Includes Glue; Mucilage; Sizes; Adhesive Cements. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8105 FSC 0 Bags and Sacks Bags and Sacks Includes Shipping and Protective Envelopes; Liners for Bags and Sacks; Textile and Paper Laminated Shipping Bags; Closures for Bags and Sacks. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8110 FSC 0 Drums and Cans Drums and Cans Includes Barrels; Kegs; Shipping and Storage Pails; Collapsible Tubes; Mailing and Filing Tubes; Closures for Drums and Cans. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8115 FSC 0 Boxes, Cartons, and Crates Boxes, Cartons, and Crates Includes Shoe Boxes; Beer Cases; Pill Boxes; Piano Cases; Engine Boxes; Bombsight Boxes. Excludes Special boxes, packages, and containers designed primarily for shipping, storage, and handling of ammunition, nuclear ordnance, explosives, guided missiles, military chemical agents; and repairable/reusable containers specially designed for specialized equipment such as the "Shipping and Storage Container" for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8120 FSC 0 Commercial and Industrial Gas Cylinders Commercial and Industrial Gas Cylinders Note-This class includes empty commercial and industrial gas cylinders and their caps, valves, and valve spare parts. Excludes Filled gas cylinders and items related to gaseous and liquefied gaseous dispensing systems, both mobile and installed. All components of installed gas dispensing systems are classified by "application" or "function" with the end equipment for which designed. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8125 FSC 0 Bottles and Jars Bottles and Jars Includes Shipping Jugs and Carboys; Ampoules. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8130 FSC 0 Reels and Spools Reels and Spools admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8135 FSC 0 Packaging and Packing Bulk Materials Packaging and Packing Bulk Materials Includes Wrapping Paper; Moisture Vapor Barrier Paper; Excelsior; Wadding for Packing; Corrugated Paper; Baling Bands, Baling Ties; Shipping Tags; Gummed Paper Tape; Separators; Box Liners; Packaging Staples; Baling Wire; Preformed Cushioning Inserts. Excludes Adhesives; Aluminum Foil other than for food handling and processing. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8140 FSC 0 Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers Ammunition and Nuclear Ordnance Boxes, Packages and Special Containers Note-This class includes only containers and fittings which are specifically designed for the storage, handling, and shipping of ammunition, explosives, and military chemical agents. Includes All shipping and storage containers specially designed for guided missiles, major missile sections, missile warheads, and other guided missile components. Excludes General Purpose Containers, Shipping and storage reusable/repairable containers specially designed for components of aircraft, space vehicles, automotive vehicles, ships, and ground communication equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8145 FSC 0 Specialized Shipping and Storage Containers Specialized Shipping and Storage Containers Note-This class includes only reusable and repairable containers specially designed for shipping and storage of specialized equipment; i.e., shipping and storage containers for components of aircraft, space vehicles, automotive vehicles, ships, ground communication equipment, etc. Includes Specially designed components (not elsewhere classifiable) peculiar to special shipping and storage containers as delimited under this class. Excludes General purpose containers; specially designed containers for ammunition, nuclear ordnance, explosives, military chemical agents and guided missile components. Excluded from this class are items for which more specific classifications are suitable. The FSC Indexes and Structure will govern the classification of those items permitted classification in a single class only. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8305 FSC 0 Textile Fabrics Textile Fabrics Note-This class includes only textiles in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Canvas Materials; Plastic Fabrics; Felt Materials; Netting, Plastic and Textile; Oilcloth; Textile Scrap. Excludes Carpeting. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8310 FSC 0 Yarn and Thread Yarn and Thread admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8315 FSC 0 Notions and Apparel Findings Notions and Apparel Findings Includes Buttons; Dressmakers' Pins; Needles; Shoulder Pads; Embroideries; Stamped Art Goods for Embroidery and Art Needlework; Hair Nets; Sewing Kits. Excludes Yarn; Thread; General Purpose Buckles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8320 FSC 0 Padding and Stuffing Materials Padding and Stuffing Materials Includes Feathers and Downs, Processed; Spanish Moss, Processed; Cotton Wadding and Batting; Kapok. Excludes Feathers and Downs, Unprocessed. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8325 FSC 0 Fur Materials Fur Materials Note-This class includes only fur materials in bulk. Excluded from this class are items that are precut or preformed, thus limiting their usefulness to specific applications. Such items are classified in the same class as the item or items for which designed, or in such other class as is appropriate. Includes Crosses; Sacs; Fur Plates; Fur Mats. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8330 FSC 0 Leather Leather Includes Garment Leather; Patent Leather; Glove Leather; Shoe Leather; Upholstery Leather; Industrial Leather. Excludes Belting; Shoe Findings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8335 FSC 0 Shoe Findings and Soling Materials Shoe Findings and Soling Materials Includes Counters; Taps; Shoe Laces; Lasts and Last Sole Patterns; Ornamental Shoe Buckles and Bows. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8340 FSC 0 Tents and Tarpaulins Tents and Tarpaulins Note-Fitted covers which are specifically designed for use on or with specific individual types of equipment are excluded from this class and are to be classified in the same classes as the items for which they are designed, or in such other classes as are appropriate. Includes Tent Pins; Tent Poles; Multiple purpose covers of woven or unwoven fabrics, not for permanent installation. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8345 FSC 0 Flags and Pennants Flags and Pennants Includes Signalling Flags; Flagstaffs; Signal Shapes; Flagpoles; Flagstaff Trucks; Speed Cones; Flagstaff Belts; Semaphore Flags. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8405 FSC 0 Outerwear, Men's Outerwear, Men's Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Trousers; Coats. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8410 FSC 0 Outerwear, Women's Outerwear, Women's Includes Uniforms, Military and Nonmilitary; Civilian Outerwear; Headwear; Work Clothing (Ordinary Nonsafety); Shirts; Skirts; Blouses. Excludes Items included in other classes such as Special Purpose Clothing; Helmets, Steel and Plastic; Safety Clothing; Handwear; Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8415 FSC 0 Clothing, Special Purpose Clothing, Special Purpose Note-This class includes conventional winter, summer, and intermediate flight clothing ensembles and their components. Excluded from this class are specialized antiexposure, antigravity, partial pressure, and full pressure, flight ensembles and their specialized components. Includes Special Purpose Headwear, including Helmets, except Ballistic Protective; Safety and Protective Clothing; Athletic Clothing; Safety, Combat, Protective, and Work Gloves; Submarine Deck Exposure Clothing; Flight Clothing Components designed for use with both Specialized and Conventional Ensembles. Excludes Sporting and Athletic Gloves; Athletic Footwear; Safety Footwear; Personal Armor; Special Hospital and Surgical Clothing. Excludes special purpose clothing wherein the primary purpose is ballistic resistant protection. This class will include common use components of both ballistic and conventional end items. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8420 FSC 0 Underwear and Nightwear, Men's Underwear and Nightwear, Men's admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8425 FSC 0 Underwear and Nightwear, Women's Underwear and Nightwear, Women's Includes Corsets; Girdles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8430 FSC 0 Footwear, Men's Footwear, Men's Includes Rubber Footwear; Athletic Footwear; Safety Footwear; Submarine Deck Exposure Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8435 FSC 0 Footwear, Women's Footwear, Women's Includes Rubber Footwear; Athletic Footwear; Safety Footwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8440 FSC 0 Hoisery, Handwear, and Clothing Accessories, Men's Hoisery, Handwear, and Clothing Accessories, Men's Includes Handkerchiefs; Suspenders; Garters; Belts; Dress Handwear; Leggings, Nonsafety Type. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8445 FSC 0 Hoisery, Handwear, and Clothing Accessories, Women's Hoisery, Handwear, and Clothing Accessories, Women's Includes Handkerchiefs; Garters; Belts; Neckerchiefs; Handbags; Dress Handwear; Leggings, Nonsafety Type. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8450 FSC 0 Children's and Infants' Apparel and Accessories Children's and Infants' Apparel and Accessories Includes Footwear; Outerwear; Headwear; Handwear; Underwear; Nightwear. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8455 FSC 0 Badges and Insignia Badges and Insignia Note-This class includes only items worn or carried on the person. Excludes Nonpersonal Insignia. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8460 FSC 0 Luggage Luggage Includes Foot Lockers; Brief Cases; Trunks; Suitcases. Excludes Duffel Bags; Musette Bags admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8465 FSC 0 Individual Equipment Individual Equipment Includes Musette Bags; Duffel Bags; Ammunition Belts; Pistol Belts; Handcuffs; Packboards; Sleeping Bags; Knapsacks; Hikers' Packs; Sunglasses; Skis; Snowshoes; Swords with Scabbards. Excludes Toilet Articles; Mess Gear; Fabric Utility Containers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8470 FSC 0 Armor, Personal Armor, Personal Includes Clothing specially designed for use as personal armor. Excludes All specialized flight clothing and accessories which may contain ballistic resistant properties as a secondary function. Excludes special purpose clothing wherein the primary function is for purposes other than ballistic protection admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8475 FSC 0 Specialized Flight Clothing and Accessories Specialized Flight Clothing and Accessories Includes Specialized Antiexposure, Antigravity, Partial Pressure, and Full Pressure Ensembles, and Specialized Components therefor, including Unpressurized Protective Helmets, Eye Protective Devices, and items with Sound Attenuating Features. Excludes Conventional Winter, Summer, and Intermediate Flight Clothing Ensembles, and Components therefor; Components designed for use with both Specialized and Conventional Flight Clothing Ensembles. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8510 FSC 0 Perfumes, Toilet Preparations, and Powders Perfumes, Toilet Preparations, and Powders Includes Colognes; Cosmetics; Deodorants; Depilatories; Toilet Waters. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8520 FSC 0 Toilet Soap, Shaving Preparations, and Dentifrices Toilet Soap, Shaving Preparations, and Dentifrices Includes Toothpaste; Shaving Soap. Excludes Medicated Soaps. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8530 FSC 0 Personal Toiletry Articles Personal Toiletry Articles Includes Hair Brushes; Nail Brushes; Nail Files; Toothbrushes; Manicure and Pedicure Implements; Razors and Blades. Excludes Dental Floss. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8540 FSC 0 Toiletry Paper Products Toiletry Paper Products Includes Facial Tissues; Paper Toilet Seat Covers; Toilet Paper; Paper Napkins; Doilies. Excludes Towel Dispensers; Paper Plates and Cups. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8710 FSC 0 Forage and Feed Forage and Feed Includes Hay; Manufactured Feed; Straw; Zoological Animal Food. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8720 FSC 0 Fertilizers Fertilizers Includes Natural and Synthetic Fertilizers; Peat Moss; Animal Manures. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8730 FSC 0 Seeds and Nursery Stock Seeds and Nursery Stock Includes Cut Flowers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8810 FSC 0 Live Animals, Raised for Food Live Animals, Raised for Food admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8820 FSC 0 Live Animals, Not Raised for Food Live Animals, Not Raised for Food admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8905 FSC 0 Meat, Poultry, and Fish Meat, Poultry, and Fish Includes Game Birds; Shellfish; Sausage Casings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8910 FSC 0 Dairy Foods and Eggs Dairy Foods and Eggs Includes Ice Cream; Frozen Custards; Ice Cream Mixes; Rennet; Milk Sherbets; Ices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8915 FSC 0 Fruits and Vegetables Fruits and Vegetables Includes Baked Beans; Juices. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8920 FSC 0 Bakery and Cereal Products Bakery and Cereal Products Includes Flour; Prepared Flour; Prepared Cereals; Macaroni. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8925 FSC 0 Sugar, Confectionery, and Nuts Sugar, Confectionery, and Nuts Includes Candy; Chewing Gum; Honey; Maple Syrup. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8930 FSC 0 Jams, Jellies, and Preserves Jams, Jellies, and Preserves admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8935 FSC 0 Soups and Bouillons Soups and Bouillons admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8940 FSC 0 Special Dietary Foods and Food Specialty Preparations Special Dietary Foods and Food Specialty Preparations Includes Infant Foods; Potato Chips; Prepared Pie and Cake Fillings. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8945 FSC 0 Food, Oils and Fats Food, Oils and Fats admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8950 FSC 0 Condiments and Related Products Condiments and Related Products Includes Salad Dressings; Spices; Seasonings; Flavoring Extracts; Yeast; Olives. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8955 FSC 0 Coffee, Tea, and Cocoa Coffee, Tea, and Cocoa Includes Postum; Yerba Mate; Chicory. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8960 FSC 0 Beverages, Nonalcoholic Beverages, Nonalcoholic Includes Soft Drinks; Ice. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8965 FSC 0 Beverages, Alcoholic Beverages, Alcoholic Includes Beer; Whisky; Wine; Liqueur. Excludes Sacramental Wine and Medicinal grade Brandy, Whisky, and Wine. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8970 FSC 0 Composite Food Packages Composite Food Packages Includes Ration Packs and Emergency Rations; Care Packages. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 8975 FSC 0 Tobacco Products Tobacco Products Includes Snuff; Cigarettes; Cigars. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9110 FSC 0 Fuels, Solid Fuels, Solid Includes Ration Heating Tablets; Cordwood; Charcoal; Briquettes; Coke. Excludes Peat. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9130 FSC 0 Liquid Propellants and Fuels, Petroleum Base Liquid Propellants and Fuels, Petroleum Base Note-This class includes liquid propellants with more than 50 percent or higher petroleum content. Includes All Aviation Gasoline; JP-1, 3, 4, and 5 Jet Fuel; Combat Vehicle and Automotive Gasoline (all types and grades); Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9135 FSC 0 Liquid Propellant Fuels and Oxidizers, Chemical Base Liquid Propellant Fuels and Oxidizers, Chemical Base Note-This class includes liquid propellants with more than 50 percent or higher chemical content. Includes Liquid chemicals designed exclusively for use as propellant fuels and oxidizers; Liquid Propellants, Bulk; Liquid Propellants, predetermined to specific quantity and quality, packaged in reusable containers. Excludes Multiple-use chemicals, such as Nitrogen, Technical; Ammonia, Technical; Furfuryl Alcohol, Technical; Aniline, Technical; Solid Propellants; Liquid Propellants, encased in consumable containers, for insertion into missile propulsion systems as integral parts. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9140 FSC 0 Fuel Oils Fuel Oils Includes Light Burner Fuels; Diesel Fuels; Kerosine; Military Specification Type Residuals; Special and Heavy Grade Turbine Vessel Propulsion Fuels; Federal Specification Heavy Burner Fuels; Bunker "C" Commercial Grade Fuel; Heavy Fuel and other Black (Boiler Type) Fuels; Illuminating Oils. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9150 FSC 0 Oils and Greases: Cutting, Lubricating, and Hydraulic Oils and Greases: Cutting, Lubricating, and Hydraulic Includes Petrolatum, except USP. Excludes Rust Preventive Compounds; Antiseizing Compounds; Petrolatum, USP. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9160 FSC 0 Miscellaneous Waxes, Oils, and Fats Miscellaneous Waxes, Oils, and Fats Includes Animal, Vegetable, and Petroleum Waxes; Wool Grease (Lanolin); Tallow; Marine Oils; Coconut Oil; Soap Stock; Essential Oils, except USP or NF grades. Excludes Edible Fats and Oils; Household and Automobile Waxes. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9310 FSC 0 Paper and Paperboard Paper and Paperboard Includes Book Paper Stock; Newsprint; Paperboard; Bulk Paper Materials. Excludes Corrugated Paper; Wrapping Paper; Building Board; Insulating Board; Stationery; Construction Paper; Paper Towels; Facial Tissues; Blank Books; Containers; Shipping and Identification Tags. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9320 FSC 0 Rubber Fabricated Materials Rubber Fabricated Materials Includes Natural and Synthetic Rubber Fabricated Materials, such as Rubber Sheets, Structural Rubber Shapes, Strips. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9330 FSC 0 Plastics Fabricated Materials Plastics Fabricated Materials Includes Cellulose Acetate and other plastics; Bars, Rods, Sheets, and Strips. Excludes Cable, Fiber Optic. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9340 FSC 0 Glass Fabricated Materials Glass Fabricated Materials Includes Glass Rods, Bars, and Tubing; Optical Glass Blanks; Structural and Building Glass; Glass Blocks. Excludes Insulators (FSC 5970); Ophthalmic Glass Blanks (FSC 6540); and Cable, Fiber Optics (FSCs 6015 and 6615). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9350 FSC 0 Refractories and Fire Surfacing Materials Refractories and Fire Surfacing Materials admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9390 FSC 0 Miscellaneous Fabricated Nonmetallic Materials Miscellaneous Fabricated Nonmetallic Materials Includes Cork Fabricated Basic Materials; Asbestos Fabricated Materials; Manufactured Mica; Minerals for scientific and technical use (cut but not mounted); Pottery Supplies; Catgut and Wormgut; Vegetable Brush Fibers; Bagasse. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9410 FSC 0 Crude Grades of Plant Materials Crude Grades of Plant Materials Includes Flavoring Materials; Crude Drugs of Plant-Origin; Crude Materials for Perfume; Tobacco, Unmanufactured. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9420 FSC 0 Fibers: Vegetable, Animal, and Synthetic Fibers: Vegetable, Animal, and Synthetic Includes Cotton, Wool, Silk, Horsehair, Rayon, and Nylon Fibers. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9430 FSC 0 Miscellaneous Crude Animal Products, Inedible Miscellaneous Crude Animal Products, Inedible Includes Feathers and Downs, Unprocessed; Ivory; Bristles; Hides and Fur Skins, Crude. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9440 FSC 0 Miscellaneous Crude Agricultural and Forestry Products Miscellaneous Crude Agricultural and Forestry Products Includes Cereal Grains; Sugar Crops; Crude Rubber. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9450 FSC 0 Nonmetallic Scrap, Except Textile Nonmetallic Scrap, Except Textile admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9505 FSC 0 Wire, Nonelectrical Wire, Nonelectrical Note- This class contains bulk material only. Specially designed items should be placed in a more appropriate class. Wire is a thin, flexible, continuous length of metal, usually of circular cross-section. Includes Bulk Nonelectrical Wire Excludes Wire having electrical resistivity or conductivity rating (FSC 6145). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9510 FSC 0 Bars and Rods Bars and Rods Note This class contains bulk material only. Specially designed items should be placed in a more appropriae class. a. Bars are elongated pieces of metal of simple uniform cross-sections usually rectangular, circular, or hexagonal produced by forging or hot-rolling, also known as barstock. b. Rods are thin round metal bar, differentiated by dimensional parameters, listed in the item name definition. Includes Metal Bars and Rods Excludes Muck Bar (FSC 9640); Rods for Wire (FSC 9640); Sheet Bar (FSC 9640); Threaded Rods (FSC 5306); Grooved Rod (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9515 FSC 0 Plate, Sheet, Strip, Foil, and Leaf Plate, Sheet, Strip, Foil, and Leaf Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. The items covered by this class are all similar in that they are flat, generally rolled metal, the difference is covered by dsimensional parameters in the item name definition. Includes Armor Plate; Black Plate; Floor Plate; Leaf; Perforated Sheet and Strip; Shim Stock. Excludes Bale Ties (FSC 8135); Baling Bands (FSC 8135); Mending Plates (FSC 5340); Mounting Plates (FSC 5340); T Plates (FSC 5340). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9520 FSC 0 Structural Shapes Structural Shapes Note-This class contains bulk material only. Specially designed items should be placed in a more appropriate class. This class includes items usually used in building, bridge and similar construction, such as, I beams, angles, and the like. Includes Bar Size Shapes (under 3 inches); Metal Piles and Piling; Angles; Channels; Tees; Zees. Excludes Plate, Sheet and Strip Materials (FSC 9515). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9525 FSC 0 Wire, Nonelectrical, Nonferrous Base Metal Wire, Nonelectrical, Nonferrous Base Metal Excludes Wire having electrical resistivity or conductivity rating. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9530 FSC 0 Bars and Rods, Nonferrous Base Metal Bars and Rods, Nonferrous Base Metal admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9535 FSC 0 Plate, Sheet, Strip, and Foil; Nonferrous Base Metal Plate, Sheet, Strip, and Foil; Nonferrous Base Metal Includes Leaf; Perforated Sheet and Strips. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9540 FSC 0 Structural Shapes, Nonferrous Base Metal Structural Shapes, Nonferrous Base Metal Includes Angles; Channels; Tees; Zees. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9545 FSC 0 Plate, Sheet, Strip, Foil, and Wire: Precious Metal Plate, Sheet, Strip, Foil, and Wire: Precious Metal Includes Bars; Leaf; Ribbon; Rods; Tubing. Excludes Precious Metals for dental use. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9610 FSC 0 Ores Ores Note-Only bulk material will be identified in this class. Ores are a naturally occurring material from which economically valuable minerals can be obtained. Includes Bauxite; Ferrous Ores; Lead Ores; Precious Metal Ores; Radioactive Metal Ores; Zinc Ores. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9620 FSC 0 Minerals, Natural and Synthetic Minerals, Natural and Synthetic Note-Only bulk material will be identified in this class. Minerals are naturally occurring substances with a characteristic chemical composition that can be expressed by a formula. Includes Clays and other Earths; Mica; Asbestos; Crude Petroleum; Graphite. Excludes Gravel (FSC 5610); Sand (FSC 5610); Abrasives (FSC 5350); Refractory Clays (FSC 9350). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9630 FSC 0 Additive Metal Materials Additive Metal Materials Note-Only bulk material will be identified in this class. Additive metal materials are those which are added to metals to improve their characteristics as required (e.g., lead added to steel to improve the machinability). Includes Alloying Additives (Aluminum, Antimony, Copper, and Others). Excludes Fuel Inhibiting Additives (FSC 6850). admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9640 FSC 0 Iron and Steel Primary and Semifinished Products Iron and Steel Primary and Semifinished Products Note-Only bulk material will be identified in this class. a. Primary products are raw unfinished ingots, pigs, that require refinement to be usable. b. Semi-finished items are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Pigs; Billets; Blooms; Muck Bar; Rods for Wire; Sheet Bar; Skelp; Tube Rounds. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9650 FSC 0 Nonferrous Base Metal Refinery and Intermediate Forms Nonferrous Base Metal Refinery and Intermediate Forms Note-Only Bulk material will be identified in this class. a. Refinery Forms are raw unfinished ingots, pigs, that require refinement to be usable. b. Intermediate forms are primary products that have been refined to a state that requires further manufacturing processes to its final, usable state. Includes Ingots; Slabs. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9660 FSC 0 Precious Metals Primary Forms Precious Metals Primary Forms Note-Only bulk material will be identified in this class. Primary Forms are raw unfinished ingots, pigs, that require refinement to be usable and are made of precious metals. Includes Bullion; Ingot. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9670 FSC 0 Iron and Steel Scrap Iron and Steel Scrap admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9680 FSC 0 Nonferrous Scrap Nonferrous Scrap admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9905 FSC 0 Signs, Advertising Displays, and Identification Plates Signs, Advertising Displays, and Identification Plates Includes Electric Signs; Sign Boards; Display Stands; Mannequins and other display forms; Printed Signs; General Purpose Identification Tags and Blanks, Nonpersonal; Plates and Tags for specific applications. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9910 FSC 0 Jewelry Jewelry Includes Jewelers' Findings; Precious Stones, Cut; Costume Jewelry; Natural Gems and Ornamental Stones, Cut. Excludes Watches; Clocks; Tableware; Scientific Instruments; Toilet Articles; Smokers' Articles; Industrial Diamonds. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9915 FSC 0 Collectors' and/or Historical Items Collectors' and/or Historical Items Includes Antiques; Artifacts; Coins; Stamps; Rare Books; Works of Art, Collectors and/or Historical Gems; Jewelry, and Cut Precious Stones; Natural History Items. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9920 FSC 0 Smokers' Articles and Matches Smokers' Articles and Matches Includes Cigarette Lighters; Lighter Fluid; Pipe Reamers; Ash Trays; Tobacco Humidors; Packaged Cigarette Paper. Excludes Ash receivers and lighters specifically designed for installation in or on equipment. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9925 FSC 0 Ecclesiastical Equipment, Furnishings, and Supplies Ecclesiastical Equipment, Furnishings, and Supplies Includes Vestments; Altars; Communion Sets; Ecclesiastical Candelabra; Chalices; Patens; Altar Cloths; Ecclesiastical Statuary; Sacramental Wine. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9930 FSC 0 Memorials; Cemeterial and Mortuary Equipment and Supplies Memorials; Cemeterial and Mortuary Equipment and Supplies Includes Grave Markers; Burial Vaults; Burial Urns; Caskets; Burial Boxes; Morticians' Supplies; Monuments; Gasket Shipping Cases. Excludes Hearses; Mortuary Refrigerators. admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 +\N Category 9999 FSC 0 Miscellaneous Items Miscellaneous Items Includes only those items which cannot conceivably be classified in any existing classes admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 admin PGER admin PGER 2003-07-23 02:08:52.069332 admin PGER 2003-07-23 02:08:52.069332 From bmuir at ned.gsfc.nasa.gov Thu Oct 16 15:10:07 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Thu Oct 16 14:10:08 2003 Subject: [Pangalactic-commits] removed baseobjecttest and integrated it into test_pgefobject Message-ID: <200310161810.h9GIA7Xs032068@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.5 1.6 PanGalactic/pangalactic/client/tests/baseobjecttest.py 1.9 None Log message: removed baseobjecttest and integrated it into test_pgefobject Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.5 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.6 --- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.5 Thu Oct 16 13:22:19 2003 +++ PanGalactic/pangalactic/client/tests/test_pgefobject.py Thu Oct 16 14:10:05 2003 @@ -1,16 +1,74 @@ import unittest - +from pangalactic.utils import pgefexceptions from pangalactic.enterprise import pgefobject -import baseobjecttest +#import baseobjecttest -class PGEFObjectTestCase(baseobjecttest.BaseObjectTests): +class PGEFObjectTestCase(unittest.TestCase): def setUp(self): - self.obj1 = pgefobject.PgefObject() - self.obj2 = pgefobject.PgefObject() + self.obj1 = pgefobject.PgefObject() + self.obj2 = pgefobject.PgefObject() + + def tearDown(self): + del self.obj1 + del self.obj2 + def Title(self): print '\nPGEFobject suite' + + def testDefaultObjectValues(self): + """Check to see if the object is created with the correct default values""" + #print self.obj1.pgef_oid + #assert self.obj1.pgef_oid == None , 'incorrect initial value for oid' + assert self.obj1.state == '', 'Status not empty' + assert self.obj1.owner == '', 'incorrect initial value for Point of Contact' + assert self.obj1.creator == '', 'Incorrect initial value for Creator' + + def testIsEqual(self): + """Check to see that the IsEqual method functions properly""" + self.obj1.popTestData() + self.obj2.popTestData() + assert self.obj1.IsEqual(self.obj2), 'Object1 and object2 are not equal' + + def testIsEmpty(self): + """Check to see that the IsEmpty returns true when the object is empty""" + result = self.obj1.IsEmpty() + assert result == 1 , 'New object should have been empty' + + def testIsNotEmpty(self): + """Check to see that the IsEmpty returns false when the object is empty""" + self.obj1.creator = '123' + result = self.obj1.IsEmpty() + assert result == False , 'Object should not have been empty' + self.obj1.creator = '' + + def testConvertDataToList(self): + """Check to see that ConvertDataToList returns the proper number of entries""" + temp = self.obj1.convertDataToList() + assert len(temp) == len(self.obj1._gridmap) + + def testDataMemberNames(self): + """Check to make sure that we have headings for all columns""" + temp = self.obj1.DataMemberNames() + assert len(temp) == len(self.obj1._gridmap) + + def testValidate(self): + """Check to make sure that if all required fields are not filled in that we receive + an exception""" + self.obj1._required = [] + self.obj1._required.append('test_name') + self.obj1.test_name = '' + self.assertRaises(pgefexceptions.RequiredDataError, self.obj1.Validate) + self.obj1._required.remove('test_name') + def testBuild(self): + self.obj1 = pgefobject.PgefObject() + self.obj2 = pgefobject.PgefObject() + self.obj1.popTestData() + self.obj2.build(self.obj1.__dict__) + assert self.obj1.IsEqual(self.obj2), 'Object1 and object2 are not equal' + + def suite(): suite = unittest.TestSuite() suite.addTest(PGEFObjectTestCase("Title")) @@ -21,6 +79,8 @@ suite.addTest(PGEFObjectTestCase("testConvertDataToList")) suite.addTest(PGEFObjectTestCase("testDataMemberNames")) suite.addTest(PGEFObjectTestCase("testValidate")) + suite.addTest(PGEFObjectTestCase("testBuild")) + return suite def main(): From pbear at ned.gsfc.nasa.gov Thu Oct 16 16:18:32 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 16 15:18:33 2003 Subject: [Pangalactic-commits] fixed getcategories and getorganizations Message-ID: <200310161918.h9GJIWAn032731@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.38 1.39 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.6 1.7 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.21 1.22 Log message: fixed getcategories and getorganizations Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.38 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.39 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.38 Wed Oct 15 13:48:01 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Thu Oct 16 15:18:30 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.38 2003/10/15 17:48:01 pbear Exp $ +# $Id: pgefadvisory.py,v 1.39 2003/10/16 19:18:30 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.38 $"[11:-2] +__version__ = "$Revision: 1.39 $"[11:-2] import os.path import string @@ -66,12 +66,12 @@ # leave this here... I use it to generate old data -vwk # -# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) -# earlier = now + mx.DateTime.RelativeDateTime(days=-10) -# self.pger_create_datetime = earlier -# self.pger_mod_datetime = earlier -# self.create_datetime = earlier -# self.mod_datetime = earlier + now = mx.DateTime.DateFromTicks(mx.DateTime.now()) + earlier = now + mx.DateTime.RelativeDateTime(days=-45) + self.pger_create_datetime = earlier + self.pger_mod_datetime = earlier + self.create_datetime = earlier + self.mod_datetime = earlier def __getattr__(self, name): Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.6 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.7 --- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.6 Thu Oct 9 13:05:18 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py Thu Oct 16 15:18:30 2003 @@ -86,7 +86,7 @@ for row in range(self.grid.GetNumberRows()): wfobj = self.grid.GetDataObj(row) - msg += "set bg colour for row: " + str(row) + msg += "\nrow: " + str(row) colour = wxLIGHT_GREY now = mx.DateTime.DateFromTicks(mx.DateTime.now()) @@ -99,19 +99,27 @@ #print duedate, late, very_late, lost_cause - if duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)) <= now: - colour = wxColour(225, 0, 0) - msg += "; Waaay Overdue" - elif duedate + mx.DateTime.RelativeDateTime(days=(+very_late)) <= now: + if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)): + colour = wxColour(240, 50, 50) + #colour = wxTheColourDatabase.FindColour("ORANGE") + msg += "; Waaay Overdue (%i) " % lost_cause + elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)): colour = wxTheColourDatabase.FindColour("CORAL") - msg += "; Very Late" - elif duedate + mx.DateTime.RelativeDateTime(days=(+late)) <= now: - colour = wxTheColourDatabase.FindColour("YELLOW") - msg += "; Late" + msg += "; Very Late (%i) " % very_late + elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)): + colour = wxColour(255, 255, 50) + #colour = wxTheColourDatabase.FindColour("YELLOW") + msg += "; Late (%i) " % late + elif now >= duedate: + colour = wxTheColourDatabase.FindColour("YELLOW GREEN") + #colour = wxColour(130, 230, 0) + msg += "; Sort of Late " else: - colour = wxColour(0, 240, 80) - msg += "; on time" + #colour = wxColour(80, 240, 100) + colour = wxTheColourDatabase.FindColour("LIME GREEN") + msg += "; on time " + msg += repr(colour) self.grid.SetCellBackgroundColour(row, somecol, colour) #print msg Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.21 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.22 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.21 Thu Oct 16 13:24:49 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Thu Oct 16 15:18:30 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.21 $ +@version: $Revision: 1.22 $ """ -__version__ = "$Revision: 1.21 $"[11:-2] +__version__ = "$Revision: 1.22 $"[11:-2] import xmlrpclib import types @@ -100,14 +100,16 @@ def getCategories(self, context): # Category is a subclass of DataElement. FSC is a # Category; it's passed in as the context - print "xmlrpc.getcategories" - data = self._RPC.getObjects('Category', "id_context=%s" % context) + print "xmlrpc.getcategories", context + crit = {"id_context" : context} + data = self._RPC.getObjects('Category', 0, 0, crit) if data: return [self._factory.remember(x) for x in data] - def getOrganizations(self): - print "xmlrpc.getorganizations" - data = self._RPC.getObjects('Organization', "id_context=DEMO") ## NOT staying. Demo only!! --vwk 28feb2003 + def getOrganizations(self, context): + print "xmlrpc.getorganizations", context + crit = {"id_context" : context} + data = self._RPC.getObjects('Organization', 0, 0, crit) if data: return [self._factory.remember(x) for x in data] From pbear at ned.gsfc.nasa.gov Thu Oct 16 18:19:46 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 16 17:19:48 2003 Subject: [Pangalactic-commits] adjust colours; add yellow for time period between due date and late Message-ID: <200310162119.h9GLJkjj002453@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.39 1.40 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.7 1.8 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.19 1.20 PanGalactic/pangalactic/utils/datamanager.py 1.47 1.48 PanGalactic/pangalactic/utils/localdb.py 1.40 1.41 Log message: adjust colours; add yellow for time period between due date and late Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.7 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.8 --- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.7 Thu Oct 16 15:18:30 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py Thu Oct 16 17:19:44 2003 @@ -100,23 +100,20 @@ #print duedate, late, very_late, lost_cause if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)): - colour = wxColour(240, 50, 50) - #colour = wxTheColourDatabase.FindColour("ORANGE") + colour = wxTheColourDatabase.FindColour("MAROON") + self.grid.SetCellTextColour(row, somecol, wxWHITE) msg += "; Waaay Overdue (%i) " % lost_cause elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)): - colour = wxTheColourDatabase.FindColour("CORAL") + colour = wxTheColourDatabase.FindColour("RED") msg += "; Very Late (%i) " % very_late elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)): - colour = wxColour(255, 255, 50) - #colour = wxTheColourDatabase.FindColour("YELLOW") + colour = wxTheColourDatabase.FindColour("CORAL") msg += "; Late (%i) " % late elif now >= duedate: - colour = wxTheColourDatabase.FindColour("YELLOW GREEN") - #colour = wxColour(130, 230, 0) + colour = wxTheColourDatabase.FindColour("YELLOW") msg += "; Sort of Late " else: - #colour = wxColour(80, 240, 100) - colour = wxTheColourDatabase.FindColour("LIME GREEN") + colour = wxTheColourDatabase.FindColour("GREEN") msg += "; on time " msg += repr(colour) Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.19 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.20 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.19 Thu Oct 16 11:17:20 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Thu Oct 16 17:19:44 2003 @@ -20,6 +20,13 @@ WF_START = wxNewId() +key_col = 0 +time_col = 1 +time_late_col = 2 +time_very_late_col = 3 +time_lost_cause_col = 4 +desc_col = 5 + class WorkflowWizard(wxPanel): """ Saving from this gui creates a WfProcess, as well as a WfActivity for each @@ -101,6 +108,16 @@ self.activitygrid.SetRowLabelSize(40) self.activitygrid.EnableEditing(True) + + purple = wxTheColourDatabase.FindColour("MAROON") + red = wxTheColourDatabase.FindColour("RED") + orange = wxTheColourDatabase.FindColour("CORAL") + yellow = wxTheColourDatabase.FindColour("YELLOW") + self.SetColForegroundColour(self.activitygrid, time_lost_cause_col, wxWHITE) + self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, purple) + self.SetColBackgroundColour(self.activitygrid, time_very_late_col, red) + self.SetColBackgroundColour(self.activitygrid, time_late_col, orange) + editor = wxGridCellChoiceEditor(["Initiated", "Draft", "Approved", "Released"], False) # print "editor", editor for row in range(self.activitygrid.GetNumberRows()): @@ -141,8 +158,8 @@ EVT_GRID_LABEL_LEFT_CLICK(self, self.OnSelectCell) EVT_GRID_SELECT_CELL(self, self.OnSelectCell) -# EVT_GRID_EDITOR_SHOWN(self, self.OnEditorShown) -# EVT_GRID_EDITOR_HIDDEN(self, self.OnEditorHidden) + EVT_GRID_EDITOR_SHOWN(self, self.OnEditorShown) + EVT_GRID_EDITOR_HIDDEN(self, self.OnEditorHidden) EVT_KEY_DOWN(self.activitygrid, self.OnActKeyDown) EVT_KEY_DOWN(self.transitiongrid, self.OnTransKeyDown) @@ -350,13 +367,6 @@ row += 1 row = 0 - key_col = 0 - time_col = 1 - time_late_col = 2 - time_very_late_col = 3 - time_lost_cause_col = 4 - desc_col = 5 - for akey, avalue in wfobj.activities.items(): #print akey, avalue.fields self.activitygrid.SetCellValue(row, key_col, avalue.fields["activity"]) @@ -367,13 +377,6 @@ self.activitygrid.SetCellValue(row, desc_col, avalue.fields["description"]) row += 1 - red = wxColour(225, 0, 0) - orange = wxTheColourDatabase.FindColour("CORAL") - yellow = wxTheColourDatabase.FindColour("YELLOW") - self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, red) - self.SetColBackgroundColour(self.activitygrid, time_very_late_col, orange) - self.SetColBackgroundColour(self.activitygrid, time_late_col, yellow) - def SetColBackgroundColour(self, grid, col, colour): numrows = grid.GetNumberRows() @@ -381,6 +384,12 @@ grid.SetCellBackgroundColour(row, col, colour) + def SetColForegroundColour(self, grid, col, colour): + numrows = grid.GetNumberRows() + for row in range(numrows): + grid.SetCellTextColour(row, col, colour) + + def SetActivities(self, activitydict): for row, value in activitydict.items(): for col in range(len(value)): @@ -416,12 +425,18 @@ def OnEditorShown(self, event): -# print "OnEditorShown: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition()) + # print "OnEditorShown: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition()) + if event.GetId() == self.activitygrid.GetId(): + if event.GetCol() == time_lost_cause_col: + self.activitygrid.SetCellTextColour(event.GetRow(), time_lost_cause_col, wxBLACK) event.Skip() def OnEditorHidden(self, event): -# print "OnEditorHidden: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition()) + # print "OnEditorHidden: (%d,%d) %s" % (event.GetRow(), event.GetCol(), event.GetPosition()) + if event.GetId() == self.activitygrid.GetId(): + if event.GetCol() == time_lost_cause_col: + self.activitygrid.SetCellTextColour(event.GetRow(), time_lost_cause_col, wxWHITE) event.Skip() Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.39 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.40 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.39 Thu Oct 16 15:18:30 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Thu Oct 16 17:19:44 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.39 2003/10/16 19:18:30 pbear Exp $ +# $Id: pgefadvisory.py,v 1.40 2003/10/16 21:19:44 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.39 $"[11:-2] +__version__ = "$Revision: 1.40 $"[11:-2] import os.path import string @@ -66,12 +66,12 @@ # leave this here... I use it to generate old data -vwk # - now = mx.DateTime.DateFromTicks(mx.DateTime.now()) - earlier = now + mx.DateTime.RelativeDateTime(days=-45) - self.pger_create_datetime = earlier - self.pger_mod_datetime = earlier - self.create_datetime = earlier - self.mod_datetime = earlier +# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) +# earlier = now + mx.DateTime.RelativeDateTime(days=-45) +# self.pger_create_datetime = earlier +# self.pger_mod_datetime = earlier +# self.create_datetime = earlier +# self.mod_datetime = earlier def __getattr__(self, name): Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.47 PanGalactic/pangalactic/utils/datamanager.py:1.48 --- PanGalactic/pangalactic/utils/datamanager.py:1.47 Thu Oct 16 11:17:21 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Thu Oct 16 17:19:45 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.47 $"[11:-2] +__version__ = "$Revision: 1.48 $"[11:-2] import time import mx.DateTime @@ -264,16 +264,20 @@ # need to make sure we get all the referenced objects filled in. pass in objs fieldnames = {"project_id" : projectlist[0]} - data = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + data = self.server.getObjects("ProductModelVersion", + fields = fieldnames, refs = 1, subtypes = 0, objs = []) #fieldnames = {"project_id" : projectlist[0]} - #pvs = self.server.getObjects("ProductVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + #pvs = self.server.getObjects("ProductVersion", + # fields = fieldnames, refs = 1, subtypes = 0, objs = []) #fieldnames = {"project_id" : projectlist[0]} - #pms = self.server.getObjects("ProductMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + #pms = self.server.getObjects("ProductMaster", + # fields = fieldnames, refs = 1, subtypes = 0, objs = []) #fieldnames = {"project_id" : projectlist[0]} - #pmms = self.server.getObjects("ProductModelMaster", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + #pmms = self.server.getObjects("ProductModelMaster", + # fields = fieldnames, refs = 1, subtypes = 0, objs = []) #print 'items for project: %s are: %s' % (projectlist[0], data) @@ -308,7 +312,8 @@ #print len(tempobjlist) self.localDB.Save(tempobjlist) - # tbd - need to revisit after the project info is ironed out as this will not work for more than 1 project + # tbd - need to revisit after the project info is ironed out + # as this will not work for more than 1 project # in the server call. currproject = projectlist[0] projectobjects = self.localDB.GetProjectObjects() @@ -471,10 +476,8 @@ def addNauoIDsEntry(self, nauo2add, parentnauo, nauo_dict): #print "addnauoidsentry" - # assemblyid parent nauoid : [child nauoid, ...] - #'0498C96D-41D4-8B8F-A4B0-F21958EA': {'TOPLEVEL' : ['ned.gsfc.nasa.gov__pbear__138']} - #'02818D7A-3F1C-17BD-0CD3-C5686251': {'ned.gsfc.nasa.gov__pbear__138' : ['000FECF5-EE7D-C1C7-E62B-BFD5F6AF']}, - #'03E0BB71-A6AA-15C8-908A-F93639A2': {'01964FA5-C877-8153-2DF9-D046CB93' : ['0220C03E-A304-86D6-91B1-8A0F92B6']}, + # {assemblyid : {parent nauoid : [child nauoid, ...]}, + # assemblyid : {parent nauoid : [child nauoid, ...]}} itemobj = self.localDB.GetItem(nauo2add._assembly.pgef_oid) # problems if not itemobj: @@ -489,7 +492,8 @@ def getItem(self, itemid): #obj = self.server.GetPMV(itemid) fieldnames = {"pgef_oid" : itemid} - obj = self.server.getObjects("ProductModelVersion", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + obj = self.server.getObjects("ProductModelVersion", + fields = fieldnames, refs = 1, subtypes = 0, objs = []) if obj: return obj else: @@ -502,7 +506,8 @@ def getDocument(self, docid): #obj = self.server.GetDocument(docid) fieldnames = {"pgef_oid" : docid} - obj = self.server.getObjects("Document", fields = fieldnames, refs = 0, subtypes = 1, objs = []) + obj = self.server.getObjects("Document", fields = + fieldnames, refs = 0, subtypes = 1, objs = []) if obj: return obj else: @@ -527,7 +532,8 @@ for objid in ItemIdList: #objlist = self.server.GetPDRByItemID(objid) fieldnames = {"document" : objid} - objlist = self.server.getObjects("ProductDocumentRelationship", fields = fieldnames, refs = 1, subtypes = 0, objs = []) + objlist = self.server.getObjects("ProductDocumentRelationship", + fields = fieldnames, refs = 1, subtypes = 0, objs = []) pdrids = [] pdrobjs = [] itemobjs = [] @@ -786,7 +792,8 @@ def commit(self, unsavedobjs, upload = True): - #tbd - need to actually pass upload flag or determine it based on document interfaces + #tbd - need to actually pass upload flag or + # determine it based on document interfaces print "datamanager.commit" @@ -904,14 +911,16 @@ if classname == 'ProductMaster': fieldnames = {'id' : root_object.id, 'id_context' : root_object.id_context} - objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + objlist = self.server.getObjects(classname, fields = fieldnames, + refs = 1, subtypes = 0, objs = [root_object]) #objlist = self.server.getPvByPm(root_object) elif classname == 'ProductVersion': fieldnames = {'of_pm_id' : root_object.of_pm_id, 'of_pm_id_context' : root_object.of_pm_id_context, 'id' : root_object.id} - objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + objlist = self.server.getObjects(classname, fields = fieldnames, + refs = 1, subtypes = 0, objs = [root_object]) #objlist = self.server.getPmmByPv(root_object) elif classname == 'ProductModelMaster': @@ -919,7 +928,8 @@ 'of_pm_id_context' : root_object.of_pm_id_context, 'of_pv_id' : root_object.of_pv_id, 'id' : root_object.id} - objlist = self.server.getObjects(classname, fields = fieldnames, refs = 1, subtypes = 0, objs = [root_object]) + objlist = self.server.getObjects(classname, fields = fieldnames, + refs = 1, subtypes = 0, objs = [root_object]) #objlist = self.server.getPmvByPmm(root_object) elif classname == 'ProductModelVersion': Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.40 PanGalactic/pangalactic/utils/localdb.py:1.41 --- PanGalactic/pangalactic/utils/localdb.py:1.40 Wed Oct 15 12:51:13 2003 +++ PanGalactic/pangalactic/utils/localdb.py Thu Oct 16 17:19:45 2003 @@ -282,7 +282,9 @@ else: #print "have acubyassembly key", assembly_tuple, component_tuple updated_acu = self.dbroot[self.ACUBYASSEMBLY][(assembly_tuple, component_tuple)] - self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu # add this to fix itemdropdown selection bug??? vwk + self.dbroot[self.ACUDICT][updated_acu.pgef_oid] = updated_acu + # add the above to fix itemdropdown selection bug??? vwk + retlist.append(updated_acu) self.Commit() @@ -407,7 +409,9 @@ #print c.__class__ #pprint.pprint(c.__dict__) childobj = self.GetItem(nobj._component.pgef_oid) - if currentproject and childobj.project_id == currentproject: # add project_context = "DEMO" or something similar + if currentproject and childobj.project_id == currentproject: + # add project_context = "DEMO" or something similar to the above line + #print "keeping", nid, "->", childobj.id, childobj.short_description objdict[nid] = nobj @@ -555,7 +559,8 @@ def GetProductModelVersionDict(self): return self.dbroot[self.PRODUCTMODELVERSION] - def GetLocalProducts(self, currentproject = None, pm = None, pmm = None, pv = None, pmv = None, all = None): + def GetLocalProducts(self, currentproject = None, + pm = None, pmm = None, pv = None, pmv = None, all = None): #print "localdb.getlocalproducts", currentproject dict_list = [] if pm or all: @@ -714,11 +719,15 @@ # isinstance is specifically used here for groups of classes tmpdict = {} for docid, doc in self.dbroot[self.DOCUMENTDICT].items(): - if isinstance(doc, document.Document) and not isinstance(doc, PgefAdvisory) and not isinstance(doc, partslist.PartsList): + if isinstance(doc, document.Document) and not \ + isinstance(doc, PgefAdvisory) and not \ + isinstance(doc, partslist.PartsList): if doc.state <> None: tmpdict[docid] = doc for docid, doc in self.dbroot[self.UNCOMMITTEDOBJECTS].items(): - if isinstance(doc, document.Document) and not isinstance(doc, PgefAdvisory) and not isinstance(doc, partslist.PartsList): + if isinstance(doc, document.Document) and not \ + isinstance(doc, PgefAdvisory) and not \ + isinstance(doc, partslist.PartsList): if doc.state <> objectstatus.DELETE: tmpdict[docid] = doc return tmpdict @@ -977,7 +986,10 @@ self.dbroot[savedict][id] = obj self.dbroot[self.OIDLOOKUP][obj.pgef_oid] = savedict #print "saved local object", savedict, id - if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']: + if obj.__class__.__name__ in ['ProductModelVersion', + 'ProductModelMaster', + 'ProductVersion', + 'ProductMaster']: compound_key = data_utils.createCompoundKey(obj) self.saveCompoundKey(obj, compound_key) @@ -990,7 +1002,10 @@ def makeCompoundKey(self, obj): compound_key = None - if obj.__class__.__name__ in ['ProductModelVersion', 'ProductModelMaster', 'ProductVersion', 'ProductMaster']: + if obj.__class__.__name__ in ['ProductModelVersion', + 'ProductModelMaster', + 'ProductVersion', + 'ProductMaster']: compound_key = data_utils.createCompoundKey(obj) return compound_key @@ -1593,11 +1608,17 @@ def getVersionTreeObjects(self, root_object): objs = [] if root_object.__class__.__name__ == 'ProductMaster': - objs = self.getPvByPm(root_object.id, root_object.id_context) + objs = self.getPvByPm(root_object.id, + root_object.id_context) elif root_object.__class__.__name__ == 'ProductVersion': - objs = self.getPmmByPv(root_object.of_pm_id, root_object.of_pm_id_context, root_object.id) + objs = self.getPmmByPv(root_object.of_pm_id, + root_object.of_pm_id_context, + root_object.id) elif root_object.__class__.__name__ == 'ProductModelMaster': - objs = self.getPmvByPmm(root_object.of_pm_id, root_object.of_pm_id_context, root_object.of_pv_id, root_object.id) + objs = self.getPmvByPmm(root_object.of_pm_id, + root_object.of_pm_id_context, + root_object.of_pv_id, + root_object.id) elif root_object.__class__.__name__ == 'ProductModelVersion': return None return objs From waterbug at ned.gsfc.nasa.gov Thu Oct 16 21:09:59 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 16 20:10:01 2003 Subject: [Pangalactic-commits] Add document_map view to PGERDB. Message-ID: <200310170009.h9H09xhQ004661@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbViews.sql None 1.1 Log message: Add document_map view to PGERDB. From waterbug at ned.gsfc.nasa.gov Thu Oct 16 21:12:07 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 16 20:12:09 2003 Subject: [Pangalactic-commits] Add "tag" attribute to pv, pmv, and dv, + tweaks to document table. Message-ID: <200310170012.h9H0C775004727@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbTables.sql 1.64 1.65 Log message: Add "tag" attribute to pv, pmv, and dv, + tweaks to document table. Index: PanGalactic/src/sql/createPgerDbTables.sql diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.64 PanGalactic/src/sql/createPgerDbTables.sql:1.65 --- PanGalactic/src/sql/createPgerDbTables.sql:1.64 Wed Oct 15 18:49:47 2003 +++ PanGalactic/src/sql/createPgerDbTables.sql Thu Oct 16 20:12:05 2003 @@ -1,6 +1,6 @@ /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */ -/* $Id: createPgerDbTables.sql,v 1.64 2003/10/15 22:49:47 waterbug Exp $ +/* $Id: createPgerDbTables.sql,v 1.65 2003/10/17 00:12:05 waterbug Exp $ * * *** TO DO *** * -- TBR (Text-Based Requirements) @@ -710,6 +710,9 @@ * applicable -- if not applicable, the defaults are * used). Defined as a foreign key referencing the * project table. */ + tag TEXT, + /* [CVS] A string identifier used to identify a + * baseline, release, or version. */ has_docs_flag BOOLEAN DEFAULT FALSE, /* A computed attribute: TRUE if the ProductVersion * occurs in a ProductVersionDocrel; otherwise, FALSE. @@ -909,6 +912,9 @@ * applicable -- if not applicable, the defaults are * used). Defined as a foreign key referencing the * project table. */ + tag TEXT, + /* [CVS] A string identifier used to identify a + * baseline, release, or version. */ has_docs_flag BOOLEAN DEFAULT FALSE, /* (Inherited from ProductVersion.) * A computed attribute: TRUE if the ProductModelVersion @@ -1177,6 +1183,9 @@ * this may map to an element tag) * 'annotation' ............ (name is optional) * */ + tag TEXT, + /* [CVS] A string identifier used to identify a + * baseline, release, or version. */ content TEXT DEFAULT '', /* The plain text content of the document. For a * document with structural_role = 'annotation', this is @@ -1254,9 +1263,9 @@ CREATE TABLE document /* Document is a container object that provides access to the - * current version of a document and all related objects. - * Document is the primary object that applications will deal - * directly with. */ + * current version of a document and all of its constituent + * objects. Document is the primary object that applications + * will deal directly with. */ ( pgef_oid TEXT UNIQUE, /* (This attribute is inherited from PgefObject.) @@ -1271,19 +1280,10 @@ * and set to a custom application object class. */ master TEXT, /* pgef_oid of the associated DocMaster. */ - current_version TEXT, - /* pgef_oid of the latest DocVersion associated with that - * DocMaster. */ PRIMARY KEY (pgef_oid), CONSTRAINT doc_has_master FOREIGN KEY (master) REFERENCES doc_master(pgef_oid) - ON UPDATE CASCADE - ON DELETE CASCADE - DEFERRABLE, - CONSTRAINT doc_has_current_version - FOREIGN KEY (current_version) - REFERENCES doc_version(pgef_oid) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE From waterbug at ned.gsfc.nasa.gov Fri Oct 17 17:49:33 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Fri Oct 17 16:49:35 2003 Subject: [Pangalactic-commits] Fix for duplicate extracts/objects problem. Message-ID: <200310172049.h9HKnXeS018361@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/pger.py 1.44 1.45 Log message: Fix for duplicate extracts/objects problem. Index: PanGalactic/pangalactic/repo/pger.py diff -u PanGalactic/pangalactic/repo/pger.py:1.44 PanGalactic/pangalactic/repo/pger.py:1.45 --- PanGalactic/pangalactic/repo/pger.py:1.44 Tue Oct 7 23:39:36 2003 +++ PanGalactic/pangalactic/repo/pger.py Fri Oct 17 16:49:32 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Entropy Reverser module -@version: $Revision: 1.44 $ +@version: $Revision: 1.45 $ """ -__version__ = "$Revision: 1.44 $"[11:-2] +__version__ = "$Revision: 1.45 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $ import time @@ -132,7 +132,7 @@ raise ValueError, '%s is not in the schema of %s' % (a, typename) dbargs.append((a, kw[a], '=')) # TODO: implement refs and subtypes ... - dres = self._pgerdb.doPgerdbQuery(table, 0, *dbargs) + dres = self._pgerdb.doPgerdbQuery(table, subtypes, *dbargs) dres.addErrback(log.err) if not refs: return dres @@ -142,6 +142,7 @@ [self._pgerdb.getByRowKey(rk) for rk in x]) dres.addCallback(defer.gatherResults) + dres.addCallback(utils.unique) return dres else: d = defer.Deferred() From waterbug at ned.gsfc.nasa.gov Fri Oct 17 17:49:55 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Fri Oct 17 16:49:57 2003 Subject: [Pangalactic-commits] pgefobject.py Message-ID: <200310172049.h9HKntCc018415@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/document.py 1.10 1.11 PanGalactic/pangalactic/enterprise/docversion.py 1.11 1.12 PanGalactic/pangalactic/enterprise/pgefobject.py 1.27 1.28 PanGalactic/pangalactic/enterprise/productversion.py 1.20 1.21 Log message: pgefobject.py Index: PanGalactic/pangalactic/enterprise/document.py diff -u PanGalactic/pangalactic/enterprise/document.py:1.10 PanGalactic/pangalactic/enterprise/document.py:1.11 --- PanGalactic/pangalactic/enterprise/document.py:1.10 Mon Sep 15 16:08:59 2003 +++ PanGalactic/pangalactic/enterprise/document.py Fri Oct 17 16:49:53 2003 @@ -1,10 +1,10 @@ -# $Id: document.py,v 1.10 2003/09/15 20:08:59 waterbug Exp $ +# $Id: document.py,v 1.11 2003/10/17 20:49:53 waterbug Exp $ """ The Mother of all document types in PGEF. """ -__version__ = "$Revision: 1.10 $"[11:-2] +__version__ = "$Revision: 1.11 $"[11:-2] import string from pangalactic.enterprise.pgefobject import PgefObject @@ -16,23 +16,32 @@ def FillSampleDocument(document): document.creator = 'Test Harness' -class Document(DocVersion): +class Document(PgefObject): """ I encapsulate the most generic document attributes and behaviors. All document types subclass me. + + The function of Document is primarily to provide an + application-level interface adaptable to the many contexts in + which a document concept can be found. Its methods should + probably define an Interface (as in the Twisted and Zope + component architectures. """ - # all computed attributes are Dublin Core _default_display_order = [] _default_display_names = {} _default_display_types = {} - _excluded_fields = DocVersion._excluded_fields + _excluded_fields = PgefObject._excluded_fields _gridmap = [ ['Title', 'self.Title'], ['Creator', 'self.Creator'], ['Rev', 'self.Revision'], ['Date', 'self.Date'], - ['Type', 'self.Type'] + ['Type', 'self.DocTypeCode'] + # we may want to substitute DocType() or even + # PrettyDocType() here ... ] + # These are from the Dublin Core, and are computed from the + # attributes of the associated DocMaster and DocVersion: _properties = { 'Title' : 'str', 'Identifier' : 'str', @@ -40,30 +49,45 @@ 'Revision' : 'str', 'Description' : 'str', 'Date' : 'str', - 'Type' : 'str' + 'DocTypeCode' : 'str' + } + _refd = { + '_master' : 'DocMaster' + } + _required = ['master', 'current_version'] + _schema_ext = { + 'master' : 'str' } - _required = [] - _schema_ext = {} _schema = _schema_ext.copy() - _schema.update(DocVersion._schema) + _schema.update(PgefObject._schema) _searchabletext = True _std_abbrev = 'doc' def __init__(self, email=None, schema=_schema, **kw): - DocVersion.__init__(self, email=email, + PgefObject.__init__(self, email=email, schema=schema, **kw) for a in kw: if a in self._properties: setattr(self, a, kw[a]) + cv = getattr(self, '_current_version', None) + if cv: + self._master = cv._of_master + self.id = self._master.id + self.id_context = self._master.id_context def deleteAttr(self): raise TypeError, 'Cannot delete attribute' def getTitle(self): - return self._of_master.name + # What if a document's Title changes? It is actually the + # 'name' attribute of the current DocVersion that + # changes. DocVersions formed before the change would + # have a different Title from those formed after the + # change. + return self._current_version.name def setTitle(self, value): - self._of_master.name = value + self._current_version.__dict__['name'] = value Title = property(getTitle, setTitle, @@ -71,11 +95,10 @@ 'Title') def getIdentifier(self): - return self._of_master.id + return self._current_version._of_master.id def setIdentifier(self, value): - self._of_master.id = value - self.of_dm_id = value + self._master.__dict__['id'] = value Identifier = property(getIdentifier, setIdentifier, @@ -83,10 +106,17 @@ 'Identifier') def getCreator(self): - return self.creator + # for now, 'creator' is taken to be the id of the initial + # creator of the document -- i.e., of the DocMaster. + # Actually, we probably want the "full name" of the + # person, so it will need to be computed. (Need to look + # it up when Document is initialized, or else assign a + # real Person object -- say, _creator -- to Document and + # find the full name from that.) + return self._master.creator def setCreator(self, value): - self.__dict__['creator'] = value + self._master.__dict__['creator'] = value Creator = property(getCreator, setCreator, @@ -94,10 +124,10 @@ 'Creator') def getRevision(self): - return self.id + return self._current_version.id def setRevision(self, value): - self.__dict__['id'] = value + self._current_version.__dict__['id'] = value Revision = property(getRevision, setRevision, @@ -105,10 +135,10 @@ 'Revision') def getDescription(self): - return self.long_description + return self._master.long_description def setDescription(self, value): - self.__dict__['long_description'] = value + self.__master.__dict__['long_description'] = value Description = property(getDescription, setDescription, @@ -116,7 +146,7 @@ 'Description') def getDate(self): - return self._create_date + return self._master._create_date def setDate(self, value): # 'setDate' is an error because the date should not be @@ -130,19 +160,20 @@ deleteAttr, 'Date') - def getType(self): - return self._of_master.doc_type_code + def getDocTypeCode(self): + return self._master.doc_type_code - def setType(self, value): - self.__dict__['_of_master'].doc_type_code = value + def setDocTypeCode(self, value): + self._master.__dict__['doc_type_code'] = value - Type = property(getType, - setType, - deleteAttr, - 'Type') + DocTypeCode = property(getDocTypeCode, + setDocTypeCode, + deleteAttr, + 'DocTypeCode') def getDocType(self): - return self.doc_type_code_context + "_" + self.doc_type_code + return (self._master.doc_type_code_context + + "_" + self._master.doc_type_code) def getPrettyDocType(self): tmpcode = self.doc_type_code.replace("_", " ") Index: PanGalactic/pangalactic/enterprise/docversion.py diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.11 PanGalactic/pangalactic/enterprise/docversion.py:1.12 --- PanGalactic/pangalactic/enterprise/docversion.py:1.11 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/docversion.py Fri Oct 17 16:49:53 2003 @@ -1,10 +1,10 @@ -# $Id: docversion.py,v 1.11 2003/10/01 17:35:27 waterbug Exp $ +# $Id: docversion.py,v 1.12 2003/10/17 20:49:53 waterbug Exp $ """ Version-specific attributes of a document. """ -__version__ = "$Revision: 1.11 $"[11:-2] +__version__ = "$Revision: 1.12 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docmaster import DocMaster as DM @@ -46,10 +46,13 @@ 'id', 'creator' ] - _refd = {'_of_master' : 'DocMaster'} + _refd = { + '_of_master' : 'DocMaster', + } _schema_ext = { 'of_dm_id' : 'str', 'of_dm_id_context' : 'str', + 'tag' : 'str', 'content' : 'str', 'abstract' : 'str' } @@ -58,23 +61,14 @@ _std_abbrev = 'dv' def __init__(self, email=None, schema=_schema, - dm=None, **kw): + _of_master=None, **kw): # PgefObject.__init__() creates the pgef_oid ... PgefObject.__init__(self, email=email, schema=schema, **kw) - if dm.__class__.__name__ == 'DocMaster': - self._of_master = dm - # if not, create one ... - else: - dmid = kw.get('of_dm_id', - 'Document Master Identifier') - dmidc = kw.get('of_dm_id_context', 'PGER') - self._of_master = DM(email=email, - id=dmid, - id_context=dmidc) - # set "foreign key" attributes from referenced dm ... - self.of_dm_id = self._of_master.id - self.of_dm_id_context = self._of_master.id_context + if _of_master.__class__.__name__ == 'DocMaster': + self._of_master = _of_master + self.of_dm_id = self._of_master.id + self.of_dm_id_context = self._of_master.id_context def __getattr__(self, name): return PgefObject.__getattr__(self, name) Index: PanGalactic/pangalactic/enterprise/pgefobject.py diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.27 PanGalactic/pangalactic/enterprise/pgefobject.py:1.28 --- PanGalactic/pangalactic/enterprise/pgefobject.py:1.27 Tue Oct 7 16:03:33 2003 +++ PanGalactic/pangalactic/enterprise/pgefobject.py Fri Oct 17 16:49:53 2003 @@ -1,8 +1,8 @@ -# $Id: pgefobject.py,v 1.27 2003/10/07 20:03:33 waterbug Exp $ +# $Id: pgefobject.py,v 1.28 2003/10/17 20:49:53 waterbug Exp $ """ The Mother of all PGEF application classes. -@version: $Revision: 1.27 $ +@version: $Revision: 1.28 $ """ # TODO: @@ -24,7 +24,7 @@ # should we jettison this? # Nope. -__version__ = "$Revision: 1.27 $"[11:-2] +__version__ = "$Revision: 1.28 $"[11:-2] import types import string @@ -105,12 +105,17 @@ @type _properties: dictionary @cvar _properties: the names and types of all attributes that are computed as Python properties - and their types. + and their types. (_properties define the + "external view" of the object, whereas + _schema defines the "internal view".) - C{{ attr_name : type, ... }} @type _schema: dictionary @cvar _schema: defines the persistable attributes of - PgefObject and their type names: + PgefObject and their type names. (_schema + defines the "internal view" of the object, + whereas _properties define the "external + view".) - C{{ attr_name : type, ... }} @type _refd: dictionary @@ -148,6 +153,7 @@ _refd = {} _schema = { 'pgef_oid' : 'str', + 'pgef_class' : 'str', 'id' : 'str', 'id_context' : 'str', 'pgef_security_mask' : 'int', Index: PanGalactic/pangalactic/enterprise/productversion.py diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.20 PanGalactic/pangalactic/enterprise/productversion.py:1.21 --- PanGalactic/pangalactic/enterprise/productversion.py:1.20 Thu Oct 2 12:19:57 2003 +++ PanGalactic/pangalactic/enterprise/productversion.py Fri Oct 17 16:49:53 2003 @@ -1,12 +1,12 @@ -# $Id: productversion.py,v 1.20 2003/10/02 16:19:57 waterbug Exp $ +# $Id: productversion.py,v 1.21 2003/10/17 20:49:53 waterbug Exp $ """ Version-dependent product data. -@version: $Revision: 1.20 $ +@version: $Revision: 1.21 $ """ -__version__ = "$Revision: 1.20 $"[11:-2] +__version__ = "$Revision: 1.21 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -60,10 +60,12 @@ 'of_pm_id_context' ] _schema_ext = { + 'id' : 'int', 'of_pm_id' : 'str', 'of_pm_id_context' : 'str', 'project_id' : 'str', 'project_id_context' : 'str', + 'tag' : 'str', 'has_docs_flag' : 'bool' } _schema = _schema_ext.copy() From waterbug at ned.gsfc.nasa.gov Tue Oct 21 15:45:42 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 21 14:45:45 2003 Subject: [Pangalactic-commits] Only references a DocMaster (_master) now. Message-ID: <200310211845.h9LIjgwo031675@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/document.py 1.11 1.12 Log message: Only references a DocMaster (_master) now. Index: PanGalactic/pangalactic/enterprise/document.py diff -u PanGalactic/pangalactic/enterprise/document.py:1.11 PanGalactic/pangalactic/enterprise/document.py:1.12 --- PanGalactic/pangalactic/enterprise/document.py:1.11 Fri Oct 17 16:49:53 2003 +++ PanGalactic/pangalactic/enterprise/document.py Tue Oct 21 14:45:40 2003 @@ -1,10 +1,10 @@ -# $Id: document.py,v 1.11 2003/10/17 20:49:53 waterbug Exp $ +# $Id: document.py,v 1.12 2003/10/21 18:45:40 waterbug Exp $ """ The Mother of all document types in PGEF. """ -__version__ = "$Revision: 1.11 $"[11:-2] +__version__ = "$Revision: 1.12 $"[11:-2] import string from pangalactic.enterprise.pgefobject import PgefObject @@ -54,7 +54,7 @@ _refd = { '_master' : 'DocMaster' } - _required = ['master', 'current_version'] + _required = ['master'] _schema_ext = { 'master' : 'str' } @@ -69,11 +69,6 @@ for a in kw: if a in self._properties: setattr(self, a, kw[a]) - cv = getattr(self, '_current_version', None) - if cv: - self._master = cv._of_master - self.id = self._master.id - self.id_context = self._master.id_context def deleteAttr(self): raise TypeError, 'Cannot delete attribute' From pbear at ned.gsfc.nasa.gov Tue Oct 21 18:25:21 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 21 17:25:24 2003 Subject: [Pangalactic-commits] new document stuff Message-ID: <200310212125.h9LLPLKw002693@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py 1.3 1.4 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.106 1.107 PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py 1.19 1.20 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py 1.31 1.32 PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.29 1.30 PanGalactic/pangalactic/client/modules/psm/productdataform.wdr 1.2 1.3 PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py 1.3 1.4 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.117 1.118 PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py 1.2 1.3 PanGalactic/pangalactic/enterprise/docmaster.py 1.10 1.11 PanGalactic/pangalactic/enterprise/docrep.py 1.13 1.14 PanGalactic/pangalactic/enterprise/document.py 1.12 1.13 PanGalactic/pangalactic/enterprise/docversion.py 1.12 1.13 PanGalactic/pangalactic/enterprise/drfile.py 1.7 1.8 PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.40 1.41 PanGalactic/pangalactic/utils/basegrid.py 1.13 1.14 PanGalactic/pangalactic/utils/datamanager.py 1.48 1.49 PanGalactic/pangalactic/utils/localdb.py 1.41 1.42 PanGalactic/pangalactic/utils/pgefdatatable.py 1.4 1.5 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.22 1.23 Log message: new document stuff Index: PanGalactic/pangalactic/enterprise/docmaster.py diff -u PanGalactic/pangalactic/enterprise/docmaster.py:1.10 PanGalactic/pangalactic/enterprise/docmaster.py:1.11 --- PanGalactic/pangalactic/enterprise/docmaster.py:1.10 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/docmaster.py Tue Oct 21 17:25:18 2003 @@ -1,10 +1,10 @@ -# $Id: docmaster.py,v 1.10 2003/10/01 17:35:27 waterbug Exp $ +# $Id: docmaster.py,v 1.11 2003/10/21 21:25:18 pbear Exp $ """ Version-independent attributes of a document. """ -__version__ = "$Revision: 1.10 $"[11:-2] +__version__ = "$Revision: 1.11 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject @@ -51,4 +51,8 @@ def getDocType(self): return self.doc_type_code_context + "_" + self.doc_type_code + + def getPrettyDocType(self): + tmpcode = self.doc_type_code.replace("_", " ") + return self.doc_type_code_context.upper() + " " + string.capwords(tmpcode) Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.22 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.23 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.22 Thu Oct 16 15:18:30 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 21 17:25:19 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.22 $ +@version: $Revision: 1.23 $ """ -__version__ = "$Revision: 1.22 $"[11:-2] +__version__ = "$Revision: 1.23 $"[11:-2] import xmlrpclib import types @@ -126,13 +126,13 @@ is the _assembly (the object that contains the _component object). """ - #print "in xmlrpcinterface.GetAcusByAssembly" + print "in xmlrpcinterface.GetAcusByAssembly" acu = ACU(_assembly=assembly) keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']]) #print "keydict", keydict data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict) if data: - #print "have data" + print "have acus" return self._factory.rememberAll(data) def GetPerson(self, user_tuple): Index: PanGalactic/pangalactic/client/modules/psm/pgefedittree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.31 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.32 --- PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.31 Wed Oct 8 11:30:46 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefedittree.py Tue Oct 21 17:25:18 2003 @@ -89,7 +89,7 @@ def LoadTreefromObjects(self, datamanager, rootitemid, rootnauoid, currentdata = None, product_type = None): """Loads the tree from the dicts in the DataManager""" - #print "pgefedittree: loadtreefromobjects" + print "pgefedittree.loadtreefromobjects" #print "refresh: " + str(self.DataManager.refresh) self.DeleteAllItems() @@ -164,7 +164,7 @@ else: if self.DataManager.inLocalMode: - #print "localmode", self.DataManager.currentProject + print "localmode", self.DataManager.currentProject localnauos = self.DataManager.localDB.GetLocalNauos(self.DataManager.currentProject) #print "localnauos" #import pprint @@ -175,7 +175,7 @@ #print "NauoNodes", NauoNodes else: - #print "logged in" + print "logged in" if self.DataManager.nauoIDs.has_key(lookupid): #import pprint #print "NauoIDs" @@ -184,7 +184,7 @@ NauoLookup = self.DataManager.nauoIDs[lookupid] #print "NauoLookup" #pprint.pprint(NauoLookup) - NauoNodes = NauoLookup[tmpnauoid] ## ??? needs checking when we can login + NauoNodes = NauoLookup[tmpnauoid] ## ??? tbd. needs checking when we can login else: print "pgefedittree.loadtreefromobjects logged in; no match for lookupid", lookupid @@ -218,5 +218,7 @@ self.SelectItem(highlightednode) else: self.SelectItem(rootnode) + + print "end pgefedittree.loadtreefromobjects" Index: PanGalactic/pangalactic/enterprise/docrep.py diff -u PanGalactic/pangalactic/enterprise/docrep.py:1.13 PanGalactic/pangalactic/enterprise/docrep.py:1.14 --- PanGalactic/pangalactic/enterprise/docrep.py:1.13 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/docrep.py Tue Oct 21 17:25:18 2003 @@ -1,10 +1,10 @@ -# $Id: docrep.py,v 1.13 2003/10/01 17:35:27 waterbug Exp $ +# $Id: docrep.py,v 1.14 2003/10/21 21:25:18 pbear Exp $ """ A representation or format of a document. """ -__version__ = "$Revision: 1.13 $"[11:-2] +__version__ = "$Revision: 1.14 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docversion import DocVersion as DV @@ -59,28 +59,20 @@ _schema.update(PgefObject._schema) _std_abbrev = 'dr' - def __init__(self, email=None, schema=_schema, - dv=None, **kw): + def __init__(self, _of_version, email=None, schema=_schema, **kw): # PgefObject.__init__() creates the pgef_oid ... - PgefObject.__init__(self, email=email, - schema=schema, **kw) - # if a DocVersion (dv) is passed in, use it ... - if dv.__class__.__name__ == 'DocVersion': - self._of_version = dv - # if not, create one ... - else: - dvid = kw.get('of_dv_id', '1') - dvdmid = kw.get('of_dm_id', 'Default Doc ID') - dvdmidc = kw.get('of_dm_id_context', 'PGER') - self._of_version = DV(email=email, - id=dvid, - of_dm_id=dvdmid, - of_dm_id_context=dvdmidc) + PgefObject.__init__(self, email=email, schema=schema, **kw) + + try: + assert _of_version.__class__.__name__ == 'DocVersion' + except: + raise TypeError, "Expecting DocVersion instance as second argument" + + self._of_version = _of_version # set "foreign key" attributes from referenced dv ... self.of_dv_id = self._of_version.id self.of_dm_id = self._of_version.of_dm_id self.of_dm_id_context = self._of_version.of_dm_id_context - # set "convenience" attribute referencing DocMaster ... - self._of_master = self._of_version._of_master + Index: PanGalactic/pangalactic/utils/pgefdatatable.py diff -u PanGalactic/pangalactic/utils/pgefdatatable.py:1.4 PanGalactic/pangalactic/utils/pgefdatatable.py:1.5 --- PanGalactic/pangalactic/utils/pgefdatatable.py:1.4 Wed Oct 1 13:24:14 2003 +++ PanGalactic/pangalactic/utils/pgefdatatable.py Tue Oct 21 17:25:19 2003 @@ -129,6 +129,12 @@ #-------------------------------------------------- # Methods added for pgef purposes. + + def getObject(self, row): + temp_obj = self._data[row] + return temp_obj + + def GetObjectOid(self, row): temp_obj = self._data[row] try: Index: PanGalactic/pangalactic/enterprise/drfile.py diff -u PanGalactic/pangalactic/enterprise/drfile.py:1.7 PanGalactic/pangalactic/enterprise/drfile.py:1.8 --- PanGalactic/pangalactic/enterprise/drfile.py:1.7 Wed Oct 1 13:35:27 2003 +++ PanGalactic/pangalactic/enterprise/drfile.py Tue Oct 21 17:25:18 2003 @@ -1,10 +1,10 @@ -# $Id: drfile.py,v 1.7 2003/10/01 17:35:27 waterbug Exp $ +# $Id: drfile.py,v 1.8 2003/10/21 21:25:18 pbear Exp $ """ A file that contains an instance of a document. """ -__version__ = "$Revision: 1.7 $"[11:-2] +__version__ = "$Revision: 1.8 $"[11:-2] from pangalactic.enterprise.pgeffile import PgefFile from pangalactic.enterprise.docversion import DocVersion as DV @@ -46,26 +46,20 @@ _schema.update(PgefFile._schema) _std_abbrev = 'df' - def __init__(self, email=None, schema=_schema, - dr=None, **kw): - PgefFile.__init__(self, email=email, - schema=schema, **kw) - # if a dv is passed in, use it ... - if dr.__class__.__name__ == 'DocRep': - self._of_dr = dr - else: - # if not, create one ... - drid = kw.get('of_dr_id', '1') - dvid = kw.get('of_dv_id', '1') - dvdmid = kw.get('of_dm_id', - 'Document Master Identifier') - dvdmidc = kw.get('of_dm_id_context', 'PGER') - self._of_dr = DR(id=drid, - of_dv_id=dvid, - of_dm_id=dvdmid, - of_dm_id_context=dvdmidc) + def __init__(self, _of_dr, email=None, schema=_schema, **kw): + PgefFile.__init__(self, email=email, schema=schema, **kw) + + try: + assert _of_dr.__class__.__name__ == 'DocRep' + except: + raise TypeError, "Expecting a DocRep instance as argument 2" + + self._of_dr = dr # pull in _of_master from the _of_version so we don't # have to go nuts with blah.blah.blah to get to # attributes of my parents ... - self._of_master = self._of_version._of_master + self.of_dm_id = self._of_dr._of_version._of_master.id + self.of_dm_id_context = self._of_dr._of_version._of_master.id_context + self.of_dv_id = self._of_dr._of_version.id + self.of_dr_id = self._of_dr.id Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.40 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.41 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.40 Thu Oct 16 17:19:44 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Tue Oct 21 17:25:18 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.40 2003/10/16 21:19:44 pbear Exp $ +# $Id: pgefadvisory.py,v 1.41 2003/10/21 21:25:18 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.40 $"[11:-2] +__version__ = "$Revision: 1.41 $"[11:-2] import os.path import string @@ -67,7 +67,7 @@ # leave this here... I use it to generate old data -vwk # # now = mx.DateTime.DateFromTicks(mx.DateTime.now()) -# earlier = now + mx.DateTime.RelativeDateTime(days=-45) +# earlier = now + mx.DateTime.RelativeDateTime(days=-40) # self.pger_create_datetime = earlier # self.pger_mod_datetime = earlier # self.create_datetime = earlier Index: PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py diff -u PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py:1.2 PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py:1.3 --- PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py:1.2 Tue Sep 16 15:11:53 2003 +++ PanGalactic/pangalactic/client/modules/psm/toolpanel_wdr.py Tue Oct 21 17:25:18 2003 @@ -8,9 +8,9 @@ # Window functions -ID_TEXT = 10000 -ID_PROJECT = 10001 -ID_ITEM = 10002 +ID_TEXT = wxNewId() +ID_PROJECT = wxNewId() +ID_ITEM = wxNewId() def TopPanelFunc( parent, call_fit = true, set_sizer = true ): item0 = wxFlexGridSizer( 0, 7, 0, 0 ) Index: PanGalactic/pangalactic/utils/basegrid.py diff -u PanGalactic/pangalactic/utils/basegrid.py:1.13 PanGalactic/pangalactic/utils/basegrid.py:1.14 --- PanGalactic/pangalactic/utils/basegrid.py:1.13 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/utils/basegrid.py Tue Oct 21 17:25:19 2003 @@ -425,4 +425,7 @@ def GetObjectOid(self, row): return self.table.GetObjectOid(row) + def getObject(self, row): + return self.table.getObject(row) + Index: PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py diff -u PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.3 PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.4 --- PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py:1.3 Wed Oct 15 11:03:19 2003 +++ PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py Tue Oct 21 17:25:18 2003 @@ -11,13 +11,13 @@ # Window functions -ID_TEXT = 10000 -ID_VERSION = 10001 -ID_BUILD_DATE = 10002 -ID_BUTTON_ABOUTOK = 10003 -ID_LINE = 10004 -ID_STATICBITMAP_PYTHON = 10005 -ID_STATICBITMAP_WXPYTHON = 10006 +ID_TEXT = wxNewId() +ID_VERSION = wxNewId() +ID_BUILD_DATE = wxNewId() +ID_BUTTON_ABOUTOK = wxNewId() +ID_LINE = wxNewId() +ID_STATICBITMAP_PYTHON = wxNewId() +ID_STATICBITMAP_WXPYTHON = wxNewId() def AboutFunc( parent, call_fit = True, set_sizer = True ): item0 = wxBoxSizer( wxVERTICAL ) Index: PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.19 PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.20 --- PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py:1.19 Wed Oct 8 11:30:46 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefdoctree.py Tue Oct 21 17:25:18 2003 @@ -47,21 +47,37 @@ self.DeleteAllItems() self.nodeStack.append(self.AddRoot("Documents")) rootnode = self.GetRootItem() + + def getTreeLabelForProduct(self, obj): + classname = obj.__class__.__name__ + if classname == "ProductMaster": + foo = obj.id + elif classname == "ProductModelMaster": + foo = obj.of_pm_id + "." + obj.of_pv_id + elif classname == "ProductVersion": + foo = obj.of_pm_id + "." + obj.id + elif classname == "ProductModelVersion": + foo = obj.of_pm_id + "." + obj.of_pv_id + return foo def LoadTreefromPartsLists(self, datamanager, rootitemid, rootpdrid, currentdata): """Loads the tree from the dicts in the DataManager""" - #print "pgefdoctree: loadtreefrompls" self.DeleteAllItems() rootitem = datamanager.localDB.GetItem(rootitemid) - foo = rootitem.of_pm_id + "." + rootitem.of_pv_id + + #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id + foo = self.getTreeLabelForProduct(rootitem) self.nodeStack.append(self.AddRoot(foo)) rootnode = self.GetRootItem() + if rootitem.__class__.__name__ <> "ProductModelVersion": + print "No partslist tree to build yet (not a pmv)" + return + if rootitem.has_parts_lists_flag: if datamanager.user._loggedin: if not self.IsExpanded(rootnode): - #print "call getpdrs" datamanager.getPDRByItemID([rootitemid]) @@ -69,7 +85,6 @@ self.SetItemImage(rootnode, self.itemicon) self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected) - lookupid = rootitemid tmppdrid = rootpdrid @@ -110,7 +125,6 @@ #print "pdrobj", pdrobj plobj = datamanager.localDB.GetPartsList(pdrobj.document) - if plobj: treeid = self.AppendItem(rootnode, plobj.id) self.SetPyData(treeid, [pdrobj.pgef_oid, plobj.pgef_oid]) @@ -119,24 +133,19 @@ if currentdata: if plobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]: - highlightednode = treeid #print "childcount", childcount if childcount > 0: - self.SetItemHasChildren(rootnode, true) self.SortChildren(rootnode) - - self.Expand(rootnode) - if highlightednode: + if highlightednode: self.SelectItem(highlightednode) else: self.SelectItem(rootnode) - #print "end pgefdoctree.loadtreefrompartslists" @@ -147,7 +156,8 @@ self.DeleteAllItems() rootitem = datamanager.localDB.GetItem(rootitemid) - foo = rootitem.of_pm_id + "." + rootitem.of_pv_id + foo = self.getTreeLabelForProduct(rootitem) + #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id self.nodeStack.append(self.AddRoot(foo)) rootnode = self.GetRootItem() @@ -156,17 +166,18 @@ self.SetItemImage(rootnode, self.itemicon, wxTreeItemIcon_Selected) self.SelectItem(rootnode) + if rootitem.__class__.__name__ <> "ProductModelVersion": + print "No document tree to build yet (not a pmv)" + return + if rootitem.has_parts_lists_flag: #print "has docs" if datamanager.user._loggedin: #print "logged in" if not self.IsExpanded(rootnode): #print "calling getpdrs" - datamanager.getPDRByItemID([rootitemid]) - - lookupid = rootitemid tmppdrid = rootpdrid @@ -219,21 +230,16 @@ docobj = datamanager.localDB.GetDocument(pdrobj.document) #print "back from getdocument" - - if docobj: #print "found doc in zodb" - treeid = self.AppendItem(rootnode, docobj.id) self.SetPyData(treeid, [pdrobj.pgef_oid, docobj.pgef_oid]) self.SetItemImage(treeid, self.documenticon) self.SetItemImage(treeid, self.documenticon, wxTreeItemIcon_Selected) - if currentdata: # print "currentdata" if docobj.pgef_oid == currentdata[1] and pdrobj.pgef_oid == currentdata[0]: - highlightednode = treeid # else: @@ -241,15 +247,12 @@ if childcount > 0: #print "set child flag on" - self.SetItemHasChildren(rootnode, true) self.SortChildren(rootnode) - self.Expand(rootnode) if highlightednode: - self.SelectItem(highlightednode) else: self.SelectItem(rootnode) Index: PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py diff -u PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.3 PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.4 --- PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.3 Fri Apr 4 13:43:27 2003 +++ PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py Tue Oct 21 17:25:18 2003 @@ -3,8 +3,11 @@ # Do not modify this file, all changes will be lost! #----------------------------------------------------------------------------- +# -*- coding: iso-8859-1 -*- + # Include wxWindows' modules from wxPython.wx import * +from wxPython.grid import * # Window functions @@ -30,7 +33,7 @@ DELETE_MM_MV = wxNewId() ID_MM_MV_CLOSE = wxNewId() -def PMM_PMV_Func( parent, call_fit = true, set_sizer = true ): +def PMM_PMV_Func( parent, call_fit = True, set_sizer = True ): item0 = wxBoxSizer( wxVERTICAL ) item1 = wxBoxSizer( wxVERTICAL ) @@ -39,27 +42,29 @@ item3 = wxBoxSizer( wxHORIZONTAL ) - item4 = wxBoxSizer( wxVERTICAL ) + item4 = wxBoxSizer( wxHORIZONTAL ) item5 = wxStaticText( parent, ID_TEXT, "Part Number:", wxDefaultPosition, wxDefaultSize, 0 ) item4.AddWindow( item5, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item6 = wxTextCtrl( parent, ID_PART_NUMBER, "", wxDefaultPosition, wxSize(180,-1), 0 ) - item4.AddWindow( item6, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) + item6 = wxStaticText( parent, ID_PART_NUMBER, " ", wxDefaultPosition, wxDefaultSize, 0 ) + item6.SetForegroundColour( wxBLUE ) + item4.AddWindow( item6, 0, wxALIGN_CENTER|wxALL, 5 ) - item3.AddSizer( item4, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 ) + item3.AddSizer( item4, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ) - item7 = wxBoxSizer( wxVERTICAL ) + item7 = wxBoxSizer( wxHORIZONTAL ) item8 = wxStaticText( parent, ID_TEXT, "Version:", wxDefaultPosition, wxDefaultSize, 0 ) item7.AddWindow( item8, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item9 = wxTextCtrl( parent, ID_VERSION, "", wxDefaultPosition, wxSize(160,-1), 0 ) - item7.AddWindow( item9, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) + item9 = wxStaticText( parent, ID_VERSION, " ", wxDefaultPosition, wxDefaultSize, 0 ) + item9.SetForegroundColour( wxBLUE ) + item7.AddWindow( item9, 0, wxALIGN_CENTER|wxALL, 5 ) - item3.AddSizer( item7, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 ) + item3.AddSizer( item7, 0, wxALIGN_CENTER_VERTICAL|wxLEFT, 5 ) - item2.AddSizer( item3, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxBOTTOM, 5 ) + item2.AddSizer( item3, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ) item10 = wxBoxSizer( wxHORIZONTAL ) @@ -173,40 +178,40 @@ item42 = wxButton( parent, ID_NEW_MM_MV, "New", wxDefaultPosition, wxDefaultSize, 0 ) item42.SetToolTip( wxToolTip("Create a new component in the currently selected project") ) - item41.AddWindow( item42, 0, wxALIGN_CENTRE|wxLEFT, 5 ) + item41.AddWindow( item42, 0, wxALIGN_CENTER|wxLEFT, 5 ) item43 = wxButton( parent, ID_EDIT_MM_MV, "Edit", wxDefaultPosition, wxDefaultSize, 0 ) item43.SetToolTip( wxToolTip("Edit the selected component") ) - item41.AddWindow( item43, 0, wxALIGN_CENTRE, 5 ) + item41.AddWindow( item43, 0, wxALIGN_CENTER, 5 ) item44 = wxButton( parent, ID_SAVE_MM_MV, "Save", wxDefaultPosition, wxDefaultSize, 0 ) item44.SetToolTip( wxToolTip("Save the component to local storage") ) - item41.AddWindow( item44, 0, wxALIGN_CENTRE, 5 ) + item41.AddWindow( item44, 0, wxALIGN_CENTER, 5 ) item45 = wxButton( parent, ID_RESET_MM_MV_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 ) item45.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") ) - item41.AddWindow( item45, 0, wxALIGN_CENTRE|wxRIGHT, 5 ) + item41.AddWindow( item45, 0, wxALIGN_CENTER|wxRIGHT, 5 ) item46 = wxButton( parent, DELETE_MM_MV, "Delete", wxDefaultPosition, wxDefaultSize, 0 ) item46.SetToolTip( wxToolTip("Delete the association between the parent and child components") ) - item41.AddWindow( item46, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 ) + item41.AddWindow( item46, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ) - item40.AddSizer( item41, 0, wxALIGN_CENTRE|wxALL, 5 ) + item40.AddSizer( item41, 0, wxALIGN_CENTER|wxALL, 5 ) item47 = wxBoxSizer( wxHORIZONTAL ) item48 = wxButton( parent, ID_MM_MV_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 ) item48.SetToolTip( wxToolTip("Close the window") ) - item47.AddWindow( item48, 0, wxALIGN_CENTRE|wxRIGHT, 5 ) + item47.AddWindow( item48, 0, wxALIGN_CENTER|wxRIGHT, 5 ) - item40.AddSizer( item47, 0, wxALIGN_CENTRE|wxALL, 5 ) + item40.AddSizer( item47, 0, wxALIGN_CENTER|wxALL, 5 ) - item0.AddSizer( item40, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) + item0.AddSizer( item40, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) - if set_sizer == true: - parent.SetAutoLayout( true ) + if set_sizer == True: + parent.SetAutoLayout( True ) parent.SetSizer( item0 ) - if call_fit == true: + if call_fit == True: item0.Fit( parent ) item0.SetSizeHints( parent ) @@ -231,7 +236,7 @@ DELETE_M_V = wxNewId() ID_M_V_CLOSE = wxNewId() -def PM_PV_Func( parent, call_fit = true, set_sizer = true ): +def PM_PV_Func( parent, call_fit = True, set_sizer = True ): item0 = wxBoxSizer( wxVERTICAL ) item1 = wxBoxSizer( wxHORIZONTAL ) @@ -350,40 +355,40 @@ item35 = wxButton( parent, ID_NEW_M_V, "New", wxDefaultPosition, wxDefaultSize, 0 ) item35.SetToolTip( wxToolTip("Create a new component in the currently selected project") ) - item34.AddWindow( item35, 0, wxALIGN_CENTRE|wxLEFT, 5 ) + item34.AddWindow( item35, 0, wxALIGN_CENTER|wxLEFT, 5 ) item36 = wxButton( parent, ID_EDIT_M_V, "Edit", wxDefaultPosition, wxDefaultSize, 0 ) item36.SetToolTip( wxToolTip("Edit the selected component") ) - item34.AddWindow( item36, 0, wxALIGN_CENTRE, 5 ) + item34.AddWindow( item36, 0, wxALIGN_CENTER, 5 ) item37 = wxButton( parent, ID_SAVE_M_V, "Save", wxDefaultPosition, wxDefaultSize, 0 ) item37.SetToolTip( wxToolTip("Save the component to local storage") ) - item34.AddWindow( item37, 0, wxALIGN_CENTRE, 5 ) + item34.AddWindow( item37, 0, wxALIGN_CENTER, 5 ) item38 = wxButton( parent, ID_RESET_M_V_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 ) item38.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") ) - item34.AddWindow( item38, 0, wxALIGN_CENTRE|wxRIGHT, 5 ) + item34.AddWindow( item38, 0, wxALIGN_CENTER|wxRIGHT, 5 ) item39 = wxButton( parent, DELETE_M_V, "Delete", wxDefaultPosition, wxDefaultSize, 0 ) item39.SetToolTip( wxToolTip("Delete the association between the parent and child components") ) - item34.AddWindow( item39, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT, 5 ) + item34.AddWindow( item39, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ) - item33.AddSizer( item34, 0, wxALIGN_CENTRE|wxALL, 5 ) + item33.AddSizer( item34, 0, wxALIGN_CENTER|wxALL, 5 ) item40 = wxBoxSizer( wxHORIZONTAL ) item41 = wxButton( parent, ID_M_V_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 ) item41.SetToolTip( wxToolTip("Close the window") ) - item40.AddWindow( item41, 0, wxALIGN_CENTRE|wxRIGHT, 5 ) + item40.AddWindow( item41, 0, wxALIGN_CENTER|wxRIGHT, 5 ) - item33.AddSizer( item40, 0, wxALIGN_CENTRE|wxALL, 5 ) + item33.AddSizer( item40, 0, wxALIGN_CENTER|wxALL, 5 ) - item0.AddSizer( item33, 0, wxALIGN_CENTRE|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) + item0.AddSizer( item33, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) - if set_sizer == true: - parent.SetAutoLayout( true ) + if set_sizer == True: + parent.SetAutoLayout( True ) parent.SetSizer( item0 ) - if call_fit == true: + if call_fit == True: item0.Fit( parent ) item0.SetSizeHints( parent ) Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.29 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.30 --- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.29 Thu Oct 9 13:05:17 2003 +++ PanGalactic/pangalactic/client/modules/psm/productdataform.py Tue Oct 21 17:25:18 2003 @@ -19,7 +19,7 @@ class PM_PV_Form(wxPanel, Security_Mixin): def __init__(self, parent, id, state, pos = wxPyDefaultPosition, size = wxPyDefaultSize, - style = wxTAB_TRAVERSAL ): + style = wxTAB_TRAVERSAL): wxPanel.__init__(self, parent, id, pos, size, style) self.parent = parent self.State = state @@ -30,7 +30,7 @@ self.temp_pm = None self.temp_pv = None - PM_PV_Func( self, true ) + PM_PV_Func(self, true) # WDR: handler declarations for PM_PV_Form EVT_RADIOBUTTON(self, ID_TOGGLE_PV, self.Select_PV) @@ -39,58 +39,58 @@ # WDR: methods for PM_PV_Form def GetPvRevision(self): - return wxPyTypeCast( self.FindWindowById(ID_PV_REVISION), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION), "wxTextCtrl") def GetButtonMVClose(self): - return wxPyTypeCast( self.FindWindowById(ID_BUTTON_M_V_CLOSE), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_BUTTON_M_V_CLOSE), "wxButton") def GetDeleteMVForm(self): - return wxPyTypeCast( self.FindWindowById(DELETE_M_V), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(DELETE_M_V), "wxButton") def GetResetMVForm(self): - return wxPyTypeCast( self.FindWindowById(ID_RESET_M_V_FORM), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_RESET_M_V_FORM), "wxButton") def GetSaveMV(self): - return wxPyTypeCast( self.FindWindowById(ID_SAVE_M_V), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_SAVE_M_V), "wxButton") def GetEditMV(self): - return wxPyTypeCast( self.FindWindowById(ID_EDIT_M_V), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_EDIT_M_V), "wxButton") def GetNewMV(self): - return wxPyTypeCast( self.FindWindowById(ID_NEW_M_V), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_NEW_M_V), "wxButton") def GetPvDesc(self): - return wxPyTypeCast( self.FindWindowById(ID_PV_DESC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PV_DESC), "wxTextCtrl") def GetPvNomenclature(self): - return wxPyTypeCast( self.FindWindowById(ID_PV_NOMENCLATURE), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PV_NOMENCLATURE), "wxTextCtrl") def GetPvPoc(self): - return wxPyTypeCast( self.FindWindowById(ID_PV_POC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PV_POC), "wxTextCtrl") def GetPvName(self): - return wxPyTypeCast( self.FindWindowById(ID_PV_NAME), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PV_NAME), "wxTextCtrl") def GetPmDesc(self): - return wxPyTypeCast( self.FindWindowById(ID_PM_DESC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PM_DESC), "wxTextCtrl") def GetPmNomenclature(self): - return wxPyTypeCast( self.FindWindowById(ID_PM_NOMENCLATURE), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PM_NOMENCLATURE), "wxTextCtrl") def GetPmPoc(self): - return wxPyTypeCast( self.FindWindowById(ID_PM_POC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PM_POC), "wxTextCtrl") def GetPmName(self): - return wxPyTypeCast( self.FindWindowById(ID_PM_NAME), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PM_NAME), "wxTextCtrl") def GetPmIdentifier(self): - return wxPyTypeCast( self.FindWindowById(ID_PM_IDENTIFIER), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PM_IDENTIFIER), "wxTextCtrl") def GetTogglePv(self): - return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PV), "wxRadioButton" ) + return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PV), "wxRadioButton") def GetTogglePm(self): - return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton" ) + return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton") def ClearCreateEditFlags(self): self.CreatingProductMaster = 0 @@ -375,7 +375,7 @@ class PMM_PMV_Form(wxPanel, Security_Mixin): def __init__(self, parent, id,state, pos = wxPyDefaultPosition, size = wxPyDefaultSize, - style = wxTAB_TRAVERSAL ): + style = wxTAB_TRAVERSAL): wxPanel.__init__(self, parent, id, pos, size, style) self.parent = parent self.State = state @@ -386,7 +386,7 @@ self.temp_pmm = None self.temp_pmv = None - PMM_PMV_Func( self, true ) + PMM_PMV_Func(self, true) # WDR: handler declarations for PMM_PMV_Form EVT_RADIOBUTTON(self, ID_TOGGLE_PMV, self.Select_PMV) @@ -395,64 +395,64 @@ # WDR: methods for PMM_PMV_Form def GetMmMvClose(self): - return wxPyTypeCast( self.FindWindowById(ID_MM_MV_CLOSE), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_MM_MV_CLOSE), "wxButton") def GetDeleteMmMvForm(self): - return wxPyTypeCast( self.FindWindowById(DELETE_MM_MV), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(DELETE_MM_MV), "wxButton") def GetResetMmMvForm(self): - return wxPyTypeCast( self.FindWindowById(ID_RESET_MM_MV_FORM), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_RESET_MM_MV_FORM), "wxButton") def GetSaveMmMv(self): - return wxPyTypeCast( self.FindWindowById(ID_SAVE_MM_MV), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_SAVE_MM_MV), "wxButton") def GetEditMmMv(self): - return wxPyTypeCast( self.FindWindowById(ID_EDIT_MM_MV), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_EDIT_MM_MV), "wxButton") def GetNewMmMv(self): - return wxPyTypeCast( self.FindWindowById(ID_NEW_MM_MV), "wxButton" ) + return wxPyTypeCast(self.FindWindowById(ID_NEW_MM_MV), "wxButton") def GetPmvDesc(self): - return wxPyTypeCast( self.FindWindowById(ID_PMV_DESC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMV_DESC), "wxTextCtrl") def GetPmvNomenclature(self): - return wxPyTypeCast( self.FindWindowById(ID_PMV_NOMENCLATURE), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMV_NOMENCLATURE), "wxTextCtrl") def GetPmvPoc(self): - return wxPyTypeCast( self.FindWindowById(ID_PMV_POC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMV_POC), "wxTextCtrl") def GetPmvName(self): - return wxPyTypeCast( self.FindWindowById(ID_PMV_NAME), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMV_NAME), "wxTextCtrl") def GetPmvRevision(self): - return wxPyTypeCast( self.FindWindowById(ID_PMV_REVISION), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION), "wxTextCtrl") def GetTogglePmv(self): - return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PMV), "wxRadioButton" ) + return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PMV), "wxRadioButton") def GetTogglePmm(self): - return wxPyTypeCast( self.FindWindowById(ID_TOGGLE_PMM), "wxRadioButton" ) + return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PMM), "wxRadioButton") def GetPmmDesc(self): - return wxPyTypeCast( self.FindWindowById(ID_PMM_DESC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMM_DESC), "wxTextCtrl") def GetPmmNomenclature(self): - return wxPyTypeCast( self.FindWindowById(ID_PMM_NOMENCLATURE), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMM_NOMENCLATURE), "wxTextCtrl") def GetPmmPoc(self): - return wxPyTypeCast( self.FindWindowById(ID_PMM_POC), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMM_POC), "wxTextCtrl") def GetPmmName(self): - return wxPyTypeCast( self.FindWindowById(ID_PMM_NAME), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMM_NAME), "wxTextCtrl") def GetPmmIdentifier(self): - return wxPyTypeCast( self.FindWindowById(ID_PMM_IDENTIFIER), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PMM_IDENTIFIER), "wxTextCtrl") def GetVersion(self): - return wxPyTypeCast( self.FindWindowById(ID_VERSION), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_VERSION), "wxStaticText") def GetPartNumber(self): - return wxPyTypeCast( self.FindWindowById(ID_PART_NUMBER), "wxTextCtrl" ) + return wxPyTypeCast(self.FindWindowById(ID_PART_NUMBER), "wxStaticText") def ClearCreateEditFlags(self): self.CreatingProductModelMaster = 0 @@ -466,8 +466,8 @@ self.GetPmmName().SetEditable(state) self.GetPmmNomenclature() .SetEditable(state) self.GetPmmPoc().SetEditable(state) - self.GetPartNumber().SetEditable(false) - self.GetVersion().SetEditable(false) + #self.GetPartNumber().SetEditable(false) + #self.GetVersion().SetEditable(false) def EnablePMV(self, state): @@ -476,8 +476,8 @@ self.GetPmvName().SetEditable(state) self.GetPmvNomenclature() .SetEditable(state) self.GetPmvPoc().SetEditable(state) - self.GetPartNumber().SetEditable(false) - self.GetVersion().SetEditable(false) + #self.GetPartNumber().SetEditable(false) + #self.GetVersion().SetEditable(false) def BrowseMode(self, gotroot): @@ -597,14 +597,14 @@ #print "end creatingmode" - def SetMasterAndVersionData(self, of_master, of_version): + def SetMasterAndVersionData(self, master_id, version_id): #print "productdataform.setmasterandversiondata" - if of_master: - #print "of_master", of_master - self.GetPartNumber().SetValue(of_master.id) - if of_version: - #print "of_version", of_version - self.GetVersion().SetValue(of_version.id) + if master_id: + #print "master", master_id + self.GetPartNumber().SetLabel(master_id) + if version_id: + #print "version", version_id + self.GetVersion().SetLabel(version_id) def FillFormWithPMMData(self, PMM): Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.117 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.118 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.117 Wed Oct 8 11:30:46 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Tue Oct 21 17:25:18 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.117 $"[11:-2] +__version__ = "$Revision: 1.118 $"[11:-2] import os import sys @@ -76,7 +76,6 @@ ID_PSM_SEARCH_ITEMS = wxNewId() ID_EDITFRAME_ITEM = wxNewId() ID_EDITFRAME_PARTS = wxNewId() -#ID_TREE_RIGHTPOPUP_TOPLEVEL = wxNewId() ID_TREE_RIGHTPOPUP_EDIT = wxNewId() ID_TREE_RIGHTPOPUP_SHOWPROJECT = wxNewId() ID_TREE_RIGHTPOPUP_DUMPTOPDF = wxNewId() @@ -245,23 +244,21 @@ EVT_MENU(self.Parent, ID_PSM_SEARCH_ITEMS, self.OnSearchItems) EVT_MENU(self.Parent, ID_EDITFRAME_ITEM, self.OnEditItem) EVT_MENU(self.Parent, ID_EDITFRAME_PARTS, self.OnEditParts) -# EVT_MENU(self, ID_TREE_RIGHTPOPUP_TOPLEVEL, self.RedrawTreeAndGrid) EVT_MENU(self, ID_TREE_RIGHTPOPUP_EDIT, self.OnEditComponent) EVT_MENU(self, ID_TREE_RIGHTPOPUP_SHOWPROJECT, self.OnShowProjectFrame) EVT_MENU(self, ID_TREE_RIGHTPOPUP_DUMPTOPDF, self.tree.DumpToPdf) EVT_MENU(self, ID_TREE_RIGHTPOPUP_QUICKCREATE, self.QuickCreate) -# EVT_BUTTON(self, toolbarpanel.TOPLEVELITEMS_BUTTON, self.RedrawTreeAndGrid) EVT_CHOICE(self, toolbarpanel.ID_PROJECT, self.OnProjectClick) EVT_CHOICE(self, toolbarpanel.ID_ITEM, self.OnItemClick) - EVT_GRID_CELL_LEFT_DCLICK(self.itemgrid, self.onPMVGridDClick) - EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onPMGridDClick) - EVT_GRID_CELL_LEFT_DCLICK(self.model_master_grid, self.onMMGridDClick) - EVT_GRID_CELL_LEFT_DCLICK(self.product_version_grid, self.onPVGridDClick) - - EVT_GRID_CELL_LEFT_CLICK(self.product_master_grid, self.onGridGlickGetVersions) - EVT_GRID_CELL_LEFT_CLICK(self.model_master_grid, self.onGridGlickGetVersions) - EVT_GRID_CELL_LEFT_CLICK(self.product_version_grid, self.onGridGlickGetVersions) + EVT_GRID_CELL_LEFT_DCLICK(self.itemgrid, self.onProductGridDClick) + EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onProductGridDClick) + EVT_GRID_CELL_LEFT_DCLICK(self.model_master_grid, self.onProductGridDClick) + EVT_GRID_CELL_LEFT_DCLICK(self.product_version_grid, self.onProductGridDClick) + + EVT_GRID_CELL_LEFT_CLICK(self.product_master_grid, self.onGridClickGetVersions) + EVT_GRID_CELL_LEFT_CLICK(self.model_master_grid, self.onGridClickGetVersions) + EVT_GRID_CELL_LEFT_CLICK(self.product_version_grid, self.onGridClickGetVersions) EVT_MENU(self.itemgrid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate) EVT_MENU(self.product_master_grid, quickcreate.ID_POPUP_QUICKCREATE, self.QuickCreate) @@ -275,19 +272,19 @@ EVT_RIGHT_DOWN(self.tree, self.OnRightDown) EVT_TREE_ITEM_EXPANDING(self, self.tID, self.OnItemExpanding) - #EVT_TREE_ITEM_COLLAPSED(self, self.tID, self.OnItemCollapsed) EVT_TREE_SEL_CHANGED(self, self.tID, self.OnTreeActivate) -# EVT_LEFT_DCLICK(self.tree, self.OnLeftDClick) EVT_LEFT_DCLICK(self.tree, self.OnEditComponent) EVT_COMBOBOX(self, ID_CHOICE_VIEW, self.SelectView) EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged) - def onGridGlickGetVersions(self, event): + def onGridClickGetVersions(self, event): #print 'model master grid was clicked' ndx = event.GetRow() - obj = event.GetEventObject().GetDataObj(ndx) + grid = event.GetEventObject() + obj = grid.GetDataObj(ndx) + grid.SelectRow(ndx) objs = self.version_tree.LoadTreefromObjects(self.DataManager, obj) #print objs @@ -443,32 +440,6 @@ if not self.Allowed(actions.DELETEITEM): pass - -# def FillEditFrame(self, nodedata): -# print "psmtool.filleditframe", nodedata -# pane = 1 -# product_id = nodedata[1] -# print "product_id", product_id -# self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"]) -# self.itemeditform.SetMode(pane) - -## duplicate of OnEditComponent -vwk -## -## def OnLeftDClick(self, event): -## point = event.GetPosition() -## tree = event.GetEventObject() -## node, flags = tree.HitTest(point) -## if node.IsOk(): -## nodedata = tree.GetPyData(node) -## if node == tree.GetRootItem(): -## if nodedata[1] == "ROOT": -## return - -## wxSafeYield() -## wxBeginBusyCursor() -## self.FillEditFrame(nodedata) -## wxEndBusyCursor() - def RebuildMainTree(self): projectndx = self.topWindow.toppanel.GetProjectWidget().GetSelection() @@ -831,11 +802,6 @@ # self.DataManager.getLocalNauosByAssemblyID(treetuple[1], treetuple[0], self.State.currentproject) -# def UpdateMenuBar(self): -# pass -# #self.AddToolMenu() -## self.AddToolHelp() - def AddToolMenu(self): """Dynamically adds the tools menu to the client apps main menu. Also sets the initial state for some of the menu items.""" @@ -882,17 +848,6 @@ self.ToolMenu = None mb.Refresh() -## def ShowDBBrowser(self): -## tmpsize = wxSize(750, 500) -## dbframe = toolframe.toolFrame(self, -1, 'Local Database Browser', wxDefaultPosition, tmpsize) -## dbframe.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close') -## dbframe.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window") -## dbframe.mainpanel = dbbrowser.zodbbrowser(dbframe, -1, zodbroot = self.DataManager.localDB.dbroot) -## dbframe.mainpanel.FillChoice() -## dbframe.mainpanel.SelectDict("IDRDict") -## dbframe.mainpanel.OnRefresh() -## dbframe.CentreOnParent() -## dbframe.Show(true) def CloseDown(self): if self.DataManager.user._loggedin: @@ -1133,14 +1088,6 @@ self.tree.SetPyData(rootnode,['ROOT', 'ROOT']) numitems = self.FillGridFromProject(project) self.FillItemWidgetFromProject(project) -# self.itemgrid.table.RefreshGrid() -# self.product_master_grid.table.RefreshGrid() -# self.product_version_grid.table.RefreshGrid() -# self.model_master_grid.table.RefreshGrid() - - #wgt = self.topWindow.toppanel.GetItemWidget() - #wgt.Enable(true) - #wgt.SetSelection(0) if numitems > 0: wgt = self.Parent.menuBar.FindMenuItem('File', 'Export') @@ -1149,10 +1096,6 @@ self.UpdateWindows() self.SecureMenu() wxEndBusyCursor() -# self.itemgrid.AutoSizeColumns(true) -# self.product_master_grid.AutoSizeColumns(true) -# self.product_version_grid.AutoSizeColumns(true) -# self.model_master_grid.AutoSizeColumns(true) #print "end psmtool.onprojectclick" def UpdateWindows(self): @@ -1206,10 +1149,6 @@ wgt.AddData(newitem, wxLIGHT_GREY) self.SelectGridRowByItemId(newitem.pgef_oid) wgt.AutoSizeColumns(true) -# self.itemgrid.AutoSizeColumns(true) -# self.product_master_grid.AutoSizeColumns(true) -# self.product_version_grid.AutoSizeColumns(true) -# self.model_master_grid.AutoSizeColumns(true) def RedrawTreeAndGrid(self, event = None): @@ -1248,11 +1187,6 @@ pmm_list.sort() pv_list.sort() -# print "pm", pm_list -# print "pv", pv_list -# print "pmm", pmm_list -# print "pmv", pmv_list - self.FillGridWithProducts(self.itemgrid, pmv_list) self.FillGridWithProducts(self.model_master_grid, pmm_list) self.FillGridWithProducts(self.product_master_grid, pm_list) @@ -1501,32 +1435,33 @@ if selectedrow: # print "selectedrow", selectedrow[0] product_id = currentgrid.GetObjectOid(selectedrow[0]) - self.processGridDClick(product_id, gridname, selectedrow) + self.editGridObject(product_id, gridname) - def onPMVGridDClick(self, event): - product_id = event.GetEventObject().GetObjectOid(event.GetRow()) - self.processGridDClick(product_id, 'ProductModelVersion', event.GetRow()) - - def onPMGridDClick(self, event): - product_id = event.GetEventObject().GetObjectOid(event.GetRow()) - self.processGridDClick(product_id, 'ProductMaster', event.GetRow()) - - def onMMGridDClick(self, event): - product_id = event.GetEventObject().GetObjectOid(event.GetRow()) - self.processGridDClick(product_id, 'ProductModelMaster', event.GetRow()) - - def onPVGridDClick (self, event): - product_id = event.GetEventObject().GetObjectOid(event.GetRow()) - self.processGridDClick(product_id, 'ProductVersion', event.GetRow()) + def onProductGridDClick (self, event): + row = event.GetRow() + grid = event.GetEventObject() + grid.SelectRow(row) + if grid == self.itemgrid: + classname = "ProductModelVersion" + elif grid == self.product_master_grid: + classname = "ProductMaster" + elif grid == self.product_version_grid: + classname = "ProductVersion" + elif grid == self.model_master_grid: + classname = "ProductModelMaster" + else: + event.skip() + return + + product_id = grid.GetObjectOid(row) + product = grid.getObject(row) + print "call editgridobject", product.name + self.editGridObject(product_id, classname) - def processGridDClick(self, product_id, product_type, row_ndx): - #print "psmtool.processgriddclick", product_id, product_type - #if event.GetId() == ID_ITEM_SEARCH_GRID: - #return false - #print '_data is: ', event.GetEventObject().table._data - #print 'oid in data is: ', event.GetEventObject().table._data[0].pgef_oid + def editGridObject(self, product_id, product_type): + print "psmtool.editgridobject", product_id, product_type dlg = None if self.DataManager.user._loggedin: @@ -1539,8 +1474,7 @@ dlg.CentreOnParent() dlg.Show(true) wxSafeYield() - #itemid = event.GetEventObject().GetObjectOid(event.GetRow()) - #print 'oid from grid is: ',itemid + if product_type in ["ProductModelVersion", "ProductModelMaster"]: pane = 1 elif product_type in ["ProductMaster", "ProductVersion"]: @@ -1550,14 +1484,10 @@ self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type]) self.itemeditform.SetMode(pane) -# self.itemgrid.SelectRow(row_ndx) -# self.topWindow.toppanel.GetItemWidget().SetSelection(row_ndx + 1) wxEndBusyCursor() dlg.Destroy() elif self.inLocalMode(): - #itemid = event.GetEventObject().GetObjectOid(event.GetRow()) - #print 'itemid is: %s' % itemid if product_type in ["ProductModelVersion", "ProductModelMaster"]: pane = 1 elif product_type in ["ProductMaster", "ProductVersion"]: @@ -1566,7 +1496,6 @@ print "pane??? what pane???" self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type]) self.itemeditform.SetMode(pane) -# self.itemgrid.SelectRow(row_ndx) else: dlg = wxMessageDialog(self, "I'm sorry Steve, I can't do that...", "Unable to comply", @@ -1584,21 +1513,20 @@ if results[0]: #print " quick pm" self.UpdateWgts(results[0]) -# self.product_master_grid.AddData(results[0], wxLIGHT_GREY) + if results[1]: #print " quick pv" self.UpdateWgts(results[1]) -# self.product_version_grid.AddData(results[1], wxLIGHT_GREY) + if results[2]: #print " quick pmm" self.UpdateWgts(results[2]) -# self.model_master_grid.AddData(results[2], wxLIGHT_GREY) + if results[3]: #print " quick pmv" self.UpdateWgts(results[3]) -# self.itemgrid.AddData(results[3], wxLIGHT_GREY) - + #____________________________________________________________________________________ if __name__ == '__main__': Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.106 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.107 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.106 Wed Oct 15 12:51:12 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Tue Oct 21 17:25:18 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.106 $"[11:-2] +__version__ = "$Revision: 1.107 $"[11:-2] # Python imports import copy @@ -237,7 +237,7 @@ self.SetupPane(which_pane, nodedata) def setCurrentProduct(self, nodedata): - #print "itemeditframe.setcurrentproduct" + print "itemeditframe.setcurrentproduct" #print "nodedata: " + str(nodedata) #print 'tempproduct type:', self.tempproduct.__class__.__name__ self.rootitemid = nodedata[1] @@ -258,23 +258,27 @@ self.tempproduct.build(self.currentproduct.__dict__) except IndexError: pass + + print "end setcurrentproduct" def SetupPane(self, which_pane, nodedata): - #print "itemeditframe.SetupPane" + print "itemeditframe.SetupPane" #print " pane: " + str(which_pane) #print " nodedata: " + str(nodedata) #print " rootitemid: " + str(self.rootitemid) #print " rootnauoid: " + str(self.rootnauoid) self.setCurrentProduct(nodedata) + print "set pane selection" self.editnb.SetSelection(which_pane) + print "pane selected" if which_pane == self.PMM_PMVPage or which_pane == self.PM_PVPage or which_pane == self.PropertiesPage: - # print " setting up for item" + print " setting up for item" #print ' rootitemid, rootnauoid are [%s, %s]' % (self.rootitemid, self.rootnauoid) - self.BuildItemTree(self.rootitemid, self.rootnauoid) - #print " built tree" + self.BuildItemTree(self.rootitemid, self.rootnauoid) # done in pagechanged + print " built tree" root = self.itemtree.GetRootItem() # print " have root item", root @@ -282,46 +286,54 @@ rootdata = self.itemtree.GetPyData(root) #print " rootdata:" + str(rootdata) nodeid = rootdata[1] - #print " about to call getitem" + print " about to call getitem" treedata = self.DataManager.localDB.GetItem(nodeid) #print " treedata", treedata if treedata: - #print " have treedata", treedata.id + print " have treedata", treedata.id self.currentproduct.build(treedata.__dict__) self.tempproduct.build(self.currentproduct.__dict__) classname = self.tempproduct.__class__.__name__ - #print " classname", classname + print " classname", classname + print " tempproduct", self.tempproduct.name if classname == 'ProductModelVersion': + print " master", self.tempproduct.of_pm_id self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master) self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version) self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct._of_model_master) - self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct._of_master, - self.tempproduct._of_version) + self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.of_pm_id, + self.tempproduct.of_pv_id) self.pmm_pmv_form.FillFormWithPMVData(self.tempproduct) self.pmm_pmv_form.GetTogglePmv().SetValue(1) elif classname == 'ProductModelMaster': + print " model", self.tempproduct.of_pm_id self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master) self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version) self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct) - self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct._of_master, - self.tempproduct._of_version) + self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.of_pm_id, + self.tempproduct.of_pv_id) self.pmm_pmv_form.clearPMV() self.pmm_pmv_form.GetTogglePmm().SetValue(1) elif classname == 'ProductVersion': + print " version", self.tempproduct.of_pm_id self.pmm_pmv_form.clearPMM() self.pmm_pmv_form.clearPMV() self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master) self.pm_pv_form.FillFormWithPVData(self.tempproduct) + self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.of_pm_id, + self.tempproduct.id) self.pm_pv_form.GetTogglePv().SetValue(1) elif classname == 'ProductMaster': + print " tempproduct master", self.tempproduct.id #print "setup for productmaster" self.pmm_pmv_form.clearPMM() self.pmm_pmv_form.clearPMV() self.pm_pv_form.FillFormWithPMData(self.tempproduct) + self.pmm_pmv_form.SetMasterAndVersionData(self.tempproduct.id, "") self.pm_pv_form.clearPV() self.pm_pv_form.GetTogglePm().SetValue(1) else: @@ -342,7 +354,7 @@ elif which_pane == self.PartsListPage or which_pane == self.PartDataPage: #print "setting up for pl" - self.BuildDocTree(self.rootitemid, self.rootnauoid) + self.BuildDocTree(self.rootitemid, self.rootnauoid) # done in pagechanged root = self.doctree.GetRootItem() self.doctree.SelectItem(root) self.partslistform.BrowseMode(True) @@ -357,7 +369,7 @@ elif which_pane == self.OtherDocPage: #print "setting up for doc" - self.BuildOtherDocTree(self.rootitemid, self.rootnauoid) + self.BuildOtherDocTree(self.rootitemid, self.rootnauoid) # done in pagechanged root = self.otherdoctree.GetRootItem() self.otherdoctree.SelectItem(root) self.otherdocform.BrowseMode(True) @@ -405,7 +417,9 @@ self.currentpage = self.editnb.GetSelection() #if self.currentpage == self.ItemPage or self.currentpage == self.PropertiesPage: - if self.currentpage == self.PMM_PMVPage or self.currentpage == self.PM_PVPage or self.currentpage == self.PropertiesPage: + if self.currentpage == self.PMM_PMVPage or \ + self.currentpage == self.PM_PVPage or \ + self.currentpage == self.PropertiesPage: if self.itemtree: root = self.itemtree.GetRootItem() if root.IsOk(): @@ -505,7 +519,7 @@ def PageChanged(self, event = None): - #print "itemeditframe.pagechanged" + print "itemeditframe.pagechanged" self.currentpage = self.editnb.GetSelection() #print 'page changed.currentpage:', self.currentpage @@ -613,13 +627,6 @@ def EditingMode(self, whichpane): #print 'itemeditframe.editmode' self.editingtab = self.currentpage - #self.pm_pv_form.EditingMode() - #self.pmm_pmv_form.EditingMode() - #self.partslistform.EditingMode() - #self.otherdocform.EditingMode() - #self.DataManager.creatingItem = True - #self.DataManager.creatingPartsList = True - #self.DataManager.creatingDocument = True if whichpane == self.PMM_PMVPage: self.pm_pv_form.BrowseMode(True) self.pmm_pmv_form.EditingMode() @@ -656,7 +663,6 @@ self.DataManager.creatingPartsList = False self.DataManager.creatingItem = False - def CreatingMode(self, whichpane): """Handles the setting of the correct mode based @@ -676,6 +682,7 @@ self.DataManager.creatingItem = True self.DataManager.creatingPartsList = False self.DataManager.creatingDocument = False + elif whichpane == self.PM_PVPage: self.pmm_pmv_form.BrowseMode(True) self.partslistform.BrowseMode(True) @@ -684,6 +691,7 @@ self.DataManager.creatingItem = True self.DataManager.creatingPartsList = False self.DataManager.creatingDocument = False + elif whichpane == self.PartsListPage: self.pm_pv_form.BrowseMode(True) self.pmm_pmv_form.BrowseMode(True) @@ -692,6 +700,7 @@ self.DataManager.creatingItem = False self.DataManager.creatingPartsList = True self.DataManager.creatingDocument = False + elif whichpane == self.OtherDocPage: self.partslistform.BrowseMode(True) self.pm_pv_form.BrowseMode(True) @@ -975,13 +984,8 @@ if node == self.itemtree.GetRootItem(): #print "have root" self.BrowseMode(True) -# if self.currentpage == self.PMM_PMVPage: -# self.pmm_pmv_form.BrowseMode(True) -# elif self.currentpage == self.PM_PVPage: -# self.pm_pv_form.BrowseMode(True) obj = self.itemtree.GetPyData(node) - if obj[0] == 'New': self.itemtree.DeleteAllItems() self.pmm_pmv_form.clearForm() @@ -1027,11 +1031,6 @@ self.pmm_pmv_form.ResetForm(temp_obj._of_model_master, temp_obj._of_version) elif classname == "ProductModelMaster": self.pmm_pmv_form.ResetForm(temp_obj, temp_obj._of_version) - -# if self.currentpage == self.PMM_PMVPage: -# self.pmm_pmv_form.ResetForm(temp_obj._of_master, temp_obj) -# elif self.currentpage == self.PM_PVPage: -# self.pm_pv_form.ResetForm(temp_obj._of_model, temp_obj._of_version) else: #print "clearform" if self.currentpage == self.PMM_PMVPage: @@ -1379,7 +1378,6 @@ link.InitObject(self.State.currentproject, self.DataManager.user.id) self.DataManager.localDB.Add([link]) - allprojlist = self.DataManager.localDB.GetProjectObjects() if allprojlist.has_key(self.State.currentproject): projlist = self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] @@ -1499,7 +1497,8 @@ else: self.ImportPartsListFrame.sb.ClearServer() - self.PLMtool = PLMTool(self.ImportPartsListFrame, self, self.State, self.DataManager, -1, wxDefaultPosition, defsize) + self.PLMtool = PLMTool(self.ImportPartsListFrame, self, self.State, self.DataManager, + -1, wxDefaultPosition, defsize) # self.PLMtool.SetImportFileName(self.partslistform.GetImportDataPath()) self.PLMtool.SetColumnInfo(self.currentpartslist._ColumnInfo, self.partslistview.partslistgrid.GetNumberCols()) self.ImportPartsListFrame.CentreOnParent() @@ -1605,8 +1604,8 @@ self.rootitemid = None self.rootnauoid = None -# if self.ImportPartsListFrame: not used??? vwk -# self.OnCloseImportPartsListFrame() + if self.ImportPartsListFrame: + self.OnCloseImportPartsListFrame() self.Show(False) @@ -1626,7 +1625,7 @@ def BuildItemTree(self, itemid, nauoid, currentdata = None, product_type = None): - #print "itemeditframe.builditemtree" + print "itemeditframe.builditemtree" #print "itemid: " + str(itemid) if itemid == None and nauoid == None: @@ -1679,12 +1678,11 @@ self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1]) #print "root", self.rootobject.pgef_oid, self.rootobject.id, self.rootobject.name treedlg.Destroy() - #print "end builditemtree" + print "end builditemtree" def BuildDocTree(self, itemid, pdrid = None, currentdata = None): #print "builddoctree" - #print "itemid: " + str(itemid) if itemid == None and pdrid == None: #print "new node" @@ -1716,7 +1714,6 @@ self.partslistform.ClearForm() - if self.currenttree <> "DOC": #print "not a doc tree; making one" self.doctree = pgefdoctree.PgefDocTree(self.vsplitter, self.tID, self.DataManager) @@ -1725,24 +1722,19 @@ self.currenttree = "DOC" self.doctree.DeleteAllItems() # remove when lines below are working - self.doctree.LoadTreefromPartsLists(self.DataManager, itemid, pdrid, currentdata) treeitemdata = self.doctree.GetPyData(self.doctree.GetRootItem()) - - self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1]) + if treeitemdata: + self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1]) treedlg.Destroy() - - def BuildOtherDocTree(self, itemid, pdrid = None, currentdata = None): - #print "\nbuildotherdoctree" #print "itemid: " + str(itemid) if itemid == None and pdrid == None: - if self.currenttree <> "OTHERDOC": self.otherdoctree = pgefdoctree.PgefDocTree(self.vsplitter, self.tID, self.DataManager) self.otherdoctree.SetToolTip(wxToolTip("A hierarchical display of the currently selected document.")) @@ -1780,7 +1772,8 @@ self.otherdoctree.LoadTreefromOtherDocuments(self.DataManager, itemid, pdrid, currentdata) treeitemdata = self.otherdoctree.GetPyData(self.otherdoctree.GetRootItem()) - self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1]) + if treeitemdata: + self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1]) treedlg.Destroy() @@ -1881,12 +1874,8 @@ if treeitem == self.itemtree.GetRootItem(): # it's the root node self.BrowseMode(True) -# self.pm_pv_form.BrowseMode(True) -# self.pmm_pmv_form.BrowseMode(True) else: self.BrowseMode(False) -# self.pm_pv_form.BrowseMode(False) -# self.pmm_pmv_form.BrowseMode(False) elif self.currentpage == self.PartDataPage: treeitem = event.GetItem() @@ -2036,9 +2025,8 @@ self.pmm_pmv_form.clearForm() self.partslistform.ClearForm() self.otherdocform.ClearForm() - - return retval + def DiscardChanges(self): if self.DataManager.creatingPartsList: @@ -2071,9 +2059,7 @@ doc._UploadFileName = self.currentdocument._UploadFileName try: - doc.Validate() - except RequiredDataError, e: dlg = wxMessageDialog(self, e.__dict__['args'], "Required Document Data Missing!!!", wxOK | wxICON_ERROR) dlg.ShowModal() @@ -2090,7 +2076,6 @@ return False def SavePLChanges(self): - #print "savePLChanges" if self.DataManager.creatingPartsList: #print "creating" @@ -2112,9 +2097,7 @@ pl._UploadFileName = self.currentpartslist._UploadFileName try: - pl.Validate() - if wxPlatform == '__WXMSW__': if not self.PLM_Converted: raise RequiredDataError, "You have not provided a spreadsheet" @@ -2185,13 +2168,11 @@ def SaveChanges(self, event = None): - # print "savechanges" itemretval = self.SaveItemChanges() plretval = self.SavePLChanges() docretval = self.SaveDocChanges() - if itemretval or plretval or docretval: # print "saved something" Index: PanGalactic/pangalactic/enterprise/document.py diff -u PanGalactic/pangalactic/enterprise/document.py:1.12 PanGalactic/pangalactic/enterprise/document.py:1.13 --- PanGalactic/pangalactic/enterprise/document.py:1.12 Tue Oct 21 14:45:40 2003 +++ PanGalactic/pangalactic/enterprise/document.py Tue Oct 21 17:25:18 2003 @@ -1,18 +1,20 @@ -# $Id: document.py,v 1.12 2003/10/21 18:45:40 waterbug Exp $ +# $Id: document.py,v 1.13 2003/10/21 21:25:18 pbear Exp $ """ The Mother of all document types in PGEF. """ -__version__ = "$Revision: 1.12 $"[11:-2] +__version__ = "$Revision: 1.13 $"[11:-2] import string + from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docmaster import DocMaster from pangalactic.enterprise.docversion import DocVersion from pangalactic.enterprise.docrep import DocRep from pangalactic.enterprise.drfile import DrFile + def FillSampleDocument(document): document.creator = 'Test Harness' @@ -54,25 +56,75 @@ _refd = { '_master' : 'DocMaster' } - _required = ['master'] +# _required = ['master_oid'] # for the time being, don't require any fields + _required = [] _schema_ext = { - 'master' : 'str' + 'master_oid' : 'str' } _schema = _schema_ext.copy() _schema.update(PgefObject._schema) _searchabletext = True _std_abbrev = 'doc' + def __init__(self, email=None, schema=_schema, **kw): - PgefObject.__init__(self, email=email, - schema=schema, **kw) + PgefObject.__init__(self, email=email, schema=schema, **kw) for a in kw: if a in self._properties: setattr(self, a, kw[a]) + self._versions = {} + self._master = DocMaster() + v = DocVersion(_of_master = self._master) + self.setCurrentVersion(v) + + self._reps = {} + self._drfiles = {} + def deleteAttr(self): raise TypeError, 'Cannot delete attribute' + def addRep(self, rep, drfiles = None): + repdict = self._reps.get(rep.of_dv_id, {}) + repdict[rep.pgef_oid] = rep + self._reps[rep.of_dv_id] = repdict + if drfiles: + for drfile in drfiles: + self.addDrFile(drfile) + + def getRep(self, vid, repoid): + repdict = self._versions[vid] + return repdict.get(repoid, None) + + + def addDrFile(self, drfile): + drfiledict = self._drfiles.get(drfile._of_dr.pgef_oid, {}) + drfiledict[drfile.pgef_oid] = drfile + self._drfiles[drfile.of_dr.pgef_oid] = drfiledict + + + def getDrFile(self, repoid, drfileoid): + drfiledict = self._drfiles[repoid] + return drfiledict.get(drfileoid, None) + + + def getCurrentVersion(self): + max = -1 + for vid in self._versions: + intid = int(vid) + if intid > max: + max = intid + return self._versions[str(max)] + + + def setCurrentVersion(self, v): + self._versions[v.id] = v + + CurrentVersion = property(getCurrentVersion, + setCurrentVersion, + deleteAttr, + "CurrentVersion") + def getTitle(self): # What if a document's Title changes? It is actually the # 'name' attribute of the current DocVersion that @@ -84,10 +136,7 @@ def setTitle(self, value): self._current_version.__dict__['name'] = value - Title = property(getTitle, - setTitle, - deleteAttr, - 'Title') + Title = property(getTitle, setTitle, deleteAttr, 'Title') def getIdentifier(self): return self._current_version._of_master.id @@ -113,10 +162,7 @@ def setCreator(self, value): self._master.__dict__['creator'] = value - Creator = property(getCreator, - setCreator, - deleteAttr, - 'Creator') + Creator = property(getCreator, setCreator, deleteAttr, 'Creator') def getRevision(self): return self._current_version.id @@ -150,10 +196,7 @@ # create_datetime (a DateTime object) via its API. raise TypeError, 'Date is a read-only, computed attribute.' - Date = property(getDate, - setDate, - deleteAttr, - 'Date') + Date = property(getDate, setDate, deleteAttr, 'Date') def getDocTypeCode(self): return self._master.doc_type_code @@ -167,10 +210,9 @@ 'DocTypeCode') def getDocType(self): - return (self._master.doc_type_code_context - + "_" + self._master.doc_type_code) + return self._master.getDocType() + def getPrettyDocType(self): - tmpcode = self.doc_type_code.replace("_", " ") - return self.doc_type_code_context.upper() + " " + string.capwords(tmpcode) + return self._master.getPrettyDocType() Index: PanGalactic/pangalactic/enterprise/docversion.py diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.12 PanGalactic/pangalactic/enterprise/docversion.py:1.13 --- PanGalactic/pangalactic/enterprise/docversion.py:1.12 Fri Oct 17 16:49:53 2003 +++ PanGalactic/pangalactic/enterprise/docversion.py Tue Oct 21 17:25:18 2003 @@ -1,10 +1,10 @@ -# $Id: docversion.py,v 1.12 2003/10/17 20:49:53 waterbug Exp $ +# $Id: docversion.py,v 1.13 2003/10/21 21:25:18 pbear Exp $ """ Version-specific attributes of a document. """ -__version__ = "$Revision: 1.12 $"[11:-2] +__version__ = "$Revision: 1.13 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docmaster import DocMaster as DM @@ -60,15 +60,18 @@ _schema.update(PgefObject._schema) _std_abbrev = 'dv' - def __init__(self, email=None, schema=_schema, - _of_master=None, **kw): + def __init__(self, _of_master, email=None, schema=_schema, **kw): # PgefObject.__init__() creates the pgef_oid ... PgefObject.__init__(self, email=email, schema=schema, **kw) - if _of_master.__class__.__name__ == 'DocMaster': - self._of_master = _of_master - self.of_dm_id = self._of_master.id - self.of_dm_id_context = self._of_master.id_context + try: + assert _of_master.__class__.__name__ == 'DocMaster' + except: + raise TypeError, "Expecting a DocMaster instance as argument 2" + + self._of_master = _of_master + self.of_dm_id = self._of_master.id + self.of_dm_id_context = self._of_master.id_context def __getattr__(self, name): return PgefObject.__getattr__(self, name) Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.48 PanGalactic/pangalactic/utils/datamanager.py:1.49 --- PanGalactic/pangalactic/utils/datamanager.py:1.48 Thu Oct 16 17:19:45 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Tue Oct 21 17:25:19 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.48 $"[11:-2] +__version__ = "$Revision: 1.49 $"[11:-2] import time import mx.DateTime @@ -289,23 +289,30 @@ if data: for item in data: tempobjlist.append(item) - tempids[item.pgef_oid] = {"type" : "ProductModelVersion"} - - if pms: -# print "pms", len(pms) - for item in pms: - tempobjlist.append(item) - tempids[item.pgef_oid] = {"type" : "ProductMaster"} - if pvs: -# print "pvs", len(pvs) - for item in pvs: - tempobjlist.append(item) - tempids[item.pgef_oid] = {"type" : "ProductVersion"} - if pmms: -# print "pmms", len(pmms) - for item in pmms: - tempobjlist.append(item) - tempids[item.pgef_oid] = {"type" : "ProductModelMaster"} + classname = item.__class__.__name__ + tempids[item.pgef_oid] = {"type" : classname} + if classname == "ProductModelVersion": + print "retrieving a", classname + print " ~", item.name + print " ~ master", item._of_master.id + print " ~ version", item._of_version.id + print " ~ model", item._of_model_master.id + +## if pms: +### print "pms", len(pms) +## for item in pms: +## tempobjlist.append(item) +## tempids[item.pgef_oid] = {"type" : "ProductMaster"} +## if pvs: +### print "pvs", len(pvs) +## for item in pvs: +## tempobjlist.append(item) +## tempids[item.pgef_oid] = {"type" : "ProductVersion"} +## if pmms: +### print "pmms", len(pmms) +## for item in pmms: +## tempobjlist.append(item) +## tempids[item.pgef_oid] = {"type" : "ProductModelMaster"} if len(tempobjlist) > 0: @@ -373,7 +380,7 @@ def getNAUOByAssemblyID(self, AssemblyIDList, NauoID = 'ROOT'): """Retrieves all of the NAUOs associated with an AssemblyID""" - #print "datamanager.getnauobyassemblyid" + print "datamanager.getnauobyassemblyid" retlist = [] objlist = [] @@ -402,11 +409,13 @@ itemobjs.append(obj) #print "appending", obj.__class__.__name__ #print obj + else: + print "ignoring", obj.__class__.__name__ if len(nauoobjs) > 0: updatedacuobjs = [] nauoids = [] - #print "saving nauoobjs", len(nauoobjs) + print "saving nauoobjs", len(nauoobjs) updatedacuobjs = self.localDB.Save(nauoobjs) #add the nauos to the projectobject dictionary in localdb @@ -427,6 +436,7 @@ self.nauoIDs[id] = {NauoID:nauoids} if len(itemobjs) > 0: + print "saving items", len(itemobjs) self.localDB.Save(itemobjs) break # only do the first one for now @@ -439,7 +449,11 @@ elif obj.__class__.__name__ == "ProductModelVersion": item = self.localDB.GetItem(obj.pgef_oid) retlist.append(item) + else: + print "not returning", obj.__class__.__name__ + #print "len retlist", len(retlist) + print "end datamanager.getnauobyassemblyid" return retlist Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.41 PanGalactic/pangalactic/utils/localdb.py:1.42 --- PanGalactic/pangalactic/utils/localdb.py:1.41 Thu Oct 16 17:19:45 2003 +++ PanGalactic/pangalactic/utils/localdb.py Tue Oct 21 17:25:19 2003 @@ -5,7 +5,6 @@ import base64 import string -#import pangalactic.enterprise.user import pangalactic.enterprise.document as document import pangalactic.enterprise.partslist as partslist @@ -195,6 +194,7 @@ @type objlist: a python list @param objlist: the list of model masters to be cached """ + #print "localdb.savepmm" for mod in objlist: self.dbroot[self.PRODUCTMODELMASTER][mod.pgef_oid] = mod self.dbroot[self.OIDLOOKUP][mod.pgef_oid] = self.PRODUCTMODELMASTER @@ -208,7 +208,7 @@ @type objlist: a python list @param objlist: the list of Product Masters to be cached """ - #print 'in SavePM' + #print 'localdb.SavePM' for mod in objlist: self.dbroot[self.PRODUCTMASTER][mod.pgef_oid] = mod self.dbroot[self.OIDLOOKUP][mod.pgef_oid] = self.PRODUCTMASTER @@ -221,7 +221,7 @@ @type objlist: a python list @param objlist: the list of Product Versions to be cached """ - #print 'in SavePV' + #print 'localdb.SavePV' for mod in objlist: self.dbroot[self.PRODUCTVERSION][mod.pgef_oid] = mod self.dbroot[self.OIDLOOKUP][mod.pgef_oid] = self.PRODUCTVERSION @@ -1083,7 +1083,6 @@ self.SavePMV([obj]) elif obj.__class__.__name__ == "PartsList": -# elif isinstance(obj, partslist.PartsList): #print "have partslist" if self.dbroot[self.PARTSLISTDICT].has_key(obj.pgef_oid): @@ -1096,7 +1095,6 @@ self.SavePartsList([obj]) elif obj.__class__.__name__ == "ProductDocumentRelationship": -# elif isinstance(obj, ProductDocumentRelationship): #print "save pdr " + obj.pgef_oid if self.dbroot[self.PDRDICT].has_key(obj.pgef_oid): @@ -1129,7 +1127,6 @@ self.SaveDocument([obj]) elif obj.__class__.__name__ == "ProductModelMaster": -# elif isinstance(obj,ProductModelMaster): #print 'found a ProductModelMaster' if self.dbroot[self.PRODUCTMODELMASTER].has_key(obj.pgef_oid): if self.dbroot[self.PRODUCTMODELMASTER][obj.pgef_oid].state: @@ -1141,7 +1138,6 @@ self.SavePMM([obj]) elif obj.__class__.__name__ == "ProductVersion": -# elif isinstance(obj,ProductVersion): #print 'found a ProductVersion' if self.dbroot[self.PRODUCTVERSION].has_key(obj.pgef_oid): if self.dbroot[self.PRODUCTVERSION][obj.pgef_oid].state: @@ -1153,7 +1149,6 @@ self.SavePV([obj]) elif obj.__class__.__name__ == "ProductMaster": -# elif isinstance(obj,ProductMaster): #print 'found a ProductMaster' if self.dbroot[self.PRODUCTMASTER].has_key(obj.pgef_oid): if self.dbroot[self.PRODUCTMASTER][obj.pgef_oid].state: @@ -1165,7 +1160,6 @@ self.SavePM([obj]) elif obj.__class__.__name__ == "WfProcess": -# elif isinstance(obj, WfProcess): #print "localdb.save.wfprocess" if self.dbroot[self.WFPROCESS].has_key(obj.pgef_oid): #print "have key" @@ -1177,18 +1171,14 @@ if override: #print "override", obj.pgef_oid self.SaveWfProcess([obj]) -# retlist.extend(self.SaveWfProcess([obj])) else: #print "no state", obj.pgef_oid self.SaveWfProcess([obj]) -# retlist.extend(self.SaveWfProcess([obj])) else: #print "no key", obj.pgef_oid self.SaveWfProcess([obj]) -# retlist.extend(self.SaveWfProcess([obj])) elif obj.__class__.__name__ == "WfActivity": -# elif isinstance(obj, WfActivity): #print "localdb.save.wfactivity" if self.dbroot[self.WFACTIVITY].has_key(obj.pgef_oid): #print "have key" @@ -1199,19 +1189,15 @@ #print "obj.state " + str(obj.state) if override: #print "override", obj.pgef_oid -# retlist.extend(self.SaveWfActivity([obj])) self.SaveWfActivity([obj]) else: #print "no state", obj.pgef_oid -# retlist.extend(self.SaveWfActivity([obj])) self.SaveWfActivity([obj]) else: #print "no key", obj.pgef_oid -# retlist.extend(self.SaveWfActivity([obj])) self.SaveWfActivity([obj]) elif obj.__class__.__name__ == "WfEventAudit": -# elif isinstance(obj, WfEventAudit): #print "localdb.save.wfeventaudit" if self.dbroot[self.WFEVENTAUDIT].has_key(obj.pgef_oid): #print "have key" @@ -1222,20 +1208,15 @@ #print "obj.state " + str(obj.state) if override: #print "override", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfEventAudit([obj]) else: #print "no state", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfEventAudit([obj]) else: #print "no key", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfEventAudit([obj]) elif obj.__class__.__name__ == "WfTransition": -# elif isinstance(obj, WfTransition): - #print "localdb.save.wfeventaudit" if self.dbroot[self.WFTRANSITION].has_key(obj.pgef_oid): #print "have key" #print "objid: " + obj.pgef_oid @@ -1245,19 +1226,14 @@ #print "obj.state " + str(obj.state) if override: #print "override", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfTransition([obj]) else: #print "no state", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfTransition([obj]) else: #print "no key", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.SaveWfTransition([obj]) elif obj.__class__.__name__ == "Project": -# elif isinstance(obj, WfTransition): - #print "localdb.save.wfeventaudit" if self.dbroot[self.PROJECTOBJECTS].has_key(obj.pgef_oid): #print "have key" #print "objid: " + obj.pgef_oid @@ -1267,15 +1243,12 @@ #print "obj.state " + str(obj.state) if override: #print "override", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj else: #print "no state", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj else: #print "no key", obj.pgef_oid -# retlist.extend(self.SaveWfEventAudit([obj])) self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj else: print "have unknown obj to save", obj.__class__.__name__, obj.id @@ -1300,7 +1273,6 @@ def RemovePartsList(self, obj): if obj.__class__.__name__ == "PartsList": -# if isinstance(obj, partslist.PartsList): if self.dbroot[self.PARTSLISTDICT].has_key(obj.pgef_oid): del self.dbroot[self.PARTSLISTDICT][obj.pgef_oid] elif isinstance(obj, types.StringType): @@ -1320,7 +1292,6 @@ def RemoveItem(self, item): if item.__class__.__name__ == "ProductModelVersion": -# if isinstance(item, ProductModelVersion): if self.dbroot[self.ITEMDICT].has_key(item.pgef_oid): del self.dbroot[self.ITEMDICT][item.pgef_oid] elif isinstance(item, types.StringType): @@ -1333,7 +1304,6 @@ def RemoveACU(self, acuobj): if acuobj.__class__.__name__ == "AssemblyComponentUsage": -# if isinstance(acuobj, AssemblyComponentUsage): if self.dbroot[self.ACUDICT].has_key(acuobj.pgef_oid): del self.dbroot[self.ACUDICT][acuobj.pgef_oid] @@ -1400,7 +1370,6 @@ for wfid, wfobj in uncommitted_dict.items(): if wfobj.__class__.__name__ == "WfProcess": -# if isinstance(wfobj, WfProcess): if objdict.has_key(wfid): if wfobj.state <> objectstatus.DELETE: tmpobj = self.GetWfProcess(wfobj.pgef_oid) @@ -1501,7 +1470,6 @@ #print "wftransition" self.SaveWfTransition([tvalue]) #print "saved wftransition" - def SaveWfProcessTemplate(self, wflist): From waterbug at ned.gsfc.nasa.gov Tue Oct 21 18:28:44 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 21 17:28:46 2003 Subject: [Pangalactic-commits] Added attrs symbolic_tag and content. Message-ID: <200310212128.h9LLSiYH002857@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/docversion.py 1.13 1.14 Log message: Added attrs symbolic_tag and content. Index: PanGalactic/pangalactic/enterprise/docversion.py diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.13 PanGalactic/pangalactic/enterprise/docversion.py:1.14 --- PanGalactic/pangalactic/enterprise/docversion.py:1.13 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/enterprise/docversion.py Tue Oct 21 17:28:43 2003 @@ -1,10 +1,10 @@ -# $Id: docversion.py,v 1.13 2003/10/21 21:25:18 pbear Exp $ +# $Id: docversion.py,v 1.14 2003/10/21 21:28:43 waterbug Exp $ """ Version-specific attributes of a document. """ -__version__ = "$Revision: 1.13 $"[11:-2] +__version__ = "$Revision: 1.14 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docmaster import DocMaster as DM @@ -52,9 +52,8 @@ _schema_ext = { 'of_dm_id' : 'str', 'of_dm_id_context' : 'str', - 'tag' : 'str', - 'content' : 'str', - 'abstract' : 'str' + 'symbolic_tag' : 'str', + 'content' : 'str' } _schema = _schema_ext.copy() _schema.update(PgefObject._schema) From waterbug at ned.gsfc.nasa.gov Tue Oct 21 18:29:25 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 21 17:29:26 2003 Subject: [Pangalactic-commits] Added attrs digital_flag and purpose. Message-ID: <200310212129.h9LLTPkW002890@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/docrep.py 1.14 1.15 Log message: Added attrs digital_flag and purpose. Index: PanGalactic/pangalactic/enterprise/docrep.py diff -u PanGalactic/pangalactic/enterprise/docrep.py:1.14 PanGalactic/pangalactic/enterprise/docrep.py:1.15 --- PanGalactic/pangalactic/enterprise/docrep.py:1.14 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/enterprise/docrep.py Tue Oct 21 17:29:23 2003 @@ -1,10 +1,10 @@ -# $Id: docrep.py,v 1.14 2003/10/21 21:25:18 pbear Exp $ +# $Id: docrep.py,v 1.15 2003/10/21 21:29:23 waterbug Exp $ """ A representation or format of a document. """ -__version__ = "$Revision: 1.14 $"[11:-2] +__version__ = "$Revision: 1.15 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docversion import DocVersion as DV @@ -51,7 +51,9 @@ _schema_ext = { 'of_dv_id' : 'str', 'of_dm_id' : 'str', - 'of_dm_id_context' : 'str' + 'of_dm_id_context' : 'str', + 'digital_flag' : 'str', + 'purpose' : 'str' } # when the client can use Python 2.3 and we can use Sets, # this will become a lot easier ... From waterbug at ned.gsfc.nasa.gov Tue Oct 21 18:30:23 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 21 17:30:24 2003 Subject: [Pangalactic-commits] Added attribute symbolic_tag. Message-ID: <200310212130.h9LLUNQ8002975@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/productversion.py 1.21 1.22 Log message: Added attribute symbolic_tag. Index: PanGalactic/pangalactic/enterprise/productversion.py diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.21 PanGalactic/pangalactic/enterprise/productversion.py:1.22 --- PanGalactic/pangalactic/enterprise/productversion.py:1.21 Fri Oct 17 16:49:53 2003 +++ PanGalactic/pangalactic/enterprise/productversion.py Tue Oct 21 17:30:21 2003 @@ -1,12 +1,12 @@ -# $Id: productversion.py,v 1.21 2003/10/17 20:49:53 waterbug Exp $ +# $Id: productversion.py,v 1.22 2003/10/21 21:30:21 waterbug Exp $ """ Version-dependent product data. -@version: $Revision: 1.21 $ +@version: $Revision: 1.22 $ """ -__version__ = "$Revision: 1.21 $"[11:-2] +__version__ = "$Revision: 1.22 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -65,7 +65,7 @@ 'of_pm_id_context' : 'str', 'project_id' : 'str', 'project_id_context' : 'str', - 'tag' : 'str', + 'symbolic_tag' : 'str', 'has_docs_flag' : 'bool' } _schema = _schema_ext.copy() From waterbug at ned.gsfc.nasa.gov Tue Oct 21 18:32:30 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Tue Oct 21 17:32:32 2003 Subject: [Pangalactic-commits] Docstring clarifications. Message-ID: <200310212132.h9LLWUEW003085@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/factory.py 1.30 1.31 Log message: Docstring clarifications. Index: PanGalactic/pangalactic/repo/factory.py diff -u PanGalactic/pangalactic/repo/factory.py:1.30 PanGalactic/pangalactic/repo/factory.py:1.31 --- PanGalactic/pangalactic/repo/factory.py:1.30 Tue Oct 7 23:39:36 2003 +++ PanGalactic/pangalactic/repo/factory.py Tue Oct 21 17:32:28 2003 @@ -1,17 +1,18 @@ -# $Id: factory.py,v 1.30 2003/10/08 03:39:36 waterbug Exp $ +# $Id: factory.py,v 1.31 2003/10/21 21:32:28 waterbug Exp $ """ Pan Galactic Object Factory module -@version: $Revision: 1.30 $ +@version: $Revision: 1.31 $ """ -__version__ = "$Revision: 1.30 $"[11:-2] +__version__ = "$Revision: 1.31 $"[11:-2] import types from pprint import pprint from twisted.internet import defer from twisted.python import log from pangalactic.utils.factory import PgefFactory +from pangalactic.utils import utils class PgerObjectFactory(PgefFactory): """ @@ -54,7 +55,7 @@ def resultset2Extract(self, res): """ - Convert a pyPgSQL resultset into an "extract" + Convert a pyPgSQL PgResultSet into an "extract" (see L{pangalactic.utils.factory.extract}). """ obj = self._registry.pgerdb_classes[res.pgef_class] @@ -158,7 +159,7 @@ pger_objects attribute of L{pangalactic.repo.registry.PgerObjectRegistry} @type resultsets: L{twisted.internet.defer.Deferred} - @param resultsets: a deferred list of resultsets from + @param resultsets: a deferred list of PgResultSets from L{pangalactic.repo.db.PgerDb} """ klass = self._registry.pgerdb_classes[classname] From waterbug at ned.gsfc.nasa.gov Wed Oct 22 15:06:26 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 22 14:06:27 2003 Subject: [Pangalactic-commits] Tweaks to Document and DocVersion ... ;) Message-ID: <200310221806.h9MI6QZG016877@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/document.py 1.13 1.14 PanGalactic/pangalactic/enterprise/docversion.py 1.14 1.15 Log message: Tweaks to Document and DocVersion ... ;) Index: PanGalactic/pangalactic/enterprise/docversion.py diff -u PanGalactic/pangalactic/enterprise/docversion.py:1.14 PanGalactic/pangalactic/enterprise/docversion.py:1.15 --- PanGalactic/pangalactic/enterprise/docversion.py:1.14 Tue Oct 21 17:28:43 2003 +++ PanGalactic/pangalactic/enterprise/docversion.py Wed Oct 22 14:06:25 2003 @@ -1,10 +1,10 @@ -# $Id: docversion.py,v 1.14 2003/10/21 21:28:43 waterbug Exp $ +# $Id: docversion.py,v 1.15 2003/10/22 18:06:25 waterbug Exp $ """ Version-specific attributes of a document. """ -__version__ = "$Revision: 1.14 $"[11:-2] +__version__ = "$Revision: 1.15 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.docmaster import DocMaster as DM @@ -52,7 +52,7 @@ _schema_ext = { 'of_dm_id' : 'str', 'of_dm_id_context' : 'str', - 'symbolic_tag' : 'str', + 'revision' : 'str', 'content' : 'str' } _schema = _schema_ext.copy() @@ -67,10 +67,10 @@ assert _of_master.__class__.__name__ == 'DocMaster' except: raise TypeError, "Expecting a DocMaster instance as argument 2" - self._of_master = _of_master self.of_dm_id = self._of_master.id self.of_dm_id_context = self._of_master.id_context + self.revision = kw.get('revision', self.id) def __getattr__(self, name): return PgefObject.__getattr__(self, name) Index: PanGalactic/pangalactic/enterprise/document.py diff -u PanGalactic/pangalactic/enterprise/document.py:1.13 PanGalactic/pangalactic/enterprise/document.py:1.14 --- PanGalactic/pangalactic/enterprise/document.py:1.13 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/enterprise/document.py Wed Oct 22 14:06:25 2003 @@ -1,10 +1,10 @@ -# $Id: document.py,v 1.13 2003/10/21 21:25:18 pbear Exp $ +# $Id: document.py,v 1.14 2003/10/22 18:06:25 waterbug Exp $ """ The Mother of all document types in PGEF. """ -__version__ = "$Revision: 1.13 $"[11:-2] +__version__ = "$Revision: 1.14 $"[11:-2] import string @@ -42,6 +42,8 @@ # we may want to substitute DocType() or even # PrettyDocType() here ... ] + # this is a mapped class (not PGEF Core) + _mapped = True # These are from the Dublin Core, and are computed from the # attributes of the associated DocMaster and DocVersion: _properties = { @@ -56,8 +58,8 @@ _refd = { '_master' : 'DocMaster' } -# _required = ['master_oid'] # for the time being, don't require any fields - _required = [] +# _required = ['master_oid'] + _required = [] # for the time being, don't require any fields _schema_ext = { 'master_oid' : 'str' } @@ -72,22 +74,31 @@ for a in kw: if a in self._properties: setattr(self, a, kw[a]) - + self._master = kw.get('_master', DocMaster(email=email)) self._versions = {} - self._master = DocMaster() - v = DocVersion(_of_master = self._master) - self.setCurrentVersion(v) - + v = DocVersion(_of_master=self._master, id='1') + self._current_version = v self._reps = {} self._drfiles = {} def deleteAttr(self): raise TypeError, 'Cannot delete attribute' - def addRep(self, rep, drfiles = None): - repdict = self._reps.get(rep.of_dv_id, {}) - repdict[rep.pgef_oid] = rep - self._reps[rep.of_dv_id] = repdict + def addRep(self, files=None, + rev=self._current_version.revision, **kw): + """ + Add a new document representation. (This will create a + DocRep object and add it to the representations of the + current version (or of another version, if a "rev" is + specified. + """ + try: + assert rev in self._revisions + except: + raise ValueError, "rev must be in self._revisions" + repdict = self._reps.get(vid, {}) + repdict[rep.pgef_oid] = rep + self._reps[vid] = repdict if drfiles: for drfile in drfiles: self.addDrFile(drfile) @@ -120,10 +131,10 @@ def setCurrentVersion(self, v): self._versions[v.id] = v - CurrentVersion = property(getCurrentVersion, + _current_version = property(getCurrentVersion, setCurrentVersion, deleteAttr, - "CurrentVersion") + "_current_version") def getTitle(self): # What if a document's Title changes? It is actually the @@ -165,15 +176,47 @@ Creator = property(getCreator, setCreator, deleteAttr, 'Creator') def getRevision(self): - return self._current_version.id + """ + Get the revision identifier for the Document's current + version. + """ + return self._current_version.revision def setRevision(self, value): - self._current_version.__dict__['id'] = value + """ + Assign a revision identifier to the current version. + (Interestingly enough, the Document provides a context + within which a uniqueness rule can be enforced.) + """ + try: + assert value not in [v.revision for v in + self._versions.values()] + except: + raise ValueError, "Revision identifiers must be unique." + self._current_version.__dict__['revision'] = value Revision = property(getRevision, setRevision, deleteAttr, 'Revision') + + def getRevisions(self): + """ + Get the list of revision identifiers for this Document. + """ + return [v.revision for v in self._versions] + + def setRevisions(self, value): + # 'setDate' is an error because the date should not be + # set from a string -- interfaces should always provided + # validated date-creation widgets, and then update + # create_datetime (a DateTime object) via its API. + raise TypeError, '_revisions is a read-only, computed attribute.' + + _revisions = property(getRevisions, + setRevisions, + deleteAttr, + '_revisions') def getDescription(self): return self._master.long_description From waterbug at ned.gsfc.nasa.gov Wed Oct 22 16:55:40 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 22 15:55:42 2003 Subject: [Pangalactic-commits] symbolic_tag -> revision Message-ID: <200310221955.h9MJte9X019750@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/productversion.py 1.22 1.23 Log message: symbolic_tag -> revision Index: PanGalactic/pangalactic/enterprise/productversion.py diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.22 PanGalactic/pangalactic/enterprise/productversion.py:1.23 --- PanGalactic/pangalactic/enterprise/productversion.py:1.22 Tue Oct 21 17:30:21 2003 +++ PanGalactic/pangalactic/enterprise/productversion.py Wed Oct 22 15:55:39 2003 @@ -1,12 +1,12 @@ -# $Id: productversion.py,v 1.22 2003/10/21 21:30:21 waterbug Exp $ +# $Id: productversion.py,v 1.23 2003/10/22 19:55:39 waterbug Exp $ """ Version-dependent product data. -@version: $Revision: 1.22 $ +@version: $Revision: 1.23 $ """ -__version__ = "$Revision: 1.22 $"[11:-2] +__version__ = "$Revision: 1.23 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -65,7 +65,7 @@ 'of_pm_id_context' : 'str', 'project_id' : 'str', 'project_id_context' : 'str', - 'symbolic_tag' : 'str', + 'revision' : 'str', 'has_docs_flag' : 'bool' } _schema = _schema_ext.copy() From pbear at ned.gsfc.nasa.gov Thu Oct 23 16:06:22 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 23 15:06:27 2003 Subject: [Pangalactic-commits] removed image_wdr directories; fixed imports; regenerated ToolkitImages Message-ID: <200310231906.h9NJ6MVw000487@ned.gsfc.nasa.gov> Modified files: PanGalactic/setup.py 1.15 1.16 PanGalactic/pangalactic/client/fnord.py 1.64 1.65 PanGalactic/pangalactic/client/setup.py 1.7 1.8 PanGalactic/pangalactic/client/dataobjects/securitymanager.py 1.13 None PanGalactic/pangalactic/client/images/img2py.py 1.1.1.1 1.2 PanGalactic/pangalactic/client/images/img2xpm.py 1.1.1.1 1.2 PanGalactic/pangalactic/client/images/maketoolkitimages.py 1.3 1.4 PanGalactic/pangalactic/client/modules/psm/doctreeframe.py 1.14 1.15 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.107 1.108 PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py 1.19 1.20 PanGalactic/pangalactic/client/modules/psm/partslistview.py 1.10 1.11 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py 1.32 1.33 PanGalactic/pangalactic/client/modules/psm/propertiesform.py 1.10 1.11 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.118 1.119 PanGalactic/pangalactic/client/modules/psm/aboutbox.py 1.3 None PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr.py 1.4 None PanGalactic/pangalactic/client/modules/psm/configgrid_wdr.py 1.2 None PanGalactic/pangalactic/client/modules/psm/customizegrid.py 1.8 None PanGalactic/pangalactic/client/modules/psm/foreigngrid.wdr 1.1.1.1 None PanGalactic/pangalactic/client/modules/psm/foreigngrid_wdr.py 1.1.1.1 None PanGalactic/pangalactic/client/modules/psm/test_aboutbox.py 1.1.1.1 None PanGalactic/pangalactic/client/support/datepanel.py 1.5 None PanGalactic/pangalactic/client/support/pgefscrolledwindow.py 1.2 None PanGalactic/pangalactic/client/tests/test_aboutbox.py 1.2 1.3 PanGalactic/pangalactic/enterprise/document.py 1.14 1.15 PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.41 1.42 PanGalactic/pangalactic/utils/aboutbox.py None 1.1 PanGalactic/pangalactic/utils/aboutbox_gui.py None 1.1 PanGalactic/pangalactic/utils/customizegrid_gui.py None 1.1 PanGalactic/pangalactic/utils/ToolkitImages.py 1.1 1.2 PanGalactic/pangalactic/utils/__init__.py 1.4 1.5 PanGalactic/pangalactic/utils/configuredisplay.py 1.2 1.3 PanGalactic/pangalactic/utils/datamanager.py 1.49 1.50 PanGalactic/pangalactic/utils/localdb.py 1.42 1.43 PanGalactic/pangalactic/utils/securitymanager.py 1.3 1.4 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.23 1.24 PanGalactic/pangalactic/utils/configdbbrowser_wdr.py 1.1 None PanGalactic/pangalactic/utils/customizegrid_wdr.py 1.1 None Log message: removed image_wdr directories; fixed imports; regenerated ToolkitImages Index: PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py diff -u PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.19 PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.20 --- PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.19 Fri Sep 26 15:47:11 2003 +++ PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py Thu Oct 23 15:06:18 2003 @@ -2,18 +2,22 @@ import copy from wxPython.wx import * + import pangalactic.enterprise.partslist as partslist -from pangalactic.client.modules.psm import partslistview -import pangalactic.client.modules.psm.partslistform as partslistform -import pangalactic.client.modules.psm.pgefdoctree as pgefdoctree -import pangalactic.client.modules.psm.doctreeframe as doctreeframe + from pangalactic.utils.securitymanager import actions as security_actions from pangalactic.utils.pgefexceptions import RequiredDataError from pangalactic.utils import objectstatus from pangalactic.utils import preferences import pangalactic.utils.toolframe as toolframe -import dataobjects.partslistinfo as partslistinfo -import dataobjects.partslistmap as partslistmap + +from pangalactic.client.modules.psm import partslistview +import pangalactic.client.modules.psm.partslistform as partslistform +import pangalactic.client.modules.psm.pgefdoctree as pgefdoctree +import pangalactic.client.modules.psm.doctreeframe as doctreeframe + +import pangalactic.client.dataobjects.partslistinfo as partslistinfo +import pangalactic.client.dataobjects.partslistmap as partslistmap try: @@ -21,7 +25,7 @@ except: print "partslisttreeframe.plmimport.failed" -__version__ = "$Revision: 1.19 $"[11:-2] +__version__ = "$Revision: 1.20 $"[11:-2] class PartsListTreeFrame(doctreeframe.DocTreeFrame): Index: PanGalactic/pangalactic/client/modules/psm/partslistview.py diff -u PanGalactic/pangalactic/client/modules/psm/partslistview.py:1.10 PanGalactic/pangalactic/client/modules/psm/partslistview.py:1.11 --- PanGalactic/pangalactic/client/modules/psm/partslistview.py:1.10 Tue May 27 06:45:13 2003 +++ PanGalactic/pangalactic/client/modules/psm/partslistview.py Thu Oct 23 15:06:18 2003 @@ -1,19 +1,16 @@ -from wxPython.wx import wxPanel, wxTAB_TRAVERSAL, wxPyTypeCast, wxPyDefaultPosition, wxPyDefaultSize, true, false -from wxPython.grid import * -from partslistview_wdr import * import os import string -#import pgefgrid +from wxPython.wx import wxPanel, wxTAB_TRAVERSAL, wxPyTypeCast, wxPyDefaultPosition, wxPyDefaultSize, true, false +from wxPython.grid import * +from pangalactic.client.modules.psm.partslistview_wdr import * +import pangalactic.client.support.httpdownload as httpdownload try: import modules.plm.ms2file as ms2file except: - print "Can you say L-i-n-u-x?" - - - + print "It's L-i-n-u-x. What's with this MSExcel hoohah?" class PartsListView(wxPanel): @@ -25,8 +22,6 @@ self.DataManager = None self._loggedin = false - #log.debug(repr("current project: %s" % self.State.currentproject)) - self.EpimsNames = ["Part ID", "Project Name Code", "Spec", "Generic", "MFR", "NSN", "CAGE Code", "Name Code", "FSC Code", "Description", "Package Type", "Specification", "Screening Specification", "Failure Rate Level", "NASA NSPAR Number", "Lot Date Code", "Quantity", "Serial Number"] self.partslistgrid = wxGrid(self, ID_FOREIGN_PARTSLISTVIEW) @@ -59,7 +54,7 @@ #print "header file exists" else: if self._loggedin: - retval = support.httpdownload.DownloadFile(tmpdir, self.schemafilename, user, host, port, "dictionary") + retval = httpdownload.DownloadFile(tmpdir, self.schemafilename, user, host, port, "dictionary") else: #print "Parts Lists are not available in local mode" return @@ -100,7 +95,7 @@ else: # print "self.LoggedIn: " + str(self.LoggedIn) if self._loggedin: - retval = support.httpdownload.DownloadFile(tmpdir, pl._UploadFileName, user, host, port, "parts_list") + retval = httpdownload.DownloadFile(tmpdir, pl._UploadFileName, user, host, port, "parts_list") else: #print "Parts Lists are not available in local mode" dlg.Destroy() Index: PanGalactic/pangalactic/utils/__init__.py diff -u PanGalactic/pangalactic/utils/__init__.py:1.4 PanGalactic/pangalactic/utils/__init__.py:1.5 --- PanGalactic/pangalactic/utils/__init__.py:1.4 Wed Oct 1 13:24:14 2003 +++ PanGalactic/pangalactic/utils/__init__.py Thu Oct 23 15:06:20 2003 @@ -1,16 +1,22 @@ __all__ = [ +'aboutbox', +'aboutbox_gui', +'acrobat5', 'acrobatwrapper', +'advisoryfonts', +'advisoryreport', 'basegrid', 'configdbbrowser', -'configdbbrowser_wdr', 'convertimage', 'configuregrid', 'configuredisplay', -'customizegrid_wdr', +'customizegrid_gui', 'datamanager', 'data_utils', +'datepanel', 'dbbrowser', 'dbbrowser_wdr', +'factory', 'httpupload', 'localdb', 'loginclass', @@ -27,10 +33,12 @@ 'pgdialogs', 'pgdialogs_wdr', 'pgefdatatable', +'pgefevents', 'preferences', 'proxyclass', 'proxydialog_wdr', 'pystrptime', +'registry', 'reportlab_blocks', 'securitymanager', 'serverclass', @@ -39,8 +47,8 @@ 'toolframe', 'ToolkitImages', 'toolstate', +'utils', 'xmlrpcinterface', 'xmlrpclib_proxy' -'utils', 'xlate_list', 'xlator'] Index: PanGalactic/pangalactic/client/modules/psm/pgefedittree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.32 PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.33 --- PanGalactic/pangalactic/client/modules/psm/pgefedittree.py:1.32 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefedittree.py Thu Oct 23 15:06:18 2003 @@ -89,7 +89,7 @@ def LoadTreefromObjects(self, datamanager, rootitemid, rootnauoid, currentdata = None, product_type = None): """Loads the tree from the dicts in the DataManager""" - print "pgefedittree.loadtreefromobjects" + #print "pgefedittree.loadtreefromobjects" #print "refresh: " + str(self.DataManager.refresh) self.DeleteAllItems() @@ -164,7 +164,7 @@ else: if self.DataManager.inLocalMode: - print "localmode", self.DataManager.currentProject + #print "localmode", self.DataManager.currentProject localnauos = self.DataManager.localDB.GetLocalNauos(self.DataManager.currentProject) #print "localnauos" #import pprint @@ -175,7 +175,7 @@ #print "NauoNodes", NauoNodes else: - print "logged in" + #print "logged in" if self.DataManager.nauoIDs.has_key(lookupid): #import pprint #print "NauoIDs" @@ -219,6 +219,6 @@ else: self.SelectItem(rootnode) - print "end pgefedittree.loadtreefromobjects" + #print "end pgefedittree.loadtreefromobjects" Index: PanGalactic/setup.py diff -u PanGalactic/setup.py:1.15 PanGalactic/setup.py:1.16 --- PanGalactic/setup.py:1.15 Wed Jun 25 04:10:33 2003 +++ PanGalactic/setup.py Thu Oct 23 15:06:16 2003 @@ -4,7 +4,7 @@ # created 2002/09/14 Steve Waterbury -__revision__ = "$Id: setup.py,v 1.15 2003/06/25 08:10:33 waterbug Exp $" +__revision__ = "$Id: setup.py,v 1.16 2003/10/23 19:06:16 pbear Exp $" from distutils.core import setup from distutils.command.install_data import install_data @@ -52,16 +52,16 @@ 'pangalactic.utils' ], data_files = [('pangalactic', ['pangalactic/plugins.tml']), - ("aboutbox_wdr", - ["pangalactic/client/modules/psm/aboutbox_wdr/About_0.png", - "pangalactic/client/modules/psm/aboutbox_wdr/About_1.png"]), - ("configgrid_wdr", - ["pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png", - "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png", - "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png", - "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png", - "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png", - "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]), +# ("aboutbox_wdr", +# ["pangalactic/client/modules/psm/aboutbox_wdr/About_0.png", +# "pangalactic/client/modules/psm/aboutbox_wdr/About_1.png"]), +# ("configgrid_wdr", +# ["pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png", +# "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png", +# "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png", +# "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png", +# "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png", +# "pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]), ("io", ["pangalactic/client/io/gidep_problem_advisory_layout.pgef", "pangalactic/client/io/nasa_advisory_layout.pgef", Index: PanGalactic/pangalactic/client/setup.py diff -u PanGalactic/pangalactic/client/setup.py:1.7 PanGalactic/pangalactic/client/setup.py:1.8 --- PanGalactic/pangalactic/client/setup.py:1.7 Wed Sep 10 13:18:09 2003 +++ PanGalactic/pangalactic/client/setup.py Thu Oct 23 15:06:17 2003 @@ -17,13 +17,16 @@ setup(name="Pan-Galactic PGEF", scripts=["fnord.py"], - data_files=[("aboutbox_wdr", ["modules/psm/aboutbox_wdr/About_0.png", "modules/psm/aboutbox_wdr/About_1.png"]), - ("configgrid_wdr", ["modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png", - "modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png", - "modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png", - "modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png", - "modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png", - "modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]), - ("io", ["io/gidep_problem_advisory_layout.pgef", "io/nasa_advisory_layout.pgef", "io/nasa_form_1544_layout.pgef"]), + data_files=[("io", ["io/gidep_problem_advisory_layout.pgef", "io/nasa_advisory_layout.pgef", "io/nasa_form_1544_layout.pgef"]), ("help", ["help/help.htm", "help/widgetTest.htm", "help/widgetTest.py"]), (".", ["images/meatball_new.gif"])]) +# data_files=[("aboutbox_wdr", ["modules/psm/aboutbox_wdr/About_0.png", "modules/psm/aboutbox_wdr/About_1.png"]), +# ("configgrid_wdr", ["modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png", +# "modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png", +# "modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png", +# "modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png", +# "modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png", +# "modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png"]), +# ("io", ["io/gidep_problem_advisory_layout.pgef", "io/nasa_advisory_layout.pgef", "io/nasa_form_1544_layout.pgef"]), +# ("help", ["help/help.htm", "help/widgetTest.htm", "help/widgetTest.py"]), +# (".", ["images/meatball_new.gif"])]) Index: PanGalactic/pangalactic/client/tests/test_aboutbox.py diff -u PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.2 PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.3 --- PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.2 Wed Oct 15 11:03:20 2003 +++ PanGalactic/pangalactic/client/tests/test_aboutbox.py Thu Oct 23 15:06:19 2003 @@ -1,5 +1,5 @@ import unittest -import modules.psm.aboutbox +import pangalactic.utils.aboutbox from wxPython.wx import * Index: PanGalactic/pangalactic/client/modules/psm/propertiesform.py diff -u PanGalactic/pangalactic/client/modules/psm/propertiesform.py:1.10 PanGalactic/pangalactic/client/modules/psm/propertiesform.py:1.11 --- PanGalactic/pangalactic/client/modules/psm/propertiesform.py:1.10 Fri Jun 20 04:44:50 2003 +++ PanGalactic/pangalactic/client/modules/psm/propertiesform.py Thu Oct 23 15:06:18 2003 @@ -1,12 +1,11 @@ +import os + from wxPython.wx import wxPanel, wxPyDefaultPosition, wxPyDefaultSize, wxTAB_TRAVERSAL, wxDialog, wxDefaultPosition, wxSize from wxPython.wx import wxTHICK_FRAME, wxStaticText, wxPoint, wxDefaultSize, wxALIGN_CENTRE, wxSafeYield from wxPython.grid import * -from propertiesform_wdr import * -import os -from pangalactic.client.support import httpdownload - - +from pangalactic.client.modules.psm.propertiesform_wdr import * +from pangalactic.client.support import httpdownload class PropertiesForm(wxPanel): Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.41 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.42 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.41 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Thu Oct 23 15:06:19 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.41 2003/10/21 21:25:18 pbear Exp $ +# $Id: pgefadvisory.py,v 1.42 2003/10/23 19:06:19 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.41 $"[11:-2] +__version__ = "$Revision: 1.42 $"[11:-2] import os.path import string @@ -91,13 +91,6 @@ def GetCreateDateStr(self): return self._create_date -# def SetDueDate(self, due_datetime): -# self.due_datetime = due_datetime - -# def SetWorkflowState(self, statestr, nextstatestr): -# self._workflowstr = statestr -# self._next_workflowstr = nextstatestr - def SetAttachments(self, attachments): self.attachments = attachments @@ -118,37 +111,8 @@ # fill in a subject widget with title from metadata form pass - -# def Generate(self, docdata, tmpdir, attachments): -# """ -# Generate a PDF formatted advisory document. -# """ -# print "pgefadvisory.Generate" -# print self._upload_file_name -# print "name", self.name -# print self.getDocName() -# #print "shdesc", self.short_description -# -# advisoryrpt = AdvisoryReport(self._upload_file_name + ".pdf", -# self.getDocName(), -# self.short_description) -# advisoryrpt.SetData(docdata) -# retval = advisoryrpt.generate(attachments) -# #print "end pgefadvisory.Generate", retval -# return retval -# -# def GenerateXML(self, tmpdir): -# print "pgefadvisory.generatexml" -# -# advisoryrpt = AdvisoryReport(self._upload_file_name + ".xml", -# self.getDocName(), -# self.short_description) -# advisoryrpt.generateXML(tmpdir, [], self.__dict__) - - def GetFields(self): return self.__dict__ - def SetData(self, advisory): # ??? _should_ work. Index: PanGalactic/pangalactic/client/images/img2xpm.py diff -u PanGalactic/pangalactic/client/images/img2xpm.py:1.1.1.1 PanGalactic/pangalactic/client/images/img2xpm.py:1.2 --- PanGalactic/pangalactic/client/images/img2xpm.py:1.1.1.1 Mon Nov 4 14:47:22 2002 +++ PanGalactic/pangalactic/client/images/img2xpm.py Thu Oct 23 15:06:17 2003 @@ -1,4 +1,14 @@ -#!/usr/bin/env python +#---------------------------------------------------------------------- +# Name: wxPython.tools.img2xpm +# Purpose: Convert an image to XPM format +# +# Author: Robin Dunn +# +# RCS-ID: $Id: img2xpm.py,v 1.2 2003/10/23 19:06:17 pbear Exp $ +# Copyright: (c) 2002 by Total Control Software +# Licence: wxWindows license +#---------------------------------------------------------------------- + """ img2xpm.py -- convert several image formats to XPM @@ -22,80 +32,19 @@ """ -import sys, os, glob, getopt, string -from wxPython.wx import * - -wxInitAllImageHandlers() - - -def convert(file, maskClr, outputDir, outputName): - if string.lower(os.path.splitext(file)[1]) == ".ico": - icon = wxIcon(file, wxBITMAP_TYPE_ICO) - img = wxBitmapFromIcon(icon) - else: - img = wxBitmap(file, wxBITMAP_TYPE_ANY) - - if not img.Ok(): - return 0, file + " failed to load!" - else: - if maskClr: - om = img.GetMask() - mask = wxMaskColour(img, maskClr) - img.SetMask(mask) - if om is not None: - om.Destroy() - if outputName: - newname = outputName - else: - newname = os.path.join(outputDir, os.path.basename(os.path.splitext(file)[0]) + ".xpm") - if img.SaveFile(newname, wxBITMAP_TYPE_XPM): - return 1, file + " converted to " + newname - else: - img = wxImageFromBitmap(img) - if img.SaveFile(newname, wxBITMAP_TYPE_XPM): - return 1, "ok" - else: - return 0, file + " failed to save!" - - - -def main(args): - if not args or ("-h" in args): - print __doc__ - return - - outputDir = "" - maskClr = None - outputName = None - - try: - opts, fileArgs = getopt.getopt(args, "m:n:o:") - except getopt.GetoptError: - print __doc__ - return - - for opt, val in opts: - if opt == "-m": - maskClr = val - elif opt == "-n": - outputName = val - elif opt == "-o": - outputDir = val - - if not fileArgs: - print __doc__ - return - - for arg in fileArgs: - for file in glob.glob(arg): - if not os.path.isfile(file): - continue - ok, msg = convert(file, maskClr, outputDir, outputName) - print msg +import sys +import img2img +from wxPython import wx + +def main(): + # some bitmap related things need to have a wxApp initialized... + if wx.wxGetApp() is None: + app = wx.wxPySimpleApp() + img2img.main(sys.argv[1:], wx.wxBITMAP_TYPE_XPM, ".xpm", __doc__) +if __name__ == '__main__': + main() -if __name__ == "__main__": - main(sys.argv[1:]) Index: PanGalactic/pangalactic/client/modules/psm/doctreeframe.py diff -u PanGalactic/pangalactic/client/modules/psm/doctreeframe.py:1.14 PanGalactic/pangalactic/client/modules/psm/doctreeframe.py:1.15 --- PanGalactic/pangalactic/client/modules/psm/doctreeframe.py:1.14 Fri Sep 26 15:47:11 2003 +++ PanGalactic/pangalactic/client/modules/psm/doctreeframe.py Thu Oct 23 15:06:18 2003 @@ -1,5 +1,8 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/doctreeframe.py,v $ +import types +import copy + from wxPython.wx import * from wxPython.grid import * @@ -7,17 +10,14 @@ import pangalactic.enterprise.partslist as partslist import pangalactic.enterprise.productmodelversion as productmodelversion -import types -import pgefdoctree -import pangalactic.utils.basegrid as basegrid -#import pgefgrid -import treeframe -import copy - from pangalactic.utils.pgefexceptions import RequiredDataError +import pangalactic.utils.basegrid as basegrid import pangalactic.utils.ToolkitImages as ToolkitImages -__version__ = "$Revision: 1.14 $"[11:-2] +import pangalactic.client.modules.psm.pgefdoctree as pgefdoctree +import pangalactic.client.modules.psm.treeframe as treeframe + +__version__ = "$Revision: 1.15 $"[11:-2] NEW_MODE = 1 Index: PanGalactic/pangalactic/enterprise/document.py diff -u PanGalactic/pangalactic/enterprise/document.py:1.14 PanGalactic/pangalactic/enterprise/document.py:1.15 --- PanGalactic/pangalactic/enterprise/document.py:1.14 Wed Oct 22 14:06:25 2003 +++ PanGalactic/pangalactic/enterprise/document.py Thu Oct 23 15:06:19 2003 @@ -1,10 +1,10 @@ -# $Id: document.py,v 1.14 2003/10/22 18:06:25 waterbug Exp $ +# $Id: document.py,v 1.15 2003/10/23 19:06:19 pbear Exp $ """ The Mother of all document types in PGEF. """ -__version__ = "$Revision: 1.14 $"[11:-2] +__version__ = "$Revision: 1.15 $"[11:-2] import string @@ -80,18 +80,22 @@ self._current_version = v self._reps = {} self._drfiles = {} + self._dumdumbells = {} #hahahaha vwk. + def deleteAttr(self): raise TypeError, 'Cannot delete attribute' - def addRep(self, files=None, - rev=self._current_version.revision, **kw): + def addRep(self, files=None, rev=None, **kw): """ Add a new document representation. (This will create a DocRep object and add it to the representations of the current version (or of another version, if a "rev" is specified. """ + if not rev: + rev = self._current_version.revision + try: assert rev in self._revisions except: Index: PanGalactic/pangalactic/client/images/maketoolkitimages.py diff -u PanGalactic/pangalactic/client/images/maketoolkitimages.py:1.3 PanGalactic/pangalactic/client/images/maketoolkitimages.py:1.4 --- PanGalactic/pangalactic/client/images/maketoolkitimages.py:1.3 Thu Nov 7 11:55:11 2002 +++ PanGalactic/pangalactic/client/images/maketoolkitimages.py Thu Oct 23 15:06:17 2003 @@ -42,12 +42,20 @@ "-a -n GreenDot greendot.gif ToolkitImages.py", "-a -n meatball meatball_new.gif ToolkitImages.py", "-a -n fulltwisted twistedlogofull.png ToolkitImages.py", - "-a -n twisted twistedlogo.png ToolkitImages.py" - + "-a -n twisted twistedlogo.png ToolkitImages.py", + + "-a -n LeftArrow left_arrow.png ToolkitImages.py", + "-a -n RightArrow right_arrow.png ToolkitImages.py", + "-a -n UpArrow up_arrow.png ToolkitImages.py", + "-a -n DownArrow down_arrow.png ToolkitImages.py", + "-a -n DblLeftArrow dbl_left_arrow.png ToolkitImages.py", + "-a -n DblRightArrow dbl_right_arrow.png ToolkitImages.py" ] for line in command_lines: + print "line", line args = string.split(line) + print "args", args img2py.main(args) Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.107 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.108 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.107 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Thu Oct 23 15:06:18 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.107 $"[11:-2] +__version__ = "$Revision: 1.108 $"[11:-2] # Python imports import copy @@ -192,7 +192,7 @@ self.currentproduct = ProductModelMaster(id_context = self.DataManager.currentProject) self.tempproduct = ProductModelMaster(id_context = self.DataManager.currentProject) except: - print " exception.currentproject", self.DataManager.currentProject + print "itemeditframe.setup.exception: building default productmaster instances" self.currentproduct = ProductMaster(id_context = self.DataManager.currentProject) self.tempproduct = ProductMaster(id_context = self.DataManager.currentProject) @@ -237,7 +237,7 @@ self.SetupPane(which_pane, nodedata) def setCurrentProduct(self, nodedata): - print "itemeditframe.setcurrentproduct" + #print "itemeditframe.setcurrentproduct" #print "nodedata: " + str(nodedata) #print 'tempproduct type:', self.tempproduct.__class__.__name__ self.rootitemid = nodedata[1] @@ -258,27 +258,26 @@ self.tempproduct.build(self.currentproduct.__dict__) except IndexError: pass - - print "end setcurrentproduct" + #print "end setcurrentproduct" def SetupPane(self, which_pane, nodedata): - print "itemeditframe.SetupPane" + #print "itemeditframe.SetupPane" #print " pane: " + str(which_pane) #print " nodedata: " + str(nodedata) #print " rootitemid: " + str(self.rootitemid) #print " rootnauoid: " + str(self.rootnauoid) self.setCurrentProduct(nodedata) - print "set pane selection" + #print "set pane selection" self.editnb.SetSelection(which_pane) - print "pane selected" + #print "pane selected" if which_pane == self.PMM_PMVPage or which_pane == self.PM_PVPage or which_pane == self.PropertiesPage: - print " setting up for item" + #print " setting up for item" #print ' rootitemid, rootnauoid are [%s, %s]' % (self.rootitemid, self.rootnauoid) self.BuildItemTree(self.rootitemid, self.rootnauoid) # done in pagechanged - print " built tree" + #print " built tree" root = self.itemtree.GetRootItem() # print " have root item", root @@ -286,19 +285,19 @@ rootdata = self.itemtree.GetPyData(root) #print " rootdata:" + str(rootdata) nodeid = rootdata[1] - print " about to call getitem" + #print " about to call getitem" treedata = self.DataManager.localDB.GetItem(nodeid) #print " treedata", treedata if treedata: - print " have treedata", treedata.id + #print " have treedata", treedata.id self.currentproduct.build(treedata.__dict__) self.tempproduct.build(self.currentproduct.__dict__) classname = self.tempproduct.__class__.__name__ - print " classname", classname - print " tempproduct", self.tempproduct.name + #print " classname", classname + #print " tempproduct", self.tempproduct.name if classname == 'ProductModelVersion': - print " master", self.tempproduct.of_pm_id + #print " master", self.tempproduct.of_pm_id self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master) self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version) self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct._of_model_master) @@ -308,7 +307,7 @@ self.pmm_pmv_form.GetTogglePmv().SetValue(1) elif classname == 'ProductModelMaster': - print " model", self.tempproduct.of_pm_id + #print " model", self.tempproduct.of_pm_id self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master) self.pm_pv_form.FillFormWithPVData(self.tempproduct._of_version) self.pmm_pmv_form.FillFormWithPMMData(self.tempproduct) @@ -318,7 +317,7 @@ self.pmm_pmv_form.GetTogglePmm().SetValue(1) elif classname == 'ProductVersion': - print " version", self.tempproduct.of_pm_id + #print " version", self.tempproduct.of_pm_id self.pmm_pmv_form.clearPMM() self.pmm_pmv_form.clearPMV() self.pm_pv_form.FillFormWithPMData(self.tempproduct._of_master) @@ -328,8 +327,7 @@ self.pm_pv_form.GetTogglePv().SetValue(1) elif classname == 'ProductMaster': - print " tempproduct master", self.tempproduct.id - #print "setup for productmaster" + #print " master", self.tempproduct.id self.pmm_pmv_form.clearPMM() self.pmm_pmv_form.clearPMV() self.pm_pv_form.FillFormWithPMData(self.tempproduct) @@ -519,7 +517,7 @@ def PageChanged(self, event = None): - print "itemeditframe.pagechanged" + #print "itemeditframe.pagechanged" self.currentpage = self.editnb.GetSelection() #print 'page changed.currentpage:', self.currentpage @@ -614,7 +612,7 @@ self.otherdocform.FillObjectWithFormData(self.currentdocument) else: - print "wtf" + print "itemeditframe.pagechanged: invalid page" def BrowseMode(self, gotroot): #print "itemeditframe.browsemode" @@ -1165,10 +1163,10 @@ elif self.pmm_pmv_form.CreatingProductModelMaster: temp_version = self.pm_pv_form.temp_pv - print temp_version + #print "tempversion", temp_version save_object = ProductModelMaster(_of_version = temp_version, project_id = self.DataManager.currentProject, id_context = self.DataManager.currentProject) - print save_object + #print "saveobject", save_object self.pmm_pmv_form.FillPMMWithFormData(save_object) save_object.state = pangalactic.utils.objectstatus.ADD self.pmm_pmv_form.temp_pmm = save_object @@ -1625,7 +1623,7 @@ def BuildItemTree(self, itemid, nauoid, currentdata = None, product_type = None): - print "itemeditframe.builditemtree" + #print "itemeditframe.builditemtree" #print "itemid: " + str(itemid) if itemid == None and nauoid == None: @@ -1678,7 +1676,7 @@ self.rootobject = self.DataManager.localDB.GetItem(treeitemdata[1]) #print "root", self.rootobject.pgef_oid, self.rootobject.id, self.rootobject.name treedlg.Destroy() - print "end builditemtree" + #print "end builditemtree" def BuildDocTree(self, itemid, pdrid = None, currentdata = None): Index: PanGalactic/pangalactic/client/images/img2py.py diff -u PanGalactic/pangalactic/client/images/img2py.py:1.1.1.1 PanGalactic/pangalactic/client/images/img2py.py:1.2 --- PanGalactic/pangalactic/client/images/img2py.py:1.1.1.1 Mon Nov 4 14:47:22 2002 +++ PanGalactic/pangalactic/client/images/img2py.py Thu Oct 23 15:06:17 2003 @@ -1,6 +1,17 @@ -#!/usr/bin/env python +#---------------------------------------------------------------------- +# Name: wxPython.tools.img2py +# Purpose: Convert an image to Python code. +# +# Author: Robin Dunn +# +# RCS-ID: $Id: img2py.py,v 1.2 2003/10/23 19:06:17 pbear Exp $ +# Copyright: (c) 2002 by Total Control Software +# Licence: wxWindows license +#---------------------------------------------------------------------- + + """ -img2py.py -- Convert an image to XPM format and embed it in a Python +img2py.py -- Convert an image to PNG format and embed it in a Python module with appropriate code so it can be loaded into a program at runtime. The benefit is that since it is Python source code it can be delivered as a .pyc or @@ -22,45 +33,42 @@ specify a name that should be used to customize the access fucntions, (getNameBitmap, etc.) + -c Maintain a catalog of names that can be used to reference + images. Catalog can be accessed via catalog and index attributes + of the module. If the -n option is specified then + is used for the catalog key and index value, otherwise + the filename without any path or extension is used as the key. + -a This flag specifies that the python_file should be appended to instead of overwritten. This in combination with -n will allow you to put multiple images in one Python source file. -u Don't use compression. Leaves the data uncompressed. + -i Also output a function to return the image as a wxIcon. + """ +# +# Changes: +# - Cliff Wells +# 20021206: Added catalog (-c) option. +# -import sys, os, glob, getopt, tempfile, string +import sys, os, glob, getopt, tempfile import cPickle, cStringIO, zlib -import img2xpm +import img2img +from wxPython import wx def crunch_data(data, compressed): - # convert the lines to a Python list, pickle it and compress the result. - lines = [] - for line in data: - if line[0] == "\"": - # the line is typically (but not always): - # [quote] [quote][comma][newline] - - # chop one char from the front - line = line[1:] - - # now find the final quote and truncate there - quote = string.rfind(line, "\"") - - # and append the remaining data to our list - lines.append(line[:quote]) - - - # pickle, crunch and convert it to a form suitable for embedding in code - data = cPickle.dumps(lines) + # compress it? if compressed: data = zlib.compress(data, 9) - data = repr(data) + # convert to a printable format, so it can be in a Python source file + data = repr(data) # This next bit is borrowed from PIL. It is used to wrap the text intelligently. fp = cStringIO.StringIO() @@ -107,13 +115,19 @@ print __doc__ return + # some bitmap related things need to have a wxApp initialized... + if wx.wxGetApp() is None: + app = wx.wxPySimpleApp() + append = 0 compressed = 1 maskClr = None imgName = "" + icon = 0 + catalog = 0 try: - opts, fileArgs = getopt.getopt(args, "aun:m:") + opts, fileArgs = getopt.getopt(args, "auicn:m:") except getopt.GetoptError: print __doc__ return @@ -127,6 +141,10 @@ imgName = val elif opt == "-m": maskClr = val + elif opt == "-i": + icon = 1 + elif opt == "-c": + catalog = 1 if len(fileArgs) != 2: print __doc__ @@ -136,12 +154,12 @@ # convert the image file to a temporary file tfname = tempfile.mktemp() - ok, msg = img2xpm.convert(image_file, maskClr, None, tfname) + ok, msg = img2img.convert(image_file, maskClr, None, tfname, wx.wxBITMAP_TYPE_PNG, ".png") if not ok: print msg return - data = open(tfname, "r").readlines() + data = open(tfname, "rb").read() data = crunch_data(data, compressed) os.unlink(tfname) @@ -150,30 +168,85 @@ else: out = open(python_file, "w") + if catalog: + pyPath, pyFile = os.path.split(python_file) + imgPath, imgFile = os.path.split(image_file) + + if not imgName: + imgName = os.path.splitext(imgFile)[0] + print "\nWarning: -n not specified. Using filename (%s) for catalog entry." % imgName + + old_index = [] + if append: + # check to see if catalog exists already (file may have been created + # with an earlier version of img2py or without -c option) + oldSysPath = sys.path[:] + sys.path = [pyPath] # make sure we don't import something else by accident + mod = __import__(os.path.splitext(pyFile)[0]) + if 'index' not in dir(mod): + print "\nWarning: %s was originally created without catalog." % python_file + print " Any images already in file will not be cataloged.\n" + out.write("\n# ***************** Catalog starts here *******************") + out.write("\n\ncatalog = {}\n") + out.write("index = []\n\n") + out.write("class ImageClass: pass\n\n") + else: # save a copy of the old index so we can warn about duplicate names + old_index[:] = mod.index[:] + del mod + sys.path = oldSysPath[:] + out.write("#" + "-" * 70 + "\n") if not append: out.write("# This file was generated by %s\n#\n" % sys.argv[0]) - out.write("from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap\n") + out.write("from wxPython.wx import wxImageFromStream, wxBitmapFromImage\n") + if icon: + out.write("from wxPython.wx import wxEmptyIcon\n") if compressed: - out.write("import cPickle, zlib\n\n\n") + out.write("import cStringIO, zlib\n\n\n") else: - out.write("import cPickle\n\n\n") + out.write("import cStringIO\n\n\n") + + if catalog: + out.write("catalog = {}\n") + out.write("index = []\n\n") + out.write("class ImageClass: pass\n\n") if compressed: out.write("def get%sData():\n" - " return cPickle.loads(zlib.decompress(\n%s))\n\n" + " return zlib.decompress(\n%s)\n\n" % (imgName, data)) else: out.write("def get%sData():\n" - " return cPickle.loads(\n%s)\n\n" + " return \\\n%s\n\n" % (imgName, data)) out.write("def get%sBitmap():\n" - " return wxBitmapFromXPMData(get%sData())\n\n" + " return wxBitmapFromImage(get%sImage())\n\n" "def get%sImage():\n" - " return wxImageFromBitmap(get%sBitmap())\n\n" + " stream = cStringIO.StringIO(get%sData())\n" + " return wxImageFromStream(stream)\n\n" % tuple([imgName] * 4)) + if icon: + out.write("def get%sIcon():\n" + " icon = wxEmptyIcon()\n" + " icon.CopyFromBitmap(get%sBitmap())\n" + " return icon\n\n" + % tuple([imgName] * 2)) + + if catalog: + if imgName in old_index: + print "Warning: %s already in catalog." % imgName + print " Only the last entry will be accessible.\n" + old_index.append(imgName) + out.write("index.append('%s')\n" % imgName) + out.write("catalog['%s'] = ImageClass()\n" % imgName) + out.write("catalog['%s'].getData = get%sData\n" % tuple([imgName] * 2)) + out.write("catalog['%s'].getImage = get%sImage\n" % tuple([imgName] * 2)) + out.write("catalog['%s'].getBitmap = get%sBitmap\n" % tuple([imgName] * 2)) + if icon: + out.write("catalog['%s'].getIcon = get%sIcon\n" % tuple([imgName] * 2)) + out.write("\n\n") if imgName: n_msg = ' using "%s"' % imgName @@ -188,8 +261,4 @@ if __name__ == "__main__": main(sys.argv[1:]) - - - - Index: PanGalactic/pangalactic/client/fnord.py diff -u PanGalactic/pangalactic/client/fnord.py:1.64 PanGalactic/pangalactic/client/fnord.py:1.65 --- PanGalactic/pangalactic/client/fnord.py:1.64 Wed Oct 1 16:45:41 2003 +++ PanGalactic/pangalactic/client/fnord.py Thu Oct 23 15:06:16 2003 @@ -19,6 +19,7 @@ from pangalactic.utils.loginclass import * from pangalactic.utils.proxyclass import * from pangalactic.utils.serverclass import * +from pangalactic.utils.aboutbox import AboutBox from pangalactic.utils import oid from pangalactic.utils import dbbrowser @@ -28,32 +29,12 @@ from pangalactic.utils import toolstate from pangalactic.utils import toolframe from pangalactic.utils import ToolkitImages -#import modules + from pangalactic.client.modules.psm import searchframe from pangalactic.client.modules.psm import psmtool -try: - from pangalactic.client.modules.plm import plmtool -except: - print "fnord.plmimport.failed" - -## Imports of the following two modules are handled in the event handler -## that actually starts the respective tool -## -## import modules.psm.psmtool imported in OnActivateTool -## import modules.plm.plmtool imported in OnActivateTool -## -## -## Imports of these two modules are handled in the MainFrame constructor -## -## if sys.platform == 'win32': -## import modules.plm.plmtool -## -## import modules.psm.psmtool - workingdir = os.getcwd() -# constants VERSION = "1.0 rc9.0" BUILD_DATE = "02/05/2003" @@ -62,10 +43,8 @@ ID_FILE_NEWPMM = wxNewId() ID_FILE_NEWPM = wxNewId() ID_FILE_NEWPRODUCT = wxNewId() -#ID_FILE_NEWCOMPONENT = wxNewId() ID_FILE_NEWDOCUMENT = wxNewId() ID_FILE_NEWPARTSLIST = wxNewId() -#ID_TOOL_NARS = wxNewId() ID_TOOL_DOC_NEW = wxNewId() ID_TOOL_DOC_EDIT = wxNewId() @@ -125,12 +104,7 @@ ID_PREF_TOOLTIPS = wxNewId() ID_PREF_OUTPUTDIR = wxNewId() ID_PREF_SHOWLOGINCONFIRMED = wxNewId() - - -ID_HORIZONTAL_SASH = wxNewId() #5901 - -PSM = 0 -PLM = 1 +ID_HORIZONTAL_SASH = wxNewId() PGEF_TITLE = "Pan-Galactic PGEF (PGEF)" @@ -140,12 +114,6 @@ ID_FILE_NEWPMV : "ProductModelVersion"} -#sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'psm')) -#sys.path.append (os.path.join (os.getcwd(), "pangalactic", "client", 'modules', 'plm')) - -#ToolImports = [(ID_TOOL_PSM, 'psmtool'), (ID_TOOL_PLM, 'plmtool')] - - class PgefState(toolstate.ToolState): def __init__(self): toolstate.ToolState.__init__(self) @@ -267,8 +235,6 @@ EVT_MENU(self, ID_TOOL_CHECKOUT, self.OnCheckout) EVT_MENU(self, ID_TOOL_VIEW_CHECKEDOUT, self.OnViewCheckedOut) -# EVT_MENU(self, ID_TOOL_NARS, self.OnNars) - EVT_MENU(self, ID_TOOL_DOC_NEW, self.OnNewDocument) EVT_MENU(self, ID_TOOL_PL_NEW, self.OnNewPartsList) EVT_TOOL(self, ID_TOOL_GRIDTOPDF, self.OnGridToPdf) @@ -410,8 +376,6 @@ self.menuBar.Append(menu, "&File") menu = wxMenu() -# menu.Append(ID_TOOL_NARS, 'NAR&S...', "Access the NARS application") - docmenu = wxMenu() docmenu.Append(ID_TOOL_DOC_NEW, "&New...", "New Document") docmenu.Append(ID_TOOL_DOC_EDIT, "&Edit...", "Edit Document") @@ -430,7 +394,6 @@ menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries") self.menuBar.Append(menu, "&Tools") - # Repository menu menu = wxMenu() menu.Append(ID_FILE_COMMIT, "&Commit Changes", "Commit changes to database") menu.Enable(ID_FILE_COMMIT, false) @@ -478,36 +441,18 @@ def GetPSMTool(self): return self.psmtool -# if self.IsToolLoaded(ID_TOOL_PSM): -# return self.Tools[self.ToolPtr][1] def CheckAndLoadTool(self, toolid): #print "checkandloadtool" #, self.Tools self.InitializeTool(-1) -# for id, module, toolname in self.Tools: -# print id, module, toolname -# if id == toolid and module == None: -# self.InitializeTool(id) - -# def IsToolLoaded(self, toolid): -# for id, module, toolname in self.Tools: -# if id == toolid: -# if module == None: -# return None -# else: -# return true def OnExportProperties(self, event): self.psmtool.ExportProperties() -# self.Tools[self.ToolPtr][1].ExportProperties() def OnServerCombo(self, event = None): #print "onservercombo" if self.DataManager.inLocalMode: #print "localmode" -# if not self.IsToolLoaded(ID_TOOL_PSM): -# self.CheckAndLoadTool(ID_TOOL_PSM) -# self.Tools[self.ToolPtr][1].SetupForLocalMode() self.psmtool.SetupForLocalMode() self.sb.ShowImage(false) @@ -515,52 +460,29 @@ #print "loginmode" self.menuBar.Enable(ID_FILE_LOGIN, true) self.psmtool.SetupForLogin() -# self.Tools[self.ToolPtr][1].SetupForLogin() self.sb.ShowImage(true) def OnCheckout(self, event): """Wrapper method that calls the tools Checkout method""" self.psmtool.Checkout() -# if self.IsToolLoaded(ID_TOOL_PSM): -# self.Tools[self.ToolPtr][1].Checkout() - def OnViewCheckedOut(self, event): self.psmtool.ShowCheckedOutGrid() -# if self.IsToolLoaded(ID_TOOL_PSM): -# self.Tools[self.ToolPtr][1].ShowCheckedOutGrid() def OnSearch(self, event): -# self.CheckAndLoadTool(ID_TOOL_PSM) self.psmtool.OnSearchItems() -# self.Tools[self.ToolPtr][1].OnSearchItems() def OnNewComponent(self, event): print "fnord.onnewcomponent" -# self.CheckAndLoadTool(ID_TOOL_PSM) product_id = event.GetId() product_type = PRODUCT_TYPES[product_id] self.psmtool.OnNewItem(product_type) -# self.Tools[self.ToolPtr][1].OnNewItem() def OnNewPartsList(self, event): self.psmtool.OnNewParts() -# self.Tools[self.ToolPtr][1].OnNewParts() def OnNewDocument(self, event): self.psmtool.OnNewDoc() -# self.Tools[self.ToolPtr][1].OnNewDoc() - -# def OnNars(self, event): -# print "fnord.onnars" -# from nars import NarsFrame -# already_loaded = true -# narsframe = NarsFrame(self, -1, wxDefaultPosition, wxSize(800, 600)) -# narsframe.setDataManager(self.DataManager) -# narsframe.CentreOnParent() -# narsframe.Show(true) -# narsframe.ConfigureStatusBar(narsframe.sb.GetSizeTuple()[0]) - def OnClearLocalDB(self, event): if self.DataManager.uncommittedData(): @@ -574,7 +496,6 @@ self.DataManager.clearLocalDB() self.DataManager.packLocalDB() self.psmtool.ClearTreeAndGrid() -# self.Tools[self.ToolPtr][1].ClearTreeAndGrid() def onSelectMode(self, event): id = event.GetId() @@ -719,9 +640,7 @@ def OnSize(self, event): self.psmtool.OnSize(event) -# for id, tool, dontcare in self.Tools: -# if tool: -# tool.OnSize(event) + def OnDBBrowser(self, event): tmpsize = wxSize(750, 500) @@ -747,7 +666,6 @@ def OnGridToPdf(self, event = None): self.psmtool.OnGridToPdf() -# self.Tools[self.ToolPtr][1].OnGridToPdf() def OnGetMyStuff(self, event=None): if self.DataManager.user._loggedin: @@ -767,59 +685,23 @@ self.SearchFrame.Show(false) self.SearchFrame = None -# def SaveActiveTool(self, event): -# if self.ToolPtr > -1: -# self.Tools[self.ToolPtr][1].LocalCommit() def CommitTool(self, event): self.psmtool.Commit() -# self.Tools[self.ToolPtr][1].Commit() def CloseActiveTool (self, event): self.psmtool.CloseTool(event) self.psmtool = None self.SetTitle(PGEF_TITLE) - -# if self.ToolPtr > -1: -# self.Tools[self.ToolPtr][1].CloseTool(event) -# self.Tools[self.ToolPtr][1] = None -# self.SetTitle (PGEF_TITLE) - - # look through the list of tools and - # activate the first one found -# self.ToolPtr = -1 -# ndx = 0 - -# for id, tool, dontcare in self.Tools: -# if tool: -# tool.Show(true) -## tool.UpdateMenuBar() -# self.SetTitle (PGEF_TITLE)# + " - " + tool.GetTitle()) -# self.ToolPtr = ndx -# break -# ndx += 1 - self.psmtool.Show(true) self.psmtool.UpdateMenuBar() def CloseTools(self, event): self.psmtool.CloseTool(event) - -# for ndx in range (len (self.Tools)): -# if self.Tools[ndx][1]: -# self.Tools[ndx][1].CloseTool(event) -# self.Tools[ndx][1] = None - -# if self.PLMtool: -# self.PLMtool.CloseDown() - -# self.ToolPtr = -1 - self.SetTitle (PGEF_TITLE) + self.SetTitle(PGEF_TITLE) def OnAbout(self, event): - from modules.psm.aboutbox import AboutBox - dlg = AboutBox(self, -1, "About PGEF", wxDefaultPosition, wxSize(300, 200)) dlg.GetVersion().SetLabel(str(VERSION)) dlg.GetBuildDate().SetLabel(str(BUILD_DATE)) Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.118 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.119 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.118 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Thu Oct 23 15:06:18 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.118 $"[11:-2] +__version__ = "$Revision: 1.119 $"[11:-2] import os import sys @@ -17,7 +17,6 @@ import time import types -#wxPython Constants from wxPython.wx import * from wxPython.grid import * try: @@ -33,9 +32,6 @@ from pangalactic.enterprise.role import Role from pangalactic.enterprise.pgefobject import PgefObject -from pangalactic.client.support import psmstate -from pangalactic.client.support import httpdownload - from pangalactic.utils import datamanager from pangalactic.utils import dbbrowser from pangalactic.utils import objectstatus @@ -45,9 +41,10 @@ from pangalactic.utils import ToolkitImages from pangalactic.utils.mixin_security import Security_Mixin from pangalactic.utils.securitymanager import actions - import pangalactic.utils.basegrid as basegrid +from pangalactic.client.support import psmstate +from pangalactic.client.support import httpdownload from pangalactic.client.modules.psm import toolbarpanel from pangalactic.client.modules.psm import searchframe from pangalactic.client.modules.psm import pgefmaintree @@ -97,7 +94,6 @@ def CreateTool(parent, datamgr, ID, pos, size, debug = 0): return PSMTool(parent, datamgr, ID, pos, wxSize(1,1)) - class PSMTool(wxPanel, Security_Mixin): '''This class encapsulates the main client window''' @@ -290,7 +286,7 @@ # WDR: methods for MyFrame def SelectView(self, event): - print 'selected' + print 'psmtool.selectview' def pageChanged(self, event): @@ -632,7 +628,7 @@ tmplist = self.DataManager.getItem(itemid) tmpobj = None if isinstance(tmplist, types.ListType): - print "a list, what is going on?" + print "checking out a list, what is going on?" #for tmpobj in tmplist: # print "list item tmpobj", tmpobj.id, tmpobj.name elif isinstance(tmplist, PgefObject): @@ -686,6 +682,7 @@ """Save any changes made; retrieve the data from the local storage device and send it to the server.""" + print "psmtool.commit" import pprint #print "datamanager.commit.projectobjects" pprint.pprint(self.DataManager.localDB.GetProjectObjects()) @@ -738,11 +735,15 @@ dlg.ShowModal() dlg.Destroy() else: - print "local mode; do nothing???" + print "psmtool.commit: local mode; do nothing???" # self.DataManager.localDB.SaveUnsavedNauoIds(self.DataManager.UnsavedNauoIDs) if not closing: - self.OnProjectClick() + wgt = self.topWindow.toppanel.GetProjectWidget() + ndx = wgt.GetSelection() + project = wgt.GetStringSelection() + print "psmtool.commit", project, ndx + self.changeProject(ndx, project) else: #dlg = wxDialog(self, -1, "A Message from PGPDM", wxDefaultPosition, defsize, wxTHICK_FRAME) @@ -757,6 +758,7 @@ pass def UpdateForLogin(self): + print "\npsmtool.updateforlogin" if self.DataManager.user._loggedin: self.topWindow.toppanel.FillProjectWidget(self.DataManager.projects, "Select a Project") wgt = self.topWindow.toppanel.GetItemWidget() @@ -766,8 +768,13 @@ self.model_master_grid.ClearGrid() self.product_version_grid.ClearGrid() self.product_master_grid.ClearGrid() -# self.topWindow.toppanel.GetButtonTopLevel().Enable(true) self.State.currentuser = self.DataManager.user.id + +# wgt = self.topWindow.toppanel.GetProjectWidget() +# ndx = wgt.GetSelection() +# project = wgt.GetStringSelection() +# print "psmtool.updateforlogin", project, ndx +# self.changeProject(ndx, project) self.OnProjectClick() @@ -995,24 +1002,25 @@ def OnProjectClick(self, event = None): - #print "psmtool.onprojectclick" + print "\npsmtool.onprojectclick" wgt = self.topWindow.toppanel.GetProjectWidget() + project = wgt.GetStringSelection() ndx = wgt.GetSelection() - - #print 'currentproject: %s' % self.State.currentproject - #print "project ndx", ndx + print "project, ndx", project, ndx if ndx == 0: if self.State.currentproject: wgt.SetStringSelection(self.State.currentproject) wgt.SetSelection(wgt.FindString(self.State.currentproject)) self.DataManager.setCurrentProject(self.State.currentproject) - #print "have project" - #print self.State.currentproject - else: - #print "abort" - return + project = wgt.GetStringSelection() + ndx = wgt.GetSelection() + + self.changeProject(ndx, project) + + def changeProject(self, ndx, project): + print "\npsmtool.changeProject" + print "project ndx", project, ndx - project = wgt.GetStringSelection() self.DataManager.setCurrentProject(project) if self.itemeditform: @@ -1025,6 +1033,7 @@ dlg = None if self.DataManager.user._loggedin: + print "psmtool.changeproject.logged in" wxBeginBusyCursor() try: self.topWindow.toppanel.GetItemWidget().SetFocus() @@ -1035,17 +1044,14 @@ dlg.CentreOnParent() dlg.Show(true) -# self.remainingSpace.SetPageText(self.remainingSpace.GetSelection(), "Product Models") self.tree.DeleteAllItems() self.State.currentproject = project self.DataManager.localDB.SaveState("PSMState", self.State) self.DataManager.getItemsByProject([project]) - #print "onprojectclick->showtoplevelitems" self.ShowTopLevelItems() numitems = self.FillGridFromProject(project) - #print "numitems", numitems self.FillItemWidgetFromProject(project) if numitems > 0: @@ -1064,7 +1070,7 @@ wxEndBusyCursor() else: - #print "psmtool.onprojectclick.notloggedin" + print "psmtool.changeProject.notloggedin" wxSafeYield() wxBeginBusyCursor() wxSafeYield() @@ -1096,7 +1102,7 @@ self.UpdateWindows() self.SecureMenu() wxEndBusyCursor() - #print "end psmtool.onprojectclick" + print "end psmtool.changeProject" def UpdateWindows(self): if self.projectframe: @@ -1305,10 +1311,14 @@ wgt.SetSelection(wgt.FindString(self.State.currentproject)) wgt.SetStringSelection(self.State.currentproject) self.State.currentuser = self.DataManager.user.id - self.OnProjectClick() + + wgt = self.topWindow.toppanel.GetProjectWidget() + ndx = wgt.GetSelection() + project = wgt.GetStringSelection() + print "psmtool.setupforlocalmode", project, ndx + self.changeProject(ndx, project) def SetupForLogin(self): -# self.topWindow.toppanel.GetButtonTopLevel().Enable(true) wgt = self.Parent.menuBar.FindMenuItem('Repository','Get Marked Items') self.Parent.menuBar.Enable(wgt, true) @@ -1456,7 +1466,7 @@ product_id = grid.GetObjectOid(row) product = grid.getObject(row) - print "call editgridobject", product.name + #print "call editgridobject", product.name self.editGridObject(product_id, classname) Index: PanGalactic/pangalactic/utils/configuredisplay.py diff -u PanGalactic/pangalactic/utils/configuredisplay.py:1.2 PanGalactic/pangalactic/utils/configuredisplay.py:1.3 --- PanGalactic/pangalactic/utils/configuredisplay.py:1.2 Wed Oct 1 13:43:46 2003 +++ PanGalactic/pangalactic/utils/configuredisplay.py Thu Oct 23 15:06:20 2003 @@ -8,7 +8,7 @@ from wxPython.wx import * from wxPython.lib.mixins.listctrl import wxColumnSorterMixin -from pangalactic.utils.customizegrid_wdr import * +from pangalactic.utils.customizegrid_gui import * class ConfigureDisplay(wxPanel, wxColumnSorterMixin): def __init__(self, parent, id, Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.42 PanGalactic/pangalactic/utils/localdb.py:1.43 --- PanGalactic/pangalactic/utils/localdb.py:1.42 Tue Oct 21 17:25:19 2003 +++ PanGalactic/pangalactic/utils/localdb.py Thu Oct 23 15:06:20 2003 @@ -887,6 +887,7 @@ def GetDFRByDocument(self, pgef_oid): print "localdb.getdfrbydocument" print "attempting to get a dfr. What is a dfr? It used to be a DocumentFileRelationship." + print "it is now [err... will be] a dumdumbell." return {} localdfrs = self.GetDFRDict() # print "localdfrs", localdfrs Index: PanGalactic/pangalactic/utils/securitymanager.py diff -u PanGalactic/pangalactic/utils/securitymanager.py:1.3 PanGalactic/pangalactic/utils/securitymanager.py:1.4 --- PanGalactic/pangalactic/utils/securitymanager.py:1.3 Fri Sep 26 15:47:12 2003 +++ PanGalactic/pangalactic/utils/securitymanager.py Thu Oct 23 15:06:20 2003 @@ -1,4 +1,3 @@ -import pangalactic.enterprise.pgefobject import pangalactic.enterprise.person import pangalactic.enterprise.role @@ -21,38 +20,38 @@ class Action: def __init__(self): - self.ADDALL = 20 - self.ADDITEM = 21 - self.ADDPDR = 22 - self.ADDDOCUMENT = 23 - self.ADDNAUO = 24 + self.ADDALL = 20 + self.ADDITEM = 21 + self.ADDPDR = 22 + self.ADDDOCUMENT = 23 + self.ADDNAUO = 24 self.ADDPARTSLIST = 25 - self.MODIFYALL = 10 - self.MODIFYITEM = 11 - self.MODIFYPDR = 12 - self.MODIFYDOCUMENT = 13 - self.MODIFYNAUO = 14 + self.MODIFYALL = 10 + self.MODIFYITEM = 11 + self.MODIFYPDR = 12 + self.MODIFYDOCUMENT = 13 + self.MODIFYNAUO = 14 self.MODIFYPARTSLIST = 15 - self.DELETEALL = 30 - self.DELETEITEM = 31 - self.DELETEPDR = 32 - self.DELETEDOCUMENT = 33 - self.DELETENAUO = 34 + self.DELETEALL = 30 + self.DELETEITEM = 31 + self.DELETEPDR = 32 + self.DELETEDOCUMENT = 33 + self.DELETENAUO = 34 self.DELETEPARTSLIST = 35 - self.LINKALL = 40 - self.LINKITEM = 41 - self.LINKDOCUMENT = 42 + self.LINKALL = 40 + self.LINKITEM = 41 + self.LINKDOCUMENT = 42 self.LINKPARTSLIST = 44 - self.VIEWALL = 50 - self.VIEWITEM = 51 - self.VIEWPDR = 52 - self.VIEWDOCUMENT = 53 - self.VIEWNAUO = 54 + self.VIEWALL = 50 + self.VIEWITEM = 51 + self.VIEWPDR = 52 + self.VIEWDOCUMENT = 53 + self.VIEWNAUO = 54 self.VIEWPARTSLIST = 55 self.ACCESSALERTS = 60 @@ -106,8 +105,6 @@ self._User = user def MakeUser(self, userdict): - #print "makeuser" - #print userdict self._User.build(userdict) def GetUser(self): @@ -134,17 +131,14 @@ temp[role.RoleCode] = templist self._User.comp_role_bit_mask = temp self._Roles = temp - #print temp.items() def GetRoles(self, project): currentrole = [] - #print 'in getroles _roles is <%s>' % repr(self._Roles.items()) if self._Roles: for role, projects in self._Roles.items(): if project in projects: currentrole.append(role) - #print 'leaving getroles - currentrole is <%s>' % repr(currentrole) return currentrole else: if self._DataManager.inLocalMode: @@ -153,7 +147,6 @@ def GetActions(self, project): actions = [] myroles = self.GetRoles(project) - #print 'in GetActions roles for project %s <%s>' % (project, myroles) if roles.P in myroles: actions = action_role_xref[roles.P][:] @@ -190,8 +183,7 @@ if object: if 'P' in role: if action == objectstatus.DELETE or action == objectstatus.MODIFY: - #if object.owner == _DataManager.user.UserID: - if object.owner == _DataManager.user.id: + if object.owner == self._DataManager.user.id: return true elif action == objectstatus.ADD: return true @@ -200,20 +192,20 @@ if object.type == 'Alert': if ('ADA' in role or 'GC' in role): - return true + return true if ('CS' in role and action == objectstatus.MODIFY): - return true + return true else: return false if 'A' in role: return false if ('FAM' in role and len(role) == 1): - return false + return false def CanRetrieveAlerts(self): if ('ADA' in role or 'GC' in role or 'A' in role or 'CS' in role): - return true + return true else: return false Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.49 PanGalactic/pangalactic/utils/datamanager.py:1.50 --- PanGalactic/pangalactic/utils/datamanager.py:1.49 Tue Oct 21 17:25:19 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Thu Oct 23 15:06:20 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.49 $"[11:-2] +__version__ = "$Revision: 1.50 $"[11:-2] import time import mx.DateTime @@ -17,7 +17,8 @@ from pangalactic.utils.data_utils import * from pangalactic.utils import preferences import pangalactic.utils.objectstatus as objectstatus -import pangalactic.utils.httpupload +import pangalactic.utils.httpupload as httpupload +import pangalactic.enterprise.role as role from pangalactic.enterprise.person import Person from pangalactic.enterprise.document import Document @@ -208,19 +209,19 @@ ##print 'roles in datamanager are <%s>' % repr(roles) tmp_roles = [] - tmp_role = pangalactic.enterprise.role.Role() + tmp_role = role.Role() tmp_role.RoleCode = 'GDA' tmp_role.Userid = username tmp_role.project_id = 'H2G2' tmp_roles.append(tmp_role) - tmp_role = pangalactic.enterprise.role.Role() + tmp_role = role.Role() tmp_role.RoleCode = 'GDA' tmp_role.Userid = username tmp_role.project_id = 'foo' tmp_roles.append(tmp_role) - tmp_role = pangalactic.enterprise.role.Role() + tmp_role = role.Role() tmp_role.RoleCode = 'GDA' tmp_role.Userid = username tmp_role.project_id = 'bar' @@ -291,12 +292,12 @@ tempobjlist.append(item) classname = item.__class__.__name__ tempids[item.pgef_oid] = {"type" : classname} - if classname == "ProductModelVersion": - print "retrieving a", classname - print " ~", item.name - print " ~ master", item._of_master.id - print " ~ version", item._of_version.id - print " ~ model", item._of_model_master.id + #if classname == "ProductModelVersion": + #print "retrieving a", classname + #print " ~", item.name + #print " ~ master", item._of_master.id + #print " ~ version", item._of_version.id + #print " ~ model", item._of_model_master.id ## if pms: ### print "pms", len(pms) @@ -330,7 +331,7 @@ projectobjects[currproject] = tempids self.localDB.SetProjectObjects(projectobjects) else: - print "no data" + print "datamanager.getitemsbyproject: no data found." return len(tempobjlist) def save(self, savelist): @@ -380,7 +381,7 @@ def getNAUOByAssemblyID(self, AssemblyIDList, NauoID = 'ROOT'): """Retrieves all of the NAUOs associated with an AssemblyID""" - print "datamanager.getnauobyassemblyid" + #print "datamanager.getnauobyassemblyid" retlist = [] objlist = [] @@ -409,13 +410,13 @@ itemobjs.append(obj) #print "appending", obj.__class__.__name__ #print obj - else: - print "ignoring", obj.__class__.__name__ + #else: + # print "ignoring", obj.__class__.__name__ if len(nauoobjs) > 0: updatedacuobjs = [] nauoids = [] - print "saving nauoobjs", len(nauoobjs) + #print "saving nauoobjs", len(nauoobjs) updatedacuobjs = self.localDB.Save(nauoobjs) #add the nauos to the projectobject dictionary in localdb @@ -436,7 +437,7 @@ self.nauoIDs[id] = {NauoID:nauoids} if len(itemobjs) > 0: - print "saving items", len(itemobjs) + #print "saving items", len(itemobjs) self.localDB.Save(itemobjs) break # only do the first one for now @@ -449,11 +450,11 @@ elif obj.__class__.__name__ == "ProductModelVersion": item = self.localDB.GetItem(obj.pgef_oid) retlist.append(item) - else: - print "not returning", obj.__class__.__name__ + #else: + # print "not returning", obj.__class__.__name__ #print "len retlist", len(retlist) - print "end datamanager.getnauobyassemblyid" + #print "end datamanager.getnauobyassemblyid" return retlist @@ -572,8 +573,7 @@ documentobjs.append(obj) else: - print "found what?" - print repr(obj) + print "found what? a", obj.__class__.__name__ if len(partslistobjs) > 0: self.localDB.Save(partslistobjs) @@ -593,7 +593,7 @@ if pdr.name in ["document", "parts_list"]: newpdrs.append(pdr) else: - print "retrieved an unknown pdr" + print "retrieved a pdr that is neither a document nor a parts_list" self.localDB.Save(newpdrs) @@ -852,12 +852,12 @@ # if isinstance(obj, PartsList): if upload: if os.path.exists(obj._UploadFileName): - retval = support.httpupload.UploadFile(self.State.workingdir, - obj._UploadFileName, "parts_list", - obj.PartsListID, - self.user, - self.serverName, - self.serverPort) + retval = httpupload.UploadFile(self.State.workingdir, + obj._UploadFileName, "parts_list", + obj.PartsListID, + self.user, + self.serverName, + self.serverPort) if retval == "Upload Failed": print retval #else: @@ -868,13 +868,13 @@ elif isinstance(obj, Document): if upload: if os.path.exists(obj._UploadFileName): - retval = support.httpupload.UploadFile(self.State.workingdir, - obj._UploadFileName, - "document", - obj.pgef_oid, - self.user, - self.serverName, - self.serverPort) + retval = httpupload.UploadFile(self.State.workingdir, + obj._UploadFileName, + "document", + obj.pgef_oid, + self.user, + self.serverName, + self.serverPort) testdir = "/home/pbear/PanGalactic/pangalactic/client/support/" testfilename = "twistedupload.py" upval = os.popen3(testdir + testfilename + " " + Index: PanGalactic/pangalactic/utils/ToolkitImages.py diff -u PanGalactic/pangalactic/utils/ToolkitImages.py:1.1 PanGalactic/pangalactic/utils/ToolkitImages.py:1.2 --- PanGalactic/pangalactic/utils/ToolkitImages.py:1.1 Wed Jun 25 01:25:03 2003 +++ PanGalactic/pangalactic/utils/ToolkitImages.py Thu Oct 23 15:06:20 2003 @@ -1,1776 +1,1740 @@ #---------------------------------------------------------------------- -# This file was Generated by maketoolkitimages.py +# This file was generated by maketoolkitimages.py # -from wxPython.wx import wxBitmapFromXPMData, wxImageFromBitmap -import cPickle, zlib +from wxPython.wx import wxImageFromStream, wxBitmapFromImage +import cStringIO, zlib def getBlueDocIcon_16Data(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`\xf5\x08\x85d\x05e70\x00\xf3\ -\xf5@|\x03 \x80\xf2\x15\x80|\xbf\xfc\xbcT\x08G\x0f\x0e\x14@\x00*\x18\x01\x01\ -z\x11z\xd8\x04\xc1\xa2\x18\x82 Q4A\x88\xb1\xa8\x82\x11\xd8T\x0evA\xa4`B\xf8\ -\x08\r\x00\x05\xf5\x00\xf2\xec__' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xa7x\xba8\x86T\xcc\ +INIIJ\xfb\xf1\xff\xfd\xebz6%\x06eas\xe5]\x12\xdc=\x1f\x1f\xf3\xe7\xf5\xca\ +\xe8\x08T\xf2M[\xff\xff"o\xa2\xd2\xb1\xb4\x14\xef\x0b\xb1\xde\x93\x18o\xf0$\ +\x1e\\.!Y\xf0 \xc0s\n\xe3\x8b\x87\xcd9\x12\'\xe3\x1c\xd8\x17\xb3\xf1p3KH\xce\ +\x9c!)!ap\xd9\xc2\xb1\xf7\x82\x0f\xabyC\x0c\x03\x83\xc8\x16\x19~\x81]_\xdf\ +\x02\xedc\xf0t\xf5sY\xe7\x94\xd0\x04\x00J\x185\x80' ) def getBlueDocIcon_16Bitmap(): - return wxBitmapFromXPMData(getBlueDocIcon_16Data()) + return wxBitmapFromImage(getBlueDocIcon_16Image()) def getBlueDocIcon_16Image(): - return wxImageFromBitmap(getBlueDocIcon_16Bitmap()) + stream = cStringIO.StringIO(getBlueDocIcon_16Data()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getBlueDocpIcon_16Data(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`\xf5|\x85d\x05\xa7\x9c\xc4\ -\xe4l0/\x02\xc8Sv\x03\x030_\x0f\xc47\x00\x02(_\x01\xc8\xf7\xcb\xcfK\x85p\xf4\ -\xe0@\x01\x04\xa0\x82\x11\x10\xa0\x17\xa1\x87M\x10,\x8a!\x08\x12E\x13\x84\ -\x18\x0b\x17\xcc\x07\x02\x88\x04\xb2 H\x1c\x8b`D>q*q\x98\x19A\x81`\x04\x86 R\ -0!|\x84\x06\x80\x82z\x00ZLe\x10' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xb7x\xba8\x86T\xcc\ +\xd9:\xd9\x9b\xef\x80\x02\x87\x0b{\xaa\xe3\xa5\xdf\xf2W\x8f\xb8\x06\xef\xce\ +\xc8\xe5\xf8\xe7k\xa5\xdd\xfc\x81\x8dS\xc8\xb2\xbf\xa4\xb5\x85s\xa2\xf5\x89c\ +\x16\xf2\x8fn\xea\x89\xd4\xbdku\xde$`\xfex\x8do\xcev\xef\x06\xa9\x96\xea\x93\ +Q\x97N\xe8\x1c:\x94$\x93l(\xcf\xbb\xda\xee\xa1fW\xe8\x82\xd0r6\xc9M\xbc\x12;\ +\x99{\x15_\x1d\n\x14\x0f=\xe0\xf3:\xf2t\xf5\x07\xfb\x84\xa5\xb5\x0c\nEr\x0e;\ +\x1f\x1f>\xf4=\xb8\xb6!\xf6\xaeE\x9d\xc1\xf5\x05\xa5\tI@\xf70x\xba\xfa\xb9\ +\xacsJh\x02\x00\x87\x8dI\xae' ) def getBlueDocpIcon_16Bitmap(): - return wxBitmapFromXPMData(getBlueDocpIcon_16Data()) + return wxBitmapFromImage(getBlueDocpIcon_16Image()) def getBlueDocpIcon_16Image(): - return wxImageFromBitmap(getBlueDocpIcon_16Bitmap()) + stream = cStringIO.StringIO(getBlueDocpIcon_16Data()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getBlueDocdIcon_16Data(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`\xf5|\x85d\x05\xa7\x9c\xc4\ -\xe4l0/\x02\xc8Sv\x03\x030_\x0f\xc47\x00\x02(_\x01\xc8\xf7\xcb\xcfK\x85p\xf4\ -\xe0@\x01\x04\xa0\x82\x11\x10\xa0\x17\xa1\x87M\x10,\x8a!\x08\x12E\x13\x84\ -\x18\x0b\x17\xcc\x07\x02\x88\x04\xb2 H\x1c\x8b`\x04\r\x04\xb1X\x84\xcdIp\x00\ -\x17D\n&\x84\x8f\xd0\x00PP\x0f\x00c1eU' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47x\xba8\x86T\xcc9;y\ +/\xdf\x01\x05\x8e\x16GI\x8f_\xff\xfa\xb3\x1e]\xb8\xc2w\xad\xad\xc1\xfe\xcaJs\ +\xc9\xa7v_\x9a:\x14\x9dv\x061\xb6\x1b\xc8\xac\xf8\xbeB\xf7\x93\xa5\x99\xd1\ +\xd5\xe2e!&*\x15V\xa7\xd5~m\x9b\xcf`\xcbq\xb6kiE@\xe6\xb6\x99\x11\xa5g\xd4\ +\xe49_\xdb-\x9cU$\xbe\xc2\xf4\xec\x02\xc7m\x8cr\x7fe6p\t$\x18\xb0_\xda\xc1u\ +\x89\xc1\xe6\xa4\xb7b\x1b\x07C\xd9\xb1\xe9\xc7\x9e\x07\xefm\x88\xbd\xbb\xb2W\ +\xf7\xf5$\xc3\xc7b@\xb70x\xba\xfa\xb9\xacsJh\x02\x00\xac\xf9I\xd0' ) def getBlueDocdIcon_16Bitmap(): - return wxBitmapFromXPMData(getBlueDocdIcon_16Data()) + return wxBitmapFromImage(getBlueDocdIcon_16Image()) def getBlueDocdIcon_16Image(): - return wxImageFromBitmap(getBlueDocdIcon_16Bitmap()) + stream = cStringIO.StringIO(getBlueDocdIcon_16Data()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getRedDocaIcon_16Data(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`\xf5\x08\x85d\x05e70\x00\xf3\ -\xf5 |\x03 \x00\xf3\x15\x80|\xbf\xfc\xbcT\x08G\x0f\x0e\x14@\x00*\x18\x01\x01\ -z\x11z\xd8\x04\xc1\xa2\x18\x82 Q\x84 \xd0\xc0\x08\xa8\xb1H\x82\x11\x10\xf5\ -\xc8\x82`u\x18\x82P#\xd1T\xea\x11\xab\x92hA8\xc0/\x88\x14L\x08\x1f\xa1\x01\ -\xa0\xa0\x1e\x00wB[\xc3' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47z\xba8\x86T\xcc\ +\xd9:\xd9\x9b\xef\x80\x02\x87\x0b{j\xe2\xfb\xfa\x88\xd8\x1b\xe7\xbd\x9c?\xe6\ +_\x8e\x94d\xcag`\x9e\xb8\xf1\xc3\xf5\xcad\xa7\xf6\x8dK\x92\xe7\xc4\x1bn\xd1\ +\xbe\xc9hx`\xf3n\xd3#g,\xbc\x85\xef\xbe\x95Z\xc0\xf40Khw\xb8\xa3\xe0\xe4\x95\ +\xb6\xcbc\x96|WNx\xcaqk\xe5\xc3;l\x1e\xc7\xef\x9dW\xa9\xb3\xbdU.\xcb\xbc\xe4\ +\xf35\x0e\xee_\x8c\x0b\xc4\xcd#\x9e<\xe7\xeb\xe8amx\xd9\xed\xe3\xe5>\x95qw\ +\x15\x83d\xae\x16g\x82B\xbb<\xd01\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00\x8aNHj' ) def getRedDocaIcon_16Bitmap(): - return wxBitmapFromXPMData(getRedDocaIcon_16Data()) + return wxBitmapFromImage(getRedDocaIcon_16Image()) def getRedDocaIcon_16Image(): - return wxImageFromBitmap(getRedDocaIcon_16Bitmap()) + stream = cStringIO.StringIO(getRedDocaIcon_16Data()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getRedBlackDoc_16Data(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"c\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\ -/\x02\xc8Svs3\x00\x020_\x01\xc8\xf7\xcb\xcfK\x85p\xf4\xe0@\x01\x04\xa0\x82\ -\x11\x10\xa0\x17\xa1\x87M\x10,\x8a!\x08\x12E\x13\x84\x18\x8b*\x18\x81M\xe5`\ -\x17D\n&\x84\x8f\xd0\x00PP\x0f\x00\x05\n_u' )) + return zlib.decompress( +"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4'z\xba8\x86T\xccy;\ +\xf9\xb4P\x83\x02\x87\xeb\xce\x07M\xff\xff\xdf2\xf3\x92\xce\xee\xb9\xb2!\xf5\ +r\xac\xa1\r\xdf\x0b\x86\x03Na\x9b\x02\x1d\x12\x1a\xbf/=|C\xad5\xeaq\xd4\xa6J\ +\x0ew\xab\xed\xbe\x7f\xb6x7\xc8\xa9\xf8\x16\xe9_j\xb4g\xf9\xf0\xff\xf2\xa1i\ +\xf3\x1f|e\xb6cd\x88\xe8x\xb1\xefq\x7f\xeb\xd7\x15~\x07\xa2\xdffZK(v\xb8\xb6\ +\x85\x01-c\xf0t\xf5sY\xe7\x94\xd0\x04\x00\xdc\xf0>\xec" ) def getRedBlackDoc_16Bitmap(): - return wxBitmapFromXPMData(getRedBlackDoc_16Data()) + return wxBitmapFromImage(getRedBlackDoc_16Image()) def getRedBlackDoc_16Image(): - return wxImageFromBitmap(getRedBlackDoc_16Bitmap()) + stream = cStringIO.StringIO(getRedBlackDoc_16Data()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getItemIcon_16Data(): - return cPickle.loads(zlib.decompress( -'x\xda}\x8f\xb1\x0e\xc20\x0cD\xf7~E$\x860\x9d\x94\x01$V\x90\x18\xf1\xd0\xc5k\ -U1Qa\xfe\x7f\xc2\xe76\xa4T\x88S\x94\xe4^.\xb1\xb3\x9f^\xa5\xebs9&\x1f\x87Tr7\ -\xf4\x19iL\xe7i\x18\x1f\xe1\xcc\xdd\xee\x1a\n/\xf4\xa7P\xf8\xe4\xfef\xcf{\ -\x18\xe5\xe1%\xb4\x1cRp\xcd\xbb\x06\xa1f\x8aoHV\xe9\xff\xe4\xaf7I<8\xf3\x05B\ -\x15\x8e\x94k\x85\x10UcRU\x05\x15\xd2\x99\xcf\xe6IHM"\x88s\xdfJ\xbb\x1eU\xe2\ -\xfa\n\x1a\xfb\xb4\r\x9c\x7f\xb4\x86h\xc9O\xa1h\x9eI\x16\x12\xd9|\x93(\x9a\ -\xc7\x1b\x0e\xccc\xa4' )) + return zlib.decompress( +'x\xda\x014\x01\xcb\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\ +\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\ +\x08\x08\x08|\x08d\x88\x00\x00\x00\xebIDATx\x9c\xadS;\xb2\xc3 \x0c\\\xe1\x14\ +9\x0e\x85\x0b\x8e\xe4\xbcw!\x1d\x89\x82\x82\xe3\xa8 \xe15\x91F\xd8r\xf7\x98\ +\xd1`\x90vY}L\x946Dk~\xde\xd3\x9f)m\x14\xc5\xa5;pm\x152\x042\x04\xb5\xd5\x0b\ +\xa1g^\x0c\xc0\xac\xadN\x19\xb2Xmu\x02\x98\x97\xf8\xf3EDr\x07\xa6\xb4\x81\ +\xfe\xb5\x06\xf3\xf3\x9ej\x00,\xff\xc8w\xa9\x81\xcaV\xb9\xba\xfbo\xefW\\Rvf6\ +R\x19\x82\xb2\x17SP\xf6bJ\x00\x80\x99-E\xa2\xb4\xd9\xc1\x07\xe5\x9c\xf1|<\ +\xa1\xf79g\xf4\xde\x01\x00e/Fd\xf2\x99\xd9$\xfb.\xe8\xee}\x1a\xcb\xcc\xf3\ +\xe1\xeb\xe1\x15\xe8+\x91\xaf\xb7\x1ew\xc1\xcb?Ob\xce9\n\x8d\tz\xef\x0b\xc0\ +\xe7\x7fKp\x1c\xc7-\xe0L\xe8c\x97I\xf4C"C\x96\x97\xb4#\xc0\xb7\xfa\x11\x81_\ +\xd1\xdf\xe7\x81\xaf\x9f_\x02\x80?\xe4`\xf2\x01BX7\xb0\x00\x00\x00\x00IEND\ +\xaeB`\x82\xc9J\x83k' ) def getItemIcon_16Bitmap(): - return wxBitmapFromXPMData(getItemIcon_16Data()) + return wxBitmapFromImage(getItemIcon_16Image()) def getItemIcon_16Image(): - return wxImageFromBitmap(getItemIcon_16Bitmap()) + stream = cStringIO.StringIO(getItemIcon_16Data()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getCopyData(): - return cPickle.loads(zlib.decompress( -'x\xdau\x901\n\xc30\x0cE\xf7\x9cB\xd0\xc1\x99\x84\rI\xe8\xdcB/\x90Ek\xc8\x18\ -\x83r\xff\xa9\x92\xdcP[I\x9e\x8d\xe1\x7f?\x84q\x9f\xf7\xd4\xcd!M\x90F\x18 \ -\x85n\x99\x03\xc2\n\xaf\xbc\xac\x9b%\x96\xf4\x88\xc23Z&\xcd\x1f\xc32h~G]\xbf\ -\xdcRJ4|I\xc2\xbf\xadKBW\xa2l6Z\x93\xd8\x0e\xaeM\xc4R\x12;S\x86\xe8\x84\x93\ -\xa9\x97\xdeD\x95\xeb\xc7;\xb3\xe0\xcc\xa3\xbc2\x0f\xee~\t\xbf0\xde[\xaa' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02@\xcc\xcf\ +\xc1\x06$\xdf\x16\xfb\xeb\x03)\x96b\'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2\xe7x\ +\xba8\x86T\xccY:\xc9\x91\xef\xb0\x02\x0f\xcb\xf6\xa9\xfc6\xa7\xcf\x9f2\xc8\xbb\xed\xbd\xbbL\x07]^*\xf5E|\xe0\xc0\x91\xd5\x93\xf8\xc8\xb1\xfb$\ -\xfe\xc9\xf2\xa8\x87\xf8;\xdf\xba'\x15\x9a\x88f\x98E\xc8\x98\xa0\x84\x14ft\ -\x08\x14!H\xf2m@\xaa0YE\x87\xb5\xbdXe\xedX!,\xfaW\x12s\xd2.jx\xfd%\x0b\xfe\ -\x8e\xb7\t\xd3\xd4\xa9\x13\xdb\x98#\xa9l,\x04\x1d\xd2\xa2iK\x0b\xc4\x17\x17\ -\xb8\\\x0f" )) + return zlib.decompress( +'x\xda\x016\x01\xc9\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x10\ +\x00\x00\x00\x10\x08\x06\x00\x00\x00\x1f\xf3\xffa\x00\x00\x00\x04sBIT\x08\ +\x08\x08\x08|\x08d\x88\x00\x00\x00\xedIDATx\x9c\x8d\x93\xbd\x91\xc3 \x10\x85\ +?{T\x88\x02\x8aPp\xc1\x86\x94A\x19\x04\n\x08\x1cP\x82\x03\x07\x94\xa1p\x0bQ\ +\xe0N\xee\x02\x19\t\x06t\xd6\x9bQ\xc0\x8a\xf7\xde\xfeqS\xd5_:\x08N{\xe1\xe3\ +\x7f\x12\x00\x86\xff.-\xabob\xd6D\x96\xd5cM$$\xe9\x0bdwk\xe2\xa9P\x16\x19z\ +\xc4Q\x84\xe7k\xaa\\\x01\xc4\xd5g\x80{\xe3\xfe\xa9-#>\xe2\x1e\xf3\xb3gY\x8f\ +\x0f\x8a\x1e\x04\xa7\r9\x93\xb6\x94\xa7\xca\xb9\x118\x835\x11q "\x151\xe3\ +\xab@M\xd0\xa6\xb1\x973\xd0\xd4\x13,\x9a\x18\x92t\x97gY\xfd\xde\x07q\x9b`\ +\xd9\x8b&\x83\xe0\x94\xf1S/lS\xc8\xee~\xf6\xf8\xb9\xbe_M!\xe3\xad\x8a5\xc79$\ +AU\xcf\xa7P\x92\xf3(\x83\xd3\xaa\xde\xe9gj\xdc\x01n2\x86\xfd1\x95{\xf0\xed15\ +\x02\xbd%\xba$p\xf6\x9c\xaf\xe2\x0f^\xe6o\xf5\xb8\xbd\x88]\x00\x00\x00\x00IE\ +ND\xaeB`\x82\xfb"\x80$' ) def getFindBitmap(): - return wxBitmapFromXPMData(getFindData()) + return wxBitmapFromImage(getFindImage()) def getFindImage(): - return wxImageFromBitmap(getFindBitmap()) + stream = cStringIO.StringIO(getFindData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getNewData(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S04U0V0T\xe7J\x0cV\xd7SHVp\xcaIL\xce\x06\xf3"\x80\xf6\x90\x90\xb9\x85\xae\x19\ -\xb2h\r\x19\x13P\xef?\xb5\x96#\xc5u\xf3\x85\x87\xf7\x90d\xd0}\x7f\xa7n\x0ei\ -\xa0\xd4SO)t\xcb\x1c@+=\xf6e\xdd\x94\xe4K\xb7\x97F\x992?c.\xe5)\xf3\x18\xc7\ -\x18\x0b\xb3\xf5\x1fLM\x1a\t\xe0OB\x1f.\xc6a\xb2\x8c\xd9\x86"\xc1\xc2(9?\x82\ -\xf0Q\xb54\xc7m\'<\xd5\xce\xc9bR\xa4r\xbe\xb3v&\x7f\x9cK\xcf\xc5A\xfcJ\xf8\ -\x00\x8b\x1aU\xa3' )) + return zlib.decompress( +"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02@\xcc\xcf\ +\xc1\x06$\xdf\x16\xfb\xeb\x03)\x96b'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2'{\xba\ +8\x86T\xccY:\xc9\x91\xef\xb0\x02\x0f\x8b\xba(\xfb\xbc\xad\xfe\x8f3\xeb\xc4\ +\xda=\xde2\x06\x1a8\x9a,\xd9\x970!\xfd\xe6\xd4\x9a\x197g\xdbk\xdd\x91\x9d\ +\xf2\xe5\xed\xd9\x1c\x7f\x87I\xcd\xafb\x85\x8e_\xe6\xb8\x1a(!\xef\xd6\xad-\ +\xa1\xc1\xa72\xd1\xbf\x81\xc7\xe5\x91\xd2\r\x8d{\xbdb\x12F?{\xde\xc5\x9d\x97\ +x\xe4\xfa\xe1\xea-\xcb'\xe7\xb3}e\xb7H\x88f\x15\xcc\xaf\x17\xf8P\xe0u\x99?v\ +\xe9\x13\xa5'J\x9b\x19g\xcf,\xdf\xc0\xed\xfc\xfc\x01'\xcfa\xad\xfb\x823\xde\ +\x1d\\\x7f6\xfa*{F\xaaS\xfb\x9b\x83jU@\xe71x\xba\xfa\xb9\xacsJh\x02\x00%\xc6\ +Q\xd8" ) def getOpenBitmap(): - return wxBitmapFromXPMData(getOpenData()) + return wxBitmapFromImage(getOpenImage()) def getOpenImage(): - return wxImageFromBitmap(getOpenBitmap()) + stream = cStringIO.StringIO(getOpenData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getLinkData(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"#\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\xe4l0\ -O\x01\xc8Sv\x03\x03(\x1f\x15@\x04\xf5\x80@\x01B\x82\x08\xa8\xa0\x02\x1c\x81\ -\x08\x84 D1\x9a \xa6Jlf\x82\xe4a@\x0ff\xbb\x82\x1eT\xb1\x02\x98\x80\xb9\x13j\ -\x0b\xd8LTA=\xa89p\x1fA\x05\xd0\x04aV#\x0b* )\'[\x10n\xa6\x1e\x00\x97\xf6@\ -\xc1' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe47y\xba8\x86T\xccY\ +\x1ad\xc8w@A \xe8q\xc1\xff\xfa\xb7\xbcje+y\xe7]\xb8\xe5\xf1(`KC\xd1\xcd\xd9\ +\xdfK\x9a\xa2\x13\xa2\xee\xed\xd1\xb6+bm\x99d\x9e\xce\xc6\xdd\x1f\x93\xbar\ +\xcd\xado\xbc\\\xca\xa1Rm\xea\x8dE\xa96E\x95[\x12\xaen\x8b\xfd\xf8\xe6\x13\ +\xdbEA\xd7\xe3rE\xc1\xdc\x15\n\xffV\x08]\x12\x0b\x89Q3\xda\xba\xe0\xd9\x03\ +\xde\xe8\xe2\x86\xfb\x86G\x95\x16\xc8|\x94\xe2\xb0\xf2\xa8/\xd0\xf9p\xf3P\ +\xc3\xac+\xdcL\xca\x19\xb6\xe9\xcf\xb4C\x81\xaea\xf0t\xf5sY\xe7\x94\xd0\x04\ +\x00\x0eJI\xeb' ) def getLinkBitmap(): - return wxBitmapFromXPMData(getLinkData()) + return wxBitmapFromImage(getLinkImage()) def getLinkImage(): - return wxImageFromBitmap(getLinkBitmap()) + stream = cStringIO.StringIO(getLinkData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getPasteData(): - return cPickle.loads(zlib.decompress( -'x\xdam\x8f1\n\xc30\x0cE\xf7\x9c\xc2\xd0\xc1\x05\x83\x90\x87\x14\xcf-t\xd5\ -\x90\xc5k\xc8\x98\x80{\xff\xa9\x92l\xd7(\xcd\x0b1\xf9\xcf_\x10\xdd\x8fO\x9c\ -\x16\x1f\x1f.\xce\x8e\x0f?\xad\x8b\x07\xb7\xb9\xe7\xb1n\xbb&\xe2tC&\xa1\xe6 \ -\xf9\xadhv\x92_(\x8f\xe6"9a\xea\xfd\xdc\xfb\x88\xado\x19\x12\x18#E@\xce\xd0.\ -\xea\xcf\x95R\x80U\xd6\x8f!\xdb$X\xd90r`%UN2\x08DW2\x90\x95<,\xef\x7f3\\4\ -\xe97^\xd7<5\xeb6\xd4\x11\t_\xd3\xcdd+' )) + return zlib.decompress( +"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02@\xcc\xcf\ +\xc1\x06$\xdf\x16\xfb\xeb\x03)\x96b'\xcf\x10\x0e \xa8\xe1H\xe9\x00\xf2\x17y\ +\xba8\x86T\xccY:y#\xdfa\x05\x1e\x97\xf5S\xd9\xed^\xdb\xad^|\xbc\xee\x1a\xaf\ +\xec/O\x9e\x89\xb7\x18'\xb2\x14x.\xbe\xc3\x14\xf1\xe1\x9dN\xf7\xec%\xfcz'\ +\x16)\x9d|\xa6\x93\xc9\xf7B\x9e\xc1!\xee\xd4\xac\x1c>\x93I\x05\xdf\xb7>xw\ +\xc2\xbb2\xc2\xf1\xe4\x85;\x8a;\x9df\x89\xdd\x91\x9d\xf4\xa1\x8e\xf1\xea\x92\ +w\xd5\x8b\x97\xb5\xee]T\x96&%4'\xd4\xa2\x95i7\x07C\xc3\x1e\x9b\xb6\xa8M\xea\ +\r\xbdu\xff\xcf\xa7\xb3L\xb6\xf2\xdb`\xb9\xad\xf3\xdbVg\x87\xfbn\xfc\x96S\ +\x15\x9af-\x91\xdf\xfc\xdd\xc0Q\x9f\xf9\xd1y'\xad\x92\xf7_Yw-w\xf9\xfd\xe3\ +\xc8\xceF\xa0k\x19<]\xfd\\\xd69%4\x01\x00\x15\x1a\\\xba" ) def getPasteBitmap(): - return wxBitmapFromXPMData(getPasteData()) + return wxBitmapFromImage(getPasteImage()) def getPasteImage(): - return wxImageFromBitmap(getPasteBitmap()) + stream = cStringIO.StringIO(getPasteData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getPSMData(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\ -\xe4l0/\x1f\xc8S60p\x03\x020_\x01\xc8\xf7\xcb\xcfK\x05s"@\x92 )\x03\x03\xa8$\ -\x10\xe8\x81\x01\x98\x89$\x18\x01\x04\x14\x08b3\x13$\x0ce \t\xea\xe5\xe7\xeb\ -\xa1\x0b\x02\xc5`\xa2PA\xa0i\xf9`\x006\x16&\x88P\x89"\x083\x13&\x08u\x0c\x04\ -\x03\x01D\x10\xeel\xb0\x17H\x16\x84{\x10n\xa6\x1e\x00\xa4\x15SO' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4O\xf6tq\x0c\xa9\x98\ +s4\xc8P\xe8\xb0\x02\xcfd\x1e\xe7\x7f\xff\xa3\xd8\x84v\x1d\xb9"a\xfd6\xb6=\ +\x8bY\xa51\xc5C\xf3\x83\xc4u\xcbm\xbe\x0cS\x9c\xf6\x87++1l\xd9\xb7\xae\xbfEs\ +\xe6\xc1\xed?n*\xf4N\xb0\xbd\xd9\x1c\xd8\xc9\xa5k\xac\xe5?\xd1\r\xa8\xec\x82\ +\xf4\x85h\xab\xa9W\x12\xbaD\xf9\xd5\x8c\x0f9mH\xea\xae\xda\xd3Z\xbe\xe6)\xeb\ +\x14\'\xaf\x85\xaaQ\x1fm\xfe\x8b$\x1a\xef<\xaa(~`\x9a\xef\xc9:\xae@~\xd1\x88\ +\xfdk\xe7\xd6\x97\xac~\xfe\xef\xbf\xb6}\xd9\x03\xc1\xd2\x0fLs\x17X\x05\xef\ +\xda\x7f\xe3:\xd0y\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00R\x81Q\xfb' ) def getPSMBitmap(): - return wxBitmapFromXPMData(getPSMData()) + return wxBitmapFromImage(getPSMImage()) def getPSMImage(): - return wxImageFromBitmap(getPSMBitmap()) + stream = cStringIO.StringIO(getPSMData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getPLMData(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\ -\xe4l0/\x1f\xc8S60p\x03\x020_\x01\xc8\xf7\xcb\xcfK\x05s"@\x92 )\x03\x03\xa8$\ -\x10\xe8\x81\x01\x98\x89$\x18\x01\x04\x14\x08b3\x13$\x0ce \t\xea\xe5\xe7\xeb\ -\xa1\x0b\x02\xc5`\xa2PA\xa0i\xf9`\x006\x16&\x88P\x89"\x083\x13&\x08u\x0c\x04\ -\x03\x01D\x10\xeel\xb0\x17H\x16\x84{\x10n\xa6\x1e\x00\xa4\x15SO' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4O\xf6tq\x0c\xa9\x98\ +s4\xc8P\xe8\xb0\x02\xcfd\x1e\xe7\x7f\xff\xa3\xd8\x84v\x1d\xb9"a\xfd6\xb6=\ +\x8bY\xa51\xc5C\xf3\x83\xc4u\xcbm\xbe\x0cS\x9c\xf6\x87++1l\xd9\xb7\xae\xbfEs\ +\xe6\xc1\xed?n*\xf4N\xb0\xbd\xd9\x1c\xd8\xc9\xa5k\xac\xe5?\xd1\r\xa8\xec\x82\ +\xf4\x85h\xab\xa9W\x12\xbaD\xf9\xd5\x8c\x0f9mH\xea\xae\xda\xd3Z\xbe\xe6)\xeb\ +\x14\'\xaf\x85\xaaQ\x1fm\xfe\x8b$\x1a\xef<\xaa(~`\x9a\xef\xc9:\xae@~\xd1\x88\ +\xfdk\xe7\xd6\x97\xac~\xfe\xef\xbf\xb6}\xd9\x03\xc1\xd2\x0fLs\x17X\x05\xef\ +\xda\x7f\xe3:\xd0y\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00R\x81Q\xfb' ) def getPLMBitmap(): - return wxBitmapFromXPMData(getPLMData()) + return wxBitmapFromImage(getPLMImage()) def getPLMImage(): - return wxImageFromBitmap(getPLMBitmap()) + stream = cStringIO.StringIO(getPLMData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getDMData(): - return cPickle.loads(zlib.decompress( -'x\xda\xd3\xc8)0\xe4\nV74S\x00"\x13\x05Cu\xae\xc4`u=\x85d\x05\xa7\x9c\xc4\ -\xe4l0/\x1f\xc8S60p\x03\x020_\x01\xc8\xf7\xcb\xcfK\x05s"@\x92 )\x03\x03\xa8$\ -\x10\xe8\x81\x01\x98\x89$\x18\x01\x04\x14\x08b3\x13$\x0ce \t\xea\xe5\xe7\xeb\ -\xa1\x0b\x02\xc5`\xa2PA\xa0i\xf9`\x006\x16&\x88P\x89"\x083\x13&\x08u\x0c\x04\ -\x03\x01D\x10\xeel\xb0\x17H\x16\x84{\x10n\xa6\x1e\x00\xa4\x15SO' )) + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4O\xf6tq\x0c\xa9\x98\ +s4\xc8P\xe8\xb0\x02\xcfd\x1e\xe7\x7f\xff\xa3\xd8\x84v\x1d\xb9"a\xfd6\xb6=\ +\x8bY\xa51\xc5C\xf3\x83\xc4u\xcbm\xbe\x0cS\x9c\xf6\x87++1l\xd9\xb7\xae\xbfEs\ +\xe6\xc1\xed?n*\xf4N\xb0\xbd\xd9\x1c\xd8\xc9\xa5k\xac\xe5?\xd1\r\xa8\xec\x82\ +\xf4\x85h\xab\xa9W\x12\xbaD\xf9\xd5\x8c\x0f9mH\xea\xae\xda\xd3Z\xbe\xe6)\xeb\ +\x14\'\xaf\x85\xaaQ\x1fm\xfe\x8b$\x1a\xef<\xaa(~`\x9a\xef\xc9:\xae@~\xd1\x88\ +\xfdk\xe7\xd6\x97\xac~\xfe\xef\xbf\xb6}\xd9\x03\xc1\xd2\x0fLs\x17X\x05\xef\ +\xda\x7f\xe3:\xd0y\x0c\x9e\xae~.\xeb\x9c\x12\x9a\x00R\x81Q\xfb' ) def getDMBitmap(): - return wxBitmapFromXPMData(getDMData()) + return wxBitmapFromImage(getDMImage()) def getDMImage(): - return wxImageFromBitmap(getDMBitmap()) + stream = cStringIO.StringIO(getDMData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getGridItemData(): - return cPickle.loads(zlib.decompress( -'x\xda}\x8f\xb1\n\xc30\x0cD\xf7|\xc5A\x07w\x12\x18J\xa1k\x0b\xfd\x81,\xb7\ -\x86\x8c\r\xb8\xff?U\xa7\xc4\x0e1\xa1\x87\xb1}\x8f\xb3d]\x97o\x1e\xc6\x94\ -\xef\xf0uCN\xc34&\xc3\x8c\xe72\xcd\x9fppwy\x87\xc2\x17\xf9G(<\xe5_\xa1-/\x99\ -k\xbd\xed\xd0\x08\xd0\x8eP\xac\xd2\xff\xc9\xb3\x9aA\xb8\xf1\r\x1ai\x8e\xa8\ -\xb3B+$\x94$Y\xacB9\xed\xf0d\x83\xc5\x82\xa8\xf4\x9e\xf4\xe7\xd1\xe5\xf0\\5\ -\xf5Otp\x9d\xa8kT\x93\xadQ|\x1e\xed\xe8\xc6l\xb3\xdb\x0f\xee6U\x90' )) + return zlib.decompress( +"x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2\x02 \xcc\xc1\ +\x06$\xe5?\xffO\x04R,\xc5N\x9e!\x1c@P\xc3\x91\xd2\x01\xe4\xdf\xf2tq\x0c\xa9\ +\x9837\xd8\x90\x8fE\x91c\xce\xde\x88\x1f2]\xda\xdfV\xdat\x1ejz\x1e0\xa3@\x94\ +-|\x9b\xa5\xd0f=\xe3\xe6\x86\x8a\x9b&\xee\x89{\xbf\xbe\xbd\xbf,\xd4\xa4\xe6\ +\xde\x11#\x163^3^\xa3'\x1c3\x94\xab\xe3\x18b\xda~\\\xd6w\x969\xf0\xd0\x9e)\ +\xc4\xf1\xde\x11\xb3\xb3\xb7\xbd\xc3\xfe\x7f]\xb0}_XG\x8aGg\xebV\x1d\xbeO\ +\x7f\xf7n?vr\xc2S\xee\xbc\x94+\x87\x0e\x9eq\xe74\xe3]\xb5\xab\x93\xb1a\xa6x\ +\xddM\x93\xf3\xea\xad\x82\x17\xa71\n:\x86\x86\xb7\xad\xd6\xbfX\x9aV\xc6\x90}\ +T\xf7\x88y\xf2A\xdb<\xc5t\x81\xe5!3\xf8b\x7f\x17\tu\xbe\x98\xe1\xa2\xb4jE)C\ +\xe8]\x96\x9d\xff\x0e\x17\xd5\x1a=Ya\xfb\x9e\x99\x7f\x9f\xefg\xed\xfd\xc7lT\ +\xce\x9f\xac>\xbcM-mAU\xedU\x8b\xff\x0c\xb74-'\xd4-\xaa\xf5\x02\xfa\x92\xc1\ +\xd3\xd5\xcfe\x9dSB\x13\x00\xcd\x91u\x16" ) def getGridItemBitmap(): - return wxBitmapFromXPMData(getGridItemData()) + return wxBitmapFromImage(getGridItemImage()) def getGridItemImage(): - return wxImageFromBitmap(getGridItemBitmap()) + stream = cStringIO.StringIO(getGridItemData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getwxPythonLogoData(): - return cPickle.loads(zlib.decompress( -'x\xdau}iw\xdb:\xb2\xed\xf7\xfb+\x94C\x8aN$\x92\x16\'Q\xa2H.N\x92\xe7\xc8Cl\ -\xd3\xc9Jb;\x1e\xe2x\xa0g;\xb1\xe3\xdf\xfe@\xd6.\xe8\xf4\xed\xfb\x1a+\x89\ -\x0e\x9a\x04P\x05\xa0P\xc3F\xf1\xfd\xc5\xb5\xf5?[sV\xaf\xd7r\x9d\x96m\xb9n\ -\xcb\x9e\xfb\x9f\x83\xad\xb9~\xd5\xfa\xd1Rz\xbdI\xda\xeb5\x15\xfb]Q\x91]\x1c\ -\xfc8o\xfe3\xee\xd4\xff\x7f:I\x079\xfd\xff\xddnS\xe1\x0c\xc7\xd9\xb0\xa9xS\ -\xeb\x8a\xbc\xc8\x9d\x9c*^[ME\x9e{c\xea\xe3\x83)_I\x9b\x8aVPW\x8c\xdd\xdc\ -\x1e\xd0\x13_gOdM\xc5\xc7Hv\xeb4\x15\xa3\xb8y\xc5r\\\x8f\x9exj\x06\xde\x9f\ -\xf43\xdfm*\xfe4\xaf\x8c\xed|<\xa0\x8a\xa8\xa9\xc8\xadl\x98{M\xc5\xb5\xde4\ -\xdaK\x07\xe3\xa2\xa90*\xd9\xed\xb8\xa9\x18\xdb\xcd+^\xee\x8e\xa9\xe2\xd6\ -\xa9+\xb2,\xb3\xf3\t\x91\x9f4\xdd\x0e\xfb\xee\x80\xf8Q\x8d\xea\x8aI6\xf1\'T\ -\xf1j\xc8\n\xab\xa9h\x8f\x98A\x05U$V]QL\xfa\xbeO\x15\xf9\xb4\xae\xb0\xf2I\ -\xdf"\x06}W\x88\xb8\xac\x00-\x0b\xedf\x9a\xdca\xafG\x15?\xa8\xc2\xeb\x15="n\ -\xbf!n\xe8\r\x07\x18\xfa\x16MC?\xb7\x0b\x1a\xfa7\xad\xe9\xa5\x98\xf4,\xaa\ -\xf8\xa2\xd2\xdc{}\xcc\xfd\xef\x868\xb7\xe7Z.M\xe5C\xc3\xa0\xc2\xc9\xd3\x82&\ -j\xbb\x19z\xe6\xa5\x93\x9c\xa6a\xa5a\x90?\xf0\xfd1Uh\xf4\x8a\x9d\xe7\xe3\xbc\ -\xa9(C\xf9\nU\x1c; ~$\xcdn\x18{EV\xd0D}\nx\xe8`\xd0\x97f\ -\xe8\xc3\xc1\xd0\xce\xa8\xc2l\xb8\xee\xa5\x9e\xe5\xd0Jvt"n0\x18R\xc5RC\xbe]\ -\x8cm\x87\xf8\xa1x\rO3\xdf\x1b\xd2\xdc\xf6\x9b\n\xc7\xab\x0b\xf52\xeb\xb6\ -\xdfT\x9c\x86\xd4h\xdf\xeb\x13?\xde5+\xc8\x1a\xd4\x85\xb6\x07-\x98^\x9a\x83\ -\xfcu\x1a\x87\x95z\xd8\xd9{\x16\xd6z\xbf\xa0\n\xbd\x19\xd8p<\x1cf\xc4\x8f\ -\xc9\x88\xc9\x1fS\x85\xd1,\xdc\xdeD,\\\xa2\xb6l\xba\xf5\xdd|\xec\x13\x83\xde\ -\xd9\xb2Qzb\xa7Y\x1fC1M)-\x87\x9b\xe6\t\xd7r&.\x91\xff\xd2\x92\xc4\xd1r\xd87\ -\xe58\x88|\xb5\x19X\x9a\xa6NFO\xfcj*\xb2~Z`\xab\xef5\xe3\xf0\xc4\xae\xf5\xe8\ -\x89%\x8d\xa5CJO\x18\xcd*\x1c\xf4\xfd!\x0b\x03S6J,\xbc\x99\xcan\x89\xc9a\xb3\ -_\x9c\x9e\x9d\xdb\xb4\xc6\x86r\x1c`a\x8a5V\xf8`\xf2{\xdeb,^\xbf4\xe3\xc8\xf2\ -\xcc\xa5W\xfe\x99k\xc8/\x86\x855\xee5K{\x81\xf7m\x1f\xe2\xf3\xc9\x95\xbd\xd0\ -\x82i5,\xcczi\x9a\x11\x0b\'\x06\x11W\xa4}b\xe1\xa6\x85-V`\x8b\xbd\x98\xb2["\ -\xff\x9c\xf7m\x06\xf2\'\x91l\x94\xc8_\x8f\xe4+D\xfe\xbc-\x1b\xa5\x8am\xda\ -\xc8\xbdl\x02\x91\xf3R\xca6\x88Aw\x95l\x836a\x97$\xae\x9b\xf62Z\x96?\x9b\x1d\ -e\x8f\xc7=\x87\x18\xb4%\xc7\x01\x9e&\xb2\xd1\x9c\x16\xdd\xaf.\xb6i\x8em\xfaf\ -\xca\'\x88A?H\xc0\xdaEoB\x15\x9b\xf4J\xd1\x13"\x86dr3tw\xe8\x0e!\xa5Z4Q\xde\ -\xd8\x85<\xcd\x9b\xfd2\x9c\x0c\xb3!\r}\x1a\xca^\xa8b\xdf\x92\xc4\x11\xb5{\ -\xcdD\r\x9dA\x91\xd2\x13\x8bM\xb7vj\x0fA\xdchD\xeb4\xb3@\\X\xa2\x17\x1f\xe2\ -\xe2\xde\x95\xbd\xd0\x06j7B\xc9\x17L\x1e\x10-\x9f\x9b\x81M\xf2\xc9\x10\xc4M:\ -\xb2\x82&\xfbw,+ .\x9a\xa1\x17\xe2p\xc5\xec_\xd0\xe2\xb7\x87\x1ef\xff\xb1Y\ -\x96N\xdfq\x1c\x9a\xca\xfbY\x1b4\xd9_i\xe1\x16\x99\x8d\xb9\xfd\x93`i\xb3<]BE\ -\x91\xa1"$9\xd6\xf7{C\x9c\x95t\xaa{\xe2\xbc\x85\x80\r$?H\xc0\x0eC\x92\x0eC\ -\x07Ol\x90\x1cs\xeaB<%\x19$\x04_A\x07N\x12\xca6\x88\x96\x95J\xbeBC\xff\x94P\ -\xc5\xb0\x87\x8a\xd6\xec\x15\x9c\xfb\xcd\n\xea\xbb}\xc7\'\xe2,\x9a\x97\xe1\ -\xd0M\xa9\xe2\x99v\xe5X(58+#~\x05\x8a\xc0\xa3)\x89#Z"\x03ZN:\xa4\x8a\xebf\ -\x03\x89]\x9c\xbaD\\4{\x85hi\xcf*hY\xf6\x15\xf9\n\xcd\xadN<\xcd}\x7fH\x15[\ -\xa4K\x89c~@s{\xe8\xd2\x82\xe9\x17\x03"\xae\xd0H\xdd\xc8\x87\x1e\xd1\xf2@\ -\xa7\x98S\xf4\x86T1\xc6\xd9\xe0\xb0\xd8\xf2\xd1hQ\x80\xda\xab\x86\x85\xb9#t)\ -\xa2\xe5\x894\x94L\xe8A\xb4p\'6\xcd\xcb\xb07\xa4\x85;&\xe90\x10\xfa\x07U<\ -\x93\xb4\xccR\x0f\xc4]B\x0f\x12\x8d\x12-\xddf\x13\x8a3\xcc\xf2\x89\x96m\x12\ -\xc1\xce\xd0J\x89\x96\xf9\x86\xa7\x99/\x94\t\x9a\xca\xdbf\x9d\x16i\xe1\x14\ -\xf4\x84\xebB\xdb\xca \x94F\xa6\xec\x96\xa8]#\x9eZ\xf6\x18b\xfc\x1dt`\xa1\ -\x19\x11\xb5\x87\xe0G\xdfF\xc5\xb8\xc3\xe3\xc8\xa8\xe2W\xd3h>\x14\xf2dHb\x9c\ -\xe4\xc7p\x92\xf5\x86\x8d\x18?\xae\xe4\x13D\xfeS(\xdbp\xe8\x15K\xd2\x925\xaf\ -\x94\r\xb5\x99\x9d\xf6\xc1\xa0\xaa#\xdb\xa0\nc\x84M\xd8\x07\xc7\xceB\xe6zJ\ -\x15\x95#\x1b\xa5WN\x9b\n\xaf\xefy\x90t\'\xb3\n\xda/I\xcc\x92\x0e\x0c\xcae\ -\x05\xa4\xd4[\xb3\xd6\x85*\xc5\xe7\xfe&\x8d\xc3J\xf3\x9cf\xff\xb8Y\x1fb\x14~\ -J\xdb4iX(\x94 Qh\xb2y\x03\r\xc74\xd2\xef\xcd\xb2\xcc\xc5q\x03j;\x8dB2\x10\ -\xcb\x16\x9a\xc1\x8fY/\xb4\x1c\x1e\x02\xe6GA\x15\x13\x129\xe3\xba4\x15\x83)i\ -}B\x97\x82\xd6G+\xc8J-\xc8\xe4T\x97\x8dR\x85\xd2\xe2\x15\x04\x05\xde6\xe5\ -\x13tF\xfd5\xb1\xf8\x0bT\x8c\x1b\xb9\xee:Be\xa1W\xd6\xe8X\xebIM\xe9\x9a\x8c\ -\x11+\xf7\xa0I\x0fb\xd9(U\xa8!O%\xac\x82\x1ftF\xd9\xe2\xdc#\x16\xa6\xa4nd\ -\xbe\x03\x16\xf6H\x11\xf0R\x1b\xe7\\\xd8\xb0P\x9c\x14\x0eX\x18\x92\xc93\xc9}\ -\x9c\xfb\xbb\rq\xe3|\xec\xe2(\xd8\xd6XU\x80\x1ed\x91P\xf2\x85n\t\xb5G\x91\ -\xb4\x10\x83.H\x18XBg\xa3\x8a\xc7\x86\x85\x93\xa2\xb6q\xe8l\x08\xb1\x91\x0b\ -\xf0\xf4\x0b\xc9 \xdfgm\xb1\xd0\x07\x93\x8bAA\x15\xfb\xb6l\ -\x83*\xe6\x9bq\x0c\x1c?\x87\x08~oI\x06\xd1\xae\xbc\x89\xe58\x88\xc9\xeb\xb3n\ -\x89\x85\xa6\xc1S\xe9Q\xc5*i(c\xa9K\xbd#-\xb8\xe8\xa7=\xa2\xf6,\x96\x03\xa3\ -\x8a\xf7\x0e\xaf\xa0\x82\x18\xd4!Y\xd8\x97z\xd0Q\x97\x18$\x146b\x90\x86\xd3t\ -hA\x06}o\xf1\xd0\xa1\x17\x9e\xd1\xcc\t\x03\xc6\xa5\x8a\x85f\xe62\'\x1d\xa4D\ -\x8bOr\xac/\x14zZ0\xddf\xe8\xb6\xd0\x9dl\xaa(g\xc4\xd1+w$O\xbd|\\@\\\xf0a\ -\xe1B\xf9\x1eir\xe8\xb4`\xbe\x91t\x18O\x86\x90\xb8\xeb8\xf8\n{H\x15!\x1d\x16\ -\xfd\xbe\xd3\'~l\x85\xd8\xc8.\xf8q\xe7r\xa3\x109\x7fh\xd1\xd9\xc3\xde\x80f\ -\xff\xa5aP6\x10g6|\x06\rq\xb9\x9d\xf50\xf4n)\x9f\xa0\x89\xdah6\xd0\xd0/2X\ -\xd1w\xcd+\x83\x9e0\xab\xb1_h\xb2\xfbckB\xb2p\x95x:q&\x10\x8e\x1fh*\xfdb2\ -\xa6\x03\xc7i\x0e`\xa1\x9d\xf7\x07T\xf1\xd8\x92\xb4\xc0\xac&c5-\n\x9c/w\x01\ -\xb6\xa9\x0f\x01\xbb#_\x81<\x9do1\xd7\xc7\xb4N{\n\x1d\'u!\xf9\x11r\x1b\xd0\ -\x82\x7f`W\xf6\'\xb0\xb4\xaaY\x1b\xc4\x8f#\x12[inci/\x94\xb2\r\x9a\xfdq#\xb6\ -\x1c\xdb\xe9\xc16=\xedb\xef\x17PHvM\xd9(ql\xd0\xbc\xe2\t\xe9\xe0Q\x85\xd6\ -\x96\xafP\xc5\xfbJvK,,\xb0\x1b\x86\xfd\x01Ux\xa1\x9c(<1%\xb7K6\xc4\x92\xbaWd\ -\xa3XA\xae|\x85*VigO\x06iJ\xd3\xa0\xd2q\xd2\xcf2\x88\x9c3R\x14m7u\xa0\x9eOy\ -\x15Bc+y\x8by\xd8b;\xcd\x82\xb1\x84\x94\xb6\xa8b\xa5i\xa3\xe8\xe79\\\x04\x1e\ -\x8cw\xdfC\x1b\xcf\xb6d!M\xd4\xef\x12\x87\xf8\x18\xeb\xd4\xf3d\xb7T\xe1\xc4\ -\xd0\xc7\x8a\x01&\x8a\x0f\x8b!\x8c\xd5\n\x8a\x91\x9fA\xa7k5\x8dN\x9cq\x81U\ -\xa86\x0c*r\xa1\xf6P\xc5VS1H\x07\x1e\x96e\x9b\xa4\xd40\x9d\x80\x85\xbf\x03\ -\x9e\x17\xbc\xb2\xda\x85\t\xe8\x0e\x88\xb8\xf7M/\xc2H\x1a\xe2H\xfaL\x1c\x9b\ -\x14\xc3>\x11\xf75\x91\xafP\x853\xe3\x18U(#90Z\x96o\x95|\x82\xa8\x8dH\x1d\ -\xed\x0b\x81B\x8bN%O^\xaf\xdf\xf3i\x05}\xc6\x82\x91zahA\x85ck\xed\xcd\x91\ -\xb4PE/\x90\xdd\x12\x0b7,\xc91\xaa\xf8\xe2@\xc2\xb0\xd4>\xa6\xbd/8\n\x0bg\ -\xa5$3ab\xc3LX#\x9d.\x13:\x1dU|\xee\xca\'Hl\xed\x8e \x93\xb31\xad\xb1>-\x07q\ -\xe2`\xd1\xddc\x8d\x8d\xd9(R\x9aF\x05\xbb2\x98\t\xbb\x01\xc4g\x81C\xab\x08\ -\xe54PE.\x97\xc3\x90\xe6\xe5\xa7\xc3\x92\x1f\xf3rI\x03\xebe6\xfc0\xab\xb36h\ -\x1a\x9c\xae\xa4\x85\xa6\xe1-\x91\xe3\xa0\x8aQ(\xc7A<\xfdn\xcb6\xa8\xe2\xc2\ -\x82\x8b\xd1\xc2Q\xf0\xc7\x85,L\xb1\xb3\x1f\x1a\x9eN&\x13\x7f\x02\xdb#\xc2\ -\x91\x94\xd3*\xfcg\x8e<\x02\x13\xa1\xc1\xfa\x8d\xd2\xbb\xd4\xc2Y\x99\xe3\xdc\ -_\x81\x0fe8\x04\xc7\n\xf2\xb0\n\xeb\x16\nZ*\x1b\x85,\xbciv\xa5\xeb\x8a\xcd\ -\x00\x16\x96\x90\x0e\xe3\x94\xc8\xdf\xd2\xb0\xc5\n\x8f*65\x1ck9\x0c\xefa\xd3\ -hQ\x14\x16\x1cU\xbf\xd8\xd9\xe5\x92A\xf3\xcf\x1cUX^\xcfK\x9b\xa1\xf7\xa8\xdb\ -\xdc\xcd\xc6\xd4\xe8\x19\xc9B?\xb5\xd9\x8dM\x82\xde\xcd&`\xe1\x87\x16\xf3\ -\x14Z\xf02\x1c\xbbu\xa1\xc3\x02\x1a\xbd?\xc4\xa1\xf5=\x91O\x10\xd7\x97U\xd9\ -\x0b\xbc_t\x12\n\x16\xa3"\xa3\xb3\xc1\xc9-\x08\x94#G\x8e\x94*\xe6M\xd9\x06M\ -\xd4Z\xd3Fa\xe5>\x04\xec\xf1\xec\tZ\xc9Q \xb9N\x8b\x7f\xde\xc2F\xee\xe1\xe0;\ -+!\xc6YO>\xef\xd0T\xbalWv<\x96R)Ul\x87\xbc\x1c r\xda1\xce\xfd\x01\xdc\x1d\ -\xd7\x95l\x14\xfeB\r^\'\x17\x07\xce\xc1\x88\xa9\x85\xf7\xabOm\xf4r?%j\xd7\ -\x1b\xf2\x87\xf9 \x05\xf9\xdb\x06\xcf-N\x8f.[\xd1cT\xfc\x9ab\xdf\xb2M\xf8\ -\x89\x8c\x91\xa1TX\xefJ\xc8\x8f1\x0e\xf1\x1e\xc9\xb1\\\xea\xa7\xa3)\xb9\xd3\ -\x8b\xd4\xa5\xf5\xf1uJ\xa6W>\xe9\xc3\xb5G\xf2T\xa8E\xa0v,\x97%\x8e\xe8\xbf\ -\x92ZTl\x07r\x1c\xb4\xc6\x86\r\xb5i\x91\x0e\xf1\xc4\x06\xd6\xe90\x85M\xf8n\ -\xf6\x04U\xac\x90\xadn\xfb\x16$\xee\xb4\xc5S\xc9\xce\xd0HvK\x8bN\x89e\xa3T\ -\xb1\x14\xf2\xbc\xc0\x16["\xefWo\x90\xe3\x89t\xf6\n\xf1t)\x86\xef\x82Ms\x8b\ -\xb4\x9c\x9e0\xb3\x89\xc9\xbb6\x13\x07\x17t\xe4\xc9F\x89\xeb\x0f\xac\xa0A\ -\xe9\xfdg\xce\x81\x1c\x9b\xe4v\xb3+\xdb\xbc=\xfa\xd8\x84\x8fm\xf2\x9e\xe7ch9\ -\xbdY\x1bTqA\x15\x8e8\xc6a\x04\x90\xfb8\xf7\x86XR\xc6\xec\t\xe2\xd8\x92.\x89\ -#\x8eufO@s$\x938\x1f\xf6\xe1>\xfe\xa3\xc9F\xb1\xc6H\x16\xa6\x99\x85-6\xc2a\ -\x91\x0f\xc0\x8fs\x12\xb0~\xdf\xc3\x11\xbd`\xf0Z\xc7\x1a\xb3h\x1a2\xa1}\xd2\ -\x1a\xb3iI\t\xc1\x87\xf0B\x9b\xb7\x98\xb0p)@Ej\xe0X\xa8\xa3D\x8bO>\xb6\xbc.4\ -\xf46\xa4T\x81\xf3\xf6O%_!\xe2\x96\x15\xd6a\xb0>\xb6\xc8\xde\x17\xda\xbaEO\ -\xdc*\xb2\r\x9a\xec%\x07fS\x8e\n\xcd\x95\x03\x03\x83f\x03#~\x9c$\x88$\xda\ -\x109\xf7\xcd\xd9 \xb4\x11\x07~\x98uRXm\xa1(\x12\x83\x9eu\x88q\xf6\xd3\rM\ -\xf9\x044\x148\xcbs\x1f\x96\xc5\xcd\xec\tb\xe1\xa9B\xbe\x0b\xb1^\xa0\xc2ud\ -\xb7T\xb1k\xf0H\xa1\xe4}R\xc9\x8b\x9f\xa7,\xf9m\xf9\n\xc2>\x1d,\xfe\x1c\x82\ -\xbe \rV(\x92Cbrd\x91}\xdb\x1fc\x13\xdad\xac\x8a\x9d\x8f\x8a\x82\xddr\xfd!q\ -\xec\x9e\xcf[\xf1?R\xf2pz\x08\x89C\x1c[\xa1x\xe5@*\xbd\x7f\x10\x91H\xd9\xae<\ -\xd3\x10\xb0\x1bB\xb0E\x1d\xec\xfd\x01*6\xdb\xb4>\xc4\x96#\x8e\xf5IeI\'}\x98\ -\xe6\xdfK\xf9\n\xb1\xf0\x98\xbc\xe7\xd6x\xd0\'~\xa404\x0b64?\xc2\xc0\xf3lT,6\ -mx\x96\x10\x1fP\xf2(^\x99\x8f\'\x16-\x98m\x12\xb0\xe3~\n/\xed\x84T\x85\xfe$\ -\xed\x11\xb5\x1b%\x8c\x80\t\xbc,\xdb4\x0e\x7fh\xa5T\xf1\x97\x0f\x0b\xcf\xa7n\ -\xaf`G\t\xbd\x99&\xaa\xa2\xfd\xe2\n\x05\x9e\x9e\xd8\xe10\xc7\x00\x1b(nX8\xc8\ -\x8b\x0c\xe2\xf3\x06\xc1\xd8t\x8c\xb9\xdd$\x7f\xb2-TZ\x9a\xb9\xcd\x88\x99\\ \ -\xa2\x19B:\xa4Y\xd1\x88-\xd5\x95\xdd\xd2+\xdf:\xe0\x98\xe5\x13\xf9\x06I\x87\ -\xa2\xe8\xc1\xcd\xb0\xa3\xc9^\xa8B\xe7\x10\xa7\x0c?\xc960\xfb\xfa\x88_A\xc5&\ -G#-\xf8\xe8\xbb\x0es\x0c\xae\xac\x81\'_\x81\x13a\x04\xf3>\x85R\xb3C\xde\x9e\ -\xd4w\xe1\x93\x0eCI-\xd1\x12\xd3\xc0\xfc\xbc\x80&\x1d\x90\r4\xc8X\x16\xc6R\ -\x8cC:,\x92\xd3\xde\xaf\x0b\x89\xbe\x08q\xe4\x1c\xd2\xa1oA|z\x88\xbf|4\x11\ -\x14\x1e@:\xa4!/\x07\x98o\x8b\nB\xbe>\xbb\xb1\xc9n\x18\x08\x1d\x86*6ln\x94\ -\x14\x92\x7f\xe6\xa6\xb2Q:_\x8eKYA\xfc\xc8(\xa2i\te\x93\x16\x8c\xab`%\x8f\ -\xb1\xb4\xe7g\xbdP\xc5\x9e#{\xa16\x9eI\x06\r\x85\xb6E<\xfd\xdd\xcc\x9c7\xf6\ -\x86.\\\xbf\xa1l\x03\xbe\x8bJ\x8e\x03QQU\xb6A\\\xbf\xb7\xe4+pC\x91\xc8\xe9\ -\xf9\x1c\xd3Zg\xcf7\x1f\xc0\xab\x1aw\xeb\x81\x85\xb3W\x88\x85\xbbT\x91\x0b\ -\x15\x8eD\xdf\x06\xcd\xad\xe3Zp2\x15\x88\x04\xa4\xcc\xa0+\x07b\x9cC6\x07&\ -\x82\xc2\x0e\x14\x92\xcf!\xb6X\x0eeb\r\xbb\xd2\xf1<(h\xbc\xa3\\\xacuG\x01vc\ -\x027\xe5\x14N{\xb1\xfc\xe9\x89\xf3\x11\xa4e\nY\xf8F6\xa1\'\xe4\t=\xb1\x80\ -\x91\n!<\xa1\xc9\x86B\xd2\x13\xc2\xb1\x99\xec_d%\xb9\xc2\x8c\xa2\xddp\xa0A\ -\xd0\x8f\xa1\xb0\xfel\x86\xee\x0e\xdc\x01\x8c\x80g\x0b\x9a\xf4dB\x0c\xd2M`YX\ -A{*\xe5\xd0!\x83\xe8\xd0\x1a\x17\xfe\x181>\x86\xd0\xf4a&\xfc6\xe5+4\xfbiC\ -\xed8\x15:,\xac\x02\x9aJ\xc1C\xb8\xc2\xb7I\xdb\x1aKmk@\xd6I_\x88 "\xff\x96\ -\xf4SO\xcc%t\xdc\x08\xb1\x13\x17\xeaW\xe2\xca\xa1\xd3\xec\xafq(\xbe\x0f\xe90\ --\x11\x14N\xb1\xa3"\x04Br\x0f\x9e\xab\x03\x97\'\x1b\x1c3K\x00d\x06`\xd0m\xc8\ -\xc4\x81A\xc70V\xb3!\xc2\xb5\x17\x06\xf6m\x06#\xe0\x17\x85\xaf\x85\x06\x0b\r\ -e\xb9\x8b\x80\x7f\x0e\x93g\xb9y\xc5\x9bx\xbeK\x15;\xa4\xd1\xfb\x93\x1c2\xe8>\ -\x90\xd4B\x06Qp\xc9\xcbzP7^H\xb0yB=\xc7\x81\xc3\xb1y\x07\xda\xc5\x84\xe3\xfb\ -,q\xbf\x91\\\xb7\x866d\xd0x\xfa\xd4\xc297F$`\xaa\xc0\xe3<\ -\x80\xd8z\x8a\x81T\xb1\x10n\xb9\x0f\x81\xa9\xe1\x08\xde;\x92\x96\xbeP\xf2\ -\x88\x85\xd7\tp\x06\x16V\xe1\x8f\xd9T\x12\xc7\xbe\x06\xb2Qz\xa2\xb2%\x0b\xe9\ -\x89KR6\xfd\x9c\xa3\xd5m\xb6\n\nDh\x86]\xe0a\xc6p\xa7_\x98\xb2\x82\x18T6<\ -\x1d\xb8\xbe\x0f\xdb\xf4\xa4\x92O\x00q\xe7\xcaq\x10\x83\xfe(\x88x\xf7\x80\ -\xb8\x9b \xb0\x9c\x8d\xa1\x07\x1d\xb9\x10[lgO\xc9/%\x848PH\xf3S\xec\x86\x14\ -\xbba\x9b15\x85C\x03\xd3C\xe0al\x98\xd5\xef\x19\x12\xd0\x83\xc8\xf9\x12\xcb\ -\'h7\xfcv\xe4\xd0i\xa4E#\x82=\xcfs!\x1dF\x16\x0e-\x0b\x03\xdb\xb2(\x82\xe7\ -\xb2j\xfd\xbb+\x89\x83\xa3\x8a\xe1/^N\x90\xb3_\x01D\x1f\x03d6`\xad\xf5\xd8Qe\ -+\x98l\x17g\xe5G\x15H\x95\x02O\xb8dX\xa5B\xed\x81\x82\xd6\xe6n\xb1\xb4\x1f\ -\xe8\x04\xf2\x85*\x89\x88\x15q\xcc\x16:\x1d\xc2>\x89l\x94*,\x03\x90\x91\x0c\ -\xc6\xc8+#\x00\xd2\x01\xcd\xedE\x0b\x12f\x80\xf3eBaRo\xd2C\x1c\xe8m\xd6\x06l\ -d\x12\x17\x9e\xcfN\xea\x08\xd2aP@\xcb9i\xc9i &\x17\xd0O\xebB\xa7\xd8\x08\x91\ -U\x0e\xd7\xe6&\x02\xcb\x03\x88\x0b5B\xb4\x9a\x97\xf6+\\\xe1\xd9\xd8\x85\xb8\ -\x98\xf5\x02d\x86)GJk}\xc7\x90\xaf\x10\xd7_t\xf9\x04U\x98.@G\x16\x16\xbf\xc7\ -\xa1V\x0f,|\xa1\xa1\xd7\x81\x00\xe2\xd8\xaa\t(\x0f\xebt\xbb\x1d\xd9\x0bU|+\ -\xc9\x890\x19\xc0#\xf0c\nx\xe5\x10V\xf4\xd9\x8c\x16\x84\xe2m\x80l\\\xbc\xf2\ -\x13v\xb6t\xdc\xed3\xc8\x86\x81mG\x8c\xebK\x81\x88\xb8\xb2\x00\xe5\xe1\x98x\ -\x8746\xd7\x9d\x80c\xfa\xac\x17h\xd2\x90\xa7\x1e\xcb\xd3-\x151`\x07N\x95\x17\ -\xd9-\x18\xf4\x87qJ6\xce\xa8\x96d\xb2G\x1c\x0b\x03\xf9\x04q\xac\xd3\xc2\xf9\ -\xc2\xb0\xa4\x9e\x83\x80?k}\x1fuY\x81HQ\x17Q\xd1\x14\xd4\x8eT\x84}\xfap!\r$\ -\xd7=\xaa0u\x88`V\x14\x97"9t\x1c\xe2\xae|\x82*\xde\xd1Ih\x8dS\x8eV\xb7\xe48\ -\xe0\xd9,\x81\xbaaUr\xd3\x86\xdaS`\xd1\x998\xe6{\xbc\x91\xbf\xc86 \xa5\xbe\ -\xaa\xd8\xa6\x19\x96\xd4\x90\xc1>\x19\xa2\xb3\x1b3Z\x10\xaf\x8c\xa1\xd4L\xc0\ -\xb1\x96)\x1b%\x01;&\x1bh0\xe9aI\xdd\xc9%\x05\x1b9\x9b\xb5\x01\xf7\xb1\x0e\ -\xa9\xcdp\x8f}\x12(\xeex\x02\xf7q\xd8\x91\xd4\x12\xd7O`\xcf\xe5\x13D\x9b\x1e\ -I\xe2\xf6\x86\x8c\x93^ q\xd1\x1f\x8fm\xe2\xa9\xab\xb25\x0fo\xf1\xb0\x99\xec\ -\xc2\xcd\x0b\xc0p\xe2\xb6$\x9fx\xea\xb5\xe1\x98\xb1}\xec\xdb\x0e\xcf>6\xf23\ -\xc3=\x86\xa8\xd0\x1d\xe8\x1f.\xef}W\x0e\x1d _\x96tcF\xfd*\x08\xe7s\x1c\xf9\ -\x0b\xce\xfd\xc2\x87\xb9\xf2\x1e\xde\xd1\xfe\xc0\x87s\x87qJ\x1c\xb1z\x0c\xe4\ -\x134/:)\x02\xde\xb8\x07]\xea0\x82\x97\xd6\xc2:5m\x9c\x84)v\xa5\xe9\x01\x1e\ -\xe5\x81\xa7k-\xd9\x0b1\xa8\x8a\x11\xd3\xeaC\xf4\x1dN)f!\x0c:\xa2eU\x95OP\ -\xc5i\x8b\x99<\xa6}\x9b\xcaF\x19\xa6\xa5\xd1\xf1Z\x17\x12\xb0:\xb7\xc1\x08U\ -\x8dW\x10B%W#\xc91\xaa\xf8f\xcaW\x88A\x89.\x9f \x06\xad\xcc\xc6A+9\xa8\xe4+\ -\xc4\xb1s\x8a\xbc\x8fe \xe4\xd2\x00\xf8\xc9\x86M\xb8JaA\xcbv-Z\xb8_\x0c\xc4\ -\xc4-\xa8\xa3/6\xaf\x0f\x86\x89+8=r,\\C\x97\x8d\x02\x03\xef\xc8\x91\xc2\x08 \ -\xf5k<\x18b\xa2\xeeg\xbd\x10O\x17I\xd0\xa7R\xfb\x94;Kv\x0b~\x18\xf2\t\xa2\xd6\n \xd8|\xf0\xe3K3\ -\x0e7s\xd8\x1d\xf6)f\xc5\x08\x06\xde\xd8b\xe2 \xfaZ\xe4\xfdrk\\\x16m\xb1\x0e\ -\x85\xd1\xd31\x96\xd4;\x08\xa5\xdc\x86M\xb8\x1e\xca6\x80\xfe!\xdfg6\xb4\x10\ -\xb2\xd9!oqj\r\x11\xf2\xfd\xc41\x0b\xf6\x08\x94\x8cSr\xb0\x82\x0cW6J\xcba\ -\xbb\xa4\xb8G\xd6\x07\xb5\xd7SH\xfe\x14fB\x9b4Gw\xec!\x18\xbbDX\xda\xc1\xb8o\ -\x83\xda\x11\xa4e\n\xf2\x1dF2\xf5q\xf0\xed\xb7\xb9\x8215\xba\xec\x05\xfe \ -\x87\xa5\x14\xa6\xf2\xa8#i\xc1U\x95\x08\x98\t\x17\xb4\xd8\xael\x83\x9eX\xeb\ -\xc0\xaf\xeda\xb2\x17\x08\x8f;\x988\xd8\x1ef\x05H@\x06\xab \x9b\xbdB\xe4_\ -\xb8\x10\x17C\x00S\xbe(\x08\xd7\xba\xd0\xa5\xaeh^\xec\x9c#4#\xc6)e\x08_\xef\ -\x93\xa2(6:\x9c\xa1\x03RG\x85,`\x14#\xf9\xb5{u\xa1^L\x1e\x18\x88\x8b\x19\xdb\ -c\x81\xb8\xdf.6\xe1\x18\xc2\xf1\x17\xa3\x90X\x95\\\x83\xfbg\xc2\x18\xa3K\x92\ -AN]\xc8\x01\xc0\xf0\x86>\x0e\xbe\x83@vKO<\x98\xb2[\xc0^g\x15 \x7f\x8ahB\x1f;\ -\xfbG\xc3\x0f\x7f2`\xf8\xfe\xfd\xec\x15\xc0\x92\xda\xd8b>\x96\xd4)[Z\xc2\xfa\ -\xa2\xdd` :\x9bCw\xe8\xcc\x06F\x15\xd7\x1ab\xe2)N\xa0\x1et~\x97yzb\xf0\x13\ -\x08NOu\x9e[\xf8P\x16I\x06\r\x07.6\xd0\xb8\xa4+D\xf9\x04\xd7\x7ft\xc4\x92\ -\xb2>\xd4\xafO\x14J\xf3\x84\xf6I[\xec\xb4\x94#\xa5i\xd0\x08\x99\xd1\xf3\n\ -\xa0\x7f.\x08`\'\xb4@\xc4,\xae"\x16(@d\xb6p\xa9f8\x84\x05\xfc\xb7\xcd\xf3\ -\x82 \xd7\x1eod\x96\x96{\xba|\xa5 \xa3\x88!V6\xa2\xf7\x17\x08\x92\xe7\x0cy\ -\x7f\xe3\xe0\xa3\x03l\xf1\x1f\x8bG\n\xf1\xb9\x90@\x180\x94\xf8\xa7\x9c\x17\ -\x1cI\xbd\x0e\xe2\xb7y\x9f\x88\xbb\x1c\xc9n\xa1\x9eSlm\x92r\x0c8\xed\x00\xa8\ -\xc3\x17\x1e\xaa\x00\x11^\x0b>\xe9mI\x0b\xa2\xa2\xeb\x8c \xcaPaN\x11\xe0\x1e\ -b\xd1E\t6\xe1\x00\x9b\xf0\xbd\x0e\x17\x01\xdb\xb7\x86E\x9e\xef\x01\xef\xca=\ -\x1b\x18V\x0e\xb4\xa7\x0cmb\xab\xf1x\xd6\x06\x0cM\x86\x04\x08u\xb4\xe1\xe9\ -\x90\xb0\xf8cq4\x10\x0b}\x169,\xb5\xa7\x11@G\x96\x03@j$\xc9\xa7\x8ae\xf8\x0c\ -\xfc>\xb8\xbedH~\x00+\x19r\xa3Xt\xaf\x1a\x8f\x14\xc2\xe0\xbe#{\xc1\xa2\xb3d\ -\x05\xad\xa0s\xf2\x08\xa4\xbe\x0f\x07\xc0eG\xb6\x81P<\xcd\xed\xa0`8\xe1;L\ -\x83\xe70~\xcc\x96\x8dR\xc5\x83\x83\x03\xc7\xe3\xcb_\x0c\\r\nZt]FT\xb9pw\xdc\ -\x10\x0b\xb3\xa2\x8fM\x98L\x11M\xc8\xe13xVp\xe0\x8c\x11\xf4\xfb\xd8A\xa4\xb9\ -\x07\xf2?\xd8\xb2\x17b\xd0\xde\xacQ\xe2GoVA;\xca(e/@2\xb5!\x1csH\xfe\xe7\n\ -\x91w\xf6\x07i\x1an?y}\xaa\x08\xa6X\xc9\xec\xc5\xffD\xd8\xe2q\x9a\xc2\xe4y\ -\xaf\xc8FiI}e\x9d\x8eW\xa1\xcd\x91U\x04\x97\xe6\x165\xde@\xf0\xc2}\x89\xe48\ -\xe0\x0b\x06\xb0m\xe0#\x92\xf8\x8d\x01T.\xf4\xd3{\xba\x96\xe5\xba6\xec\xcaO\ -\xe4\xda\x13f7\x14\xf8\x83\x19\x93\xa9\xe2/\x1f\x9e,\x0crF\x97\x8e]\xa8\x1b,\ -\x1d|H\x87\xebXvK\x15\x7f[<\rPi}S\xf6\x82\x1bC\x8c\xa8\xe2\x8bl\xcf\x0co`\ -\x1d\xb77{\x85\xa6\xd2\x94\xe4c\xb2S\x1b\x12\x97\xbd\xd6\x9d\x08\xb1h\x0e\ -\xe8^\xd3\xd0\xc7c\xbe\xc4\xfa2\x05"s\x0c\x00\x95J.\xa4\xbe\xeba\xb2\xcf\x19\ -\x1e\xc5:\xee\xc8\x83\x8f\x8d}\x8e\xa7&\x0e\x8b1\x0c\x89\x16\x8b\x9c\x02"\'\ -\x98\x8d\x03\xf0l\xc6\x19\xf8\x90\xc9\x1fX~p\x94\xb8\xe5\xc8\x95L\x15\xbb\ -\xa5l\x83fN\x0b\x11G\xe6\xdb\x82\xd3\x04\xb0\x02\x1b\x0e\xc4\x16C\xac<\x9cs!\ -\x00\xcb9\xbb]JDW\x86|\x91\xed\xcc\x95\x8d\x02kM\x9e\xbc|\xe2@\\<\x00\xcaSd`\ -aF~\xed~\x96B\xe7\xff\xce\x88*\x0b\xc2\xe0\x9b\x8a\xd8\xc9\x00\xb4h\x1d\xb6\ -\x1ayi\xb3`KaX\x9d\x03D\x91\xf2\x1d\xde[M\xb6\x01\x9fR\x87\x99\x0c~\xfcV\x11\ -\x9bg\xb5x\x01qS\x97q\x17\xb9J\x10^!\x84qW\x14\x17\x1d\xc5Pi\x05\rY\x8e\xf9}\ -\x04B\x1c\xd9\x0b\xf1\xe3\xdc\xe0q\x00P\xf61\x94O\x10\x83\xfe\xda\x17\r\xc0\xa3\x1c\x1c\xf3\x93P\xce-Ux\x04\\\x9a\xf8)n=\xefZ\xf2\t\xe8c\xb6\ -l\x03\x10\x89)\xa0^>\xe6\xf6\x83+\xdb\xa0y\xd9\x9d\x92.\xe5:pC\x15]\x80Jr`Y*\ -\x866\r`\xf2\x1c$\xc0\xe5XCb\x90F\xd2\xc1\xcd8\xc0\x9dw\x00+\xc8\x11o\xd8p\ -\x00\xc2\xf2`\xdf\xfe-e\xa3\x18\xa9\xc2;\x1bb++\x01:\x1a\xc3:\xa9p\x015e\xb0\ -\xf1\x18\x08Da\x02\x02\xae\x0e\x18\xf0\xc0\x05T\xe3\xd5\x82\xe68\x06\x0c\'6\ -\xb9[l1\xb3\x91\xb8\x9e\x9f\x8f\x018\xb4\xc98\xcbz)\x1c\xdd\x03Zt\xf6x\x00\ -\xe2^\xbb\xf2\thl\xb8[-t\x1a@\xbd\x88\x85\xc3\xc2\x07\xd4k\xd3\x05\x00"\xc3\ -\x19\xf5\x9b\xfc\x85\x03\xdb\x87\xad\x9e3\xdeA\xa6Qp\xe5H\xa1*0\xaa\xc2\x83\ -\x1f&\xc0\x81c38\xdfC\xc0.OaG-\xa8\xe0i\x06,\xdc-\xbd"\x94\x07\xc4N\x9e\x811\ -\x12Z01h?\x06p\xc9\x87\n\xb7\xac\xf34`%\x7f\xa2q\xd8\x19_\xa8\xebP\xa4\xd9\ -\xf2{p\xa8\xbe7\xb0\xf8\xf9\n\xa2EW2\xdd\xfe\x18\x17.7K\xa4s\xe0D\x0bk\x91|\ -\x85\xa8\x9d\xe8\xf0\xb0Z\x90\x0eq \x9f -G\x8f\x01\xc4\xe8#6\xdfn\xe1$d\xcc\ -\xd5o\xba\xbc\x91:\x03x\x9d\x8e\x02r\xa9\xd5\xff#[]\x87\xc4e<\xffn\x04\x9c\ -\x01\x83\x05\x8ft\xd9-\x90\x08tD\x17V\x06\x8f\xb3\xee\xca6\x10\xf43\x81\x0f\ -\xb2\x01|\xac\\H\x07\x8fU\x16\xda\xfb\x960\xc5pG\x93\x93yHW\'\xa3\x19XstJ\ -\xd9(\xa0\t\x01\x10D)_\x98\xb2\x80\xd9,\xfap\x0e\x93\xd8\xf2&\x0eB\x8b\x87\t\ -!\x00\xdc\x1c\x1c\xd3\x01\xe6\xf0\x19zo\x07\x88\xde\xf7ph\x1d\xc7\xb2\x17j\ -\xe3\xc0f\x9eB\xe2\x06\x14GN\xc7|\xbdc\xcc!=\x1b\x97\xcf\xdb\x1d\xd8\xd9\x19\ -\xf4 eF\x1cp\xe3\x0c\x8f\x12\x9aac\xbf\xfc@n\x86\xb1\x85+\x11\xdfb90b\xf2\ -\x11\xed\xfd\xf1\xa4\x8f\x8b(\xc7\n\xd2\x8e\xb0\x13\xb2\xe0t\x0e\x9c\xbbc\ -\x91\xf7\x0bG#\xb7;\xc0K\x15|c\xa8\x04>\xc8a\x9cc%\x9f \xe9\xf0\xcd\x91\xe3\ -\xa0\'\xa6\x1e\x04\x1b_\xbcx\xd2\xb1\x1b\\\x9c\xb7\x8b\x1d\xe0Pl\x9c\x95\xef\ -\x81\xec*,T\x1c\xcc*\x80r\xadx\x1c8\xc5t\xbeI\xce\x92NG\xb8\xa5`\x8c\xa2>{\ -\x05\x19SF\x88{\x0c\xb0\xb4+\x13\x99[8k\xc2\xa6J>\xd8\xbc\xc0}\xe4S\n\x94\r\ -\x84\xe5\t\xd7^\x07\xc0\x14v\xed}%\x7f\x90/\x15\x92S\x0b\x82m\x82\xb3r\x81\ -\x01\x98\x19\x9c*\xbfB\x8a\xbey\xec\xeb\xbbq\xe5Hq\xcbw\xd6hN\xf8dK\xbeB\xc6\x18\xf1}\xc2\x1bDE\'=\x84\xb0\ -\xdeu\x01)\xcaa\xf2|\xd4\xb0M\xfb8\xe6]\x03;\x9b3/X1\xc2\x93\x1c6v\xc8\xb3\ -\xe9x\x8cp?!\xd0\x91Sx\xd0\x0c6;\xb2\x17\xaax\r$\xb5T\xd1m\xf1\n\x82\xfa\x15\ -\x9a\xb2[b\xd0\xb3*\xdb\xa0\'\xba\xbal\x03J^\x89\x108\x83\x05\xd78w\x87\x05\ -\x19\x14\x11<\xcaI{\xf0\xb2\x9cU\xfc\n\xc4\xc5\x0exjs\x14\xf0\xae\xcb\xaf`Y\ -\x1a\x1e\xcc\xfb\x02\x8e\xbbuSV\xd0\x92\xca\x01\x9c.8\x1fJ\x01\xf0\xb5P\xbf\ -\xa0\x07q\x86\x10\x86\x02~\xe7\x10V\x0f\xce\xe1\x9f6\xd2\xc1\xb0.u\xd0\xe2M\ -\x88[\xbe*\x83\x9f\x06\x00?\x05\x16L\x1e\xde\xb7\xae\x07\x81\xd2\x87B\xf2\ -\xc9\x04\xc6\x88\xd5\xe2l\x04\xb0O\x06\x16~nF:\xe9Oz\xb0\nl\x88\x1c\x8f\xcd&\ -\xad\x85\xf3\x85\x91]G%\xb6i\x0ej\x7f\x92L\xae\xcfF\x80\xe3\x02\xc4\xf8,\xec\ -\xb9\x03C\xf6B+\xe8W\xcc\xe3\x80p\xbct\xe4\xbc\x10\xf9\xd7\xa4|\xf7\xc6\x9c\ -\xab\xe2\xd9\x81v\x91\xc3z\xddg\x00\x04\xa3\xc2\xfb\xa4\x18\x89#\x1b\x06\xde\ -\x02Y\xf3=g\x82H\xc0\x16\xa3n\x18Y\xee\x90\xb2i\xa7)t\xedW\x001\xfc\x02[\xec\ -F\x85\x1d\xe5\xc2\xe4\x99\xd7pX\xa4x\xe2\x94\x8f\xb51\x18\xb4\x1cs\x88\x02\ -\xe8\xc1\x96\x0b)\xe5Cc\xcb\xe1\xc8\xccml\xa0\x9dX\xb6\x81+"t\xf0\xa5\xc2\ -\xe2#\x06-\xaa\x00-\xf2\xcd\xfa\xaf\xb6\x9c\x06$X\xd2e\x05\x92E\x91\x9br\x98\ -q\xe6\x16\x8b\x8f\x02\x8e\xbd~\xaf\x10Wg\xb7\xed\xa3\x83H\xb3\x8d\x83\xef\t\ -\x11\x9a"\xb3\x91\xfb\x87}\xb0\x05$\x8c\x0f\xa3\xb9\xef#\xf6\x1a3\xc4j2A\x9c\ -p\x8a\xd0b\n\x85$K\x90\x88\xc3\x86\xc4]\xea\x00\xec3\x81\x8b\xf1\x13e\x90q\ -\xebB\x1a\n]v\x9a\xb8|gu\x0f\x9bPh[\xc0\xd1\xcf\x9e\x80c\xb7\xc5\xfc\xc0\xfd\ -\xca\x15\x15\xd2\xc1\x83\xcaR\xd1Z\xf7\xebB\xe7\xbe.\x9f\xc0-_E>A\x0bf\x89\ -\xb1\x81,\xa4\xb7\xe4+8\xf8\\SV\x00\x955\x1b\x07\xb10\xae\xe4\x13\xc4\xb1\ -\x1f\x1a\x1c\xcc\x03\x04\xdb\x16\x19\x92\xc8\x01\x99{\x8d\xcf(`\x8bW;\xccST|\ -\xb5$\x0b\x89\xc9-\xd2\xe8\'\xe3\x14,|\x88\x80u\xe2\x88\x95\xc6\x08\xb31\xdc\ -\xe9\xa9#\xdb\xa0\'\x16\x1c`\xae\x18x\xd0J\x80\xec\x1a#i\x95\xa7\xca\x81Q\ -\xc5\xc7J\xce-dr\x82d@6nN\xff,!\x0b\xfb8\xf8\x1em\xd9(n\x0bN\xb1\xc5\xc6\xd8\ -b\x19\xe7\x0f\xe2\xcb\x81\x7f\xba\xb8V1@\xa8\xe472\xc8\xb8\x03 3,>\x92\n`{>\ -\xf2I\xc8F\xd1\xc7\x91\x1c\x07=\x11\xd2&,\xf2\t0\x02\xb6\x07$B\x86\x83o\x95\ -\xec\x86\xf1\x801h\xaf\x15\xb0N\xec\xeb\xdbV\x801\x9a0\xda\x85\x0c\x9at<\xec\ -SE\xcfB|\x9f\x01T\x8b\x14L\x11\x87\x07\x16\xeeu\x89 (_\xdb[f\xa8F\x06\xa8FK\ -\x97mP\x85\x1fJ\x06a\xad\x07\xb2\x82\x96\xf6i,_\xa1\x8a3h\xd2\x0e\xdbb\xef\ -\xc8e"4#\xa8\x1b6i\xe3=\x99\x08\xec\xd5\x01\xe6\xca\xc6\xc2\x8d\\\xd9(M\xc3\ -\x072\x13\xc6\xee\x10\\_1%?\x80Pe$\x93\x07{?\x9cU\x00v\xc2\xf8\x8f\t\xc3M\ -\x15\xf9\x04\xad\xa0\xd76.*\xf9\xb0\x1b\n\x1d(\x02No\xf1.\x84;\x9d\xd5\xd1^)\ -+h\x05\x9d(\xf2\x15$\x9e\x88\x01~\xe2\x94\x87\xbb\x94\xf4.\xcb\'8\xc5\xb6\ -\x12`\x04&\x80W*\x14\x14\xf6\'6v\xb6A\xb0\x824\x1b\xe3"\x8a\xeap \x04\x07\ -\xdfO\x97\x17.\xebRmd;\xc9\x01\xe5\xf1\x19R4A\xac\xe0\'\x87\xe3\xfa\xf0\xa1\ -\x18\x8c\xcaJq4\x06\x0c\xb2\x91i\xbeb\x827\xf8}(W6\xdcr\x83\x1c\xe6\xec\x1bA\ -\xab\x1d\xaf\x0f/\xbe\xd1\x014\x81\x1d\x88k6\xc9\x8f\xba\x90\x0cb,>\xbb\xb2~\ -\xe8L>Gh\x12\x92tE\x0f\xe6\xec\x11g\x08q\x00\x04\xfdc \xee\xe1\x81\xc9\xc7\ -\x96l\x83\x9e8/\x99\x16\xac1\x97T\xc9&\xc2M\xc7I\x0ci\x99C\xfd\xda\x03\xd4K(\ -y\xb8\x06=c!Ux\x86l\x94v\xf6{S\xbeB\xcbr7A\xc4\xbb\x8f\xdb>O\xb3\'h\x9d\xbe\ -\xb5!\xd8\xfap\x99h\x81l\x14^|\x8a\xf2\x0c\xc6\x8cs\xccu\xc9Sd\x91\x00\\\xbd\ -\x18\xe38\xf9\xc6\xb1\x13\xce\x88\xd1I\x90^\xab\x0f\x98\xe7\x01+\x8a|6\xdc\ -\xabd\xad\xf5\x0b\xac1\xa5\r\x9cA\x1f\xcaD\xd0\x01b\xc6\x02\xb5\x1f8\xa7J\ -\x1f\x87\xc5wx\xbf\x86|\xb7\xa9\xad\x00\xf8X@\xfb\xcc\x19R4\x81\xfe\xb15B\ -\x1a\x16NH\xd6W\xe5+\xc4\xa0?\x0c\x80\xe0\xeb\xc7\xa7|\xa7\xa8\x87E\xd7bD\ -\x15\xbbK\xd78\xa5\x0c\'\x13\xebq>%\xbe\x94\x97"\xc0-3b< -\xcdp\x00\xdda~\ -\xf6\nUh|\xc3\xdf\x82\xed\xf13\x06\xde\x81\x95\xcd?!\x8cw\xc6\x19t*\x9c\xa6\ -\xec\x0b\x9e\xf2\xed|\x0f\xdes\x83n\xa6\xf8\xc3\x1c\x8e\xaa[(\x02\x16\xa7\ -\x93J\x1c\x08\x94\x02"gJ!_Kf\x91x\xc2\x19%\x14C8w\x14\xa0\x198k\xc2g\xbe\xd1\ -\xee`\xe1\xda0\xbddZ\x89\xb6-\x1b\x85\xdb\xb6\x02\x8a\x80\xef\x01\x7f4\x00mb\ -\xd0\x91n\xb1\xd4\xa6C\xeb\x9f9]V\xd05\xb5_\xae|\x05\x0b\x97\xe6\xa5\xf0}\ -\xdc)\xfaY\x01c4\x01q%4i\xd1-b\'\x9cq\xc9\x83\x16<\x84&\x9d\xb9\x8c\xc7\x8d\ -\x801J\xe1\x93\xbe\t\x10{e\x90\xde\'\x0b\xfb\x85\xa3+\xa3\x12>\xfa\x0c\x0c\ -\xfaQ\x01\xb9\xe3a\xab\x97\x80h\xd6\xce\x1cZ\x1f\x1a\xd4\xc0\x0c\'\xd0#\x07S\ -\xfaX0y({\x81\xbd\xaf\xe2\xbc\xcdp\xaa/pr\xb5\x0c7\xfd\xbes(>E\x08\xeb\xb7\r\ -\xa8\xb9\xe5\xd2\xde\x7f\x9b\xca\x91\x12\x0b\x15\xdab\xde\x90o\xa6\x1c\xb4\ -\xe5\xd0\x11\xae5\xe5+\xc4\xe4\x1f\xb1|\x027\x97fO\x0ch\xa2pf\x8f\xf9\xcc\ -\x8eG\xfc\n\xe6e#\x94\x15\xb8\xe9\xa7!\xbb\x87\x8d\r\x14xH\x9f4\x86\x0f\xe5R\ -\xe7i\x00B\xf5\xde\x91\x93\x8d3\x1b\xb4\xb8)\xce\xa8y\x9db\x8d\xbe\x8d\r\xf4\ -@\x1a\x8a%\x94M\xa4\x91\xe4|J}($;#\xc4\x80{\x8c.\xb5\xb0+\'\xd0a.m\xec\xca\ -\x14\x1c\xdb\xafd\x1b\xc4\xa0\xcft\x00\x8f\xf3\xb1\x87e\xa9!(\xd53\x086\x97\xfdt\xddP\xf2\x838vAk=+x\x05]\xcb\x91\xb2\ -}\x8b\xec/\x1e\xebA\x07\x0e$\xdd\x00\xfbv\xaa\x02\r5\x81\xf9vE\xf1\x97L\xecA\ -\xa2e3\xe0\xa1\xf3\xf5\xc1X6\x8a\xab\xa1p\xdd\xf4\xd9\x16{a\xacB\n\x0c\xfcH\ -\xe7W\xe0a=1\xb1\x91\xf9\xa6\x9f\xd5\xe1\x15\x045\xf0\xa3\xcb\xfb\x05\x91"\ -\xdf\x83\ng\x03\x84\xf5\xd8A\xd0\x8f\xb37\\\xc4@2q\xf6\x06\x17Y\x9b\n\x0e/|\ -\xabd\xb7\xb4\xc5n\x18\rU\x002\x92\xb2Ym\xc3\x16{\x9b5\nS\x83\xb3\x02r\x06\ -\x88\xd8\xe2\x03\x07\xbdx\xb3n\x89\xa7\xe7\x9c\xe4\xcd\xc5\x92\xda\xd1qXp~\ -\x87\xf5Y\x1bp\xfc{\xe4\x81\xaf\x0b\xed(\x13\xc1\xe9>\\Ho\x01+$p\xfdf\xa1\ -\x1c)\xe6\xc5\x91\xbd\xd0\xae\xbc*\x11\xd2\xe3\xc4h\xaf|x2\xf0`\xdb\x04n+\ -\x87\x8f\xeds\xc9\xdd\x02\xec\xf3\xd1\x92\xe4#m\x91\x03\xe18\x81\xa4\xf3\xc9\ -U1\xcc\xc6pU\xb4g\xdd"WV%\x1b\x05\xa49\x92s\x8b\x99\xd3\x90u%\x87^xc\xc9\x99\ -C\x88\xd3\x92\xaf \xc3\xa1){!\x16\xfe\xe4\xd8+gM\xf8\xa3\xcb6ps\xda\xc3-\xce\ -!4\xfa\xc1l\xa4\xc4\xe4k\x85L\r\xbf\xef\xa2B\x05~,\x87n\xf9\xd9\x95mP\xc5:y\ -\xbf\xea\xdb\xd8\xf0}r8\x9f\xb5\xadKz\xc5\xeeO\xa0mM\xa7\x80\xd0\xf8X\xfc\ -\x01\x9c\xd49\xa7;\xfd\xa9\xc26eL\xef\xd4D^\'\x1bG\xe3\x0e\xe3\xa5\n\xa8\xc5\ -{\x0cJ\xb3\xb1\xe8\xfe\x98\xb2\x17\\#\x98"\xe3\x92\x8b\xd8|\x1f\x9e\xef1\xfb\ -`+\x05AaN \xe3\x838G\xc4\xdeH\x0e\ -\x1d\x80\xc3@>\x81$\x1a\xb1\xac\xc0\x8e\x8a\x81\xba\xe1\xc3b7\x06`\xc8\xe7d@\ -6;\x11P\xf1\xd7EV\x9e\x02i\xadL\x13X\'\x8ei\xdd\x92f`\x89S\r1`N\x91a#\x00\ -\xb1@\xd7\xe5\xc4\xf6\x81,|\x1c\xc9q\x10\xc7\xc2.\xddM\x18\xf2\x813\x01\xc7\ -\\\x8e\xe0\x9dP@\xb7W\x17\x1aX\xc0\xe4#"\x113\x8a \x83\xe8\xbbd\xd4\xef\x00\ -\xbb\xb2\xd2\xe5+\xc8\xdd\x11\xcaq\xc0I]\x01\xa74\xe4\x14\xf6\x14\xf3\x9c\ -\xf4=\xf8\xc7\xd6\x03\xf9\nM\xd4\xeb\x14\xf7\n\xf8.\xe0_]>\x01\xf1i"\xde`\ -\xc1\x97\xf3\xdb\x90\xbd`\xab3\xcc\x93\xf5\xc2+S\xd2B<\xb5K\xd9\x06\xb10P\ -\x10\xb1\xeaa\xe1v\x19\xeb\xc4Y$\x0c\xbeE\x91c^\xfa\x0c\xa0\xe2\x1b\x87\xab#\ -9\x0e\xe0.p\xd1@\xe6ts\x19\xeb\xc4)\xdc\x8e\xe0\xcc\x98\xb0\x96S1^\x8a\xb3j|\ -e\xe0\x12#3\xde\x14I\x0b1yY\xaa\x1bp\x96\x7f\x02xR"\xed\x8f5I\x1cU\xfc4\xe4+\ -TQ2\x92)\xc7\x19\x15R:\xcb\xacN\x00K\xdd"\xa5\x8c\xd0\xd7a\xf1!|\xed\xe58\ -\x81\xdeE\xb2Q\xaa\xf8\x1bK~P\x859\x02D\x82#E\xe3\x98\x0fOT\x0c\x1c\xf9\nU8\ -\x8c\xb9\xb2a\x12o\xce^\xa1\n\x7f\xf6\x04\xae\x99\xa8dz\x15.\xd4\xf3\x88SA\ -\xb1\x8d\xec\xa1b\xc8\xb7\x16\x07\x01\x0f\x1db<\xa1};\xf6\xf8\x1eN\xce0\x0bv\ -\xfd.\x8c\xe4+T\xb1\x1aS\xc6\x03\x99(n\x9e\x81\\\x13\xcc\xcb\x1d9U\xec\x9c\ -\x81\xf5=J\xf6"\x8e_\xa4o<\xd7d/\xd8/\x15D0\xdf\xf6\xf9I\\\x1f\x16\x13\xe4\ -\x97z+\xc9(\x12F\x00-~\x87!V\x16X\xb8\x87k\xe1\x03\xbe\x16nvd\xa3Tq\x1c2\x0b\ -\xe1\xc9{h\x03w\xc1\t\xda\xf6d\x05\x0c<#\x90#%\x06uH\xed)\xbc\xdc&jKG>\x01\ -\xfcX$\xbb\xc5%E\x8a\x9a\x17\xde\x10\xd9oG|f\xb3n\xb9\xde\x01\xb6\x87o`\xfeh\ -\xe1\xb0\xe0\xfb\x95\xb7|"O8\xbbz\x05\xecF\x0f\xd8\x8d\x0e\x94\xbc\t\x1b\xab\ -\x17\x1a"xC\xd0\xd2\xf2\x00\xf6\x19 \x13\xd6\x95\xec\x05sk\xc6\xf2\x15\xaap\ -\x0cY\x81hS\x08\x08\rG\xbc\xff\x92;\xdd\x16:?\x8c\x91Y\xa3@C\x99\xd8\x95.\ -\xf8qJ\x17/\xc6\xd2m{\x1fAJyP\x14\x0fc\x00\xa88\xd3\xa2c\xcaq\xd0\xecW\xa5l\ -\x14\xd1Y\x15\x18\x81\x0c\x87\xf8\x83\xc5\xd3\x00i\xb9\xc3\xa9mX\xb5\xfe\xc8\ -`\x8e\x1e\xa4eQ\xc9^0\r*d\x10\'\x00\xbd\x05rx\xe0cW~\xd6\xe5\xcc\x01\xf3\r\ -\xaf\x93\xb0\x82\xf0\x01\x83@6J\x15{\xa1|\x85\xa6\xf2q6\x0e\x9a\x17%\xe1n1s\ -\xc7\xb3F\xe9\t\x97S\x0eqJ\xaa%\x84\x9e\xa5F\x7f;{\x05\x190)\xc4)\xa44\x14\ -\x81S\x95\xf9\x01\xae[#9s@c\x93\x18w\xa5\xbe\xfe\xd6\xe2=\x07\xafd\xe9!5\x96\ -\x07\x85\xb5\x0f\xac\xa4\x846Et\xcee)_0\xc0\x1cA {!\x8eM9|\xcdF\xd1J\ -\x04D\x04{zKF\x87qX\xf0\xd0\x91\xbdd\xe4S\xc2\xf92\x18\xa6n\xe3S\xd2\x80\xe8\ -\xf6} \x11\x0eY\xfdJ\x11\xb1:d\r\x96\xef\xbf\x1ci@\xc93\x00\xd3`\xe8\nk9/\ -\x0e\xc4\x16\xc7\xf8F\xfc}\x0f\x07^\x96\'rc\x0b\x11\r\xa0\xdf\xcf\x00\'P\x81\ -H\x80\xcf\xb8-V\xcf\x8fU\xd9\x06\xed\xec\xcfp\xfe\x8d9k\xc2\xbe\x14J\xf0LD\ -\x9c\xb4\x8a\xbf\xed\xa32\x90\x8b\x93!op21v\x1f\x1f\xc5\xf2\x15z\xe2\xb0\x03\ -\xac\x02g\x08\x89*\xd9\x06\x04}W\xf2\x03\xeeA\r\xa1\xd6\x01\x0c\xbc#\xfe~\ -\x14\xeb\xebc\x06\xd9\xf0\x9d\x80\x97Y\xb7\xc8m\xab\x03\xfc\xc4\xd9,\x1e]\ -\xb9\xa4p\x83\x9b4\x83\xbe\xccC\xb2\xc2\x01]\x1f~\xdcA\x17`0\xbed\xf4c\xd6\ -\x060\x9bSlu\x17[\xfd\x02S\x99r\xf2\x9bcC\x92OO\x9c\xc0\x03\xdf\xef\xfb\xf4\ -\x84\xd5\xc2\x89<\x9e\xe0\xab\x08S\xe4v\xe9\x01\x12pk\xf3\x06B\xe4l\x93n-6f4\ -\xbd\xc2\x89\xc0\x18\xb3y\xed"\x04\xce\xd7K\'%\xb0,\xbd\x14nl9\xd9\xbc\x92\ -\xf9\xe2\'\x7f\xa5\xea\xba-\x89\x03\x83:\x88\x9c9\x10\xc1\xcf!\x94+v\x98e-\ -\xd9-\x04l)\xdb\xa0\x8a+\x83\xaed\xd6\x85\xe6\xa5++\x90J?\x96\xaf\x10\x9379K\ -Q\n;\xca\xd0\xf8\t\xc8\xd3;\r\x1f\xa5\xca .\xcc\x16/\x871\xbeE\xd1Ez\x9c\xc2\ -\xb1\x1aj\xf7#\x9c/\x9c\x16\xaf\x17K\x16\xe2\xfe\xcbH>A\\w\x03@\x8a\x1c\x9c\ -\x95K\x81|\x05h}\x03"\x98S\x1e\x8eg\xaf\xd0\xbc\xac\xc4@\xba\xb9\xfcm0\x0f9D\ -\xf8+\x11\xeb\xb6|\x02\xa9\x9f+\xb9\x1cp\xcd\x95Az\x8c.=\x00\x88"\xe7+\x00I\ -\x85\xfcAl&\x1c\xda\x92|b\xb2\xcf\t\x85\xd8g\xf0\x17\x0bW\xde\x8c\xbd\xc4U\ -\xd9:\x8aAG\x01\xef\xb9\x0c\xca\xc4\x9a\xc1\x03\x83\xaa\xf0\x89O1\x1f\x97\ -\x15~\x9a\xc0\x18\xf5a\x9b&\x9e|\x05\xe9\x1cB\xd9(\x8c\xf7\x08\xc9M86\xbf\ -\x1c\xc8\'`\x03\x85\x0b[\x9d\x93w\xb6\xa7\x80H\xf0\x87\xbe\xbe#\ -\x83n\xc1\x8e\xaaa\x1bP/\xce\xaaq\xc9\xb7k\xf9\x16\xf8\x11\'\xae) \x93U[\xbe\ -BO\x84#\xa4\xd7b\xf0\xe4\x91%\xbb\xa5\x8ao\xf0\xb0\n\xbd\x10\xf7=X1\x9a@S\ -\x1az\xb2\r8\x10\x19c\xd4\xc7T\xaek\xf2\x15\xa4\xb5\xe2\x8ftq\x9e\xde\xf3\ -\x18+\xd9\xc7J>%X\xa3\x9f\x8f1\x95\x8f\x08P9\x8c\xe7\x1fp\xe2+\x17\xcb\xf2\ -\x8e1W\x9cw\xc3\xe7\xef\xcf\xf9\xe0\xd8\x1ag\xb2\xb1\xe0\xcc\x08\xf8\xebr)\ -\xdf\xf5\xe2\r\xe4B:\xec\x84\xb2\r\xa4\x1a\xb4e\x05\xc0\x82\x0c*\xf1`\xef/\ -\x84\xc8\xa7\xc4\xaaS\xe0\xcanqI\x00\x11+a#\xc3\xa1\xca`0\x07\x07\xdfwS\x0e\ -\x0c\xb9\x18K90b\xe1w\xba\xb8U\x14\x19\xe4\xc7\x99J(\xa4\x82\xb37\x0c+\xd9\ -\x06t)U\xbeB\x15\xc7\xb3q c,\xe3Os\x88\xf1{\xce\x7f*qJ\x0cm\xe2 \xf9]\x87\ -\xe7\x16\xb6\xe9\x16\x89-\xdb/p\x91\xbe\x17\x01:\xcbhJ\x93?\xc1\xc5\xceP\x9f\ -3a\r\xa0\x9f\xde1\xd4\x8bS\xa7\x8d9O\x8d\x0f&?\x94r\x1cD\xfe!\xc3\x92\xf8\ -\x1a\xe3\x0f\xe4b\xcc{\x90\x96\x9b\x0e\x00\xbac\xa8\n\xc7\x11\xbf\x02ZnB\xec\ -\xec!t\xcbkS>\x81K\x02$r\x062\xfb\\\xa0\x01\xda\xc4\x17\x0c\x1f\xe0\x92w}XZ\ -\xde\x149\xaal\xe8\x0e\x15_\xfa\xe6\xef\xf2l\xc8\xa1s\xfeS\xc4\xe7\x8a!\x14\ -\xc5!\xbc\xb4>\x7f\x97\xe7]\x02\x9c\x92\x8f\x15tJ\xc1\x94"\xe5t\xeb[\xb3^\ -\x90\x10$\x01\x021C\xb4\xfa\x8e\xbf\xda\xc5\xde/\x85q\x17\x9c\x1e\xf8\xd5f&\ -\xc3\x9d\xbeM\x17\xd9\xeaT\xaepUD@2\xf17\xa8n\r\xd9(\xe2\xd9\x1cju`Ff\x90\ -\xc9B\xc6\x00\xf9\xe7J\xf2\xa9\xc2s!\x83|l\xc2e\x92\xb8\xae/o\x84\x10D\xc2\ -\x1f\xa76\xbefB\xf2c\x92\xf27\xdb\x9el\x80\'\xc70#\xd7\xf9K$}H\xdc\x8f1\xae\ -\x00\x14\x80F\x9e\'|ha}|\xe3\x0c2Ch(#\x05_d\xe3\xef7|\xc0\xd7\xf62\x1b\x15\ -\xdf\x03\xd9\x0bU\x04:\xf7\x02c\xe4\xd6\x92\x1c\x83\x91\xa8\xcbW\xe0\x99\xe0\ -O-x\x88\x9aor:\xa9\t\xb4\x8bU:\tE\x0b\xf0\xa0e\xa4(\xda\xf9\x10\xba\xf6F$i\ -\xa1\'~0\xaa\x82\xbf\x91\xda\xb5y\x1apD\x8fg\xbd\x10\x93\x87\xb3^\xa8\xc2\ -\xeeP$\xc0\xe2\x94T\xdf\x19v\x92#\x14\xbf\x81+\xcc\x13\x0e`>C\xed\x19\x0cag;\ -\x1a\xa0\t\xf8r\xf1\x9cgI\x16\xc2jtd\xa3\xc8\xab\xe0\xc8\'\x90\xde\x13\xdf\ -\x06\x93\xe9\xe8N4|\xee\x85\x13\x82lq\xd2*\xbe,\xe9\x97@e\xf1W\xa9w\xa0\x07\ -\t\xcd\x19\x15\x11\x90\x19\xecP\xfdR\xca\n\xdc\'T\xf0\x05\xb2\x1c;\xfbP\x03\ -\xb2k\x00\'\xd3q\x80\x8fA\x15\x98\xca\xa5\xa9\x1c\x07M\xe5\n\xe3\xd88e\xc8\ -\x86&i\xc1\x9d\xf7H\x8e\x94^\xd9S%\xc7 >9W\x96\xc7\x1f<\xe5\x1b\x10|\x85h\ -\xe0\xca^`W\x9a\xb2\x17@\x12\xbbr`\x98JW\xd2\x82\xa9\x9c\xbd\x82KW\n3\x19\ -\x88\x99\xf36"\x016|[\x9fY\xe4\xb8\x109\xd3\x11\xbe\r\xc6\xc1\xfa\xb6\'{\x81\ -1\xc2\xb9\x7fl\xe4\xbb0a\xbeel\x9cm\xa3\xc2\xe1\x13\xe8\xa4\x8d\xa4\x11\x05t\ -\xba\xbd\x08\x10\t\xfe"\xec3I\\\xb7\x9f\xe2\x93\xa8\xf3\n>\xc3\xc3\x1c\xfb\ -\xa5\x01f\xd1\xc3nx\xe7 \xe7\x8e\x83\xfd\xf2JY\xce\x8a\xdc\x01\xa8$\xc4\xc7\ -\x8ee\x1e\x92{\x1d\xdfL\xe1KW\xd7|\x8a\xf1\xa5\x9a\xc0\x04~\x8c\xf3n\\\x91Sv\ -8p=h\x9f\xc8\x05-\x0cmZ0\x87#90\xaaX`Cb\x0c\xc3\xfb+\x9f/\x13\xcc\xedgG\xbe\ -\x02\xae\xbb\xb2[|\xc8iV\x81K\xdf\xfc\x91.\xce\x15\xaeG\x00\x94Y\x10\xf4\x1e\ -\xac\xd7\x94\xb34\xc7|\xc3\x9fCG\xdft|\xe2\x91\xf3\xe4\xad\xb4\x01\xf6\xe1\ -\xcfx-G\x08\x1d\xf1e\xeb\xd56v\x14\xc7\x81\x02d\x03.2\x9cs\xcb\x16t\x07\x06\ -\x93\x1eqJ\x19\xfe\xde\xbc?E\x16+\xfe\x08\xb5\xaf\x02\xfb\xe5\xc2O\xb7\xab\ -\xc9^\xa8\xa2\xe4\x0f}q\x02\x0c/\xc2\xa7\xaf\xf82\xcb\x9a\x06 \xd7\x04G\xa36\ -{\x85*>X\x92AH\xceh\xcb^\x90\x12\x93\xb1_lXm\x86\xf2\tZ\xa7\xfb\t\xf7\x82\ -\xeb\xc7\xab\x81|\x82X\x98\xe9\xb2\x17\x04\xa7\x19T\xc2\xea\xe8\xda\xacQ\\\ -\x12\xe0\xd46\xac\x9f\x9e\x93\xd4\xcesN\r>"I\xe7\xa4\xac\xc0_r\xf6\x97\x14+y\ -\xd9\x04\x10\xa3\x07\xddA)e\xb7\x08\n\xf3\x97\xbf,\xa0L\xee8\xabW\x8e`\xdb\ -\x11\x7f\xd7\x8bs\xcb\x1dv\x91\xb7\xa7\x0f!m\xcf\x9e \x9e&\xb3q\x10\x83\xa6\ -\x0cJ\x9b@H;0\xcd\xfb>\xacy\x95?~\xe4\xe0\xf3j\xf31\x80m\xfc\x85\xcb\xef\xb1\ -\x1c\x18"#\x0c\xaeeO\xde\x1ao1\x97Y\x18\xcanq\xcb\xd7e\t\x03\r\xe5\x83\x8a\ -\x1c\x11|w\xe5\xa2B8\x9f\xe3Q]\\U\xc93\x08\xb6\x92\x13\xc6\xb0\xc7\xf9%\x80\ -\x94\x1asbV\x0bj\x0f\x87\x8d/\x13 \x11X\xa5u\xf9B\x7f\x0ffSB\x87E:\xcc\x90\ -\x1a\xbc\xcd\t\xc92\xe0P\xc6\xbc\xb3\x07\xd8\xd9\xebtug\x92\x17\x88\x14\xbd\ -\xd3\xf0\xbdW\x8e\x89?\x90\xa5e\xd7_~#\xef\x17!v\xc5\x89\x03\xcf\xd5:b\xaf\ -\x13\x1f^\xdaE\x1d\xe08\x8b\xbf\x0c\x87\xd8k>\x81\xa7w\xdaA\x00\xa2\x0f{N\ -\xef\x00\x95\xc5\x9f\xf2Y!\xaf\xf5`\xd2\xb3\xa1k[L>d\x90\x95\xf0+\x9c\x81\ -\x8a\xbft\xc5\xba\xe5"2\x82f94\xa5\x82\xf1\x0e}\x80\'\x9d\x11@\x14>\x0e\xcf>\ -\xc4x\xd6\xc3\xc1\xd7\xe7\xefGqF\xe1\x1b\xec}\xa1n`{\xb4\x00\xd3r8\xf3\xf5\ -\xec\x95q\xe3>\xdeb\xf0\x82\xcf9fX\x85\xe3DO\x87\x9c\xb5IB\xac8\xa7\x1b\xdfW\ -/9I\xd3\x00\x87\x85m\xc8\n\x18\x12\x0c\xa0\xe2\xcb\x1bC2FR\x99\xab\xe2\xa6\ -\x94\xaf\xe0f[\x8b\xe7\x05:\xddE\x08\xf7 W|\xb1\x99\xa7\x9c\xbe\xa0\x92m \ -\x7fr\x1b\xdb\x94s0\xff\xd4%\x83\x10\t\xb0`\x9cqLK\rd\x1bP\xe1B\xf9\n\xa2\ -\xb3$\xd8\xc6\x05\x7fu\xf8\xa0+{\xa1\xf5\xf1\xcb@r\x13\x06>~wd\x1bXA\xfc=\ -\xad\x0cm(\x95\xac\xc0\xb7\xb0\xbaH\xe3\xc4Z\xdfG\x05a\xe3\x14L^b\x10\x16K\ -\xed\x1b\xceB\xc3\xb78\xe7q\xde\xca\x14\x19\xef\x0390zBC\x8e\x19\xa9\xc2\xfd\ -\xe14,\xac\xe4-q\xec\xd5\x01\x93\r\x06aq\x92\xb7g|\x88\xd6\x1f\x00\x00\xb1\ -\x17\xc8q\x00\xe1\xce\x9f\xdf\xe3/\xc2\x9e\xcd\x9e ~\xa8- \xee8\xc9\xdb\x85\ -\x8a\xaf\xffx0g\x7f[r\x1c\xc8mK\xca\x9503\xb1\x82\x1c\xfe\x16\x16c\x9d\xecY\ -\xa3\xc8\xd9\x15!\xc0\xcd\xaa\xd3\x06\'z\x1a\xe2\xfb@\x8e\x05\xe1\xc8\xf6\ -\xfe\xc0\x92\x8d\xd2\x13\xbb\x8e\x1c\x07\x9e\x98\xb5\x81;4\xael\x03Y\x9a\xc9\ -\xb93(2\xa0\x90\xe69b\xc5Aa\x8faI\x9c\x9ab\xc9\x06\xcc\xb3\x00\xfc\xc5\xa1\r\ -d\x8d\xf9\xca\xff\to\xc2\x14:L\xc2\x90\x00\xa4\xa6\x98S;H[\xc4\xe18\x9d1\x13\ -\x9c\xc9w\xab\x92\xaf\xe0\xcb\x1bt\xc7\xca+\xf8s\x84\xe7\x1c|\xe4K\x8a\x97\ -\x9cn\x8c\x91]\x07\xf4\xa5\xbcl\xc2_/\xfd\xad\xb3\xd9\x04\xb5\xe7\x85\xaf\ -\xa7\xdb\xf0\x07=\xbb\x00\x93f\xb8\x0fdu\xe1\xe7\xe7\xed\xb1\xc8`\x9f\x02;\ -\xea@\xe5oa\xf1\xc7\x8fl90\x18\xab-\xb8\xb2\xf8K\x9b\x87\x15b\x16\x0e\'\x8aS\ -\xb8Q\x06\n\x1b\xb2\x02\x17\xd8\x9b\x91\xda\xcd\xffh^8\xc1\xd2\x04X\xb8\x0c)\ -\x87\xc6\x054\xd8\r\x06.\xb1\x1a\xa8k\xb2[\xdc:j\xe18I\x81"(Zr\xe8\xc8se\xca\ -W\xa09"]P]\xe84Md\x05\xf0A\xaa|\x05\tQg\xb4\xd0\x13\xde\xacQ\xa4\x81\x9b\x8d\ -\x838v+\x9f\x80@\x19"\x88\x91\xb3\xfd\x92\xd0\x17\xa5\xc5"\x03\xfcv\x14\xc8^\ -\xe0\xb6\xe5\x108;!\xdft\xdc\'t\xf8\xb3\x99\x16\x0e\x1cV\xf2:S\xe0r8\xb8\xf4\ -DBZ\xec0T\ -Q?\xe0\xd3\xf4\xbd\x86\x18\x1fG\x8a\x9e8\xae\xee\xf1\x17\r8\x15T\x1f\xee\xe3\ -e2h\x069\xe3\xd8vfO\x00S\xd3\x02R%\xc7V\x9frN\x15F \x96]|q\xab\x8f\xb0\xe0\ -\x83!\x1b\xa5\x8a\t\xa7?\xe1\x14\xb2\xbf\x18d\xe3`\xad\xf7]$I`\xf1y\x11!\x8f\ -\xd1\x80?\x82` J\xcc\xdf\xb1z\x1d\xc96\xa0\xd1\xcf\x1a\x85inC\x81gH\xe2.K~\ -\xfe\x9c\xd83\x85l\xf2\xac\x00V\xa1\x9f 8\xedC=/;\x08\xa4\xf2%\xe7\xfd\x00\ -\x11M\x0f\x07\xce\x07\xfe\xe2\x16\x7f\r\xe9\x0c\x1ft\x90\xa9\xc2\xfe\x1a\xf8\ -~T\x0f_\xe9>\x89e\x1b\xa8p\x01)\xeaC\x81\xffH\x01\x99\xc9\x98\x9d]\xbbm\xe4\ -\x99(\x00oX\x9b\xe2\x83R\x8c\xb8\xeb;\xb2Q$\xcb\xe6\xccO\x03\x00\x97l|\xddE4\ -\x81/oP\xbaB[~z\xe2}\x02\xd4^\x8a\xf8\\\x9b?\xef\xca\x19\x0f\\:\x1a\xc5^\x00\ -`\xf9\x03c\xad3`i\xf7b\xf8.8\xbf\xf6YW\xb6\x81;g\xb8qXp\xe6Z\x87\xbf\x94\x97\ -\x81\xa7\xad\x96)J\xd9\xaaZ\xd3V\xb7\x95\x88?JKm\xb5\x9b\xa2\xb5:\xad\xa8e\ -\xb4F\xad\xa0\x15\xb7tQ\xc2\x96%\xfe;\x12\xc5n9-W\xfc\xf1Z\xfd\x96\xdf\x1a\ -\xb4\x86\xad^S|YnDyj\x1d\xb7n[\xf7\xa2\xfcn=\xb4\xceZ\xd7\xad\x83\xd6]\xeb\ -\xa8u\xd2:m\xfdl\xfdj\x9d\xb7.Z\x7fZ\xcfbL\x8f\xad\xc3\xd6\x95\xf8})\xfe^k}l\ -e\xad\x9dV\xde\xfa,\xfe\xdei\xa5\xad-Q\xb2V!J\xd6\x94\xfa\xdf\xban\xd2Zh-\ -\x8a\xb2\xdcj\xc8%RVZ\xab\x82\x98D\x10\xc2\xc4h\r)\xeb\x82\x90%A\x8a\x05bt\ -\xf1\xdbhm\x8b\xb2\xd7\xfa\xd4\xda\x14\x7f\xc6 \xa6\xf7\xff!f\x17\xc4\xd4e\ -\xa3\xf5\xae\xf5\xd6\xfa\xd6\x103\xdfz/\xc8\xf9 \x88\xf9\xde\xdao\xcd\xb5\ -\xbe\x8a\xbf\xbf\x08b\xfe\x08\xa2\xd6Z/\xad\xbf\xad\xd7\x86\xcfDL\xda\x10\ -\x93\x81\xa0B\x10\xfb\xb1\xf9\xd74K\xb32\xa7f\xd7\xfc\x872M\x94\xad\xc4TL\ -\xd5l\x9b\x9a\xd91#\xf1\xc70Gf Jl\xeaf(\x8ae\xda\xb28\xa6kz\xa2\xf4M\xdf\x1c\ -\x98C\xb3g\xde\x98O\xe6\xb1y+\xca\xb1yo\xfeFy0\xcfD\xb96\x0f\xcc;\xf3\xc8<1O\ -\xcd\x9f\xe6/\xf3\xdc\xbc0\xff\x98\xcf\xe6\x0f\xf3\xd1<4\xaf\xccKs\xcd\xfchf\ -\xe6\x8e\x99\x9b\x9f\xcd\xd4\xdc2\x0bsb.\x88R\x88\xdf\x8b\xa2,\xff\xaf\xb2b\ -\xae\x8a\xb2\xde\x94%s\xdb\xdc3?\x99\x9b\xe6\xd8lff\xa5\xb5\x0bR6\x04\x19\ -\xff&\xe6\x9d \xe5\xed\xbf\x88\xf9f\xce\x9b\xefE\xf9`~7\xf7\x05As\x82\x98\ -\xdf\r15)O\xe6W\x90B\xc4|1_\xcc\xbf\xe6\xab\x98|\xb3,\xcb\xaa\x9c\x96\xdd2)\ -\x95R-\xdb\xa5Vv\xca\xa84D\x19\x95A\x19\x97\xba\xf8;,\xad\xb2\x10\x84X\xe5\ -\x96 \xa6\xfe\xbd\x00"\xec\x92\x8a\x83\x7f\x89,\xb7\xf4\xca~\xb9i\xfa\xe5?L\ -\x0c\x912(7\xc4\xdf51\xc3\xb2W217\xa5\x03\x82\xa8x\xe6S9\x14320\x8f\xcb\xe3r\ - \x88\xe9\t\x02\x9e\x1aBj2\xbe6\xa5&\xe6\xb6\xbc/\x7f\x97\x0f\xe5Yy]\x1e\x94\ -w\xe5QyR\x9e\x96?\xcb_\xe5yyQ\xfe)\x9f\xcb\x1f\xe5cyX^\x95\x97\xe5Z\xf9\xb1\ -\xcc\xca\x1dQ\x82r\xcd\xcc\x05)\x9f\xcbz\x96\x16\xc4\x95\x9b\xe5\xb8\xdc-7\xcaw\xe5[\xf9\xad\x9c/\xdf\x97\x1f\xca\xef\ -\xe5~9W~-\xbf\x94/\xe5\xdf\xf2UH\x1e\xb3*\xab\xaa\x9aV5Y\xddj\xd4\x90S\x17"\ -\xa6\x9e\xa7\xa4bR\xb6J\x9e\xa3zf\xd6M\xa5r\x051j\xd5\xae\x1ab\xb4\xaaSE\x95\ -Q=5\x9c\xad\x17\xc9\xbd\xe0\xfe\xa8r\xc5\xde\xf8\xd6\x90R\x97\xa0\x8a+\xbd\ -\xaa\x17R\xcf\x0c+\xab\xb2+\xa7r+\xaf\xea\x8b_~5\xa8\x86\xa2\xcc\x99L\x14\ -\x11\xd3\x13\xff\xdfM\xf5T\x1dW\xb7\xe2\xd7}\xf5\xbbz\xa8\xce\xaa\xeb\xea\ -\xa0\xba\xab\x8e\xaa\x93\xea\xb4\xfaY\xfd\xaa\xce\xab\x8b\xeaO\xf5\\\xfd\xa8\ -\x1e\xab\xc3\xea\xaa\xba\xac\xd6\xaa\x8fb\x1f\x119VY\x97\x8f\x15\x93B\xc4\ -\xd0\xcc,7\xbb&\xabv\xaa\xbc\xfa\xcc\xc4\xa4\xd5VCLM\xca\x8d$\xa6.59E5\xa9\ -\x16\xca\xb8\xbam\xf6\xc3\x8d9\xac\x16\xaa\xd5\xd2\xae\x16\xab\xe5j\xa5Z\xad\ -\xd6\xc5@\x97\xaa\xed*l\xc8\xa9\x89\xd9\xab03\xe2\xff\xd9\xac\xc6\xd5n\xb5!~\ -\xbd\xab\xde\xaao\xd5|\xf5\xbe\xfaP}\xaf\xf6\xab\xb9\xeak\xf5\xa5z\xa9\xfeV\ -\xaf\xe2T0\xa7\xe5\xb4\x9aN\xa7\xddi2U\xa6\x99\x10\t\xba\xd8I\xc7\xa5:eb\xb6\ -P\xec\x86\xac\xf6\xb4=u\x049\xab\r1\xda\xb43%8_CL45\xa6\xa3\xe9\xbd $\x98\ -\xc6S}\x1aNG\xd57\xd3\x9a\xdaSg\xeaN\xbdi\x7f\xbaP\xfa\xd3\xc1t8\xedMo\xa6+\ -\r1O\xd3\xe3\xe9Bu;\x15\\\x9f\xfe\x9e>L\xcf\xa6\xd7\xd3\x83\xe9^u7=\x9a\x9eL\ -O\xa7?\xc5\xff\xf3kz>\xbd\x98\xfe\x99\xd6\xc4\xfd\x8b\x9a\x1f\xdd\xc7\ -\xeea\xf7J\xfc\xba\xec\xaeu?v\xb3\xeeN7\xef~\x16\xff\x9dv\xb7\xbaEw"~\x9dw\ -\x17\xba\x8b\xdde\xf1k\xa5\xbb\xda]\xef.\x89_\xdb\xdd\xbd\xee\xa7n\xbd\xcc6\ -\xbb\xe3\xeen\xb7f\xd0F\xf7]\xf7\xad\xfbM\xfc\x9e\xef\xbe\xef~\x10\xff~\xef\ -\xeew\xe7\xba_\xbb\xba \xe2K\xf7\xa5y\xeao\xf7U("fbW\x82\x86\x84\x89Y\x91g\ -\xcb\xba\xf8U\x93\xb4U.\x88\xa5}#\x08Z\x9aN\x93n\xf2\x0fi@I\xa2$j\xd2\x16\ -\xafkI\'\x89\x12#\x19%\xfdn\x90\xc4\xa2FO\xc2\xc4J\xecDo:r\x127\xf1\x92~\xf2\ -\xb9\xf9/\xc1\xcfd\x90\x0c\x93^r\x93<%\xc7\xc9mr\x9f\xfcN\x1e\x92\xb3\xe4:\ -\xd9\xef\x1e$wIM\xccQr\x92\x9c\x8a_?E\xdd\xaf\xe4<\xb9\x10\xbf\xff$\xcf\xc9\ -\x0f\xf1\xefcr\x98\\%\x97\xc9\x9a\xf8\xfd1\xc9\x92\xba\xcd\x9d$Ov\xca\xcf\ -\xe2w\x9al\tb\xd4i\x91L\x92\x05\xf1\xf6b\xb2\x9c,\x89-_\x93\xb3l\xd63S\x13s,\ -\xcaJ2M\xe6\xfe=3\xab\xc9z\xb2\x94l\x8bF\xf6\x92O\xf50\x92q\xb2\x9bl$\xef\ -\x92\xb7\xe4[2\xdft\xb4\xd0}\x9f|\x001\x8b\xd5\xbe\xe0\xeb\xf7d?\x99K\xbe&\ -\xeb\xddn\xf7\x8bx\xe6%\xf9+\xfe~\x15z\x91\xa9\x94JML\xa5L\x95\xaeR\xef\x99D\ -Q\x14Ui+\xf5\xbb\x9a\xd2\x11\xffF\x8a\xa1\x8c\x94@\x89\xc5o]\t\x95\xba\x0fK\ -\xb1\x15Gq\xc5oO\xe9+\xc7\xa5\xaf\x0cD\x196\x7f\x0f\x94\x9eR/5\x92h\xedf\x99\ -\xdd(7\xca\x93r\xac\xfcC_\x1b?\xeb\xde+\xf5\xdc\xfc\x16\r<\x88?g\xca\xb5\xf8\ -\xfbB\x0c\xf8@\xb9S\x8e\x94\x13\xe5T\xfc\xf7O\xf1\xe7\x97r\xae\xf4\x93\x0b\ -\x85\x88\xf9#\xfe\x9f\x0be\xbd[\x13RK\xb0\xe7f\x00?\x14\xbfzT\x0e\x95+\xe5\ -\xb2!fM\xf9\xa8d\r1;J\xae|V\xd2\x86\x98-\xa5\x10\xffN\x94\x05eQYVV\xc4\xefUe\ -\xbd!fI\xd9V\xda\xe5^\xd3\xd6\'eS\x19+\xbe\xb2\xabL\x92\r\xe5]C\xce\x86\xc2\ -\xc7f-\x02\x96\xa6\x89\xf9\xa6|S\xe6\x95ff\xde+\xb7\xca\x07\xa5\x9e\x9b\xef\ -\xa2\x81^w_\x99S\xbe*_\x94\x9e\x18\xf0\x8b\xf2WyK^E}K5\xd5R\xb5\xabJ\x9d\xaa\ -oI\xd5\x10\xd3U\x13UQ\x1bB\xaa\x07SU\xdb\xaa\xa6v\xd4^7R\ru\xa4\x06j,\x9e\ -\xd7\xd5P\xb5T[\xad\x89qTW\xf5\xd4\xbeZ\xbf\xeb\xab\x03\xf1\xefP\xed\xa97\ -\xea\x93x\xe7X\xbdU\xefU"\xe6\xb7\xfa\xa0\x9e\xa951\xd7\xea\x86r\xa0\x1e\xa8\ -w\xeaAS\x8e\xd4\x81r\xa2nI1]\x13s\xaa\xde\x08b~\xaa\x8d\x00\xf8\xa5\x121Jr\ -\xae^\x88&\xfe\xa8\xcf\xea\x0f\xf5Q\xad%\xd1\xa1z\xa5^\xaak\xeaG5Sw\xd4\\\ -\xfd,jSuK-\xc4\xbf\x13uA]TU\x9c*\xcb\xea\x8a\xba\xaa\xae\xd3p\xd4muO\xfd\xa4\ -n\xaa5C\xc6\xea\xae\xba\xa1\xd6\xe2\xfb\x9d\xfa\xa6~S\xe7\xc5\xef\xf7\xea\ -\x07\xf5\xbb\xba/~\xf5\xab9\xf1\xf7W\xf5\x8b\xfa\xa2\xfeU\xd7\xc4\xf3\xafBe_\ -\x16*\x89\x10\x00\xedkq\xb4\x1f\xa8\xd3v\xb7\xf9{\xda6\x041I\xfb\xdf\x82yI\ -\x9c6KS\xb1v\xdb\xf4\x91\xeev\xbb\xad\xb5;\xed\x1fj\xd46\xda\xa3v\xd0\x8e\ -\xdbz;l[m\xbb\xed\xb4\xdd\xb6\xd7\xee\xb7\xfd\xba\x99\xf6\xb0\xddk\xdf\xb4\ -\x97\x94\xa7\xf6q\xfb\xb6}\xdf\xfe\xdd~h/\xaa{\xa5(\xd5Y\xfb\xba}\xd0\xbe\ -\x13C8jo$\'\xed\xd3\xf6\xcf\xf6\xaf\xf6y\xfb\xa2\xfd\xa7\xfd\xdc\xfe\xd1~l\ -\x1f\xb6\xaf\xda\x97\xed\xb5\xf6\xc7v\xd6\xdei\xe7\xed\xcf\xed\xb4\xbd\xd5.\ -\xda\x93\xf6B{\xb1\xbd\xdc^i\xaf\xb6\xd7\xdbK\xed\xfd\xeev{\xaf\xfd\xa9\xbd\ -\xd9\x1e\xb7w\xdb\x93\xa4&c1\x99\x11\xb3\x9cl\xb4\xdf\xb5\xdf\xda\xdf\xc4\ -\x9fw\xed\r\xf1\xf7[{\xbe\xfd\xbe\xdd,\xb3\x0f \xa6&Go\x7fo\xef\xb7\xe7\xda\ -\x91\xf8\xfd\xb5\xfd\xa5\xfd\xd2\xfe\xdb~\x15\xa6\x8d\xa9\x95\x9a8f\xb5\xae\ -\x96h\x8a\xa6jmM\xd3:Z\xa4\x19\xdaH\xabI\t\xb4X\xd3\xb5P\xb3\xb4Z<\xdb\x9a\ -\xa3\xb9\x9a\xa7\xf55_\x1bhCQz\xda\x8d\xf6$~\x1fk\xb7\xda\xbd\xf6[{\xd0\xce\ -\xb4\xfb\xd6\xb5v\xa0\xddiG\xda\x89v\xaa\xfd\xd4~i\xe7\xda\x85\xf6G{\xd6Tu\ -\xaf=\xd2~h\x8f\xda\xa16n\x96\xd9\x95F\xcb\xecR\x1b(k\x9a\xa1\xd6\xe4\xbckH\ -\xd9h\x7f\xd4>j\x99\xb6\xa35\xcb\xecV\xb9\x16\x02\xe0\xa0{\xd0\xc845\xb9\x13\ -\x7f+\xc9A7\xd7>k\xa9\xb6\xa5\x15\xdaD[\xd0\x16\xb5emE[\xd5\xd6\xb5%m[\xdb\ -\xd3>i\x9b\xdaX\xdb\xd5\xf6\xda\x0f\xe6\x86\x16h\xef\xb47\xed\x9b\xd6\xeb\ -\xcek\xef\xb5\x0f\xdawm_\x9b\xd3\xbej_\xb4\x17\xed\xaf\xf6*JKX\x17e\xa7\xeaL\ -;\x9e\xda\xed$\x1d\xa5\xa3\n\xfei\x9d\x87\xaa\xd3\x89:Fg\xd4\t:qgU=\x103\xac\ -\xaaz\'\xec\xa8\xa6\xd5\xe9\xb6\xedNO\x0c\xdf\xe9\xecw\xdd\x8e\xdb!\x89\xb6\ -\xdf\xbd\xd4\xae\xb4\xa1\xe2u\xea\xd2\x17e\x07\xc4\xcc\xd5\xa2\xf9^\xa1R\xef\ -\x9c\xba\x1c\x88\x1a\xbf3\xe8|\xd6\x86\x9d^\xe7\xa6\xf3\xd49\xee\xdcv\xee;\ -\xbf;\x0f\x9d\xb3\xceu\xe7\xa0s\xd79\xea\x9ctv5\xbd2\xcc\xeb\xf6Y\xfb\xb4\ -\xf3\xb3\xf3\xabsS\x9dw\x96\xdb\x17\x9d?\x9d\xe7\xce\x8f\xcec\xe7\xb0s\xd5\ -\xb9\xec\xacu>v\xb2\xceN\'\xef|\xee\xa4\x9d\xadN\xd1\x99t\x16:\x8b\x9d\xe5\ -\xceJg\xb5S\x13\xb3\xdeY\xealw\xf6:5)+\xaa\xaa\x8e\xb4E\xf5D\xfd\x84\xc1\xff\ -\xef\xb2\xdf\xa5\x7f7\x05\xb1c\x10\x93i\xf2\x9c\xa9\t\xf9 JM\x0e\x13\xb6+H\ -\xd9\xe8lt\xdeu\xde:\xdf:\xf3\x9d\xf7\x82\x98\x0f\x9d\xef\x9d\xfd\xce\\\xe7k\ -\xe7K\xe7\xa5\xf3\xb7\xf3\xdaiEf\xb4*6\x7f\x19\t\xf5.\xeaFI\xa4Db\xf3EZ\xd4\ -\x89\xd6:Q\xb4[\x1a\xd1(:0\x83(\x8e\xf4(\x8c\xac\xc8\x8e\x9c\xc8\x8d\xbc\xa8\ -\x1f\xf9\xd1 \x1aF\xbd(\xea\xdcDO\xd1qt\x1b11ag1\xf9\xbf\t\xa9\x8bP\xae\xba\ -\xfc\xfbD\xedw\xee\xa3\xdf\xa2`\x99\x9dukB\x1e\xa2\x87\xa8\x96j\x1f\x14*g\ -\xd1ut\x10\xddEG\xd1It\x1a\xfd\x8c~E\xe7\xd1E\xf4\'z\x8e~D\x8f\xd1at\x15]FkQ\ -+\xfa\x18e\xd1N\x94G\x9fEI\xa3\xad\xa8\x88&\xd1B\xb4\x18-G+\xd1j\xb4\x1e\xdd\ -UK\xd1v\xb4\x17}\x8a6\xa3q\xb4\x1bmD\xef\xa2\xb7\xe8\xbe\xf5-\x9a\x8f\xdeG\ -\x1f\xa2\xef\xd1~4\x17\xfd\xd2\xbeF_\x1abV\x051/\xd1\xff\x8f\x8c\x81B\xba\ -\xc7\x9d\xcauGjM\xcc\xdf\x86\x98\xb9\xfa\x9c\xa9\tab\xf8\xf7k\xd42La\xd3V\ -\xc6\xd4\xe8\x1a\x89\xa1\x18\xe7\xe2\x00i\x1b\x9a\xd11"\xc30FF`\xc4\x86n\x84\ -\x86e\xd8\x86c\xb8\xc6\xd7\xd23>G}\xc37\xce\xb5\x8114\xd6\xa3\x9eqc<\x19\xc7\ -\xc6\xadqo\xfc6\x1e\x8c3\xe3\xda80\xee\x8c#\xe3\xc485~\x1a\xbf\x8cs\xe3\xc2\ -\xf8c<\x1b?\x8cG\xe3\xd0Xi\x04\xfc\xb2\xba\xdc\x1e(>N\xfc\xff&\xa4.\xb3\x99\ -\xbb2.\x8d5\xe3\xa31G\xe7\xcc{IL\xbd\xcc2\xa3.\x0f\xd1\x8e\x91\x1b\xaf\xd1g#\ -5\xb6\x8c\xc2\x98\x18\x0b\xc6\xa2\xb1l\xac\x18\xab\xc6\xba\xb1dl\x1b{\xc6\'c\ -\xd3\x18\x1b\xbb\x82\x94\x9a\x98\r\xe3\x9d\xf1&H\xfa&\xca\xbc\xf1\xde\xf8`|7\ -\xf6\x8d9\xe3\xab\xf1\xc5(\xcb\x17\xe3\xaf\xf1j\xb4F\xe6\xa8\x14\x86\xd2t\ -\xd4\x1d%#e\xa4\x8e\x84\xd8\x1auF\xd1\xc8\x18\x8dF\xc1\xa8&&\x1e-\xab3\xbe\ -\xff\'!\x97\xda\x91J\xc4L\xfe\xb5\x0c7;\xfa(\x1c\xfdC\xb7\x19\xed\x913rG\xde\ -\xa8?\xf2G\x03Q\x86\xa3\xde\xe8f\xf44:\x1e\xdd\x8e\xeeG\xbfG\x0f\xa3\xb3\xd1\ -\xf5\xe8`\xb4h\xdc\x8d\x8eF\'\xa3\xd3\xd1\xcf\xd1\xaf\xd1\xf9\xe8b\xf4g\xf4<\ -2#\xa7\x99\x977\xe3\xc7\xe8\xc7hWH\xb8\xc7\xd1\xe1\xe8jt9Z\x1b}\x1ce\xa3\x9d\ -Q>\xfa\x05\x9b\xc18\xd8\r6\x82w\xc1[\xf0-\x98\x0f\xde\x07\x1f\x82\ -\xef\xc1~0\x17|\r\xbe\x04/\xc1\xdf\xe05h\xc5f,,\xf3\xd8\x10j\xd1\xb2\xd0)T\ -\xd3\xed\xfc{f6\x94\xa3\xe0(\xa0\xff:R\xaf\x0c^zT^"a\x1c\xc7\xf4!\xad\xb8\ -\x1b\'\xf1\xafZ\x0f\x17E\x8d\xdb\xb1\x16\xd7\xb3\xf3(\xc8\xe9\xc4Q|)\xf6\xb9\ -`v\x1c\xc7\xaf#=\x0ec+\xb6c\'vc/\xee\xc7~<\x88\x87q[\x90c\x9b\xabA]\xc8\xb7\ -\xb6*H\xea\xc57\xf1Y\xf0\x14\x1f\xc7\xb7\xf1}\xfc;~\x88\xcf\xe2\xeb\xf8 \xbe\ -\x8b\x8f\xe2\x93\xf8T\x94\x97\xe0g\xfc+>\x8f/\xe2?\xf1s\xfc#\xbe-\x1f\xe3\ -\xc7\xf8A\x15J\xab\x99\xa8\x87\xf1\x95\xb1\xdc\xbe\x8a\xaf\xe2\x93\xa0Hj\x02\ -h\x86.\xe3+\xed?g\xa6j\xaf\xc5\x1f\xe3f\x99e\xf1N\x9c\x8b\xf29N\xe3-Q\x8ax\ -\xd2\x10\xb3\x10\xd7\xe4,\nb\xf6\xc5r[\x8eW\x041\xab\xf1z\xbc\x14o\xc7{\xf1\ -\xa7x3\x1e\xc7\xbb\xf1F\xfc\xee_\xc4\xd4\x84\xac\x80\xa0^\xfc\x16\xff\r\xbe\ -\xc5\xf3\xf1\xfb\xf8C\xfc=\xde\x8f\xe7\xe2\xaf\xf1\x97\xf8%\xfe\x1b\xbf\xc6-\ -\xdd\xd4K\xbd\xd2\xa7zWOtE\x17\x9a\x94(51bf*E\xd5\xf4Km\x92\xd4\xa4\x1c\xc6U\ -\x9bw\xcd\x91\xda\xd1#\xbd\xde\xfc\xff\x9e\x17C\xac\xb2@\xff\x87\xbe\xeb\x9b\ -\xc5\xb1\x1e\xeb\xba\x1e\xea59\x96n\xeb\x8e\xee\xea\x9e\xde\xd7}}\xa0\x0f\ -\xf5}\xb1szzM\xcc\x8d\xfe\xa4\x1f\xeb\xb7\xfa\xbd\xfe[\x7f\xd0\xcf\xf4k\xfd@\ -\xbf\xd3\xebEv\xa4\x9f\xe8G\xfa\xba\xf8\xc5\x84\x9d\xea?\xf5_\xfa\xb9~\xa1\ -\xff\xd1\x9f\xf5\x1f\xfa\xa3~\xa8_\xe9\x97\xfa\x9a\xfeQ\xcf\xf4\x1d\xfdW\\\ -\xe9\xb9\xfeY?\xd5S}\x18\x131[\x82\x9c\xbd\xb2\xdb\xd5\xf4B\'Rf\xdb\xbf\x12\ -\xca\xe8D_\xd0\xeb\x05\xf8\xef\xed\x7f\x18\xd7\xc4\x8c\xf4ff\x16\xf5E}Y_\xd1\ -W\xf5u}I\xdf\xd6\xf7\xc4\x9fO\xfa\xa6>\xd6w\x051\xbe\xbe\xa1\xbf\x13\xe4\xbc\ -\tb\x16\x8do\xfa\xbc\xfe^\xff\xa0\x7f\xd7\xf7\x1bb\xe6\xf4\xaf\xfa\x17\xfdE\ -\xff\xab\xbf\xea\xad\xd0\x0c\xcb\xb0\n\xa7a7<\x12\xd6\xb6\x12\xaaa;\xd4\xc2N\ -\x18\x85F\xf8\x10\x8f\xc2 \x8cC=\x0cC+\xb4\xc3\x9f\xb1\x13\xba\xa1\'J?\xf4\ -\xc3a<\x08U1;\x8fq\xed\x97\x9b3/\x84\xd1G\xa4\xf0\x8c\x1c\xa9\xc3\xb0\x17\ -\x1a\xeaM\xf8\xefY\xa9\xcf\xa1\xa7\xf0)\xac\x89i\x04\xc0qx\x1c\xde\x86\xcb\ -\x82\x98\xfb\xf0w\xf8\x10n\xebg\xe1ux\x10\xde\x85\xbb\x82\x9c\xa3\xf0$<\r\ -\xf7G?\xc3_\xe1\xa2q\x1e^\x84\x7f\xc2\xe7\xf0G\xf8\x18\x9e\tb\x0e\xc3\xab\ -\xf02|\xd1\xd7\xc2\x9a\x98WA\xd4\x9a\xf8\xaf\x8fa\x12f\xe1N\x98\x87\x9f\xc34\ -\xdc\n\x8bp\x12>\xeb\x0b\xe1b\xb8\x1c\xae\x84\xab\xe1z\xb8\x14\x96\xfav\xb8\ -\x17~\x12\xc4l\x86\xe3p7\xdc\x10\xe5]HN\xc69\xf3\xa4!\xa5H^\xa2\r\xb1#\xf6\ -\xbbo\xe1\xb7p>\xdc\xef\xfe\xe7^\xa9\x8d\xe9\x89\xfe^\x10\xf3A\x94\x86\x98\ -\xef\xe1\xf7p?\x9c\x0b\xbf\x86_\xc2\x97\xf0o\xf8*J\xcb\xaa]\x89\x955\xb5\xba\ -Vb\x9d\x84\x8a\xa5ZmK\xb3:Vd\xfd\x11G\xbe\x90\xb9\x96X\x8fVhY\x96mY&I2\xc7:\ -\x113r\xa2\xd7\xe8i\xcf\xea[~\x9d\x1a\xd8\xeaY\xf3\xf1\x8d\xf55~\xb2\x8e\xad\ -[\xeb\xdez\x89\x7f[\x0f\xd6\x99um\x1d\x88R\xcf\xccfh\x99\x8e\xb9 N\xd3c\xf3\ -\xa9!\xe6*\xbe\xb3\xae\xe2#\xeb\xc8:\xb1\x0c\xfd)<\xb5\x0c\x95$\xd8\xbfI\xf9\ -i\xfd\xb2\xfa\x9ds\xeb\xc2\xfa#JC\xcc\xb3\xf5\xc3z\xb4\x0e\xad\xaf\xe1\x95ui\ -\xadY\x1f\xadm\xb1\xd02k\xc7\xca\xad\xcf\x82\x9c\xd4\xf2\xf5\xc7`\xcb*\xac\ -\x89\xb5`-\nb\x96\xad\x15k\xd5Z\x17\xe50\\\x12\xc4\xd8 f=\xa8\x89q\xacmQNu\ -\xcf\xda\xb3>Y\x9b\xd6\xd8*\xc2]k\xc3zg\xbdY\xdf\xacy\xeb\xbd\xf5\xc1\xfanm\ -\x87\xfb\x82\x949\xeb\xab\xb5\x14\xf4\x0517\xe57\xd3k\x9c\xef7\x82\x98~R\x13\ -\xf3\xa5!\xe6\xc5\xaa\xd5\xff\xff=\'B\'\x0b~\tb\xee\xa3\x9a\x98\xbfL\xcc\xab\ -\xf5j\xcd\x8551-\xbb\xf6\xb0U\xf6\xd4\xde\xd6\xbbvb+vm\xbc\x0b\x83\xd3\xd6\ -\xec\x8e\x1d\xd5Z\x8b-\xd4\x05;\xb0c[o\xfe\xe8v(h\xd1m\xbb\xb94m\xdb\xae\xed\ -\x89\xbf\xfb\xa2\xd4\xbf|{`\x0f\xed\x9e}c?\xd9\xc7\xf6\xad}o\xff\x16\xbf\x1f\ -\xec3\xfbZ\xfc?\x07\xe2\x99;\xfb\xa8\xf9sb\x9f\xda?\xed_\xf6\xb9}a\xff\xb1\ -\x9f\xed\x1f\xf6\xa3}h_\x89\xbf\x15\xbb6\xc8\xfe\xf3\\\x19(\x97\xf6\x9a}\xa2\ -\x0e\x955[\x98f\xf6\x8b\xb5\x98\x8c\x15\xcc\xcc\xb3\x95\xd9s\xe1\x8e\x9d\xdb\ -\x9f\xed\xd4\xde\xb2\x0b\xfb\xb5Yl\x13{\xc1^\xb4\x97\xed\xf9\xd1\x8a\xbdj\ -\xaf\x0bR\x96\xecm\xfb\x8f\xd85{\xf6\'\xfbA\xdf\x8c7\xedM{l;\xd6zs\xc6\xac\ -\x07I\xb8kg\xe2\xcf\x86\xfd\xce~\xb3\xbf\xd9\xf3\xf6{\xfb\x83\xfd\xdd\xde\ -\xb7W\xc29{\xde\xfa*~\x8f\xad/\xf6\x8b\xfd\xd7~\xb5[\x8e\xe9\x94N\xe5L\x9d\ -\xd0\xfc\xd6\x84\xaf\xc8y\xdf\x133sdu\x9dzf\xde\xda\'\xc1\x7f\xcf\n\x138P\ -\x8a\xe4\xa3]\x8b\xee\x81\xf2\xaf\x99\xc9\xecG\xb1\xd8\x12\xa7.\xf5/*\xf5\ -\x7f)\x8e\xea\xb4\x1d\xcd)\xac\x9a\x98\x8eS\xabb#\'p\x1e\xf4\xd8\xd1\x1d\xb1\ -\xaa\x9c\x13\xbd&\xa7\xde351\xefD\xc9C\xdbq\x1cW\x14\xcf\xe9;~\x9dg\xac)\x03\ -\xa7\xe7\x9c\xc67\xce\x93s\xec\xfc\xb5o\x9d{\xe7\xb7(L\xcc\xbcy\x8f\x85v\xa1\ -<8\xf5\x8e\xb9\xb3\x0c\x95%\xda\x8c\x94\xffTC\x0fc\xfa\x97\xdc\xb3\xce\xb5s\ -\xe0\x1cZ59\xf5\x0c\xcd\xc8I\x9c}!\x1aT\xe7\xce9rN\x9cS\'\xb2\x7f:\xbf\x041\ -\xe7\xce\x85\xf3\xc79\x133\xf3\xec\xfch\x88\xa9\xb7}\r\xc6\xaf\xa5\xd8\xc6\ -\x7f\x10\xf3\xe8\x1c:W\x82\x04_\x94\x9e\xf8u\xe9\xac9\x1f\x9dL\x90\xb3\xe3\ -\xe4\xceg\'u\xeaY\r\xc5\xf6w\xcdQU\x87\x12\xeb@\xe2[r\xa1|H\x1e\x9c;\xebH\ -\xfd\xefE\xf6\x7f\x97\x7f\x113\x17\xd6\x83\xcf\xec\x9a(.43[\x82\x98\xc2\x998\ -\x0b\x8ea/:\xcb\xce\x8a g\xd5Ywj\xd1\xbc\xe4l;{N\x12~\x12\x7fj\x82\xea_\xf5"\ -{\xb3kb6\x9bR_l\xdfu6\xc4\x9fC\xe7\x9d\xf3\xe6|s\xe6\x9d\xf7\x82\x98\x0f\xce\ -wg_\x10S\xeb\r$\xcd\xbe\x99B%\xa8\xea\xb9\x89\xaa\x9a\x9c\xbe \xe7R\xfb\xef\ -\x99\xf9\xbf\xca\x90\xf7L\xbd\xcc\x1e-!\x9e\xc5\xd0\xe7\xc2\xba\x1c\n\xe9\ -\xc6K\xef\xab\xf3\xc5yq\xfe:\xaf\xce\xc4j\xb9\xa6[\xba\x95;u\xbbn\xe2*\xae\ -\xea&a\xdb\xadI r\xea_43\x9a\xdbq\xddfn\xe6\x85\x95\xbc\xe6\xd4\xc5\x10\xca\ -\xb9P\xa1\xddoB\xb5\xd3]5\x0c\xddT\x10C\xcaO\xd8\x90#t\xcd\xaa^j\x96\x1bU\ -\xb6[/\xb6\xc3x\xa69\xff\xa7}\xf3\xefr\xa59M\xba\x85\x7f\\\xf7\xda\xe1\x81\ -\xd7\xcb\xccs\xebEW\xd7\xd4\xf3R\x93\xd8w\xeb\xe2\xbb\x03w\xe8\xd6n\xdc\x9e{\ -\xe3>\xb9\xc7\xee\xad{\xef\xd6\xc7\xe4\x89^/\xae\r{\x17\xc5v~\xbb\x0f\x82\ -\x98M\xe7\xcc\xbd\x16C\xe72j\x88y/Hyr\x0e\\\x9a\x97\xd4\xa9\x17g-\xd0k\xf1,l\ -\x0b17\xb7\xe6\x9dKs\xf3!\x11\x02@.4.w\xea\xbfI\x1c*\x86\xfa\xd7\x021G\xae\ -\xeb\x9e\xb8\xa7\xeeO\xf1\xe7T\xfc\xfa%\xcay\xf3\xdf\x17M\xf9\xe3>\xbb?Dy\ -\x14\xe5\xd0\xbd\x12\x7f.\xdd5\xf7\xa3\x9b\xb9;n\xee~vSw\xcb-\xdc\x89(\x0b\ -\xa2L\xc4\xefEw\xd9]qW\xdduQ\x96\xdcmw\xaf)\xdb\xa2|\x12e\xd3\x1d\xbb\xbb\ -\xee\x86\xfb\xce}s\xbf\xb9\xf3\xee{\x94\x0f\xeeww\xdf\x9ds\xbf\xba_\xdc\x17\ -\xf7\xaf\xfb\xea\xb6<\xd3+\xbd\xf9v\xe5\xf1\xcc\xd8\xd5;e9Y\x13\xcaXO\xc8\ -\xb1\x93\xe0\xca\xb0;\x7f\xad\xba\x80\x98\xa9\xd7\xf5\xce\xc5\xf0OD\xa9\xffM\ -<&\x86\xc8\xfb\trjb\xae\x04!DLM\x8a\xe2\xa9^\xdb#b\x16Pj\x92\x16]\xcd[m\xc8\ -\xd1\xbc\x8e\x17\xa1\x18(+\x82T\xcd[\x14\xcf\x8d\xbc\xc0\xdbj\x88\xf8.,\x8a\ -\x9a\xa0\xcfB\xbf\xad\xc9\t\xbd:}_\xcbs<\xd7\xf3\xbc\xdfQ\x91\xf4=_\x94\xa3 \ -\x14\x06\xf2\x9aQ\x933\xf0\x12Q\x86\x9eC\xab\xb9&\xc6\xfc\x7f\x91\x8f)\xf6' )) + return zlib.decompress( +'x\xda\x01\xf3\x13\x0c\xec\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00d\ +\x00\x00\x00+\x08\x06\x00\x00\x00\x8e\xec-\xed\x00\x00\x00\x04sBIT\x08\x08\ +\x08\x08|\x08d\x88\x00\x00\x13\xaaIDATx\x9c\xad\x9c\x1f\x98#I\xf8\xc7?\xb7O\ +\xc3\x0b\r\x05\x03\r\x81\xc0@`!\xb0\x108\x08\x1c\x04\x0e\x02\x07\x81\x83\xc0\ +A`\xa1a \xb0\x10\x18hX\x08\x1c\x04\x16\x06\x0e\x02\x0b\x03\x0b\x03\x0b\x81\ +\x83\xc0B`!\xb0\xd00\xd00P\x10(\xe8\xe7\xb9\x1f\xd4\x9f\xae\xee$\xbb\xfb\xfb\ +=\xbf\xda\'\xd3\x93\xea\xaa\xea\xb7\xde\xef\xfb\xbfz\xf6\x97\xc3\xbe\xfa\x0f\ +\xdf\x92\xe6*\xc4M\x9a{\xdd\xb1\xcd\x08H\xe4\xfc^\r\xa66\xd7\xbf\xc7k$r\xd6w\ +i\xac\x1f\'\xe2?\x82\xa8x\x92{\x8e1\x18\x83\xfd\xd4\xc6=\x1b\xa8\r\xc6\xd1B\ +\xe2\xaeab\xd8M\xb3\x17?\xc7\x8d\xbfD\'5\x18.\xef\xebzs|u\xfcz\xd8lx\xd5z\ +\xf0\xa5\t\xdd\x16- \xfe\x93H\x03\xc6\xcf\xb6\xbas\xfd\xffl\xc2\x95\xfd\xb8\ +\x96x\xba\xcf\xa7\x9d\xb5\x98\xbe\x04\xe4\xf2(7\xff\x07<\xa8;\xeby\x00k\x0b\ +\x06\t$\x9e\xf0\xc3\x97\xc3e-\xf0R\xe1\xbfsA\x0b\xe8hH\xfcH\'\x998I\x0f\x92Y\ +\x9b\xf6\xf8\x00\xb2\xb8q\r\xb1]\x9a\xfc,\x11\xb1\x1a\x92\n\x92\xd8\xeb`8\ +\xe0\xb0?@\r\xda\x18\xcc\xc9j\x8a_\xc7\xd4\x8e\x8a\xf8{\xd2\xd0\xd7\xd6\x18i\ +\xb4\xa9\xbbO?\xffGZ\xf1\x1d\x813t\x84\xa2\x8e\xd9\xfa\x03\x93t\xa9\t\xfcXI\ +\xbfc\xb2\xc4}\x8f\x81\xb7\x84^Y\xf5\x12M\x91\x99\xed\xf7\x15\xd4\xc6\xd2\ +\xe5\xa59\xb1\xc0\x1b\x0fB\x02R\x0bF\xb0c\xc3\x9ab\x19\xe4\xe6zZ\xed\xf8\xf8\ +Y^ \xcd\xcfi\xf7%\x9ak\xffDZ\xfb&\x91+loIICpkr\xa7Y\xc97\xe7J[w\x08o\x81\xe3\ +Y\x10\xafsE3\xba\xf4\xc5W?W\x81\xd1\xda:\x16c\x9cy\xb5\xa0\x88\xb7\xd7\xb5i\ +\x98\x9cxm\xb4?U\x0c\x84[\xdf\xd4W\xccP\xfdca\x14\xe4\x87\x1a\xd4\xe2@m\xae\ +\xb0\xf7\'\xedz0?\x10Iw{\r\xefD\x1f\x87[v\x83\xa73\x923\x9d1\xf9:eX\x8d~\x0e\ +\x04\xa0J+\x8a\xf1\x92\xe9\xb7\x19\xd3jj\xfb\xa4b\xc4\x88Q:bc\xd6H"\x98\xc4i\ +\x808\xd3c\xbcC6V\x0bjk2\xbc\x192\xb5\xdd\x80$\x91{\xaf\x9b\xb1\x97Z\x0cW\ +\xdb\xb4\xfd\x84O\xad\xcf\xfd\xd8\xab\xb3A\x91\xd3n\xb7\x0e\xd2]\x07UG\x1f\ +\x17\xd5\x98\xc8o\xec\x06;t\xaa\xd1\xb5Fk\xf7\x91\x8ac\xef\xc0z\xb2\xe2\xb1~\ +h\xe6\xfc@ \x8e7G\xaa\xb4bs\xda\xf0\xf8\xe9\xd1n\xaa\xa7\x01\xd8?\xefY\xdc\ +\xe5\x80\x0f6\x9a}IJ\xd0\x1a\x95\x08*m\x18b\\d\xe6\xf7\xef\x03\x16\xfc\xb5\ +\xcb\x97\xc4\xfa\xadK\xfc\xfa!\x18]\r\x8fxy\x0e\x08|\x9f!] \xba\x04\xf9\xf0\ +\xcf\x8dk\x18\xec\x00\xcdA\x06\x82\x1a*\xd4k\x05_m\xf7\xe3\xed\x96\xc3a\x8f\ +\x1d\xf9#P\xbcY3\xec\xf7;T\n\xea\xa6\x89{\xcb\xb2t\xe1\xa9\xfbH;TV)\x88\xb2}\ +!\x94\x95H[\xe2}\x05\xa6\x99\xc6\xdc\x85\xfes\xc6_\x03C\xa2\x7fa\xfdn\xab;\ +\xdd&1\xe4\x7f\xcc\x19=\x8f\x98\xef\xad\x94\x191,\x7f\x9fC-\x14O\x1b\x94Q\ +\x90\xc0fTp\xc8\xf6\xac?mY\x8ds\x8chV\xbb\r\xea\xa4\xa0\x86\xe2\xb7%ev\xa4\ +\xd8n\x10\xa3Z\xcf\x9d\xcd\x16\x8c\xde\x8c\x01\xd8\x9a\x07v\xf6\x0f\xf6{\t\x95\xd6h\xd1T\xaa$\xff\xbc\x08C\xf7\xb7;\x8chv\xfb\'\ +\xf6\x9f\x9f0\xa7f\x13\xa62\xacVk\x8e\xc7\xa3\xed\xe8\x81.4\xfd\xaa\x0f\x07\ +\xa8\x92\x8aeo\xc9\xd3\xf1\t\x118J\xc9|\xb0`\xaf\xf6\xc8A`\x0b\x95\xa9\xd8\ +\xdcnX$9\xd5\t\xf4I(\xd3\x92R\x95,\xdf\xe4\x88\x16\xe4\xb3\xe5\xcd\xd3p\xcbF\ +\x17\x81c1\x18@\xdbt;k\x11\xff\xf3{oT\xc1\x19G\xd7\xf7\xaa\xbd\xb00|\x1e\x81\ +\xc0^vP\xc3!\xdb7\x9b\xff\xd5\xb0?\xec9f\x07Lb\xe0\xc9F5\xf3/9\xf2,\xf0+,\ +\xb39\x8f\xc3\x07K\xd0\xd4\xa0D!q\x1a\xbd\x84\xa7\xbb-\xab?r\xf2?gT7\xa5\xed\ +_Cv\x931\xfe6\x01@\xffV\x05&\xef\xfb;;\xe6\x01\xd4>c\xf4\xef\xd8~?\x80\xfc)d\ +e\xd66\x05S8\xbc>0-&\xa0\xed\xf6\x96\x9fWT\x95f\x93m,\xed\x0f`\xde\x18\x06\ +\xc5\x90Q>\x02\x03\xc7\xf1\x91\xe2\xa9h;\xda5\x94\xc3\x92\xc1\xdd\x00\xd9\ +\xd9}\x1c\xd2=\x87\xc3\x8e\xb3v\xc9\xcc\xc6\x00\xc5\xcd\xfb*o\x02\x1d\n\xaf\ +\xc2M\xb7\xa1q\xe96;\x81\xc3\xf1\xc0\xa1\xb7G\xbe\n|q}\x87}\x03\xd2\x16\x86\ +\xc31R+\xf2}\x01\x06\xf4\xefN\x1b\xde\x02G\x98\xff\xb5l\x132\x80jPQ\xa5\xa5e\ +\xd6\x13\xf0\x9b\xbdN~\x9b2>Z@\x98\xc2\xfe\xcb\xce:\xfe\xec\x08\xcf\xc0\xbf0\ +\x1eO\x18\xdc\x0e\x9a\xe5n\x07\x14\xf7+\xb2^\xdfvh`\x07\x9b\xf5\x86\xf5\xaa`\ +(\xc3\xc0\x80\xfd\xe1\xc0>u\xb4o`\xfa\xfb\x94\xcd\xfb\r\xabY\xc1\xe0\xc5\xae\ +\xb9\x97\x9d\xf5A\xbe}\xb4t\xe5\xf9\x8a\xb1\x1a\x07\xce\x05\x8d\x04\xf2\xe5\ +\x9c\xfc\xdd\x9c\xd1\xaf}\xf2\xbb\x19\xabbA\xb1\xce\xcf\xc1\xf9N\x13\x04\x13\ +\xc2\xde\xc8\x1e\x0e*+-L`\xf7\xf7\x93\x95\xa6GPJ\xa1\xdfh\x0e\xb2G\xf5\x94\ +\x1d\xf3\tF\x7f\x8e\xc0\x18T\xa2\xdaq\xf73\xcc\xfeX\xd0\xf7\x8c\xf2m\x0e\xfc\ +C`\x92\x88\xa2\xdf\xef3\xbd\x9b1\x18\x0c\xc1\xc0\xa0\x1cp\xec\x1f\xd9\xab\ +\x1d\xd9mf\xc7~\xb0\x1a4|=dG;|6\x06\x10\xf7\\m3\xf6\xe1p\x88\xa9m6\x1f\x0f\ +\xd4\x89\x1b\xf7\x02\xd3\xc548\xfd~\x92q\xe4\x08)\xec\x0f\x8dU\xe0\x04\xc3\ +\xd180-,\xe5\x1c\xfc\xea~\xc1\xf2\xce\xae9\x1e\x8fY\xad\x1c\x11\xc0\xf2\xdd\ +\x9c\xe2\xfe!\xec\xd5r\xd9 Qn\x13\xb4\xd1%\xac\xed\xec\xa1\xb6\x0f\x1dVc\x0e\ +\xb7;\x0ecG\xd8\'\x18\x8eG\xecx\xc2\xfce\xa8\xd2\ny\xb4\x11\xcap8\xc2\x00\ +\x0f\xbf\xae1b\xe0\x00\x0c-\x03\xd5\xda\x99\xaaNIe>\xcf\x19\x8d&m\x82|K`R\ +\xce8\xf6W\x98\xdf\r\xbb\xcc1\xff\xc1j\x07\t\xa8x\xb9\x0b\xc5G\x95*D \xeb\ +\xb5\x83\t\x12\xc8\xea\x8c*\xa9`\x00*\x95P\xa0,\xd3\xca\x8ey>\xaf,(\xb9\\\ +\xab+\x8a\x1cI\x84\xcd\x87\x8c,\xcb 9\xb2^+D\x84\xc5\xa2b\xb94\xac\xee\x17\ +\xacV\x9b\xb3\xb9M\x92\xdd.\x1f\xbd\xf2\x8f\x8e*M\x8c\xbc\xd9\x9a\x1a\x0b\ +\xf6\x17\x18\xcb\x141\x0237\xfe\x1f\xc3p8D\x12a7x\xe4\xd8;@\x05\x8c\x81G \ +\x83\xcd\x9b\x02c.d\xeftB\xcc\x88 \x01\x86\xd5\x089\xd9gU\xbd\n\xd9\x0b<\xc3\ +d\xf9\xbfs\xf8\x08|\x06\xdeA\xfef\xc5\xf00\x84"Z\xa4\x86\ +\xf9i\x86\xfa\xac\xe0\tDY\xc1:\xa4;\xfa\xf7\x19|\x04\xf3\xc9\xc0\xdfX3\xfb\ +\x08\xf9b\x89R\x8a\xd9\xd79\xac\xb1Z\xef${\\\x8e\xc9\xf6}\xf8\xe0z\xa4mn.5}\ +\xd2\x16\xcc\xa4\xf3\xc1\x96\x95|\xc2j\xdcY\xcd\xe5S\x8c\x1aF\xcf\x13\xf8"\ +\xec\xd5\x8e\xe9t\x0e\x182\x9d\xb1M\xa6\x14\xcf;&\xef\x06H\n\xe6\xa4)\x0e\ +\x13\xe4\x19\x06w\x19\xe37\x03\xd6II\xbf\xcc\xc8\xfb\x0b\x1e^\xef\xc9z\x8a\ +\x91\x1e\xc2\x11v\xe3#\xe3\xdf\x87\x1c\x0fQ\xad8.Z:`v}\xe7;\xb6v\xf3\x93_GT\ +\x1a\xf4\xc9\n\xcf4\x99!\xfb\x8c\xdd~\x07\xc0p6dVM)\x9e\xd7\x0cgMd59\x8d\xa1\ +\\\xf18zb4\xb4\x82\xa5n2\x9e~\x7fb\xfb\xf1\x91\xdd~\x871\x86\xfe\xa0\xcf$\ +\x9f\x90e}L\r\xd3\xe3\x1c\xbe\x80\x9eh2e}\x91:e\xe4\xff\xae\xd8\xd6\x1bF\xbf\ +N(\x9f\x8f@\x89\xa9\x05\x95z\xc6\xba\x8a\x80\xdb\x8f\xd6\x9a<\x9f\xb2^?\xb6\ +\xfc\xa5\x895\xaf\xe9\xe5\x97\xc3\x97\xea?\x90P\xb6\x08\xad\x0b\x95\x8b\xc4\ +\xc6\xfd\xad+=+P\xda.|\xea\x83\xaf\x0b%0\x9d\xef\x18\x0c2\x8a\xbb\t \x90Fk\ +\x88\x02\x14\x87\x83\x95\xf6\xb8,\xae]\xd1\x90\xc4\x16\x10\xa9\x81\xd70\xb9\ +\x9d\xb0\xba\xcb\x03\x18\xc6\xd3W\x13\x951\x9c\xc4\xf9$\xd8e\xe5\xea\xc6Wy\ +\x05\x95)$UT\xdf\xca\xe84\xd14\'\x8an\r[\xd7j;\xf6V!\xb5\x86|9\xb3\xc9\xed\ +\xc9F[yn(\xee\x9b)6\xdaj\xff\xee5\xaa(\xb6t\x9b\xe7\xff\x15E\xf3\x04]\xaaej\ +\xc7@\r\xb5\xb2\x0cQ\x1a\xb4\x8bhT4>q\xeb\xd4\x8e)\xc6\xb3S\x87\x81\xe2~\x98\ +\xda\x86}\xea\x94q<\x1d\xe0E\xe0\xde@\t\xd3\xb73\xf4\xc91F\x1a\t\x14iT\xbd}\ +\xae\xe2Q\xb1\xa0\xa9\x1b\x0b\x04\xc6\xa0\x9f\xcb+\xfbm\xa4\xf6{E\xf3|9C)E\ +\x9e\x9f\x07\x0c1\x08\x97\xef\xd9U\x97\xeffH"\xacV\x0f\x9dQ\x17\xceCB\xd9\ +\xb9\xf5\xad3"\xb1\xf5*N\xbaa\xc2\x8dj\x18\x1fVp\x8c\xf7\xd8\x8aq\xe7\x13\ +\xae?\x84}6r\xca\x12\xc5\xf2\xf3\x8a\xf5\xdf\x05\xfa\xa5B\x94b\xb6\x9c\x91\ +\xf5\xb2\x8bY\xb06\xd1!\x8fo\x89\x84*\xaf-\xa3\x0b\xe6d\xacy\x8d+\xc9\x1e\ +\xd0Sg\xd1\x08\x98n\x7f\xbe\x9c\x91\xbf\xd5\xf8<\xe3\xa7[\r\xab\xa4\x01\xcc\ +\xe6-\x86\xd5\xfd\x9c\xd5\xbb\x87V\xf8\x1b\xa5+\xcdd\xf0\'nW\x0ea\x12mA\tJ\ +\xa4@\x97\xf6\x8a\x8f*\\u4\x86\xd8\x9d\x8d Q\xe4\x918\xc7\xe6\xcc\x82J\x85\ +\xd5\xb2\x88\xa4\xdd2\xd1\x9f\xe2\xa9\xc4\x9a\x94v\xb8\xde\xac#\xe2\xcb\xe2\ +\x12"6cl\x89Gn2$\xd56\x1cv\x13\xad\x1f\xa4\x19{\xa5\xca\xbc|7w`\xfc\\[\xbd\ +\x83\xd5\xbd\xbd\x82\xdd\xcb\xa6\x97\xb1XTaL\xfeV\x93\xdfY\xff\xe2\xf7\xf0\ +\xaa\x05\xc4\x8fj1>\xa3\xf7\xa6\xc7#\x96\xba\xecJ\xccu#x2\xd6\x97\x086r\x8a\ +\xa3;\x07\x86\x89O\xe1\xc2\x01\x97O\xca\xecG\x1b\xa2hEB\xb4\x13\xce\xd7\x1d0\ +*\x05\xa5\x04\xd5Sd\xb7\x19\x92\n\xd4671\xc6\x06\x07\xdai\x87O\x0e=A\xddd\ +\xd5\x00\xd5\x8be\xe4\xe6C#LEq\x1e\x12\x05\x00:\xbf\xdb\xbd\\1\x84\x91ozu\ +\xed(\xf2b\xf4\xe5\xef(\x03\xc6I\xcb\r\xf0\xe2\x1c\xb0\xa2q\x86\xee\xa0\xcaj\ +\x13\rx\x06\xb8\xa9\xc2\x13L\xe7\xf9q\x02f\xb8\x90\xc9\xfb\xeah\xed4\xc11S\ +\x89u\x9a\xfdAF\x7f\x90\x91\xf5\x14J\xb94\xcc@Ui\xaa\xb2B\x9f\x08\x87Q\x1e\ +\x98\xd6\xe1\xd4\x15N\xf8|b\xf1W#\xe1\xcbeC\xf9\x19\x10\tgL\xf4\xb9J\xdcV\ +\xef\xacO\xf1-\x89\xd1!\x81\x91\x18\xa8\xbc\xad\xad\xfcJ\xf6\xaa5\x1c\xfb\ +\xf6\xeaYV\xe9\xc6\xb4,\x07a\x8ew\xd6!\x008\x89\x05L\x04^\xdcV\x93\xeb&"d\ +\xc7\xf8\xb1\xcdK\x08\xa1\xd5^\xba\xadv\xf4\x07\x19\xde4V\xcf^0\xa2w\xb0B\ +\xb4\x14\'c\xb6\xa8\x87\x91V\xa4\x15\xae\xae\xafz\xa9\x02\xd3\xbd)\x8a\xaf\ +\x9e\xb9\x9ev\xcf\x1e?F\x94`\xb4\x81(\x12\x0b\x14D\xf9Lx\r\xc8_\x95\xd1\x90z\ +@\xb4\xad\xb2\x82u\xe0\x00/\x91\x01G\xac?\xa8K7\xdf@\xd2\x07\x8en\x0eV\x83jc\ +\xcd\x9a6\x91m\xf0\xe1k\xc4\xe4\x0b\xb5\x1d\x1f\xed\xc5>C\xbc4\x8b\xf5\x13Y\ +\xa6P\x99\r4*\' \xdd\xa3\xe0\xf0\x82\\,\x804\xe3Zam\xb3\xbb\x8b\xe7\xe9\x01\ +\x98\xce\xd5\x9fZ\x9a\xd4\xb0\xbc3\xac\xfc=i\xb4#\x060\xd0\x16i\xce+\xf1QI\ +\xdc\xe2\x17\xdfz\xae/U\xb6O\xa9\xb6\xd1}\xf6 \xf4\xddFK7\xde=\xc4\x80u\xfa\ +\xdajHj\x9a\xbc\x84hH\x17\x0c<#\xda\xe5\x8a\x86F{i\xc0\x14\xaa\xe7Hs\xfdo\ +\xce4\xd9\\\x83\x10Ey\x9f\xd5\xac`\x82E\xf5\xcf\x8b\x03\x86\x87\xcdSxf\xd0\ +\x88\xe8\x1a\x1f!\x1b\x1d\x99&i\xc6t\x81\xf0M\xa5*h\xf0\xe53\xf5\xb0a\x89l\ +\x0f\r\x08\x1e\x14\x80\x9e\x07\x06\x8c\x11\xb4;\xae5\'\x85I5F[S`R\xb1\xb9\ +\x85vWh\t\xc2U\xd3\x15\xb7\xd8\xec\x04:\xc5\xd6\xacjC\xd6W\xdf?\x8b\x8f\xb5\ +\xc3\xfb\x8d\xf0"_\xf4\xdd\xed\xbf[\x00}\xf8\xf0\x84\xa4b\x19+\xb0\\Y\rZ\xaf\ +\x15\xa66\xe8\x93\x0e\xf9\xc9\xea\x9d\x05\xa9(\xb66\xe7xw\xee\xe4}\xb3\x01\ +\x83=Q\x8c\xdc\x98{t\xbf\x0f\xfe\x80F2\xa8++\xd1>^O\xc4\x85\xaeN[\xbc?\xe9\ +\xc1\xec]A\xbf\x0f0\xa5\xaa2\x8a\xed\x92\xcc\x9bB\x87\xa1r\xda\x91\xb9\xc7\ +\x99\xe4\xf8\x1d\x0e\x02\xe7\x9e\xc3}k\xf7U\xcf\x9a\xaco\x9dyY6AC\xb7S7\xa6)ct\xfdPl\xaab\xc7\x1e|\xca\xc5p\xf4<\xce4\ +\xb4\xc1\x90\xdaEZ&\x92~\x17\x04\xae\xdfo!\x81\xe5\xdd\x0c\xa3\xcdE0\xc0\xd6\ +\xba\xe2\'\xbej\x95\xbe\xc11\xbc\xdf\x10\x94\x18H}\xa6\xac\xecwo\xaeR\xd5\ +\x9a+\x9d=h\xcfLc\x7f?{C\xbd\xc2I_\x07\x8cs\xbd\r\xfd>\xe9k\xb1\xd01UW\x9a\ +\xf0\xbeT|\x8f\x8e\xf3\x8e\xde\xf5=7q>\xe71\x01\xc0\xc6L\xb6\xc1\x80K@<\xb2~\ +\xffH\x9e\xcf\xd0\xd5\xae8oc\ +\xe0\xe1\x9f\xcc\x9e\xbf\x9c\x0c\xeaF\xb1\\n\xc2\xba\xab\xfb9*U\xe7\x80d7\ +\xc20\xda\\0OQ4\xe0\x01\xe2\x14;G\xc3\xecKN\x96A\xf9m\x8a\xa4CF\xc3\x95}\xc1\ +\x19\x17\xf6\xa6\xcd\x1b#\xde\xc1g\x19\xe8\xaa<\xdfA\xe2\xb5\xcc\xe9\xd5\xa5\ +\xe0!\x91\xa0i\x83a\x9f\xe3\xd7\xd2\x95X\x9a\xdc\xc2\x18\xd3\x8e\xb2\x1c\xad\ +]\r\x89\xff\xb0\xe8,`\x80\xf0G?\xad <\xb1U`\xfd\xd2\xf0\xe6\x9afxS\x16\xb7\ +\xe2\xbdP\xdco\xad\xa9{\x17\x96l\xb7J\x1b\x9et\xfcX\xefT#\x0f\x9cbM\x14\xb0\ +\xf9{\x00\\q\xd0Q\x88\xaaq~$\xca1}NrIu\x9b5\xda\x11\x98t\x7f&\x96I\xc7C\xe9L\ +Z\xa4\x1d\xddRHd\xf3c\x8d\xfcn\x0b\xc7\x00v\x86Dk.\xdeN\xbf\x9f\x88\xba\xb6\ +\xd9d\xacV\xd5Y\xff\xf2\xce\xb0\\\xceZ\tc\x12\xdbU\xbf\x91\xa6\x86\xe4\t\xe9\ +\x92\x7f\xf9\x1d\xefkQ\x93\xc1iGD\xbc1\xb4K(^4Z\x1b\xbf\xfcB4;\xd4\xedo\xa1#\x9e\x00?Yw\n7J\x15\xe5}?)\x99\xe4\x93\x9d\x1d\xaa\xf5q\xac\ -\xdcZQ\x82\xe7\xcd\xdc\xf5\x12\xad\xd9H\xb5\xed\xfanv\x87:Y\xb7\x05[$\xacML\ -\xee4\x1b\xfa\xb3\xa7\xa4\xa4\x8c\xd2o6c%^/\\\xbb\x84\x1f^5\x8cQ\x06~+\xe4\ -\x8a\xe9\xbb\xfbk\xe2z\xb5\x81\te\xdc\xdfx\x85\xa3\xd9\x99\xd1\x8d\x03\xbb\ -\xea\xd68\xd0\xb9\x04NbeIZR\xa6\xc5\xcaJ8C\xf2]i]\xe3N\xa0Wa\x85Z\x9993e\xf1\ -\x14\x13_\xce\xe0\'5\xe2\xbf\xa0\xd6y\x1d\xd9\xb0\xd2\xe9\x0e\xdc\xcaH\x9a(\ -\xcb\x15\xb8\xda\xb4c\xd1>wf\xef!be\x9f\xb4\x98_\xbb\xf0\xb3\x8cR\x97\x94d!Y\ -0!\x0b\xda\xb9\t\x8ck\xac\xec\x068B\xd6V"g\xa0\xa4\xf2\xe4\'\xebC\xdf\xac\ -\x92\x8d\xab|)\xc3sZ[\t\x9cm\xcahIl%^\xb1c;\xf4F\xd3\xcaD\xa9\x1bV\xda\x1c\ -\xa3\x0b\xac\x89\x95K\xcf\xa5\rw\xa6a\xa5^\xa0$V\x96\xb8\x98\xcf+\xa3O\xcc,\ -\x94RWV\xe6\xf8\xc8\xb1\xe11\xf4T\x8c\r\x99%\xb76e\xcc\x06\r\xcc3\xc5\xa9L\ -\x923\xcaq\xca\x90\x03M\x03\xa79\x1bY\xbe\xcc#\xbbc-J\x7f\xf3w\xd1\x8d<\xdb\ -\xa75>\xee\x92\xd2\x8e\x1cR\xc5\xda\x8a\x92T\x04z1\xdb3\xb9H\xcfp\x96\xc79\ -\xdf\xb95eY\x11\x98E\x1fQ\xf9\xe8\x10\xd7\xf7\xf3\xa9\x8e\xb5\xd5CB*\x02\xb3\ -\xb4\x13\xa9\x1c\xe2i\xa5\x1f\xe6U\xac\xad\x9f\xcb:\x8b4\xab\x03"\x97\x88\ -\x98~\x98W\xb1\xb6\x0ex\x18M:\xab\xac\xbb\xba\xa9\x8a*\xc17*\xeb\xc4\xfc8\ -\xaa\xa0_\xc8\xbd\xb4g\xd5AM\xb9T\xf7\x0c\xbe\xf6A\xd9@\xb3\x88\xaf\x02\xfc\ -\x1a\xcb.U\xacm$/\x92+\xab8\x9a\x7f$W\xe2n\x11x\x07x\x0ee\xb1\xb6\x95\xa2I\ -\xae\xe4\xd9\xc2\x86_\xb2\xb2\xa8\xf4L\x99C\x0b\xf9\xc8+\xbd\xaa\x10!\xb9\ -\x12k\xd7\xc2\x971\xdb\x07\x9f\rj\x9b\x9f\xbb\x10i\xb2\xbc86Z\xd9.\xb7H\x06\ -\x10|\x07nB}\x10\xe5\xc5\x9d \xfa\xf8\xbc\x86y\xf2\xe5RQ\x993@\xac\x07Z5P\ -\x94OvWf\x99B\x9e\xe7}X_,\x9dS\x94\x89\x9c$\x9a@\x9c!QF\x90\xacS\xca\xe3<\ -\xa2\xe5\x17\x04\x9aEx\xcc\x14E\x9e`\x99\xa3\xa9\x9f\xdf\xdf\x8eP\n\x9a\xc8\ -\xcd\xeavJ\xff\xd8\x9b\x17\xad\x1d\xca\x93.\xcc\xd7\xe8\x1f\xa7\x14\xb4Zi\ -\xbe1\xebF&=\xa6_\xbe\xdb\x1e\xf9V\xa0\xdf\xdd\xfe\xf3\xcf\x13\x9f\xf8\x11\ -\xe6\xb3>5}\xc0\x075\xfd\x17\x19\xafZq' )) + return zlib.decompress( +'x\xda\x01r\t\x8d\xf6\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00n\x00\ +\x00\x00,\x08\x06\x00\x00\x00\x84\xcb\x8d\x9c\x00\x00\x00\x04sBIT\x08\x08\ +\x08\x08|\x08d\x88\x00\x00\t)IDATx\x9c\xed\\?h\xdc\xc8\x1a\xff\xc9^\x8cx\x88\ +CE\n\x15*Tl!\x0es\xe7b9\xb60A<\xb6Hq\xf0\\\xbc\xc2\x85\t\x82\x98c\x8b\x14W\ +\xbc\xc2\x1c.6\xe0\xc2E\x8a\x14.\x96#\x81%l\xb1\x859\x16\x9fylq\xc5r\xa4\x08\ +\xc7r(W\x1c*R\xa8H\xa1"\x85x\xa8\x10\xc1\xef\xf4\x8ax\xc6\xa3\xd9\x914\x92v/\ +\xbe\xbc|\xb0\xc8\xbb\xdf\xdf\x99o>\xcd\xa7\xef\x1bYQ66\xf1W\x81\xf4\xfe\xb3\ +t\x9d\xf2\x95\xe7\x0f\x94u\xca_%(\xb7\xc9q\xebvLS\xb8M\x8e\xfd`\x8e\xbb\xedN\ +\x92\x85\x0f\xe5\xcc?\xc5q\x1f\x8b\x93d\xe1\xcfp\xe6J\x1c\x97\xfe\xf1\xdf\ +\xe6\x8eqG7\x7f\x8f\xdc\xc6\xe2n\x9b|ecs\xa5\xce\xdcT\x94\x8dF\x02\x88\xd3t]\ +G\xb7\xdbE\x92$\xe8t:K\xd7(\x8a\x90$\t\xe5#\xf4\xf4wo\n\xec\xec\xd1A\xf3\xf8\ +2\xf9\xbc\x9e\xaa\xf2y\xbbVm?\xd2t\xa0(\x1b\x8f\x1aM6\x0b\xca\xc6f\xa3\x0f\ +\x80T\xd7\xf5tp2H\xfd\xd7~:\xfbi\x96\x06o\x82\xcc\xd5\x7f\xed\xa7\x83\x93Aj\ +\x18F\xca\xd3\x0fN\x06\xa9\xae\xeb)\x00\xfa\xe1\xf1\x86a\x14\xca\x17\xe9\xa9\ +"\x9f\xe0\xf3\xf44\xb5?\x83wG)\xdcQ\xdax\xdek3^\x1b\x00 u\x1c\'\xf5_\xfbir\ +\x95\xe4~\x827\x01\x1d\xf9\x90\xc9\n\ +\xde\x04R\xf2\t\x9e8\x8d\xf0\xad\xca~\x11\x9e\xce]\x03\x07\xb6\xaaF\xa8(\xd1\ +\xf0}\x1fA\x10\xc0\xb2,\x84aH\x7f\xb3m\x9b^\xa3(\x82\xeb\xba\x00\x80\xe9\xf9\ +\x94\xd2\x07A\x00\xdf\xf7s\xe5\xf9\xbe\x8f\xe9\xf9\x14\x00\xb0\xbf\xbf\x8f \ +\x08`\xdb6\x00\xc00\x8c\x8c>\xcb\xb20\x99L0=\x9f\xa2\xdb\xed\xc20\x8cR\xf9A\ +\x10 \x8a"\xf4\x1f\xf6\xe1\xba.\xa2(Z\xa9\xfd"\xbch>\xab&4\xd2\x8e+\xca\x0cm\ +\xdb\xa6\x93\t\x00\xa3\xd1\x08\xc3\xb3!\x1d8\x99\x14\xc30\xe8\xe0\t=\xe1%\ +\x0e\xe0\xe5\xd9\xb6\r]\xd71<\x1bb\xfe\xd3<#/O\x1f\xcf_&\x7f\xef\x9f{\xd4\ +\xbe:\xf6\xf7\x1f\xf61<\x1bR\x1de\xfa\x8b\xe6W\xd6\x81\xa5\x99Iz\xffYZ\x96\ +\xce\xfb\xbeOW\x95\xef\xfb\x98\x8c\'\x08\xc3\x10/_\xbeD\x18\x86\x98\x8c\'\ +\x19\xfc\xecr\x96\xf9.Z\xb1<>\x0cC\xcc\xe7s\x84a\x88\xe1\xd90\x83\'\x93F\xf0\ +"\xfe"\xf9\xbc=\xbc<^\x1fK\x0f\x00\xae\xeb\xa2\xff\xb0O\x1d_\xa6\xbf\xe9|\ +\x03%\x8e\x93}\xfe\xe2W\xd8\xfe\xc1>\x0c\xc3\xa0\xb7\xab\xfd\x83\xfd\x0c\xfe\ +\xde\xd7\xf7\x96V,\x19\xb4a\x18\xe8?\xecS\xbceY\x99h\x16\xe9+\xc3\x13\xf9\ +\x8e\xe3,\xc9\x17\xd9S&\x8f\xa57\x0c\x83F"\xd1Sf\x9f\x0c\x94\xcd\xbd\xf0VY\ +\xf5\x81\x99\xac*2\xf9\xae\xeb\xa2\xdb\xed.\xed\x11\xc0\xcdm\x88\xd0\xb1{\ +\xc7d<\xc1\xfe\xc1~f\xaf\x99L&\xf0\x9f\x8b\ +\xc7\x9b\x03\xf5\x1c\x97\xd3AVU5\x1b)\xbc!M:\xcf\x02\x19\xb9\xfa\x1a\xe2\xcb\ +\xf8\xaa\xd2\xf1`\x18\x06F\xe3\x11\x1c\xc7\xc1|>\x87{\xe0V\xdaZ\x80:\x8f\x03\ +\xcc\x8a\'Y\x17\xb9\x92\r\xd9q\x1c\xe8\xba.\xcd\'\xa2\'t\xf4w\xce\xe9\xa4\ +\xc3\x9c\xc7Wf\x0f\xcf\xcf\xf3-\xd9_Q\xbe\x88\x9e\\WQ\xcb\xac\x95U\x92{4\xdb\ +\x1fco-\xa4/F\x9f\xc7\xae\'\x9d\xa4\xd6<\x1fO\xcf\xca\x9fL&x\xf2\xf8\xc9\xcd\ +\x06\xce\xe9g\xf1u\xe5\x93\x1a)\xe1[\xb2\xff\x1ad\xe5\xe7\xd1\x13\xbaU\xd427\ +\x95\xdf~|\x84/\xff1\x90\xe6\xf0\xde\xa7\xc2G\xdf\x1d\xc1\xb2,X\x96\x05M\xd3\ +2W]\xd7\xd1n\xb7\xd1\xdaj\xc1\xff\xddG\x1c\xc7t\x10\xae\xeb\xc24\xcdB\xfa\ +\xed\xedm*\xdf4M,~Y \x08\x02j\x02\xab\x9f\xe0\x93$\xa9%\xbf\xddn\xa3\xf3U\ +\x07\xbd^\x8f\xf25\xb5?\x8f\x9e\xd0m\x7f\xb1\r\xdb\xb6\xa1i\x1aTU\xc5\x8b\ +\x9f_d\xc6W\x96\xa0(\xcf\x1f(\xef\x0f\x0bUt\\\x92$p\xfe\xee\xd0\x8ew\x1c\xc7\ +X,\x164\x0bSU\x15Q\x14\xa1\xdb\xed\xd2\xc1\xb0\x1d\xe6\xab\xab\xabBz\xefW\ +\x0f\x9d\xaf:\xb0,\x0b\x9e\xe7\xe1\xe9\xf7O\x11\xc715\x81\xd5\xefy\x1e./.q\ +\xe0\x1e\xd4\x92\x1f\xc71\xee\xdc\xb9\xb3\xc4\xd7\xc4\xfe"\xfa(\x8a`\x9a&\ +\x00@\xd34,\x16\x8b\xa5\xf1\x95:\xee\xd5\xc5\xa3ME\xd9\x80\xf2\xeaB>\xea\xbc\ +):\x9d\x0e\x0e\xbf9\x84\xa6i\x88\xe3\x18\xbe\xef\xe3\xf4\xe4\x14\xd1\x7f"\ +\x8cGc\xd8\x9f\xdb0M\x13\x86a\xc04M\xa8\x7fS\xe9\xf3\xd1\xd5\xd5\x15F\xa3\ +\x11\x8e\x8f\x8e\xf1\xe2\xe7\x17x\xfa\xfdS\xb4\xb6Zt\xbfh\xb7\xdbH\xde%\xe8\ +\xf5z\x99\x15\xc9\x9e\xba\xb2m\x9b\xeaWU\x15\xc9\xbb$#\xbf\xc8\x1e^>\xf9\x10\ +\xbb\x1e\x9f>\xc6\xd5\x1fW\xd4\x1e\x91\xfde\xf2[[\xad\xa5\xf1\xf2r5M\x03\x80\ +\xca\x11Gj\x95\xb5\xf68\xbe\xdfe\xdb6\x8e\x8e\x8f`\xdb6\xad8\xb0\xfd4\xbe\ +\xd2@\xf6\x02\xb2\x1f\xf0\x95\x06\xbe?F\xce\x84\x90=iz>\xcd\xed\x8f\xe5\xd9\ +\xc3\xda.\xea\xa7\x89ZN\xac\xbe\xba\xf2\xd9\xf1\xb2\x0f\xf9\x00\x1a\xedq\xd4\ +q\xca\xf3\x07J\x9d\x8e\xb7L\xff\xadJ5_T\x0bd\xcf\x84\x88\xce|\xf0\x1d\xe9<{D\ +\xf4\xac\x9dl\xcb\xe9\xc9\xe3\'\xf4\x8c\xcb\xaa\xfa{"\xe7U\xe9\x1e\xb0=\xb9\ +\x8d_\xcb\xe4\xcf\xe0\xc8D\x1c\xef\x9b\xa5[\xa5L\xe4U\xed\ +\xbf\xb1\xb5;R}\xe7\xfbcE\x11GnKy\xdfE\x1d\xe9\xd3\x93S8=\x07\xb3\xcb\x19\ +\xee}}\x0f\xd3\xf3)t]_\x8a \x99\x15\xcf\xda/+\xbfh\xbc\xfc\x19\x9c2\xfd\xa2\ +\x80\x12\x1eAW^]<\xcaMX\xae\xb3\xca\xdd\xbb\xbb\xb0,\x0b\x8b\xc5\x02\xc7G\ +\xc7\x08\xc3\x10A\x10 \x8ec\x04A \xac\xdd\xb5\xdbm\x9a}\xed\xde\xdd\xc5\xe17\ +\x87\xd8\xbd\xbb\x8b^\xafG\xb3/\xb2\x08Z[-Jo\x9a&\xc5\xf3\xdf\xf3\xe8\xed\ +\xcfm\xf4z=l\x7f\xb1\x8d^\xaf\x87\xe4]\x82\xd9\xbfg\x08\xc3p\xc9\xfe\xa5\xac\ +\x8e\x03\xde\xfe2\xf92\xe3\x05\xca\xb3J\xe5\xf9\x03Eyu!>\xb6.}b9\xe7\xe4\xb2\ +\xf0\xa4\xae\xe0S\xe5\xa4\xb0\x88\x9e=n.C/:\xe1\xec8N\xaa\xaaj\xa5\x93\xc6\ +\xb2\xf6\xf3r\xca\xe8\xf3\xf8\x88\xfe2\xbf\x94\xbe\xf4\xb1\x14}2\xd5|\x01\ +\xc4q,]}\x17\xd1\x8f\xc7c\x9aR\x93\xefE\xf4\xbc|bg\x1c\xc7\xd5\xba\x11;{\x80\ +7\x95\x96O\xe4\x14\xd1\x17\xf1\x01\x80\xf2\xdb\x8f\xa5\xb9F\xe5\xd7\xac\xd8\ +\xb7s*u\x03\xb8\xaa~Y\xf5\x9d\x00\xafG\xb6*\xdf\xa8\xba\xbf\x06\xfby\xfa">\ +\x99W\xb2j\xbd\x1fW\xfa>\\^u{\x1d\xef\xa5\xad\x03>\xb0\xfd2\x8e\xabuX\xa8\ +\xf6Kz\x15\xdb\xf3k\xa7\xaf\n\xb7\xc8\x9e\xda\xa7\xbcr\x9dWf\xac\xec`\x08\ +\xdd\xba\xe8\xcb\xe4\xd4\xc5\xf3t\x15\xed\x91\r\x8a\xb5\xbd\x03\xfe\xff\xf6\ +\xdew\x1e\xac\xeb}\xf0O/\xef\xaf\x01\xfe2/\xef\xd7\x81\x8f\xc5\x99\x1f\xf5\ +\xbf\xcb\x90\x85\xdb\xee\xccO\xff\xa0\xa6&|\xfa\x97P7\xf0?\x82^\xa4B(N\xc0\ +\x01\x00\x00\x00\x00IEND\xaeB`\x82m\xe8\xcc)' ) def getPythonPoweredBitmap(): - return wxBitmapFromXPMData(getPythonPoweredData()) + return wxBitmapFromImage(getPythonPoweredImage()) def getPythonPoweredImage(): - return wxImageFromBitmap(getPythonPoweredBitmap()) + stream = cStringIO.StringIO(getPythonPoweredData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getGreenDotData(): - return cPickle.loads(zlib.decompress( -'x\xda=\x93KO\xeb0\x10\x85\xf7\xfc\x8aH\x01z\x05m\xe58\x8e\x93\x00\x8dp\x1c{\ -G\xbb@B\x88]\t\xa5PJ\x1f\x14(\xf0\xeb\xaf\xed3\xa9T)\xfa<\x0f\x1f\x9f\x99\ -\xfe[n\x92\xa3\xdb^\xc2#\xf7\x93I\x94\xf4\x8e\xa6\xb7=\x15\xb5Q\\\xea\x86\ -\x95:\xf0\xc4\xb3\x15VY\x11\xf8\xc6s\xaa\x1b\x95"\xce=3]K\x06.\x03\x8bR0\xe4\ -\xef=KmM\x8ex\xed\x99\xeb\xd2p\xf0\xd8s\xa3-o\xc0o\xe8o\x94@}\xdfs&\xac\xc9T\ -\xe0\xe3P/\x1aE\xf5#\xcf\x89\xd0Y\x82\xfc*\xe4k\xdbH\xc4/\xd1\xcfJ\x01~\xf2\ -\\8=\n\xf92\xe8\x13V\xe7E\xe0\xe7\xa0G\x98\xa2A<\x0e\xfd\x9d\x1f\x89\t\xfc\ -\x17\xfa\x89R\xa6\x88\xef<\xe7N_\xc1\x02\xa7\x94_p\xf00\xf8\xe7\xee\xb3\xb8\ -\xbf\x08\xfe\n#K\xd4?B\x7f\xadH\x7f\xebYkg\x0f\xf2?=\x0b\x97\x9f!>\xa7\xf7\ -\x19\x89\xfe\xbf\x98\x97\xe64\xaf\x17\xaaWT\xffJ\xfe\x98\x04\xbc\x82\xff\x86\ -\x93\x7f:\xf4\xd7\xba\xf3\xe7\x1d\xf7\xd9\xce\xff\x0f\xe8u~!~\x8fy9\x7f\xc0W\ -\xf0\xaf1\xe4\xf7\x96\xea\x8d\x80_\xd7\xf0C)\xba\xff\x0b\xfb\xa18\xedG\x1e\ -\xfcs\xef!?N\xc3|D#\x0b\xe4\x0f0o\xc3Ho\xe4x\xbc^\xcd\x02\x9c`\x18\r\xa7e\xa5XgV\x14\r\xef\xd7\xfe\x13\xd1\xc1\xe4\xfc:>>9=\x1c\ -\xac\xcfF\x83\xcb\x8b\xaa\x7f5\xa4\x83\x84\xa7"\xabd.\x0b\x1c\xac\xcb\xd1\ -\x80m\xab\xfd\xec\xe3s\x82\x8d\xfbz\xddl\xa7}\xb9{\xaa\x9e\xe9 \xdel\xfb\xd9\ -|?\xab^\xb0#\xa1\xa4\xbf\xd8\xcd\xde\x96h\xfa\xc7\xe3\r\xcb\xe6\x8b\xf9\x0f\ -\xdd\xd2~?\xc6+\xb6}\xbf\x19w\xc2\xda\xfan\x14\xc7z|P\x1aE\x0fJ\xb5$}\xf8\ -\x1f=J\r\xe2' )) + return zlib.decompress( +'x\xda\x01\xb8\x01G\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x0c\ +\x00\x00\x00\x0c\x08\x06\x00\x00\x00Vu\\\xe7\x00\x00\x00\x04sBIT\x08\x08\x08\ +\x08|\x08d\x88\x00\x00\x01oIDATx\x9c]\x92?kTQ\x10\xc5\x7f\xf7\xeeCF\x0c2H\ +\x90\xab\xb1x\xfe)^\x08\xc8+,"6\xafL\x99\x8f\x13H\x13\xbf\x81\xe5\x16\x16),\ +\xb6L#naa\x111\xe5\x16"\xdb\xc4\xdc\xf2\x11\x122\xc5\x1a\x07\t\\\x8b\xdd\xd5\ +$\xe70L3g\x869\x9c\x10\xe2\x80\xeb\xf8\xfd\xe7W\xc9g\x19\xa9\x84\xa7\x0f\x9f\ +\x07n!,\x05\x17\x97\xe7e\xef\xf3\x1e\xa3\xd9\x08\x1a\x10Q\xd4\x95\xedj\x9b\ +\xb7/w\xc3\r\xc1\xc9\xe9q\xe9>t\xd8+C\x9f$\xd2j\x8dV\x8aV\x8achV\x86\xf5;\ +\xee\xde\xb9\x17"\xc0\xcex\x87\xfeE\x8f\xac*\xaa\x8a\x8a\xa0\x95"(\r\x9bP+\ +\xc3~\x08@<9=.#\x1b!*\x88\x08"\xe08\x00\xb2\xa8\x96\x96\x03\xbepqy^\xe2\xf8\ +\xfb\x18V\x00Y\x08*EH8\x86\x03\x86\xe18)%\xb2e\xe2\xf2\x19\xa9\xfe;!\xf8\x82\ +\xfd\xa2\x1b0\xbf\x1c\xbb\xa6\x83\x19\xf8\xccqw\xfc\xca0\x0c\xb9F\x80|6\xa5^\ +\xa9\x89\xeb\x8f7BK\x8b\x9b\xe3f\x98\xcdE\xfeow\xcf\x94\t\xed\xac\xe1\xd1\ +\xfd\xb5\x10B\x1c\xf0\xed\xe7\xd7\xd2\x1dtH#H\x92\xb9SI\x91J\xe1\xca\xf1\xec\ +\xec\xa7}\xd6\x1fl\x04B\x1c\x10\xe2\x80\xa3|T\x9a\xf7M\x91\x91\x14=\xd4\x92&\ +\xa9\xa4I*[\x87[ej\xd3\xb2\x9c\x0b\xb7\xa3\xf1\xe9\xc7\xc7\x92=\x03\xd0j\xcb\ +\xebgon\xc4\xe3/\x13\x86\x94tcF\xf6\xa5\x00\x00\x00\x00IEND\xaeB`\x82[\x05\ +\xbdE' ) def getGreenDotBitmap(): - return wxBitmapFromXPMData(getGreenDotData()) + return wxBitmapFromImage(getGreenDotImage()) def getGreenDotImage(): - return wxImageFromBitmap(getGreenDotBitmap()) + stream = cStringIO.StringIO(getGreenDotData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getmeatballData(): - return cPickle.loads(zlib.decompress( -'x\xda\xcdZmw\xda\xc6\x12\xfe\xde_\xb1\xb5\xb1\x1d\x03\xd9"\t!\xc9\xd8>\xd6\ -\x0b\xdc\xc4\xb1M\x127\tMO\xdc\x10\xc7\xb1\x818\x10L\xdc\x84\xbc\xfc\xf6;\ -\x9aY\t\t$\xb1\x02\xb7\xa9\xf6\xb4\xc7LV\xbb\xcf\xce<3;;\xda{\xef\x87\xca/\ -\xa7[\xa6\xc6\x8c\nS\x14\x85\xa9[\xbftN\xb7\xd6\x19;g\xce\xfb\xcey\x1f\x7f*\ -\xfe\xcfu\xaf\xe1\xd5\x1a\x06\n\xb6Q\xe0x\xb6\xed\x90\xe0\x19\n*\xfec\xa2\ -\xe0w\x14\xb8\x15\xa7\xe96Q\xf0\x10\x05UU\xb34\x05\x05;\xdc\x17(&\xb4\n\n\ -\xc6,\x14\xd0\x18\x87(\xb0\x1d[\xb1\t\x96\x19\xe0\x00$(h\xd1,\x8a\xab8\x1e\n\ -\xbeN{4Pp\x14\x003\x05\xb0/(\xd0U\xdd\xd6iP\x8e8\x9a\xcd\x064\x14\\P\x8f*\ -\xf4\xa1Am\x16\xf4h\xd2j\xf7\xf0\x15\xb7\xe6\xd5\x04\x8eM\xec\xd1hz\xb6PPU\ -\xbc\xd24\xc4+]Z\x8bg[6\r\xda@\x81\xa6jU\x8d\x80\xd5Q\xa0*~C\xc1\x1f\xe1+\ -\x8e\x8e\x82\x01\xcdb\xf8\r\x05\xfb\xb4|\x1b\x9a\x8b\x82cR\xb2]u\xab(X\xdb\n\ -_i\x1ak~\x0f\xc6\xc5,\xbaJ8,\xc2aiV\x95\xf4q\x8f\xc6p\xab\xd5*-\x8e\x05k\x81\ -\x87,\x87\x02C\xaf9\x86\x86\x82\x02\x8d\xe1h\xbaFH{\xf4\x8a\xd1\xd0\x1b4\xcb\ -#B\xea\xbav\x83f\xf9Fv1}\xc6\xa0`\x03\x81i\x9e\xa6h\xf4\n\'\xe8\x8a\xa7x\x0e\ -\n\x9ad\x17\xb0[\x8d\xa6}\x1b\x8ca\x8a1\xbe\x0b\x06\xa9\x8a`PG\x90\x0e\x1a\ -\xad\xe5j\xfa\n\xf58\x08_\x11Z\xdf\xe7\xc4\xa0\x86!\x184\x0c\xa6\x85\x86\x82\ -_Q`\x9af\xcd\xa1Wj(\xa8)\xba\xa3\x93\x82\x1e\xd0j\x1b\x9e\xea\xd1j\xcf\x821@\ -!((\x93\xb1\xc1\x08\xc2\x1b\xda\\ \rh\xf9!\xa0\x94#\x184"\x9fS\x1c\xcb!\xe8-\ -\x1e\x08\\\x0b\x05\x7fb\x0f\xcb\xb1<\x9b^yJ\x02\xd5\xd4M\xe2\xc7\x80\xd3\xa0\ -!\x83\x1c\x1aT\x07\x96\x91\xd6\xf7\x08X\xc3o(\xd0h\xb5\xa82\x14Thq\xaa\xa3;4\ -\xed--_\xf3\x1b\n^\x91\xc0\tW{M\x83Z~C\xc1GA:\xdf2(x!V\x1b\xba\xd8\x89\x80n\ -\xe9&Y\xff\xf5\xb4\x07)\xd9 S\xbaJE\x18{\x83\x90\x82-M\x9aeW\xac\x16xH\xaf\ -\x14iP\xcb\xb2-\xea\xf1[`\x17\xa3J=&D\x07?\\\x90\xc6\xee\xe3\x18\xa6k8\x06\ -\xe1X\'~\xd4\xdc\x86`\xf2%\xad\xd6\xf0\x1b\n^R\x0c2\xc1+Ip\xe3\x0bN\x06\x1f.\ -\xf0\xd7_\xe4\xd6\x15[s\x89O\xe7\xd4\x7f\x1aMJ<\x14\x90\xfe6i!\x168\x03\t\ -\xea\x14;+a\xa8\xdc\x15~\xdeT\x1a\x84\xfb\x7fd\xa5\xa6\xe7\tK\xbf\x17\xcc\ -\x0f\x89~?\xf0QC(\xf44\x10\x04\x81\xb0OH}\xe2\x93\xe9?\x93\xfe*\xa6f\x12\xd2\ -\xe7"f\xf9\xfeC4\xa6i5\xb7\xe2VQ\xa0\x8bA\xc3@\xf8x*\x10F\xa1\xc5\x81\xbb\ -\x89i\xdf\x89\x18\xee\x06\xfa\xf8$\xf8dh5\xb2\xc1\x13rk]kh\xa4\xc2\x1fd\xc7J\ -\xb5Q%\x05\xb9\xc1,\x01[J\x14\xb3,C7\xc8\xf4\x07\xc2\xcf\xdd`/yC\xd3\x1a\x9e\ -"\x82i\x99\x809\xa1\x19\n\xc1\x8eUQhq\xaa\xd8K\xaaAh\xf8\x9bf\xa9\xd4\xf4\ -\x1a\xd9\xc5\x13\x91\xc0\xf1\xdc0\x98\xde\xd1\xc3Y\x1b\xdb\x80\xdd\xfds\x07P\ -[\xac\xc4\x0e\xd8zb+\xb0\r\xb6\xf9_\x80ZL\x858\xdb\xf6\xee@\xcfKB\xbd\xcf\ -\xea\x92 \xa3m\xe7\xdf\x86\xba\xcf\xcaK\xc0\x9cRb\xf7\xdf\x81\n)nNh\x1b\t$\ -\xd1\x96\x00Z\xcd\x07U[B\x87:\xab%\xc8\r\x88\x12y\x9e\x01\xf8\x854T\x93YK\ -\x98\xbb\xce*\xecc\xca\xbf\xfd-\rTg\x170\x8e$\xd4\xd1\xd2\xdc\x1cg.D..|a\x9f\ -d\xb9\xda]\x00g\x18\xf9\xbb\xc3nr,\xe4-{\xb7\x10h\t\xfaI\xbaUQb\xcaK\xd0\x1e\ -A,\xb3\xab\x9cz73g\xdf\x80\x1e=9\xa8}\xa9\xe9\xde\xb3\xc9L\x04\xcd\x03\x96g\ -\x02\xfd,\x17\xac\x92M\x7f\x039D\xf0\xb4\xd9-\xfc6V\x88\xb4\xeb\xc2\xc0\xc9@\ -\x0brq\xf5M\xca&\xc9\xd8\x07\xf0\xeb2\xbbf\xc7\xec\x04{:K\xed^\xd36\x99\x9b{\ -\x17C\xe3\x8d\xec\x16\xf0\x02H\x90\xe2\x8b\t\xd6\ -\x97\x8a\x08E1\xef\x03v\x08\xc1\xc9\x97\x8c\xe46\xd6V\xca\x80\xfb0\x10\xc5K\ -\xd2\xe1\t\x10":Y{\x05\x1a<\x828;\x82QJ1\xe8\x0b\xa1\xa6;\xc00\xa2Ou\xc6\xf5\ -\xfc\xdf\xbd%\x81\xde\x00\xb8C\x18\xedR\x84?\xc9t\xe5$e88\xe5\x86Z\x1c\x03G\ -\xd7\xc1\xff\xebs=Xn\x98G\xe0D#h-\x08sG\x89@S\xa1\xa6\xaf\xbc\'\x91\x02\xfa\ -\xcf8\x07\xd0\x13\xa0U\x1b`\xb6\x84F5\xf9$p\x981\xecc\xf6P2N\xcad\xb5\xcf\ -\x80\x97\x04s\x04\x01\xef\x12]P\xcb\x93\xaff\x83\xa8Ii\nN\xd6H\x90\xacX:d\ -\x7f\xb0\xdf\x11d\x17x\xaaB\xb4\x18c\xd4\x96\x86\x9a\xbd\xe7\x9f\xb3\xa7\x92\ -A]\x87\xb1\x1a\xa9\x9c\x1f\xc2\x96\xdd\x06\x98]h#\xd0\xa4\n\xdbI\'c\xe7J\x84\ -\x9a\xbd\xef|\x86\xb8\'\xeb\xd1:{\x91\xc0\xd9\xb7\xe0\x8aE\x84\xe9D\x80>\x01\ -\x1b\x18b\x06I\xa8\x83\x85y=\xcb\x91\xab2 B4\x91\xb9\x06>\xfe\x1a\x81\xd9\ -\xc5(\xfa\x83\x9d\xc5\x98-\tU\x93p\x99\xe3\x1c\xa7\x00\x06\x19)\xfd}\x01\xb0\ -\xba\xe8@]\x04:\x02\n\x94\x00\xe4o\x98\xf0\xac\xe7\x87zo\xe1\xf4\xa3\x85\x9a\ -\x9f\xd5\xec\x08M>\x8a\x98\x9c\xfc\xdd\x02\xc3\x7f\xc2\\7\xfeN[\x0e\xea\x8dT\ -\x16\x94g\x0f:\x84\xfe\xdb\x00\xb5\x88Z\xed"\xcc\x1f"?8N\x8c\x12\x96\x0cTsf\ -\x9a\xf9\x89\xc9@\x97s\xe9\xca|+Cho\xb1\xbf\x84\x8e8\xfc\xcd\xe10w"\xa2\x82\ -\nc\xd4R\xa9$\x01u\x94\x90\xe9L\xc3\xb9\x16n\xbb,\xa1^\xa2D@j\xa0\xcb\x16D\ -\xcd\xd73\xd3u\xc2\xfd);\x8e\xa7A]K\x8b\xa9\x83\xc8\xf1\x96$\x8a\xa0\xc84\ -\xbc\x0fb\x0b\x1a\x03+\xfb\x90m\xb6\xc0\xd0}\xb6\x15*\xa0(2\xcf:\xa6\xe6\'\ -\xc0\xd0\xf6\xccA/\xdez\tP\xd7\xe2Z-\xa5\xd2\xfbR\xa4\x80\x0c\x8fy\xaa\xd0\ -\xc5\x04\x12\xed\xe9\xe3\x01\xa4\x16\xb6\x11\x06xz\x0e#\x9aR!\xaf-\x02\xd4\ -\x0e\xf4\xc9\xd2\xeb\xfeb\x02\xdcf\xbc\x10H\x02\xbe\xbe\x82\xff\x7f\x9c;\x8b\ -u\x01\xe2\x03\xf6\'\x84\xa6\x92\x90}\x85Q\xfd\xe5=D\xfdj\x00\xf5\x1a~Uc\xef\ -\xcd\xc6\x80\xfeb\xa8\xc73\x9b\xe8\xec\x86\xeb\xe7\xe5\xe4HO\x80\x14\xdf\x81\ -\x8d~\xdc|\x1d\xe1z\r4\xb6\xc7\xbea\xb8\x8f>\xe7\x10\x05(n\x1bb\xa9\x03XP\ -\xf0\xbcL9\x11d@\x1d\xceA}\x1c\xe9\\\xc0!p"\xbe\x01\x7f\xbd`\x9c\xfbKx\x94x\ -\xc2\xbdIt\x0e\nSmN\xe7\xd1)\xd3\'\xabi\xd5D\xf0\xadH\xf9|\x80\xda\xed\x03\ -\x11Z\xa2.r\x8e\xae\x92\x1c\x97\x87\x89\xf5\xa7\x80H\xe3X\xc2\x17O\x82\xbay\ -\xb5j\x86\xfe\x1e\xaf\xaf\xf6\xd1\xa7I\xc7&0\xf1\x18\x0e\xdb\xc9l\xf7M9\xe0\ -\xf3\xf5Dr\xb7[\xd6\xe2\xc9\xae\xd5\xcf\x0bu \xd6^\x89\xbd2\xdd\x08/Y\xf6\ -\xa9\xec\n\xeb\x04E\xd8\xe7\x0b\x98\x12R\xf4e)q\xf36\x1fWw\xe6\xb8\xba\x03,\ -\xdaH\x81\xf2 \xac\xb0\xb4b\x8c\xa6\x7f}\x05\xee\xb6\r\xefvb&\xfd\x01V\xb1\ -\x85uL\xf8\xaf\x17\xa9\xd3\xe4"@q\x8e\x00\xbb\xa0\x97\x8bX-\xf4*\x92\x0b\x94\ -\xf8\x90\x1dp_\xcb\xf7\xa6K\xe1\xfe\xbf\x9e\x89\xb2\xd99D\xd2\x02\xdf\xe0\ -\xd1\x85F\xd3\xa2o\xd1\xc2\x0f\x0ff\xde\xe4\x0b\xa1v#\xe5\x9ebl\xad%\x1e\xdf\ -\x0c\xc8\xfc\x15\xdc\\\xb9(\x0fMi\xf4\x14\xf4\\\xe4iF\x8e\xdb\x86%\xe8U"\x07\ -8\xc7\x8e\xb7\xb81\xbe\x10\xb5\xa3z\x98\xccEW\xdf\t\xc3\x82\xcf\xe9"\xdf\xc4\ -H\x19\x04\x9f=\xdeG#\x0e"\x89\x90&F:\xa4o4<\xc9\xd4;\xf2P\x19\xee\xe1E0\xda\ -\xe2\xf4\xae\x16\xd3LW\x98\xd3\xcfK\xdf\x88\x04}\x9c\x91\x9e\xef-H\xc8\x17@\ -\xdd\xe4\x95\x1c\x19\xfe\xec\xe4~!\xad\x8by~\x9b/\xea=\x10^\x91|\x8e[P\x07\ -\xe8\xc1$\xde\\\x0c\xc8\xf7\xf9\xac\x07\x169\x93,\xa5\xd9\x08\xb4\x93\xa3\ -\xda*>\x8f?\x02?\xae\x8a:\xdc2@\xcb\x82\x81\xb2\x9f\x8b\xfc\x8d5\x9a\xacw@QG\ -2P\x8b\\\xcf\xc8r\x16\xb7!8M\x0b\xbc\x9e*\xcd2E\xcaf8O!t\xaeB\xe8\x03\xd2u\ -\x80|\x14x\x0eq\x97\x83+\xf9\x1c/I,\xb6\x1c\xc6\xe4\xc2\x0c\x81\x82"\xfd\xa6\ -<\xd4\xc79\xbeH\xa9x~-\x86\xe0\xc8:\xef2\xde\xba\x0e\x8b\x9b\xb7\xb1\xea\xc2\ -\x91\xc8\xad\xca\xf9\xbe\xb1&}G\xfd\x9e\xa0O\r\xe2\xf0>\x98\xff\xd9\\\x98\ -\x91\xa9\x0f\xec%~\x88\xab\xe4\xfd\x1c\x1c\x85\xf8L\xe4:u\x1e?bC\xce\xe4sl.0\ -\x1dg\xc6\xcc\xa9\xeb\\%\x1e\xc5s\x7f\xb9V#\xeb?J\xb9\x8a0X\xe2\xf3\xf0\xf4\ -\x0b\x01\x13\xa3\x97\x17\xe6\xa99\x0b\xec\xe5\xd8\xca?\x01\xcc\xf6\x82\x92dz\ -\xcd+\xba\x05\xf8\xa3\xd5c\x0bX\x02j<\xc7z\x12F\xc0\t\x84\xa5\x01\xd0\xe1@\ -\xca\xf1\xc6\x02N9\x12\xc2&\xb8\x1bM=\x7f{A\x01H\xe2cP9A\xb3c<\xd1\x17#L62\ -\x9d\xa7.\xd8\xabA \xdb\x01\x07\xac!\xc3\xa7\xe9\xde\x04\x0f\x96;\x9c\x92\ -\xa4\xa5oY\xec\xf3\xf9\xa9G\xe0\xf1g\xb1\xf8x4\xe3\x16\x93\xd4\xda\xd5\x10O\ -\x04Ogj\r\xc1g\xe4\xfaj\x17B\xba3\xae\xe4\x97"\x02}\\\xa7\xe8\xf1fIG\xeb\xad\ -zwe\'\x02\xb4\x1d\t\xf5w\xddZwq\xcdF\x15f2%\xbf\x01,\xd3\xe4\xee\xb1H\\]\xe8\ -\xe0\xb9\xfd2\xa1\xce\xba,\xb4\xf2\x12@\xa5\xa0\x96y;\x81\x81\x93\xb0R\xba\ -\x1aT\xf9\x9bA\x0b\xa1\xc2q\x8e\x9d\xb2\xcf\x89\x19\xa7\xb7\x82f\xa9m\xdf\ -\xdd\x950\x1f\xe8\x8b\x94\xfb\x16\xc7+^W(\xe7\xbc\'\x98\t\xb5\x05\xbb\xd2nxD\ -\xfe*u8\xfc\xe7\xee\x07\xceT\xadY\xecT\xdef[s\x91\xb6~\x070\x0b3\xe5P\xb9g-M\ -\xaboRo@i+\xc1\xbc\xc9\xcc\x9e\x96"@u\xa5Kb\xc9\xed;\x9e\x89\x7f\xc2U\xdb"?\ -\xcb\x01\xf3\xf2\xe7_`\xf6\x13\xec\xac\xf8j\xcd\\\x96\xf9\xa9w\xad\xa7[E_|\ -\xe2\xf5?\x04\xb5b\xa5\xf9;\x82\xca\xff\x0f\xfc\t^\xb5' )) + return zlib.decompress( +'x\xda\x01^\x0e\xa1\xf1\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00S\x00\ +\x00\x00F\x08\x06\x00\x00\x00\xb0\xa9\xa8(\x00\x00\x00\x04sBIT\x08\x08\x08\ +\x08|\x08d\x88\x00\x00\x0e\x15IDATx\x9c\xcd\\-t\xab\xca\x16\xfe\xde[\x15#\ +\xae\x18q\xc4\x88\x8a\x11G "\x10\x15\x88\n\xc4\x11\x88\n\xc4\x15\x88\n\xc4\ +\x11\x11OD\\\x11q\x05\xe2\x88\x88+"*\x10\x15\x88\n\xc4\x11\x11G \x8e@T *\x10\ +\x11\x88\x8a\x11\x11\x88\nD\xc4\x88\xac5O\x10h~ !\x7f\xed\xddkm\x11\x023\xc3\ +\xc7\xfe\x9b\xbd7\xfcG.\xa4\xc2\xbf\x8c\xf2\xa9\x80(\xf2\xfa7\xff\xca\xc1\ +\x18\xfb\xc4\x15u\xa3\xab\xcf\x9c]z?\x04L\x99\x03\xfa\xad\x06qF\x00\xdbh\xd0\x1f`\ +\xf40\xba\xf8,\xc3\xd8{\xae\xe7y\xa0_8\x92\ +\xe7\xe4b\xeb\xc9\xf3\x1c\xc1Sx>0\x85\xc8`\xdeZ\xf0<\xef\\C\xb6R\xfeV \x8d\ +\x13dy\xbe\xffd\x00\xb2\xc8a\x9a&\x86\xfd\xc1\xd9\xd7"\xa5\xc4\xe0\x7fCh\xd7\ +\xfc<\x0e(\xfa\x1d\xc3\xb6\xacs\xac\xad31\xc6\x90w\x04s\x958\xe7\x88\x9f\xe3\ +\xb3y~\xe7\xde\x01c\x0c\xe3\x7f\xc6\x80\\Hu\n\x87a\xa8\x00\x1c\xcd\x8e\xe34\ +\x1e7MSQJO\x1a\xbb\x8d\t\x81\xca\x9e\xd3\x93\xee[.\xa4\x1a\xfe5T\x00\xea\xdf\ +\'\x81\xe9\xfb\xfeYn\xce\xfd\xee*\xc6\xd8\x1ax\xbc\xa7+B\xc8E\xc0\xac8{=\x1e\ +P\xcf\x1b)\x00\xaa\x98\xe5\xa7\x83\x19<\x05\xe7\x93\x14\xce\x15\xdd\x01\xdc\ +\xa0?\xb8\x18\xa0"\xcd\x8e\x06r\xecyk\xc7\x8f\x02\xf3\x10\xd5\xa6\x94\xaat\ +\xba-\x01q\x1c+\xd7u\x15\xa5T\x11\xca.*\x81\xfb\xf8\x18 \x8d\x1b}\xeb\xbf\ +\x83\xc1L\xd3\xa4\xf3"\xb5\x9e\xa6\xe4B\xaa<+\x94a\x9a\x8a\xf7t\xa5i\x9a\xb2\ +\xee,5~\x18\xd5cN~\x86\x8as\xfei`RB\xf6\xde\xb7(r\xe5y^- M\xe7\x1c\x0c&g\xdd\ +o\xbaXH\x95%\xf1\xces\x8c\x1b\xbd\xb4;o\x85\n\xc3\xee\xa0\xda\x8e}V\x07e[N\ +\xe3\xfd\x16o\xb9J~\xc7\xca\xfd\xee\xd6\xe76i\xda\xc1`:\xb6\xdbyq\x8eS.n\x97\ +4l\x82\x93\xbc\n%\x17rm\xe1m|\to\xef\xfb\xfe\xda\xfd&i\xaa\xc2 P\xfdA\xbf>g\ +\x12E\xad\xf8t\x063\x8e\xa3\x83\x16\x96$\x89\n\x83\xa0\xfe\xcd\x18[\x93\xba\ +\xf1\xc3Hi=\xad\xf5\x86\xe2x\xb7D_\x8a\x93D(1\x13j\x12E\xca\xf7\xfd:\xfci\ +\x02\xfbh0\x0f]\x94\\\xc8\xad\x18\xb2\x92\xc6J\xa5\xda\x1cY\xf5\x7f1\xcb?\ +\x14HJ\xa9\xf2}_\x85A\xa0\xc20\\\xd3\x10\xf7\xbb\xbb\x1f\xa3.@\x8e\x1fF\x07-\ +\x8aP\xa6\xe4BnI\x1ecL\x197z\xb98\xd7\xddi\x1f\xab1\x8ey\x90\x073!\xca\xf3<5\ +\x89"5\x89"\x15\xc7Q\x19\x8e-\x1f~\x17 \xe5B\xaaN\xdbIrE\xf6\x9d\xb2F\x94R\ +\x88i\x06\xdd\xb2N\xce\x1a\xc9\x85\x04\x00\xf0k~\xd4\xf6q\x1f\x8d\x1fF0nLH)\ +\x01\x94s\x05O!\x82\xc7\x00@\x99(\x19\xfe=\xec4\xd6\xdeD\x87{\xef\x1e\xbc\ +\xc0\xa2(\x00J\xc1\xff8\xf8\xd2-\xaa\x1e\xa4\x98\t\xf0\x9e~\xfa\x80\xe5\xa8\ +\x18\xfe5D\x92$\xd0{\x06\xa4,PH\x89\xe2\xad@\xf0\x14b\xf2s\x02\xe00 \x81\x0e\ +\x99\xf6C\xa5\xb2"\xb9\x90\xe8\xdf\xbb\x08\xc2\xf3\xa4\xe2\x8a\xb9\x04!\x80i\ +\x18H^\x8e\x93vJ\x08,\xdb\x86m;`_\x18\x8aE\x01\xcc\x0b\xc8E)\x00\xd1$F!sdY\ +\x06\xfa\x85"M\x0f\x9bggA\xad\x12\xf5c(\xcb2\xe8=\x1d\xc0y\xc0\xe4_(\xc4[\ +\x8e8I`\x18&\xd2\x97\xee\xf9IB\x19l\xcb\x84ug\x81_s\x14R"\x7f\x13\xcb\xff(\ +\xb2$A\x9ad\x90Wef>\xcf\xf3\xa3L\xcaN\xc9\xd4\xbe\x1e_\xb7\x19{\x1e\x0c\xdb\ +\x86\xa1\x9fK5\x97\xb6x& %\xa0\xf7\xb4\xbd7L\x08\xe08e\xc6_\xd34\x14R\xd6\ +\x92\x08\x94@\xa6K \x8b\xb9\x80\x94\x12\xe9k\x0e\xb9,3\x8f=\x0f\xfds\xa8y\ +\x9e\xe7\xe0\xd7\xbc\xf3@\x9bd\xdc\xe8\x88\x93\xe4h3\xd1F\x8c\xb1\x1aP\xfe\ +\x85\x96\x00m\x90\xa6i0n\rh\xdc\x86qK\xb7@\x04J\xb5\x16\xaf\x02Y\x96\x82P\ +\x8a$\xcd\x1a\x9de\xe5\x00\xbbP\xab\x9a\x9f\xa2\xe2\x00j\xbbf\xddY\x88~E\'\ +\x8d\xb5Jy\x9eC\xfb\xaa!{\xcd\x90\xfcN\xa0\xdd\xbeK\xbem;\xb0,\x13\x94R0FQ\ +\xc8\xf2|r\x05\xc8E)\x89\xc5[\x8e,\xcd r\x01\xc8\x02\xf4\x0b\xc3d2)\x9d\xe6\ +\x89\xd4*\x99\xb6e!\xfa\x1d\x9f4\xf8$\x8a\xa0\xf7\xb4\x93$\xbc\x8d*\t\x8d~\ +\xc7\x98\x84!\x0c\xc3x/\xb0m\xa8rul\x12E\xc8\xa6\x02\x8c20\x8dB\xce%\xa2_\ +\xd1Ns\x11\xc71\x8c\xdb\xfd\xb5&`\x07\x98\xec\x0b;\xf9iQB\x90\xcf\x8b\xb3\ +\xab:P\xdaO\x7f<\x86}\xef \xfe\x19\xad\xb5\xd3\xd0%\x80\x84R`^ \x08\x02L\x96\ +\xdaa\x9a&\xc8\x1f\x04E\x9ew\x8a\n\x0c\xc3D\xfc\xdcM\xb3\x1a\xc1\x14"\x83\ +\xf6\xb5\xd9qPJ\xf7\x82\xbcz\x8e\\H\xf4\xfb\xfd-\xb3A\ti\xb4w\xbb\x88\xf7t\ +\x0c\xfa\x0e\xf4\x9e\x0e!(8\x97\xb5\xd4\x94\xfdI\x02\x9cr\x88\x99@*R\x04\xc1\ +\xa4\xf6\xfa\xb6\xe5\x80^\x13`.\x91\xcf\x8b\x83LOg\xbb\xd9\xb4-\x9aD\xcdI\ +\x8d\xb6\x8d>\xef\xe9\xf59\xdeF\xf6\xb9\xca[\xae\x8e3\xe8\x0f\x1a\xc7\xc9\ +\xa6bkN\xde\xd3\x95\xe7y*\x0c\x02\x15\xc7\x91\n\xc3\x89\xca\xdfvo\xebL\xd3\\\ +\x1bc5wzL\xce\xa1k\xfe\xa2Q2\x83\xc7\x00\xfd~\xbf\x11|1\x13[\x95=)%\xe8\x1f\ +\xb4\xfe\x9dM\x05\xb8\xc6jS!\x17r+\xd8n\x1a\x07\x004\xdd\x80|\xcbaY\x16\xcco\ +&4\xc6!\xaf$\xf2|9\x8ei\x83\xb1w\xb3\x11\xfd\x8e\x91\x0bQzoM+\xc7X\x86tZOC\ +\xbf\xef"{\x15pl\xa7\xd1\xf6yC\x0f\xa3\x7fv7*\x14\xb3\x1c\x84\xd1\x9d\xe7\ +\x00-\xde\\\xbc\x8a\xd6\x0b\xc4\xeb6\x08\x84\x10\xb8\xdf\xddZ\x95\x8by\x0e\ +\x80-\xf7\xbb\x80s\xe7\xae\x85I\x94\x10\xd0\x96Rk8\x1e#}\xcd\xa0i\x1c\x00 !Q\ +\xc8R\xd5\xf85_\x03r\xf2\x14\xc2q\xdd\xfaw\xa5\x8e\xbaf@7tX\xa6\x05\xb9(\x90\ +\xa5\x19`7\xab\xaa7\xda\x0ff6\x13\xd0\xd9\xfex\xb9qo\x9e\xbf\xb5{7B\x9a\x9d\ +\x89\xef\xfb\xad\xe7V\xdd\x1d\xfd{\x07\x00\xa0\x19\x06\xda\\\x92n\x1a\xa0\ +\x94"\xcf\x0b\x00\x04\x842\xe4\xb3\x1c\x93\x9f\xd1\x96\x9d\xd3o\r\xb8\xae[\ +\xcfc-%\xcf\x1d\xb8\xd0\xb5\xf2\xe6\xfd\x87\xa0\xf4\xc87\xed\x1ey_\r={\xcdv\ +\xfe_S\x93\xee[wV\xab\xfdhK\xd9\xcb\x85\xacK\xbfU6z5\x9bn\xde\x1a\xaa\x98\ +\x17\x8aq\xa6\xc2pR\xda\xc8\xe7\xb4\xd1\xfeM\xa2H\xb9\x8e\xa3L\xd3TZOSd9\x86\ +\xa6i\xads\xa7\xd3TE\xcbq\xe5B*\xcf\xf3\xd6\nur!\x95\x98\t\xe5?\x06\xdb\xb6z\ +Oie_R\xb8\xe2F5_\xb5\x7f\xad\x0fA\x96\xdb\xb5U*U\xdd\xaf{/+o\xcd\xbfj0\xbf\ +\xd9 \x84 }\xc9@\x97\xa9\xaex\x9a@\xbf\xa2\xd0o6lpQ4&Hv\xc5\x83\x9a\xa6\xd56\ +\x13\x00\xd2\x97\xa4\xde\x16\x9a\x96\r\x00\x08\x1eCx\xde\x10\x96e\xaeI#\xbf1\ +vF\x17\xe4\x8f\x8e\xa1\xdd\xa1\x92Y\x15\xee\x1d\xc7Qq\x1cm]+\xd2L\x89\x99\ +\xa8%5x\nT\x92$*\x8e\xa3\xb5.\x8at\x9a\xd6\xc9\xe1\xa65\xb4\xd5w\xaa\xda\xd2\ +>.\xe6E}M\x92$J.\xa4b\x8c5F\x1cr!\xd5\xf8G{\x02<\x0c\xc3Ns6\xda\xcc.\x92\x19\ +E\x11Ls\xbb\xbf\x88\xf5\xde\xfb\xcf\xf5e\x92#/\nd\x99\x80;xwR\x84\x94\x01\ +\xb4ug\xa1x\xdd\x96\x08\xdb\xb6\x1b\xe7\r\xc3\x10\xe4\x8a x\x0cP\xec\x90TBH\ +\xddD\xa6\xdf\x94\xeb\x18\x8fFp]\x17\xba\xb1\xbd\xee\xfe\xb0\xbd\xa9K\x9e\ +\x12g\xb6\xf5\xff\x00\xa8\xa5\xaez\xca\xf1\xafm\xe9\xac\xb8j{Y\xbd\xbek\t\ +\xa0-\x06$\x84\xd4uw\xdf\xf7\x95s\xef\x94\xe5\xe2y\xb1\x15\xb3Vct\x9d\xcfu\ +\xdd\xc69\xbb\xda\xccF\xc9d\xb4\xdd\xbbU;\x1b\xc7v@\tA\xbccK\x16<\x06[v\xae\ +\xff\xbfu\tH\x9e\x13$\xcfq\xe3\xf5\xc6\xcdz8\xd2\xbfw f\x05\x06\xf7}\x14o\ +\xa5\x94\x86O!\x92\x97t\xcb\xd3\x0f\x87}\xa4/)\xe4\xdb\xfbn-}I!DV\x1e\xcf\ +\xb7wq\xeeJ\x98\xb5J\xd5\xf6t/\xed\xf2\xcaM\\\xd9LQ\xe4j\xfc0R\xb6\xed\xa8\ +\xc1\xf7~\xe3\x93\xdal\xbc\xaa:\'\xd2i\xa6\x1c\xc7Q\xd9KZK\xae\xf5\xcd\xdc\ +\xf6\xd0/\xef;"\xe7\xdeYk\xb4J\xa7\xa9\xb2\x1d[1J\x95\xa1\x1b\xadR]\xfb\x81o\ +\xeb\xbb"\xd2"\xb1\x86nl\xdds.\xb2n\x9a\xd4t\xb0\xa9\x04\xab\xf5\xb45q\xdf\ +\xack\xa7\xd3\xed\t7\x9b\t*\x15\x8f\x7fE\xf5\xb6R\xa4Y=~\x9b\xc9\x19\xff\x18\ +\xa98\x8e\x94x\xcd;\xdd\xd4\xaa\xba\xee2\x19M\xd76\xd5\xeb;\x9b\xa5\xa6\x83\ +\xe94}\x07\xc0u\x97{\xe2P\xe5o\xefvI\x14\xf9Z\xa9\x961\xb6\xf3I\x9b\xe6\xba\ +\xe4\xf1\xafZm\x83\xc5k\xae\xf2\xac\xb4qb&j\xbb\\\xdf\xe04U\xc1SP{\xd5\xcd\ +\xff\xe5B\xaa\xec5U\x9e\xe7\xad\xad)\x0c\xdec\xca\xd1p\xb8\x06\xd0.\x0f\xbd\ +\xd9uw\x12\x98\xd5\xd3\r\x9e\x02\xe5\xfb\xbe\xb2\x1d{gP\xdb\x95\xdd\x16\xc7\ +\xb6\xa9\rdi\xf4\'Q\xa4\xd24\xa9\x1b\xa6\xaa\x87v\xe8\xbcr\xb1]\xc3\xef\xca\ +\x9c\xf3\xe3\xc1\xccE\xa6\xe2_\xd1\xceX\xf3\x12,\x17\xb2n\xc6\n\xc3P\x85a\ +\xa8\xe28R\xa6u\xfa\x83\x143\xb1\xe6\x07\x0e\xe9\xb8k\x8aI\xf7\x82Y\xccr\x15\ +\x86\xa1J~\xc7\x8d\xa2~i\xae\xd2r\xc5,W\xc1S\xa0\x9c\xfb\xf6\xf0\xecP\xf6}_\ +\xc9\xb7\xa2\x06r3E\xb7\xef!w\x06\xb3\x98\x17*I\x84\xca^R%Wb\xb5$M\xcfv3\xfb\ +\x98\xf7\xf45\xfb\xb6\xaa\xd6\xe7`\xd3\xb2\xb7\x9c\xd0\xea\x0e\xcb4\xcd\xd2\ +\xcc4t/\x1f\x04\xa6x\xcd\xb7\x02\xde\x8a\x8f\xb1O\x87\xb2\xe3\x94!O\x1cGj\ +\xfcc\xb4\x02\xe8\xe8l-\x83\x8e\xedn\xddO\xd5\xf3\x04\xbc;\xa3\xd5c@i\xe3\ +\x0f\x02s\xd7\x9f\x97Tu\xce\xb8\x1a?\x8c\x94H35\x89\xdem\xf4\xf0\xaf\xe1Y\ +\x1e\xe8j\xf6\xbf\x8ao7\xc1Z\xe5A\x7f\xb0\xd5\x0e^E\x18g\x01\xb3\x98\x9f\xb7\ +\x03\xad\x02\xc6\xb6\x1c5\x89\xa2\xda1l\x02\xb6\xaa)\xd9\xf3q\xe6F\xd3\xde\ +\xbdw\xd5\xa2\xd8\xb6]4nt\x05B\xd6R\x86\xbc\xb7\xdd\xb3~\x12\x98r!\x95mus\ +\x04\x8c\xef\x97 \xce\xb8\xf2\xf8\xc8\x96\x1dk{{6\t\x81\ +\xf7\x8f\xb7\xd63\xf9\x99tHGpW:\xfa\xeb1\xc9s\x8c\xc9s\x0c\xbd\xa7\xc1\x1b\ +\xec\xff*\x8bnZ\xe8\xf7\x07\xf0G#\xd0\x96\xe6\xafKPS(\x17\x85\x93\xb3\x03\t\ +\x1c\xf9\xf9\xb2\xe49F\x96\t\xd8\x7f:\xa0t\xd9\xe9\xf6s\x02\xc7qv^g\xddY\xc8\ +\xa6\xd9\x87}}k\x93xOG\x1cM.\xf6\xcd\xb8\x83\xc1L\x9ec\x88Y\x0e\xcb\xb6@\xc9\ +zq^\x08\x81\xe1\xdfCL\xc2\xc9Y\x17y\x0e\xfa\x88o\xc4\x1d\x04f\xf5\xd5*\xfeU_\ +k:\xdd\xa4\xc9\xcf\t\x86\xc3\xe1\xa7I\xe0*\x197:\xfc X\xeb\x90\xbb\x14u\x063\ +\x9b\xa6 s\x02nt_\xd4\xe8\xc7\xe8C\xbe\xc0\xd5D\x94R\xf8\xbe\x0f\xfb\xcf\xe6\ +\x06\xb0KPw\xc9lj\xc8\xecH]\xec\xe9\xb9\x88q\x86\xc9c\x08\xdd<\xbf\x83\xd9G\ +\xdd\xbd\xf9\t\x1e\xd8\xfe\xd3\x86\\H\x88\xd7\x1c\xce\xfde@u\xbf\xbb\xcb9\ +\xc4\xa7\x00\t|\xc2\x97]+\xca\xf3\x1c\xc1c\xf9\xb2\xd31q\xa7a\x98\x18zCX\xdf\ +\xcc\xf3/\xeeH\xfa40\x9b\xa8\xc8\x04\xa2t\xfb\xe5U\xb9\x90\xe0\xd7\x0c\xfa\ +\x8dy\x8a\x82\\\x9c\xfe\x0f\xd2\x8c\x96\xb7\xe9$\'\x8b\x00\x00\x00\x00IEND\ +\xaeB`\x828\x18\x10Y' ) def getmeatballBitmap(): - return wxBitmapFromXPMData(getmeatballData()) + return wxBitmapFromImage(getmeatballImage()) def getmeatballImage(): - return wxImageFromBitmap(getmeatballBitmap()) + stream = cStringIO.StringIO(getmeatballData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def getfulltwistedData(): - return cPickle.loads(zlib.decompress( -"x\xda\xed]iW\xdb\xcc\x0e\xfe~\x7f\x85x\x81\xb4e\x11\t\x01\x12\xd6\x03a\t\ -\xfb\xbe\xa8\xf4\xd0\xb2\x85\xb0\xef\x10\xa0\xc0o\xbf\x9eQKd\n\xad'\xb6c;X:\ -\xf7\x9c\xfbNI2\x1e?\xa3\x914Z>\x1f\x9f\xa7\xfe\xb7\xf4)\x9dJ\x82\xfa_{g\x17\ -\xb4\x7f\xfa\xdf\xd6\xd2\xa7z\x80\x1d\xc8\x1do\xed\x1c\xe9\xfflS\xffY?\x9aV\ -\xac\x07\x8eH\r\x0cw)\xd6\x03\x0f\xa8\x06\x86\xba\x15\xeb\x81\x8c\x1e\xc8\ -\x0e+\xd6\x03C\xfa#]c\x8a\xf5\xc0\xbd\xfe\xd2\xcev\xc5z\xa0U\x7f$\xdd\xa9X\ -\x0f|\xd7\x03\xa9\xacb=\xb0\xa8?2\x96S\xac\x07\x92\xfa/FF\x15\xeb\x81-=0\x9c\ -R\xac\x07\xee\xf4\xcf\x0eu(\xd6\x03\xab\xfa;\xb2\x19\xc5z\xe0I\x0ft\r)\xd6\ -\x03\xa4?\xd21\xa2X\x0f\xb4\xe8\x81tR1?\x9c\xfeH*\xadX\x0ft\xe8\xbf\xd0\xcf\ -\xc6\xeb\x91\xd3\x03#\xdd\x8a\xf5\x00\xe8\x89\xe5\x86\x15\xeb\x81g=\xd0=\xa6\ -X\x0f\x8c\xe8\x8fd\xdb\x15\xeb\x81\x19\x9eX\xa7b=p\xc0\x13\xcb*\xd6\x03i\xfd\ -\x1d\xed9\xc5z\xe0\\\x7f$9\xaa\x98\x1f_\xff\xc5XJ\xb1\x1e\xb8\xd1\x7f\xa1\ -\x9f\x8d\xd7\xa3\x85'\x96Q\xcc\xab\xae\xffB\xbfI^\x8f;=\x90\x19Q\xccp\xd0\ -\x1f\xe9J*\xd6\x03\x17\xfa/:\xd2\x8a\xf5\xc0#O\xacK\xb1\x1e\xa8\xe3\x89u+\ -\xd6\x03\xbb\x0c\xa9a\xc5j\xe0\xbfO\xfc\xe6\xc6\x14\xff\xa7\xfe\"\xa1\x9fV?\ -\x1b\xaf\xc7\xa5\x1e\xe8\xeeT\xcc\x1f\xe1\x89\xe9w\xa9?R\xd4\x7f\xd1\x99S\ -\xac?\x82\xfc\xe64ry\xa6z\xa0=\xa5\x98\x97\x90'\xd6\xa1X\x0f\xa4xb\x19\xc5\ -\xbcb\x8c\xf5!\xc5\x8cB\xc6\xfa\x88b=\xd0\xc8\xafR?\x9d\x1e\x98\xd2\x03\x99\ -\xb4b=0\xc7\x13\xd3\xef\x92w\x03c\xbd[1\xa3\x90\xb1\xae\x91\xcb\x80a\xack\ -\xd2\x03\xa7<\xb1v\xc5z`\x99W\xacS\xb1\x1e\xe8a\xacg\x15\xf3\xe3\xf3&\xcc)\ -\xd6\x03\x9f\x19R\xa3\x8a\x19\xb8\xbc\tS\x8a\xf5\xc0\xa0\x1e\xd0o\x92\xd7\ -\xe3\x99\xb1\x9eQ\xac\x07\x9a\x18RC\x8a\xf5\xc07\x86\x94&=\xb0\xc6\x13K*\xd6\ -\x03c<\xb1\xb4b~8\xc6z\x97b=\xb0\xcf\x13\xebV\xcc\xbbA\x7fG\xc7\xb0b=p\xad\ -\xff\xa2}L1od^1\xfd.y\xea\xbc\t;\x15\xf36\xe5M\x98U\xcc\x1b\x88\xb1\xaeI\x0f\ -\xfc\xe077\xaaX\x0f\x8c\xf2\x8ai\x99\xa3\x07\xbaYlu(f\xb1\xc5\x13\xcb(\xe6\ -\xad\xce\x13\x1bR\xac\x07\xb2\xfa/\x92#\x8a\xf5\xc0\x12\xbf\xca\xa4b=p\xccb+\ -\xadX\x0f|\xe5\x89u)\xe6\x8f\xf0\xc44\xf1\x02\xe9yd\x86\x15\xeb\x81y~s\xfaq\ -\x19\x1f,\x1d\xda\x15\xb3<\xe5\x89i\t\xab\x07\xd6\x19\xebY\xc5z\xa0\x93!\x95\ -S\xccr]\x0f\xe8M\xc9\xeb\xd1\xad\x07r)\xc5\xbc@,\x1d:\x14\xeb\x813\x9e\x98&\ -\xc6\x07c}H1\xbfJ\x86\x94~\\=\xf0\x93'\x96T\xac\x07NxbZ\xc2\xea\x81\r\x9e\ -\x98\x06*\xcbu\xde\x84\xdd\x8a\xf5\xc0\x1eCJoK=\xd0\xcf\x90\x1aS\xcc\x12\x86\ -7a\xbbb=P\xd2\x03\x9d\x9a\xf4\xc00K\x87\xacb=\xb0\xc2\x90\xd2\x8f\xcb;\x8a\ -\xdf\xdc\xa8b\xde\xea<\xb1\x94b=p\xc8X\xd7@e\xf9\xc1\x13\xcb(\xd6\x03\xcd<1\ -\xbd-y\x91Y|\x8e(\xd6\x03;<\xb1\xa4b=\xd0\xce+\xa6\x89\xff\x827a\x97b\x16(\ -\xbc\t\xf5\xf1\xc1\xbf\xc2\x9bpX1\xcf\x94\xc5\xa7>,Y|\xb2\xd8\xd2@e\xc9\xcf'\ -a\xa7b=0\xcdX\xd7\xdb\x92\x01\xc3\x90\xca)\xd6\x03\x0b\xfc\xe6\xb4\x10\xe2\ -\xad\xce\x13\xd3\xa4\x07\n\xbcb\x1d\x8a\xf5@/OL\x1f\x1fz \xc1X\x1fR\xac\x07\ -\xae\x18R\xfa\xb0dX\xf2&\xd4@\xd5\x03\x13\xbcbi\xc5\xac\x9f\xf0\xc4\xf4\xb6\ -\xe4\x03\x87'\xd6\xad\x98\x0fO\xde\x84Z\x08\xf1\xab\xd4\x03\xfaM\xf2z\xac\ -\xf0\xc4\xda\x15\xeb\x81I\xc6\xba>>\xf8\xb0\xe0M\x98U\xac\x07\xc6\x19\xeb\ -\xfa\xb0\xd4\x03\xb3\x8c\xf5Q\xc5z`\x93\xa5CJ1o >\t\xf5\xb6\xe4\x05\xe2\x89e\ -\x143pybC\x8aYZ2\xa4\xf4\xbb\xe4\xf5\xe0W\x99T\xac\x07\xfax\xc5\xf4\xf1\xa1\ -\x07\x8a\x8c\xf5.\xc5z\xa0\x81!\xa5\x0fK\x06?c}X1\xff,\xbf9\xad\x1a\xf0_\xf0\ -&\xd4\xdb\x92\xdf>OL?\x9d\x1e\x18\xe0\x89i\xa5\x8eE0c]\xbfK~8\xc6\xfa\xa8b\ -\xde\xd9\xbcb\xfa\xf8`\xc1\xc6+\xd6\xa1\x98\x05\x1b\x9f\x84\xfa\xb0d\xe1\xc8\ -\x13\x1bR\xcc\x80aH\x8d(\xe6=\xa7\xbfC+9\xbf\xce[\x96\x0e\xfa\xe9x70\xd6\xb5\ -R\xc7\xfa)OL\xbfK^ >p\xb4\n\xcb\xc2\x80\xdf\x9cF.\x8bq^\xb1v\xc5\x8c\x0f\x96\ -\x0e\xfa\xb0\xd4\x03y\x9e\x98\x969,\xd8X\xae\xe7\x14\xf3\xf9\xc2\x90\xd2\x12\ -\x96\x85\xa3\x1e\xd0\xcf\xc6\xeb\x91c\xack\xa5\x8e\xc5\x16oB\xfd.Y\xc0\xf2\ -\xc4\xb4\n\xcbo\x9f!\xa5\x91\xcb\xc2\x91W,\xa9\x9872K\x87\xb4bV\x15\x18\xebZ\ -\xe6\xb00\xe0\x89u+\xd6\x03]\xac\\i\t\xcb\x12\x86\x95\xab1\xc5\xfc^xbZ\xa9c)\ -\xc5\x9bP\xbfK\x06?oB\xad\xc2\xf2<\x18R\x1a\xb9\xfc\xe6X|j\xe2\xd7\xc0GtJ1o1\ -\x9e\x98\x969\xbc\xd5y\x13f\x14\xeb\x81/<1-a\xf9(\xe0\x93pD1?\x0b\xaf\x98V\ -\xeaX\x06\xb1\xd6\xa7\xdf%\xab\n\xbc\t\xb5\n\xcb\xd0\xe6\x89iM\x80\xd5\r\xc6\ -\xba&~\xd9\x0c)\xad\xf7\xb02\xc1\x9bP\xcb\x1c=\xb0\xcdX\xefT\xcc\x82\x8d7\ -\xa1\x96\xb0,\xc7\x18R9\xc5\x0cK~s\xfa<\xe1\x8d\xcc+\xa6\xdf%+\xce\xbc\t;\ -\x14\xb3:\xca\x13\xd3\x9a\x00\xff\noBM\xac[\xb2\\\xd7z\x0f\xeb\xb8<1-s\xf4\ -\xc0-oBmj\xf1\x02\xf1&\xd4\x12\x96\xff\x82'\xd6\xad\x98UI\xc6\xba\xd6\xcf\ -\xf9\x9cc\xac\xebm\xc9\xb6\x18o\xc2v\xc5\xfc\x1a\x18\xebZ\x13\xe0\x05\xe2\ -\x89ibs\x85!\xa5\xf5\x1e\xc6:\x1b\x12\xfaq\xf9/xb\xda\xd4\xe2]\xc9\x13\xd3\ -\x12\x96\xf7>OL\x03\x95\xf5 \x9e\x98\xd6\xcf\xf9g\xf9\xc0\xd1\xdb\x92U'^\xb1\ -\xa4bF2oB\xad\t0\xa4\xf8\xc0\xd1\xc4\xb0dHi\xbd\x87\xf1\xc1\x90\xd2\x8f\xcbV\ -#CJky\xbc\x1e<1\xad\xb1\xf2\x9a\xf2\xc44PY\xa0\xb0\\\xd7\xfa9\x1f\xf3\xbc\t\ -\xf5\xb6\xe4\xf3\x85\xe5\xba\xb6FXQd\xb1\xa55\x01>,x\xc54\xf1\xf6`\xe9\xa0\ -\xf5\x1e\x16\x17\xfaK\xf5\xc3\xf2z\xcc3\xa4\xb4\xd5\xcc\xb0d\xe9\xa05V\xd6qy\ -b\x1a\xa8\xac\xe2\xf3&\xd4\xfa9?-oB\xbd-\xf94eHik\x84w\x14c]\x0b!>\nxb\x9aX\ -\xe22\xd6\xb5\xde\xc3O\xcb\x9bP\x1f\x1f\xac\x062\xd6\xb5\xd5\xcc\xe6\noB}X\ -\xb2B\xc2\x13\xd3@\xe5m\xcaX\xd7\xfa9\x9b<\xbc\t\xf5\xb6d\xb5\x98'\xa6\xad\ -\x11V\x15\xf4\x80\x16A#\xbfM\xaf\x98b\xaa\n\xc5\x80\x8b)\x06\\L1\xe0b\x8a)\ -\x06\\L1\xe0b\x8a)\x06\\L1\xe0b\x8a\x01\x17SL1\xe0b\x8a\x01\xf7\xd1\t\x81\ -\xe0\x0c\xe6\xe2\x85\x88\x01W\rj\x86A\xa8\xd7\xdc\x00\x8d\xf1r\xc4\x80\xf3\ -\x93\x12\xd0\x04\xfd\xbf\xe0\xa6\xb8\x15z\xa1'^\x96\x18p\xfe\xd0\x00\xb4\x08\ -\xb0\xfd\xe6\xbexab\xc0\xf9A)h\x7f\x03n\xf5\x90\x86\x0e\xe8\x8c\x97'\x06\x9c\ -\xb7fB\x17d\xde\x84\x1bs\x16\xba\xe3E\x8a\x01\xe7\x15%\xe1\xe2/`c.Y\x96k!^\ -\xaa\x18p\xee\xe9\x12\xae\xff\t7\xe6{\xb8\x89\x97+\x06\x9c;:\x80s\x87pS\xbc\ -\x05W\xf1\x92\xc5\x80\xab\x94va\xcf\x00l\xccE\xd8\x87\xc3x\xe9b\xc0\x99\xd3\ -\x11\x1c\x1b\xc3\x8d\xf9\x01z\xe3\xe5\x8b\x01gFw*\xcd\xa8b\xbe\x85\xedx\tc\ -\xc09\xa5S\xcbL(\xb9\x80\x9b\xe2\x13\x98\x81\xd9x)c\xc0\xfd\x9b\xae\xa0\xd5%\ -\xd8~s\x0e\xba\xe2\xe5\x8c\x01\xf7w3a\x15\x86=\x82\x9b\xe2u\x18\x82\xa5xYc\ -\xc0\xbdMI\x18\xf1\x10l\xbfy\x0c\xf2\xf1\xd2\xc6\x80\xfb\x93\xc6]\xebm\xef\ -\xcb\xb9I\x98\x8a\x178\x06\\\x99\n\xd0\x00\xd3>\xc1\x8dy>\x96s1\xe0~\xd3\x04\ -\xdc\x1b\x81\xe7\x00V\xe0k\x05&\xc4r\x8c\xb6\x18p\x8b0\nk\x8eAS\x82\x05h\xd6\ -!\x97\x8b\x16\xec\xea\x0c!\xf7\x0c\xdf\x01c\xc0\xa9\xaa\xbc\x1f\xf5\xe1\xdb\ -\xe0\xb3\x11d\xbe\xd8>\xfd\x036\x8d\xe5\xdc'\xd8\xf8\xe0\x80\xfb\xef\xe3J\ -\xb8o\xf0\xd3\xe8\xf6`\xfc\x8fp\xf2%x2v\xa3<\xc2\xc7\x16s\x1f\xf4H\xed\x01DB\ -\xe709\xc3#q\x0c\xcf\t\xc84\xe3 \x9aA\xce\xfa{\\\x8c\x01\xf7\x91h\x17\x1a\ -\x0c@r\x0e\x8d(\xa5\xda\x08d \x81M/c\xfd\xd8\x8a\xa6Gk/\xf6`\x0c\xb8\x0fB\ -\x038h\x00\x8dkhA\xe9\xad\xeb\xfb\x05\xae\xcf\x90z\x19\x9f\x85vc\xc8\xa5\xb1\ -\x03c\xc0\xd5<\xe5\xa1\x13M\xac\xcb.L\x8aOg0+\x80\xd5\x8dI,\x1f\xd1\x17\xf8`\ -\x08\xb9i(aO\x0c\xb8\x9a\x96m0f\x00\x88\x02^bY\x08]\xe3=\xfe\x99\xb1\x85\x02\ -2\xcd\x96\xf4+\x1a\x82\xee\x02n0\x06\\\x8d\xd2\x01n\x19@\xe1\x1c\xb7^\xa0\ -\x90\x80nx~\xe7\xef\xaep@j\x87\x985\x84\\\x16:>\x94\t\xf1a\x00\xb7g\x04\xb7{\ -\x900*\xfeUC\xdb\x17\xd0\x048\xc4\x8c\xb1w\xee\x08c\xc0\xd5\x14\x1d\xa3\xc9\ -\xe5U\x1d\xb4X2\xed7%1\x8d\xa5\x7f::\x1e\xb0\xec*\xb9\xc3\x1d4\xcd\x84\xd8\ -\x84[L\xc4\x80\xab\x05J\xc06\x1e\x1be$\x9c\nys\x81'\xe8\xd4S\xf7Mx\xea\x10g\ -\x8c\xed\xd6\xed\x18p\xb5@\xb3F/~_8;\xfa1\x87'\x06\x9f]\xc5\x1f\xe2w;p\xc18\ -\xe3k\x18S1\xe0\xa2L\xeb\xb8o\x00\x99,\x828\x18{p\xc8XFeqOX\xad\xc9w\xaa\x91\ -\xfc\xf5p\x86\x04\xc6\x80\x8b(-\x19\x01f\x04\xc7\xc4\xab\xcec\xa5\x91o\xe3\ -\xb8\x02\xf2H\x9e4\xfe\xa6)\x9c\xc6\x18p\x11\xa3y\x9c\x87\x13\x03\x17\xec\ -\x04\x96+\x83L\xe3\xbeq\xe8\x91\xe4\x15\xfc*\x00sZAL\xc9\x19\x1ec\x0c\xb8\ -\x08\xd12v\x19\xc8\x95\x13X\x14\xaf\xf7\x06\xbb\xd1m|o\tF\xc57\x0e\x00\x19\ -\x7f\x03\xe1\x1a\xc6\x80\x8b\x04\xe5a\xd2(dh\x1f\xfb_^m\x13.\xe09x\x11R^\x82\ ->\xac\x13\x8e\xe3g\xfcn\x08\xe3ah\xc39\xacM\xc0\xd5P\x00f\x01>\xa3\xc9K\x9d\ -\xc5r1\xc1F\xcbF\xf52\x8f\xe1\x0b\xfe\x90\x92\x13\x16\x8c\xbfa\x13?\xd5\x1c\ -\xe4j*\x00s\xc3\xc8\x15q\x82\xdf\xc4\xeb\xfc\x89OX\x0f\xder\x01K\"\x0ci\n\ -\xe6\x8d\xbf\xe1;\xce\xd5\xa0\x84\xab\t\xc0%`\xd7\xc0\xd9Z\x84G[\xac\x07\x90\ -\xc9Q\x9a\x83\x14\x94\x1c\xfe\x16RY\x1b\xcbC\x02M\xb3\xc3N,\x83\xa6\x0ec\xc0\ -\x85\x8cN\x91\xc8\xc4E{F\xc25\x0csd\x06\x82\x05\xfd\xb9f\xca\xa239\xb7\x88\ -\x83/\xbf7H\xf5d*\xe7\x1e\xb1\x81b\xc0\x85\x88\x1a\xe9\xa7\xd11\xb5\x81\xd2\ -\xa2\xbd6>\xe8\x16~KUrz\x847Q9\x15z\t\x0e\xc04,]\x05B\xcdc\x0c\xb8PP?\x99X\ -\xa5W(\xf3\xa6.q\xbd\x02\xddl\xe1\xe5\xf3w\xd8\xeaP^\xf5\x92t\x08\xf7P\xce\ -\xf8W\x07(\x19[\xa9A\xd3.\xb4\x90\xf3\xa0\xc7>B\x11\x931k\xe9W\x95\x95w\x98\ -\x14\xd6c\x02\xae\xacC\xd3\xc9\xa72\x96d\xb3eBP\x1aL]%-\x91\x97r\x91\xb6RS\ -\x9468\x9a\x1eA\xde\x00|u\xe5q;\x86q\xdb\x91\xde\xe7p\x1e\xed\x94\x14s\xd8\ -\x06\xd3\x08\xe1iHS!\xf2\x12.\x92\x80\xeb\xa0m\xa3z \x9b\xc2A\xd1\x03_\x81\\\ -;A\xee\xc4l\xd6q\xd8\xe1\xf7\xb5\xda`\xbff\x9c\tQo\xd9\xc7+1\xe0\xaaM\xcbxat\ -\x14\xfd\xc0\xb2\xd2>\x01\xc3\xe8\xcdm\xc2\x02\x9c\xbe|+\xc2\x9c\xc3\x1b\xd8\ -44\x8a\xd9L\xe3\x93\xb1\x9c[\xc5\x0b\xc4\x18p\xd5\xa2\ -\xb4,9\x93b\xcf\x93\xf2\xfe\x02\xdb=\x89\"\xc9\xe2\xb6x\xed\xf7\xd4o\x92\xed\ -\x85R\xfb\xda\x87-\x03\x0b|!\xd2\x1d\x1d\"\x9b\x08\xddc)\xdb\x8f\x8e\x0f\xa1\ -4,\x89X\xb19,b\xc1\xe5\xd1:\x06\x1dTv\xf0\x8e\x18\x94m\x18\xb6\x0e\xder\x90\ -\xe6\r\xec\x18\x84\xbf\x87=\x16\xa4\x86\x01\xa7\xe5\x1c\x99\x1cb%\x92\x8d\ -\xd4\xc6\xe8\xa4b\xc8\xf5Q\xb3\xc8_\xf8\x89%\x83o\xda\xb4\x15\xc6?0*\x83x\\\ -\x03E\xbb\"^=\t!o\x00\xb9I\xdc\x16\xafl\x00\xae+\x82[\x1aS$\xf5\xc9\xac\x91\ -\xf6\xd5hs\xd58\x97m\xd1\x88\xe7\xady\xc0q\x98b\xd6\xc0\x99\xb0'\xa2q\xa7q\ -\x1b\xcc\x8e\xd6\x92%e:\x05\xdc\x87\x0c\xee\x04\x06\xf1L\x98\x18\x1b\x96\x1e\ -wb`\xf8$k\xa4$aM\x14$4\xb8\xeb\xd4\x01\xe0\x03\xb2g=\\8\x96\x91\xcf\x90\x11\ -\x9f\xcc\xd1:\x99\x1c\xa5\xb7\xb6\x03}\xd3\xe0\x00\xbf\x15\xb2\xad\x00w\x14\ -\x1b\r\x81\xd3\x14<\x1b\x94\xdf*Z6\xae\xb4Z\x1b\x1c}\xaa\xdf\x96\xa9\xb0mT\ -\xf7hVT\xc0<\x84!\xa3\xd0Ry\x80/\xa3r\x9f\x8cSt\xdd\"\x91\x06\\\xcef\x06LR+:\ -\xb7\x147E\t\xd39l\xa6\x7f9&>C\xb9\x9f\xc3.\x9c\x18T\xdd\\\x87{\xea\x105~O\r\ -\xe4b\x1fJ\x90?\xbf\xe4i,\xd8*\xa6\xc4\x80\xab\x8a\xb90\x80\xb7\x96\x06\x06B\ -vtP=9\xd7\xc9N\xe0J\xc8\x8e#x\xdf^\\\x83\x1f\xb2i\x1b\xf6\xa1\xc9}\xe7\xb2\ -\xcd\xed\\0\xd8\x14\x9f\xa1\xbc)\xe6\xf1\x9c\xec\xdad\x17\xc5\x80\xab\x1am\ -\xc0\x9d8\xae~\x8aWze`\x06\x14p\x1f\xca\x17_\x1d4\xf1f\x90e\x0bI\x9d\xaf\xcb\ -\xe88l\x12\t1\x1d\xb4\x8b\xce/\xd6.\xe8@v\xec\xc2\xfe7\x0c\x98\t\x8c/\xef\ -\xabBu\xaf\x1a\x80L\xe2\xaa-\x0f\xc0\xa4\x9d\xda\xeb.\x82\xaf\xe1Z\x12m\xdf\ -\x06i\x8eL\xeeq\xc7l\xb3\xca\x19\xb9O\xe4&j~\xb7\x88\xcf\x05\xdcD0<)bw\xa9]\ -\xf4\xa7\x1c*\xc1'\x91\xb6\xb2\x01\xc7d\xd2K0I\xb2\xd8s9@\xa8\x80\xe3\"\xb8q\ -\x8a6\x8d\xae\xd7\x0fE8\xe6wp\x9eaZgi\x88e\xf7I?\xce\xfc\xb5/b\x01/\xe3\x00L\ -\xff\xa8\x07\xa7\xe9\xfd\xbc\xd1C!Q\xda\x8d*]\xce\x88\xe2\xa9\xf38\x8b\xea\ -\xd8\xec\xc2eQ\xa3\xa4\xc3\xc0\nV\t-\x1b\xe2\xf8\xcf\x1b\xc5\xc7I\x89\xdb\ -\x8cN\xcaf7\x88\xc6#\xf1\x91\xea!\x8d\xff#X\xbc\x1fF\xc5_\xdf\x18U%9\x06\x99\ -Gz\x81_\xa1\x9cX\x9d\x80\xaf&\xe0%{\x95\x10\x93\xec\x84+,\xd7\xb4KB\x06\x9d\ -\xc6\xc7\x9d\xdb\x14\x83\x18p^\xc86xp\xa0?\r\xe2.\xde\twG\xb7A'\x86-\x18y\ -\xb3\x9ed\xafQ}\x93\x19\x92\x0e\xde>X5\xb0\x9aG\x84\xfb$\x0ff1-Y\x98\x8fD5\ -\xcc\x88\x00n\xcb\xc0{\xd5\x0e\xf2h\xbd1\xea\xc70\xf7\xaaT3Z\x90q\x1e'L(\xb3\ -\x13z\xd0\xa4{\xe0\x13\xdaB*\xb1\xaf\x82\x10\xaa]\xd1\xfb5\x06\x9c\x0b\xda#\ -\xb3\xca\xe3\xd3\xb0$l\xcb\x1583\xba\x9a/\xdb}uh\x92\x0c\x93\x01Y>\xf5\x1a\ -\x87\x0c\x82\xa7\x8a\xb6\xean=\xb4\x05\xf5\x15\xf1\x055\xc6\x80sK\xc5\x8a\ -\xc2\x88vD!\xd3i,\x1a\xc4e\xac\xc3\xd5\xaf\x9b\x0b\x13\x07/\xd9^\xf5\xa2Q\ -\x9b\xca\xef\xaf\x9e\xb8\x83\xf2XW!\xe4\xbec\\\xcc\xc6\x85\xdev\x8c\x8f\x15W\ -\xe7\xcd\xc0\x11I)i\xa2M\xb5\xd2>\x9c\x18@t\x16e\xa8\xf9\x88Ay\x8a46\xbeTYB(\ -_\xd27\x1a\x85=\xd9m\xe4\xee\x10gs\x85\x1ap\x8d.\xa3r3\x16\x10\xa4\x87\xed\ -\x0c\xfc(\xbf\xdams;\xaf\x195\xf9\xd8\xa66\xb1\xbd\xbeXGk\xd9l\xb8\xc3\xfa\ -\x8aC\xe1[C\xdb\x1e)\xb4\x80\xebG\"/\xe0\xb1k\xab(T\xf0\xbc&f/v\x8a\xef?2\ -\x80\xdb1l\x8b\nrmp\xf1\xcba\x06\ -\xdc\xbb4\x8d\xdb\xe4u\xc7\x18\xd9\x9e(\xf5\x97\xdb\n\x13\xfe\x82\xe3\x022SF\ -\x05w\xbe\xdanOf\xfe\xf8\xf7\xbc\xb8\xdcJ\xc1y\xc5[d\x82\xd60\x06\xdc_i\xc5\ -\xa3^\x7f\x7fV^K\tx\x8c\x93\xdb\x16o\xa7v\x07\x84\x01\xd8\xd6`\x8c\xca\xb7\ -\x9f\x1b\xef\x94\x14\xdb\x14\x17u\x1b\xd0\x89\x95\xeb\xb1M\x90\x88\x01\xf7\ -\x1e}\x87s\xa8\xf7\x89\xbfc\x97\xcd\x95\xbcZ\xf1K\xccB\xbf\x90@\x030b`\x8c\ -\xb4\xd2\x0f1\x8b\xaf\x7fq\x9f|\x11\t7\thw\xb1\r\xa7)\x06\xdc\x1b\xd4\t3>\ -\x97\xb3/\xc2\x89H\xefK\xc0\x95\x91\xb7\xecEs\xb3Y\x80\x0f\x983p\x9f\x8c\x8b\ -\xb8\x94\x0e\xba\xffG\t\xb2\x92\xa5#\x96\xcd\x8a\xb7b\xe2\x9c\xf2\n\xde\xc4\ -\x80\xb3S\x02g\xaa\xd2UA\x15Q-\xd3=\x99J\xd4&q\x1c\xf6\xe0\xa5\x81%\xddj\xab\ -\xde{D\xcen\"V\xa8|]\xf5\x13w+^\xa3\x19z\xa0\x18p/\xd4\xe2Sc\xc9\xb7o<\xb7m\ -\xb1\xb4#\x06\xf9SW\xb6>7\xf5F\xd9\t\xd2}2F\x19\x03\xc5\xbfl\xf0\xcc\xb90xJ\ -\x96)\xb2\x11\x03N\xa9\xc4\xe7xR5\xb8\xb1\xc3`^t\xc4*\xc0\x90\xa3\x94\x98\ -\x11(k_M\x16h\xb3\x067\x17\xcd\"\xf3\xe2'^\x19\xde\x9e\xcc`\xfee\xb6\x8bp\ -\x88\x95\xeb\xb9}\x81\x17g\r<\xe2\xf7\x127\xab\n\xb6\xb2\x95y$f\xb1\xf3\x0f\ -\xa7\xc6:\xdc\xdb\xb2\x1fL\xaa\xf7^\xd0\xb8\xf8\xa5C\xfcY\xc1l\x87a\x17\x93\ -\xe5\x97\x86n,\xf9\xa6@\x01\x17h\xc4\xef\x124\xb8.*\xe3\xc6j\x9dE)g7\xffr\ -\x18\xfd\x10\x7f\xd9@Y\x93\xbc\x06\x90m\x82\x87\\\xa8\x0e\x1d\"\x88>\t;X\xb9\ -|o\xc0\xa5\x8fx\xa4\x1e\xe2f``\xfb\r\xa4\x19\xd1Nm\t\xee\xde\xb4\x1a\x1f!'\n\ ->_\x1a\x84\xae\x9f\xc0\x91\xb8\xcb\xdd\x85\x92A6\xeb\xdb\xb567\xa4\x94u\xe1\ -\x1e\xdf\xc4C\xfcPGj\x07uC!`\xb8\xe9\x18[H\xd9\xe6\xf5\x80+\xf8\x1a2)\xe1\ -\xb893\x90m?A\x16B\\5\nvz7\x94\x1c\xb6ED\xc9\x9aQ\xd3\x91\xd7rn\x14;\xe8\x83\ -\x1c\xa99Z\xa1\xa0\xc1\xa68\xf7\xc6.\xff\x89\x13X\xf6^\x81x%\xa7`\xd2\xf5\ -\xaa$\x12[\xee\xf0\xb2\xe2\x1b\xd1\xb7\xdc\xb8(B\x1cZ]\xac\xe4\n\xe5\xe8\x03\ -\x1c\xa970\x89\xc1\x83m\x05\xa7DQ\x98q(k5S\xd0\xae-\xd0\x03:\x16\x80\xbc\xa4\ -\xef\x069\xf3\xab\xc2\xc1\x9c\x873\x8f\x9f\xb7E\xa4~\x9b\xd5\x02\xfd\xb3\x80\ -\xd9Mm\x03n\t\x8a8\x1c\x02\xd9v%z\xfd\x15\xe0\xc0\xd2\xe6zm9\x05G\xb4+\xe4\ -\xc8\x12\xec\xa1s}i\xc2vy\xb5\x85~\\\xd6\xcd\xd0\xd5\xcb\r\xa9\xaa~\xfeX1\ -\xa4U\xe3\xcf\xc5Z\x05\xdc!\xf5\x86\xe0(]\xc5\x06\xdb\x85\xda\xef\xc4\xe7>\ -\x92\x17_e:6\xc8N\x18\xc4{Q\x0f$\x0f_`\xab*\n\xc1\xa1\x0b\xc8\xd5\xc3\xb8-\ -\xa3\xb7f\x00\xd7\x073!\x80\xdb\x1a\xc8\x8e\x83\x8b\xaf\xba\x91.\x91=R6\x0f\ -\x05\x9a1\xe9W*@\x90\xa1\x16\xf2\xd7\xc6\xbe\xc7\xf2\xcd\xc1:\xe6]\xfc\xda\ -\x17\xbc\xac-\xc0\xf5\xe0Q(\x8e\xd2qQ\xfe\xa5\t\xe7\xde\xb0\x94\xd7\xe0\xe6\ -\xe50\xed\xa03\xa3\x97\x96y\xc9\x0cM\xc0\xe5+{\xd7\x1f\xbe\x86\x84hY^\x8f\ -\x93.\x8e\xd6\xbe\xaa\x94\x8c\xa8\n\xe0:\xb0%\x04\xb2m\x1a@\\\xbc\x1f\xd2\ -\xfb\xde\xfa\xcf\xfa\xe2k\x8a\x9cG\x1d\x17\xe1H4Z\xea\xc7\xd9*\x9aE\x97(\r\ -\xb2\x8c\x8bo\x1a\x84\xc3\xe8\x03\xae\x00\xa30\x1d\x02\xd9\x96\xb3u\x14\x9d\ -\xfaGN\xd4\x04]\x80\xf3\xac\xa9[\x18\x15\xdf]\x87\xd7U\xdd^\x05\xdc\xb3N\x90\ -\xb2\xcb\xa9\xe8\xe2\xd7\x1fa\x95\"\r\xb8#\xa0Px\xdc\xaem{\xb7\x01\xc8K\td\ -\xbb\x95\xbd\x82\x9d\x00\x9eO\x96\xed\xea\xa0+\x17O\xd7G#\xbe\x96\x8c\xf0\ -\x15p\rt\x1e\x02\xb0\r\xc3\x81\xc8\x8eZ\xf6t\x0b\xcc`\x9b\xac\x8d\t&]]\xbd\ -\x96s\xe5\x02\x86\xd6\x8c\xd0\xcd\xa92\x82\xa9h\x02n\x1dGB\xe0\xe2=#iu\xf6z8\ -\xa3-[\x93\x8f\x06\n\xf2n\xf8\xc4R\xfa\xcb\x94t\xd9\xde)k+\xa0\x1d\xa1#\xb5\ -\x07F\x02?R\x95\x93\xb4L\xd7\xe8U\x13\xcbv\x91\xf1\x9a\x80\x82\xe7}\n\x8d\ -\xb2ci\xc9\x16T\xea\xd6\x01u\xea[\x8d\x12\xdf\x8d\x86\x04\x1c\x1b\x15\x98\ -\xf7\x83\xd3\x96\xdd\xd9!n\x16\xdc\xdf\xe4\x0e\xe2\x14\x96-\xde;\x9c\x0bp[\ -\x95`\x0fR\xa2\x1bu{\xc5uI~\xc7\xfe\xed\x89\xf0\xd4H\xbaEN\xb1;p9\xd7\x85\ -\xb2\xab|\x9f+\xb3\xa1\xdf\xe6\x8a\x18\xc0\x9d\x00\x9fk\x12\xa5Y9\x00\x1d\ -\xae\x03\xf0\x13\xbez\xe3\xaa\xe4\xf8m\xc2U\x17iy^\xe52\xc8&\x96-\xd8^\xe1\ -\xf7\\\xc3\xac\xf8\x9e3\n\x12n\xdfq\x03\xe5\xbd\xad[\x7fg\xbb\xad\x9cb\xc4\ -\xaf\xb6\x0e\xb1+`\xc8\xf5Q\x93\x88\x10)\xc0\x80q\x08c\x1a@t\x98NY6j1\xc0\ -\xe7i@\xd9\xf7\xab\xc9e\x84a\t\xe6\xdf\xbcK\x8e\xf0\xe5\xfd\"\xdcR_\xc0\x87\ -\xeb)\xdd\x883\xe8\x12M\xe2\xd4~\x82,\x8c\xb3\x81\x17\x01>K\x16\x87\xc4\\\ -\x1a\xad\xcd\xe3\xf2\xfb(Q\x95\x18\xe0\xaa\xc7\xc3]\x05\x0e\xb9g[\xf3\xef#\ -\xc7W\xecO6W\xc1B\xa0\xd2z\x01\xa4z\xf0\x15\xdd:\xb2\x87\xb1Z\t\x84\x01\x04`\ -~sQ\x9c\xc5\x0f\xdf\xdc,\xfc\xbb\x17\xe1\x16\xac\x8a\xab\xed]K\xd7\t2\x14a@\ -\x1c\xeb\xd6\xfc];d\xda\xb1z\xe5\xa8\x03I\xa2\xe9\xc1\xcf\x10l\xecH\x11Z\x85\ -\xbc\xb2\x96\x9b\xfe&#\x8eA\xaa\xe6\t\nr\xc3\x14p^\xd45\x19\xc3q\x97s\xe9\ -\x17\xc5\xccj\x16p|$\x05\x1d\x1dw\x82\x97B\xce\xfd|\xb7\x19\xf8\xbd\xf0\xe1%\ -\xe1\x08\x83L\xfei\xa1r4_\x02\xc6\xc1\xad\x13{\xcf\xd6b\xa9Z\x80\x0b(\x11:\ -\x89'\x01\x1f\xad\xc30+\xec\xbcS\xd8\x7fC\x9e\\\xe24\x96C\x11\xce\x02\x9d\ -\xef\x0eJ\x87\xcc'\xd7\x91\xcfs\x014M\n4\x11:\ty*\x06\xac\xcd\xf5\xe2\x80\ -\xf0\x16.\xd82\x10Z\xf1+\x96\xdd\x0e\xcb8\x13\xe0\x06y\xc2\x1f\xa2\xc1\xcd!-\ -\xb8\xac\xc6b/\xb9\xfd\x01\x8e\xd4\x17_\x16e\x02\x86\xdc\t,\xda\xee\rZ\x7f]^\ -\x9d\x89\xe8\xe0\xbcu\xf8\x049\xc7\x16\x92\xf9\xfb;.sC\xa6-3i.\xc0D\xe8\x80\ -\x8b\xd9\xb8\x0b\x19\xf4&\x16xB\xd4\xea\x9d\xc6\x0eK\xbf\xfbf\xcbN\x18\x0et\ -\x86\xbb\xa2\xaa\x9c\xa5\x02\x90\xbb\xd2?u\x81\x96\x9b\x0eE\xb9\xae\x0e\x1a\ -\xa1\xe1\x80\xe5\xdc:\x8d\x89zJ\xbb6\xcfa\x90\xe6\xcd\x0c^z\x94k\xff\xfbb.\ -\xd8^5\xe1\xa9\x80\x89\xb7\x01C.\x8b\x07\x7f\x1c4\x87.\xaa\xebz\xe2/\xc4\xeb\ -\x97\x19\r\xd2\xa2\xcb\xb9\xa8\xd6wK\x01\xbf\xe6\x10\x95\\=\x84\xb1\xe0\x13m\ -H\x06\xe6\xdcP\x1a\x83<\xe8\xbfB\xd9B\x9e\xc6{\x97\xf7+\x9bx\x10\x82\xb7\x1c\ -\xaa\xa2\xd2\xaa\x11F\xd0\x90\xcb\xbe\xa8\xe7?p=PSF^\xc0\r\xe0\xa3+\xe8\xef\ -\xc0MH\nK\x87\xael~\x1e\xfb\x02\xf6\xce\xd5A\x0e;\x01)\x1d\xe0\x1cZEVA\x13\ -\xba\x8b\xde[WU\xf8B\xf3~C\xd8\x18d\x1d\xdb\x03\xf7\xce\x05\xeb\x8e\xde\xa7\ -\xb2;\xba\r\x9e\\}\xdb9\xb4\x84\xaa5HH[\x1fu\xe2G\x85\xdb\x05\xc9R\x81\xcd.\ -\xcbc\x9c\xd2M\xc8\xdelH\x00\x97\x80\xaf\x98\xa5<\x96\x1b9nT\xa5TB\xb8\xb8\ -\x08K\"1\xa7\x07\xb6]\x1d\xa5%h\x80B\xe8DI(\x007HK\xbf\xf6\xf1\x81-\x87|\x96\ ->\x12\xdc\xd6`[\x9a\tp\xe5j\xc3\xdd\xc2\xb3\xad?u#bh\x00\xf7_\xb0S\xb8\xc1V\ -\xb1\xb4%\xa1\xbf,\xc2X\xe0\x99\x10\xd5\x0b\x0b\x95vd\x13\xb8\xb3J\xfbp]F\ -\xcc\xe9\xd4\xc8O\xd0\x16\x02\xc0\xfd\x17\xb4\x84\x1b\xfb\xa3d\xcc\x0cu\x8b\ -\x7fo\xa4\x89\x0f \xe7>c\x9d(\xd50\x07\xee\x12\xfd:q\xd7\x16\x03\xf3\xdb\x04\ -\xbb\xa6\xaf\xf8\xa1\x8f\xd4\x1e\x1cz\xd3\x1e=\x819\x11\x83\x86p\x16\xa8G\ -\xcc\xff\xd4\x9e\x07Qms\x00\xdc\xa5\x1a\xcdP\x97\xad;l\xeb+\xbd\xae>`\x17I\ -\x80\x80K\xd2\xdfZd\x0c\xe1\x948bzh\xbaF\xe1\xb6\t\xb2m\xc8\xa4\xcbj,\xdd\ -\xb6\xa8\x92\xcb7\xcf\x86\x11Q\xa3\xf3\x03\x01n\xe8\x9f-\x1f30/ w\x03\xd9\ -\x1a\xd9Jb\x94\xe0@d\xe7g,k\xd8\xdb\ -\xa4\x9e&\xf2:,\xdd\xc3\xab\xad\x04t\xc3s@\xafxD\x94\x9f\xe9\x81\xef\xb0\x16\ - \xdc&Qf'tA\xceC\xa5!\x87\xc7o\x84\xaav\x8a\xbfh\xf0\xf8\xd2\xef\x8b\xa8n\ -\x12\xb2#5\x1f\xa8s\xe2UP!\xee\x07$\xe7\xe6(\x89\xd2%\xeb\xaef\xfb\x9d\xa8\ -\xbf{\n'\xef|W/\xc9\nw\x8d4\xe4\xe9\xb3\x17p\x87B\x07\xb8o\x96.\x15\xb4\x8dX\ -\xc0v,\x07\x15NA}\xd5K\x80\rb\x8b(b:\xed\xd2%}\x0cG/Vx\x0f\xec\xd1\xe3_\x9f\ -\xbdS<{\x1e\xce\x0c\x03\x9e\xb5\x0c\xf1\x04p\xf5\x81\xb6\xc8\xb0\x07\ -\x15.K\xcb\x10\xab\xd9\x13\xe2\x82dv\xc2\x01\xba+f?K\xe5\xde`\x870\xea\xe0\ -\x13;\x98B\xe9\x9d\xf36\x0b\xa4\xdd\x96{\x11 \xe0\x06,\x83\xed*6\xbaJ\xbf\xa9\xd8\x0f\x97\x84\xe1P\ -\x07@\xf6C\xbf-\x13\xa2\xdf\xa7\xdf\x91\x05\x14\xea\xd0]vB\x1dHu\xa0\x17JX\ -\xe9v\xcb\x08H\xa4<\xef\x87!O\x90*\xf9\xe1\x96\xb1;\xf4\xf1\xb6i(b9\xa8p\x03\ ->\xfb\x10@P\x10\xed0\xdb,Y\xe7\xe6\xdb\x16 CR\x03s\xe3O;\x81<\xcd\x8a\xbb\ -\xd6]\x8f\xdf\xd60\xa5\xb0jGj\x136\x06\xda\"\xc39?\x8a\x8a\x1d\xea\xb8\xdb\"\ -/\x1d\xc2\xbd\xb6\xdb\xc6\x0bW\x8d\xbf\xd3\xb0/\xd2\x84\x92\xd6\xe6p\x1fi\ -\xb3 \x1a\x93#\xec\x90\xb7G\xeb\xba\xb5\xd9z\xaa\x01\xb8F\xcbV\x89F\x8c\xedg\ -8\xfc\xc3a\xb9\x02K\x1e\xcd~^|\xeb\xbc\xcb\x8c\x8d\x15\xcc\xd8\xb2\x13\xbcJ\ -\x84,\xc1\x9dl\xd4\xe9R\x02\xbfa,Q\xa7\xdf\x80\x1b\x87\xe3H\x80\xed;\xde\x8b\ -\xc3n]\xdc\xb5\x16,\r\xc4\xadwn\xcb2\x97\xf2\"\xa4r\xd3\x954\xfa\t2\x1f-\xf3\ -n\x93\xb9\xca\xb4\xc2\x06\x11\xc3;\xe8\xf1]\xab\xbaV;D\xdf\x00\xd7\x849\x8cF\ -\xa9\x85\x03\xba~\x95R\xd8N7b\xe4\xab\xab\x8e\x80#\"\xec\x08\xad\xefrs\x94\ -\x16-9\xdc#\xba\xcc\x9c\xfbP\xca\xfaT\x14q\x9d\xb2\xe6\x9b\xf6\xf8h\x1d'\xf4\ -\x03p\x1b\xb0\x19\t\xb0eqO\xcc\xfa\x0e\x8f\xf0w\xf8b\xbb\x88\x96\xbd\xc3\xca\ -Zv\xd7\xc1\xa8\xf8\x96r\xe5\xceJ\x1d\xbc\x97\xe2]\x9d\xe2\xb5O\xcaJ\x1fu\x8b\ -,\x90e\x97\x12\xf9\x8dP,l\xf4\x1ap?\xb05\x12p;\x7f\xd5\x9a\xdb\x9e?0\x81\xa7\ -\xc2\x7f\x9f1\x96\xd7\x9b6\x9dh\xc0V\xb9\xb3\x92k~\xe9/\xbb#\x7fS\x1e\xe7\ -\xc5-\xef<\xcez,I3\xd0H\x9e\x01n\x90\xf6)\x1a\xf9\x9f#63\xa1\xff\x8d\xd6\xdc\ -\xc76\xd7\xc3<\x99l\xa3k\x9b\x8a<\xe6\xca\xe2M\xc3\x1d\x94\xf3\xb8\xf20\x8cu\ -\xbe\xaf\xce&,\xdb\xe6\xff\xc5S9G8M\x9e\x00n\x16J\x91\xb0JUkn\x99\xd5\xdeD\ -\xefy\xa8\xee@V\xf6\x18t\x94\xd3\x99\x06\x149\xf3\xa7x\xef*\xa4r\x07d\xe9\ -\xd35\x1c\xa9\xd2\x1a=\xc37\\\x14JR\xaf\xc7:99\x08K\xff\xebMC\x07\xddQ6\x12\ -\x1e\xb7k[\xfe\xc0\xf5?\x8a_\xad\x93\xac]t\xe7\xe0\xd6bR\xdeZ\xb8t[t\x89k\ -\xfe<\x9cU9\x95\xfb\x13H\xdf\xe4\xa8\xc7o\xf7\t\x1f\xa8\xe2\x9b\x86\x044D\ -\xa4z\x87\xbd5\xf7\x17\xf8w\xfe@\x1f\x1e`\xf99\x13\x7f\xeddx@\xf6{Yw\xda\xcf\ -(\x1c\x8a\x12\x18\xf3\x01\xacV\x0e.Et4x\x9c\tQ\x84m\xdbvv,\xe1>\xe1L$\x8e\ -\xd2:\x18\x11\x1e\xb7C\xdasx\xdd=\x0c;\"\xd8&\xf9N\\E\xc1\xb2r\x17\xc5A\xbd\ -\xef\xca\xa9\xf0\x08W/\xde\xf9\x04L\x04\xe6\xd3\x1c\x86z\xe1G\xbc\x81\x0e\ -\xf0\xb6\xd5T\x1f\x1e\x92\x91\x84[\x84\x07\xda\x89\x84l{B)}\xbe\x83Yk\xee\ -\x12\xf5\xc8\xe3\xe5\x8f\xbe/\xab\xb8!\xfe\xfd\xc1\x95\xdb\xa2\x08\x03\"!%\ -\x01\xfb\x01o\xe7!Q\xe8\xcb\xdaJ\x9e\x1f\xec\xcf\xe8\xd8h8\xa4\x93\x88\\^\ -\xed\x8a\xfc\x81Nh\xa9\xe0\xb0\xcb\x81\xcc\x88\xba\x04\x19\xaeY\xc2\xb2E\x9b\ -\xb4l^7\xf7\x13\xc7\xd0.^@\x1b\xdc\x87@Yy\xb4\x952\x04\xf46\xf1\xa8\x80M\xb6\ -\xed\xfc\xee\x91\xda\r_\"\xa1\xb9\xcd`\xb38\x12\x97\xa0\xd2\xd6\xdc\xd3\xf0Y\ -\x84,\x16`\x13\x8bZ\x1eu\x8a\x82\xcfMx\xe0j\x0b>[\n\x8a\xbc\x1e\xbc\x0e\xc9\ -\x86\xee\xa3\x9c,\x97\x01\xed\x1e\xcf\xeb\x16\x00\xffq\xa46F\xc4L\x98\xb0]^\ -\xad\xa1;\x1d\xe4\xd4V \xa6\x19\xdb)I2\x0b\xca]v@\x9b\xb4\x88\xf1\"d+\xdcMR\ -\x95\x1a\xf2xv\x838\"6\xee\x1bG\xeaLD\x0e\xd3\xd7\xe1\x95\x0f.\xbfo\x07\xf6\ -\xde\x0c\xb6i\xc2<\xb9\xcbN\xb8\x82E\x11U\xd2\x152\xb8\xfd\x04\x19\xd76\x04\ -\x0f>\xfcF\xd1\x06\xb9W\x80\xcb\xd0YDd\x9c\xf7\xe1\x95S\x7f\x88\x7f\xb7\x95;\ -\x87\xe9@\x16O\x84\xb0\xd5_OSJ$Cm\xfb\xd4\x03\xfb\xcc\x96\xa8\xfd\x87\xd1\ -\x80\xd6\xab\xeb\x8b\x88\x9ck\xa1S1\xef%\x97jo\x11\x1e\xb1Y|_\x17\x1d\xbb:L\ -\xdaE\xe6U\x1e\x96\xaa\x9e%\xfb\xaf\xdb\xcf\rqwrH\xd7>i\x89\x9f_\xa9qo^mmQ\ -\x06\xa2\"\xe7d\xb1\xbf\x1bJ\xbb\x94\xcf\x174\xfaK\x81vW\x89\xa9\x0ed\x01\ -\xec\x9b\xaa]^9\x0f\x1c8FY\x8e\xe2\xc4'Po\x91\xc3\xbb\xd4S\\\x8a\x88\x94\xeb\ -\xa3\"y\x19^ybA\xad\xc7e\xb9\xb1k\x98\x90\xd5\xa4\\VN\xf2\x9a\xa7-\xe5\xa1 \ -\\\xde\r>\x05\x0e,\xd9\x1a\xcd\xfd\xf3\xf2~\n\xba#\xd3\xd9\xca\x1e^9\t\x85\ -\x00_p\t\xb6!)*\xb9\xedb1TkU@y/\xbc\x8c\x17\xbe\xfc\xca\x89-n\xd0q\xb4\xc8\ -\x14\x8dD\x04rY\xbc\x175\x1b\x97\x00\x03\x92\xcf\x17\xd4I\xf2\x9c\x08\x9b\ -\x99\xd0%\x02\xce\xa7,P\xf8\xd3\x14t\x04\xa6\xa8\xc2\xf0\xa4N\xcb\xa8-E\x04t\ -\x13\xb6[\xcfL\x00\xe1\xf0H2;\xa1\x9f\xfaC\xb5>'P\xa0r\x9c\xca)~\xf5I\xc2\ -\xff=\xb5\xc6A\x00\xe6ed:[\xa5\xb1\xf2\xf0J\xf7|n\xab\x072\xe5i\xfd\"\x0f.\ -\xb2\xf0\xd2V\x8e\xc2\xafJ\xa1\x97\xe4A\x88y#E\xe5z\x1ffE&\xc4)\x9c;\x9a\x16\xe1\t\ -\xa1\x02\x1c_\xa2\x14#r\xb4\x9e\x89\xd6\xb3\x05K\xe6\xfd\x199\x97\x13\x95\ -\xdc\x0ei/d\xd9\t'`\x0f\x1cx\xf0\xe94\xe8\xf4\xb4\x11\xb9\x0f=\xef\x0f=/\x18\ -\xe0\x9f\x848\xc0r\x94n#\xc9\xfa$\xfd\xf0\xf0\x12R\xd9\x03\rt\x12\xb2g*\xd1\ -\x92\xb8?i\xf6\xe9d\xb1\xd7X\n)\xe0T&D;\xa6#\"\xe7\xf6\x04\xe4:a\xe9W\xf6\ -\xf9\xbeH\x89V\r\xd2\xc2\x16|\xd5\"Z\xae'}\n\x1cH[o\xb1\xd3kh\xf8\x038\x9d9\ -\x85Q1!\xcem5\xe6.i\x15Gm \\\x0fY\xce|+\xc8B>\x19\xba\xf5\xc9LXB?p\xe1\x1b\ -\xe0T\x17\xbb4F#\xe3\xeb\t\xe7_\x9c\xba=pgk!\xd2\x1a*\xe9V\x82Yj\x14\xe5(\ -\xe6|)\xcbQ\x82\x95\x8a\x9b\xb7\x05\x088E\x04\x93\x11\xd1\xe7:\xf1\xf5\xfd`\ -\x12\xc6(\\\x8a\xc1\x0e\xdc\x81\x0c\x1c\xd8\xf1em'\x91\xfc\x03D\xe5\xfdR\x9d\ -\xd2\xbf*\x8a\x87\x87\x17l\xf5\xbd\x0b\xb0\x13\xba\xec\x04Y\xd6p\x87.|QY\xbe\ -\xe35\xfa\x89\x87\xff\xfc\x95p\x1c\x9b\x11\x95j\xe8Y\xe0\xa3\xb5\x07n(lM\xec\ -\xf6D{\xcb\x02\x14\xd1\x9f\xcc\xb0\x06q\xf1\x17\xc9#\xf5e\x89h&\"\xa0+\xd1O\ -\xdc\x0b\xd9\\\xb3\xb8\x80\xf2\xe6\xda\x1f\xb7\xd3\x0c\x16\xc8\x7f$T\tpJ\xfd\ -\xee\x8b\x08\xe4\xc2w\xd4_\xca\x800\x9f\xb2\x13\xfa\xf0+V\x03\x07U\x03\x9c*1\ -\xd3\x15C\xce\xdc\x1bFe\xab\xb9\x07\x9a|\x82[\x03,U\x07\x04\xd5\x04\x9c\x8a\ -\xcd\x98\xafr\xa3\x9fh\xf3\x9a\xad{\xe1\x86\xcbZ\xea\xefG\xfa\xcd\x13T\x8d\ -\xaa\n86\xe6[(\x86\x92\xa3\x18\xfdJ\xcb\x9b\x15xk\x18p\xaa\xef\xc9n\ -\x0c\xb9?C\tD\x9b\xe1\x01(\xf9\x12\x83\x97\x81mZ\x0c\xe6\xa5\x07\t8\x15\xc75\ -\x19\x91\x06\xc0\xd5a\xc2\x84\x88S\xf9\x01\xc3\xbel\xc8,n!\x04F\x81\x02\x8e\ -\xf5\xb9\xb3\x18r\x9aG\xb0\x9cd=H\x0f>\xc5\x17\x9f!\x06\xf9\xba\x83\x07\x9c\ -\xba\x19l\xf4\xa9\x9avtx\x06\x0f\xa0Cd'\x9c\xf9\xf2+\xd3\xd6J\x17\x82}\xd9a\ -\x00\x9c\xa2U\x97]\xad\xa2\xcd-\xd4!\xc4\xce!>\xfa\"\xf3\x17\xacU\x0e\xfeM\ -\x87\x04p*\x13b\x98\xd2\x1f\x10lih\x15\xd9\t\x8bp\x00~\x849\xa4\xad\xd5=\x0c\ -\xc3k\x0e\x0f\xe0\x14-\x84\xac\xd4\xbc\xff<\x88\xa3\xe2\xf9\xdb\xc0\x9f8\x95\ -cX\xc0\xb0\xbc\xe3P\x01N\x1d'\x17\x1f\xc8U\xd2\xfb\xaae\x93?1x\x17\xbe\x85\ -\x8b\xd7\x00\xe0T\x89\x99\xdb\xc8d\xb6\xba\xe1\"\x940%j\xad\xe7|\xe9\x9cS\ -\x84]<\x0c\xd3\xeb\r\x1f\xe0\x14\xddE\xa6}f\xe5q _\xc4\xf3n\xc0\xa6/\xbf\x92\ -\xb1E\x9b\xc4\x80\xfb\x0bm\x84,[\xca\xeb\xbc\x81#\xf1\xac?\xd0\x9fJ\xa2\xad\ -\xb8\x81\xe1{\xb3!\x05\x9cr}^\xd5(\xe4V\xa8\x9c\xac3\x8d\xb3\xe8G\xad\xe4u\ -\xb8\x13UGb\xc09\xbc\x83H\x84\xac0\x96{\xae\x83\x1f\"B\xa3\x13\xfc\xe9\x9d\ -\x90\xb1V\x0eBJ!\x06\x9c\xa2-\xba\xa8%\xc0\xd1\x86\xcd*\xf5'\xb1\xe8\xc2\xd6\ -\x10%\x06\x9c\xb1C\xb86bJJ\xb0/\x80\xb0\xe8Cg\x9c_p\x0b\x99U\x1a9\xc0)\xba\ -\xa2\\\xc4\xe1\xb6n\xcb\x1b\xf0\xabgY\xceZ\xa9\xb0\xbf\xcbH\x00NeB\x0cD\xa63\ -\xf5\x1b1n\x98\x12\x97W\x88;\xbeH\xd0\x81*g'\xd44\xe0\xb4\x8a\x1dQ\xab\xb5St\ -\xc29\xa4]_\x9eb\x05\x81\xa2\xf1\x16#\x048\x84e_;\x9f\xfa\x03\x84z,\x17\xdbo\ -\x84/\xbe\xc0\xed\x16V *\x14!\xc0)\xcaPS\x84L\x88k\x917\xd0\x03\x8d>\x15/\ -\x9bq\xd5\xa8#\x06\xdc?(\x01G\xb8\x1a\x81\xc35\x03C\xb6fK+\xbel\x94U\xfc\x81\ -Q\x82[\x04\x01\xa7/\x83B_Ex\r\xd6\x84\x02\x9f\xf4\xa99\xee\x10\xfe\x88\xda\ -\xab\x8b&\xe0\x00\xe6\xf0\x80\x06C\x0b\xbau\x92\x8d\xbf;\xd0\x8f\x99\x0eZ+0\ -\x87\x10\x03\xaez\xd4Ca\xcc\x84\x98\x86f\xd1G\xf4\x9bO\x1e\xb7\x9f\xb6\x9e\ -\xa8Q\x03\xdc\x7f\x10Q\xfa\xe4S\x9b\x1f7f\x82t\xbdN\xf9\x14f5\x08\x03Q}e\xd5\ -\xa8\x80\xe9'\xedB[h\xdau\x14!K=\xc2*}\xf2\xe5\xae\xb4\x08\x19\xbc\xc3\xe8\ -\xbe\xb1O\xd1\x06\x9c\xb6\x00)\x0c\x85\xab\x07\xb1O\xcc\xe9\x16\xfd\xc9\xb6\ -\xed\xc6N\x8a\xf6\xdb\xaa\x01\xc0\xa9\x02\xfd\x18\xb0w\xae\x97\xa4U\x9a\xc0\ -\x19_\xe6\x83\xa1\xcaN\xf8\xc0\x80S\xa5\x0e\xd3\x01Bn\x18es\\\xa0\x13_\xfcz\ -\xcd\xd4\x84\xd1\x7fS5\x028\xe5\x10\x1e\x0b\xc4!\x85\x8b'\xa8\x96\ -\xdfG\xcd\x03N%\xe5yQ\x06\xeb\t\x1b\xa9,w\x1a\xe1\xd1\x97\xa3t\xcc\x9amm\xd3\ -\x07\x00\x9c\xf2\xce\x1d\xbb\xb2\"\x8b\xb0D\xcb/\xdf\xd6\x03\xa3\xbe4\xfe^\ -\xb7f\xb9X\xeb\xaf\xe2c\x00N\xd17\xac\xb4\xad\xdc\x1a\xec\x8b\xef\x99\xc76_\ -\x8e\xd2/\x96\x04\xfd\x08\xef\xe1\xc3\x00\x0e`\xb9\xa2\x02\xfd\xab\xb6\xbc\ -\x81E\x9f\n>\x9f\xe1\xd2\xc7x\t\x1f\tp\xaa\x04X\xde0\x7f\xff\x80\xca\xb1\xb5\ -\t\xcb\x00\xf1\xa3\x9aS\t\xbaBZZ+\x06\x9c\x07\x94r\xdc\xcd\xbe\x8fFD@P\x1d\ -\xfa\x93\x9d\xd0\x8a\xdb\xf8\x91\xd6\xff\xc3\x01N\xb5\xcft\x92\t\xb1iA\xb3\ -\xfc\x99C\xcc\xfab\x95\xde\xd2\xec\xc7Z\xfc\x8f\x088\xa5\xf8o\xff\xb3J\xa5,z\ -\xf5\x19\xfc\xe9c\xbd\r\x1f\x8f>$\xe0\x94k\xe3\x01O\xde9\"\xb7\xa0_x\xdc2\ -\xd4\x01\xde\xa7\xe9\x14u\x19\x88\x9e\x18p\x1f\x89\xbe\xc1\xd3\x9b\xd9\tI\ -\xa1S5R\xbf/\xb2\xed\x08\xe1\x83\xd2\x07\x06\x9c\xca\x84\x18}\xa5\x9b\x9d\ -\x88\x82\xcf\x00\x0f\xbe\xd4\xa4\xcbB\xa2&\xb2\x13b\xc0UD[\xb4\xf3\x92\xa6\ -\xf2\r\xcb\x9e\xfe:\xecE?z\x7f\xdd\xe3\x16}\xe4\xf5\xfe\xf0\x80Su\xe7\xeeu@\ -\x90\xbc\xc5l\xf6\xc5\x052\x83\r\x88\x1f{\xb1c\xc0)*\xc06\xca\xec\x84Y\x7f\ -\xb2\x130\xff\xd1\xd1\x16\x03\xeeO\x1a\xc0v_2\"\x06\xe1.\x86[\x0c\xb8\xd7\ -\xb4\xedK_\x98A\\\x8a\xc1\x16\x03\xee-\xaa\xf7\xa1}\xe6&4R\xbc\xb21\xe0\xde\ -\xa1S\xf06Ka\x18O\xe3E\x8d\x01\xf77\xea\xa0q\x8f\xfco\xd30N\xf1Y\x1a\x03\xce\ -\x01-z\xd0\xbc\xa3\x0f\x97\xe3\x85\x8c\x01\xe7\x94\x8e\xc0]\t\xb06\x9c\x8a\ -\x171\x06\x9c\t\xe5\xe1\xa1B\x7f\xdc\xba\xad\x0cDL1\xe0\x1c\xd3\x1aVpyO[\xb1\ -U\x1a\x03\xaeRZ\x82q\x83k\xae\x02~\x85\xa5x\xd1b\xc0\xb9\xa1$49\x06\\W\xbc\\\ -1\xe0\xbc\xa0\xaf\x98\xa5\x7f\x95\xb8\x19\x12M*c\x8a\x01\xe7\x92R\xb0N\xc5\ -\xbfD\xf0>\xc4z[\x0c8\xaf\xa9\x11\x1f\xde\x84\xdb\x83\xad\xb3VL1\xe0<\xa3\ -\x0cu\xbfjD\xa2\xca@db\xe9\x16\x03\xce?j\xb0\xe5\xe5\x7f\x8e\x17$\x06\x9c\ -\xbf\x84pE\xd9_\xd9\tS\xb1l\x8b\x01W\r:\xc4!\xba\x83\xd8*\x8d\x01\x17S\x0c\ -\xb8\x98b\x8a\x01\x17S\x0c\xb8\x98b\xc0\xc5\x14S\x0c\xb8\x98b\xc0\xc5\x14S\ -\x0c\xb8\x98b\xc0\xc5\x14\x03\xee\x7f[\xf8\x7fx\xe5\x08\xfb" )) + return zlib.decompress( +'x\xda\x8d|uXSo\xdc7"R\xd2\x8dt\x8aHJJ\x190\x11)\'\xdd \x8c\x1e!\x8c\x0e\xa5\ +\x19\xa5\xa8\x13\x87\x80\x8cF:\x86\xd2%(!\x9d\x03\xa6 9z\xc0\x84\x11\xef\xe1\ +\xf7\xbc\xcf\xff\xcf\xae\x8bk\xd7\xb6s\xees\xc7\xf7\xfb\x89;H|j\xa0MK}\x83\ +\x9a\x84\x84\x84V\xe7\xb1\xd63\x12\x92+\x8a\x97\x7f\x94\xe4\xc07\xb8\xe6\xd6\ +\x12\xe0\x8d\xcc\xef\xa1\x8e1%\xf0\n\xa3tJ !\xe1\'\xd1\xd1z`\x1c\xf4i\xab\ +\xe5\x9e\xeb\xe6\x02\x11{|\x0e\x89\xe7\x8f\xa2\x12\xcc\x00\x911w\xbf\xb0\xe8\ +~\x1ee\xee%+\xd1\xc0\xd0!\xf1\\\xf6\x9e\x96On\'\x19\xab3\xd8!\x8a\x9a]\\\x8f\ +!\xe9:\xabh\xb1\xcc\x032\xf6\xe7\xbe\xb9\x9d\xb1\xff\x1c\xd8X\x9d\x19\x93\ +\xae3\xeae,\xb2\x89K%QJu\xd33\x1bg\xf0G\xfd\xccWF\xdf#Xj/E\x8e>F\xde\x95V\ +\xfeNP%,\x8d\xac\rY\r\xdd]\r^\x18\xc2\x1a\xa7Mp\xd3\x90GW?<\x8dn\xa5\x7f\xd9\ +a/3\x1bG\xc5\x15\xdda~7\xa3J\x96#\xf9}\xf4\xff\xf9C\x9e\xd1\'G\nda\x87\xef\ +\xa7V\xfa\xd8\xeaGz\'\x1a$=\xee\xe9\xabw\xfdmz7\x03\xc8I\x12*\x9f\xbf\x83P\ +\x11\x7f\xc4U\x89\x1c\x84\xf9\'\x9b\xacz\x9b\x97\x8b\xe5A;\x93\x18\x8e\xaaS\ +\x16+\x8a\xc3E#\x98\x19A\x8c\xc2:\x1b\x7f~p\xe0H3\xe1w,\xf3\x9a\xa5\xff4J\ +\xd1t}\x86\xdf \xf9\xdb\xf6\xe2\x07\xe6\xce\xa9\\\xe4O\xed^\xf3\x9b\xe6\xdd=\ +\xae\xb1(\xb1\xcf[\xee\x19\x83\xce;Dz\xd1\x97\xe8/\x1d\x84\xf0\xdd\xcc\xb0\ +\x06\x8a^sU\xe0\xe7\x7fw\x1c8\x1e. \xb0\xd2\xee$\xbb\x94wD\xe6\x11\x0cv\xdf\ +\xe7y\xb8\x1d%\x1d\x18\xb9\x96\xc6\x8c\xe9Y\xe5\xf55\xd3\x85\xed\xce\xad\xd0\ +\xd0.\rt\x87\xef\xdc\x14}r\xf5QUB\xca\xde\xadt\x1c\xd9\x18\xdf\x98\xa9\x16-\ +\x89E&F\xe95\xc4\xe2vdZ\xf5\x82\x8c\x83c\x18\xc7\xc5@<\xbaH\x808SA\t\x02\x93\ +-\xc7G\xf1SZ\x9e5%\x1fF\xeb\x838w\n%t\xcd\x11\xb1\xbb\x82\x9b\xa7Mzc1~\x8b/W\ +gzH\x97\x96\x80\xfb\x9a\x93f<\xc9\xa1f\x9a\xe0\xe11\xe5\xc6\xfb\xd3L\x0c\xbd\ +\xb2\xfd\xc1@i\x8a\xac\x90\xe6\xc4%\xe5\xa7&\xb0\x12\x149\xc9w\x9b+0\xed\xd8\ +\xc0\r\xc9\xc3P\xce\xa5x\x90g\xf2#x\x13\xe9F\xc5\xec\x89\xe5\xac\x8b\x0c\x1d\ +\xcd\xd7\x9bR\xc0M\xcd\xd7\xd9\xaae\x8b\xc9\x1e\x90@\xb49c\x8a\xaf\xdc\xf7\ +\xe1\xbd\x0ff\x89q \xe0B\x93\xf7\xba\x04\x15{\xf8\x80>\xc6\x12\x12\xb9z\x1d\ +\xb1\xdaF\xf1K\xca\xca7\xe9\x06\xae2\xcf\x91\x03\xb7\x0e;t\xf6\x04\xe5\x86\ +\x14\x7f\xde.}\xec=\xdaJ\xbf\xac\xff\x8e\'\xd6XB&\xf2\x06\xf95\xa0&$$\x8b\ +\xca\xe4C\xf8<\x06\x85\x97\xc2\x94x\xb54\xe5T\xb0\x89\t6\xbe\x8b\x83Coz\xf2S\ +i\xa9\xbd\x05\xdb\x81z\xcb\x8e\xe6\xb1\x8c\x89\xc9\x03\xcc\x84=r\x85\xbfh0\ +\xf9\xdc\xbe\x13\xdd\xe3tO\x8e\x83H~*\xd7\xf6\xb6\xb8\x17\xaf6\xe0,\xc7\x117\ +r\x82=\xcf\xda\x15\x8c\x91\xe8/\xe3N\xda#\xb5r\xb4\xd2\xe6\xbdr1\x17\xef\xb7\ +\xf9Y\xa2\x7f\xf2\xa2\xb9NR\x00.\x98\x80\xfa7E8\xd6\xf0\xc4l\xfb\xcf\xfe\xf0\ +\xde\xf71\xb4\xe6\xa0x\xe4\x82\xed\xe0\xa0\x90xn%\x07\xb4~\xf2\xcd5\xdc\xf0\ +\x86\xd6\xb8\'\xa6\xc7S\x91\xa8;NbO\x9a\x11/\x8a\xfa\xe2\x95\xe5\xd7OL\x7f\ +\xf7\x9cGU\xd7P\xd4\x99\x06\xe8\x93r\xc6\xe0l\xcdy\xf0\x9b\xd5`\\\xa4\x15\ +\x03\xd9\xbfU\rc\x13\x9b\x7f;\xa5\xf1\xd4\xc0\xf8\xde#\xa8\xda\xb0\xbf\x15\ +\xa6Z\xf8H\x01\x027\x12\x99z\xec\x1d\x181\xc8\xdfY!\xaf!\xdf\x98\xc1F&\xac#&\ +\xc6\xec\xf5\xda\xe3\xddI\x98\xdf\xbf\xb3\x82\xbb;\xf2\xba\x8cS$\xfa?\x97\ +\x8a\x87\xb5Y]\x81\xd00\x8bz\xde6\xb0@\xc8\x1c\xd1\xd6\xb4\x1e\x0eo\x9f\xb05\ +tt\xe0\xd5\xb4\xcc\x18\x9d,\xce\x97j7r\xa3j\xf2\xee3\x90\tO\xe9\xe8[\xfb\xdb\ +h\xfb\x9a\xdd??_\x8d\x9c\x12O{\tsu8q\x9c\xfdY\x97)k\x9dQU.S\x8b\xe146\xd9\ +\xca\xa7\xd1\x99E0\xc4\t\x0ch\xd6\x1eYp\xf7f\x9cg\x08\xb6\xe8\x80\x11"\xc6&\ +\xb10\xa7\t\x14(\xe2\xadv\x18k\xe0\x82\x9f\x7f\x80j\xf4\xbe\xe6\x03\x16PV\ +\x04\xbd\xa3r\x95\x02\xda\xe4\xef\x1b\xe5\xd1\xc6\n\xccO\xa9|\x14\xc3\x9b\ +\xcf\xef\xe5\x83\xb3)z}\x8bGr\xff\xe9kq\xf7FzI\xa81~\xa2\xf01\xf8\xd4\xb3m\n\ +m\xf7\xe5\x1e\x9f\xf7\x8a\xc9\x96\x95\x00\x1e\xcc\xb1\x1cN\x15nws\xac\r\xfd\ +\x91\xe1\xca(\x01\xf7\xb3\xb9v\x86\x06\rm;kanW\xf7u\xe0\xb1\xa8O\xdbW\x8b/\ +\xac\xdf\x19 \xde\x00\x81\x7f\x7fR\xce0(\x02\x1e\x9aw\x0f\xb8\x97\xe1\'\x8c\ +\xd4fJ\xd5\xc20\x1d\xc2\x99\xbd\xeap\x92\'E\xbegB\xb3\xd4~?\xf8\xe2|g\x02\ +\xc6\x93\xbd\n\x86&l\nqu\x80vs\xdb\x08\xe0\x7f\xfa\xbc\xad;\x9a\x98\t\xf3\ +\x96u\xea\xce\x18(HF\x9fy\x042\x9eX\xecf\xe9wa\x88A\xdf\x83\x92\xdd\x8a\xfc\ +\xf0\'k\xf4\xfb\x1d}#\xd7&\xcb\xd5\xa4\xf3\x95\\\xaa!\xc7G\x88/\xe4\xcc\xe87\ +o\xcf\x06~+\x1b\xdc\xbc\xbe\xc4\xdd\xdb\xa1\x81v\xc0\x04l\xd5\xaa\r\xe5n\xb9\ +\xdbI;"_\xa7\x8b\xe9\x7f\xd16\x98\xd0\xbc\xd6%\xa3bw\xf0A\x98\xea\x0f\xe4\ +\x87\xc4\x0f3J\xf4m\x95\xe7\xe9\xc2\x02w\x9dx\xd4\xfeu"vk\xbc\x8e\x90\xbf\ +\xd5^6\xe6\xa1\x8d2\x8f\x1f\x17\x16 \x0b\'\x02\xf4\xbf\xd1\xd29pt\xc2\xe6\rZ\ +\xa6j$\xa2\x9b%\xe5\xae\xef\xb3FQa\x1e\xfbrSl\x18(\x85S\xea\x8di\xa5\x0b3\ +\xb4%F\x9e^\x00}5\x05s@:\xe3\x12[}\xb9\x1dO\xb2F\x8b\xfcI\xcd\xb5\xd9\xa2\ +\xf8_\xd6\xcdC\xb5 \x18Ey\xe87Z\x0f\x8e\xf9\xf6B\x94P\x9e\x18\xb5+2nf\xab\ +\xec\xb0m\x10\xea#\xdd\xa2ngx\xbd\xbf&\x06\xfdE@\xbf\xe9\xd0cIQy\xad\xd1@\ +\x9c\xdc\x16\xacn\xfc\x94\xe5Z\xad\x05\xb1\xed,\xf0\xef\xce\x9d9f\xf6\xbe\ +\xd4\xd1u\x82Lc4\xc8SHP\x99\x9e\xdf+1+\x01\xd9\xf8EP\x87\xe9\x99\xd5\xf1\x93\ +q\x94XT\xd5-\x7f)w\x12\xc6\xca\xdfj\xfc\xb8\xc0\xcaQ\x8d\xaf\xb4t\xeb\xd0\ +\xd9\xafoF\xd8\x86\x12\x07\x8f\xc0\xc4\x89\x1b\xc9\xcb\xed\x82h\xc6aH\xde\ +\xf3T!\xc6\xf4\xc0\x95WK\xe7\xd6\xbd!R\xe6\xf4Q\x9f\xd9?\xcc\x82b\x0f\x01<1\ +\x81\xbaey_)-\x05Z\xfe\xab\xa8#9\xc0\xa1S\xd1gT>\xd6os|*\xdbR\xb09l\xf6M~X\ +\xa5\x03\xc7\x8f\xc8\xe5\xac\xb0\x1dm\x1fn\x8a#\xdfp\xe6K\xd4\r\xe6\xb5\x9e\ +\xda: \x02\xdd\xb6g\xa2\xa7\xaf\xebp\x99\x02\x9a\xcb\x8c\t\x95\x8e\x82*<_\ +\x8d~`!\xddf\xbe\xe1O\x08\x9e\xd4\xc1jen\x19@6\xa7:RF=%JPFm\xabO\x8b\xf2{u\ +\xb5\x0e1\x85h\x93X9r\xf1\x03p\x81\x9d\xd21\r\xc3\xa0\x14\xafl:f\x8a\xbb\x03\ +\x15\xeb\xaf\xb1\xb7\x98\xfc\xacE\xcb\x7f\x1c\x02G14\xe5\x99q\xc4\xbd\xfa\ +\xa7\xb2\x1d\xd0\xf8\xef1\x99\xb1\xc9\xc4/%i\x0e;\x00\x02\xaf:\x029\xe0k\xef\ +\xffL\xfa\x16\\\xb0L(I\xfe^0\xe8\xfcv|M\x9e\xbfe\xcc\x02\xf5[\xac\xb8\xc0\ +\xbf{\xb1\xdfJ\xc53\ng~Z\xfe\xdd\xa1\x8c"Yj_\x9b{\x1f\xb3\x17l\xde\xad\xc8\ +\xbf)\xd4T\xbb\x8d[Tb\xdc\x83\xe9\xb1*L\xc1\x04"?\xa82*\xe8\xa4\xbf\xc6.\x0f\ +\x1fm\xe0\x82r\x16\x19\x13\xa4\x84\\\x91\xa6\x1e\xac?|\xb9\xa3\xf0$\xbe\xdcS\ +\x8a\x0fg\xf3\xc5\xa8\x01\xac\x1d\xb8\xfav\xb9\x99\x96\x85\xad\x9a\xf6\xe5\ +\xa9\x19\x1d\xee\x87 \xedK\xab\xb8\xd5`\x0e\nr\xd8\xab\x96fi\x1d\xe9\xa8\xfe\ +\xed\'\x88|\xe8:dc%+\xc4\xc7`\r\xf1(\xe79i\x8c\x03\xa5\x89\tN\xb5\xd1\xe4\ +\x9a\xfeX\xa3\xef\xddc\xda\xbd\xcc\x84\xb5;\xcf\x9b\n\xaf\x02C\xad\x8e\xb7f\ +\x9b\x88-\xa6\x8az\xa9\x9cZ\x82B\x14\xdez\xc7S`\x04\x0eM\x81i=3\xb5d~\xa5}\ +\x1f;\xe6\xc0\x9bQ\xef\xcf\x92\xba\xc4`\xf3(\xbf\xbd\xa5\xeb\xfb\xf9\xa9\xd9\ +\xf9\xb3\x81!\xeb\x90\xf8\xab\xcch\xde=5\xfa\xd2Y}?V\x9b\xa97\x0b\x85\xc6\ +\xb8\xad]A\xe1\xfal\x1eb\xf6\xc8\xd3@\x93|%\xb7/\xb6\xae\xffq^\tU\xcb\x8a\ +\x80\x85\x1f\xae\xae\xfdl\xaf\xf2EY.\xb4\xb1\xec\xb6\xdet\xc8g\t]\xbd6C\x07\ +\xbe\x99\xf2\x9d\x90\x17\xdc\x14S0Fk\xb2\xfa\xf1\x84\xfd\xd6\x18\x94\x98\x0c\ +\x8d\xa3\x1bU\x03\x08<\x1e\xc0\x08\x8c\xf9O\xfd\x87*&\xf5,\xfa\xcb\xc1t\x00\ +\x1c\xe4Ld6\xb8\x86\xde\x00R\xec\xf9\xac\xc3\x01b!\xbf{[\xcd\xeb\xde\x89s\ +\x18\x8d\xa8\xa7\xae(\x8d\xa6\xd8\xbd\xc6\x92\xc0046\xf7\xdbX\x8f/\xcd^\xa6\ +\xb9\x95\xcf\x0er?{\xcc8K"J\xcc\ +\x1e\xe9\xfc\x05\x97\xbc\xa8\xb4\x07)\xbd@\x1e\x88\xc6\xb6V\x06f\xcf\xa2\xb6\ +\xdc|Ry\xd0\xd5\xc3W\xf5\xa6\x11\xf7\x8b `\xe6g\xb7>\xe3B\xa0.2\xc4\x8f-\xc2\ +Kt\xd7\xdc\xac\x1e\x86\xb1jN\x97\x9a1(\xa7^\xdd\x19\xf70\xfcw\xd3\xe9\xe6\ +\xa4\xb2\xcc\r\x9c\xbd\x9b\x94 \xb4\x13\xaff=\x15\x0b\x04\xd8\x89z\xf2=\x87\ +\xceI\x914\'\xea\xe2\x1d\\\x96\x96n\x8dD\x97:\xacd\xfe\xd7[\x1c\xd9I\xeb\x82\ +\x1b\xf6\xe5\x90`\x04\xb3\x03F\x91\xa6\xab8\x1cq!\xe8\x01\x81\xae\xc4\xff\ +\xacI\xfe\xa7R\xf8\xa8\xf6\x01C\xbbF\x8d*v\xa4N\xe2\xfa\xe4\x1b\x90$\x95c\ +\x1d\xbd\x95#\x8e\x01?\xbc\xe9Y\xa47/2?\xe5\x86Z\xe1V\x05X\xfe5\x8a\x9ca\xef\ +\x8e>s\x05n\x92\x0ct**\xf8M\xc72\xc5\xc7\xb9\x96\xb3p\xec\x96B\xfd\xf2LH\xf3\ +X\xcf \xbf\xea\xef>\xfa\x82\xb7<>\x8fx\xd8\xaaa\xf7\xcfq%)\xd6\x14\x08\x95(~\ +\x00\xd17\xa2\xed\xe6X\x87\x8f\x1aes7\xe1\xebi\xb7\x16\xbf|\xf5:;{\xfc\xe2T^\ +\xdf\x03\xea\xde\xe7\xcb\rdH\xe3/3\x13V\x7f\x9b\x9d\xb0\xd9_x\xb5MG.\x84\t\ +\xf6\xb7C\x1d\x053\x1a\xb1\x17\xce\xb7\x9d\x88\xd1)I\x01\x92\xb51\xd9\x1d1O\ +\xf2\xf1\xd9\xb7\x9b\xdb\xaeBQb\xf0\xcf\xdb\x93\xec\'.\rr\xca\xa9c\xee\xd4\ +\xdf\x0fzY\x80+\xa7\x9f<\x9d:\xfc\x15(_\x00\xa5\xd2I\x7fZ\xd4\x9b\\\x89\xbf\ +\xc7}\x91\xe9X\xb4\x13m~\r\x8ej__\xbf\x95\xba\xe5\xa8\xa6\xa6VwNH\xb9z\xd5\ +\xcc\xcc\xec\xf7\xc5\xcf\x1c\xfa\x87\xc1v\x9d\x17\x04\x8d2M\x8f\xf1\x8f;#&1\ +\x8b\x15/\xf7\xa5Y\xf4D#E2\xa9.\x8c_\x1e5\xe4\xd3?@@\x82\xc2NC\x16\xb1\xf3\ +\x91\x8d\x9a,\xa0\xe9\x13\x17\xabi\x04\xfa\xc2\xfc\xf5\xf1\xd1\xbd\xc8\xe8\ +\x93\xb6/\xff>\x9eu\x03\xbf\x11\xf7\x03\x15|/\x08\x84\xaf\'\xaa/\xd4\x1b\x1a\ +\x1aT\x89\xd9\xb0X\x90\xa7\xe4k\xeb\x9bU\xa9e\x06w\x8e\xbf\xd1\xa6\x1aS\x17\ +\xbbK~\x93o\xd1q\xe0\xc3\xe8\x0e\xe9\xe3\x98\xf4\xc7~+\x1f\xb0$\xae\xdd\x89\ +\xaa\x98j\x1a\x8e\xbc\xb6\xd4\xfey;\x19\x01\xd1\xb9\xa1d\xe4\x99>\xfb\xf7\ +\xdb\xf7\\\x88E\x16\xdbv%\x97\xdet\xeb}\x13\x13\xca.\x86\x95\x07\xf3\xb2y\ +\xb4\xefx\xae\xa5.\x8d\xf7\xa5\x95\x96\n6\x957.$RA\xb0\xbbj\xf4\xbd\xbe\t\ +\xcc?o\xcbJ\xc3Ig+&\xdd\xa3j\xc5\xe0\t\x15\x82\xee3&,\xa0*h\x93\xdfM\x07\x88\ +\xf6\x03\x8eQ<\x03\'_<\x15\xe6\xe6\xad~\xa6\x93\xec\x05\x1d\xaf\x1b\xbd\xbe\ +\xdd~\x9bsE+v\x92y\x89\xbb\x0c2\xf4\xfa\xd3\xda\x01\x92\xab\xe5\x00\xaef\x05\ +\x97\x9b2RZ\x91\x96i&Y\xd6\x83\x81\xc1$\x1c\xfe\x12r\xcc^\xfd\x93C\xec\xb6\ +\x7f\xf7\xed \x82J\xd43\x87?\xd5\xd1\x1c11hu\xfaMN\xe5{\x9b\x84\xbe\x11\x00o\ +\xba{!v\t\x82{o\x98A\xd5G\x1f#W\xba\xf0\xcd\xa6Jz\x9e\x98\xb8`\xd7g\xf8AO\ +\x8c\xed\x13#H\x97\xccc\x1e\xc9\xa51\x19\x07"\xffB\xc9\x94\x85\xc5;\x89\xfe\ +\xfc\t\x1e\x91\xdb\xf7\x94\xe9\xedy\xea=f\x06}\xad\x95\x9a"\x99\xebT@+\x8a\ +\xca\xca\xbdt\nH\xb8\x94\xd0t\xef\x96\x01+0\xc4\xdb\x89V\xd8\x82p\xb2Q\x0c\ +\x0b\xb2\x10\x96-$v\xa9\xc5\x0f\xd6e\x97\xa0\xe6Q\xdb\xaa%\xa5\xd4=\xadW0\ +\xdb\x9f\xbf\x1e\x97`\x82\xc3l\xa4\x15\xc4\xe1\xa4\x93\x02\xd5x/\xd5\x11%\ +\xe2\xfb\x8e\xbb\xbe\xc5\x0fO8\xbb\xbd\x05\xa3\xf8]\xc3C\xce\xad\xcf\x9dx&c\ +\xf51B\xc7Qu\xc6o\x86\xd2\xcf\x06>\xbb\xddpS\xfdG\xbc\x9bC2vk\xdd\x14{$\xda\ +\xe3\xb1\xaf\xb63\'\xec\xf7\xde\xa1\xf3\xc8\xa0\xb4tc\xe0(.\xd3\xe75\xe4c\ +\xa3\x8f5B\x04N\xdc\x86\xd7C1=\x80k\x98\x82\x95\x8c\xb5\x10\xf8\xa1\xba\xbb\ +\xe1|\x80f9\x89P\xa2o\xae\xc0\xa5\xe8\x94\xff\x01M\'Rf\x14\xea\xcc\xb3\xbe\ +\xbf\xd4u\xda\x837=\xaf\x82Y\xfed\x85\xc8\xd07\xcd\xbc\xb3\xa4\x986>\x88\x06\ +\xc0\x98\xd0\rm)}\xb9\xf4\xb5\x8d\x1bj\x97\xe8bb\xe2c\xf3A\xf9\x0fZ\xf9\xfb\ +\x18\x8c\x07\x10,\xfbm\xfdD&\x8bG\xa8\xaf\x04\xca\xef~\x83E\xadEm\xc6t\xc6&\ +\xd7\xa0f\x1e\xd2\xee\x99\x0c{\xf5\xd0\xa6l\xba\xbd\x7f\x7f\xeb\x03\xb2\xfc\ +\xef\x14\xd0I\x91\xba;!\xfeG\xa0p)\'M\xb2p\xee\\\x0e\xba\xd8\x8e\xee\xa8\xde\ +_E\xa8\xfa\xfc\xf3\x13Gj@\x8e)|\xf6\xe5\xee\x92I6\x9d\n\xccNa\x84\x1c\x0fY\ +\xfe\x94\xd7w\xb0`\xabW\xd351\xf9Z\xe4\x05=\xbb\xf9\xcd\xc0\x9e\x0fS\xfe\xde\ +\x7f/S\rp?}\xa9\xcf\x88\x12:L\xc0\x80\x8c\xd6\x9de=\xb1@0\xf6\x0e\xaa\x9b\ +\xf1\xf4\xae\x0bs\xce\xaa\xd4\xa8x\x9f7KU\x95\xac\xdd\x0cR\x94\xdcD\x9dY\x86\ +\xbce\xca{\xd8\xb4]\xf1\xa5T\xbcF"\x0f\xbe\xe0\x12\xac\x18\x15\x96\xa5"\x9be\ + \xe0=v\xbd\xab\xe8^ad\x82\xa5\x89\x89\xb4\xea7h"\x12%\xf6\xb7\xa1\x95\xa9\ +\xbe\xb4\xd4\xd6\xf3k\x13\x83\x02q\xfa\x91?+8\xb4bVQ\'\x1fj5\xfeO?{\x80,\xa3\ +\xb8\x1e\x10^\xd2\xf6\x18EX\xc7\xc5\x97w\x90\xe3E\xa1\xa3\x90\xbe~\xbcZg?\ +\xc3\x82E\xa8\x1b \x98\x01\xe01G\x1cJ\xe1\xbfc\xc7\xf4kr8i\xba\xf8\x03\x96$\ +\xa1^A.\xbc\x13\xf2r\xfdw\x80AP\xc3X.\x9fa\xf3:o\xcb4\xe5\x8b\x8a\x8f\xa7\xf8t\ +A\xf4S;o\xe8\x9dey\xb7\x1a\xec\x1a\xa9\xab\xf5\xb9\xdc\xcd\xe28G\xf7SV\x96\ +\xc3\x12\x1f\xf4\xf7\x9dF\xad\xe3\x1c\x1c\xea\xfb\x99&\x1d!22-:\xfa\xaa\xf1E\ +A\x16\xb6T\x8cZ*O7\xec\xe2\xbc\xe5\xe8\xa3\xdff\xfb?\xb3G7WH\x0b\xdd\x167.r3\ +\xae\xbf\x13\x01\xcc\xd4B\xdb\xa1\xe5\xad\xe6\x0b\x1e0\x0b\xe3)\xf6\xca\xd1\ +\xc5\x84F\xa6\x1c\x8c,i\xdaR\x14@!\x9e\x11\xf6\xf96xM\x1e\xbf2}\xb1\x91\xdd\ +\x14\xecO\xceq\xde\xa6\xde\xc2\xf4\xf5?\x15/\x01\x9eI\xef\xeb\xf0\xde\xdf\ +\x1d\nc\xe2iUd\x7fl\x04\xe0\xc2M\x8f\xa0\xa4\x10#\x99\xd9h*+\n \xf6\xc2\rw\ +\xf2i\xb9\xda\x8e\xff\xe6\x1aVO\xfc\x8ap\x06XC~Q\x94\x92\xb4\xb3\xff\xf5\xac\ +\xa3|+\x1c\xd0\xc47\x9d\xb36*\xe0\xbf\xd5\x8awB\xa2XZ\xb8\x88\xf3u7\xc3\xd6\ +\xf5\xf7f\x8d\xdf\x8e\xa8H0l\x93\\\xaa\x07\x10\xa5t\xd7d\xb9k_\xe8\x1d\x10\ +\xcaD\xf01\x86i\xbf\x89;\xce\x81\xe6\xfc\xcf\x08\xec\xac\xd26\xa7\rP\xa4\xbb\ +\xe1m\xcc\x14\xcfS\x97l\xf7\x87l\x93f\xfd\xce\xb3Z\xa7Z\x7f\xe6_\x92\x03\xfc\ +\xb1\xd1\xc7Wv\x1fL^\x81\xfa\x8f\xa2r\x8c\xc3\xe3\xad\x9c\x8f\xab\xf9n}O\xdd\xe9\x00\x95\ +\x01\xd6\xf2\xbe\xcfl\xf7]\x86~\xd0 $\xbc\x0f\x9b\xc3\xe4u\x0bg9\x99\x1b+Cc\ +\x15y\x852jw\x91\xa5\xd3\\\x03\xe0\xf5\xc7\xec\x06,$/\xa9|\xb3i\xa5;C6\xda\ +\x85,>\x11\xd4*\xcd\x8c\x9e\x00\xd8\xcb\x02\x82E~+\x15L\xbdu\xd3\x80\xd8\xab\ +$\xb0~\x03\xc0\xf2\xaa;\xfdw\x94{y\xde\x83d]R\x17\x1c<<\rxW\xc0i\xf2$\x9d\ +\x8c8]\xc8\x96\xde\x905GT\x05D6\xe1\xac\xa7\x8e\xa3(z\\\x7f%B\x15\xb0]\x87\ +\xa0\xde\xc2\xd8\x93V\xba^_w\xf0,\xbe"/\xdc\xba\x12\x04}\xeb\xe2[P`l\x8e\x88\ +\xfd\xad\xb6\xd63\xf5\xab\xe6\xf1\xfc\xedr\xb3\xa8I\xfd!\x13P\xf0\x86\xfeH\ +\x80\xf0\xaf\x7f\xf2\x80V\x13%\xeaxF\xb9\xda\xf4\xb5\xc1\xc5\xe0\x94]\xafg\ +\x97\xd5\x86\xfc\x8aU\xddq\xe1\x8f\x8f\xf5\xcf\x0b\xcc\x9b\x8f\xb2\xda^\x00\ +\x1c\xa1\x13\x91#\xacC)\xad\xb9\xc1"\xd3\xcc\x7fm\xc5&?\xad\xb8\x14.SV\t55\ +\x89\x15so\xfb\xc2\xb6\x14^\x95^\x9a=s\xca\xa7T\xdd\xd4t}/\x92\xc9\xf7\xec\ +\xc2vi\xaf\r\xcd\xfe\xe8=$\x11\x8f\xf7\xf3<]J\xb1l\xe5\x18\xc2O\x9fal\x80t\ +\xd1\x9e;\x8f\xc7\x98\xb6\x1aN3\xf9\xf8\xf9i\xce\xe7\xea\xa7\x93\xcd\xb6\x8d\ +\xcb\x10\xd3\xb6\xb4\xf5NZS\xd7vP\x96O@\x16\x08\x00\x8e\xe3/N\x18\x80\xc4\ +\xc1n\x04\x02b\x12p\xf6\xf8\xc8\xbb\xf5\xef7\xe4E\xe8$\xcf\xdb\xf0{\xff\xec\ +\xf8\x04\xce\xa4\x99\x14\x15\x15-\xcf"z\x9e\x9bw\xa3\x9d\xf6\xed\xee\xc2\x89\ +QH(\x16\x9d3s\x9d\xf9\xfe\xf1\xc8\xd3>\xfc\xe3\x00:\x9b\xa9\xb3g}\xd1\xc1\ +\xae\x9dw\x03\xdc\x8d\x86j$\xfed\x7f\xedN\xc9_.\x91\xee}c\xcc\x0e\xd1\xce\ +\xddF\xa3\xdd\x83\x8e\xb9F\xd11b\xf0\xe2LY@l\xd5\x9co\xea\x0b@u\x13\x962\x96\ +k$\x19\xd1\xb7\x1b\xb5\x9c\x1b\xe4\xc4\xe0\x0f\x99C,\xea\xbf\x13Pb\xbf\x83m]\x12\x7f\xd5\ +\x89*\xddo\xca\xea\xf3\xb7\x89\x8f\xdcn\xd8&\xad\xdd\x96q\xf0\xf8\xa8\x9c\ +\xea\xc0\x17\xbe\xa0\rd\x83x\xb6"\xee\xfb\x98\x05\xa2C\xa5N%1\x81\xec\x01\ +\x7f\xd2b\xdda+\x9e\xc4\r\xa9XA\xab`\x91\x10y\x9c\x81&3\x8fg\xab\xbf\x1a\xe6\ +kv\x7f\x06<[\xd9t\x8d\x91\xab\xb7\xa42\xdc\x94\x9eUg\xcfuF\xdc\x1a\x01\xf9\ +\xb7\xaaa\xa2\xc5\x99\x03\xe0lRPQ>\xe7\x8f\x0f\xde\'T\xbeY>\xdcE\xdb\xd8\xc3\ +\xc7\x01+\x1a\xea\xd7,I\x86\xf0U\x12I\xc6"\xcd\xd1\x12B\x9d\xad\xbd\xf0\ +\xb72/a\xd3\x85\x1c\xa0\xf1\xb0\t\xfd\xc4\xf4\xc8\xed\xa9\xc918*\x88\xb1\x1e\ +\r\xf8u\xe0\xb1\x1eR\x00Y\x96u\xd1\xd1\xa8\xde|\xd9Z\xd4\xa5\x8a/\x1e\xdb\\\ +\xdb_?\x91\x1a\xa92b\x01\xa5\x07N\xbf\xb0\xea\x85E\x89\xacE\\\xc1\xa0sw\xd6\ +\xb3\x12o\xdcg[\xd1\x1f\x8b\xa9\xf6\x1e\x1f\x95\xce\x87R\xfd\x01=\xb6\x89>\ +\x11\xb7@<\x98\x07_\x98\xab\x86\xa2\x89\xeb\x0f\xc7\xc7mXkg\x92\xc5\xdd\xc1,\ +\x0f\x8e\x1fT;\xb9_\xb9\x18\xd0\xf6a\x94_y_\xd2\xb41\xcaN\xc0\xab\xf5\xfa\ +\xab\xc4FNF\xa8\xf6\xc2\x00\xbe\xc8\xe1\x07\xe2\x15\x83s\x86\xba1\xaa\r\t5\ +\xc2\x8b\x8f\r\xc1,\x1djk\xa25\x19\x06E\xd2?\xbfB\xbb\xfes)\xe6T\xe0\xb2N\ +\xda.~\x10\xde\xe6_\xfdw\xda\t\xb6\xb4\xe2\xd0\xaf"\x86\xa68\x9e\xd6nW\x0e\n\ +C\xa9[\x12\xb9\x04\xcdK%{\xfe\xd1\x10Va\xce\xa66\xd46\x0e\x19}\xf1%9\xda+\ +\xe6\xf3u@i\xce1\x7f@~\xfa\xb4\xa0f\xa1\x02\xe3\x1f\xffo\x9a\x10\x05G\xfam\ +\xf2\x0f\xf9\xb9\xbf3U7\x96v\xce\xed\xd7:\x97\x12R\xa6\xe7\x87\xca\xe1\xfb\ +\x08\x9d1[Y4\xfa\xf2\xc9W\xaf\xa2\xa1F\xd7\xab\xd5\x87p\xf9m\x0f3\xffg\x1a#\ +\xcf\xce*hD\x9f\x8f\xb4\xdf\xdd\x80O\x96f\tru-\x18ya\xa9\xd7W\x13f\x11h%\xca\ +\xdd+@I\xba\xa1\xfb\x12\x0c\x88=\xd5\xb5\x17H\x02\xab\x16X\xcb\x1fD\x98\x1c\ +\xaa\xa1\x01-\xf2\xbd\x03l\x04\xe5\xf3\xde\x9e\xd1\xea\xaaM\xe13\xffW\x12\ +\xfd\t\x15\x1b\xceI$\xb6\xdc\xd2\x88\x96\xdd3U8\x8a\x9f2\xaa\x80 \xb0\xab\ +\x96\xc6r\xd0\x06\xf7\xd1@\x86N\xfb\x9f\x82\xc0\x80Ry\xac\x89\x14\xd9\xdf\ +\xc7\x98?\x94f\x15\xf5\x04\x0c\x80\xa8\xa66\x03\x19\xa0U\xfd\xf0,&6!\x7f\x8f\ +\x9f\xb3F\xb8\x8e\\\xdf"dSoY\xd96|2(\xf21\xe0\x0e\xa1\x1fS>7\xee%4\xb8\x07\ +\x7f\x90\xf4"\xb1G\x8a*|\x0c\x9e\x07\xe4<\x97]\x80\'\x07%\x02r\xe9\n\xbe\x99\ +\xf5\xb4\xbe\x12\x83#j\x14\x85\xe1\x86g\n\x00\xbf\x8f@\xc8z}U\xd65\xed-\xf2\ +\xb9S&\xe3\x7f\x1f\x13"\xaf\r\xe1\x8bS^\xdf[\xec\x9f\x14\x05\xe4ak\xe1\x87\ +\x9c\xf2\xdbe\xab\x1d\xcc?a\xa40\xb3\xef\xfa/\xc6\x08\xb9a\x1f\xe5\xf5e\x89i\ +r?.\xbe$\x0f\x0e\x0e\xde\xd3\x18;/ ?\xcey\xeb\xe6\x91y\xc6j\x9b\x87S\xa9\xa8\ +\xac\xac\xbeuz|\x06\xb1\x10\xa4$\xe5>\xcd\xa1(\'\x080\xb4%*\x9f5\x14)\x9fN\ +\xc5\x8fk\x90\x01\x15\xc1\xe1p\xd2\x91\x86\xdc\xbd\xff\x0e/.\xa2\xf65\xaf\ +\x10\xd2\xceC\x82w/b\xe2\xd1_\xfe\xe4\x86\xac\xe57h2\xd3\xd3\xd3\'\x9cK\x91\ +\xf2\xbeZ\xbf\xe8Q[ a\xab\xbe\xb2\xe6\x95R\xe4\xfd\x956\xd5i\xcb\xa8\xd0\xf1\ +\xb8\x92\xbb\xe7\xd5\xc8\x89\xe0\x81\x9f%\xe9`MS\xbf\x9a\x8c\x9b\x95 \xe2\ +\xf7\xbb\x837\xbb\x821\x10\x8br\xc3\xae\xa2\xb1[\xa8/\t\xb3\xda\x9d5e\x06LH,\ +\xea\xe7\xa2\xdb\xbc\xb9\x87\xc3\xedK\x03\x197\xe3\x19\xec=U \'0b\xe4\xc3\ +\xfb\xb4\xc8\x19\r}KQ\x15\xfb\x1bz\xe9\x1br\xcb<\xd4I\x7f\xea\x93\xea\x8f\ +\xa9X4\xf8\xdb|h\x1c\x9b\x85\x9c\xfc\x90\x9b\xeb1\x8a\xf8x$\xde\xb6Y\xe2\xed\ +i\xf6\xe8Z\x92\xf9\xb8\xa7\xb3\x8d9\xc6?\rx^c^\x05\xba\xf8J\xfb\xd2\x98\xb7\ +\t\xae\xed\xf0[\xfb\xc2\xbd\xbc@\xfdH\xe9\xa1pJ[n\x87\xc8\xbcRq\x0e\n\xf2\ +\xf1\xac#\xbe\xddU5\r\xe4\xe0p-Q\xe7\x03\x8a\xfc\xb5\x98\xf1\x14lZ\xfb(\xa7\ +\xcd\xfb\xa1`\xa3\xb0\x80.w\xbf0\x90\xb2\'\xa2\xb0\xc5\xa8;l\x93R\xcf\xbf\ +\xf0>\x06\x07\x07q\xd2\xa1\xa2\xec?RF\xdd\x9f{q\xab)\x10\x04\xbe?\x0f\xbeW\ +\x9f\xb1\x93C\xcc\xf7\xed\xbf\xfd\x9f\tX\xfb\xbb\x9c\xbb)\x06H\xd9\x10\xbe\ +\xa8lqiy}M\x9f\x07\xebW\xf7\xee\x9f\xdc\x0f\x83\x8d-v\xa9\xdd\xfd0|\x03[\xa6\ +\xe2!\xe2\xe9\x86\xec\xbc\xbb\xdd\xf36RO-\t\x83\x83el\xe4F\x85nL6\xba)\x08\ +\xe8\x18\x1a\xf1\xc2\xbf\xaa5\xa5\xfa\xbfQu\xe1Ev\xd3}z&\x7f1Z\x94[\xf4\x01\ +\xc1O\x99\x80*\x9e\xfc\x86\x9b\xd1\xb0\xc1ZE,\xcc\xa8(\xa6Y$\x95\xb8\x02\xc6\ +f,\x1f\xc6\xae@\x92\x02\xe6l\xe8h)\xd3i\xa9\xff\xe7\xc9\x8b\x04\x92\x06Y\xfc\ +\x9e \x02\xf8a\x07\x8e\xf2$\xa4\x18\xfc\xb1\xb7\xd1h\xd1\xc1\xfbb\xd0\x87\ +\x11;\xcec\xf5G\x8b\xa0\x07\x12\xfd-c\xf7BK4\x0c\xa7\xde\n[4\xb6\x0b\xeb<\ +\x0c\x99\xc9\x1e\x0f\x9d\xa9\x90\x98pT\xb0[~\x03\x99\xb1\xc6N\xad\x92L\x93\ +\xac\xfcJ\xc4o\xe3\x9d9\x1em\xb5\xb1\x93\xe5\xeey\xff\r\xd6`oK\xcc\xe2n@\x17\ +\r\xf6\xc7\xd7\x1ceA,~\xb5\xc8y\xff\xf2\xb5\xdeY=:\x94\xd1\x7f\x1b\x92\rGe\ +\x18\x16\x8d\xd9\xa6\xea\x00%X \x0e\xcf\xad\x03\xd4MC\xc4\x91\x10N\x16\xd0z\ +\xfd;W1\xca\xa8\x9724%\x8fR}\xb9\xdf~\x92xr\xf5\xf9\xcext\xe8\x06*\xa4\xd8VO\ +\xd4\x8d\xaaa\x886\x17\x83\xa6\xee\xfd\xeb\x86\x8fN\xd7\x88\xd2\xae\xa9`\xed\ +\xed\x92\x0c}\x0b\xe1t\xe0\x98\x14\xc2\x14\x85\xb5jL\x92\x1e\xeb\xf3\xea\xa4\ +\x97\x05<\xf4\xc6\xf6\xcd~\x17\xeb\x7f\xe1\xc5c\xe1\xa7w\x12\xe9A\xef\xb0\ +\xa6r&i\xa3\xf1\xceo\x08\xbfB\xb2\xb2\x1f\x18\xcck\x03\x1a\xc7\x7f\x04\xbc\ +\xf5R\xbb\xab\xda\x14\x10\xae?}\x81\xba\x05\x87\xf1\x8c\xa5\xdd\xd2Y\x99\xeb\ +\xd9E\xc9\xcf2\xa0c\xbeEn\x1bEj\x07q\x06\xb0-Kq3\x0f\x94\x0by\xd8\x9a\x9c\ +\xdd\xab\xb4I~\x9f4\ro"\x85\xa3hF+\\fv\xd5\xe8\xc3\xednz<\xab\xfc\xac\xa0\ +\x15\xe1\xc50g\x9cz\x88\x04(hL^u]\xf3\xf3\x96\xfb\xeeP\xb8\xfb\xfe\x97\xa5\ +\xd7\xd9\xe5\x9a\xfe\xd6\x161~\x8b\x0cE\xaf\xcd\xfcg\x9e\xecJ\x1a\x9b\xc4\ +\xeeDJ\xce\xbb\xbc>(/\x83\xd2\x01u\xebD\x0c\x13\xb9B(\xa3W\x8f{\\W\xcb\xc5\ +\x1e`\xc6Vjg\xca\x8e\xad\xcd&\xe6\xd4a\xaaI\x19a9\xbc\xf3N\x16\x8a\x1f \xdf\ +\x08~\xc4\xf7@h\xe1O\xa5*\xcf\xd0\xa7R7k\x93ySuNE\x7f-eDT&\xc3\xcab\xaaX\t\ +\xdf\xe7\xd4\xe4g\xc6\xf1n\xc5\xa5*\xd2\xdb\xd7K\xf9gz\x8f\x9a~1\x0f\xe1\xf1\ +\xf2\xfa\x1e\x91yab\xab\x1b\x15\xb33W\'\xeb\xaax\xc8:\xac\x19L\x97\nD\xa0\ +\xbax1\x94\x1e\xf1\x8b\xfbvV\xb0_\xc4[\xbbs_}\x19\x82\x9a7\xa4\xb00\x8f\x1d\ +\xbd{\x87\xfb\xcc\xaa\xb9\xbc\xc3\x97{\xa6:\x7f\xeeSpv\xe4\x93\xd7\x03\x9a\ +\xf8\xe5\x1d\x11\x9d;\xab\xc7^\xbc*\xf8\xe1O\xab\xc1\xea\xe9\xb7\xe0Q\t{$\ +\xbf\xbc1B\x00%\xa8\xab\x13\xef\xe26\xd5\xda\x14\xfe\xee\xdc9+P\xae\x91\x9dU\ +@\x03\x02\'\xe0\xfd\xa4\xa8\x92\xcb\x95t\xe1\x0e\xdfO+=b\xa1\xb3E\x81\xf1\ +\x00((\xa7vm\xae\x96\x1d\xf28?`\x00\xa0\xb2\x9e\x18\x06fyj\xc2:3\x14P\x9eB\ +\xdee\xc4S\xb9:\x11\x8a\x94\xca\xfbU\x9f\x08"\x8c\xba\xaeYY\xdc\x93\x1b\xc5\ +\xd4\xd5\xae\x0fs\xc4\xd7I*\xb4B\x065\xfd\xaa\x9a\xe2\xfbR\xef\x18z\xe3\xc6\ +\xe67\xaa\x91\xc4\xd5\x88{F5\x1a\xbf\xa2Q\x03o3\xf3\x03\xe8\xfa\xe2_T\xe0\ +\xce\xfe\xda\xbf\xe0V\n\xfcDXV\xa3\xf3M\x96z\xde\x1f\xe1\x9cq\x9e\x91\xfak\ +\x1e\xcd,\xfa2\xf0\x89\x92\xfa@\r\rZ]\xcf\xc3\xcf+ZH!y\x15f\x95\xb3\xaa\xc1\ +\x1cn~~\xd0\xf7\xb7$\xa7#\xf5\x19QL\x87\xc9\xb5\xc9RZ\x8e\x19Fp\x9b\xf2wR|\ +\x9cw\xbbdQ)\xb8\xb4mZ\xe5\xb9\x05\x9b\xc9\xf8\xee\xe3\x1b\x194\xe0q\x80\xf0\ +\xfc9\xc1 I\x008\xc6\xea\x0e\x99\x15H\x82<\xa5`\xcc\xa07H\xf3\x16\x9a\xc5\ +\xdb\xa3\x05\x1e\x9e\xebFy\xcc\xe8U\xc1%\x8d\xd3\xe5\xf8G\x1cq\x94Q\x9f\xcf;\ +\xc8\xa2\xc3\xfa\xc5U\xa9G1\xefn\xbc\x0f\xca\x8e_O[\xb7\x9c\xdc\x87\xa3(\x01\ +\xf9\xb3\xd5\xc3\nY\xd7GFj/ :\xf4\x1f\xad\xd0\x8d\x12\xac\xff\xddvT\xcc\xacn\ +\xae\xa7\x9a\x01\xe7O\x825\xdeu\x15\xbf\xcd\xb2\xf7\xb28\x90 \xd4H\xac\xcefO\ +^\xc8\x1e\xc9\x1f\x84\x87g\x9f\xf5\x15\x13\x1a\x96\x94[&\xdb\x81\xa6O\x11\ +\x0e\xc1\x85/\x93\xbdR\xb6\x14\x00\xa8\xde.Q=!\x97\xb0\x03\x81Y\xfei\xcc\xe7\ +\x0c\xdc\xc3;\xf0aZ\xcat\xa9\xadH\x01\xf50+\xea\x15\xa0\x1a\xdd\xf8\xa5\x02"\ +)\xdd\xf6\xb3K\x8d\xdf\x84\xb7\xf2\xd6\x8eN\xdbX\x01\xb1\xe1\x8c\xbc\xa1\x83\ +\xb1\x97\xe5\x89\xbf:\xf9#iO\x92\x97\xbdE^[+\xbb\x8d\xf5\xd2\xcc^\xd1\x9a\ +\x1cL\rsS\xdd\xbe4\xab\xd3\x16\xa5\x8e\xbb(\r24T\x882\xaa\x9e\xa5^tH\xf1e\ +\xfe\n\xe0\xca\xbe\xd4\xd6\xd6\xe4\xb5\xe3\x9b\xc1\xec?+\xe3\xaa\xd4;\x92\ +\x85/\xf6\xcf\xa8\xa5\xa2f]L@\xdc**;\x82\x1a\x02\x87\x9f&sM\xfch~\xe2\xb9\ +\xb7\x13u\xed&lIR\xfew/\x00\x97\xf5U\xdb\xfd\xc9\x1b\xc8_\x1c\x14\x8f*#^<`\ +\xb8\x8f\x19[0\xb9\xad\xe6d\xfad\x9a\x84$\xed\xefJ\xe2RP9s +\xe8\x15\xaeq\ +\xbc\x98\xbf\x99\xd2\x01\xe9|sU\x9b\x05\xf4\xfc\xbe\x8e\x9b\xf0\x9d\xa6,\xc0\ +.\x8clU\xd5w\xd4&\x16\x01\x1a{\x08\xc8\xe5\x93\xd6\x85\xb3\xeb.Wj$\xba`\xf3#\ +\x06\xeavr\x8d6#J\x1fI\xfe\x88\xccHr\x13\xadVo\xab)1\xe6\x96\x8f\xad\x11U\ +\x16=jR\xb0\xa2\x85n\x8apd\xe4\x8a\xa3JVEA\xb1\x0e\x86\xa9S&\x1fn\xc9\xdd\ +\xfb\x1a]`\x0b\xd2\x9f7a\xb4I\tTO\xe9\xd9\x00y\xb6\xbdY\xbd{\xa0\x1e~\xa8\nn\ +y\x05s\xea\x80\xe1\xc2i\xfa\x88L+\xb9\x89k\xfb\x1eI\xe3jC]*5\tn\x82\x05\xf4\ +\xaf*pN\xc1\xf6\x83\xc8U\x92|\x11\x870V\xa3\xcc\x125\xa5\xa0u\xb9\x999_n\xf7\ +\xbb\x98i\x0b7\x87\xab?\xa2\x0f7\xb1\xf5\xa9\xf4\x93r\x8bJ\x8c\xbezi\x85\xd6\ +S\xb1\xb8\xc6\x9c\x90v6\xc9\x98^3Yn\x97o\\l\xd1\x0e\xa4d\xabW\xfcm*\x13\xcf<\ +\x15\xa3\xfd6\x0f6No{R\t[r\xef\x91w\x08\x9az\x8b\x9fPg\xaf\x02B\xb8\xd9\xc8\ +\xfbp\xe0@\xe3\xfe\xf9\xed\xf8\xc6\xbcg\xb5\'\xffM$\x1e\xfd\xc1\xe7\xb9\xdd\ +\xa8\xb1\xb3h\x11\x1a\xd3\xbc\xd6_\xf3y\xab\xdc\xda\ +\xe9\x8f\x86\x9a-C\xf4\x0e\x9fv\xc8\xd0\x0c8\xcb\x99k\xb3\xe9\xbd\xb5\xcd\ +\x87r<"\xd2\xda<\x8a\xf2\xb5o\xbf\x87\xc75u\x10DN\xfdr\xf4\x88!QK_?\xc4``\ +\x8e\xe5\xb1\xb4\xff\xbe\x04\x16\xfa-\x96\x1dV\x94\x94\x96\xfa\x18|\xb2\xf4\ +\xb221).-\xe5-x\xe5o\xd7\x90*\xc1\x12(I`\xe2\xb9"]\xff\x0e\xfe\x8c\xb9\xfe@4\ +\x16\x8ai\x81\xb7\xd4I\n\xb4\xc2\xa7\x02\xba<\xb7b\xb7>\n\xeb\x00\xf6gK\xe9\ +\x94\x871\x89w\x12{\xab\x9f\xe9\xfcc\x1bz\x12\x9cdK\xea\xcb\xad\x89\xfd\xc2~\ +*\x9dBe\xcfc\xe9\xc3\x1d\x8fTm\x90\x02\x0c@\xca\x07\xa7Q\xde\x96\xca\xb8\x97\ +n\xc8|\xf6[\xa09\xc0\xe9s\xc4\x8d\xb8\xc2\xbf\xf65\xeba\xd4+Eo\x0c\x8d\x1d\ +\xb5r\xdf\xfd\xa7\xcf\xbb\x8f\xa6\xd1\x1f[[\xc9\xf3 gF\x9b\xbd\x83$\xae\xddA\ +U\xdc,g\xae\xbb\xb6\xc7O\t\x14\xe9a\x15M\xdcNA\x88ty\xefw\xaf#\xd2\x85[*\xca\ +\xc2\xa2\xb6\xb5\x81\x80\xe9y\xf5j\xf7NL]K#U\xb2\xb7l\xe6\xa0-u^?\x91\t\x8e\ +\xf27U\xbe\xe7\x0f`\xfb~S\xb3\x94{Z>9\xbaRj{\x88\xd1){Uo\xdc\xb6C\x10}\x8d\ +\x05t\xa5Kf2\xc2\xbd\x11]\xf7f`\x8e1\xa9\x99\xc0\xa17\xbd\x10\x1b\xbaX\xb1\ +\xf5\xf0\xb8Q\x10.\x18\x95\xf4\x129\x8c\\\xcd\xa7\x7f`\xd7\xd4\x01G\xb5\xabr\ +50:MU\x95\xac1_\xae+\x87?\xb19\xadO\xfb9y6\x8c\xcc\x93i\x04\xe8\x90\xc1\xae\ +\xd7\x18\x8c7P\xffQ3\x97Y\xfc\xf1r\x97CB\xe2,WYK\x95\x89\xc95\x9b\xa9\xdc\ +\xad\xf4(h\xb8a|\xe4\xca\x948\x13P\xabt\xe1\xdc\x10\x82\x9ci\xb4\x0b\xb1@\ +\x86\xc6CJl9\x9c\xca\x11\xfb\x12J\x18W}\xc8\xf0;\x87\xe8\xa4\x8d\xf82\xb5z\ +\xe2\xe21]\xe3s\xc5C\x9dU\x7f\xecf\xe41\xa6\xf1\xea\xe5\xda\xce\x08D\xab\xbc\ + L\x91\xd6\x9a\xf0\xa2\xcc\xe4\xf9\xc8\xaf\xe7A\x8c\x9dw}C0\x87\xef\xd0"\xdd\ +\xbezY\xb2\xca\xa9\xd1\xbf\xd5\xee\x83Y\xaa\xa0\\\x85n\x15\xd0g\xdb;e\xd0n6\ +\xdb\x18\xe1\'y\t7\xee\xd7\xf4\xe6\\\xff~a\xff\x90\xdb\xb5\xab\xdf\x07J\r7\ +\xcbr\t-@\x9e=3\x01\xe83\xa3p&\xb3\xf8.\xdd\xfa\x9f=\xcb\xf1\xcb\xed\x1b\xb9\ +\xd7\x08\xdd\xe1:\xe2\x816\xec\x00!\x7f\x11\x19}j\xde\x94\xb0\xf5=h\xffjnS\ +\xb8g\x17\x1aZ:\xf1\x15\xfdE@\'\xbd^/\x9aC\x95\x9b0\x1e\xff\xbb\xd8k\xc6f\ +\xe1b\xe5\x14s\x15\xc8\x87)X"x\xf9v\x8dDt\xa1\xdb\xf5\xef\x93\xaax{\x8e\x9e\ +\xd9\xd9\xa5\xca\xf7U\x80+\xa2\xe9\xfa\xf7n\xac\x13\xf0\x9e\xb8\xc6\x8c\xf3b\ +m7\xc0Xt\xc9d|M\xa1\xd4I\xff\x9d\xdd8\xee\x9f\xf8W\xe5\x15\xba\xe8\xd0\xb9\ +\xcd\x89\x9b\xa3*\xcd3$\xcd\x1c\x1b\x0f3g\x7f~c\x8c\xcfI.\xd9t\xb5i\xa3,\xa5\ +*8\x9b\x02\x83n3^;\xdf\xec\xd1\xc5\xdc\xffQC\xd3\xd3Z\x8dH\xadvt\x1c\xb9\xea\ +\x8d\xcc\xa7\xd0\xe2\xc3\x15%%\xf3\xf7\xd7\xc48p8!\x8f_\x85\x9a\x9f\x8av\xaa\ +\x1e~\xde\xae0k\xc5\xf4]\xb7\xb2@\x0c\x07(\xe47\xb8yl\xf3\xac\xe4RM\xc1<\x1c\ +",\x10\xf9\x8c\xbb\xc8\x93tZ\x9e\xd4\xa5\xdfY\xc1\xc3\xb0\x96\x80-@/s\xf7\ +\xaeWN\xfa\xbdbtz\x91\xd5\xee\xfbi\xa8)V/\xa1vG%\xb8\xa6\xbc\xae\n\xf4\x81\ +\xf1\x13s\x11\xf3\xea(hP&;T\xa2\xac\xd6\xe8\xc7\xb0y]\xedtCmR\xe3\x97t\x03\ +\x87J\xad\xd5\xef[3x\xcb\xe0[\x86\x91j\x92Ee\x1d\x85SO\xb6\xe1\xa6\xf4\xac\ +\xa7r9_\x9f\xfa;\xf5Z\xcf\xb1>5y\xef.\xebe\xc1\x96\x9e\x193\xcb\x08\xaf\x0e\ +\xdbtl\xbak\xb38\xfd\xaa1\xefH\xd0\x9d\xbb\xb7\x83\x10\xee.\xfc\xfel\xc0\x9e\ +\x83\xfc[\x9b%\xd2-_\xe9V\xe2\xdcd\xbb9\xecP\x10\xad\xcd\x14 \r\xed\x0f}8\t\ +\xf9\xe4X\x84\xc0\x9b"D\x00rl\xf6\xe5\xd4\x05,\xe0t\xaf\xe2DI\x81\x18\xb5\ +\xab\xa5_\xa3\xe1\xd4c\x0c\x13wonS\xec\x80\xf3S\x96\x82\xb1\xc1\xeb\xfd5\xbf\ +\xb3\x8f\xa6\xcc\x0b=L\xb5\xa7y\x7f\xbe{8Vg\x1bpSD\xe7!\x0bh<\xabl7J\xe4@*\ +\xb3\xa1B\xdb\x9b\xaa\x81\xf9\xfeq.\x7f3MI\x8b\x90D\xbf\xa5\xa5CK\xd5\xe18\ +\xb3\xa9\xad\xba\xcb\xeb\x89\x0c\xb8\x86\x023\xd8\xa4\xbe\xe1]\x92D??T\xd7\ +\xc9r\x8f:\xdcN\xfb\xc5\xdb\xa7~\xe9\x1c[\x8e\x1c\xe4\xce\xf7\\\x14\xc0\xa1\ +\x0b\x16\xf24y\xec`f4YP\x11\xef"\xee\xab\xa8;\xc0\xee\xa5Ov\x88\xb3\xac\xdfm\ +^\xad\x13\xd6\x9f\xfc\x12{\xc4W\xbd\xdc\xf6\xc25\xd4\xb2\xb2|0"~I\xb9X|}\xc5\ +\xd8#\xf5\x99\x89\xb4\x91\x11\x02?\xa91G\x1e\xbf\xbb\xf8\xb3o\x15\xc6\x17uPB\ +\xdf\xa1\x7f/\x9c\x120\xf2a\xe0\xd3+2\xea6\xf3]j\xdc\xf0T\ +\xe4\xca.\xbe\xe2\xd4r\xd2\x1e\xd3Z\x99\xd6\x08w6f\xb4b s\xc2E\xc4\x9c\xdd\ +\xbb\xf6\xe7V\xee\x87Qm\x01\x1a\xcd\xaf7\xb7-\x03"N$j$\x8c\xd8\xff\\\x19\r\ +\x9fGo-\x04\xe4\xd6\xab\xd3>x\xca\x8e\x99\xd2\xfa\xc0\x08\x90\xdd&lU\xb9b\ +\xc4\xc7o-Y\x10p\x8a\xe2b\xf7X2(\x96X\x14^\xea\xe5@,\n/\x97\xeb\xb2\xe6\xee\ +\xbf#\r\xed\xb9-\xfa2tC\xb0E\xdf\x03e\xba\xf0\xa1Jb\xb4\xba\x95\x1e\xbc\xa4\ +\xa8\xace\xc6\xd8)S\x96h\xe9k6\xbe=\xcf^\xb4\xf0\xca\x96Pz\x82\xfb\xc65\xefl\ +vh>\x18\xaf\x86\x12C\xeabF\xb9\xdb\xfbh \xda\x1fW\x83\r\xceZ\x8e\xaa\xe7\x89\ +{\xb40J\xabN5\x1d\xa6\x8d\xe0\xfe\x08\x88\x9f\x83\xee\xda\x0eR\xbcO\xadE\x1f\ +\xd7kj\xe2w1\x97\x83Wk\xdbmTM\x1d#\x1e\xdb\xc8\x17\x8e\xad\x87\x1d\xf9M6\xf1\ +6\x07\xd2XN[Oe\xf9qY\xef\xb0\xd7\'\t\xe8\x8c\xaa5\xc2\x8b\xdbTu\xd2\xbf\xf1\ +\x1f\x10^\xd3\xf9\x167m\xa8\xf5\xd7\xf4\x10c\xb0\x7fCU\x15\xb1\x84U\x88\xc5\ +\xb34}\xec\x146r\xde;.|\xfe\xda\x83\x8cx\x87\xe9&\xa9d\xd3i\xc0\xdey\x84Z\ +\xee\xb0\xbf\xe0\xecR\xc5\xaf\xd1\x83L\x06i\xbb\xd6\xce\xfe\x9d\xf0\xce\x91+\ +5H|\xd9\xd3X\x97C~@\x17\x04\xb3\x8c\x80\xc4[\xf4\xd9\xe1\xefVG*C\x11\x10?\ +\x9b\xa9\x0fG\\\x1ar\xfe6\xde\xc9j\xf1w\xc8oz\x82Y\x0eO\x8e\xb6\x1c\xf5"\xf5\ +V\xbf\x87?P\xe7k5,\x94\r\xe7s\xe4\x8b\xc6\xfe]u{\xf2qA\xdd\x14\xff[0C\xf7Y$\ +\n\xedc\x19\xbc(\xc1R\xff\x01\xa7\x91\xf5+)*b\x1ep\x00\xc3S6\xa7\xa2\xa3E\ +\x0bW9\xa3\x99\x14q?6\xce\xa2\x0e\x83\xf3\xe4[\xce\x96pAR\x91\x1fB\xef\xf5@\ +\xe8\xa0\x86\x99.m5\xb3\xdf\xc4\xf8\xfa\xbe\xf9-\x0e\xdc\xadh\x13\xa1&N\x17\ +\xda\x16\xa9\r\xad"\x0e\xabC\xcdY\xbe\x07\x07\xe9\xe4,|\x9f\xda\x0bS\xc9:\ +\x8a\x90\xbc\xd1\x1b\xa3\xd7E\x9cL\xe9\xa0\xb6:\xba\x8d;\xdcR\xcd\x90\xed\ +\x98\xf3\xfd\x14l21\x04>~\xfa\xeb=\x0f$\xf5\'Ij-\xce\xcfg\xd4\x87\xae\xefE\ +\x85\xd8\x13\xef^Q\xca\x87\x8e\xef\x98l\xe3r\xda\xe2\xd9\xad\t\xa5\xa5+\xa5\ +\xa5t\x84F\xc3\x1f\xc9ya\x9f+e+\xca\xab\x82]\x16\xacY\xbe\x9fK\x0f\xbf\xec9\ +\xe8\xf5\xcf\x9e\x1b\x0e\xbc\x88J\xfa<\xe5Z\xd0/\x00\x7f\xbe\xd4\x19\xc2\xdd\ +\xdb\xe2%\xbcNT\x81\xe1Q_\xa5W\x16>N\xf5\x05\xba\xdeP\x7fR\xce\xfb%\x98#.\ +\xbau\xbbFB\xc9\xb6\xa9\x9e\t\x8d\x12#o\xfb>\xbf\xfa[\xe98\x18\x908C6!\x99\ +\xbf \xc1\xf5\x85\x85q\x0e\xc3S\x9c_"\xa62\x83\xb2s\xac\xb4\xd9\x14\x90\xe2\ +\xdbI\xc7\x07\xdaMF\xa0\x88\xb7\xdea%\x05\r\xeb\x9f?\x08\x7f\xa5\xf5\xf2\xe2\ +\xe68\xf8\xe1\xc7\x13\x03\xdd\xf5\xa0\xb8z#)\x80\xcc\xae\x88)\x19&_>6\x10\ +\xf1+d^\xe0\xaf\xb2\x17\xaf]\xef\xb8cR\x05*\xd8\xac\x84\x13\x18L%z\xfd\x13X\ +\x1b\xdf9lJ\x1e\xaa\x91y\x98\x89G\x1b;\xdc\xe6\xeb\x03j\xd5\x92\xf3\xaf\x9a\ +\xd6A\xd7\xf5\xd7\x1f\x15\x18EK(\xda\xf51fT\xad-oGBTI\xc7\xbbi\x89\xbbwp\xc2\ +\xa6\xde\xb7\xdc\xcfBg\x1cp\xba\x19,\xb8\xe0\x85\xcf\xb5\x14A\xd97\xa5c\xb3Q\ +\r\x05T\x00W\xf8\xc1\xcc\xb6\xceb\xd2.c\x19\xb0\xbc%\xab\xe8\x9d2\xe2\x10\r\ +\x06]\xb2\xcetl\xa3\xd1\xb0u^*\xad\x9c\xeaaM\x9aq\xf6IR\xbdm\xbf\x1c\xa7qp\ +\xb8^\xc8\xd9\xfb\x84\xd2\xea\xc5\xdb\x81\xef\xde]\xad$y\x1c\x97N=\tI|\x87]\ +\xf6\xc3\x0fo^p`9\xa2\x86O?\xaf\x04/\x84vB\x8d\x9c>-\x14\xb6<\xeaI\xaa j\x1b\ +\xe9!\xd4\x0b\xc7\xdc\x96\n\x7f(\xc7\x96\x0b\n\xe0K\x11\xa0C\xd9n\xef\xe7K\ +\x07\xe5!e+n\xb3;W\xbf\xeeN\x83\xaa}\xdd\x97\x89\x11\x91M\x11\xcc\x03\xfac\ +\xf9\xd4\xda\x16\x88\xbf\xb1\xb2/\xfd\xaf\xbbY\xb9\xb3\x00\xbe\x8cB]aY\xb9b/\ +VQ\xdc\xa1\x1f\x1f\x06\xf4fK\xce\xb0\xc9\x8d\x95\xdc\xe3\x8ag\x88\x19\xcfc\ +\xa3\xc2\x86\xb8\xd6J\xa3\xb4\xfa\xaf\xd2!-\x86l\xa0\xd7\x16\x8a\x03%\x0b\ +\xa8\xf9\xfd\\\xaeGk\x8d\x0b\xe6P\xd9 \x07\xdc\x8b^W\x9ex~\xca\x14\x13\xaac\ +\x1b\x83\xf2\xbb\x12@`B,ZV5\xf6\xd4\x0c\xa9\x8bn%\xfdpC\x1e!}n\xc3\x17;\xf5?\ +\xe6VX]z8X\xcb^#}\xcb\xa4\xbf\n\xf4\xd7\x18wa\x95I\xbeA\xc5\x0es\xc3\x13M\ +\x93\x89\x1eO\x02?\xa5\xed\xa6\x0f\xd2\xeb\xdd\x9a\xf8\x06\xf4\x86\xc2\x99,\ +\xb4\x8e\x13^\x81\xb2\x05M\xa9\xc9\x97\x04\xfb\x81\xc0\x03\xfa~\x1cFC\rq\xa8\ +\xe1\xca\xd0\xe3\xa7G!\xf3X9\xe5\xd4L\x0cZ=\xcc\xa1\x7f\xe7\x85)\xdb\xc4J,\ +\xf6\xf7\x8d"oi\x9cF\xe5y\xcb\x92\xf2\xf8(\xa2F\xc2\xcaP8\x1cW\x08UC\xc4\xd7\ +L\xb9\xdd\x19\xc2\xe3\xf9?\x1b.\xd7Hp\x9d\x1a\xa7\x06T\xe4\x89\xa1\xb2q\x7fE\ +\xd7\x15\x04#\x86\x9e\x9a\xd43\x17\xbd6\x8d\x19\xbcG\x98\xa9p\xc9T\xc2\x91O\ +\x99g3\xd9H*.\x00\x04U}\xd0\xab\x0eS\xbd\x17\xa0\x93\x8e\x9cz9\x1a!\xb7Z\xaf\ +^\xee\x8b\x7f\xbeY\xe0\x0e\x180s\x9e\xdc\x1d\\t\xea\x82\xed\x8b\x858A\xcf\ +\xa1\x9fp\xc7V\x818\xc5\xc2{\x85)\xde2\x84\x83\xf0\x9e\xcc\xa8\xe1O\xc3\\d\ +\x0f\\\xa4\x05\x80\xce\xb7\xe6\x88\xc8V$\xbc\xb0\xbd\xd9\xfd&\xda\xb2\xd8\ +\xc6\x04\x08\x1d\x9b\xc4P\xf3\xf4|\xe7?\xdb\xbb\x8d\r\xb2\x97\xb1\x8dV\xd1\x86\xdf\x0e\xf6\xd4\ +\x1c\xab\xebY\xcf\x84b\xca\x85m\x9e`\x9e\xe5\xfd\xeb\xf6=u\xfbc)\x95V\x05\xdb\xaa\xf2n{\xbe\x96\xcd2\xe0\xe2k\x15\xd6\tQW\x04\x81\ +\xd9\xd0_\x8d\x02\xde\xf5\xf0`\xfe\xa9l+\\\xf4\xcb\xd04\xca|X\x9e#\x9c-T\x12\ +_\xc7\xfb\xde\xbf\x17hbB\x8b\x9d?)9\x1eD\x91\xdf1vp\xcc$\xdbJ\xcd\xcd\xd4\ +\xda\xcf\x0c[b)X_\xd9\x91\xb3\x89Z\r\xaeY\x19\xad\n\x96=\xb8\x83j\x8d\x17\ +\x83\xa7\x1cikJ\x9dG\xaa\x03,\xc5\x02<\x14b1\x89;x.\xd2K\xa9\'\x88]\n\x98\rT\ +_\x06\x12Q\xcf!\xa1\x02\xf5`\x96\x86\xd6\xcd\x9cM=\x16%F=:\x15\xd8^`V\x19_Z\ +\x9aR\xf2\xec\xba\x12\xfd\x80\xa6\x9f\xc8\x13\xfd8y\'\x0b\xaf\xb9o\\\x0f\xa7\ +\x02\xf7\xac\xf0\x18\xa0WW[\nt\xf5\x1e\x13\x0e\x0b\x172g\xb3\x15K\xe3_\xcc8\ +\x8ex\x05`\x7f}\xe7\xe3\xe1\x9e\x9a\xdb\\\xb1\xe94U\xa7\xc3\xbc\x81\xd59\xd6\ +\xb4K\xc8\xe8\x87\x06\xea0\x82\xde\xfc\xd58c\x03\x1f}\x94\xea\xf0\xb5v\xfcf\ +\xf1\xa26\x04\x02\x86\xd2C+\xbfy\x18\xfb0\x1eD\x84\xf1q&\x91\x9dhv\x1e\xa9\ +\x9dq \x85p\xd3\xbdV\xce\xaf4e\x12\xeb\xd2\xb6\x16\xfc\xc6\xf2\xa1n\x7f4\x7f\ +\xee\xdff\xc7:" \n\x96\x16\xeb\x8d\x0bD\xf5\xa37#\xef\xbc\x0e\xdc\x1cB#\xa6Q\ +b\x1bg\xbd\xe5\xb3\x1c\xa5:\x7f\x19\xe2p\x8d\xc6\x7f*K\xe1\xcbf\xad\n\xa2\ +\xae\x15\x7fx^\x19bp{\x93RkE\xb1[\xcb\xf9e\x9f\x85\x1eb\xa31\xae\x8a\xd7\xad\ +\xd1\x97\x17\x03\x1dE\xd5\xad\xb9\xa5)\x93\x9f+\xf6dI\x0fP\xf1`\x90[\x92u\ +\x86\x15+zc\xaf\xe4\xfa\xdd\xdbq\xde\xe1\x803\xcd\xe8\xac\xa2y\xfbC y=m]\x8c\ +\xc8@\x03\xf9Z\xe4\xe5\xb8\xd7\xe6\xc0\xd1\xc2\x87\xd5\xee1\xbb\xd1\x16\xf6\ +\xd3uT\xd51\xb1\x19J\xaf\xe3\xbe\r\xbd\xeb_\xdb^I7\xe6)U\xd6P\xe6[ (\x11\x9a\ +\x80\xed\xee\xa1E\xcc\x0c\xed\xb1^\\\xb4\x06\xd7\xfb;|\xe1\xcdA\xc3-*\xa3\'\ +\xb5\xf3t\x9c4\xc2j\xdb\xd3\xe8\xb2\xbd\xa5\x92\xa8\xa5\x89\xf3\xcd\x1c]\xaf\ +\xdb\xfa\x07\xb3C\x8f\xbe\xc2/D\xd6\xfd\xbcx\xcb\xafc\xf0]\xce<\xd5\xdf\xe7\ +\xd0\xf1\x8d\x98r\xa0\xda\x8f\x8c\xc4;u-X\x92Fo\xf4v.^4\x85\xf9\xeb\x1cM\xbe\ +\x99\xb0t\xfc`\x8a\xd9\t\xff^\xf7\x9a\xf6d\xadO\xb8\x86\xb0g\x9c8R\xf7\xa3|;\ +\x15\x97k}\xc4@\x96+K+\x9a\xba\x04\x1eD\x91\xfd\xc1\xa5~\xcb\xa2\xb6:|\xcf\x8dz\ +\x0c\x12\x19\x0b*\xa1\xac\xcd\xa9\x05\x97S\x1c\xca^\xd2\xba\xeeO|3\xf8.Rb#\ +\xb3\x89\rH\xa1\xf4\x17\x12cN\xde\xfb\xa6\xbd1\xe3\xc8g\xc4\xdb\xfe>\xad\x80\ +p\xd3 \xea`\x0f\x93+z\xde\xc3\x87{e\xe8\xb9\xe0\x17I{\xd0*y([y\x16P\xed\x89\ +\xe6\xd2\x1fV\x89\xea$[t\xc7MzvX\xd7\xbd0\xa5\xbbu\xa6i\x13k\xdc\x96\x1f\xd4\ +\x01\xd9b\xeb\xc8\x02\x06t\x11\xf8#\x8f\x0f\xd7\xdc\x1c^-\xc4\x10^\xcf\x8a.z\ +S\xb8^\xfcp\xbb:\xb9p2\xc4\xee.6\x8a_~\xdb\xbf\xc0\xad\xaf0\xdb\x9bF\xdfC\ +\xea\x9c\xcf\x8a\x8f\x14\xcc\x82\x9d\x88\xb7\x87\xc6n\x1dw"Eq\xa9\x13+\xc0@U\ +\xb7V\x85\x89\xad"\x8f\xaam\x8c,l=\xdf\xca\x15\x1a\xc7\x14\xd8%]r\x98s\x9e\ +\xd5~\xc6F\xc4\xdd\xed\xf5\x86\xe1\r\xd3\x8fU#\x14\xb8\xca\xe1s\xc0\xce"\xe3\ +\xc0\x1a\xef\xf0\xbbw\xc2\xa6\xb0>\x06\xdc\xee\xe2\x0f\xb3W\xcb$6x\x1c\xc1{\ +\x17\xd3\x8a\xa3\xc8\x88~\x86\x9e\xffN.]-\x90\xd0um\xba1*\xbfE|jJ\xee\x15\ +\xad\xe9\xcf\xf9\x00\xccb\xbf\xbf\xea\xa2\x93\xde~7\xa0x\xd5j\x9a\xe9wV\xc8\ +\xf0Q\xdd\xac\xcb\xcc\x10\r\xb2P`\x08\xefE\x17r\xed\xf2\xd4E+\xbc\x03\xea\ +\x13\x19\xb1K\x19ty\x8e\xe2\xa9\x89\xc9=\n\xc2\x83\xc2\xcb\x05\x88\x92\x17?\x15\xa5\x1f\x93\xff\ +\xb9\xff\xf36\x1c\xf5\x12\xe6*\x00G-\xf3M\xdf\xfc\xad\x14\x9cA!\xfa\x89\xb9\ +\xe8\xf2\x94P\x1e\x8b"I\xc6\xa0\xf3p@\xfdH\xcc\xbe\xe3\xfdY\x04\xe0\x98\xc9r\ +y!\xc6&\xd7\x1c\xb1\x1c\x83\x9a3\x14\xffm\x06,6\x1a\xaa\x96,\x908\x91t\xb4\ +\x1f\xce\xa4Hz\r\xe1\xac\x9d\xa1i\xb4\xcdy(\xab\xa1}$\'\x84\xf3b\xff\xc3wq\ +\xb1\x19@\xbe\x9e\xd9\xad\x05\xbdr\xd2\x9a:\xe3i\xca\x1cUZj\x8fQ\x04XG\x1eU\ +\x88;\xc0\xde\x11}\xc4U}\xf6\xab?\xe0\xb8KyR\xa2\xa7\xfd\xa0\xf7\x9d\x16g\ +\x91T\x14\xfe\xf3N\x17\xa7\xc4\x1c9\x05\xa1[\xa4i\xa0Rl\x9bz\xadQ\x03\xe9/\ +\xe2\x15\x1d\xbd\xf4\x9a6\xaf\xba\x96\t\xe8\xb7kP\x0c\xfa\xcd\x99\x13\xd7\ +\xf5\xe4\xe5\xcb\x8d\xa6\x06\xeab\xaaO\xb6j\xff\x89\x03\xda6m\x05r\x1b\xaa\ +\xebc\xc3^Zz\x14.V^u\x07\xb8\xfc;T\x7f\xec\xb5\xb0\x0e6\xbe\xd3\xdcW\xa2?\n\ +\x90\x906\x8e\x8e\xd8\xfb\xfe\xac)\x8f\xc6\x81\xc0\xd8N\xd4=\x93t\x84\xd4yx\ +\xca\x7f\xa5\xa5\xf3\xe5\x16\xa2\x8c\xea\xb8\xc9p\xa7\xe7\xd2\xa8K\xfd`9\xab\ +g\x18\xf0\xfa\x19g\xca\x11\x97\xc7\xa0\x90\xbd\xcaHvEm\xc8\xea\x16\xf8\xaa\ +\xa9\xc4sb\xd6\xff?\xd0f^\xc1\x9a\xc7\xe3dq\xb9Y30e\xe9\x0bG\xcf+Y$K>\xa8\r\ +\xc2j^\x92\xb0\x15H\xf6 HG\x18"\xd3\n\xf7[\x94/\xec\x9c\xd6V\x94\xd7\xe7J)\ +\xbek\x80\xf7\xb6`5U\x04\x8a\xe1\xa7\xfc\xadL\x07WE\xe0{\xfeq\xfc7\xabl\xcf\ +\xf1h\xab\xf6\xd4\x0cp\x87\\\x83q\x13(l\x8d{Yl\xd5\x95\xbf\xa2a\xbf\x86\x1cd\ +\x16\xa2%\xfa)\xa55\xddo\xbdY\r\xaeJ\xdb\\\xe6\x1b\xbfia\xcc\xde\x0c/\xdb4>P\ +XTbtC\xa6\x16&|\x18\x91.t\xfb_??\x0c\x0b\x97G\xf5\xe0\xd5\xca\x84\xae\xbb!+R\ +\x8a\xafx\xb0T\xb7\xec&\xb0_\xcf\x96\xdd\xb4\x96E\xf4\xbb\x9cm\xc4Q6t\x08\ +\xb4\xc2e\xcfd\x81\xbcD\xfc\x9a\xd5\xf2\x94\xd6#\x81h?\xb0@\xdc~\x9b\xfc\xc3\ +\x95\x02f\x06J\x17\x16\xfes\xa4\x04\xfeRJ=\x02!\x83i\xf3\xa4\x14\x97\x94\xc2\ +k$\xa6\x9e\x8d\xbf\x84\xb1\xa0\xb1@\x95\xd2\xbb\xba\xcaM\xe9\xe8\x97\x1c\x01\ +!\xa56\x94\x17RdB\xcf\xeao\xc3\xa7\xaf\x7f\xa7W\xfd\x0c\xd1\xbf\xbb\x15\xd9\ +\xdcYV_\xe5\xcbM\x81\x1f\xd6b {\x8d.h\xa5\x8f\x1f\xb9\nd\x14%iF\xbc\xf3\xd6\ +\xb5\x0f\x85\xb7\xfe\xee\xdcY\xfc\xf2\xb5(\x8f\xc8\x01\xa8\xdb\x7fV\x93)\x87\ +V\x8e\x1e\xbf\x0b\xda:\xa1}\xcd=\x93\xaf\xa8d\xce4@\xdccD\x86\x7f\xad\xf4\ +\xc4i\xde^\x95\xcd1o\xce\x10\xbe(H\xcd$#fgW-\xed\xaf\xe8\xab\xc0\x8d\xeas\ +\xea/\xbfb\xf2=\x84\x95t\xf4/\xe75Wr\xa9\xfak\x1e\t\xb8G\xddGn\n+Q1\xd7c\xed\ +\x19\xb9b\xe5\xf5\x1d6\xb9\xf2\xf6\x86\x9e7\xf3\x81Y\x18\xad\xc92\x0cpI\x1b\ +\xbe\xdc]j2\xda\x8e\xb6\xe2p\xc1E\\\x901b\xbe?\n\xe4\xc9\x02\x80\xcc"\x8e\ +\x03i\xba\xd3\xd7\xcd!=\x9b\x1d\xf7O\xa5\x10\x8e\xc45\xe6\xbdpBK$!]z\xf9\xab\ +\x12\xb6h;eb`\xae\xb9\x12\xbd`\x8a\x1f\xc5]xC@D\x7f\x9au\xf9o)^{\x8c?a58\xc8\ +e\xc15\xc0\x8d\x18E\x85Q\x052\xdb\x9e\x17Yv{\x8c\xd2b:\x9e?hCs\xf7\xb6\xdd\ +\xf9\xabpR\x00\xdbO\xbeF\xf0UB\x085\xf6F#\x81\xbbs2\x19-"\xbd\xb1\xad\x95B-\ +\xfa%\xdf\xdc.w4\xd5\x01\xed\xf8\xef\xb4\xd5\x1ba\xa0!\x81\x9d\x82h\xfat\xeb\ +\x9b\xc3\xf2Pyu\x81)\xc6\xcb\xbd\xa4\xea\xefA-\xa8f\xe9\\\xb7YWq\x00*\xb59\ +\xe2\x8c\x89\xbe\x8f\xe4\x80\x80\xe5\xefK}\xd8\xe7%FO\x9b\x17\xc9f\x93\xa3\ +\x9cj7\xc0\xd0\xf3\x12%\xf6#\x02\xa27\xaeq\x85\x19m\xc8\x1fy3@q\xe0\x96\x93y\ +F\xa1N\x1f\xca\xd6p\x8a\xf7\n\xbe=\xa6"\xad\xe8\x1b|\x87\x08\x8c0"\xf3Hg\xda\ +\xf8 \xe9\x7f&\x97\x06+f\xc5;}\xb9\xc3\xb0\xf1\xadvvW\x07#\x9c\xab\xd2\xb6\ +\xf6\xde\x81t\x98\xb8{_\xa1{\x9f\xa5\xb4\x922\xa3\xd9\xc4\xe0E\xe7o\x94\x962\ +\x16\xcb\x98R\x16\xce\xd2\xf2\x1b\xdb\xd5a\xda\x8e3\xeag\xb2 \x8e\xb8\xdb\ +\xd0\x99\x16\x89i\xe3\xbakd\x0f\xf8mm\xca\xda:\x9f\xf9r\xc7\xffw\xe0\x08\x83\ +\x06PXLK\x9f\x81L\xf9&]\xba\xb0\x03j\x92I\xe2\xb9\xc7Gy\xfd\xdc\x9d\xf5\xbc\ +\x9f\xf6|BQ\xfc\xed\x1ah\x07\xe4\xc16\xae/\xf5\x0e\\\x9e\xeewe\xa1\xe6\x80M\ +\xa1\x8dy\xf7\xe4\x9d\xb1\xf5w\xcb\xcd\xb0\x84:I\x01\x1d\xa6\xd2\xe2c\x17\r-\ +0wJ1\'\x05\xf9~\xd3\xa7DK\x8a\xaa\x84rM\x89\xfe\x87A\x8c5/\xca\xd8~\x07\xf3\ +\x9e\xb4\xd2\r\xe1\xdds\xde\x13D\xca\x84^T\xf4\x92\x0c\xe1}\x0c\xe7\xeb\xd7\ +\xd8&\xd8\xf5\xa6U\x9c=5\x8e5cV\x83\xb5\xc0Z\xf5\xdf\x0c\xbc\x9fM\xa3\xd5\ +\x91x\xd5,\x83?\x9f\x94%\xe8k\x1c3\xaa$\xa3\xb5\xef\x8f%\xd4\x92\xc9U\x9fr\ +\x94\x96\n\xd2h\x96r:\xf9\xb3\xbe\xb9u\xc1\xf1k\x9d\xeci\xa0\xb1\x16\xb8\xfb\ +\xf4\x1cAb\xe5hE\xce\xbc\xcf\x10\xc7\xfeg\xd6J\xb1\x8d\xfd\xbf\xad\xac\x9d\ +\xfd\x8d\xc5\xcbw\xdd\x8c\xcbvR4\xc7\x81\x07\x041\n6>G\xa1%.w_:\xd7r\xea\xbd\ +\xbd\x1b+\xf1p\x16\xf1\x9b{\xec\xad\xf1X&\x0b\xb20\xc5y~\xff\x9b\x0bi\xdbOqJ\ +\x04U\xd24"Y\xa2?a)C\x92[\x89\xbf\x7f_\x17;5e\x1e\xcf6n\x03\x93G\xadd7>\xae`\ +\x16uWo\x8f)\xa7\x08\xca\x8e\x8f\xdc\xeeR\x87\xcd\xe8_\x0c\x18\xf1E\x1d(\x96\ +Oh;[\x90C\xcd\xa2w\x88y\xc5\x87,m\x89\t(J\x04db\x8a\x9cS\xf7\x95>(Tt\xc8\x8f\ +#\xaezr\xd9\x1c%&HI\xbaQ\xe1\xf2"\xab]Y\xe6\xe9\\\x8a\xd0\x9f\xe0\x13G8?e\ +\x06$p\x08\xe8C\x17\xa0\xc6\xc0O5e\xad\xf4\x05\xec\xe36\xef\x0f\x04>\'\x00I\ +\xf1\xd4\x04\xc6r\x896\xd6\x1f\xf4\xd4?\x16\x1f\xd2\'M\x93w{*F7\xcae+\xe4W\ +\xb6{3\t|.W`\x03]11ys\xc6\x1d\xef\x08\xaf\x12\xe1\x87\xaf\x1d-%G\xd83b^\x9a\ +\xd7\xf9\xb4>y\x8cy\xb6D\xfe$\x881}E\\\x88Q\x01j\xa8y~\xdb\x05\xa5(c\xde\xad\ +x\xbf\x14\x1e\xb4Ot9\xef\xb3x\x8dk\xa4\xbb\x98\xab\\\xc6\x03\x10\xd3,G\xbf\ +\x9d\xa8\n\xc7\x0e\xf8r\x03$\x88,\xac\x9e\xeb\xbe\xd2\x19\x03m/3\x8e\x8c\xa5\ +b\xb0\xfb\x9e\xffn\xcd$\xdd=\xe4m\xa7o\x02t\x88#\xc3\xa0\xc8\x87;\xde"\x80\ +\x9eC\xd4\xf3j\x11 \x0fvp\tK{\x08\xc7[p\xd2\xd5\xee\x12\x05\xf1\x8aR\xb8\x9e\ +\x0e!\xc57\x81\xf0\xb7\xa4\x1b\x17\xf5l\xf1;\x07\x8bg\n\xf47\x80i(\xb1\xa8\ +\xc8\x15@g\xf0\xb9\x90r\xc4\xbd\xda\xbdS\x16h\x17)\xacN}\xa0\x1e\xce\x82\x12\ +\x8d`\xfe\x93s\x9c\x80JH\x9c\xa5\x04Z\x92\xf0\xa3\x06\xd0.)=\xde\x03\xf7\x08\ +%\\d\x8eD\x9eE\xa5\xf4t!O\xd9@L\xf5\xe51@\x01\x9dA\xd1$M`l_c\x97a\xe0Pa\xe7\ +\xd7\xf0;\xbc\xf1V\xc4\xe9G\x08 \x17\x1f\x91\'M?\x82\x87.v\x12\xce:,^c\xd0\ +\xb4\xf8\xe1\xfc#\x81\xdd_jAE\xb0\xbc\x1f\x02\xc0\xa8\x009\xd7\xf8\x05\xa0\ +\xb8d\xc3\xf6\x18h\xb7\xd3=\xb9\xf4\x8f\xf7H|\x99\xd1dd\x0f\xee+<\x95\xd8\ +\xcef\xf2\xd2\x1eE=\x9d\x01\x03Zj\xa0&\xb4\xbb\xaad-\xe1\rZ\xc4\xa9\xadf!\ +\xeba\x9d:\xad/\xb7\x11h\x90\x10\xfe8]\x9e\x1a\xbc\xa4Lw)]\x9e\x0f\x9a\xf4\ +\xd0%M\x9b\x92a\t\x7f\xb8Uu%{\x17\x83y\x1b+\xbaT\xf3\x0e\x04\xc4t\x01\xd6\ +\x8a\xe27\x9f\xdd\x0b\xbb\xb6\x97I\x89%|\x84\x10\xe0\xc0\x83c\x81V\x1e\xbd\ +\xd1\x7f\xb1\xa0\x12\xb7\x1a\x1c\xf3A\xc0\x84\x12\xe8"(&o\x86\xdf\xb5\x8e\ +\xcf%\x99M\x91\xd5F@X\xe7a\x10g\xa7\xca\xc6\xe4\xad\xbf\xc1-\xc9\xa2\xee\xdb\ +\x89\xd7\x019\x91R|\x8d\xfd\xcaD\xc4\'Y/ \xd6Q\x80Z"\xfe\xf0\x829\xbeZ\xfa\ +\xfa\x81\x0eW\xd9\x8f\x02D\x8a\x1b2\xa1\xb21\x8d\rs\xff\\\xaa\x0bf\xa3xh\r\ +\xbe<\x91\xbb\x1cN\x053\x83\x16\xb4E\t\xebT\xa5A\xdd\x85\xd6\xe4\xc374}\xee\ +\xd15\x89\xe8\x0by5\x0f\xb4\x04\xc1\x1c\x8cFX\xe3\xb0\x7f\x19{e\xad\xa7\xceF\ +\xb1#\x04\x98\xb0\xd2\xc1\xf6\x11\x02\xf2\x00\xc3\x93V\xac\x1e\xd8\n$\xd8lU\ +\x02T?A*\x87\xed\x00\x7f:\x7fA;\x84\x07\xca*m\xf2>\xbf\x1d\x0f\xc5\xe4\x1b\ +\xaeP\xbeF\x8b\x00\x08\xd7\xed\xfd\xfcR4\x90\xeaMO&\xa8\r\xfd\xc9\n\xd9=k\ +\xb8\xbe\x01\xfao\x11\x02Z\xf1V\xf8\x95Cr\x11\xfd+$\xf3=\'\x12\x12\xd2\xfc\ +\xcb\xbd\x00\xc1\xae\x9d\xf8\x1e\xf0^\xbb+\x05\xd0r!-0\x00\x1b\x80\x93\xfac<\ +P#!\xac\xe4\xbf\x13\xb13\x0e\xa4A\xba\x06Y\xa6\x1aJ\xec\x86>\'{\x9e:\xd0\xfa\ +\xc2\x01/\x97|\xedUo\x0fG\xb5\xa1\xae\xbb\xbe\xf6\xbc\x19\xe36\x86\xfac2\x99\ +\x83\x8f\xfe\\/\xda\x14\xf31\xb4\xfe\x81\x05:\\\x05\x88\xe9\xc1\x11\x82\xbf\ +\x16\xa3E(\\J\xc8\xfd\x16\x98#N\xe6(e\x99o\xee\xe6oEe@SG%}\xde\xd1t8\xa0dF+\ +\x14\x95\x8a\xe7\xbb\xc1\xd7\xfd\x9fli\x02<\x93 \x95\x07\xcex\xf0\xe4r9\xe8U\ +ay\x80\x1cw\x0fF\xc6\xc1\xf1\xe9G\x80\x84\xf80\x8f+\xde\xb6\xd2/\xdb\xfc\xc0\ +B\x84\xa7\xa8\xbe\xf0\xdb\x93\x14\x97\xe7\xcbp8M\x19axt\x98?R\xc9V\xca\xd3%\ +\xb7\xa6\xc5\xc8\xf2OW\x88\xe5\x01\xd1\xa9p\x19\x80:\x86g:\x1f\x8bem;\nQ4\ +\xe2\x00ZC\\\xbe\xb2-lTP_\x0c\xb8 \xe6i\xc4%\x9e;>eD\x93\r8\xcb=\xdb\xd5\xe0\ +\xcf\xbe\xbe\x97\'\xf6\x1c\xd5\xe3\x1a\x03\xf2LVJDQ\x16\xba\x1d\xd9\xd2\x8bC\ +u)\xbb\x18\xd2\xbb\xe7\xa0\x9cI\x97G\xfc\xf5\xe5S\xcc#\r#\xf5\xb0\xe7\xbd<\ +\x0e\x1c\xe4\xa3\xf2\x10TO\x10;PRs\x8ev\xf3;\'I\x8f\xdewK\x8f\xbb\\A\xe0i^\ +\x8d\xa5\xf9\xcbs\xff\x11\xa2/aN\x02\xa9K\x05e\xde\xb7T\xa9\xd3\x85_\xd5\xe4\ +\xc9\x80\x1d\xc3(\xd9\xaae5@\x87O\x1fL\x1dz\x9d\xdc\xd6#q\xc4\xbe\\\r\x96\ +\xf8\x83\xd8\xbb\x95Q%\xab\xa1\x7f\xf8\x14\x10\xbf\x93\x98\x8b\xcb\xf8\x1bO\ +\xef\x08\x92\xf6\x14\xef\xfb\'\x0fH\xcep;m\x7f\xd6\x07\x88\xb65\x94\xec\x15\ +\x80\xef/\xa9\xe2\xc6R\xff\xe5\x7f\x11\xe041a\xb4\x01=59\x1c\x8b\xecR\xf7}3\ +\'\x9cW\x1cdO\xc3\xa7\xc8\n\xa9\x83G\xae\x00\xc8\x8a\x85j\xdd\xf2\xa4\xa2\ +\x94\xee\xb45\xd2\xe1\xf8B\xc1\xac\xf8\x08\xf7\xb7\xedEq\xd3F\xe6\xb2\xf9l69\ +\xa1\x1b\x12N\xc9Q\xdeU\x88J\x9edlK\x04\x92f%W\xe7\xec\xd3jpF\xbch\xa7\x8c\ +\x13\xaag\x8d\x0c\xa8\xb3\x8aHc\xb2=\xef\xb9I\xeaw\xef\xfd\x04)!\xc5C\'\x7fj\ +\xa0\xa4U` eht\xf2\x9d\x91\x9e\xd1/G\xee\xeaMs\xd0\xf4\xf4uL\xfe\xcf[LJ\x87}\ +\x19\xb7\xde\xff\xed\xc3\x05O\x9a&\xa7\x15}\t\xef\x00\t\xf0\xd2\x01\x19hU<\ +\xb4\x8f\xfa\x7f;=\xed\x8c' ) def getfulltwistedBitmap(): - return wxBitmapFromXPMData(getfulltwistedData()) + return wxBitmapFromImage(getfulltwistedImage()) def getfulltwistedImage(): - return wxImageFromBitmap(getfulltwistedBitmap()) + stream = cStringIO.StringIO(getfulltwistedData()) + return wxImageFromStream(stream) #---------------------------------------------------------------------- def gettwistedData(): - return cPickle.loads(zlib.decompress( -'x\xda\xc5ZkS\xd3@\x14\xfd\xee\xafX\t\r\xd8\xd8\x98\xb4P(1N)m\x11Q\xa3\x02Zu\ -| \x0f\x15\xd0\xe2\x03Q\x9c\xf1\xb7\xcb=-\x90\xb2{\x93\xdd6i\xef\x19u\x8e$9\ -\xbbgw\xef\xdel\x98=:\xf6ol\xcc\xf8\xe5\x8a\xf0=O\xd4<\xe1\xcf\xdc\xd8\xde\ -\x98q\xc4\x8eh\x1cm\xef\x1c\x82U\xce\x99\xd5\xaa\x10\xc0\x17\x89\xafT\t\xe0/\ -\x89/\xd7\x08\xe0\xaf\x88W\xdb\x04\xf0\x7f\xc4\x9b-\x02\xf8{\xdc\xef\x13\xc0\ -7q\xff\x1c\x01|\x95\xf8\\\x93\x00\xfe\x04\xf7\xd7\x08\xe0\xdf\x88\xd7\xda\ -\x04\xf0/\xc4\x17\xcb\x04\xf0\x1a\xf1\xb6O\x00\x7f\x8a\xeb\xd1@p\x1f\xfam\ -\x02\xf8\x06\xf1F\x99\x00\xfe\x15\xd7\xcf\x13\xc0\xff\x12\x9fo\x10\xc0\x7f\ -\xe1\xfee\x02x\x1b\xd7{\x04p\x01}\x04\xf8g\\?O\x00\x7f\x07\x7fZ\x04\xf0y\\\ -\xbfL\x00/\xa2\xbf\x08\xf0g\xb8\xbeF\x00\xbf\x05\x7fV\x08\xe0k\xc4\xcbm\x02\ -\xf8\n\xee_$\x80/\xa1\x7f\x08\xf0\x07ho\x8b\x00\xfe\x1c\xfe\xf9\x04\xf0u\xb4\ -\xc7#\x80\xbf\xc5\xf3*\x04\xf0\x0e\xeeG\x80?\x82?m\x02\xf8\x0b\xe8\xf9\x04p\ -\x9b\xf8\x02\x02\xfc&q<\xae\xd7\xbf\xdf\xd0o\x13\xc0Kx\x1e\x02|\x1f\xedi\x11\ -\xc0?b>\xfa\x04\xf0\x87\xf0\x17\x86\x80\xef\xc0\xaf&\x01\xfc;\x9e\xe7\x11\ -\xc0#\xe8#\x88O\xcd`\xfe\x95\tS\xf4\xf3;\xf0\xb3E\xc0\xf5\x16q\x1f\x01\xde\ -\x82\x1f\x0b\x04\xf0?\xf0\x03\x13\x14\xbc\x8a\xf6\xa1\xc1\xe0\'\xb8\xbeL\x00\ -?\x80?\x98P\xe0\x9f\xe0O\x83\x00~\x8f\xb8\xb7@\x00\xdf\xc5\xf3+\x04\xf0\xc7x\ -\xbeG\x00_\x80\x7f5\x02\xf8\x16\xfa\x8f\x05\n\xfe\x13\xfe\xc1`\xf0S\xb4\x07\ -\x06\x81\xbbx\x1e\x02\xfc\x18~5\t\xe0\x1e\xe6\x9bG\x00\xef\xc2o\x04\xf8]\xf8\ -\x87\t\x0c~\x84\xe7\xcd\x11\xc0\xef\xe3\xfa\x05\x02\xf84\xaeG\x80\xcf\xa1\ -\xff\xe80\xf86\xda\x8b\x05\n^F{\xdb\x04\xf0&\x9eW&\x80\x7f\xc0\xf3\xe6\t\xe0\ -!\xfc@\x80/\xa3\xfdh\x10\xf8,~^!\x80\x17\xe0\x17\x02|\x0f\xfaXP\xe0\r\xf8\ -\xdf \x80\xd7\xf1<\x04\xf8\x19\xda\xe7\x11\xc0\x0fq=\x16,\xf8\x1b\xf8\x89\ -\x04\x00\x1e`~!\xc0\x7f\xa0\xfd-\x02\xf8k\xdc\xef\x13\xc0oc\xfe5\t\xfd\xfc2\ -\xb1\x18Y\xdf\xedLT\xbf\x1b9uwr\xfa\x1d\xcbq\x1ckzB\xfan\xc1\xe9\x85=\x11\ -\xfds\xef/"*\x8e_?tbau\xc6\xac\xef\x96\x9c\xc1(\xb8\xe3\xd4\xef\x06\xce\xf5\ -\x08\xba\xe3\xd3\xb7\x1dU\x84c\xd2w\xeb\x8e:J\xee8\xf4\x97,\x87\x0bk)\x7f}\ -\xdbI\n;g\xfdb\xddI\x0e\xb3T`\xaa?m9ia\x94\x8e\r\xf5%\xef\x83N\xa4\x18\x037\ -\x1f\xfdb\xa4\x98\xf0\x97\x9b@|\x0c\xbay\xe8w,\xf5\x82\x97\xff\xdf\xb1\xc2\ -\xcc\xf5\xe5~"\xe1u\x95\xbeh\xa7\x02m\xfdn\xa4T\xb0/\xfe\x192\x1d\xeb\xeaK\ -\x1e\xc3at\x1cB\xaauag\xa6/mv\xbd\x19v\xd1\xa8\x90\xc9\x0b\x1a\x95\x99\x96\ -\xbe\xbc\xd9\xd1f\x1b\x9b\x10\x10\n\x87I\x05:\xfa\xd2\x83Ql\x0cL\x08\xe4\xfd\ -\xa5!\xc6 ]?\xc5\xfb\xf8RT\xed\x8b)\xe98U_\xee\x94\xed\xaa\x16\xa3S/2c\xd0\ -\x19E\xdfV\x0e\xa9\xa2\xfaI\xf8IRe\x96\xac/\x1b\x1a1\xbd\xbc\x1cly\xb8\x12SA\ -\xa2\xbe\xc2{Fa\xa0u\x96Ae\x96\xa4o\xe0\xfd\xe0\x15\x06\xe9\x98\xd7\x97\x93z\ -=\xc9{&3\xa4Uf\xac\xfe\xb4r\xb3\x93\'D\x10\xea\xacN6\x150\xfa\xae\xadl\xbf\ -81}\xff\xff\x94\xf2d3\xef]\xf3\xf3\x87\x83$g\xa13\xad\xe9\xbdu8\xd4\xf9\xcb\ -\x11\xd3\xbb\xa0\xaf\xa3Y48\xd1\xd9\xb0\xe7_\xbf\xd5cPR\xeb0\xefJ;\xee\xf0\ -\xe7o\xbf,\xee\x14aZ\xaf`q\xac\x0f#\x9d?\xd6\xd4\x995\x0b\xef5\xcf\x7f\xbf*N\ -\x11\xb4\xbd\xff\xe2\x8e~\xfe|*\xed"\x81\xe6\x0ea\x1ddr\xfe\xbe\xf7(\xed\x93\ -\x1bS\xe4=\xce\xea\xfbG\xc32>\x7fp\x9c\xe7\x19~\x7fY\x89L\x8f\x1c\xd3\xbd7\ -\xfa\xfe\xb4\xf7\xca\xcc\xfb\xe5j\xd6\xdf\xff6,\xd6{\xb9:\xdb\xcd\xe1\xfb\ -\xe3\x8a\xa7]\xf86\xf3\xf9\xfe\xdb\xd6+\xf2Vs\xfa\xfe+\xc4}K\xa3\xc8\xdb\xd5\ -\x7f\x9e\xf1\xf7\xf7\xaa\x97\xe6}p\x96\xdf\xf7\x7f*\x9e\x1f\x0c\xbct\x04\xba\ -\x85Fv\xbf\x7f\xd1+nL\x8a\xbc\xec\xf4\xd7\x1f\xf6\x8b.\xa6\xc8;\x13\xb9\xea?\ -Y\xeb\xf7[]\xe4m\x99\xff\n\x94\x91\xfe\xcb\xf8\xc9\xa1\\\xe4m\xe6\xfb\xfbO\ -\xeb\xcf\xe2\xf3\xbenXh\x8c\xac\xdf\nb\xeb^.4\xb6r\xfe\xfd\xb7\xce\x80\xd5\ -\x99xo\xa0\xbf\x9e|\x00\x11\x95E\xbe\xfa\xab\x89\xf2\xcf\x85\xc8Y\xdf\xddI(\ -\xbe^\x88\xdc\xf5\x85x\xca\xc9\xdf\xfc\'\xc6\xa1/\xde\xdeQ\xca\xcf\n1\x1e}Q\ -\x9dSx\xdf\x14c\xd3\xbf\xda\xfa.\xe3\x96+\xc6\xa9/N\xd6F\xda\xecF\xdf\xff\ -\xaa\xefb\xde\xbf\x17\xd9\xe8O\x19\xddp!\xff\xc6\xcd@^L\x19\xd7\x1f\xad\xde\ -\x18\xbc\x16\x99\xc4\x10\xf5\x0f\xad\x83\xe0LLL_\x88\xcd\xbf\xae\x98\xa4~\ -\x86q\xae\xef\xfe\x07\xf5C\xce$' )) + return zlib.decompress( +'x\xda\x01\xd4\t+\xf6\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00{\x00\ +\x00\x00d\x08\x06\x00\x00\x00\xa6GO1\x00\x00\x00\x04sBIT\x08\x08\x08\x08|\ +\x08d\x88\x00\x00\t\x8bIDATx\x9c\xed]-p\xe3H\x16\xfe\xf6\xea\xc0\x82\x03\r\ +\x07,\x10X\x10\xb0@`\x80\xc1\x02\x03\x03\x81\x01\x02\x06\x02\x03\x04\x0c\x04\ +\x06\x18\x04\x08\x1c08 \x10 \x10 \x10 0@ @`\x80A\x80\xc0\x01\x81\x00\x81\x01\ +\x02\x01\x02\x07\x02\x02\x04\x06\x08\xb8J\x0b\xb2\xf2\xc9\x8e\x1c\xff\xf4{\ +\xfa\xb1\xe7\xabz\x95\xb2\xe3H\xed\xfe\xfa}\xfd\xde\xebV\xfa\x97bU\x94\xf8\ +\x89\x8b\xc0?\xban@\xdb\xc8\xf3\x1c\xfe\x9d\xdfu3:\xc1E\x91\x9d$\t\xb4\x89\ +\x06\xcb\xb2\xa0i\x1a\xf2<\xef\xbaI\xad\xe2b\xc8\xf6\xef|h\x13\rI\x92\x00\ +\x00\xa2\x87\x08W\xbf_!\xbc\x0f;nY{8{\xb2\xf3<\x87eY\xb0,\xeb\x8d\'\xe7y\x0e\ +\xc30`\xdbvG\xadk\x17\xbf\x9cs\x80\x96$\t\xac\x99\xb5\xf6\xe6\xf7\xa0\xaa*\ +\x82\xfb\x00\x8a\xa2\xf07\xac#\x9c\xadg\xbb7.F\x1fG\x07\x11\r\xbc\x0e\x8c\ +\xd1\xc7\xd1Y\x07og\xe7\xd9\x95l\xcb\xcc\xc5\xe6\xcc\x84\xe38\x10B\x10\xb6\ +\xac{\x9c\x15\xd9I\x92\xc0\x98\x1a\xc8\xb2L\xfaZ\x8a\xa2 \xb8\x0f\xa0\xaa\ +\xaa|\xc3z\x82\xb3\x91q\xdb\xb61\xfa8"!\x1a\x00\xb2,\xc3\xe8\xe3\x08\xee\x8d\ +Kr\xbd>`\xf0\x9e]E\xd4\xd1C\xc4v\x0f}\xaa\xc3\xf3\xbc\xc1\xcb\xfa\xa0\xc9\ +\x8e\x1e"\x18\x86\xd1JqD\x08\x81 \x080\x9e\x8c\xd9\xef\xc5\x85\xc1\xca\xb8m\ +\xdb\xadV\xc1\xf2<\x87\xa6i\x83\xce\xc9\x07\xe7\xd9Y\x96\xc1\xb2,V\xd9\xde\ +\x87\xa1\xe6\xe4\x83\xf2\xec\xf0>\xc4\xe8\xe3\xa8S\xa2\x81\xff\xe7\xe4C+\xb5\ +\x0e\x86l\xdb\xb6\xa5\xe7gEQ\xe0y\x1eI:U/\xb5\x0eeA\xa5\xf72\x9ee\x19\x8c\ +\xa9qp%l\x17\xea\x11u\x9e\xe7\xb0m\x9b\xacZ\xa6\xaa*\xbc;\x9aA\xc4\x89^{\xb6\ +\x7f\xe7\x1fU\xf2\xdc\x05\xc7q\x10\x04\xc1:u\x12B\xc0\xf3<\xb2t\xaaZ:\xed{N\ +\xdeK\xcf\xa6\xf2\xbc\xa6*X\x92$\x1b\xaf\xa9\x94\xa3B\x9fs\xf2\xdeyv\xe5%\ +\xb2D\xebS\x1d\xf1c\xbcAlUe\xab\xcf\xfd\x8a\xa2 ~\x8c1\xbf\x9eK\xdd\xafB\x15\ +DR\r\x1eR\x14\xab\xa2\xec\x8by\x9eW\n!J\x00\'\x9b\x10\xa2t\x1cg\xe3\xba\xe9S\ +Z\xaa\xaa\xba\xf19EQ\xca\xf81\xde\xf8\\\x10\x04\xd2\xf7\xaf\xdb\xfcz\xdey\ +\x9f\xd6\xad\x17d?\xbf<\x97\xfaT\x97\xee\\UU\xdf\x10\xb8o\x005\r\x8c\xf1dLF\ +\xf8x2.\x9f_\x9e;\xef\xe3^\x90\x1d?\xc6\xa5\xa2(\xd2\x9dj\xce\xcc\x8dN}~y.\ +\xcd\x99y2!\x8e\xe3\x90\x11.\x84(\x83 \xb8l\xb2):T\x08Qz\x9e\xf7f\x00m\xcb\ +\xf6!\xd7Y.\x97\x1b\xd7Y.\x97g%\xeb\x9d\x90\xdd\xa5l\xef\xb3mY\x7f~y&\x95uUU\ +\xcb\xf4)\xbd\x0c\xb2\xa9\xbce~=?Y\xb6\xf7\xd9x2~C\x08\xb5\xaco\xab\xd1\xd9\ +\x91=\xbf\x9e\x93t\xd4\xf6\xfcG5\xef\xb7}\x9f\xed8\xe3,\xc8\xa6\x92\xc2&\t\ +\xa4\xf4\xb8]\n\xb2\xfd](\xa6\xa0\xca\x9aR\xc0\xc1\x92M)\xdb\x9c\x9d~\xca \ +\xa3\x0c\xde\xb6c\x85\xc1\x91=$\xd9>\xb5\x1d\xc7F\xfd\xef\x99>\xd5Ye\x9d\x85\ +\xec\xa6\x8a\xd5)\xc6\x1d(\x9db2\xf9\xfc\xa1\x83j;\x05\xec-\xd9T%G\xae\x14HQ\ +\x14\xe9\x01\xc3\x91\xf2m\x1bGNNF\xf6\xf3\xcb3\x99l\xb3\x157\xfe\xf9\xfa\xb3\ +X\xc9O\x05M\xe9\x13\x95\xa2\xd5\x07\x15eNNB6\xd5\xdc\xc5]\xb6\xfc\xf0\xdb\ +\x875\xd9\xd5\x00\x95\r\xf2\x9a\xe6Y\x8aA_\x1fTT\xa5Vi\xb2\xa9\xe4\x8b\xbbrU\ +YS\xaa#\xfb\x1d\xdaZA\x93\r\xdeN&\x9b*0Q\x14\x85\xbd&\xdd\xe4-\x14\xf5\xf4}\ +\x03\x96C\xd6er\xf2\x93\xc8\xa6\x92mn\t\xdcg\x1c\x91u\xd3w\xa2.\xb5\x9e\x9a\ +\x93\x1fM6U\xc3\xb9\xbd@\xc6[de\xbd\x8d\x15\xb4Sr\xf2\x83\xc9\xa6\xaaX\xb51\ +\xbf\x9dBN\x1b\xb2N\x1d\x87\x1c[j=\x88l\xaa\x8aU\xd7\xb2}l\xfb(\xd2I\xee\x0c\ +\x038<\'\xdfK6U\xee\xdc\x17\xd9\xdeg\x1c\xca\xd3F\xc9\xf7\x90\xedO;\xc9\xa6\ +\\\xa9\xe2\xae6q\x18\xc7\xe0\xe4^\xcc\xd9\x97\x937\x92M\x15Lp\xd7\x91\xb9\ +\x8dc\xdaic\x99v\x97\xac\xbf!\x9bJ\xb69\x02\x9e.\xacMY\xe7.\xb5\xae\xc9\xa6\ +\xdaB;T\xd9\xdeg\x1c\xb2\xde\xc6\nZ\xdd\xe9P\xac\x8a2\xb8\xa7I}\x9a\xb6\xd9P\ +4\xde\x9c\x99\'o\x16\x10B\xac\xff^\xb6\x1dM\xf2(K8\xb7s\x08!\xd6\xd7\x07ed\ +\xdc\xd4p\x8a\x1c\xda\x9c\x99\xeb\x91\x7f(\xe9U\x06P\r>Y\xb2\xb9\x82+\xce)OU\ +\xd52\xcb\xb2\xe69\x9b*\xe7\xe5\x90\xbcz\xb0\xf4\x1e\xe9\xdb$\xcbJ#g\xda\xc4\ +\xe9\xd5\xf3\xf9\xbc,\x8a=\x01\x1aU$\xce\x11\xc9n/\x9a4yk}\xa0\xc9\x92\xc2\ +\x199s\xcd\xd7\xef\xedtiL\xbd(w\x85p\xd4\x88+B\x9b:\xbe\x92\xdbK\x95\xed\xf7\ +\n+\xefV\xd0\xb8\x16=(\x06\xd3x2n\xf4\x04UU\xa5H\x19\xaal\x1f\xb2\x12\xb6\ +\xb7\\J%\xebm\xd4\x88)\xc8\x18\xa2lG\xff\x8d\xf6\x12}\x10\xd9\xc5\xaa(\xf3<\ +\'\x93\xb0mY\xefb[p\x93q\xca6\x97R\x8c\xc7\xc7=\x0e|\xd4z6\xd5(\xefr\xc3\xff\ +!dP\xa9\x19\xa7Rxw\xde\xc1\xbc\x9dD6\xf5\xfc\xc5\xfd\x94\xc5^\xcf`\xdc\x97\ +\xce\xa9\x14\xc9\xf7\xe4h\xa2O"\x9bZ\xd6\xb9k\xc4\xbb\x8ckc\x01\xa7l\xeb\xba\ +\xfe&wf\'\xbb2\xaaH\xb2\xcd\xd51\xce-C}\x93mR\xb2\x8bUQ&I\xc2Vj\xa5^@\xe1\ +\xcc\x088\x95\xe2\xd0h\x9b\x9d\xecJ\xd6\xa9\xd2\x08\xae\x1d-\x9cdp)\x85\xf1\ +\xd9 }\xd0\x8f\xf4Y/\xaa\xd53\xcaR+\'\x19\x9cJ\xe1\xba.\x19/,d\x17\xab\xa2\ +\xcc\xb2\x8c\xc4\x13)6\r\x0cQ\xb6\x15E)\x93\xe4\xb4h\xbbu\xb2+\xb3m\xbb\xd3N\ +\xfd)\xdb-\x92]\xac\x8a2\xfc\x16\xb6.\x97MdP\xedK\xe7R\n!D\xe9\xde\xd2\xcbv\ +\xabd\x17\xab\xa2\xcc\xfe\x97\xb1zT=\x7fm"\xa3\xcfk\xf4\xc0k\x16\xc2%\xdb\ +\xad\x93\xbd\xf6\x80\x1b\xbe\xb9R\x9f\xealdp>\xc1b}\xb1\xce\xef\xbf%U\x16\ +\xc71[\xf1\x82\x83\x0c\xae\'X\x84\x10\xa5\xff\xd5o\xad\xdf;!\xbbX\xbd\xe6\ +\xe4\\eI*2\x9a\x14d\x88\xb2\xdd9\xd9\x95\xb9\xb7.\t)\xd5C\xeaC\x90\xed\xc5b\ +\xd1\xe9\x7f(\xee\xf4$\x814M\xa1\x7f\xd2\xa5\x8fTT\x14\x05y\x9eK\x1f\xcc\xb2\ +}\xe0*\xd5\x89\x06B\x08\xf8_}h\x9a&u\x1dYt~lD\xf1\xa3\x80\xf5\xc5B\xf05\xe8\ +\xac\rB\x088\x8e\x03sf\xae\xdf;\xe6\xec\xed\xf7\xa0\xaa*\xc20\xc4\x87\xdf>H\ +\xb6R\x1e\x9d\x1f\x1b\xf1\xeb\xbf~\x85\xef\xfb\x9d\x9d\xab\xa1\xaa*\x96\x0f\ +\xcb\r\xa2\xfd;\x1f\xdaD\x93&z\xb1X ~\x8c{A4\xd0\x03\xcf\xae#{\xca`\x18t\x87\ +\xb3\xec\xc3\xb9\xcb\xf66:\xf7\xec:\x94\xdf\x15DQ\x04\xeb\x8b\xc5z\x9f\xa6\ +\xa3\x9e\xa8\x0e\xa2\xd1>iH\x9f\xd2\xde\x11\r\xf4\xcc\xb3\xebX~[\xc24M\xf2\ +\xd3\xf0\x9a\x0e\\so\\8\x8e#}/\xd7u\xd9\x07\xaa\x0czK6\xf0*\xeb\x96e!\x8a"\ +\x92\xeb\xcd\xaf\xe7p\x1cg\xfd:\xcfsX\x96%}\xa6\xa6\x10\x02a\x18b\xf4\xe7H\ +\xb6\x89\xac\xe85\xd9\x15\xbc[\x0f\xf3\xf9\xe9\xe7nU\xb2\xadO\xf5\xf5{I\x92\ +\xc0\x98\x1a\xd2i\x9f\xf6I\x83\xef\xfb\xbd<\xb4m\x1b\x83 \x1b\x00\xe28\x86\ +\xfeI?Zj\x9b\x8e?vo\\\x92s\xb0\xfb.\xdb\xdb\x18\x0c\xd9\xc0\xdf\'\xdbN\x8d\ +\x83e\x9dK\xb6\x15EA\x18\x86\xb8\xfa\xe3J\xea:m\xa3W\xd1\xf8N\xac^\x7f\x08!\ +\xb0|X\xc2\xbb\xf3\xde\xfd\xb8\x10\x02A\x10l\x10\x1d=D$g^\x1b\x9f\r\xc4\x8f\ +\xf1\xe0\x88\x06\x06\xe6\xd9uD\x0fQ\xe3y\xda\xe3\xc9x\xe3D]\xe0re{\x1b\xc3\ +\xf0l\xbc\x96U\xe38^\xbf\x1eO\xc6H\x9fR\x8c\'\xe3\xf5{\x8e\xe3`\xb9\\n\x14I4\ +M\x93&ZQ\x94\xd7\xf2\xe9\x80\x89\x06\x06\xe2\xd9\xd9S\x06}\xaa#\xfd\x9e\xee\ +\xf4\\UU7\x88\xdf\xe5\xf9\xc7\xc2\xfaba\xb1X\x0c"\xda\xde\x87\xde\x93\x1d\ +\xde\x870\x0cc\xe3\xbd\xa6T\xaa\x0e\n\xd9\x16B\xc0\xbdu\xdf\xdc{\xc8\xe8-\ +\xd9\xc5\x8f\x02\xb6m\xc3\xf3v\x07cM\xd1\xb6a\x18\x88\x1e"\xa9{\xab\xaa\n\ +\xdf\xf7\x07\x19\x84\xbd\x87^\x92}\xcc:w\x95G\'\x8f\t,\xcb"\x91m\xd7u\xa5\ +\xae\xd1W\xf4\x8el\xff\xce\x87e\x1d\x17\x08\t!\xa4I>G\xd9\xdeFo\xc8.~\x140g\ +\xa6t\x1e|\n\x9a\xaal\xe7\x88\xde\xa4^\xc6g\xa3\x13\xa2\xab\r\x06\xe7N4\xd0#\ +\xb2}\xdfo5\x8f\xadV\xaa\xec\x7f\xcb\x17[\x86\x82\xde\xc8x\x85S\xe6\xecc1\ +\xfas\x04\xdf\xf7/\xc2\x9b\xeb\xe8\x8dgW0g&\x92$aK{\x16\x8b\x05\xa2(\xba8\ +\xa2\x81\x1ezv\x85<\xcf\xe1\xfc\xc7!K\x83\x86\xb2\xc1\x80\x13\xbd%\xbb\x82\ +\xef\xfb\xb0fr\xb2>\xa4\r\x06\x9c\xe8\x9d\x8co\xc34\xe5d\xddu]\x84ax\xf1D\ +\x03\x03 \x1b\x00\xae\xfe\xb8:z\xd7\xa9\x10\xa2\x95\x9d\xaaC\xc2 \xc8\x06\ +\xfe\xaep\xb9.|\xdf\xdf\xfbY\xe3\xb3\x81\xf4)\xbd\xe8\xf9\xb9\t\xbd\x9f\xb3\ +\x9b\x90\xa6)\x0c\xc3@\xfa=}\xf3\xbb\xa1o0\xe0\xc4`<\xbb\x8e\xab\xabWY\xaf\ +\xef8=\x97\r\x06\x9c\x18\xa4g\xd7\x11\x04\x01\x96\xdf\x96po\xdd\x9fA\xd8\x1e\ +\x0c\x9e\xec\x9f8\x1c\x7f\x01^\xfa\x92\xc5\x90q!T\x00\x00\x00\x00IEND\xaeB`\ +\x82\xe2\xfc\xd9\x86' ) def gettwistedBitmap(): - return wxBitmapFromXPMData(gettwistedData()) + return wxBitmapFromImage(gettwistedImage()) def gettwistedImage(): - return wxImageFromBitmap(gettwistedBitmap()) + stream = cStringIO.StringIO(gettwistedData()) + return wxImageFromStream(stream) + +#---------------------------------------------------------------------- +def getLeftArrowData(): + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2" \xcc\xc1\x06$\ +{;ey\x81\x14K\xb1\x93g\x08\x07\x10\xd4p\xa4t\x00\xf9O=]\x1cC*\xe6\x9c\xbd\ +\xa2\xcfw\xc8@\xe4\xf8\xc7\xf7\xd9\x82\x1c,\xec\x0e\n\xda\x96LB\x9dO$N\xc86*\ +\x170\xa8\x00\x05\xcaXX\x98,\x1b\x1d\x94\x0co;_\xdch\x1f %vH?\xf3\x92\xce\ +\xdd\xf4\xf7\xa6\xb1\xae=KO\xcf\xf0\xdb:\xbf)\xea\xc9*\xd7us\x1b\xce\x07\xe8\ +\xdcb\x90?\xf0\xaa\xa2[\x97\xaf\xe1\x9e\xf6\x19\xdeY\xe7\x9d\x05\x93\x8f\x86\ +G\x1c\xbf\xb6\xfc\xc7\xab-\'B\x8f\xdc\xe0\xdaVbp\x7fz\xf7\xb2\xc5\x06[\xec\ +\x9c\xb6\xbd`\xbeP\xdd\xce\xb8\xe4\xb9\xc1\x8cX#\xfb\xef\xba\xea\xb3E\xb6\ +\xf3\xee\x97\xf1Z\x9a:I\xf6\xf1I\x11\xf3\x96\xcb[\x7f=M\x98\xb6\x8e\xa5\x91\ +\x8d\xeb\xe9\xbe#G\xb6\xeb\x1c\xe3bX-yS\xb1\xb7m\x8f\xe2\xb10\xb6\x05\r\x93\ +\xde|1\\\xbf\xbe\xd2\xfa\xd6\xba\xf5\xbf\x1c\xbf]\xad\x9fp\xad\xfe\xa7d\xc7\ +\xc1\x86o\\\xfbO\xfe\x8f\xdfP\xfe[%m\xde\x1e)oPh0x\xba\xfa\xb9\xacsJh\x02\ +\x00\xdd\xdfz\xf7' ) + +def getLeftArrowBitmap(): + return wxBitmapFromImage(getLeftArrowImage()) + +def getLeftArrowImage(): + stream = cStringIO.StringIO(getLeftArrowData()) + return wxImageFromStream(stream) + +#---------------------------------------------------------------------- +def getRightArrowData(): + return zlib.decompress( +'x\xda\x01+\x01\xd4\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\ +\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\r\x00\x00\x00\x04sBIT\x08\ +\x08\x08\x08|\x08d\x88\x00\x00\x00\xe2IDATx\x9c\xcd\x94\xa1\x0e\x830\x10\x86\ +\xff\x96\x89\x89\t\xe4d\xe5\xc4\x1ed\x8f\xc4#\xec\x11\xf6\x08\xc8\x89\t$\x8f\ +01\x81<\x81\x98D *\x06\x9d(%\x048\xd6.$\xdb\x9f4\xb9\xe6\xda/\xff]\xda\x13BF\ +XSrU\xda_\x00M\xdb\x18\xd36f\x15\xe0\x10\xc4A\xbf*\xf9\xfc\xd0,T\xba\x84\xcf\ +r\x97\xa8\xe2\xa1r\xa9\x1f\x9c\xa8\xe6\xa1\x02\x80\x01\x00\xfd\xb2\xc9\xac\ +\xb4\x89\xa2\xe6\x81ywF\xed\x00\x15\x03\xc9qka2\x12=\xf0J\x1a\x97"\xd4\xeb\ +\x14\xbaq\x89%GK\xcaJ\x80ny\xbf\xef\x1d\xaaT\x83\x9e\xe4\xe7j\xafp\x88\x81\ +\xa2\x02\xe8\x9e\x03\xe7\x93\x85\rK\x0e\x91Jm\xbf\xc70\x00\x90.\x08\xd5\x1c\ +\xccm\xbcWW\x8dA\x92\x19\x17O\xce\x85\x8c\xaf\xf1\x9b\x9d\xab.\xe8\xeb\r\x01\ +\\\xab\x82\x1c\xfa\xe8\xf7\xf3\xf0\x93\xdeKg\x88\xd4\xa7\xbf\x86\xc3\x00\x00\ +\x00\x00IEND\xaeB`\x82w\x10{\xdb' ) + +def getRightArrowBitmap(): + return wxBitmapFromImage(getRightArrowImage()) + +def getRightArrowImage(): + stream = cStringIO.StringIO(getRightArrowData()) + return wxImageFromStream(stream) + +#---------------------------------------------------------------------- +def getUpArrowData(): + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2" \xcc\xc1\x06$\ +{;ey\x81\x14K\xb1\x93g\x08\x07\x10\xd4p\xa4t\x00\xf9\x17<]\x1cC*\xe6\xbc\x9d\ +b(tHA\xc0\xf5\xbf\x907w\xff\x84I\x97\x94+X\xfa\'\x19\xb9\x9f\x10,b\xe9wH|\ +\xa8\xa8\xa1\x11\x1c\x11\x11\x15\xb4bvSb\xdb\x04\x81\x0b\x1b/\xdb\x1f>\xb0\ +\xe1\xf4\xed\xd4g\xcc\x13WL\x10\xde?\x8f\x87AE\xeb\xd4\xd3\xae\xa0\x88=\xff8\ +^0\xce\xdd\xe6\xb0\xfa\xd4\x02\x95UG\x19\x1b\x18\x0b\x96\xeb\xden\x7f\xfa+Er\ +m\xd2\xfe\xf9V\xdbo$\xde\x88Tn|,9\xc1z\xc1=\xf9Ms\xcf5(\xfa\xe4\xc9\x9eY\xcd\ +b\xc5xl\xc3=\x9f\xc9g\xef\x9e\xcd\x0e\xe0\xca\xdd\x1c\xb2\xf1\xb2\xd8\xf4\ +\xd5\xd1\xda\xc6\x0c\xbdsb\x8d\xb7L\xf6`\xf5\x12\x9d\x7fs\x89P\xd17\x0f\xd1\ +\xf3R\xbfc\xff6\xeeg\x98\xf3\xd3 l}\xe3C3\x11f\xcd\xaf\xc9\xf5wod\x9f/\xd05c\ +Z\xdd\x92%\x1d!\x15\x7f\x00\xe87\x06OW?\x97uN\tM\x00p$n\xe8' ) + +def getUpArrowBitmap(): + return wxBitmapFromImage(getUpArrowImage()) + +def getUpArrowImage(): + stream = cStringIO.StringIO(getUpArrowData()) + return wxImageFromStream(stream) + +#---------------------------------------------------------------------- +def getDownArrowData(): + return zlib.decompress( +'x\xda\xeb\x0c\xf0s\xe7\xe5\x92\xe2b``\xe0\xf5\xf4p\t\x02\xd2" \xcc\xc1\x06$\ +{;ey\x81\x14K\xb1\x93g\x08\x07\x10\xd4p\xa4t\x00\xf9\xd7=]\x1cC*\xe6\xbc\x9d\ +\xa2(t\xc8@\xc05>\xc8\x85u\x91\xfb\n\x97\x02\x81\xbe\x03\x81\x16N\xaa\x93\ +\x16+T\xb3\xb8\xb8\xa6\xb20E6v04\xbdHY\x90k\x96)\xdbd\x7f\xd9s\xd6\xfe\xdfi\ +\xc6\x9ea\x9as\x15O\xee\x9d\xa7\xb7e]\xc9\xb2%2{E\xa6}\n\x9b\xf40U~Z\xf2\xed\ +\xf3\xfe\xbc3j\xe5z\xfd\x99\x18_e\xdb\xcf\x9a\xedy\xac+\xfa\xdb\xa7\xabgC\ +\x85v\x84\xd4?\xe0gR\xffn\xf0\x8d\xcb\xa9\xf0q\xfa\ngGo\x93s\x81\xf7\xcf\x1e\ +\x9c\x1d\x9al(;\xe3\xb7\xc1\xce\xb7v\xc5\xc5+\x17\xde2\\W\x14\xb0\xd0\x9c\ +\xef\xf6\x9cM\rE\xb6,y]\x169L>\x8e\xb7\xf5\xf8\xb8\x99T_\xc8\xcc0?\xc2_\xd0\ +\xb0Z\xea\xb5\xc5\x9c\xb9\xff\xfb\x9f\xae\x888\xdev@\xd3m\xd7\xd6\x1d\xa9\ +\x9c\x13\x9a\x18\xf70>\xd4\x08+\x7f\xfaqB,\xd0\x8b\x0c\x9e\xae~.\xeb\x9c\x12\ +\x9a\x00\xdc\x08o\x10' ) + +def getDownArrowBitmap(): + return wxBitmapFromImage(getDownArrowImage()) + +def getDownArrowImage(): + stream = cStringIO.StringIO(getDownArrowData()) + return wxImageFromStream(stream) + +#---------------------------------------------------------------------- +def getDblLeftArrowData(): + return zlib.decompress( +'x\xda\x01R\x01\xad\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\ +\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\r\x00\x00\x00\x04sBIT\x08\ +\x08\x08\x08|\x08d\x88\x00\x00\x01\tIDATx\x9c\xcd\x94!r\xc30\x10E\xdfJ\x05\ +\x01\x05=@\x80\xa1`\x8f\x10\x18X\x98c\x04\xfa\x08>B\x0eP\x10\xd0\x03\x04\x14\ +\xf8\x08\x05\x01\x81\x06\x05\x81\x81&\xc9\x168rdUr\xd3i&\xd3\x9d\xd9\x19\xd9\ +o\xff\xd7.X\x89\x18\xcb-\xc3\xdc\xd4\xed\xae\x86z:\xaa\x9e\x8e\xfa[\x964\x0c\ +\x8bc\xe1\x18K\x1a\xfa\xa2j\xdbf/J1\x1f\x0f9\x81{\xcc\x9b\x85,\xecR\x8c\x15\ +\x93\x13\xacvy\xb3\x90\xc5\x97\x8a\x18;\x10,\x1d\xbc\xbcw\x05\xb3)\x94\xaf5T\ +\xf3$\xf3\xb1\xdaB\xb3\x98t#\xe7\xcc o\x06P\x7f^\xce\xcd\xbe\xe9\xcf&\x14\ +\xbb\xb7\xf4(c,\x8e\xc1\xc8\x94\x1b\x8a\xe7\x19\xee\tv\x07h>\xea\xae\xaa\x9a\ +\x7fgAW\x00,\xdd\xd9\xd1X\xce\xfb\xac\x80Rn\xb4X\xb7Z\xac[\xed\xff]\xc3|z\ +\xc3\x94\xa9\xff\x1eca\x8a\xb1\x0c\x0ccaX\xf8\x13\xeb3\xf5|\xc5+%\xc6\xca5\ +\x0c2\xbb\x1c\x16\xc5\x821\x06\xa4;\xfcK\xfc\xff\x07\xf6\x0b\x9d\xe9\xd2\xa9\ +\xfdu\xa4/\x00\x00\x00\x00IEND\xaeB`\x82\t\xa4\x88\xe0' ) + +def getDblLeftArrowBitmap(): + return wxBitmapFromImage(getDblLeftArrowImage()) + +def getDblLeftArrowImage(): + stream = cStringIO.StringIO(getDblLeftArrowData()) + return wxImageFromStream(stream) + +#---------------------------------------------------------------------- +def getDblRightArrowData(): + return zlib.decompress( +'x\xda\x01M\x01\xb2\xfe\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x14\ +\x00\x00\x00\x14\x08\x06\x00\x00\x00\x8d\x89\x1d\r\x00\x00\x00\x04sBIT\x08\ +\x08\x08\x08|\x08d\x88\x00\x00\x01\x04IDATx\x9c\xe5\x94!\x92\xc20\x18F_R\x04\ +b\x05\x12\x19\x89\xe0\x10\x95\x1cb\x0f\xd2#T"9\x02\x12\x81\xa8\xec\x11\x10\ +\x88\xca\x08\xc4\xca\nD\x04\x10\x04M)i\x1a`\x86\xc1\xec?\x93\xe9L^\xbe\x97\ +\xa4\xd3\xfeB\xc8\x84O\x96\xfc\xa8\xedkB{9[{9\xdbwYP\xd8]\xec\x07c,zB\x80|o\ +\x06\x831&\x1d\xf0\xaf\xa2\xeb\xe1`\x8c\xc9\xa1\xa3\xeb\xe3p0\xc6\x04`\x01\ +\xcc\xc9\xb0\xac\xee\xc2\xf2p{\xaa\x1fP\x13\xc8\xe6c\xc8\n\xf2\xdf4\xcc\x00!\ +\x13\xd1\n7\xda\xb0\xea\x08\xbb\xe5K\x17i\x1af\xc0\xc8\x81\xea\x18\x96\x01\ +\x14\x07\xd0\xdb\xf2%\xd6\nW{\xd0\x7f\xfa\xbe\xf3T1\x9b@U\x83\xde\x95\x90/ +\ +n\x9b\xd7\xf4Yse\x9a+\xf7\x86Z\x1b\xab\xd6\xc6\x92\x15/1!\x13\x84L\xa0i\x0e\ +\xc1\x90\x1f\x88\xb1\x07\xe1\xc3\x84\x93\x86v\x8f\xb0v\xf8\xed\xcb\xff.\xdd{\ +y\xc6\\\xf5~\xbd\xee"?\x10c\xed\xfc\xffk\xb0W\xd3\xfa\xd7)\xd90\x0f=\x00\x00\ +\x00\x00IEND\xaeB`\x82K\x92\x8b\x0f' ) + +def getDblRightArrowBitmap(): + return wxBitmapFromImage(getDblRightArrowImage()) + +def getDblRightArrowImage(): + stream = cStringIO.StringIO(getDblRightArrowData()) + return wxImageFromStream(stream) Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.23 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.24 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.23 Tue Oct 21 17:25:19 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Thu Oct 23 15:06:20 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.23 $ +@version: $Revision: 1.24 $ """ -__version__ = "$Revision: 1.23 $"[11:-2] +__version__ = "$Revision: 1.24 $"[11:-2] import xmlrpclib import types @@ -91,9 +91,9 @@ @param objs: objects to be hooked up. Don't worry if you pass an irrelevent object. """ # eventually call only this? --vwk 23may2003 - #print "xmlrpc.getObjects", classname data = self._RPC.getObjects(classname, refs, subtypes, fields) if data: + foo = self._factory.rememberAll(data, objs) return self._factory.rememberAll(data, objs) From pbear at ned.gsfc.nasa.gov Thu Oct 23 16:12:48 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 23 15:12:50 2003 Subject: [Pangalactic-commits] removed image_wdr directories again Message-ID: <200310231912.h9NJCmcj000747@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/aboutbox_wdr/About_0.png 1.1.1.1 None PanGalactic/pangalactic/client/aboutbox_wdr/About_1.png 1.1.1.1 None PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_0.png 1.1 None PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_1.png 1.1 None PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_2.png 1.1 None PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_3.png 1.1 None PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_4.png 1.1 None PanGalactic/pangalactic/client/customizegrid_wdr/ConfigBitmapsFunc_5.png 1.1 None PanGalactic/pangalactic/client/workflow/__init__.py 1.1 None Log message: removed image_wdr directories again From pbear at ned.gsfc.nasa.gov Thu Oct 23 16:14:39 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 23 15:14:40 2003 Subject: [Pangalactic-commits] removed image_wdr directories again Message-ID: <200310231914.h9NJEdpt000815@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_0.png 1.1 None PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_1.png 1.1 None PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_2.png 1.1 None PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_3.png 1.1 None PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_4.png 1.1 None PanGalactic/pangalactic/utils/configdbbrowser_wdr/ConfigBitmapsFunc_5.png 1.1 None PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_0.png 1.1 None PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_1.png 1.1 None PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_2.png 1.1 None PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_3.png 1.1 None PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_4.png 1.1 None PanGalactic/pangalactic/utils/configgrid_wdr/ConfigBitmapsFunc_5.png 1.1 None Log message: removed image_wdr directories again From pbear at ned.gsfc.nasa.gov Thu Oct 23 16:16:24 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 23 15:16:25 2003 Subject: [Pangalactic-commits] added blue arrow images Message-ID: <200310231916.h9NJGOct000864@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/images/dbl_left_arrow.png None 1.1 PanGalactic/pangalactic/client/images/dbl_right_arrow.png None 1.1 PanGalactic/pangalactic/client/images/down_arrow.png None 1.1 PanGalactic/pangalactic/client/images/left_arrow.png None 1.1 PanGalactic/pangalactic/client/images/right_arrow.png None 1.1 PanGalactic/pangalactic/client/images/up_arrow.png None 1.1 Log message: added blue arrow images From pbear at ned.gsfc.nasa.gov Thu Oct 23 16:21:47 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 23 15:21:49 2003 Subject: [Pangalactic-commits] remove image_wdr directories again Message-ID: <200310231921.h9NJLlOB000957@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr/About_0.png 1.2 None PanGalactic/pangalactic/client/modules/psm/aboutbox_wdr/About_1.png 1.2 None PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_0.png 1.2 None PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_1.png 1.2 None PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_2.png 1.2 None PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_3.png 1.2 None PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_4.png 1.2 None PanGalactic/pangalactic/client/modules/psm/configgrid_wdr/ConfigBitmapsFunc_5.png 1.2 None PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_0.png 1.1 None PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_1.png 1.1 None PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_2.png 1.1 None PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_3.png 1.1 None PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_4.png 1.1 None PanGalactic/pangalactic/client/support/configdbbrowser_wdr/ConfigBitmapsFunc_5.png 1.1 None Log message: remove image_wdr directories again From pbear at ned.gsfc.nasa.gov Thu Oct 23 16:53:14 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 23 15:53:16 2003 Subject: [Pangalactic-commits] fixed initial settings Message-ID: <200310231953.h9NJrEXA001309@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.119 1.120 Log message: fixed initial settings Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.119 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.120 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.119 Thu Oct 23 15:06:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Thu Oct 23 15:53:13 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.119 $"[11:-2] +__version__ = "$Revision: 1.120 $"[11:-2] import os import sys @@ -245,7 +245,7 @@ EVT_MENU(self, ID_TREE_RIGHTPOPUP_DUMPTOPDF, self.tree.DumpToPdf) EVT_MENU(self, ID_TREE_RIGHTPOPUP_QUICKCREATE, self.QuickCreate) - EVT_CHOICE(self, toolbarpanel.ID_PROJECT, self.OnProjectClick) + EVT_CHOICE(self, toolbarpanel.ID_PROJECT, self.OnSelectProject) EVT_CHOICE(self, toolbarpanel.ID_ITEM, self.OnItemClick) EVT_GRID_CELL_LEFT_DCLICK(self.itemgrid, self.onProductGridDClick) EVT_GRID_CELL_LEFT_DCLICK(self.product_master_grid, self.onProductGridDClick) @@ -770,12 +770,12 @@ self.product_master_grid.ClearGrid() self.State.currentuser = self.DataManager.user.id -# wgt = self.topWindow.toppanel.GetProjectWidget() -# ndx = wgt.GetSelection() -# project = wgt.GetStringSelection() -# print "psmtool.updateforlogin", project, ndx -# self.changeProject(ndx, project) - self.OnProjectClick() + #wgt = self.topWindow.toppanel.GetProjectWidget() + #ndx = wgt.GetSelection() + #project = wgt.GetStringSelection() + #print "psmtool.updateforlogin", project, ndx + #self.changeProject(ndx, project) + self.OnSelectProject() def OnItemExpanding(self, event): @@ -1001,8 +1001,8 @@ #print "end onitemclick" - def OnProjectClick(self, event = None): - print "\npsmtool.onprojectclick" + def OnSelectProject(self, event = None): + print "\npsmtool.onselectproject" wgt = self.topWindow.toppanel.GetProjectWidget() project = wgt.GetStringSelection() ndx = wgt.GetSelection() @@ -1015,7 +1015,9 @@ project = wgt.GetStringSelection() ndx = wgt.GetSelection() - self.changeProject(ndx, project) + if ndx > 0: + self.changeProject(ndx, project) + def changeProject(self, ndx, project): print "\npsmtool.changeProject" @@ -1321,7 +1323,7 @@ def SetupForLogin(self): wgt = self.Parent.menuBar.FindMenuItem('Repository','Get Marked Items') self.Parent.menuBar.Enable(wgt, true) - + def ShowCheckedOutGrid(self): # print self.checkoutframe if not self.checkoutframe: From waterbug at ned.gsfc.nasa.gov Fri Oct 24 15:44:20 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Fri Oct 24 14:44:23 2003 Subject: [Pangalactic-commits] Mods for schema changes (revision attribute, etc.). Message-ID: <200310241844.h9OIiKxs013293@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbTables.sql 1.65 1.66 PanGalactic/src/sql/insertACUs.sql 1.4 1.5 PanGalactic/src/sql/insertProductModelMasters.sql 1.3 1.4 PanGalactic/src/sql/insertProductModelVersions.sql 1.4 1.5 PanGalactic/src/sql/insertProductVersions.sql 1.3 1.4 Log message: Mods for schema changes (revision attribute, etc.). Index: PanGalactic/src/sql/insertACUs.sql diff -u PanGalactic/src/sql/insertACUs.sql:1.4 PanGalactic/src/sql/insertACUs.sql:1.5 --- PanGalactic/src/sql/insertACUs.sql:1.4 Fri Aug 29 15:51:36 2003 +++ PanGalactic/src/sql/insertACUs.sql Fri Oct 24 14:44:19 2003 @@ -1,6 +1,6 @@ /* PGER Demo NAUO data. */ -/* $Id: insertACUs.sql,v 1.4 2003/08/29 19:51:36 waterbug Exp $ */ +/* $Id: insertACUs.sql,v 1.5 2003/10/24 18:44:19 waterbug Exp $ */ BEGIN; SET CONSTRAINTS ALL DEFERRED; @@ -64,12 +64,12 @@ 'DriveMod1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'42', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'HOG', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id 'Default Model', -- component_of_pmm_id -'3B', -- component_of_pv_id +'1', -- component_of_pv_id 'IDrive', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); @@ -133,12 +133,12 @@ 'Brain1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'42', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'HOG', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id 'Default Model', -- component_of_pmm_id -'33', -- component_of_pv_id +'1', -- component_of_pv_id 'B57SMB', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); @@ -202,12 +202,12 @@ 'Flux1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'42', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'HOG', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id 'Default Model', -- component_of_pmm_id -'4', -- component_of_pv_id +'1', -- component_of_pv_id 'FX-CAP', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); @@ -271,12 +271,12 @@ 'Pwr1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'42', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'HOG', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id '3D MCAD Model', -- component_of_pmm_id -'A10K', -- component_of_pv_id +'1', -- component_of_pv_id 'MF Series A', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); @@ -340,12 +340,12 @@ 'OTh1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'42', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'HOG', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id 'Default Model', -- component_of_pmm_id -'A', -- component_of_pv_id +'1', -- component_of_pv_id 'OO-1', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); @@ -409,12 +409,12 @@ 'TwAssy1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'A', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'OO-1', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id 'Default Model', -- component_of_pmm_id -'TWANG-W01', -- component_of_pv_id +'1', -- component_of_pv_id 'BTA-20', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); @@ -478,12 +478,12 @@ 'Tw1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'TWANG-W01', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'BTA-20', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id 'Default Model', -- component_of_pmm_id -'1', -- component_of_pv_id +'1', -- component_of_pv_id 'MMT-01', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); @@ -547,12 +547,12 @@ 'H1', -- ref_designator '1', -- assembly_id 'Default Model', -- assembly_of_pmm_id -'TWANG-W01', -- assembly_of_pv_id +'1', -- assembly_of_pv_id 'BTA-20', -- assembly_of_pm_id 'TEST', -- assembly_of_pm_id_context '1', -- component_id 'Default Model', -- component_of_pmm_id -'1.2', -- component_of_pv_id +'1', -- component_of_pv_id 'HM.200', -- component_of_pm_id 'TEST' -- component_of_pm_id_context ); Index: PanGalactic/src/sql/createPgerDbTables.sql diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.65 PanGalactic/src/sql/createPgerDbTables.sql:1.66 --- PanGalactic/src/sql/createPgerDbTables.sql:1.65 Thu Oct 16 20:12:05 2003 +++ PanGalactic/src/sql/createPgerDbTables.sql Fri Oct 24 14:44:18 2003 @@ -1,6 +1,6 @@ /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */ -/* $Id: createPgerDbTables.sql,v 1.65 2003/10/17 00:12:05 waterbug Exp $ +/* $Id: createPgerDbTables.sql,v 1.66 2003/10/24 18:44:18 waterbug Exp $ * * *** TO DO *** * -- TBR (Text-Based Requirements) @@ -710,9 +710,9 @@ * applicable -- if not applicable, the defaults are * used). Defined as a foreign key referencing the * project table. */ - tag TEXT, - /* [CVS] A string identifier used to identify a - * baseline, release, or version. */ + revision TEXT, + /* [CVS] A string used to identify a baseline, release, + * or version. */ has_docs_flag BOOLEAN DEFAULT FALSE, /* A computed attribute: TRUE if the ProductVersion * occurs in a ProductVersionDocrel; otherwise, FALSE. @@ -912,9 +912,10 @@ * applicable -- if not applicable, the defaults are * used). Defined as a foreign key referencing the * project table. */ - tag TEXT, - /* [CVS] A string identifier used to identify a - * baseline, release, or version. */ + revision TEXT, + /* (Inherited from ProductVersion.) + * [CVS] A string used to identify a baseline, release, + * or version. */ has_docs_flag BOOLEAN DEFAULT FALSE, /* (Inherited from ProductVersion.) * A computed attribute: TRUE if the ProductModelVersion @@ -1183,19 +1184,15 @@ * this may map to an element tag) * 'annotation' ............ (name is optional) * */ - tag TEXT, - /* [CVS] A string identifier used to identify a - * baseline, release, or version. */ + revision TEXT, + /* [CVS] A string used to identify a baseline, release, + * or version. */ content TEXT DEFAULT '', /* The plain text content of the document. For a * document with structural_role = 'annotation', this is * effectively the document, since it has no structure. * For other documents, this could be a derived * attribute, or could be NULL. */ - abstract TEXT DEFAULT '', - /* For a structured document that contains a component - * named 'abstract', this should be identical to the - * full_text of that component. */ PRIMARY KEY (id, of_dm_id, of_dm_id_context), CONSTRAINT dv_has_of_master FOREIGN KEY (of_dm_id, of_dm_id_context) @@ -1244,12 +1241,20 @@ of_dm_id TEXT, of_dm_id_context TEXT, /* These point to the associated DocMaster. */ - manifestation TEXT DEFAULT 'digital', + digital_flag BOOLEAN NOT NULL DEFAULT TRUE, /* Maps to STEP product_definition_context.name (which * for a document is either 'digital document definition' * or 'physical document definition'). Specifies whether - * the document is digital or hardcopy. Values are - * 'digital' and 'hardcopy'. */ + * the document is digital or hardcopy. 'TRUE' if the + * document is digital; 'FALSE' if it is a hardcopy. */ + purpose TEXT, + /* The purpose for this representation -- valid values will be + * determined by the application context. Examples: + * 'slide presentation', 'print-ready report', 'web + * publishable document', 'interactive tutorial', etc. + * Note that the purpose does not specify the format -- + * that information is specified by the MIME type of + * the associated DrFile(s). */ PRIMARY KEY (id, of_dv_id, of_dm_id, of_dm_id_context), CONSTRAINT dr_has_of_version FOREIGN KEY (of_dv_id, of_dm_id, of_dm_id_context) @@ -1457,7 +1462,7 @@ ref_designator TEXT DEFAULT '', /* If ref_designator is populated, quantity must be '1'. * */ - change_flag TEXT DEFAULT '', + change_flag BOOLEAN NOT NULL DEFAULT FALSE, /* Indicates the item has changed (been added or * modified) since the previous version of the parts * list. */ Index: PanGalactic/src/sql/insertProductModelMasters.sql diff -u PanGalactic/src/sql/insertProductModelMasters.sql:1.3 PanGalactic/src/sql/insertProductModelMasters.sql:1.4 --- PanGalactic/src/sql/insertProductModelMasters.sql:1.3 Fri Aug 29 09:24:12 2003 +++ PanGalactic/src/sql/insertProductModelMasters.sql Fri Oct 24 14:44:19 2003 @@ -1,6 +1,6 @@ /* PGER Demo ProductModelMaster data inserts. */ -/* $Id: insertProductModelMasters.sql,v 1.3 2003/08/29 13:24:12 waterbug Exp $ */ +/* $Id: insertProductModelMasters.sql,v 1.4 2003/10/24 18:44:19 waterbug Exp $ */ BEGIN; SET CONSTRAINTS ALL DEFERRED; @@ -135,7 +135,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'TWANG-W01', -- of_pv_id +'1', -- of_pv_id 'BTA-20', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -204,7 +204,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'1.2', -- of_pv_id +'1', -- of_pv_id 'HM.200', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -273,7 +273,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'3B', -- of_pv_id +'1', -- of_pv_id 'IDrive', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -342,7 +342,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'33', -- of_pv_id +'1', -- of_pv_id 'B57SMB', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -411,7 +411,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'4', -- of_pv_id +'1', -- of_pv_id 'FX-CAP', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -480,7 +480,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'42', -- of_pv_id +'1', -- of_pv_id 'HOG', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -549,7 +549,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'A10K', -- of_pv_id +'1', -- of_pv_id 'MF Series A', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -618,7 +618,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'A', -- of_pv_id +'1', -- of_pv_id 'OO-1', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference @@ -687,7 +687,7 @@ '0', -- has_docs_flag '', -- step_subtype 'icon', -- model_view -'57', -- of_pv_id +'1', -- of_pv_id 'OO-Def-1', -- of_pm_id 'TEST', -- of_pm_id_context 'concept definition', -- frame_of_reference Index: PanGalactic/src/sql/insertProductModelVersions.sql diff -u PanGalactic/src/sql/insertProductModelVersions.sql:1.4 PanGalactic/src/sql/insertProductModelVersions.sql:1.5 --- PanGalactic/src/sql/insertProductModelVersions.sql:1.4 Fri Aug 29 09:24:12 2003 +++ PanGalactic/src/sql/insertProductModelVersions.sql Fri Oct 24 14:44:19 2003 @@ -1,6 +1,6 @@ /* PGER Demo ProductModelVersion data. */ -/* $Id: insertProductModelVersions.sql,v 1.4 2003/08/29 13:24:12 waterbug Exp $ */ +/* $Id: insertProductModelVersions.sql,v 1.5 2003/10/24 18:44:19 waterbug Exp $ */ BEGIN; SET CONSTRAINTS ALL DEFERRED; @@ -31,6 +31,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -63,9 +64,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'1', -- of_pv_id +'1', -- of_pv_id '0', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -96,6 +98,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -128,9 +131,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'TWANG-W01', -- of_pv_id +'1', -- of_pv_id '1', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -161,6 +165,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -193,9 +198,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'1.2', -- of_pv_id +'1', -- of_pv_id '0', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -226,6 +232,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -258,9 +265,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'3B', -- of_pv_id +'1', -- of_pv_id '0', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -291,6 +299,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -323,9 +332,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'33', -- of_pv_id +'1', -- of_pv_id '0', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -356,6 +366,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -388,9 +399,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'4', -- of_pv_id +'1', -- of_pv_id '0', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -421,6 +433,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -453,9 +466,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'42', -- of_pv_id +'1', -- of_pv_id '1', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -486,6 +500,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -518,9 +533,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag '3D MCAD Model', -- of_pmm_id -'A10K', -- of_pv_id +'1', -- of_pv_id '0', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -551,6 +567,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -583,9 +600,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'A', -- of_pv_id +'1', -- of_pv_id '1', -- has_parts_flag '0' -- has_parts_lists_flag ); @@ -616,6 +634,7 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag, of_pmm_id, of_pv_id, @@ -648,9 +667,10 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0', -- has_docs_flag 'Default Model', -- of_pmm_id -'57', -- of_pv_id +'1', -- of_pv_id '0', -- has_parts_flag '0' -- has_parts_lists_flag ); Index: PanGalactic/src/sql/insertProductVersions.sql diff -u PanGalactic/src/sql/insertProductVersions.sql:1.3 PanGalactic/src/sql/insertProductVersions.sql:1.4 --- PanGalactic/src/sql/insertProductVersions.sql:1.3 Fri Aug 29 09:24:12 2003 +++ PanGalactic/src/sql/insertProductVersions.sql Fri Oct 24 14:44:19 2003 @@ -1,6 +1,6 @@ /* PGER Demo ProductVersion data insertion. */ -/* $Id: insertProductVersions.sql,v 1.3 2003/08/29 13:24:12 waterbug Exp $ */ +/* $Id: insertProductVersions.sql,v 1.4 2003/10/24 18:44:19 waterbug Exp $ */ BEGIN; SET CONSTRAINTS ALL DEFERRED; @@ -31,15 +31,16 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'bigboote@yoyodyne.planet10.1036203962.11', -'1', -- id +'1', -- id '0', -- pgef_security_mask 'Twanger, Magic, Megawatt', -- short_description -'Prototype Twanger Version v1.0', -- long_description +'Prototype Twanger Version v1.0', -- long_description 'bigboote@yoyodyne.planet10', -- pger_owner 'PGER', -- pger_owner_context 'bigboote@yoyodyne.planet10', -- pger_creator @@ -59,6 +60,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'1.0', -- revision '0' -- has_docs_flag ); @@ -88,12 +90,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'bigboote@yoyodyne.planet10.1036203962.12', -'TWANG-W01', -- id +'1', -- id '0', -- pgef_security_mask 'Preliminary Twanging Assembly', -- short_description '', -- long_description @@ -116,6 +119,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'TWANG-W01', -- revision '0' -- has_docs_flag ); @@ -145,12 +149,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'bigboote@yoyodyne.planet10.1036203962.13', -'1.2', -- id +'1', -- id '0', -- pgef_security_mask 'Mabob, Hoogie', -- short_description '', -- long_description @@ -173,6 +178,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'1.2', -- revision '0' -- has_docs_flag ); @@ -202,12 +208,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'bigboote@yoyodyne.planet10.1036203962.14', -'3B', -- id +'1', -- id '0', -- pgef_security_mask 'Drive, Improbability', -- short_description 'Improbability Drive VROOM-3B', -- long_description @@ -230,6 +237,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'3B', -- revision '0' -- has_docs_flag ); @@ -259,12 +267,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'bigboote@yoyodyne.planet10.1036203962.15', -'33', -- id +'1', -- id '0', -- pgef_security_mask 'Computer, Hyper-Quantum, Subfemto', -- short_description 'Ridiculously Powerful Computer', -- long_description @@ -287,6 +296,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'33', -- revision '0' -- has_docs_flag ); @@ -316,12 +326,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'bigboote@yoyodyne.planet10.1036203962.16', -'4', -- id +'1', -- id '0', -- pgef_security_mask 'Capacitor, Flux', -- short_description 'Flux Capacitor, version 4', -- long_description @@ -344,6 +355,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'4', -- revision '0' -- has_docs_flag ); @@ -373,12 +385,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'banzai@banzai.earth.1036203962.17', -'42', -- id +'1', -- id '0', -- pgef_security_mask 'Heart of Gold Spacecraft', -- short_description '', -- long_description @@ -401,6 +414,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'42', -- revision '0' -- has_docs_flag ); @@ -430,12 +444,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'banzai@banzai.earth.1036203962.18', -'A10K', -- id +'1', -- id '0', -- pgef_security_mask 'power supply, fusion', -- short_description 'Mini-gen, omni-fuel, fusion', -- long_description @@ -458,6 +473,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A10K', -- revision '0' -- has_docs_flag ); @@ -487,12 +503,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'banzai@banzai.earth.1036203962.19', -'A', -- id +'1', -- id '0', -- pgef_security_mask 'Overthruster, Oscillation', -- short_description 'Oscillation Overthruster, Series 1, Version A', -- long_description @@ -515,6 +532,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'A', -- revision '0' -- has_docs_flag ); @@ -544,12 +562,13 @@ of_pm_id_context, project_id, project_id_context, +revision, has_docs_flag ) VALUES ( 'lizardo@yoyodyne.planet10.1036203962.20', -'57', -- id +'1', -- id '0', -- pgef_security_mask 'Overthruster, Oscillation', -- short_description 'Defective Oscillation Overthruster Version 57', -- long_description @@ -572,6 +591,7 @@ 'TEST', -- of_pm_id_context 'H2G2', -- project_id 'TEST', -- project_id_context +'57', -- revision '0' -- has_docs_flag ); From pbear at ned.gsfc.nasa.gov Fri Oct 24 15:52:52 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Fri Oct 24 14:52:54 2003 Subject: [Pangalactic-commits] moved menu items; fixed test_wffactory; added revision tag; added nextxxxid for pv and pmv Message-ID: <200310241852.h9OIqqwR013898@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/fnord.py 1.65 1.66 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.108 1.109 PanGalactic/pangalactic/client/modules/psm/pgeftree.py 1.28 1.29 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py 1.6 1.7 PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.30 1.31 PanGalactic/pangalactic/client/modules/psm/productdataform.wdr 1.3 1.4 PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py 1.4 1.5 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.120 1.121 PanGalactic/pangalactic/client/tests/test_wffactory.py 1.1 1.2 PanGalactic/pangalactic/enterprise/productmaster.py 1.18 1.19 PanGalactic/pangalactic/enterprise/productversion.py 1.23 1.24 PanGalactic/pangalactic/utils/datamanager.py 1.50 1.51 Log message: moved menu items; fixed test_wffactory; added revision tag; added nextxxxid for pv and pmv Index: PanGalactic/pangalactic/client/tests/test_wffactory.py diff -u PanGalactic/pangalactic/client/tests/test_wffactory.py:1.1 PanGalactic/pangalactic/client/tests/test_wffactory.py:1.2 --- PanGalactic/pangalactic/client/tests/test_wffactory.py:1.1 Thu Oct 16 13:24:48 2003 +++ PanGalactic/pangalactic/client/tests/test_wffactory.py Fri Oct 24 14:52:49 2003 @@ -26,7 +26,7 @@ assert defaultp <> None and defaultp.__class__.__name__ == "WfProcess", "Unable to create default WfProcess" simplep = simpleWfProcess() - assert simplep <> None and simplep.__class__.__name__ == "WfProcess",, "Unable to create a WfProcess" + assert simplep <> None and simplep.__class__.__name__ == "WfProcess", "Unable to create a WfProcess" from_act = newWfActivity("from", simplep.pgef_oid) assert from_act <> None and from_act.__class__.__name__ == "WfActivity", "Unable to create a WfActivity" @@ -38,10 +38,10 @@ assert trans <> None and trans.__class__.__name__ == "WfTransition", "Unable to create a WfTransition" newp = newWfProcess() - assert newp <> None and newp.__class__.__name__ == "WfProcess",, "Unable to create a WfProcess" + assert newp <> None and newp.__class__.__name__ == "WfProcess", "Unable to create a WfProcess" copyp = copyWfProcess(defaultp) - assert copyp <> None and copyp.__class__.__name__ == "WfProcess",, "Unable to create a WfProcess" + assert copyp <> None and copyp.__class__.__name__ == "WfProcess", "Unable to create a WfProcess" def suite(): Index: PanGalactic/pangalactic/enterprise/productmaster.py diff -u PanGalactic/pangalactic/enterprise/productmaster.py:1.18 PanGalactic/pangalactic/enterprise/productmaster.py:1.19 --- PanGalactic/pangalactic/enterprise/productmaster.py:1.18 Tue Oct 7 16:03:33 2003 +++ PanGalactic/pangalactic/enterprise/productmaster.py Fri Oct 24 14:52:50 2003 @@ -1,10 +1,10 @@ -# $Id: productmaster.py,v 1.18 2003/10/07 20:03:33 waterbug Exp $ +# $Id: productmaster.py,v 1.19 2003/10/24 18:52:50 pbear Exp $ """ Version-independent product data. """ -__version__ = "$Revision: 1.18 $"[11:-2] +__version__ = "$Revision: 1.19 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -38,10 +38,10 @@ ] _pk = ['id', 'id_context'] _schema_ext = { - 'project_id' : 'str', - 'project_id_context' : 'str', - 'has_docs_flag' : 'bool' - } + 'project_id' : 'str', + 'project_id_context' : 'str', + 'has_docs_flag' : 'bool' + } _schema = _schema_ext.copy() _schema.update(PgefObject._schema) # Attributes that point to application objects ... this info Index: PanGalactic/pangalactic/client/fnord.py diff -u PanGalactic/pangalactic/client/fnord.py:1.65 PanGalactic/pangalactic/client/fnord.py:1.66 --- PanGalactic/pangalactic/client/fnord.py:1.65 Thu Oct 23 15:06:16 2003 +++ PanGalactic/pangalactic/client/fnord.py Fri Oct 24 14:52:48 2003 @@ -98,7 +98,8 @@ ID_PREF_STARTUPTOOL = wxNewId() ID_PREF_DETACHEDWINDOWS = wxNewId() ID_PREF_PROXY = wxNewId() -ID_PREF_SERVER = wxNewId() +ID_PREF_SERVER1 = wxNewId() +ID_PREF_SERVER2 = wxNewId() ID_PREF_CLEAR_LOCALDB = wxNewId() ID_PREF_USERID = wxNewId() ID_PREF_TOOLTIPS = wxNewId() @@ -249,7 +250,8 @@ EVT_MENU(self, ID_PREF_STARTUPTOOL, self.OnOptionsStartup) EVT_MENU(self, ID_PREF_PROXY, self.OnProxySettings) - EVT_MENU(self, ID_PREF_SERVER, self.OnServerSettings) + EVT_MENU(self, ID_PREF_SERVER1, self.OnServerSettings) + EVT_MENU(self, ID_PREF_SERVER2, self.OnServerSettings) EVT_MENU(self, ID_PREF_CLEAR_LOCALDB, self.OnClearLocalDB) EVT_MENU(self, ID_PREF_USERID, self.OnSetUserId) EVT_MENU(self, ID_PREF_TOOLTIPS, self.OnEnableTooltips) @@ -363,8 +365,8 @@ menu.AppendMenu(ID_FILE_NEW, '&New', submenu) submenu = wxMenu() - submenu.Append(ID_FILE_EXPORT_PROPERTIES, "&Properties", "Export properties to a spreadsheet") - submenu.Append(ID_TOOL_GRIDTOPDF, "&Grid Data", "Export grid data to a PDF file") + submenu.Append(ID_FILE_EXPORT_PROPERTIES, "&Properties...", "Export properties to a spreadsheet") + submenu.Append(ID_TOOL_GRIDTOPDF, "&Table Data...", "Export grid data to a PDF file") menu.AppendMenu(ID_FILE_EXPORT, "&Export", submenu) menu.Enable(ID_FILE_EXPORT, false) @@ -400,40 +402,41 @@ menu.Append(ID_TOOL_CHECKOUT, "Get &Marked Items", "Get items for local mode") menu.Append(ID_TOOL_GETMYSTUFF, "&View My Stuff...", "View anything that's mine") menu.Enable(ID_TOOL_GETMYSTUFF, false) + menu.Append(ID_PREF_SERVER1, '&Repository...', 'What repository do I use?') self.menuBar.Append(menu, "&Repository") # Cache menu menu = wxMenu() menu.Append(ID_TOOL_VIEW_CHECKEDOUT, "&View Marked Data...", "Show marked data checked out from repository") - menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Cache', 'Clear locally stored data', false) - menu.AppendSeparator() + menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Database', 'Clear locally stored data', false) +# menu.AppendSeparator() menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries") self.menuBar.Append(menu, "&Cache") # Options menu - menu = wxMenu() - # Options.Preferences submenu +# menu = wxMenu() submenu = wxMenu() +# # Options.Preferences submenu +# submenu = wxMenu() submenu.Append(ID_PREF_TOOLTIPS, 'Show &Tooltips', 'Turn on/off flyover help', true) submenu.Append(ID_PREF_SHOWLOGINCONFIRMED, 'Show Login Confirmation', 'Show/hide login confirmation', true) submenu.Append(ID_PREF_OUTPUTDIR, 'Set Output Directory...', 'Where do my reports go?') - menu.AppendMenu(ID_PREFS, '&Preferences', submenu) +# menu.AppendMenu(ID_PREFS, '&Preferences', submenu) # Options.Settings submenu - submenu = wxMenu() +# submenu = wxMenu() submenu.Append(ID_PREF_PROXY, '&Proxy...', 'Set your proxy (if any)') - submenu.Append(ID_PREF_SERVER, '&Repository...', 'What repository do I use?') + submenu.Append(ID_PREF_SERVER2, '&Repository...', 'What repository do I use?') submenu.Append(ID_PREF_USERID, '&Userid...', 'Set the locally stored userid', false) - menu.AppendMenu(ID_PREFS, '&Settings', submenu) +# menu.AppendMenu(ID_PREFS, '&Settings', submenu) - self.menuBar.Append(menu, "&Options") +# self.menuBar.Append(menu, "&Options") + self.menuBar.Append(submenu, "&Options") menu = wxMenu() menu.Append(ID_HELP_ABOUT, "&About", "More information about this program") - - menu.AppendSeparator() - +# menu.AppendSeparator() #menu.Append(ID_HELP_TESTING, "Development Use - db browser", "You REALLY don't want to select this") - menu.Append(ID_HELP_TESTING1, "html help viewer", "You REALLY don't want to select this") + menu.Append(ID_HELP_TESTING1, "Development Use - html help viewer", "You REALLY don't want to select this") self.menuBar.Append(menu, "&Help") self.SetMenuBar(self.menuBar) @@ -739,7 +742,8 @@ self.menuBar.Enable(ID_FILE_LOGOUT, self.DataManager.user._loggedin) self.menuBar.Enable(ID_FILE_COMMIT,self.DataManager.user._loggedin) self.menuBar.Enable(ID_PREF_PROXY, not self.DataManager.user._loggedin) - self.menuBar.Enable(ID_PREF_SERVER, not self.DataManager.user._loggedin) + self.menuBar.Enable(ID_PREF_SERVER1, not self.DataManager.user._loggedin) + self.menuBar.Enable(ID_PREF_SERVER2, not self.DataManager.user._loggedin) self.menuBar.Enable(ID_PREF_USERID, not self.DataManager.user._loggedin) self.menuBar.Enable(ID_PREF_CLEAR_LOCALDB, not self.DataManager.user._loggedin) self.menuBar.Enable(ID_TOOL_GETMYSTUFF, self.DataManager.user._loggedin) @@ -796,7 +800,8 @@ self.RemoveSpecialMenu(self.DataManager.user) loggedin = self.DataManager.user._loggedin self.menuBar.Enable(ID_PREF_PROXY, not loggedin) - self.menuBar.Enable(ID_PREF_SERVER, not loggedin) + self.menuBar.Enable(ID_PREF_SERVER1, not loggedin) + self.menuBar.Enable(ID_PREF_SERVER2, not loggedin) self.menuBar.Enable(ID_PREF_USERID, not loggedin) self.menuBar.Enable(ID_FILE_LOGIN, not loggedin) self.menuBar.Enable(ID_FILE_LOGOUT, loggedin) @@ -909,6 +914,7 @@ #---------------------------------------------------------------------------- + class MyApp(wxApp): def OnInit(self): Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.30 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.31 --- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.30 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/productdataform.py Fri Oct 24 14:52:49 2003 @@ -1,9 +1,12 @@ from wxPython.wx import * + import pangalactic.enterprise.productmodelversion from pangalactic.utils.mixin_security import Security_Mixin from pangalactic.utils.securitymanager import actions -from productdataform_wdr import * +import pangalactic.utils.preferences as preferences + +from pangalactic.client.modules.psm.productdataform_wdr import * # WDR: classes @@ -29,17 +32,23 @@ self.EditingProductVersion = 0 self.temp_pm = None self.temp_pv = None + + self.NextPvId = None - PM_PV_Func(self, true) + PM_PV_Func(self, True) # WDR: handler declarations for PM_PV_Form EVT_RADIOBUTTON(self, ID_TOGGLE_PV, self.Select_PV) EVT_RADIOBUTTON(self, ID_TOGGLE_PM, self.Select_PM) + # WDR: methods for PM_PV_Form def GetPvRevision(self): - return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION), "wxTextCtrl") + return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION), "wxStaticText") + + def GetPvRevisionTag(self): + return wxPyTypeCast(self.FindWindowById(ID_PV_REVISION_TAG), "wxTextCtrl") def GetButtonMVClose(self): return wxPyTypeCast(self.FindWindowById(ID_BUTTON_M_V_CLOSE), "wxButton") @@ -92,6 +101,17 @@ def GetTogglePm(self): return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton") + def getNextPvId(self): + print "productdataform.getnextpvid" + temp = preferences.GetPreference('nextpvid') + if temp: + self.NextPvId = str(int(temp) + 1) + else: + self.NextPvId = "0" + preferences.prefs['nextpvid'] = self.NextPvId + print "nextpvid", self.NextPvId + + def ClearCreateEditFlags(self): self.CreatingProductMaster = 0 self.CreatingProductVersion = 0 @@ -105,15 +125,10 @@ self.GetPmName().SetEditable(state) self.GetPmNomenclature().SetEditable(state) self.GetPmPoc().SetEditable(state) -# self.GetPmDesc().Enable(state) -# self.GetPmIdentifier().Enable(state) -# self.GetPmName().Enable(state) -# self.GetPmNomenclature().Enable(state) -# self.GetPmPoc().Enable(state) def EnablePV(self, state): self.GetPvDesc().SetEditable(state) - self.GetPvRevision().SetEditable(false) + self.GetPvRevisionTag().SetEditable(state) self.GetPvName().SetEditable(state) self.GetPvNomenclature() .SetEditable(state) self.GetPvPoc().SetEditable(state) @@ -158,7 +173,7 @@ if self.GetTogglePm().GetValue(): self.GetPmIdentifier().SetFocus() elif self.GetTogglePv().GetValue(): - self.GetPvName().SetFocus() + self.GetPvRevisionTag().SetFocus() def EditingMode(self): #print "productdataform.pmpv.editingmode" @@ -245,9 +260,11 @@ self.clearPV() self.CreatingProductMaster = 0 self.CreatingProductVersion = 1 + self.getNextPvId() self.EnablePV(1) self.GetPvPoc().SetValue(self.State.currentuser) self.GetPvPoc().SetEditable(0) + self.GetPvRevision().SetLabel(self.NextPvId) self.HighlightFirstWgt() #print "end creatingmode" @@ -264,7 +281,8 @@ def FillFormWithPVData(self, PV): if PV == None: return - self.GetPvRevision().SetValue(PV.id) + self.GetPvRevision().SetLabel(PV.id) + self.GetPvRevisionTag().SetValue(PV.revision) self.GetPvName().SetValue(PV.name) self.GetPvPoc().SetValue(PV.creator) self.GetPvNomenclature().SetValue(PV.short_description) @@ -279,7 +297,8 @@ PM.long_description = self.GetPmDesc().GetValue() def FillPVWithFormData(self, PV): - PV.id = self.GetPvRevision().GetValue() + PV.id = self.GetPvRevision().GetLabel() + PV.revision = self.GetPvRevisionTag().GetValue() PV.name = self.GetPvName().GetValue() PV.creator = self.GetPvPoc().GetValue() PV.short_description = self.GetPvNomenclature().GetValue() @@ -290,6 +309,7 @@ """ Clears the entire form """ + print "productdataform.clearpmpvform" self.clearPM() self.clearPV() @@ -298,6 +318,7 @@ """ Clears the Product Master portion of the form """ + print "productdataform.clearpm" self.GetPmIdentifier().SetValue('') self.GetPmName().SetValue('') self.GetPmPoc().SetValue('') @@ -309,7 +330,9 @@ """ Clears the Product Version portion of the form """ - self.GetPvRevision().SetValue('') + print "productdataform.clearpv" + self.GetPvRevision().SetLabel('') + self.GetPvRevisionTag().SetValue('') self.GetPvName().SetValue('') self.GetPvPoc().SetValue('') self.GetPvNomenclature().SetValue('') @@ -317,17 +340,29 @@ self.temp_pv = None def ResetForm(self, PM, PV): + print "productdataform.resetpmpvform" self.clearForm() self.FillFormWithPMData(PM) self.FillFormWithPVData(PV) - self.EnablePM(false) - self.EnablePV(false) - + self.EnablePM(False) + self.EnablePV(False) + + def revertNextPvId(self): + print "productdataform.revertnextpvid" + nextid = preferences.GetPreference('nextpvid') + nextid = int(nextid) - 1 + preferences.prefs['nextpvid'] = nextid + preferences.CreatePreferencesFile(preferences.prefs) + self.NextPvId = None + print "nextid", nextid + def SavePM(self, pmv): self.FillPMWithFormData(pmv._of_master) + self.NextPmvId = None def SavePV(self,pmv): self.FillPVWithFormData(pmv._of_version) + self.NextPvId = None def Save(self, pmv): self.SavePM(pmv) @@ -385,8 +420,10 @@ self.EditingProductModelVersion = 0 self.temp_pmm = None self.temp_pmv = None + + self.NextPmvId = None - PMM_PMV_Func(self, true) + PMM_PMV_Func(self, True) # WDR: handler declarations for PMM_PMV_Form EVT_RADIOBUTTON(self, ID_TOGGLE_PMV, self.Select_PMV) @@ -425,7 +462,10 @@ return wxPyTypeCast(self.FindWindowById(ID_PMV_NAME), "wxTextCtrl") def GetPmvRevision(self): - return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION), "wxTextCtrl") + return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION), "wxStaticText") + + def GetPmvRevisionTag(self): + return wxPyTypeCast(self.FindWindowById(ID_PMV_REVISION_TAG), "wxTextCtrl") def GetTogglePmv(self): return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PMV), "wxRadioButton") @@ -453,7 +493,17 @@ def GetPartNumber(self): return wxPyTypeCast(self.FindWindowById(ID_PART_NUMBER), "wxStaticText") - + + def getNextPmvId(self): + print "productdataform.getnextpmvid" + temp = preferences.GetPreference('nextpmvid') + if temp: + self.NextPmvId = str(int(temp) + 1) + else: + self.NextPmvId = "0" + preferences.prefs['nextpmvid'] = self.NextPmvId + print "nextid", self.NextPmvId + def ClearCreateEditFlags(self): self.CreatingProductModelMaster = 0 self.CreatingProductModelVersion = 0 @@ -466,18 +516,18 @@ self.GetPmmName().SetEditable(state) self.GetPmmNomenclature() .SetEditable(state) self.GetPmmPoc().SetEditable(state) - #self.GetPartNumber().SetEditable(false) - #self.GetVersion().SetEditable(false) + #self.GetPartNumber().SetEditable(False) + #self.GetVersion().SetEditable(False) def EnablePMV(self, state): self.GetPmvDesc().SetEditable(state) - self.GetPmvRevision().SetEditable(false) + self.GetPmvRevisionTag().SetEditable(state) self.GetPmvName().SetEditable(state) self.GetPmvNomenclature() .SetEditable(state) self.GetPmvPoc().SetEditable(state) - #self.GetPartNumber().SetEditable(false) - #self.GetVersion().SetEditable(false) + #self.GetPartNumber().SetEditable(False) + #self.GetVersion().SetEditable(False) def BrowseMode(self, gotroot): @@ -517,7 +567,7 @@ if self.GetTogglePmm().GetValue(): self.GetPmmIdentifier().SetFocus() elif self.GetTogglePmv().GetValue(): - self.GetPmvName().SetFocus() + self.GetPmvRevisionTag().SetFocus() def EditingMode(self): #print "productdataform.pmmpmv.editingmode" @@ -589,9 +639,11 @@ self.clearPMV() self.CreatingProductModelMaster = 0 self.CreatingProductModelVersion = 1 + self.getNextPmvId() self.EnablePMV(1) self.GetPmvPoc().SetValue(self.State.currentuser) self.GetPmvPoc().SetEditable(0) + self.GetPmvRevision().SetLabel(self.NextPmvId) self.HighlightFirstWgt() #print "end creatingmode" @@ -620,7 +672,8 @@ def FillFormWithPMVData(self, PMV): if PMV == None: return - self.GetPmvRevision().SetValue(PMV.id) + self.GetPmvRevision().SetLabel(PMV.id) + self.GetPmvRevisionTag().SetValue(PMV.revision) self.GetPmvName().SetValue(PMV.name) self.GetPmvPoc().SetValue(PMV.creator) self.GetPmvNomenclature().SetValue(PMV.short_description) @@ -636,7 +689,8 @@ def FillPMVWithFormData(self, PMV): - PMV.id = self.GetPmvRevision().GetValue() + PMV.id = self.GetPmvRevision().GetLabel() + PMV.revision = self.GetPmvRevisionTag().GetValue() PMV.name = self.GetPmvName().GetValue() PMV.creator = self.GetPmvPoc().GetValue() PMV.short_description = self.GetPmvNomenclature().GetValue() @@ -644,6 +698,7 @@ def clearForm(self): + print "productdataform.clearpmmpmvform" """ Clears the entire form """ @@ -654,7 +709,9 @@ """ Clears the Product Model Version portion of a form """ - self.GetPmvRevision().SetValue('') + print "productdataform.clearpmv" + self.GetPmvRevision().SetLabel('') + self.GetPmvRevisionTag().SetValue('') self.GetPmvName().SetValue('') self.GetPmvPoc().SetValue('') self.GetPmvNomenclature().SetValue('') @@ -665,6 +722,7 @@ """ Clears the Product Model Master portion of a form """ + print "productdataform.clearpmm" self.GetPmmIdentifier().SetValue('') self.GetPmmName().SetValue('') self.GetPmmPoc().SetValue('') @@ -674,12 +732,22 @@ def ResetForm(self, PMM, PMV): + print "productdataform.resetpmmpmvform" self.clearForm() self.FillFormWithPMMData(PMM) self.FillFormWithPMVData(PMV) - self.EnablePMM(false) - self.EnablePMV(false) + self.EnablePMM(False) + self.EnablePMV(False) + def revertNextPmvId(self): + print "productdataform.revertnextpmvid" + nextid = preferences.GetPreference('nextpmvid') + nextid = int(nextid) - 1 + preferences.prefs['nextpmvid'] = nextid + preferences.CreatePreferencesFile(preferences.prefs) + print "nextid", nextid + self.NextPmvId = None + def SavePMM(self,pmv): self.FillPMMWithFormData(pmv._of_model_master) Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.108 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.109 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.108 Thu Oct 23 15:06:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Fri Oct 24 14:52:49 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.108 $"[11:-2] +__version__ = "$Revision: 1.109 $"[11:-2] # Python imports import copy @@ -118,13 +118,18 @@ self.PartDataPage = 4 self.OtherDocPage = 5 - self.tabnames = {self.PM_PVPage: 'Product', - self.PMM_PMVPage: 'Model', - self.PropertiesPage: 'Product Properties', - self.PartsListPage: 'Parts Lists', - self.PartDataPage: 'PartsListData', - self.OtherDocPage: 'Documents'} - + self.tabnames = {self.PM_PVPage: 'Product', + self.PMM_PMVPage: 'Model', + self.PropertiesPage: 'Product Properties', + self.PartsListPage: 'Parts Lists', + self.PartDataPage: 'PartsListData', + self.OtherDocPage: 'Documents'} + + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False + self.DataManager.creatingDocument = False + self.DataManager.creatingPartsList = False + self.vsplitter.SetMinimumPaneSize(20) self.vsplitter.SplitVertically(self.itemtree, self.editnb, 175) @@ -500,7 +505,7 @@ #print 'currentpage in pagechanging is: ' , self.currentpage pass #if self.currentpage == self.PMM_PMVPage: - #self.DataManager.creatingItem = self.UnsavedDataPageChanging("Discard unsaved Product changes?", + #self.DataManager.creatingitem = self.UnsavedDataPageChanging("Discard unsaved Product changes?", # self.DataManager.creatingItem, self.currentpage) #elif self.currentpage == self.PM_PVPage: @@ -521,7 +526,11 @@ self.currentpage = self.editnb.GetSelection() #print 'page changed.currentpage:', self.currentpage - if self.DataManager.creatingItem or self.DataManager.creatingPartsList or self.DataManager.creatingDocument: + #if self.DataManager.creatingItem or + if self.DataManager.creatingPMM_PMV or \ + self.DataManager.creatingPM_PV or \ + self.DataManager.creatingPartsList or \ + self.DataManager.creatingDocument: #print "creating/editing something" if self.editingtab == self.currentpage: self.EditingMode(self.currentpage) @@ -632,7 +641,9 @@ self.otherdocform.BrowseMode(True) self.DataManager.creatingDocument = False self.DataManager.creatingPartsList = False - self.DataManager.creatingItem = True + #self.DataManager.creatingItem = False + self.DataManager.creatingPM_PV = False + self.DataManager.creatingPMM_PMV = True elif whichpane == self.PM_PVPage: self.pm_pv_form.EditingMode() @@ -641,7 +652,9 @@ self.otherdocform.BrowseMode(True) self.DataManager.creatingDocument = False self.DataManager.creatingPartsList = False - self.DataManager.creatingItem = True + #self.DataManager.creatingItem = False + self.DataManager.creatingPM_PV = True + self.DataManager.creatingPMM_PMV = False elif whichpane == self.PartsListPage: self.pm_pv_form.BrowseMode(True) @@ -650,7 +663,9 @@ self.otherdocform.BrowseMode(True) self.DataManager.creatingDocument = False self.DataManager.creatingPartsList = True - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPM_PV = False + self.DataManager.creatingPMM_PMV = False elif whichpane == self.OtherDocPage: self.pm_pv_form.BrowseMode(True) @@ -659,7 +674,9 @@ self.otherdocform.EditingMode() self.DataManager.creatingDocument = True self.DataManager.creatingPartsList = False - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPM_PV = False + self.DataManager.creatingPMM_PMV = False def CreatingMode(self, whichpane): @@ -677,7 +694,9 @@ self.partslistform.BrowseMode(True) self.otherdocform.BrowseMode(True) self.pmm_pmv_form.CreatingMode() - self.DataManager.creatingItem = True + #self.DataManager.creatingItem = True + self.DataManager.creatingPMM_PMV = True + self.DataManager.creatingPM_PV = False self.DataManager.creatingPartsList = False self.DataManager.creatingDocument = False @@ -686,7 +705,9 @@ self.partslistform.BrowseMode(True) self.otherdocform.BrowseMode(True) self.pm_pv_form.CreatingMode() - self.DataManager.creatingItem = True + #self.DataManager.creatingItem = True + self.DataManager.creatingPM_PV = True + self.DataManager.creatingPMM_PMV = False self.DataManager.creatingPartsList = False self.DataManager.creatingDocument = False @@ -695,7 +716,9 @@ self.pmm_pmv_form.BrowseMode(True) self.otherdocform.BrowseMode(True) self.partslistform.CreatingMode() - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False self.DataManager.creatingPartsList = True self.DataManager.creatingDocument = False @@ -704,7 +727,9 @@ self.pm_pv_form.BrowseMode(True) self.pmm_pmv_form.BrowseMode(True) self.otherdocform.CreatingMode() - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False self.DataManager.creatingPartsList = False self.DataManager.creatingDocument = True @@ -972,22 +997,29 @@ def OnResetProduct(self, event): - #print "itemeditframe.onresetproduct" - self.DataManager.creatingItem = False + print "itemeditframe.onresetproduct" + #self.DataManager.creatingItem = False self.EditItem = False if self.itemtree: - #print "have tree" + print "have tree" node = self.itemtree.GetSelection() if node.IsOk(): if node == self.itemtree.GetRootItem(): - #print "have root" + print "have root" self.BrowseMode(True) obj = self.itemtree.GetPyData(node) if obj[0] == 'New': + print "file->new->productxxx ???" self.itemtree.DeleteAllItems() - self.pmm_pmv_form.clearForm() - self.pm_pv_form.clearForm() + if self.DataManager.creatingPMM_PMV: + self.pmm_pmv_form.clearForm() + self.pmm_pmv_form.revertNextPmvId() + self.DataManager.creatingPMM_PMV = False + if self.DataManager.creatingPM_PV: + self.pm_pv_form.clearForm() + self.pm_pv_form.revertNextPvId() + self.DataManager.creatingPM_PV = False return temp_obj = self.DataManager.localDB.GetItem(obj[1]) @@ -998,17 +1030,13 @@ self.pm_pv_form.ResetForm(temp_obj, None) elif classname == "ProductVersion": self.pm_pv_form.ResetForm(temp_obj._of_master, temp_obj) + self.pm_pv_form.revertNextPvId() elif classname == "ProductModelVersion": self.pmm_pmv_form.ResetForm(temp_obj._of_model_master, temp_obj) + self.pmm_pmv_form.revertNextPmvId() elif classname == "ProductModelMaster": self.pmm_pmv_form.ResetForm(temp_obj, None) -# if self.currentpage == self.PMM_PMVPage: -# self.pmm_pmv_form.ResetForm(temp_obj._of_master, temp_obj) -# -# elif self.currentpage == self.PM_PVPage: -# self.pm_pv_form.ResetForm(temp_obj._of_master, temp_obj) - else: print "\n\nATTENTION: itemeditframe.resetproduct" print " have node; is this section of code ever called???" @@ -1025,8 +1053,10 @@ self.pm_pv_form.ResetForm(temp_obj, None) elif classname == "ProductVersion": self.pm_pv_form.ResetForm(temp_obj._of_master, temp_obj) + self.pm_pv_form.revertNextPvId() elif classname == "ProductModelVersion": self.pmm_pmv_form.ResetForm(temp_obj._of_model_master, temp_obj._of_version) + self.pmm_pmv_form.revertNextPmvId() elif classname == "ProductModelMaster": self.pmm_pmv_form.ResetForm(temp_obj, temp_obj._of_version) else: @@ -1036,22 +1066,37 @@ elif self.currentpage == self.PM_PVPage: self.pm_pv_form.clearForm() else: - #print "onresetproduct.badnode" + print "onresetproduct.badnode" + if self.currentpage == self.PMM_PMVPage: + self.pmm_pmv_form.clearForm() + elif self.currentpage == self.PM_PVPage: + self.pm_pv_form.clearForm() self.BrowseMode(True) else: - #print "onresetproduct.notree" + print "onresetproduct.notree" + if self.currentpage == self.PMM_PMVPage: + self.pmm_pmv_form.clearForm() + elif self.currentpage == self.PM_PVPage: + self.pm_pv_form.clearForm() self.BrowseMode(True) + + if self.DataManager.creatingPMM_PMV: + self.DataManager.creatingPMM_PMV = False + if self.DataManager.creatingPM_PV: + self.DataManager.creatingPM_PV = False self.editingtab = None def OnEditProduct(self, event): #print "itemeditframe.oneditproduct", self.currentpage - self.DataManager.creatingItem = True + #self.DataManager.creatingItem = True self.editingtab = self.currentpage self.EditItem = True # print "edit itemid: " + self.currentproduct.pgpdm_oid # print "edit item: " + self.currentproduct.NameCode if self.currentpage == self.PM_PVPage: + self.DataManager.creatingPM_PV = True + self.DataManager.creatingPMM_PMV = False #print "edit pm/pv" if self.pm_pv_form.GetTogglePm().GetValue(): self.pm_pv_form.EditingProductMaster = 1 @@ -1061,6 +1106,8 @@ self.pm_pv_form.EditingMode() elif self.currentpage == self.PMM_PMVPage: + self.DataManager.creatingPMM_PMV = True + self.DataManager.creatingPM_PV = False #print "edit pmm/pmv" if self.pmm_pmv_form.GetTogglePmm().GetValue(): self.pmm_pmv_form.EditingProductModelMaster = 1 @@ -1096,7 +1143,9 @@ elif self.currentpage == self.PMM_PMVPage: self.pmm_pmv_form.GetNewMmMv().SetFocus() - self.DataManager.creatingItem = False + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False + #self.DataManager.creatingItem = False self.DataManager.refresh = True ## print "call rebuild from save item" self.Parent.GetPSMTool().RebuildMainTree() @@ -1435,13 +1484,17 @@ @type event: wxEvent @param event: wxEvent Object passed by event loop """ - self.DataManager.creatingItem = True + #self.DataManager.creatingItem = True #print self.currentpage self.editingtab = self.currentpage if self.currentpage == self.PMM_PMVPage: + self.DataManager.creatingPMM_PMV = True + self.DataManager.creatingPM_PV = False #print 'on pmm page' self.pmm_pmv_form.CreatingMode() elif self.currentpage == self.PM_PVPage: + self.DataManager.creatingPM_PV = True + self.DataManager.creatingPMM_PMV = False #print 'on pm page' self.pm_pv_form.CreatingMode() @@ -1597,7 +1650,9 @@ self.Parent.GetPSMTool().RebuildMainTree() self.DataManager.creatingPartsList = False - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False self.rootpdrid = None self.rootitemid = None self.rootnauoid = None @@ -1839,11 +1894,14 @@ treedata = self.itemtree.GetPyData(treeitem) self.currentitemdata = treedata - if self.DataManager.creatingItem: + #if self.DataManager.creatingItem: + if self.DataManager.creatingPM_PV or self.DataManager.creatingPMM_PMV: dlg = wxMessageDialog(self, "Discard unsaved Item changes?", "Unsaved Data", wxOK | wxCANCEL | wxICON_EXCLAMATION) if dlg.ShowModal() == wxID_OK: - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False else: # print "cancel" browse = False @@ -1984,7 +2042,8 @@ #print "itemeditframe.changesmade" retval = False if self.vsplitter.IsSplit(): - if self.DataManager.creatingItem: + #if self.DataManager.creatingItem: + if self.DataManager.creatingPM_PV or self.DataManager.creatingPMM_PMV: tmp = ProductModelVersion(id_context = self.DataManager.currentProject) self.pm_pv_form.FillFormWithPMData(tmp._of_master) self.pm_pv_form.FillFormWithPVData(tmp._of_version) @@ -2016,7 +2075,11 @@ retval = True else: - if self.DataManager.creatingPartsList or self.DataManager.creatingItem or self.DataManager.creatingDocument: + #if self.DataManager.creatingItem or + if self.DataManager.creatingPMM_PMV or \ + self.DataManager.creatingPM_PV or \ + self.DataManager.creatingItem or \ + self.DataManager.creatingDocument: retval = True else: self.pm_pv_form.clearForm() @@ -2041,9 +2104,17 @@ preferences.CreatePreferencesFile(preferences.prefs) self.otherdocform.NextDocId = str(int(self.otherdocform.NextDocId) - 1) + if self.DataManager.creatingPMM_PMV: + self.pmm_pmv_form.revertNextPmvId() + + if self.DataManager.creatingPM_PV: + self.pm_pv_form.revertNextPvId() + self.DataManager.creatingDocument = False self.DataManager.creatingPartsList = False - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False def SaveDocChanges(self): @@ -2132,7 +2203,8 @@ def SaveItemChanges(self): - if self.DataManager.creatingItem: + #if self.DataManager.creatingItem: + if self.DataManager.creatingPMM_PMV or self.DataManager.creatingPM_PV: newitem = ProductModelVersion(id_context = self.DataManager.currentProject) self.pm_pv_form.Save(newitem) self.pmm_pmv_form.Save(newitem) @@ -2149,7 +2221,9 @@ self.pmm_pmv_form.EditingMode() return False - self.DataManager.creatingItem = False + #self.DataManager.creatingItem = False + self.DataManager.creatingPMM_PMV = False + self.DataManager.creatingPM_PV = False self.DataManager.localDB.Add([newitem]) allprojlist = self.DataManager.localDB.GetProjectObjects() if allprojlist.has_key(self.State.currentproject): Index: PanGalactic/pangalactic/client/modules/psm/pgeftree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.28 PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.29 --- PanGalactic/pangalactic/client/modules/psm/pgeftree.py:1.28 Wed Oct 8 11:30:46 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgeftree.py Fri Oct 24 14:52:49 2003 @@ -9,7 +9,7 @@ import pangalactic.utils.objectstatus as objectstatus import cPickle, types -__version__ = "$Revision: 1.28 $"[11:-2] +__version__ = "$Revision: 1.29 $"[11:-2] class PgefTree(wxTreeCtrl): @@ -258,7 +258,6 @@ self.SetItemHasChildren(treeid, true) self.SortChildren(roottreenode) - #print "loadtreefromproject: calling expand" self.Expand(roottreenode) Index: PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.6 PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.7 --- PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py:1.6 Thu Oct 9 13:00:19 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefversiontree.py Fri Oct 24 14:52:49 2003 @@ -25,7 +25,6 @@ def LoadTreefromProject(self, datamanager, rootitemid, rootpdrid, currentdata = None): """Loads the tree from the dicts in the DataManager""" - #self.DeleteAllItems() #rootitem = datamanager.localDB.GetItem(rootitemid) #foo = rootitem.of_pm_id + "." + rootitem.of_pv_id @@ -82,14 +81,19 @@ pass def buildVersionString(self, obj): + #print "pgefversiontree.buildversionstring" if obj.__class__.__name__ == 'ProductModelVersion': - temp = obj.of_pmm_id + '.' + obj.of_pv_id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context + #temp = obj.of_pmm_id + '.' + obj.of_pv_id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context + temp = obj.of_pmm_id + '.' + obj.of_pv_id + '.' + obj.of_pm_id elif obj.__class__.__name__ == 'ProductModelMaster': - temp = obj.of_pv_id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context + #temp = obj.of_pv_id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context + temp = obj.of_pv_id + '.' + obj.of_pm_id elif obj.__class__.__name__ == 'ProductVersion': - temp = obj.id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context + #temp = obj.id + '.' + obj.of_pm_id + '.' + obj.of_pm_id_context + temp = obj.id + '.' + obj.of_pm_id elif obj.__class__.__name__ == 'ProductMaster': temp = obj.id + #print "temp", temp return temp def LoadTreefromObjects(self, datamanager, rootproduct): @@ -105,13 +109,14 @@ temp_pmv = None temp_pv = None + classname = rootproduct.__class__.__name__ - if rootproduct.__class__.__name__ == 'ProductMaster': + if classname == 'ProductMaster': temp_pm = rootproduct else: temp_pm = rootproduct._of_master - if rootproduct.__class__.__name__ == 'ProductVersion': + if classname == 'ProductVersion': temp_pv = rootproduct else: try: @@ -119,8 +124,7 @@ except AttributeError: pass - - if rootproduct.__class__.__name__ == 'ProductModelMaster': + if classname == 'ProductModelMaster': temp_pmm = rootproduct else: try: @@ -128,30 +132,30 @@ except AttributeError: pass - - if rootproduct.__class__.__name__ == 'ProductModelVersion': + if classname == 'ProductModelVersion': temp_pmv = rootproduct - - rootnode = self.GetRootItem() if temp_pm: - spam = temp_pm.id + "." + temp_pm.id_context + #spam = temp_pm.id + "." + temp_pm.id_context + spam = temp_pm.id pm_treeid = self.AppendItem(rootnode, spam) self.Expand(pm_treeid) version_obj = temp_pm version_node = pm_treeid if temp_pv: - spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + #spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + spam = temp_pm.id + "." + temp_pv.id pv_treeid = self.AppendItem(pm_treeid, spam) self.Expand(pv_treeid) version_obj = temp_pv version_node = pv_treeid if temp_pmm: - spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + '.' + temp_pmm.id + #spam = temp_pm.id + "." + temp_pm.id_context + '.' + temp_pv.id + '.' + temp_pmm.id + spam = temp_pm.id + "." + temp_pv.id + '.' + temp_pmm.id pmm_treeid = self.AppendItem(pv_treeid, spam) self.Expand(pmm_treeid) version_obj = temp_pmm @@ -164,15 +168,12 @@ for obj in objs: if obj.state <> objectstatus.DELETE: - treelabel = self.createTreeLabel(obj) treeid = self.AppendItem(version_node, treelabel) self.SetPyData(treeid, ['version', obj.pgef_oid]) self.SetItemImage(treeid, self.itemicon) self.SetItemImage(treeid, self.itemicon, wxTreeItemIcon_Selected) - - self.Expand(rootnode) if temp_pm: self.Expand(pm_treeid) @@ -183,13 +184,19 @@ self.SelectItem(version_node) def createTreeLabel(self, obj): - if obj.__class__.__name__ == 'ProductModelVersion': - temp = '%s.%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id) - elif obj.__class__.__name__ == 'ProductModelMaster': - temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id) - elif obj.__class__.__name__ == 'ProductVersion': - temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.id) - elif obj.__class__.__name__ == 'ProductMaster': + #print "pgefversiontree.createtreelabel" + classname = obj.__class__.__name__ + if classname == 'ProductModelVersion': + #temp = '%s.%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.of_pmm_id, obj.id) + temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pv_id, obj.of_pmm_id, obj.id) + elif classname == 'ProductModelMaster': + #temp = '%s.%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.of_pv_id, obj.id) + temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pv_id, obj.id) + elif classname == 'ProductVersion': + #temp = '%s.%s.%s' % (obj.of_pm_id, obj.of_pm_id_context, obj.id) + temp = '%s.%s' % (obj.of_pm_id, obj.id) + elif classname == 'ProductMaster': temp = '%s.%s' % (obj.id, obj.id_context) + #print "temp", temp return temp Index: PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py diff -u PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.4 PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.5 --- PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py:1.4 Tue Oct 21 17:25:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/productdataform_wdr.py Fri Oct 24 14:52:49 2003 @@ -22,6 +22,7 @@ ID_PMM_DESC = wxNewId() ID_TOGGLE_PMV = wxNewId() ID_PMV_REVISION = wxNewId() +ID_PMV_REVISION_TAG = wxNewId() ID_PMV_NAME = wxNewId() ID_PMV_POC = wxNewId() ID_PMV_NOMENCLATURE = wxNewId() @@ -127,40 +128,47 @@ item29 = wxFlexGridSizer( 0, 2, 1, 0 ) item29.AddGrowableCol( 1 ) - item29.AddGrowableRow( 4 ) + item29.AddGrowableRow( 5 ) - item30 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 ) - item29.AddWindow( item30, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) + item30 = wxStaticText( parent, ID_TEXT, "Version Id", wxDefaultPosition, wxDefaultSize, 0 ) + item29.AddWindow( item30, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ) - item31 = wxTextCtrl( parent, ID_PMV_REVISION, "", wxDefaultPosition, wxSize(230,-1), 0 ) - item29.AddWindow( item31, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) + item31 = wxStaticText( parent, ID_PMV_REVISION, " ", wxDefaultPosition, wxDefaultSize, 0 ) + item31.SetForegroundColour( wxBLUE ) + item29.AddWindow( item31, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ) - item32 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 ) + item32 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 ) item29.AddWindow( item32, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item33 = wxTextCtrl( parent, ID_PMV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 ) - item33.SetToolTip( wxToolTip("Name of the component") ) + item33 = wxTextCtrl( parent, ID_PMV_REVISION_TAG, "", wxDefaultPosition, wxSize(80,-1), 0 ) item29.AddWindow( item33, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) - item34 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 ) + item34 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 ) item29.AddWindow( item34, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item35 = wxTextCtrl( parent, ID_PMV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 ) - item35.SetToolTip( wxToolTip("Organization/Point of Contact for this component") ) + item35 = wxTextCtrl( parent, ID_PMV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 ) + item35.SetToolTip( wxToolTip("Name of the component") ) item29.AddWindow( item35, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) - item36 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 ) + item36 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 ) item29.AddWindow( item36, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item37 = wxTextCtrl( parent, ID_PMV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 ) - item37.SetToolTip( wxToolTip("Code for component name") ) + item37 = wxTextCtrl( parent, ID_PMV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 ) + item37.SetToolTip( wxToolTip("Organization/Point of Contact for this component") ) item29.AddWindow( item37, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) - item38 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 ) - item29.AddWindow( item38, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 ) + item38 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 ) + item29.AddWindow( item38, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item39 = wxTextCtrl( parent, ID_PMV_DESC, "", wxDefaultPosition, wxSize(300,60), wxTE_MULTILINE|wxVSCROLL ) - item29.AddWindow( item39, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 ) + item39 = wxTextCtrl( parent, ID_PMV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 ) + item39.SetToolTip( wxToolTip("Code for component name") ) + item29.AddWindow( item39, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) + + item40 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 ) + item29.AddWindow( item40, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 ) + + item41 = wxTextCtrl( parent, ID_PMV_DESC, "", wxDefaultPosition, wxSize(300,60), wxTE_MULTILINE|wxVSCROLL ) + item29.AddWindow( item41, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxBOTTOM, 5 ) item27.AddSizer( item29, 1, wxGROW|wxRIGHT, 5 ) @@ -172,41 +180,41 @@ item0.AddSizer( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ) - item40 = wxFlexGridSizer( 5, 0, 0, 0 ) + item42 = wxFlexGridSizer( 5, 0, 0, 0 ) - item41 = wxBoxSizer( wxHORIZONTAL ) + item43 = wxBoxSizer( wxHORIZONTAL ) - item42 = wxButton( parent, ID_NEW_MM_MV, "New", wxDefaultPosition, wxDefaultSize, 0 ) - item42.SetToolTip( wxToolTip("Create a new component in the currently selected project") ) - item41.AddWindow( item42, 0, wxALIGN_CENTER|wxLEFT, 5 ) + item44 = wxButton( parent, ID_NEW_MM_MV, "New", wxDefaultPosition, wxDefaultSize, 0 ) + item44.SetToolTip( wxToolTip("Create a new component in the currently selected project") ) + item43.AddWindow( item44, 0, wxALIGN_CENTER|wxLEFT, 5 ) - item43 = wxButton( parent, ID_EDIT_MM_MV, "Edit", wxDefaultPosition, wxDefaultSize, 0 ) - item43.SetToolTip( wxToolTip("Edit the selected component") ) - item41.AddWindow( item43, 0, wxALIGN_CENTER, 5 ) + item45 = wxButton( parent, ID_EDIT_MM_MV, "Edit", wxDefaultPosition, wxDefaultSize, 0 ) + item45.SetToolTip( wxToolTip("Edit the selected component") ) + item43.AddWindow( item45, 0, wxALIGN_CENTER, 5 ) - item44 = wxButton( parent, ID_SAVE_MM_MV, "Save", wxDefaultPosition, wxDefaultSize, 0 ) - item44.SetToolTip( wxToolTip("Save the component to local storage") ) - item41.AddWindow( item44, 0, wxALIGN_CENTER, 5 ) + item46 = wxButton( parent, ID_SAVE_MM_MV, "Save", wxDefaultPosition, wxDefaultSize, 0 ) + item46.SetToolTip( wxToolTip("Save the component to local storage") ) + item43.AddWindow( item46, 0, wxALIGN_CENTER, 5 ) - item45 = wxButton( parent, ID_RESET_MM_MV_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 ) - item45.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") ) - item41.AddWindow( item45, 0, wxALIGN_CENTER|wxRIGHT, 5 ) + item47 = wxButton( parent, ID_RESET_MM_MV_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 ) + item47.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") ) + item43.AddWindow( item47, 0, wxALIGN_CENTER|wxRIGHT, 5 ) - item46 = wxButton( parent, DELETE_MM_MV, "Delete", wxDefaultPosition, wxDefaultSize, 0 ) - item46.SetToolTip( wxToolTip("Delete the association between the parent and child components") ) - item41.AddWindow( item46, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ) + item48 = wxButton( parent, DELETE_MM_MV, "Delete", wxDefaultPosition, wxDefaultSize, 0 ) + item48.SetToolTip( wxToolTip("Delete the association between the parent and child components") ) + item43.AddWindow( item48, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ) - item40.AddSizer( item41, 0, wxALIGN_CENTER|wxALL, 5 ) + item42.AddSizer( item43, 0, wxALIGN_CENTER|wxALL, 5 ) - item47 = wxBoxSizer( wxHORIZONTAL ) + item49 = wxBoxSizer( wxHORIZONTAL ) - item48 = wxButton( parent, ID_MM_MV_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 ) - item48.SetToolTip( wxToolTip("Close the window") ) - item47.AddWindow( item48, 0, wxALIGN_CENTER|wxRIGHT, 5 ) + item50 = wxButton( parent, ID_MM_MV_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 ) + item50.SetToolTip( wxToolTip("Close the window") ) + item49.AddWindow( item50, 0, wxALIGN_CENTER|wxRIGHT, 5 ) - item40.AddSizer( item47, 0, wxALIGN_CENTER|wxALL, 5 ) + item42.AddSizer( item49, 0, wxALIGN_CENTER|wxALL, 5 ) - item0.AddSizer( item40, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) + item0.AddSizer( item42, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) if set_sizer == True: parent.SetAutoLayout( True ) @@ -225,6 +233,7 @@ ID_PM_DESC = wxNewId() ID_TOGGLE_PV = wxNewId() ID_PV_REVISION = wxNewId() +ID_PV_REVISION_TAG = wxNewId() ID_PV_NAME = wxNewId() ID_PV_POC = wxNewId() ID_PV_NOMENCLATURE = wxNewId() @@ -304,40 +313,47 @@ item22 = wxFlexGridSizer( 0, 2, 1, 0 ) item22.AddGrowableCol( 1 ) - item22.AddGrowableRow( 4 ) + item22.AddGrowableRow( 5 ) - item23 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 ) - item22.AddWindow( item23, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) + item23 = wxStaticText( parent, ID_TEXT, "Version Id", wxDefaultPosition, wxDefaultSize, 0 ) + item22.AddWindow( item23, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT|wxTOP, 5 ) - item24 = wxTextCtrl( parent, ID_PV_REVISION, "", wxDefaultPosition, wxSize(230,-1), 0 ) - item22.AddWindow( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) + item24 = wxStaticText( parent, ID_PV_REVISION, " ", wxDefaultPosition, wxDefaultSize, 0 ) + item24.SetForegroundColour( wxBLUE ) + item22.AddWindow( item24, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT|wxTOP, 5 ) - item25 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 ) + item25 = wxStaticText( parent, ID_TEXT, "Revision", wxDefaultPosition, wxDefaultSize, 0 ) item22.AddWindow( item25, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item26 = wxTextCtrl( parent, ID_PV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 ) - item26.SetToolTip( wxToolTip("Name of the component") ) + item26 = wxTextCtrl( parent, ID_PV_REVISION_TAG, "", wxDefaultPosition, wxSize(200,-1), 0 ) item22.AddWindow( item26, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) - item27 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 ) + item27 = wxStaticText( parent, ID_TEXT, "Name", wxDefaultPosition, wxDefaultSize, 0 ) item22.AddWindow( item27, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item28 = wxTextCtrl( parent, ID_PV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 ) - item28.SetToolTip( wxToolTip("Organization/Point of Contact for this component") ) + item28 = wxTextCtrl( parent, ID_PV_NAME, "", wxDefaultPosition, wxSize(230,-1), 0 ) + item28.SetToolTip( wxToolTip("Name of the component") ) item22.AddWindow( item28, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) - item29 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 ) + item29 = wxStaticText( parent, ID_TEXT, "Point of Contact", wxDefaultPosition, wxDefaultSize, 0 ) item22.AddWindow( item29, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) - item30 = wxTextCtrl( parent, ID_PV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 ) - item30.SetToolTip( wxToolTip("Code for component name") ) + item30 = wxTextCtrl( parent, ID_PV_POC, "", wxDefaultPosition, wxSize(230,-1), 0 ) + item30.SetToolTip( wxToolTip("Organization/Point of Contact for this component") ) item22.AddWindow( item30, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) - item31 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 ) - item22.AddWindow( item31, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 ) + item31 = wxStaticText( parent, ID_TEXT, "Nomenclature", wxDefaultPosition, wxDefaultSize, 0 ) + item22.AddWindow( item31, 0, wxALIGN_RIGHT|wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ) + + item32 = wxTextCtrl( parent, ID_PV_NOMENCLATURE, "", wxDefaultPosition, wxSize(300,-1), 0 ) + item32.SetToolTip( wxToolTip("Code for component name") ) + item22.AddWindow( item32, 0, wxGROW|wxALIGN_CENTER_VERTICAL|wxRIGHT, 5 ) + + item33 = wxStaticText( parent, ID_TEXT, "Description", wxDefaultPosition, wxDefaultSize, 0 ) + item22.AddWindow( item33, 0, wxALIGN_RIGHT|wxLEFT|wxRIGHT, 5 ) - item32 = wxTextCtrl( parent, ID_PV_DESC, "", wxDefaultPosition, wxSize(300,-1), wxTE_MULTILINE|wxVSCROLL ) - item22.AddWindow( item32, 0, wxGROW|wxRIGHT|wxBOTTOM, 5 ) + item34 = wxTextCtrl( parent, ID_PV_DESC, "", wxDefaultPosition, wxSize(300,-1), wxTE_MULTILINE|wxVSCROLL ) + item22.AddWindow( item34, 0, wxGROW|wxRIGHT|wxBOTTOM, 5 ) item20.AddSizer( item22, 1, wxGROW|wxRIGHT, 5 ) @@ -349,41 +365,41 @@ item0.AddSizer( item1, 1, wxGROW|wxALIGN_CENTER_VERTICAL|wxALL, 5 ) - item33 = wxFlexGridSizer( 5, 0, 0, 0 ) + item35 = wxFlexGridSizer( 5, 0, 0, 0 ) - item34 = wxBoxSizer( wxHORIZONTAL ) + item36 = wxBoxSizer( wxHORIZONTAL ) - item35 = wxButton( parent, ID_NEW_M_V, "New", wxDefaultPosition, wxDefaultSize, 0 ) - item35.SetToolTip( wxToolTip("Create a new component in the currently selected project") ) - item34.AddWindow( item35, 0, wxALIGN_CENTER|wxLEFT, 5 ) + item37 = wxButton( parent, ID_NEW_M_V, "New", wxDefaultPosition, wxDefaultSize, 0 ) + item37.SetToolTip( wxToolTip("Create a new component in the currently selected project") ) + item36.AddWindow( item37, 0, wxALIGN_CENTER|wxLEFT, 5 ) - item36 = wxButton( parent, ID_EDIT_M_V, "Edit", wxDefaultPosition, wxDefaultSize, 0 ) - item36.SetToolTip( wxToolTip("Edit the selected component") ) - item34.AddWindow( item36, 0, wxALIGN_CENTER, 5 ) + item38 = wxButton( parent, ID_EDIT_M_V, "Edit", wxDefaultPosition, wxDefaultSize, 0 ) + item38.SetToolTip( wxToolTip("Edit the selected component") ) + item36.AddWindow( item38, 0, wxALIGN_CENTER, 5 ) - item37 = wxButton( parent, ID_SAVE_M_V, "Save", wxDefaultPosition, wxDefaultSize, 0 ) - item37.SetToolTip( wxToolTip("Save the component to local storage") ) - item34.AddWindow( item37, 0, wxALIGN_CENTER, 5 ) + item39 = wxButton( parent, ID_SAVE_M_V, "Save", wxDefaultPosition, wxDefaultSize, 0 ) + item39.SetToolTip( wxToolTip("Save the component to local storage") ) + item36.AddWindow( item39, 0, wxALIGN_CENTER, 5 ) - item38 = wxButton( parent, ID_RESET_M_V_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 ) - item38.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") ) - item34.AddWindow( item38, 0, wxALIGN_CENTER|wxRIGHT, 5 ) + item40 = wxButton( parent, ID_RESET_M_V_FORM, "Cancel", wxDefaultPosition, wxDefaultSize, 0 ) + item40.SetToolTip( wxToolTip("Reset (clear) the fields for an unsaved component") ) + item36.AddWindow( item40, 0, wxALIGN_CENTER|wxRIGHT, 5 ) - item39 = wxButton( parent, DELETE_M_V, "Delete", wxDefaultPosition, wxDefaultSize, 0 ) - item39.SetToolTip( wxToolTip("Delete the association between the parent and child components") ) - item34.AddWindow( item39, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ) + item41 = wxButton( parent, DELETE_M_V, "Delete", wxDefaultPosition, wxDefaultSize, 0 ) + item41.SetToolTip( wxToolTip("Delete the association between the parent and child components") ) + item36.AddWindow( item41, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT, 5 ) - item33.AddSizer( item34, 0, wxALIGN_CENTER|wxALL, 5 ) + item35.AddSizer( item36, 0, wxALIGN_CENTER|wxALL, 5 ) - item40 = wxBoxSizer( wxHORIZONTAL ) + item42 = wxBoxSizer( wxHORIZONTAL ) - item41 = wxButton( parent, ID_M_V_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 ) - item41.SetToolTip( wxToolTip("Close the window") ) - item40.AddWindow( item41, 0, wxALIGN_CENTER|wxRIGHT, 5 ) + item43 = wxButton( parent, ID_M_V_CLOSE, "Close", wxDefaultPosition, wxDefaultSize, 0 ) + item43.SetToolTip( wxToolTip("Close the window") ) + item42.AddWindow( item43, 0, wxALIGN_CENTER|wxRIGHT, 5 ) - item33.AddSizer( item40, 0, wxALIGN_CENTER|wxALL, 5 ) + item35.AddSizer( item42, 0, wxALIGN_CENTER|wxALL, 5 ) - item0.AddSizer( item33, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) + item0.AddSizer( item35, 0, wxALIGN_CENTER|wxLEFT|wxRIGHT|wxBOTTOM, 0 ) if set_sizer == True: parent.SetAutoLayout( True ) Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.120 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.121 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.120 Thu Oct 23 15:53:13 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Fri Oct 24 14:52:49 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.120 $"[11:-2] +__version__ = "$Revision: 1.121 $"[11:-2] import os import sys @@ -122,43 +122,47 @@ self.SetSize (self.Parent.GetClientSize()) # will occupy the space not used by the Layout Algorithm - self.remainingSpace = wxNotebook(self, -1, wxDefaultPosition, wxSize(200,200)) + self.grid_notebook = wxNotebook(self, -1, wxDefaultPosition, wxSize(200, 200)) # Create Grid to hold Product model versions - self.itemgrid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_main_grid', + self.itemgrid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_main_grid', dbroot = self.DataManager.localDB.dbroot) self.itemgrid.GetGridWindow().SetToolTip(wxToolTip("A tabular display of the data in the products " + "of the currently selected project.\n" + "Doubleclick on a product to display the Product Editor.\n" + "Press to drag a Product into the hierarchy.")) self.itemgrid.EnableEditing(false) - self.remainingSpace.AddPage(self.itemgrid, "Product Models") + self.grid_notebook.AddPage(self.itemgrid, "Product Models") + self.itemgrid.Fit() #Create grid to hold Product Model Masters - self.model_master_grid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_model_master_grid', + self.model_master_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_model_master_grid', dbroot = self.DataManager.localDB.dbroot) self.model_master_grid.EnableEditing(false) - self.remainingSpace.AddPage(self.model_master_grid, "Model Masters") + self.grid_notebook.AddPage(self.model_master_grid, "Model Masters") + self.model_master_grid.Fit() #Create grid to hold Product Versions - self.product_version_grid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_product_version_grid', + self.product_version_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_product_version_grid', dbroot = self.DataManager.localDB.dbroot) self.product_version_grid.EnableEditing(false) - self.remainingSpace.AddPage(self.product_version_grid, "Product Versions") + self.grid_notebook.AddPage(self.product_version_grid, "Product Versions") + self.product_version_grid.Fit() #Create grid to hold Product Masters - self.product_master_grid = pgefgrid.PgefGrid(self.remainingSpace, -1, savename = 'psmtool_product_master_grid', + self.product_master_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_product_master_grid', dbroot = self.DataManager.localDB.dbroot) self.product_master_grid.EnableEditing(false) - self.remainingSpace.AddPage(self.product_master_grid, "Product Masters") + self.grid_notebook.AddPage(self.product_master_grid, "Product Masters") + self.product_master_grid.Fit() #create the splitter window that holds the shell window - win = wxSplitterWindow(self.remainingSpace, -1, size=(640, 480)) + win = wxSplitterWindow(self.grid_notebook, -1, size=(640, 480)) shellWin = shell.Shell(win, -1) shellWin.interp.locals['pgef'] = self.Parent fillingWin = filling.Filling(win, -1, size = (640, 480), rootObject = self.Parent, rootIsNamespace = 1) win.SplitHorizontally(shellWin, fillingWin) - self.remainingSpace.AddPage(win, "shell") + self.grid_notebook.AddPage(win, "shell") # Create some layout windows # A window like a toolbar @@ -214,7 +218,7 @@ self.leftWindow = win - wxLayoutAlgorithm().LayoutWindow(self, self.remainingSpace) + wxLayoutAlgorithm().LayoutWindow(self, self.grid_notebook) self.Layout() self.itemlistcount = None @@ -272,11 +276,11 @@ EVT_LEFT_DCLICK(self.tree, self.OnEditComponent) EVT_COMBOBOX(self, ID_CHOICE_VIEW, self.SelectView) - EVT_NOTEBOOK_PAGE_CHANGED(self, self.remainingSpace.GetId(), self.pageChanged) + EVT_NOTEBOOK_PAGE_CHANGED(self, self.grid_notebook.GetId(), self.pageChanged) def onGridClickGetVersions(self, event): - #print 'model master grid was clicked' + #print "psmtool.ongridclickgetversions" ndx = event.GetRow() grid = event.GetEventObject() obj = grid.GetDataObj(ndx) @@ -290,13 +294,13 @@ def pageChanged(self, event): - currentpage = self.remainingSpace.GetSelection() + currentpage = self.grid_notebook.GetSelection() if currentpage != 0: self.tree_notebook.SetSelection(1) #print 'changed tree' def GetCurrentGrid(self): - currentpage = self.remainingSpace.GetSelection() + currentpage = self.grid_notebook.GetSelection() if GRIDLIST[currentpage] == "ProductModelVersion": currentgrid = self.itemgrid elif GRIDLIST[currentpage] == "ProductModelMaster": @@ -532,6 +536,8 @@ pane = 0 elif product_type in ["ProductModelMaster", "ProductModelVersion"]: pane = 1 + else: + raise TypeError, "I have NO idea what product type this is " + product_type self.ShowEditFrame(pane, splitter = 1, nodedata = nodedata) self.itemeditform.SetMode(pane, mode = itemeditframe.NEW_MODE) #print "end onnewitem" @@ -758,7 +764,7 @@ pass def UpdateForLogin(self): - print "\npsmtool.updateforlogin" + #print "\npsmtool.updateforlogin" if self.DataManager.user._loggedin: self.topWindow.toppanel.FillProjectWidget(self.DataManager.projects, "Select a Project") wgt = self.topWindow.toppanel.GetItemWidget() @@ -885,13 +891,13 @@ elif eID == self.ID_WINDOW_LEFT: self.leftWindow.SetDefaultSize(wxSize(event.GetDragRect().width, 600)) #tbd - wxLayoutAlgorithm().LayoutWindow(self, self.remainingSpace) - self.remainingSpace.Refresh() + wxLayoutAlgorithm().LayoutWindow(self, self.grid_notebook) + self.grid_notebook.Refresh() def OnSize(self, event): self.SetSize(self.Parent.GetClientSize()) - wxLayoutAlgorithm().LayoutWindow(self, self.remainingSpace) + wxLayoutAlgorithm().LayoutWindow(self, self.grid_notebook) self.Layout() @@ -1002,11 +1008,11 @@ def OnSelectProject(self, event = None): - print "\npsmtool.onselectproject" + #print "\npsmtool.onselectproject" wgt = self.topWindow.toppanel.GetProjectWidget() project = wgt.GetStringSelection() ndx = wgt.GetSelection() - print "project, ndx", project, ndx + #print "project, ndx", project, ndx if ndx == 0: if self.State.currentproject: wgt.SetStringSelection(self.State.currentproject) @@ -1020,8 +1026,8 @@ def changeProject(self, ndx, project): - print "\npsmtool.changeProject" - print "project ndx", project, ndx + #print "\npsmtool.changeProject" + #print "project ndx", project, ndx self.DataManager.setCurrentProject(project) @@ -1035,7 +1041,7 @@ dlg = None if self.DataManager.user._loggedin: - print "psmtool.changeproject.logged in" + #print "psmtool.changeproject.logged in" wxBeginBusyCursor() try: self.topWindow.toppanel.GetItemWidget().SetFocus() @@ -1072,7 +1078,7 @@ wxEndBusyCursor() else: - print "psmtool.changeProject.notloggedin" + #print "psmtool.changeProject.notloggedin" wxSafeYield() wxBeginBusyCursor() wxSafeYield() @@ -1086,7 +1092,7 @@ if ndx > 0: project = self.topWindow.toppanel.GetProjectWidget().GetStringSelection() #print "project", project - #self.remainingSpace.SetPageText(self.remainingSpace.GetSelection(), 'Product Models') + #self.grid_notebook.SetPageText(self.grid_notebook.GetSelection(), 'Product Models') self.State.currentproject = project self.tree.nodeStack.append(self.tree.AddRoot(project)) @@ -1104,7 +1110,7 @@ self.UpdateWindows() self.SecureMenu() wxEndBusyCursor() - print "end psmtool.changeProject" + #print "end psmtool.changeProject" def UpdateWindows(self): if self.projectframe: @@ -1317,7 +1323,7 @@ wgt = self.topWindow.toppanel.GetProjectWidget() ndx = wgt.GetSelection() project = wgt.GetStringSelection() - print "psmtool.setupforlocalmode", project, ndx + #print "psmtool.setupforlocalmode", project, ndx self.changeProject(ndx, project) def SetupForLogin(self): @@ -1349,36 +1355,25 @@ def ShowTopLevelItems(self): dlg = None - #print "showtoplevelitems" + #print "psmtool.showtoplevelitems" #print self.State.currentproject - for key, value in self.DataManager.localDB.GetACUDict().items(): + #for key, value in self.DataManager.localDB.GetACUDict().items(): #print "acu" #print value.name, value.pgef_oid - break + #break + if self.DataManager.user._loggedin and self.State.currentproject: #print "logged in" #print "toplevelitemids", self.DataManager.topLevelItemIDs try: -# wxSafeYield() - wxBeginBusyCursor() -# dlg = wxDialog(self, -1, "A Message from PGEF", wxDefaultPosition, wxSize(400, 75), -# wxTHICK_FRAME) -# msg = wxStaticText(dlg, -1, "PGEF is retrieving the item data...", -# wxPoint (10, 10), wxDefaultSize, wxALIGN_CENTRE) -# dlg.CentreOnParent() -# dlg.Show(true) -# wxSafeYield() self.State.treeroot = self.State.currentproject self.tree.DeleteAllItems() self.DataManager.clearNauoIDs() self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs) self.itemgrid.ClearSelection() self.topWindow.toppanel.GetItemWidget().SetSelection(0) - - finally: - if dlg: - dlg.Destroy() - wxEndBusyCursor() + except: + pass else: #print "not logged in" @@ -1397,11 +1392,6 @@ #print "Local mode; no TopLevel items" self.DataManager.clearNauoIDs() self.tree.LoadTreefromProject(self, self.State.currentproject, []) - - #dlg = wxMessageDialog(self, "I'm sorry Steve, I can't do that...", "Unable to comply", - # wxOK|wxCENTRE|wxICON_EXCLAMATION) - #dlg.ShowModal() - #wxSafeYield() #print "end showtoplevelitems" @@ -1429,12 +1419,8 @@ return wxBeginBusyCursor() - -# self.FillEditFrame(nodedata) # only called here now, so moved code here. - pane = 1 product_id = nodedata[1] -# print "product_id", product_id self.ShowEditFrame(pane, 1, ["TREE", product_id, "ProductModelVersion"]) self.itemeditform.SetMode(pane) wxEndBusyCursor() @@ -1473,7 +1459,7 @@ def editGridObject(self, product_id, product_type): - print "psmtool.editgridobject", product_id, product_type + #print "psmtool.editgridobject", product_id, product_type dlg = None if self.DataManager.user._loggedin: @@ -1492,8 +1478,8 @@ elif product_type in ["ProductMaster", "ProductVersion"]: pane = 0 else: - print "pane??? what pane???" - + raise TypeError, "I have NO idea what product type this is " + product_type + self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type]) self.itemeditform.SetMode(pane) wxEndBusyCursor() @@ -1505,7 +1491,8 @@ elif product_type in ["ProductMaster", "ProductVersion"]: pane = 0 else: - print "pane??? what pane???" + raise TypeError, "I have NO idea what product type this is " + product_type + self.ShowEditFrame(pane, 1, ["GRID", product_id, product_type]) self.itemeditform.SetMode(pane) @@ -1519,8 +1506,6 @@ #print "psmtool.quickcreate" create_results = quickcreate.showQuickCreate(self) if create_results: - #print 'in psmtools, quickcreate' - #print 'sending %s to create function' % str(create_results) results = self.DataManager.quickCreate(create_results) if results[0]: #print " quick pm" Index: PanGalactic/pangalactic/enterprise/productversion.py diff -u PanGalactic/pangalactic/enterprise/productversion.py:1.23 PanGalactic/pangalactic/enterprise/productversion.py:1.24 --- PanGalactic/pangalactic/enterprise/productversion.py:1.23 Wed Oct 22 15:55:39 2003 +++ PanGalactic/pangalactic/enterprise/productversion.py Fri Oct 24 14:52:50 2003 @@ -1,12 +1,12 @@ -# $Id: productversion.py,v 1.23 2003/10/22 19:55:39 waterbug Exp $ +# $Id: productversion.py,v 1.24 2003/10/24 18:52:50 pbear Exp $ """ Version-dependent product data. -@version: $Revision: 1.23 $ +@version: $Revision: 1.24 $ """ -__version__ = "$Revision: 1.23 $"[11:-2] +__version__ = "$Revision: 1.24 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject from pangalactic.enterprise.project import Project @@ -60,7 +60,7 @@ 'of_pm_id_context' ] _schema_ext = { - 'id' : 'int', + 'id' : 'str', 'of_pm_id' : 'str', 'of_pm_id_context' : 'str', 'project_id' : 'str', Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.50 PanGalactic/pangalactic/utils/datamanager.py:1.51 --- PanGalactic/pangalactic/utils/datamanager.py:1.50 Thu Oct 23 15:06:20 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Fri Oct 24 14:52:50 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.50 $"[11:-2] +__version__ = "$Revision: 1.51 $"[11:-2] import time import mx.DateTime @@ -101,6 +101,7 @@ #print 'Creating product master' product_master = ProductMaster(id = PartNumber, project_id = self.currentProject, + creator = self.user.id, id_context = self.currentProject) #print product_master @@ -108,6 +109,7 @@ #print 'Creating product version' product_version = ProductVersion(_of_master = product_master, project_id = self.currentProject, + creator = self.user.id, id = Revision, id_context = self.currentProject) #print product_version @@ -116,6 +118,7 @@ #print 'Creating product model master' product_model_master = ProductModelMaster(_of_version = product_version, project_id = self.currentProject, + creator = self.user.id, id = ModelType, id_context = self.currentProject) @@ -123,6 +126,7 @@ #print 'Creating product model version' product_model_version = ProductModelVersion(_of_model_master = product_model_master, project_id = self.currentProject, + creator = self.user.id, id = ModelRev, id_context = self.currentProject) From pbear at ned.gsfc.nasa.gov Fri Oct 24 16:43:25 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Fri Oct 24 15:43:27 2003 Subject: [Pangalactic-commits] fixed tree redrawing on editor close and on product deselect via dropdown Message-ID: <200310241943.h9OJhPM7014653@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.121 1.122 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.24 1.25 Log message: fixed tree redrawing on editor close and on product deselect via dropdown Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.121 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.122 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.121 Fri Oct 24 14:52:49 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Fri Oct 24 15:43:23 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.121 $"[11:-2] +__version__ = "$Revision: 1.122 $"[11:-2] import os import sys @@ -133,7 +133,7 @@ "Press to drag a Product into the hierarchy.")) self.itemgrid.EnableEditing(false) self.grid_notebook.AddPage(self.itemgrid, "Product Models") - self.itemgrid.Fit() + self.itemgrid.Fit() # remove funny blank space in the first row of the grid, if it initially has a scrollbar #Create grid to hold Product Model Masters self.model_master_grid = pgefgrid.PgefGrid(self.grid_notebook, -1, savename = 'psmtool_model_master_grid', @@ -442,15 +442,16 @@ def RebuildMainTree(self): + #print "psmtool.rebuildmaintree" projectndx = self.topWindow.toppanel.GetProjectWidget().GetSelection() if projectndx > 0: itemndx = self.topWindow.toppanel.GetItemWidget().GetSelection() if itemndx > 0: itemndx -= 1 - - self.tree.DeleteAllItems() - self.ShowTopLevelItems() - + #self.tree.DeleteAllItems() + itemobj = self.topWindow.toppanel.GetItemObject(itemndx) + self.showItem(itemobj) + #self.ShowTopLevelItems() def CloseSearchFrame (self, event = None): if self.SearchFrame: @@ -945,8 +946,8 @@ self.Commit(closing) - def ItemClicked(self, itemobj): #ndx): - #print "psmtool.itemclicked" + def showItem(self, itemobj): #ndx): + #print "psmtool.showitem" # itemid = self.itemgrid.GetObjectOid(ndx) itemid = itemobj.pgef_oid self.State.treeroot = itemid @@ -979,6 +980,10 @@ #print "psmtool.onitemclick" ndx = self.topWindow.toppanel.GetItemWidget().GetSelection() if ndx == 0: + wgt = self.topWindow.toppanel.GetProjectWidget() + projndx = wgt.GetSelection() + project = wgt.GetString(projndx) + self.changeProject(ndx, project) # not the best way, but it works for now. vwk return else: ndx -= 1 @@ -998,7 +1003,7 @@ dlg.CentreOnParent() dlg.Show(true) wxSafeYield() - self.ItemClicked(itemobj) + self.showItem(itemobj) finally: if dlg: @@ -1371,7 +1376,7 @@ self.DataManager.clearNauoIDs() self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs) self.itemgrid.ClearSelection() - self.topWindow.toppanel.GetItemWidget().SetSelection(0) +# self.topWindow.toppanel.GetItemWidget().SetSelection(0) except: pass Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.24 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.25 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.24 Thu Oct 23 15:06:20 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Fri Oct 24 15:43:24 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.24 $ +@version: $Revision: 1.25 $ """ -__version__ = "$Revision: 1.24 $"[11:-2] +__version__ = "$Revision: 1.25 $"[11:-2] import xmlrpclib import types @@ -100,21 +100,21 @@ def getCategories(self, context): # Category is a subclass of DataElement. FSC is a # Category; it's passed in as the context - print "xmlrpc.getcategories", context + #print "xmlrpc.getcategories", context crit = {"id_context" : context} data = self._RPC.getObjects('Category', 0, 0, crit) if data: return [self._factory.remember(x) for x in data] def getOrganizations(self, context): - print "xmlrpc.getorganizations", context + #print "xmlrpc.getorganizations", context crit = {"id_context" : context} data = self._RPC.getObjects('Organization', 0, 0, crit) if data: return [self._factory.remember(x) for x in data] def getOrganization(self, ObjId): - print "xmlrpc.getorganization" + #print "xmlrpc.getorganization" data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId) if data: return [self._factory.remember(x) for x in data] @@ -126,13 +126,13 @@ is the _assembly (the object that contains the _component object). """ - print "in xmlrpcinterface.GetAcusByAssembly" + #print "in xmlrpcinterface.GetAcusByAssembly" acu = ACU(_assembly=assembly) keydict = dict([(a, getattr(acu, a)) for a in ACU._fk['_assembly']]) #print "keydict", keydict data = self._RPC.getObjects('AssemblyComponentUsage', 1, 0, keydict) if data: - print "have acus" + #print "have acus" return self._factory.rememberAll(data) def GetPerson(self, user_tuple): From waterbug at ned.gsfc.nasa.gov Mon Oct 27 15:02:47 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 27 15:02:58 2003 Subject: [Pangalactic-commits] Default value for pgef_class of a pgef_object is its actual Python class. Message-ID: <200310272002.h9RK2lt2010921@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefobject.py 1.28 1.29 Log message: Default value for pgef_class of a pgef_object is its actual Python class. Index: PanGalactic/pangalactic/enterprise/pgefobject.py diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.28 PanGalactic/pangalactic/enterprise/pgefobject.py:1.29 --- PanGalactic/pangalactic/enterprise/pgefobject.py:1.28 Fri Oct 17 16:49:53 2003 +++ PanGalactic/pangalactic/enterprise/pgefobject.py Mon Oct 27 15:02:45 2003 @@ -1,8 +1,8 @@ -# $Id: pgefobject.py,v 1.28 2003/10/17 20:49:53 waterbug Exp $ +# $Id: pgefobject.py,v 1.29 2003/10/27 20:02:45 waterbug Exp $ """ The Mother of all PGEF application classes. -@version: $Revision: 1.28 $ +@version: $Revision: 1.29 $ """ # TODO: @@ -24,7 +24,7 @@ # should we jettison this? # Nope. -__version__ = "$Revision: 1.28 $"[11:-2] +__version__ = "$Revision: 1.29 $"[11:-2] import types import string @@ -237,6 +237,9 @@ if not kw.get('pgef_oid'): self.create_datetime = DateTime.now() self.mod_datetime = DateTime.now() + # if no pgef_class is passed in, use our Python class ... + if not kw.get('pgef_class'): + self.pgef_class = self.__class__.__name__ def getGridMap(self, order=None, names=None, types=None): """ From waterbug at ned.gsfc.nasa.gov Mon Oct 27 15:16:57 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 27 15:16:59 2003 Subject: [Pangalactic-commits] Make _verifyAddExtract() return a simple list of resultsets (instead of a list of lists of rs). Message-ID: <200310272016.h9RKGvXU011501@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/pger.py 1.45 1.46 Log message: Make _verifyAddExtract() return a simple list of resultsets (instead of a list of lists of rs). Index: PanGalactic/pangalactic/repo/pger.py diff -u PanGalactic/pangalactic/repo/pger.py:1.45 PanGalactic/pangalactic/repo/pger.py:1.46 --- PanGalactic/pangalactic/repo/pger.py:1.45 Fri Oct 17 16:49:32 2003 +++ PanGalactic/pangalactic/repo/pger.py Mon Oct 27 15:16:56 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Entropy Reverser module -@version: $Revision: 1.45 $ +@version: $Revision: 1.46 $ """ -__version__ = "$Revision: 1.45 $"[11:-2] +__version__ = "$Revision: 1.46 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $ import time @@ -439,14 +439,9 @@ d = self._pgerdb.addRows(recs) d.addCallback(lambda x: self._verifyAddExtract(recs)) d.addCallback(lambda x: - [self._factory.resultset2Extract(rsl[0]) - for rsl in x]) + [self._factory.resultset2Extract(rs) + for rs in x]) return d - # okay, the "rsl[0]" is because _verifyAddExtract returns - # a list of *lists* of resultsets (sheesh!), but there - # is only one resultset in each list because getByRowKey - # just returns one record (it had better!) -- hence the - # rsl[0] is safe ... if weird def _verifyAddExtract(self, recs): """ @@ -457,11 +452,18 @@ @type records: list @param records: a list of records -- see L{pangalactic.repo.factory.extract2Record} + + @rtype: list + @return: list of resultsets, one for each record added """ - return defer.gatherResults( + d = defer.gatherResults( [self._pgerdb.getByRowKey( self._factory.record2RowKey(rec)) for rec in recs]) + return d.addCallback(lambda rsl: rsl[0]) + # rsl[0] is safe here because there should only be one + # resultset in the list of resultsets returned for a + # given RowKey. def _addExtractsError(self, error): """ From pbear at ned.gsfc.nasa.gov Mon Oct 27 15:41:43 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Mon Oct 27 15:41:44 2003 Subject: [Pangalactic-commits] added colour key to workflow instances; some bugs fixed Message-ID: <200310272041.h9RKfhZs012105@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/productdataform.py 1.31 1.32 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.122 1.123 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.8 1.9 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.17 1.18 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.20 1.21 PanGalactic/pangalactic/utils/dbbrowser.py 1.3 1.4 Log message: added colour key to workflow instances; some bugs fixed Index: PanGalactic/pangalactic/utils/dbbrowser.py diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.3 PanGalactic/pangalactic/utils/dbbrowser.py:1.4 --- PanGalactic/pangalactic/utils/dbbrowser.py:1.3 Wed Oct 1 13:24:14 2003 +++ PanGalactic/pangalactic/utils/dbbrowser.py Mon Oct 27 15:41:41 2003 @@ -189,6 +189,7 @@ else: col = 0 maxcols = 0 + # how many columns should there be? try: for obj_id, obj in collection_dict.items(): curr_cols = len(obj.__dict__) @@ -196,16 +197,13 @@ maxcols = curr_cols except: print "Eek. An Exception. Eek." - print "But seriously..." - print "collection type", type(collection_dict) + print "But seriously... ungriddable object", obj_id if self.grid.GetNumberCols() > 0: - self.grid.DeleteCols(0,self.grid.GetNumberCols()) - - #for x in range(maxcols): - #self.grid.AppendCols(1) + self.grid.DeleteCols(0, self.grid.GetNumberCols()) self.grid.AppendCols(maxcols) + # fill in the grid try: for obj_id, obj in collection_dict.items(): col = 0 @@ -215,8 +213,7 @@ curr_row += 1 except: print "Eek. Another Exception. Eek." - print "But seriously..." - print "collection type", type(collection_dict) + print "But seriously... ungriddable object", obj_id self.grid.AutoSizeColumns(true) Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.122 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.123 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.122 Fri Oct 24 15:43:23 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Mon Oct 27 15:41:40 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.122 $"[11:-2] +__version__ = "$Revision: 1.123 $"[11:-2] import os import sys @@ -983,7 +983,7 @@ wgt = self.topWindow.toppanel.GetProjectWidget() projndx = wgt.GetSelection() project = wgt.GetString(projndx) - self.changeProject(ndx, project) # not the best way, but it works for now. vwk + self.changeProject(ndx, project) # a bit of overkill, but it works for now. vwk return else: ndx -= 1 Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.8 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.9 --- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.8 Thu Oct 16 17:19:44 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py Mon Oct 27 15:41:41 2003 @@ -15,10 +15,14 @@ from wxPython.wx import * from wxPython.grid import * +import pangalactic.utils.toolframe as toolframe +import pangalactic.utils.basegrid as basegrid from pangalactic.enterprise.workflow.wfprocessoverview import WfProcessOverview, WorkflowState -from workflowgrid import WorkflowGrid, WF_EDIT, WF_VIEW -import wfdatatable +import pangalactic.enterprise.workflow.workflow_wizard as workflow_wizard +from pangalactic.enterprise.workflow.workflowgrid import WorkflowGrid, WF_EDIT, WF_VIEW +import pangalactic.enterprise.workflow.wfdatatable as wfdatatable +WF_COLOURKEY = wxNewId() class WfInstanceOverview(WfProcessOverview): """ @@ -54,6 +58,55 @@ WfProcessOverview.__init__(self, parent, state, datamgr, datalist, tablename, ID, pos, size) + + def showColourKey(self, event): + #print "wfinstance.showcolourkey" + tmpsize = wxSize(100, 115) + colourdlg = wxDialog(self, -1, "Key", wxDefaultPosition, tmpsize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) + vsizer = wxBoxSizer(wxVERTICAL) + colourp = wxPanel(colourdlg, -1) + + for ckey, clist in workflow_wizard.colourlist.items(): + #print ckey, clist + coltext = clist[0] + forecolour = clist[1] + backcolour = clist[2] +# attr = wxTextAttr(forecolour, backcolour) + foo = wxTextCtrl(colourp, wxNewId(), "", wxDefaultPosition, wxSize(80, -1), wxTE_READONLY) + foo.SetForegroundColour(forecolour) + foo.SetBackgroundColour(backcolour) + foo.SetValue(coltext) +# foo.SetDefaultStyle(attr) +# foo.AppendText(coltext) + vsizer.AddWindow(foo, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5) + + colourp.SetAutoLayout(True) + colourp.SetSizer(vsizer) + vsizer.Fit(colourp) + vsizer.SetSizeHints(colourp) + + colourdlg.CentreOnParent() + colourdlg.Show(True) + +## colourgrid = wxGrid(colourdlg, -1) +## colourgrid.CreateGrid(len(workflow_wizard.colourlist), 1) +## colourgrid.EnableEditing(False) +## row = 0 +## for ckey, clist in workflow_wizard.colourlist.items(): +## coltext = clist[0] +## forecolour = clist[1] +## backcolour = clist[2] +## colourgrid.SetCellTextColour(row, 0, forecolour) +## colourgrid.SetCellBackgroundColour(row, 0, backcolour) +## colourgrid.SetCellValue(row, 0, coltext) +## row += 1 +## colourgrid.SetRowLabelSize(0) +## colourgrid.SetColLabelSize(0) +## colourgrid.Fit() +## colourdlg.CentreOnParent() +## colourdlg.Show(True) + + def setupGrid(self, datalist, tablename): #print "instance.setupgrid", tablename self.gridtable = wfdatatable.WfDataTable() @@ -87,7 +140,7 @@ for row in range(self.grid.GetNumberRows()): wfobj = self.grid.GetDataObj(row) msg += "\nrow: " + str(row) - colour = wxLIGHT_GREY + backcolour = wxLIGHT_GREY now = mx.DateTime.DateFromTicks(mx.DateTime.now()) duedate = wfobj._activity_due_date @@ -100,24 +153,31 @@ #print duedate, late, very_late, lost_cause if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)): - colour = wxTheColourDatabase.FindColour("MAROON") - self.grid.SetCellTextColour(row, somecol, wxWHITE) + colour_ndx = workflow_wizard.lost_cause + #colour = wxTheColourDatabase.FindColour("MAROON") msg += "; Waaay Overdue (%i) " % lost_cause elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)): - colour = wxTheColourDatabase.FindColour("RED") + colour_ndx = workflow_wizard.very_late + #colour = wxTheColourDatabase.FindColour("RED") msg += "; Very Late (%i) " % very_late elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)): - colour = wxTheColourDatabase.FindColour("CORAL") + colour_ndx = workflow_wizard.late + #colour = wxTheColourDatabase.FindColour("CORAL") msg += "; Late (%i) " % late elif now >= duedate: - colour = wxTheColourDatabase.FindColour("YELLOW") - msg += "; Sort of Late " + colour_ndx = workflow_wizard.past + #colour = wxTheColourDatabase.FindColour("YELLOW") + msg += "; Past Due " else: - colour = wxTheColourDatabase.FindColour("GREEN") + colour_ndx = workflow_wizard.ontime + #colour = wxTheColourDatabase.FindColour("GREEN") msg += "; on time " - msg += repr(colour) - self.grid.SetCellBackgroundColour(row, somecol, colour) + msg += repr(backcolour) + backcolour = workflow_wizard.colourlist[colour_ndx][2] + forecolour = workflow_wizard.colourlist[colour_ndx][1] + self.grid.SetCellBackgroundColour(row, somecol, backcolour) + self.grid.SetCellTextColour(row, somecol, forecolour) #print msg ## get the attr for the wxAttrKind.Row (= 3) Index: PanGalactic/pangalactic/client/modules/psm/productdataform.py diff -u PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.31 PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.32 --- PanGalactic/pangalactic/client/modules/psm/productdataform.py:1.31 Fri Oct 24 14:52:49 2003 +++ PanGalactic/pangalactic/client/modules/psm/productdataform.py Mon Oct 27 15:41:40 2003 @@ -102,14 +102,14 @@ return wxPyTypeCast(self.FindWindowById(ID_TOGGLE_PM), "wxRadioButton") def getNextPvId(self): - print "productdataform.getnextpvid" + #print "productdataform.getnextpvid" temp = preferences.GetPreference('nextpvid') if temp: self.NextPvId = str(int(temp) + 1) else: self.NextPvId = "0" preferences.prefs['nextpvid'] = self.NextPvId - print "nextpvid", self.NextPvId + #print "nextpvid", self.NextPvId def ClearCreateEditFlags(self): @@ -309,7 +309,7 @@ """ Clears the entire form """ - print "productdataform.clearpmpvform" + #print "productdataform.clearpmpvform" self.clearPM() self.clearPV() @@ -318,7 +318,7 @@ """ Clears the Product Master portion of the form """ - print "productdataform.clearpm" + #print "productdataform.clearpm" self.GetPmIdentifier().SetValue('') self.GetPmName().SetValue('') self.GetPmPoc().SetValue('') @@ -330,7 +330,7 @@ """ Clears the Product Version portion of the form """ - print "productdataform.clearpv" + #print "productdataform.clearpv" self.GetPvRevision().SetLabel('') self.GetPvRevisionTag().SetValue('') self.GetPvName().SetValue('') @@ -340,7 +340,7 @@ self.temp_pv = None def ResetForm(self, PM, PV): - print "productdataform.resetpmpvform" + #print "productdataform.resetpmpvform" self.clearForm() self.FillFormWithPMData(PM) self.FillFormWithPVData(PV) @@ -348,13 +348,13 @@ self.EnablePV(False) def revertNextPvId(self): - print "productdataform.revertnextpvid" + #print "productdataform.revertnextpvid" nextid = preferences.GetPreference('nextpvid') nextid = int(nextid) - 1 preferences.prefs['nextpvid'] = nextid preferences.CreatePreferencesFile(preferences.prefs) self.NextPvId = None - print "nextid", nextid + #print "nextid", nextid def SavePM(self, pmv): self.FillPMWithFormData(pmv._of_master) @@ -495,14 +495,14 @@ return wxPyTypeCast(self.FindWindowById(ID_PART_NUMBER), "wxStaticText") def getNextPmvId(self): - print "productdataform.getnextpmvid" + #print "productdataform.getnextpmvid" temp = preferences.GetPreference('nextpmvid') if temp: self.NextPmvId = str(int(temp) + 1) else: self.NextPmvId = "0" preferences.prefs['nextpmvid'] = self.NextPmvId - print "nextid", self.NextPmvId + #print "nextid", self.NextPmvId def ClearCreateEditFlags(self): self.CreatingProductModelMaster = 0 @@ -698,7 +698,7 @@ def clearForm(self): - print "productdataform.clearpmmpmvform" + #print "productdataform.clearpmmpmvform" """ Clears the entire form """ @@ -709,7 +709,7 @@ """ Clears the Product Model Version portion of a form """ - print "productdataform.clearpmv" + #print "productdataform.clearpmv" self.GetPmvRevision().SetLabel('') self.GetPmvRevisionTag().SetValue('') self.GetPmvName().SetValue('') @@ -722,7 +722,7 @@ """ Clears the Product Model Master portion of a form """ - print "productdataform.clearpmm" + #print "productdataform.clearpmm" self.GetPmmIdentifier().SetValue('') self.GetPmmName().SetValue('') self.GetPmmPoc().SetValue('') @@ -732,7 +732,7 @@ def ResetForm(self, PMM, PMV): - print "productdataform.resetpmmpmvform" + #print "productdataform.resetpmmpmvform" self.clearForm() self.FillFormWithPMMData(PMM) self.FillFormWithPMVData(PMV) @@ -740,12 +740,12 @@ self.EnablePMV(False) def revertNextPmvId(self): - print "productdataform.revertnextpmvid" + #print "productdataform.revertnextpmvid" nextid = preferences.GetPreference('nextpmvid') nextid = int(nextid) - 1 preferences.prefs['nextpmvid'] = nextid preferences.CreatePreferencesFile(preferences.prefs) - print "nextid", nextid + #print "nextid", nextid self.NextPmvId = None def SavePMM(self,pmv): Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.17 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.18 --- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.17 Thu Oct 16 11:17:20 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py Mon Oct 27 15:41:41 2003 @@ -74,14 +74,13 @@ @param tablename: A unique name for the grid for the local cache. """ -# PGDataPanel.__init__(self, parent, datamgr, ID, pos, size) wxPanel.__init__(self, parent, ID, pos, size) self.actinfo = [("Activity", 100, "activity"), ("Time Frame\n(days)", 100, "duration"), ("Late\n(days)", 100, "late"), ("Very Late\n(days)", 100, "very_late"), - ("WAAAAY Overdue\n(days)", 130, "lost_cause"), + ("Lost Cause?\n(days)", 130, "lost_cause"), ("Description", 400, "description")] self.transinfo = [("From", 200, "from"), ("To", 200, "to")] Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.20 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.21 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.20 Thu Oct 16 17:19:44 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Mon Oct 27 15:41:41 2003 @@ -26,6 +26,23 @@ time_very_late_col = 3 time_lost_cause_col = 4 desc_col = 5 + +lost_cause_colour = wxTheColourDatabase.FindColour("MAROON") +very_late_colour = wxTheColourDatabase.FindColour("RED") +late_colour = wxTheColourDatabase.FindColour("CORAL") +past_colour = wxTheColourDatabase.FindColour("YELLOW") +ontime_colour = wxTheColourDatabase.FindColour("GREEN") + +lost_cause = 4 +very_late = 3 +late = 2 +past = 1 +ontime = 0 +colourlist = {lost_cause : ["Lost Cause?", wxWHITE, lost_cause_colour], + very_late : ["Very Late", wxBLACK, very_late_colour], + late : ["Late", wxBLACK, late_colour], + past : ["Past Due", wxBLACK, past_colour], + ontime : ["On Time", wxBLACK, ontime_colour]} class WorkflowWizard(wxPanel): """ @@ -109,14 +126,12 @@ self.activitygrid.SetRowLabelSize(40) self.activitygrid.EnableEditing(True) - purple = wxTheColourDatabase.FindColour("MAROON") - red = wxTheColourDatabase.FindColour("RED") - orange = wxTheColourDatabase.FindColour("CORAL") - yellow = wxTheColourDatabase.FindColour("YELLOW") - self.SetColForegroundColour(self.activitygrid, time_lost_cause_col, wxWHITE) - self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, purple) - self.SetColBackgroundColour(self.activitygrid, time_very_late_col, red) - self.SetColBackgroundColour(self.activitygrid, time_late_col, orange) + self.SetColForegroundColour(self.activitygrid, time_lost_cause_col, colourlist[lost_cause][1]) + self.SetColBackgroundColour(self.activitygrid, time_lost_cause_col, colourlist[lost_cause][2]) + self.SetColForegroundColour(self.activitygrid, time_very_late_col, colourlist[very_late][1]) + self.SetColBackgroundColour(self.activitygrid, time_very_late_col, colourlist[very_late][2]) + self.SetColForegroundColour(self.activitygrid, time_late_col, colourlist[late][1]) + self.SetColBackgroundColour(self.activitygrid, time_late_col, colourlist[late][2]) editor = wxGridCellChoiceEditor(["Initiated", "Draft", "Approved", "Released"], False) # print "editor", editor From waterbug at ned.gsfc.nasa.gov Mon Oct 27 16:44:20 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Mon Oct 27 16:44:21 2003 Subject: [Pangalactic-commits] Fixes to fk dictionary inits. Message-ID: <200310272144.h9RLiKZA012819@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/registry.py 1.34 1.35 Log message: Fixes to fk dictionary inits. Index: PanGalactic/pangalactic/repo/registry.py diff -u PanGalactic/pangalactic/repo/registry.py:1.34 PanGalactic/pangalactic/repo/registry.py:1.35 --- PanGalactic/pangalactic/repo/registry.py:1.34 Sun Oct 5 17:31:49 2003 +++ PanGalactic/pangalactic/repo/registry.py Mon Oct 27 16:44:18 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Engineering Repository Object Registry -@version: $Revision: 1.34 $ +@version: $Revision: 1.35 $ """ -__version__ = "$Revision: 1.34 $"[11:-2] +__version__ = "$Revision: 1.35 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $ import string, re @@ -115,7 +115,7 @@ - key = view name (PostgreSQL 'relname') - value = view columns (a list) - @ivar constraint_fkey_maps: + @ivar constraint_fk_maps: - key = fkey constraint names that point to tables corresponding to referenced objects - value = dictionary with: @@ -185,7 +185,7 @@ # build table_* dictionaries ... self.table_cols = {} self.table_pkeys = {} - self.constraint_fkey_maps = {} + self.constraint_fk_maps = {} self.refd_obj_fk_constraints = {} self.obj_init_parms = {} self.obj_nonkey_attrs = {} @@ -222,7 +222,7 @@ for item in result: self.table_pkeys[tablename].append(item[0]) # now populate: - # (1) self.constraint_fkey_maps[constrname] dictionary + # (1) self.constraint_fk_maps[constrname] dictionary # (2) self.obj_init_parms[classname] dictionary # (3) self.obj_nonkey_attrs[classname] dictionary # (2 and 3 are really where the action is ...) @@ -236,15 +236,14 @@ # compute foreign key constraint names ... # print '\n ** computing fk const names for %s\n' % classname std_abbrev = self.pgerdb_classes[classname]._std_abbrev - for att in self.refd_objs: + for att in self.refd_objs[classname]: constrname = std_abbrev + '_has' + att + sqlcmd = """SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND """ + sqlcmd += """tgconstrname = %s""" # DEBUGGING - # sql = """SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND \ - # tgconstrname = %s""" % (oid, constrname) # print '\n ** executing query:' - # print ' %s\n' % sql - curs.execute("""SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND \ - tgconstrname = %s""", (oid, constrname)) + # print '" %s", (%s, %s)' % (sql, oid, constrname) + curs.execute(sqlcmd, (oid, constrname)) result = curs.fetchall() # check whether there is a result here: # the refd_obj could be just a @@ -253,7 +252,7 @@ # name, and no foreign keys. if result: self.refd_obj_fk_constraints[(classname, att)] = constrname - self.constraint_fkey_maps[constrname] = {} + self.constraint_fk_maps[constrname] = {} constr_string = str(result[0][0]) constr_list = constr_string.split('\x00') # trim off constraint name, table names, @@ -267,12 +266,12 @@ # the corresponding cols in the # referenced table. while constr_list: - self.constraint_fkey_maps[constrname][constr_list[0]] = constr_list[1] + self.constraint_fk_maps[constrname][constr_list[0]] = constr_list[1] constr_list = constr_list[2:] # add all fkeys in this constraint to the # init parm list (if they aren't already # there). - for k in self.constraint_fkey_maps[constrname]: + for k in self.constraint_fk_maps[constrname]: if k not in obj_init_parm_list: obj_init_parm_list.append(k) # DEBUG: From bmuir at ned.gsfc.nasa.gov Tue Oct 28 15:00:14 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Tue Oct 28 15:00:16 2003 Subject: [Pangalactic-commits] fixed pgefobject isempty to ignore pgef_class Message-ID: <200310282000.h9SK0Ed7025185@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.11 1.12 PanGalactic/pangalactic/client/tests/test_pgefobject.py 1.6 1.7 PanGalactic/pangalactic/enterprise/pgefobject.py 1.29 1.30 Log message: fixed pgefobject isempty to ignore pgef_class Index: PanGalactic/pangalactic/client/tests/test_pgefobject.py diff -u PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.6 PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.7 --- PanGalactic/pangalactic/client/tests/test_pgefobject.py:1.6 Thu Oct 16 14:10:05 2003 +++ PanGalactic/pangalactic/client/tests/test_pgefobject.py Tue Oct 28 15:00:13 2003 @@ -33,7 +33,7 @@ def testIsEmpty(self): """Check to see that the IsEmpty returns true when the object is empty""" result = self.obj1.IsEmpty() - assert result == 1 , 'New object should have been empty' + assert result == True , 'New object should have been empty' def testIsNotEmpty(self): """Check to see that the IsEmpty returns false when the object is empty""" Index: PanGalactic/pangalactic/enterprise/pgefobject.py diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.29 PanGalactic/pangalactic/enterprise/pgefobject.py:1.30 --- PanGalactic/pangalactic/enterprise/pgefobject.py:1.29 Mon Oct 27 15:02:45 2003 +++ PanGalactic/pangalactic/enterprise/pgefobject.py Tue Oct 28 15:00:13 2003 @@ -1,8 +1,8 @@ -# $Id: pgefobject.py,v 1.29 2003/10/27 20:02:45 waterbug Exp $ +# $Id: pgefobject.py,v 1.30 2003/10/28 20:00:13 bmuir Exp $ """ The Mother of all PGEF application classes. -@version: $Revision: 1.29 $ +@version: $Revision: 1.30 $ """ # TODO: @@ -24,7 +24,7 @@ # should we jettison this? # Nope. -__version__ = "$Revision: 1.29 $"[11:-2] +__version__ = "$Revision: 1.30 $"[11:-2] import types import string @@ -421,6 +421,8 @@ for a in self._schema: value = self.__dict__[a] if a in self._excluded_fields: + pass + elif a == 'pgef_class': pass elif (isinstance(value, types.StringType) and value <> "0" Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.11 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.12 --- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.11 Wed Jun 25 03:43:51 2003 +++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py Tue Oct 28 15:00:13 2003 @@ -4,7 +4,7 @@ from pangalactic.client.support import psmstate from pangalactic.utils import datamanager from pangalactic.utils import localdb - +from pangalactic.utils import securitymanager #import pangalactic.enterprise.productmodelmaster import pangalactic.enterprise.document as document import pangalactic.enterprise.partslist as partslist @@ -26,14 +26,14 @@ def testCreateItemEditFrame(self): #print 'test create' + app = wxPySimpleApp() self.itemeditform = None self.DisplayWgts = wxFrame(None, -1, 'Display Widget') testframe = wxFrame(None, -1, 'Test Frame') testframe.State = psmstate.PSMState() - #testframe.State = psmstate.PSMState() - #testframe.dm = datamanager.DataManager(testframe, true) - #nodedata = (None, None) - #self.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm) + testframe.dm = datamanager.DataManager(testframe, true) + nodedata = (None, None) + self.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm) #self.itemeditform.SetDisplayWgt(self.DisplayWgts) #testframe.dm.localDB.Commit() @@ -299,6 +299,10 @@ testframe = wxFrame(None, -1, 'Test Frame') testframe.State = psmstate.PSMState() testframe.dm = datamanager.DataManager(testframe, true) + testframe.dm.serverName = 'ned.gsfc.nasa.gov' + testframe.dm.serverPort = '8080' + testframe.dm.createServer() + testframe.WatchDog = securitymanager.SecurityManager(testframe.dm) result = testframe.dm.login('tstuser','test') testframe.dm.fillProjectList() testframe.dm.localDB.Commit() From pbear at ned.gsfc.nasa.gov Tue Oct 28 16:53:03 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Tue Oct 28 16:53:05 2003 Subject: [Pangalactic-commits] small bugfixes Message-ID: <200310282153.h9SLr36i027083@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/fnord.py 1.66 1.67 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.123 1.124 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py 1.9 1.10 PanGalactic/pangalactic/utils/datamanager.py 1.51 1.52 PanGalactic/pangalactic/utils/dbbrowser.py 1.4 1.5 PanGalactic/pangalactic/utils/localdb.py 1.43 1.44 PanGalactic/pangalactic/utils/xmlrpcinterface.py 1.25 1.26 Log message: small bugfixes Index: PanGalactic/pangalactic/utils/dbbrowser.py diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.4 PanGalactic/pangalactic/utils/dbbrowser.py:1.5 --- PanGalactic/pangalactic/utils/dbbrowser.py:1.4 Mon Oct 27 15:41:41 2003 +++ PanGalactic/pangalactic/utils/dbbrowser.py Tue Oct 28 16:53:01 2003 @@ -8,15 +8,17 @@ from wxPython.wx import * from wxPython.grid import * -from dbbrowser_wdr import * -import configdbbrowser + import ZODB from ZODB import FileStorage, DB from ZODB import * + import types -import pprint -import toolframe +import pangalactic.utils.toolframe as toolframe + +from pangalactic.utils.dbbrowser_wdr import * +import pangalactic.utils.configdbbrowser as configdbbrowser DEBUG = 1 DISPLAY_CONFIG = "display_config" @@ -70,18 +72,22 @@ if gridrows > 0: self.grid.DeleteRows(0, gridrows) + # WDR: handler implementations for zodbbrowser def OnClose(self, event): self.Parent.Close() + def OnRefresh(self, event = None): self.ClearGrid() self.FillGrid() + def SetDBFile(self, file = None): if file: self.dbfile = file + def AddMenuForStandalone(self): mb = self.GetParent().GetMenuBar() menu = mb.GetMenu(mb.FindMenu('File')) @@ -98,11 +104,13 @@ EVT_MENU(self.Parent, self.FILECLOSE, self.FileClose) EVT_MENU(self.Parent, self.FILECONFIG, self.FileConfig) + def GetDisplayConfig(self): if self.dbroot: if self.dbroot.has_key(configdbbrowser.DISPLAY_CONFIG): if self.dbroot[configdbbrowser.DISPLAY_CONFIG]: self.current_config = self.dbroot[configdbbrowser.DISPLAY_CONFIG] + def FileOpen(self, event = None): wildcard = "ZODB FileStorage (*.fs)|*.fs|" \ @@ -118,9 +126,8 @@ if self.dbroot.has_key(configdbbrowser.DISPLAY_CONFIG): self.current_config = self.dbroot[configdbbrowser.DISPLAY_CONFIG] self.FillChoice() - #self.FillGrid() - dlg.Destroy() + def FileClose(self, event = None): self.dbconnection.close() @@ -131,6 +138,7 @@ self.storage = None self.ClearGrid() self.GetRootitems().Clear() + def FileConfig(self, event = None): collection_name = self.GetRootitems().GetStringSelection() @@ -141,6 +149,7 @@ collection_name = collection_name) testframe.CentreOnParent() testframe.Show(true) + def ResetCols(self, selection): if self.current_config.has_key(selection): @@ -153,7 +162,6 @@ for col in range(len(mapping)): self.grid.SetColLabelValue(col, mapping[col][1]) - def FillGrid(self, event = None): Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.43 PanGalactic/pangalactic/utils/localdb.py:1.44 --- PanGalactic/pangalactic/utils/localdb.py:1.43 Thu Oct 23 15:06:20 2003 +++ PanGalactic/pangalactic/utils/localdb.py Tue Oct 28 16:53:01 2003 @@ -77,28 +77,28 @@ #the first part of the tuple is the dict name, the second field is a flag #that tells us whether the dict is to be cleared when we call clear localdb - dictlist = [ (ITEMDICT,1), - (NAUODICT,1), - (PARTSLISTDICT,1), - (DOCUMENTDICT,1), - (UNCOMMITTEDOBJECTS,1), - (PDRDICT,1), - (DFRDICT,1), - (DCUDICT,1), - (PCUDICT,1), - (ACUDICT,1), - (PFRDICT,1), - (PLFRDICT,1), - (FFILEDICT,1), - (PRODUCTVERSION,1), + dictlist = [ (ITEMDICT, 1), + (NAUODICT, 1), + (PARTSLISTDICT, 1), + (DOCUMENTDICT, 1), + (UNCOMMITTEDOBJECTS, 1), + (PDRDICT, 1), + (DFRDICT, 1), + (DCUDICT, 1), + (PCUDICT, 1), + (ACUDICT, 1), + (PFRDICT, 1), + (PLFRDICT, 1), + (FFILEDICT, 1), + (PRODUCTVERSION, 1), (PRODUCTMASTER, 1), - (PRODUCTMODELMASTER,1), - (PRODUCTMODELVERSION,1), - (UNCOMMITTEDDOCUMENTIDS,1), + (PRODUCTMODELMASTER, 1), + (PRODUCTMODELVERSION, 1), + (UNCOMMITTEDDOCUMENTIDS, 1), (USER, 0), - (ROLES,0), - (PDRMAP,0), - (PROJECTOBJECTS,0), + (ROLES, 0), + (PDRMAP, 0), + (PROJECTOBJECTS, 0), (PMBYPRIMARYKEY, 1), (PVBYPRIMARYKEY, 1), (PMMBYPRIMARYKEY, 1), Index: PanGalactic/pangalactic/client/fnord.py diff -u PanGalactic/pangalactic/client/fnord.py:1.66 PanGalactic/pangalactic/client/fnord.py:1.67 --- PanGalactic/pangalactic/client/fnord.py:1.66 Fri Oct 24 14:52:48 2003 +++ PanGalactic/pangalactic/client/fnord.py Tue Oct 28 16:53:00 2003 @@ -138,14 +138,14 @@ self.mytext.SetBackgroundColour('Red') self.hsizer.Add(self.mytext, wxALIGN_TOP | wxEXPAND) - self.statuspanel.SetAutoLayout(true) + self.statuspanel.SetAutoLayout(True) self.statuspanel.SetSizer(self.hsizer) - self.sizeChanged = false + self.sizeChanged = False EVT_SIZE(self, self.OnSize) EVT_IDLE(self, self.OnIdle) self.Reposition() - self.sizeChanged = true + self.sizeChanged = True def SetMsg(self, msgtext): self.SetStatusText(" " + msgtext, 1) @@ -168,7 +168,7 @@ # Set a flag so the idle time handler will also do the repositioning. # It is done this way to get around a buglet where GetFieldRect is not # accurate during the EVT_SIZE resulting from a frame maximize. - self.sizeChanged = true + self.sizeChanged = True def OnIdle(self, evt): if self.sizeChanged: @@ -180,7 +180,7 @@ self.statuspanel.SetPosition(wxPoint(rect.x+2, rect.y+2)) rsize = wxSize(rect.width-4, rect.height-4) self.statuspanel.SetSize(rsize) - self.sizeChanged = false + self.sizeChanged = False class MainFrame(wxFrame): """This class encapsulates the main client window""" @@ -188,13 +188,13 @@ wxFrame.__init__(self, parent, ID, title,pos, size) try: - self.WorkInProgress = false + self.WorkInProgress = False self.SearchFrame = None self.MyStuffFrame = None self.CacheFrame = None self.psmtool = None self.State = PgefState() - self.Closing = false + self.Closing = False self.ImportPartsListFrame = None wxInitAllImageHandlers() self.SpecialMenu = None @@ -266,7 +266,7 @@ showloginconfirm = preferences.GetPreference('ShowLoginConfirmation') if showloginconfirm == None: - showloginconfirm = true + showloginconfirm = True self.menuBar.Check(ID_PREF_SHOWLOGINCONFIRMED, int(showloginconfirm)) if not preferences.GetPreference('userid'): @@ -293,7 +293,7 @@ sizer.AddSizer(box, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5) dlg.SetSizer(sizer) - dlg.SetAutoLayout(true) + dlg.SetAutoLayout(True) sizer.Fit(dlg) dlg.CentreOnParent() @@ -311,7 +311,7 @@ self.ActivateTool(ID_TOOL_PSM) self.OnServerCombo() - wxToolTip_Enable(false) + wxToolTip_Enable(False) except datamanager.LocalStorageError: noZODBdlg = wxMessageDialog(self, "PGEF is already running or the local cache is corrupt", @@ -319,7 +319,7 @@ noZODBdlg.CentreOnParent() noZODBdlg.ShowModal() noZODBdlg.Destroy() - self.Close(true) + self.Close(True) def SetGaugeRange(self, value): @@ -368,11 +368,11 @@ submenu.Append(ID_FILE_EXPORT_PROPERTIES, "&Properties...", "Export properties to a spreadsheet") submenu.Append(ID_TOOL_GRIDTOPDF, "&Table Data...", "Export grid data to a PDF file") menu.AppendMenu(ID_FILE_EXPORT, "&Export", submenu) - menu.Enable(ID_FILE_EXPORT, false) + menu.Enable(ID_FILE_EXPORT, False) menu.Append(ID_FILE_LOGIN, "Log&in", "Login; leave local mode") menu.Append(ID_FILE_LOGOUT, "Log&out", "Logout; return to local mode") - menu.Enable(ID_FILE_LOGOUT, false) + menu.Enable(ID_FILE_LOGOUT, False) menu.AppendSeparator() menu.Append(ID_FILE_EXIT, "E&xit", "Terminate the program") self.menuBar.Append(menu, "&File") @@ -392,23 +392,23 @@ menu.AppendSeparator() menu.Append(ID_TOOL_SEARCH, "&Search...", "Search the database") - menu.Enable(ID_TOOL_SEARCH, false) + menu.Enable(ID_TOOL_SEARCH, False) menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries") self.menuBar.Append(menu, "&Tools") menu = wxMenu() menu.Append(ID_FILE_COMMIT, "&Commit Changes", "Commit changes to database") - menu.Enable(ID_FILE_COMMIT, false) + menu.Enable(ID_FILE_COMMIT, False) menu.Append(ID_TOOL_CHECKOUT, "Get &Marked Items", "Get items for local mode") menu.Append(ID_TOOL_GETMYSTUFF, "&View My Stuff...", "View anything that's mine") - menu.Enable(ID_TOOL_GETMYSTUFF, false) + menu.Enable(ID_TOOL_GETMYSTUFF, False) menu.Append(ID_PREF_SERVER1, '&Repository...', 'What repository do I use?') self.menuBar.Append(menu, "&Repository") # Cache menu menu = wxMenu() menu.Append(ID_TOOL_VIEW_CHECKEDOUT, "&View Marked Data...", "Show marked data checked out from repository") - menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Database', 'Clear locally stored data', false) + menu.Append(ID_PREF_CLEAR_LOCALDB, '&Clear Local Database', 'Clear locally stored data', False) # menu.AppendSeparator() menu.Append(ID_TOOL_DBBROWSER, "Local Database &Browser...", "Browse the local database dictionaries") self.menuBar.Append(menu, "&Cache") @@ -418,15 +418,15 @@ submenu = wxMenu() # # Options.Preferences submenu # submenu = wxMenu() - submenu.Append(ID_PREF_TOOLTIPS, 'Show &Tooltips', 'Turn on/off flyover help', true) - submenu.Append(ID_PREF_SHOWLOGINCONFIRMED, 'Show Login Confirmation', 'Show/hide login confirmation', true) + submenu.Append(ID_PREF_TOOLTIPS, 'Show &Tooltips', 'Turn on/off flyover help', True) + submenu.Append(ID_PREF_SHOWLOGINCONFIRMED, 'Show Login Confirmation', 'Show/hide login confirmation', True) submenu.Append(ID_PREF_OUTPUTDIR, 'Set Output Directory...', 'Where do my reports go?') # menu.AppendMenu(ID_PREFS, '&Preferences', submenu) # Options.Settings submenu # submenu = wxMenu() submenu.Append(ID_PREF_PROXY, '&Proxy...', 'Set your proxy (if any)') submenu.Append(ID_PREF_SERVER2, '&Repository...', 'What repository do I use?') - submenu.Append(ID_PREF_USERID, '&Userid...', 'Set the locally stored userid', false) + submenu.Append(ID_PREF_USERID, '&Userid...', 'Set the locally stored userid', False) # menu.AppendMenu(ID_PREFS, '&Settings', submenu) # self.menuBar.Append(menu, "&Options") @@ -457,13 +457,13 @@ if self.DataManager.inLocalMode: #print "localmode" self.psmtool.SetupForLocalMode() - self.sb.ShowImage(false) + self.sb.ShowImage(False) else: #print "loginmode" - self.menuBar.Enable(ID_FILE_LOGIN, true) + self.menuBar.Enable(ID_FILE_LOGIN, True) self.psmtool.SetupForLogin() - self.sb.ShowImage(true) + self.sb.ShowImage(True) def OnCheckout(self, event): """Wrapper method that calls the tools Checkout method""" @@ -530,9 +530,9 @@ id = event.GetId() checked = self.menuBar.FindItemById(id).IsChecked() if checked: - wxToolTip_Enable(true) + wxToolTip_Enable(True) else: - wxToolTip_Enable(false) + wxToolTip_Enable(False) event.Skip() def OnLoginConfirmed(self, event): @@ -540,9 +540,9 @@ checked = self.menuBar.FindItemById(id).IsChecked() # print 'pref in menu is %s' % checked if checked: - preferences.prefs['ShowLoginConfirmation'] = true + preferences.prefs['ShowLoginConfirmation'] = True else: - preferences.prefs['ShowLoginConfirmation'] = false + preferences.prefs['ShowLoginConfirmation'] = False preferences.CreatePreferencesFile(preferences.prefs) @@ -653,7 +653,7 @@ testframe.mainpanel = dbbrowser.zodbbrowser(testframe, -1, zodbroot = self.DataManager.dbroot) testframe.mainpanel.FillChoice() testframe.CentreOnParent() - testframe.Show(true) + testframe.Show(True) def OnTesting(self, event): pass @@ -675,7 +675,7 @@ if not self.SearchFrame: self.SearchFrame = searchframe.SearchFrame(self, -1, 'Search', datamanager = self.DataManager) self.SearchFrame.CentreOnParent() - self.SearchFrame.Show(true) + self.SearchFrame.Show(True) EVT_CLOSE(self.SearchFrame, self.CloseSearchFrame) self.SearchFrame.GetMyStuff() else: @@ -685,7 +685,7 @@ # print self.SearchFrame if self.SearchFrame: # print 'in searchframe close' - self.SearchFrame.Show(false) + self.SearchFrame.Show(False) self.SearchFrame = None @@ -696,7 +696,7 @@ self.psmtool.CloseTool(event) self.psmtool = None self.SetTitle(PGEF_TITLE) - self.psmtool.Show(true) + self.psmtool.Show(True) self.psmtool.UpdateMenuBar() @@ -709,7 +709,7 @@ dlg.GetVersion().SetLabel(str(VERSION)) dlg.GetBuildDate().SetLabel(str(BUILD_DATE)) dlg.CentreOnParent() - dlg.Show(true) + dlg.Show(True) def RemoveSpecialMenu(self, userinfo): if self.SpecialMenu and userinfo.god_flag: @@ -725,11 +725,11 @@ if userinfo.god_flag: if self.SpecialMenu == None: self.SpecialMenu = wxMenu() - self.SpecialMenu.Append(ID_PGTEST_ITEM, "&Test Mode", "Not Implemented", true) - self.SpecialMenu.Append(ID_PGDEV_ITEM, "De&velopment Mode", "Not Implemented", true) - self.SpecialMenu.Append(ID_PGPROD_ITEM, "&Production Mode", "Not Implemented", true) - self.SpecialMenu.Append(ID_PGPLAY_ITEM, "P&lay Mode", "Not Implemented", true) - self.SpecialMenu.Append(ID_PGDEMO_ITEM, "&Demonstration Mode", "Not Implemented", true) + self.SpecialMenu.Append(ID_PGTEST_ITEM, "&Test Mode", "Not Implemented", True) + self.SpecialMenu.Append(ID_PGDEV_ITEM, "De&velopment Mode", "Not Implemented", True) + self.SpecialMenu.Append(ID_PGPROD_ITEM, "&Production Mode", "Not Implemented", True) + self.SpecialMenu.Append(ID_PGPLAY_ITEM, "P&lay Mode", "Not Implemented", True) + self.SpecialMenu.Append(ID_PGDEMO_ITEM, "&Demonstration Mode", "Not Implemented", True) self.SpecialMenu.AppendSeparator() self.SpecialMenu.Append(ID_TOOL_DBBROWSER, "D&B Browser...") self.menuBar.Insert(self.SpecialPos, self.SpecialMenu, "Special") @@ -737,7 +737,7 @@ self.menuBar.Refresh() def OnLogout(self, event): - self.DataManager.user._loggedin = false + self.DataManager.user._loggedin = False self.menuBar.Enable(ID_FILE_LOGIN, not self.DataManager.user._loggedin) self.menuBar.Enable(ID_FILE_LOGOUT, self.DataManager.user._loggedin) self.menuBar.Enable(ID_FILE_COMMIT,self.DataManager.user._loggedin) @@ -751,15 +751,15 @@ self.menuBar.Enable(ID_TOOL_CHECKOUT, self.DataManager.user._loggedin) self.sb.SetServer('Local') - self.DataManager.inLocalMode = true - self.DataManager.user._loggedin = false + self.DataManager.inLocalMode = True + self.DataManager.user._loggedin = False self.OnServerCombo() def OnLogin(self, event): loginconfirm = preferences.GetPreference('ShowLoginConfirmation') dialog = LoginClass(self, -1, "PGEF Login" ) if loginconfirm == None: - loginconfirm = true + loginconfirm = True dialog.GetCheckboxConfirmed().SetValue(int(loginconfirm)) @@ -790,13 +790,13 @@ msg = wxStaticText(dlg, -1, "Please wait while PGEF validates your login...", wxPoint (10, 10), wxDefaultSize, wxALIGN_CENTRE) dlg.CentreOnParent() - dlg.Show(true) + dlg.Show(True) wxSafeYield() if self.DataManager.login(self.DataManager.user.id, self.DataManager.user._Password): self.DataManager.fillProjectList() - self.DataManager.user._loggedin = true - self.DataManager.inLocalMode = false + self.DataManager.user._loggedin = True + self.DataManager.inLocalMode = False self.RemoveSpecialMenu(self.DataManager.user) loggedin = self.DataManager.user._loggedin self.menuBar.Enable(ID_PREF_PROXY, not loggedin) @@ -812,7 +812,7 @@ self.menuBar.Enable(ID_PREF_CLEAR_LOCALDB, loggedin) self.sb.SetServer('Repository: ' + self.DataManager.serverName) - self.sb.ShowImage(true) + self.sb.ShowImage(True) self.psmtool.UpdateForLogin() @@ -864,15 +864,15 @@ self.CloseSearchFrame() self.CloseTools(event) - self.Closing = true - self.Close(true) + self.Closing = True + self.Close(True) else: dlg = wxMessageDialog(self, "Discard uncommitted changes?", "About Me", wxOK | wxCANCEL | wxICON_EXCLAMATION) dlg.CentreOnParent() if dlg.ShowModal() == wxID_OK: self.CloseTools() - self.Close(true) + self.Close(True) else: event.Skip() dlg.Destroy() @@ -883,7 +883,7 @@ return if self.psmtool: - self.psmtool.Show(true) + self.psmtool.Show(True) else: pos = wxPoint(0,0) self.psmtool = psmtool.CreateTool(self, self.DataManager, -1, pos, wxSize(1,1)) @@ -901,7 +901,7 @@ tbh = self.GetToolBar().GetSizeTuple()[1] pos = wxPoint (0, tbh) ndx = 0 - found = false + found = False if sys.platform == 'win32': tbh = self.GetToolBar().GetSizeTuple()[1] @@ -920,11 +920,11 @@ def OnInit(self): self.frame = MainFrame(NULL, -1, PGEF_TITLE, wxDefaultPosition, wxSize(800, 600)) self.frame.CentreOnParent() - self.frame.Show(true) + self.frame.Show(True) self.SetTopWindow(self.frame) self.frame.ConfigureStatusBar(self.frame.sb.GetSizeTuple()[0]) - return true + return True #---------------------------------------------------------------------------- Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.123 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.124 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.123 Mon Oct 27 15:41:40 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Tue Oct 28 16:53:00 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.123 $"[11:-2] +__version__ = "$Revision: 1.124 $"[11:-2] import os import sys @@ -188,9 +188,7 @@ hbox = wxBoxSizer(wxVERTICAL) choice_list = ["default", "requirements", "functions", "simulations"] - self.view = wxChoice(self.leftPanel, ID_CHOICE_VIEW, wxPoint(90, 50), wxSize(95, -1), choice_list) - hbox.Add(self.view, 0, wxEXPAND) self.tree_notebook = wxNotebook(self.leftPanel, -1, wxDefaultPosition, wxSize(200,200)) @@ -369,7 +367,6 @@ edlg.CentreOnParent() edlg.ShowModal() edlg.Destroy() - else: edlg = wxMessageDialog(self, "No properties were found for export.", "Export Properties Error", @@ -384,13 +381,8 @@ if node.IsOk(): tree.SelectItem(node) - menu = wxMenu() - # popup help seems to be ignored.... grrrr -# if self.DataManager.user._loggedin: -# menu.Append(ID_TREE_RIGHTPOPUP_TOPLEVEL, 'Show Top Level Items', "Display the default hierarchy") -# menu.SetHelpString(ID_TREE_RIGHTPOPUP_TOPLEVEL, "Display the toplevel hierarchy") - + menu = wxMenu() menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this product") menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data...', "View project data") menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Generate PDF...', 'Show the PDF creation options') @@ -448,10 +440,8 @@ itemndx = self.topWindow.toppanel.GetItemWidget().GetSelection() if itemndx > 0: itemndx -= 1 - #self.tree.DeleteAllItems() itemobj = self.topWindow.toppanel.GetItemObject(itemndx) self.showItem(itemobj) - #self.ShowTopLevelItems() def CloseSearchFrame (self, event = None): if self.SearchFrame: @@ -626,7 +616,10 @@ self.ShowCheckedOutGrid() - def CheckoutObjects(self, obj_ids, doc_ids, pl_ids, checkout_time = None, get_partslists = None, get_documents = None): + def CheckoutObjects(self, obj_ids, doc_ids, pl_ids, + checkout_time = None, + get_partslists = None, + get_documents = None): retval = None if checkout_time == None: checkout_time = time.localtime() @@ -905,14 +898,11 @@ def OnTreeActivate(self, event): #print "psmtool.ontreeactivate" treeobj = self.tree.GetPyData(event.GetItem()) - #print "treedata", treeobj nauoid = treeobj[0] itemid = treeobj[1] if nauoid == None and itemid == None: raise ValueError, "No data" -# treeobj = self.DataManager.localDB.GetItem(itemid) -# print "ontreeactivate: " + treeobj.Name self.SelectGridRowByItemId(itemid) def SelectGridRowByItemId(self, itemid): @@ -935,44 +925,32 @@ #bryan if self.DataManager.uncommittedData(): - - #self.DataManager.DebugUnsavedNauoIDs() - #self.DataManager.DebugUnsavedItemIDs() - dlg = wxMessageDialog(self, "You have uncommitted changes. Shall I commit them?", "Warning: Data Loss Imminent", wxYES_NO | wxYES_DEFAULT | wxICON_EXCLAMATION) - if dlg.ShowModal() == wxID_YES: self.Commit(closing) - def showItem(self, itemobj): #ndx): + def showItem(self, itemobj): #print "psmtool.showitem" -# itemid = self.itemgrid.GetObjectOid(ndx) itemid = itemobj.pgef_oid self.State.treeroot = itemid # revisit, may be deprecated due to performance junk self.State.currentitem = itemid -# self.itemgrid.SelectRow(ndx) self.tree.DeleteAllItems() self.DataManager.clearNauoIDs() if self.DataManager.user._loggedin: - #print "logged in" self.DataManager.getNAUOByAssemblyID([itemid]) - #print 'psmtool.itemclick call load tree from objects' - print "Should the project be the tree root?" + print "Should the project be the tree root when logged in?" self.tree.LoadTreefromObjects(self, itemid) elif self.inLocalMode(): #print "local mode" -# itemobj = self.DataManager.localDB.GetItem(itemid) # commented out - not used? vwk -# roottreenode = self.tree.GetRootItem() # commented out - not used? vwk wgt = self.topWindow.toppanel.GetProjectWidget() projndx = wgt.GetSelection() project = wgt.GetString(projndx) - #print "project", project self.tree.LoadTreefromProject(self, project, [itemid]) @@ -1062,7 +1040,7 @@ self.DataManager.localDB.SaveState("PSMState", self.State) self.DataManager.getItemsByProject([project]) - self.ShowTopLevelItems() + self.buildDefaultTree() numitems = self.FillGridFromProject(project) self.FillItemWidgetFromProject(project) @@ -1138,13 +1116,11 @@ for ndx in range(len(self.DisplayWgts)): wgt = self.DisplayWgts[ndx][0] wgttype = self.DisplayWgts[ndx][1] - #print "wgttype: " + wgttype if wgttype == "SEQUENCE": #print " update sequence" classname = newitem.__class__.__name__ - # only put pmvs in the item dropdown if classname == "ProductModelVersion": - #print " append pmv" + # only put pmvs in the item dropdown if newitem.name: foo = newitem.of_pm_id + "." + newitem.of_pv_id + " (" + newitem.name + ")" else: @@ -1170,9 +1146,9 @@ wgt.AutoSizeColumns(true) - def RedrawTreeAndGrid(self, event = None): - #print "psmtool.redrawtreeandgrid" - self.ShowTopLevelItems() +# def RedrawTreeAndGrid(self, event = None): +# #print "psmtool.redrawtreeandgrid" +# self.buildDefaultTree() def FillGridFromProject(self, project): #print "psmtool.fillgridfromproject" @@ -1214,10 +1190,6 @@ def FillItemWidgetFromProject(self, project): -# widget = self.topWindow.toppanel.GetItemWidget() -# widget.Clear() -# widget.Append('Select a Product Model') - localitems = self.DataManager.localDB.GetLocalProducts(project, pmv = 1) localpmvs = localitems.values() itemlist = [] @@ -1312,7 +1284,6 @@ def SetupForLocalMode(self, event = None): #print "setupforlocalmode" -# self.topWindow.toppanel.GetButtonTopLevel().Enable(false) self.FillLocalModeProjectWidget() self.Parent.sb.SetServer('Local') self.tree.DeleteAllItems() @@ -1358,46 +1329,33 @@ # print 'about to set it to none' self.checkoutframe = None - def ShowTopLevelItems(self): + def buildDefaultTree(self): dlg = None - #print "psmtool.showtoplevelitems" - #print self.State.currentproject - #for key, value in self.DataManager.localDB.GetACUDict().items(): - #print "acu" - #print value.name, value.pgef_oid - #break - + #print "psmtool.builddefaulttree" if self.DataManager.user._loggedin and self.State.currentproject: #print "logged in" - #print "toplevelitemids", self.DataManager.topLevelItemIDs try: self.State.treeroot = self.State.currentproject self.tree.DeleteAllItems() self.DataManager.clearNauoIDs() self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs) self.itemgrid.ClearSelection() -# self.topWindow.toppanel.GetItemWidget().SetSelection(0) except: pass - else: #print "not logged in" - #print "toplevelitemids", self.DataManager.topLevelItemIDs ndx = self.topWindow.toppanel.GetItemWidget().GetSelection() if ndx > 0: - #print "call onitemclick" self.OnItemClick() elif len(self.DataManager.topLevelItemIDs) > 0: - #print "have toplevelitemids" + print "have toplevelitemids" self.DataManager.clearNauoIDs() self.tree.LoadTreefromProject(self, self.State.currentproject, self.DataManager.topLevelItemIDs) else: - #print "Local mode; no TopLevel items" self.DataManager.clearNauoIDs() self.tree.LoadTreefromProject(self, self.State.currentproject, []) - #print "end showtoplevelitems" def BuildTree(self, itemid): Index: PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.9 PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.10 --- PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py:1.9 Mon Oct 27 15:41:41 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfinstanceoverview.py Tue Oct 28 16:53:00 2003 @@ -57,54 +57,42 @@ """ WfProcessOverview.__init__(self, parent, state, datamgr, datalist, tablename, ID, pos, size) + self.colourdlg = None def showColourKey(self, event): #print "wfinstance.showcolourkey" - tmpsize = wxSize(100, 115) - colourdlg = wxDialog(self, -1, "Key", wxDefaultPosition, tmpsize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) - vsizer = wxBoxSizer(wxVERTICAL) - colourp = wxPanel(colourdlg, -1) - - for ckey, clist in workflow_wizard.colourlist.items(): - #print ckey, clist - coltext = clist[0] - forecolour = clist[1] - backcolour = clist[2] -# attr = wxTextAttr(forecolour, backcolour) - foo = wxTextCtrl(colourp, wxNewId(), "", wxDefaultPosition, wxSize(80, -1), wxTE_READONLY) - foo.SetForegroundColour(forecolour) - foo.SetBackgroundColour(backcolour) - foo.SetValue(coltext) -# foo.SetDefaultStyle(attr) -# foo.AppendText(coltext) - vsizer.AddWindow(foo, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5) - - colourp.SetAutoLayout(True) - colourp.SetSizer(vsizer) - vsizer.Fit(colourp) - vsizer.SetSizeHints(colourp) - - colourdlg.CentreOnParent() - colourdlg.Show(True) - -## colourgrid = wxGrid(colourdlg, -1) -## colourgrid.CreateGrid(len(workflow_wizard.colourlist), 1) -## colourgrid.EnableEditing(False) -## row = 0 -## for ckey, clist in workflow_wizard.colourlist.items(): -## coltext = clist[0] -## forecolour = clist[1] -## backcolour = clist[2] -## colourgrid.SetCellTextColour(row, 0, forecolour) -## colourgrid.SetCellBackgroundColour(row, 0, backcolour) -## colourgrid.SetCellValue(row, 0, coltext) -## row += 1 -## colourgrid.SetRowLabelSize(0) -## colourgrid.SetColLabelSize(0) -## colourgrid.Fit() -## colourdlg.CentreOnParent() -## colourdlg.Show(True) + if self.colourdlg: + if not self.colourdlg.IsShown(): + self.colourdlg.CentreOnParent() + self.colourdlg.Show(True) + else: + self.colourdlg.Raise() + return + else: + tmpsize = wxSize(150, 115) + self.colourdlg = wxFrame(self, -1, "Status Key", wxDefaultPosition, tmpsize) + vsizer = wxBoxSizer(wxVERTICAL) + colourp = wxPanel(self.colourdlg, -1) + + for ckey, clist in workflow_wizard.colourlist.items(): + #print ckey, clist + coltext = clist[0] + forecolour = clist[1] + backcolour = clist[2] + foo = wxTextCtrl(colourp, wxNewId(), "", wxDefaultPosition, wxSize(80, -1), wxTE_READONLY) + foo.SetForegroundColour(forecolour) + foo.SetBackgroundColour(backcolour) + foo.SetValue(coltext) + vsizer.AddWindow(foo, 0, wxGROW|wxALIGN_CENTER_VERTICAL, 5) + + colourp.SetAutoLayout(True) + colourp.SetSizer(vsizer) + vsizer.Fit(colourp) + vsizer.SetSizeHints(colourp) + + self.colourdlg.CentreOnParent() + self.colourdlg.Show(True) def setupGrid(self, datalist, tablename): @@ -145,32 +133,25 @@ now = mx.DateTime.DateFromTicks(mx.DateTime.now()) duedate = wfobj._activity_due_date wfobj_fields = wfobj.getActivity(wfobj.activityId).GetFields() - #print wfobj_fields + late = int(wfobj_fields["late"]) very_late = int(wfobj_fields["very_late"]) lost_cause = int(wfobj_fields["lost_cause"]) - #print duedate, late, very_late, lost_cause - if now >= duedate + mx.DateTime.RelativeDateTime(days=(+lost_cause)): colour_ndx = workflow_wizard.lost_cause - #colour = wxTheColourDatabase.FindColour("MAROON") msg += "; Waaay Overdue (%i) " % lost_cause elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+very_late)): colour_ndx = workflow_wizard.very_late - #colour = wxTheColourDatabase.FindColour("RED") msg += "; Very Late (%i) " % very_late elif now >= duedate + mx.DateTime.RelativeDateTime(days=(+late)): colour_ndx = workflow_wizard.late - #colour = wxTheColourDatabase.FindColour("CORAL") msg += "; Late (%i) " % late elif now >= duedate: colour_ndx = workflow_wizard.past - #colour = wxTheColourDatabase.FindColour("YELLOW") msg += "; Past Due " else: colour_ndx = workflow_wizard.ontime - #colour = wxTheColourDatabase.FindColour("GREEN") msg += "; on time " msg += repr(backcolour) @@ -179,15 +160,4 @@ self.grid.SetCellBackgroundColour(row, somecol, backcolour) self.grid.SetCellTextColour(row, somecol, forecolour) #print msg - -## get the attr for the wxAttrKind.Row (= 3) -## GetAttr needs the type of attr to get, despite what the docs say -## The values are: -## -## wxGridCellAttr.Any (Any == 0) -## wxGridCellAttr.Default -## wxGridCellAttr.Cell -## wxGridCellAttr.Row -## wxGridCellAttr.Col -## wxGridCellAttr.Merged Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.51 PanGalactic/pangalactic/utils/datamanager.py:1.52 --- PanGalactic/pangalactic/utils/datamanager.py:1.51 Fri Oct 24 14:52:50 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Tue Oct 28 16:53:01 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.51 $"[11:-2] +__version__ = "$Revision: 1.52 $"[11:-2] import time import mx.DateTime @@ -784,7 +784,7 @@ def updateWorkflow(self, wf_obj): #print "datamanager.updateworkflow" - self.localdb.Save([wf_obj], override = true) + self.localdb.Save([wf_obj], override = True) def saveWorkflow(self, wf_obj): self.localDB.Save([wf_obj]) Index: PanGalactic/pangalactic/utils/xmlrpcinterface.py diff -u PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.25 PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.26 --- PanGalactic/pangalactic/utils/xmlrpcinterface.py:1.25 Fri Oct 24 15:43:24 2003 +++ PanGalactic/pangalactic/utils/xmlrpcinterface.py Tue Oct 28 16:53:01 2003 @@ -3,10 +3,10 @@ """ PanGalactic Client XMLRPC Interfaces -@version: $Revision: 1.25 $ +@version: $Revision: 1.26 $ """ -__version__ = "$Revision: 1.25 $"[11:-2] +__version__ = "$Revision: 1.26 $"[11:-2] import xmlrpclib import types @@ -98,8 +98,9 @@ def getCategories(self, context): - # Category is a subclass of DataElement. FSC is a - # Category; it's passed in as the context + """ + Get all Category objects for the given context. + """ #print "xmlrpc.getcategories", context crit = {"id_context" : context} data = self._RPC.getObjects('Category', 0, 0, crit) @@ -113,17 +114,11 @@ if data: return [self._factory.remember(x) for x in data] - def getOrganization(self, ObjId): - #print "xmlrpc.getorganization" - data = self._RPC.getObjects('Organization', 'pgef_oid=%s' % ObjId) - if data: - return [self._factory.remember(x) for x in data] - def GetAcusByAssembly(self, assembly): """ Get all AssemblyComponentUsages in which the argument (a - L{pangalactic.enterprise.productmodelversion.ProductModelVersion} - is the _assembly (the object that contains the _component + L{pangalactic.enterprise.productmodelversion.ProductModelVersion}) + is the _assembly (the object that contains the acu's _component object). """ #print "in xmlrpcinterface.GetAcusByAssembly" From bmuir at ned.gsfc.nasa.gov Wed Oct 29 14:19:54 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Wed Oct 29 14:19:56 2003 Subject: [Pangalactic-commits] more test fix's Message-ID: <200310291919.h9TJJsu4003508@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.109 1.110 PanGalactic/pangalactic/client/tests/test_aboutbox.py 1.3 1.4 PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.12 1.13 Log message: more test fix's Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.109 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.110 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.109 Fri Oct 24 14:52:49 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Wed Oct 29 14:19:52 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.109 $"[11:-2] +__version__ = "$Revision: 1.110 $"[11:-2] # Python imports import copy @@ -197,7 +197,7 @@ self.currentproduct = ProductModelMaster(id_context = self.DataManager.currentProject) self.tempproduct = ProductModelMaster(id_context = self.DataManager.currentProject) except: - print "itemeditframe.setup.exception: building default productmaster instances" + #print "itemeditframe.setup.exception: building default productmaster instances" self.currentproduct = ProductMaster(id_context = self.DataManager.currentProject) self.tempproduct = ProductMaster(id_context = self.DataManager.currentProject) @@ -353,7 +353,10 @@ elif classname == "ProductModelMaster": self.pmm_pmv_form.GetTogglePmm().SetValue(1) except: - print " exception; failed to set pane radiobutton" + #print " exception; failed to set pane radiobutton" + #this try except is here because depending on when we create the form, there may not be + #a nodedata[2] + pass elif which_pane == self.PartsListPage or which_pane == self.PartDataPage: #print "setting up for pl" @@ -2204,6 +2207,8 @@ def SaveItemChanges(self): #if self.DataManager.creatingItem: + print self.DataManager.creatingPMM_PMV + print self.DataManager.creatingPM_PV if self.DataManager.creatingPMM_PMV or self.DataManager.creatingPM_PV: newitem = ProductModelVersion(id_context = self.DataManager.currentProject) self.pm_pv_form.Save(newitem) @@ -2212,14 +2217,14 @@ newitem.state = pangalactic.utils.objectstatus.ADD newitem.project = self.State.currentproject - try: + if 1:#try: newitem.Validate() - except RequiredDataError, e: - dlg = wxMessageDialog(self, e.__dict__['args'], "Required Product Data Missing!!!", wxOK | wxICON_ERROR) - dlg.ShowModal() - dlg.Destroy() - self.pmm_pmv_form.EditingMode() - return False + #except RequiredDataError, e: + #dlg = wxMessageDialog(self, e.__dict__['args'], "Required Product Data Missing!!!", wxOK | wxICON_ERROR) + #dlg.ShowModal() + #dlg.Destroy() + #self.pmm_pmv_form.EditingMode() + #return False #self.DataManager.creatingItem = False self.DataManager.creatingPMM_PMV = False Index: PanGalactic/pangalactic/client/tests/test_aboutbox.py diff -u PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.3 PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.4 --- PanGalactic/pangalactic/client/tests/test_aboutbox.py:1.3 Thu Oct 23 15:06:19 2003 +++ PanGalactic/pangalactic/client/tests/test_aboutbox.py Wed Oct 29 14:19:52 2003 @@ -12,7 +12,7 @@ self.VERSION = 'TEST' self.BUILD_DATE = '111111' dlg = None - dlg = modules.psm.aboutbox.AboutBox(None, -1, "About PGEF", wxPoint(20,20), wxSize(500,340)) + dlg = pangalactic.utils.aboutbox.AboutBox(None, -1, "About PGEF", wxPoint(20,20), wxSize(500,340)) dlg.GetVersion().SetLabel(str(self.VERSION)) dlg.GetBuildDate().SetLabel(str(self.BUILD_DATE)) dlg.CentreOnParent() Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.12 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.13 --- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.12 Tue Oct 28 15:00:13 2003 +++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py Wed Oct 29 14:19:52 2003 @@ -34,11 +34,11 @@ testframe.dm = datamanager.DataManager(testframe, true) nodedata = (None, None) self.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm) - #self.itemeditform.SetDisplayWgt(self.DisplayWgts) - #testframe.dm.localDB.Commit() + self.itemeditform.SetDisplayWgt(self.DisplayWgts) + testframe.dm.localDB.Commit() - #assert self.itemeditform != None, "Couldn't create ItemEditFrame" - #testframe.dm.localDB.db.close() + assert self.itemeditform != None, "Couldn't create ItemEditFrame" + testframe.dm.localDB.db.close() def testSavePLChanges(self): #print 'testSavePL' @@ -59,7 +59,6 @@ testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 2, 1, nodedata, testframe.dm) testframe.itemeditform.SetDisplayWgt(self.DisplayWgts) -##==> (postgres) removed from schema temppl.Type = 'test' temppl.owner = 'me' temppl.id = '1111' testframe.itemeditform.partslistform.FillFormWithObjectData(temppl) @@ -73,34 +72,36 @@ def testSaveItemChanges(self): #print 'testsaveItemChanges' - tempitem = pangalactic.enterprise.productmodelversion.ProductModelVersion() -##==> (postgres) removed from schema tempitem.Type = 'test' - productmodelversion.fillSampleProductModelVersion(tempitem) + tempitem = productmodelversion.ProductModelVersion() + tempitem.popTestData() self.DisplayWgts = wxFrame(None, -1, 'Display Widget') testframe = wxFrame(None, -1, 'Test Frame') testframe.State = psmstate.PSMState() testframe.dm = datamanager.DataManager(testframe, true) + testframe.dm.serverName = 'ned.gsfc.nasa.gov' + testframe.dm.serverPort = '8080' + testframe.dm.createServer() + testframe.WatchDog = securitymanager.SecurityManager(testframe.dm) result = testframe.dm.login('tstuser','test') testframe.dm.fillProjectList() testframe.dm.localDB.Commit() - testframe.dm.creatingItem = 1 nodedata = (None, None) testframe.State.currentproject = 'TEST' testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm) testframe.itemeditform.SetDisplayWgt(self.DisplayWgts) - testframe.itemeditform.itemform.FillFormWithObjectData(tempitem) - testframe.itemeditform.itemform.GetTextctrlLaunchDate().SetValue(time.asctime()) + testframe.itemeditform.pmm_pmv_form.FillFormWithPMVData(tempitem) + testframe.itemeditform.pmm_pmv_form.GetPmvRevisionTag().SetValue('new name') + testframe.dm.creatingPMM_PMV = True retcode = testframe.itemeditform.SaveItemChanges() - #print 'got here 1' + print 'got here: retcode is:',retcode testframe.dm.localDB.Commit() assert retcode == true, 'SaveItemchanges failed' - testframe.dm.localDB.db.close() + #testframe.dm.localDB.db.close() def testChangesMade(self): #print 'testchangesmade' tempitem = productmodelversion.ProductModelVersion() -##==> (postgres) removed from schema tempitem.Type = 'test' productmodelversion.fillSampleProductModelVersion(tempitem) self.DisplayWgts = wxFrame(None, -1, 'Display Widget') @@ -121,8 +122,6 @@ testitem = productmodelversion.ProductModelVersion() testitem.creator = 'me' testitem.create_datetime = '12432' -##==> (postgres) removed from schema testitem.CriticalityCode = '5' -##==> (postgres) removed from schema testitem.LaunchDate = '5555' testframe.itemeditform.currentitem = testitem retval = testframe.itemeditform.ChangesMade() @@ -133,7 +132,6 @@ def testSaveChanges(self): tempitem = producmodelversion.Item() -##==> (postgres) removed from schema tempitem.Type = 'test' productmodelversion.fillSampleProductModelVersion(tempitem) self.DisplayWgts = wxFrame(None, -1, 'Display Widget') @@ -162,7 +160,6 @@ def testOnSavePartsList(self): temppl = partslist.PartsList() partslist.FillSamplePartsList(temppl) -##==> (postgres) removed from schema temppl.Type = 'test' temppl.owner = 'me' temppl.id = '1111' temppl._upload_file_name = 'sample.xls' @@ -190,7 +187,6 @@ def testSaveItem(self): tempitem = productmodelversion.ProductModelVersion() -##==> (postgres) removed from schema tempitem.Type = 'test' productmodelversion.fillSampleProductModelVersion(tempitem) self.DisplayWgts = wxFrame(None, -1, 'Display Widget') @@ -216,7 +212,6 @@ def testLinkDocument(self): tempitem = productmodelversion.ProductModelVersion() -##==> (postgres) removed from schema tempitem.Type = 'test' productmodelversion.fillSampleProductModelVersion(tempitem) testdoc = document.Document() @@ -246,7 +241,6 @@ def testUnlinkDocument(self): tempitem = productmodelversion.ProductModelVersion() -##==> (postgres) removed from schema tempitem.Type = 'test' productmodelversion.fillSampleProductModelVersion(tempitem) testdoc = document.Document() @@ -318,7 +312,7 @@ itemsuite = unittest.TestSuite() itemsuite.addTest(ItemEditFrameTest("Title")) itemsuite.addTest(ItemEditFrameTest("testCreateItemEditFrame")) - #itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges")) + itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges")) #itemsuite.addTest(ItemEditFrameTest("testSavePLChanges")) #itemsuite.addTest(ItemEditFrameTest("testChangesMade")) #itemsuite.addTest(ItemEditFrameTest("testSaveChanges")) From waterbug at ned.gsfc.nasa.gov Wed Oct 29 17:05:30 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 29 17:05:31 2003 Subject: [Pangalactic-commits] Begin mods to handle mapped classes. Message-ID: <200310292205.h9TM5UbL004937@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/factory.py 1.31 1.32 Log message: Begin mods to handle mapped classes. Index: PanGalactic/pangalactic/repo/factory.py diff -u PanGalactic/pangalactic/repo/factory.py:1.31 PanGalactic/pangalactic/repo/factory.py:1.32 --- PanGalactic/pangalactic/repo/factory.py:1.31 Tue Oct 21 17:32:28 2003 +++ PanGalactic/pangalactic/repo/factory.py Wed Oct 29 17:05:28 2003 @@ -1,11 +1,11 @@ -# $Id: factory.py,v 1.31 2003/10/21 21:32:28 waterbug Exp $ +# $Id: factory.py,v 1.32 2003/10/29 22:05:28 waterbug Exp $ """ Pan Galactic Object Factory module -@version: $Revision: 1.31 $ +@version: $Revision: 1.32 $ """ -__version__ = "$Revision: 1.31 $"[11:-2] +__version__ = "$Revision: 1.32 $"[11:-2] import types from pprint import pprint @@ -58,15 +58,22 @@ Convert a pyPgSQL PgResultSet into an "extract" (see L{pangalactic.utils.factory.extract}). """ - obj = self._registry.pgerdb_classes[res.pgef_class] - schema = obj._schema - module = obj.__module__ - s = [ (a, self.cook(getattr(res, a), schema[a])) - for a in schema ] - instdict = dict(s) - name = module + '.' + res.pgef_class - e = [ name, instdict ] - return e + if res.pgef_class in self._registry.pgef_classes: + _class = self._registry.pgef_classes[res.pgef_class] + if res.pgef_class in self._registry.core_classes: + schema = _class._schema + module = _class.__module__ + s = [ (a, self.cook(getattr(res, a), schema[a])) + for a in schema ] + instdict = dict(s) + name = module + '.' + res.pgef_class + e = [ name, instdict ] + return e + else: + pass + else: + e = """'%s' is not a type known to the registry.""" % res.pgef_class + raise TypeError, e def resultlist2Extract(self, reslist): """ @@ -76,7 +83,7 @@ # This code depends on the fact that 'pgef_class' is the # second attribute in *all* PGER tables (because it is # the second attribute of PgefObject). - obj = self._registry.pgerdb_classes[reslist[1]] + obj = self._registry.core_classes[reslist[1]] schema = obj._schema module = obj.__module__ s = [ (a, self.cook(reslist[self._registry.table_cols.index(a)], @@ -149,7 +156,7 @@ Make PGEF Objects from PgerDb query results. More specifically: take a class name that occurs in the - pgerdb_classes or pgef_classes attrs of + core_classes or pgef_classes attrs of L{pangalactic.repo.registry.PgerObjectRegistry} and an adbapi deferred query result and return a list of instances of the specified class. @@ -162,8 +169,8 @@ @param resultsets: a deferred list of PgResultSets from L{pangalactic.repo.db.PgerDb} """ - klass = self._registry.pgerdb_classes[classname] - schema = klass._schema + _class = self._registry.core_classes[classname] + schema = _class._schema objectlist = [] for row in resultsets: # create kw dict for initialization string ... @@ -171,7 +178,7 @@ for a in schema: initparms[a] = getattr(row, a) # initialize the object - o = klass(**initparms) + o = _class(**initparms) objectlist.append(o) return objectlist From pbear at ned.gsfc.nasa.gov Wed Oct 29 17:06:57 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Wed Oct 29 17:06:59 2003 Subject: [Pangalactic-commits] fixed projects vs projectobjects; handle traceback in dbbrowser Message-ID: <200310292206.h9TM6vET005017@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py 1.15 1.16 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.110 1.111 PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py 1.20 1.21 PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.42 1.43 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.21 1.22 PanGalactic/pangalactic/utils/datamanager.py 1.52 1.53 PanGalactic/pangalactic/utils/dbbrowser.py 1.5 1.6 PanGalactic/pangalactic/utils/localdb.py 1.44 1.45 Log message: fixed projects vs projectobjects; handle traceback in dbbrowser Index: PanGalactic/pangalactic/utils/dbbrowser.py diff -u PanGalactic/pangalactic/utils/dbbrowser.py:1.5 PanGalactic/pangalactic/utils/dbbrowser.py:1.6 --- PanGalactic/pangalactic/utils/dbbrowser.py:1.5 Tue Oct 28 16:53:01 2003 +++ PanGalactic/pangalactic/utils/dbbrowser.py Wed Oct 29 17:06:55 2003 @@ -204,8 +204,7 @@ if curr_cols > maxcols: maxcols = curr_cols except: - print "Eek. An Exception. Eek." - print "But seriously... ungriddable object", obj_id + print "dbbrowser.fillgrid: Attempt to count an ungriddable object" if self.grid.GetNumberCols() > 0: self.grid.DeleteCols(0, self.grid.GetNumberCols()) @@ -220,8 +219,7 @@ col += 1 curr_row += 1 except: - print "Eek. Another Exception. Eek." - print "But seriously... ungriddable object", obj_id + print "dbbrowser.fillgrid: Attempt to display an ungriddable object" self.grid.AutoSizeColumns(true) Index: PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py diff -u PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py:1.15 PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py:1.16 --- PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py:1.15 Fri Sep 26 15:47:11 2003 +++ PanGalactic/pangalactic/client/modules/psm/documenttreeframe.py Wed Oct 29 17:06:54 2003 @@ -16,7 +16,7 @@ import pangalactic.utils.objectstatus as objectstatus import pangalactic.utils.preferences as preferences -__version__ = "$Revision: 1.15 $"[11:-2] +__version__ = "$Revision: 1.16 $"[11:-2] class DocumentTreeFrame(doctreeframe.DocTreeFrame): @@ -104,7 +104,7 @@ projlist = {} else: projlist = {} - projlist[newdoc.pgef_oid] = {"type": "document"} #vwk + projlist[newdoc.pgef_oid] = "document" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist if self.EditMode: Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.52 PanGalactic/pangalactic/utils/datamanager.py:1.53 --- PanGalactic/pangalactic/utils/datamanager.py:1.52 Tue Oct 28 16:53:01 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Wed Oct 29 17:06:55 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.52 $"[11:-2] +__version__ = "$Revision: 1.53 $"[11:-2] import time import mx.DateTime @@ -145,25 +145,25 @@ #print 'saving a product master', product_master #self.localDB.Save([product_master]) self.localDB.Add([product_master]) - projlist[product_master.pgef_oid] = {"type" : "pm"} + projlist[product_master.pgef_oid] = "pm" if product_version: #print 'saving a product version', product_version #self.localDB.Save([product_version]) self.localDB.Add([product_version]) - projlist[product_version.pgef_oid] = {"type" : "pv"} + projlist[product_version.pgef_oid] = "pv" if product_model_master: #print 'saving a product model master', product_model_master #self.localDB.Save([product_model_master]) self.localDB.Add([product_model_master]) - projlist[product_model_master.pgef_oid] = {"type" : "pmm"} + projlist[product_model_master.pgef_oid] = "pmm" if product_model_version: #print 'saving a product model version', product_model_version #self.localDB.Save([product_model_version]) self.localDB.Add([product_model_version]) - projlist[product_model_version.pgef_oid] = {"type" : "pmv"} + projlist[product_model_version.pgef_oid] = "pmv" self.localDB.GetProjectObjects()[self.currentProject] = projlist return product_master, product_version, product_model_master, product_model_version @@ -295,7 +295,7 @@ for item in data: tempobjlist.append(item) classname = item.__class__.__name__ - tempids[item.pgef_oid] = {"type" : classname} + tempids[item.pgef_oid] = classname #if classname == "ProductModelVersion": #print "retrieving a", classname #print " ~", item.name @@ -307,17 +307,17 @@ ### print "pms", len(pms) ## for item in pms: ## tempobjlist.append(item) -## tempids[item.pgef_oid] = {"type" : "ProductMaster"} +## tempids[item.pgef_oid] = "ProductMaster" ## if pvs: ### print "pvs", len(pvs) ## for item in pvs: ## tempobjlist.append(item) -## tempids[item.pgef_oid] = {"type" : "ProductVersion"} +## tempids[item.pgef_oid] = "ProductVersion" ## if pmms: ### print "pmms", len(pmms) ## for item in pmms: ## tempobjlist.append(item) -## tempids[item.pgef_oid] = {"type" : "ProductModelMaster"} +## tempids[item.pgef_oid] = "ProductModelMaster" if len(tempobjlist) > 0: @@ -429,7 +429,7 @@ if projectobjs.has_key(self.currentProject): projdict = projectobjs[self.currentProject] for acuobj in updatedacuobjs: - projdict[acuobj.pgef_oid] = {"type" : "AssemblyComponentUsage"} + projdict[acuobj.pgef_oid] = "AssemblyComponentUsage" projectobjs[self.currentProject] = projdict self.localDB.SetProjectObjects(projectobjs) @@ -713,7 +713,7 @@ self.localDB.Add([NAUOtoAdd]) projlist = self.localDB.GetProjectObjects()[self.currentProject] - projlist[NAUOtoAdd.pgef_oid] = {"type" : "AssemblyComponentUsage"} + projlist[NAUOtoAdd.pgef_oid] = "AssemblyComponentUsage" self.localDB.GetProjectObjects()[self.currentProject] = projlist Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.110 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.111 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.110 Wed Oct 29 14:19:52 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Wed Oct 29 17:06:54 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.110 $"[11:-2] +__version__ = "$Revision: 1.111 $"[11:-2] # Python imports import copy @@ -834,7 +834,7 @@ projlist = {} else: projlist = {} - projlist[newdoc.pgef_oid] = {"type" : "Document"} #vwk + projlist[newdoc.pgef_oid] = "document" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist if self.EditDoc: @@ -926,7 +926,7 @@ projlist = {} else: projlist = {} - projlist[link.pgef_oid] = {"type" : "pdr_document"} #vwk + projlist[link.pgef_oid] = "pdr_document" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist parent = self.DataManager.localDB.GetItem(self.rootitemid) @@ -1242,7 +1242,7 @@ else: #print "new project key" projlist = {} - projlist[save_object.pgef_oid] = {"type" : "pmv"} #vwk + projlist[save_object.pgef_oid] = "pmv" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist if self.rootitemid == None and self.rootnauoid == None: @@ -1363,7 +1363,7 @@ projlist = {} else: projlist = {} - projlist[pl.pgef_oid] = {"type" : "parts_list"} #vwk + projlist[pl.pgef_oid] = "parts_list" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist if self.EditPL: @@ -1435,7 +1435,7 @@ projlist = {} else: projlist = {} - projlist[link.pgef_oid] = {"type" : "pdr_parts_list"} #vwk + projlist[link.pgef_oid] = "pdr_parts_list" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist node = self.doctree.GetSelection() @@ -2237,7 +2237,7 @@ projlist = {} else: projlist = {} - projlist[newitem.pgef_oid] = {"type" : "pmv"} #vwk + projlist[newitem.pgef_oid] = "pmv" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist return True Index: PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py diff -u PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.20 PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.21 --- PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py:1.20 Thu Oct 23 15:06:18 2003 +++ PanGalactic/pangalactic/client/modules/psm/partslisttreeframe.py Wed Oct 29 17:06:54 2003 @@ -25,7 +25,7 @@ except: print "partslisttreeframe.plmimport.failed" -__version__ = "$Revision: 1.20 $"[11:-2] +__version__ = "$Revision: 1.21 $"[11:-2] class PartsListTreeFrame(doctreeframe.DocTreeFrame): @@ -129,7 +129,7 @@ projlist = {} else: projlist = {} - projlist[partslist.pgef_oid] = {"type": "parts_list"} #vwk + projlist[partslist.pgef_oid] = "parts_list" #vwk self.DataManager.localDB.GetProjectObjects()[self.State.currentproject] = projlist if self.EditMode: Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.42 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.43 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.42 Thu Oct 23 15:06:19 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Wed Oct 29 17:06:54 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.42 2003/10/23 19:06:19 pbear Exp $ +# $Id: pgefadvisory.py,v 1.43 2003/10/29 22:06:54 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.42 $"[11:-2] +__version__ = "$Revision: 1.43 $"[11:-2] import os.path import string @@ -66,12 +66,22 @@ # leave this here... I use it to generate old data -vwk # -# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) -# earlier = now + mx.DateTime.RelativeDateTime(days=-40) -# self.pger_create_datetime = earlier -# self.pger_mod_datetime = earlier -# self.create_datetime = earlier -# self.mod_datetime = earlier +# -55, wf0 -> lost cause +# -45, wf0 -> very late +# -35, wf0 -> late +# -30, wf0 -> past due +# +# -90, wf1 -> lost cause +# -80, wf1 -> very late +# -60, wf1 -> late +# -30, wf1 -> past due +# + now = mx.DateTime.DateFromTicks(mx.DateTime.now()) + earlier = now + mx.DateTime.RelativeDateTime(days=-90) + self.pger_create_datetime = earlier + self.pger_mod_datetime = earlier + self.create_datetime = earlier + self.mod_datetime = earlier def __getattr__(self, name): Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.21 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.22 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.21 Mon Oct 27 15:41:41 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Wed Oct 29 17:06:55 2003 @@ -159,9 +159,9 @@ EVT_BUTTON(self, WF_ACTMOVEUP_ROW, self.OnMoveUp) EVT_BUTTON(self, WF_ACTMOVEDOWN_ROW, self.OnMoveDown) - EVT_BUTTON(self, WF_ACTDELETE_ROW, self.OnDeleteRow) + EVT_BUTTON(self, WF_ACTDELETE_ROW, self.OnDeleteActivity) EVT_BUTTON(self, WF_TRANSGENERATE, self.OnGenerateTransitions) - EVT_BUTTON(self, WF_TRANSDELETE_ROW, self.OnDeleteRow) + EVT_BUTTON(self, WF_TRANSDELETE_ROW, self.OnDeleteTransition) EVT_GRID_CELL_LEFT_DCLICK(self.transitiongrid, self.OnEdit) EVT_GRID_CELL_CHANGE(self.transitiongrid, self.OnCellChange) @@ -598,8 +598,24 @@ self.transitiongrid.SetCellValue(ndx, 0, actlist[ndx]) self.transitiongrid.SetCellValue(ndx, 1, actlist[ndx+1]) - def OnDeleteRow(self, event = None): - #print "workflowwizard.deleterow" + def OnDeleteActivity(self, event = None): + print "workflowwizard.deleteactivity" + + if self.activitygrid.IsCellEditControlEnabled(): + self.activitygrid.HideCellEditControl() + self.activitygrid.DisableCellEditControl() + + if self.activitygrid.IsSelection(): + self.activitygrid.ClearSelection() + + if self.ActSelectedRow <> None: + self.activitygrid.DeleteRows(self.ActSelectedRow) + self.ActSelectedRow = None + + + def OnDeleteTransition(self, event = None): + print "workflowwizard.deletetransition" + if self.transitiongrid.IsCellEditControlEnabled(): self.transitiongrid.HideCellEditControl() self.transitiongrid.DisableCellEditControl() Index: PanGalactic/pangalactic/utils/localdb.py diff -u PanGalactic/pangalactic/utils/localdb.py:1.44 PanGalactic/pangalactic/utils/localdb.py:1.45 --- PanGalactic/pangalactic/utils/localdb.py:1.44 Tue Oct 28 16:53:01 2003 +++ PanGalactic/pangalactic/utils/localdb.py Wed Oct 29 17:06:55 2003 @@ -52,6 +52,7 @@ PFRDICT = "PFRDICT" PLFRDICT = "PLFRDICT" FFILEDICT = "FFILEDICT" + PROJECT = 'Project' PROJECTOBJECTS = 'ProjectObjects' UNCOMMITTEDDOCUMENTIDS = 'UncommittedDocumentIDs' UNCOMMITTEDOBJECTS = "UncommittedObjects" @@ -98,6 +99,7 @@ (USER, 0), (ROLES, 0), (PDRMAP, 0), + (PROJECT, 0), (PROJECTOBJECTS, 0), (PMBYPRIMARYKEY, 1), (PVBYPRIMARYKEY, 1), @@ -968,6 +970,11 @@ return projects + def GetProjects(self): + projects = self.dbroot[self.PROJECT] + return projects + + def GetRoles(self): return self.dbroot[self.ROLES] @@ -1012,13 +1019,14 @@ def saveCompoundKey(self, obj, key): dictname = None - if obj.__class__.__name__ == 'ProductModelVersion': + classname = obj.__class__.__name__ + if classname == 'ProductModelVersion': dictname = self.PMVBYPRIMARYKEY - elif obj.__class__.__name__ == 'ProductModelMaster': + elif classname == 'ProductModelMaster': dictname = self.PMMBYPRIMARYKEY - elif obj.__class__.__name__ == 'ProductVersion': + elif classname == 'ProductVersion': dictname = self.PVBYPRIMARYKEY - elif obj.__class__.__name__ == 'ProductMaster': + elif classname == 'ProductMaster': dictname = self.PMBYPRIMARYKEY if dictname: self.dbroot[dictname][key] = obj @@ -1039,14 +1047,19 @@ self.dbroot[self.PROJECTOBJECTS] = objects self.Commit() + def SetProjects(self, objects): + self.dbroot[self.PROJECT] = objects + self.Commit() + def Save(self, unsavedlist, override = false): #print "localdb.save" retlist = [] if unsavedlist: #print "have unsaved list; len: " + str(len(unsavedlist)) for obj in unsavedlist: - #print obj.__class__.__name__, obj.id, obj.name - if obj.__class__.__name__ == "AssemblyComponentUsage": + classname = obj.__class__.__name__ + #print classname, obj.id, obj.name + if classname == "AssemblyComponentUsage": #print "localdb.save.acu" if self.dbroot[self.ACUDICT].has_key(obj.pgef_oid): #print "have key" @@ -1065,7 +1078,7 @@ #print "no key", obj.pgef_oid, obj.id retlist.extend(self.SaveACU([obj])) - elif obj.__class__.__name__ == "ProductModelVersion": + elif classname == "ProductModelVersion": #print "have ProductModelVersion" if self.dbroot[self.ITEMDICT].has_key(obj.pgef_oid): #print "have key" @@ -1083,7 +1096,7 @@ #print "no key" self.SavePMV([obj]) - elif obj.__class__.__name__ == "PartsList": + elif classname == "PartsList": #print "have partslist" if self.dbroot[self.PARTSLISTDICT].has_key(obj.pgef_oid): @@ -1095,7 +1108,7 @@ else: self.SavePartsList([obj]) - elif obj.__class__.__name__ == "ProductDocumentRelationship": + elif classname == "ProductDocumentRelationship": #print "save pdr " + obj.pgef_oid if self.dbroot[self.PDRDICT].has_key(obj.pgef_oid): @@ -1127,7 +1140,7 @@ else: self.SaveDocument([obj]) - elif obj.__class__.__name__ == "ProductModelMaster": + elif classname == "ProductModelMaster": #print 'found a ProductModelMaster' if self.dbroot[self.PRODUCTMODELMASTER].has_key(obj.pgef_oid): if self.dbroot[self.PRODUCTMODELMASTER][obj.pgef_oid].state: @@ -1138,7 +1151,7 @@ else: self.SavePMM([obj]) - elif obj.__class__.__name__ == "ProductVersion": + elif classname == "ProductVersion": #print 'found a ProductVersion' if self.dbroot[self.PRODUCTVERSION].has_key(obj.pgef_oid): if self.dbroot[self.PRODUCTVERSION][obj.pgef_oid].state: @@ -1149,7 +1162,7 @@ else: self.SavePV([obj]) - elif obj.__class__.__name__ == "ProductMaster": + elif classname == "ProductMaster": #print 'found a ProductMaster' if self.dbroot[self.PRODUCTMASTER].has_key(obj.pgef_oid): if self.dbroot[self.PRODUCTMASTER][obj.pgef_oid].state: @@ -1160,7 +1173,7 @@ else: self.SavePM([obj]) - elif obj.__class__.__name__ == "WfProcess": + elif classname == "WfProcess": #print "localdb.save.wfprocess" if self.dbroot[self.WFPROCESS].has_key(obj.pgef_oid): #print "have key" @@ -1179,7 +1192,7 @@ #print "no key", obj.pgef_oid self.SaveWfProcess([obj]) - elif obj.__class__.__name__ == "WfActivity": + elif classname == "WfActivity": #print "localdb.save.wfactivity" if self.dbroot[self.WFACTIVITY].has_key(obj.pgef_oid): #print "have key" @@ -1198,7 +1211,7 @@ #print "no key", obj.pgef_oid self.SaveWfActivity([obj]) - elif obj.__class__.__name__ == "WfEventAudit": + elif classname == "WfEventAudit": #print "localdb.save.wfeventaudit" if self.dbroot[self.WFEVENTAUDIT].has_key(obj.pgef_oid): #print "have key" @@ -1217,7 +1230,7 @@ #print "no key", obj.pgef_oid self.SaveWfEventAudit([obj]) - elif obj.__class__.__name__ == "WfTransition": + elif classname == "WfTransition": if self.dbroot[self.WFTRANSITION].has_key(obj.pgef_oid): #print "have key" #print "objid: " + obj.pgef_oid @@ -1234,25 +1247,26 @@ else: #print "no key", obj.pgef_oid self.SaveWfTransition([obj]) - elif obj.__class__.__name__ == "Project": - if self.dbroot[self.PROJECTOBJECTS].has_key(obj.pgef_oid): + elif classname == "Project": + print "saving a project. not project objects" + if self.dbroot[self.PROJECT].has_key(obj.pgef_oid): #print "have key" #print "objid: " + obj.pgef_oid #print "obj state: " + str(obj.state) - if self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid].state: + if self.dbroot[self.PROJECT][obj.pgef_oid].state: #print "have state" #print "obj.state " + str(obj.state) if override: #print "override", obj.pgef_oid - self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj + self.dbroot[self.PROJECT][obj.pgef_oid] = obj else: #print "no state", obj.pgef_oid - self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj + self.dbroot[self.PROJECT][obj.pgef_oid] = obj else: #print "no key", obj.pgef_oid - self.dbroot[self.PROJECTOBJECTS][obj.pgef_oid] = obj + self.dbroot[self.PROJECT][obj.pgef_oid] = obj else: - print "have unknown obj to save", obj.__class__.__name__, obj.id + print "have unknown obj to save", classname, obj.id self.Commit() #print "retlist", retlist From waterbug at ned.gsfc.nasa.gov Wed Oct 29 17:07:22 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 29 17:07:24 2003 Subject: [Pangalactic-commits] Inching toward mapped classes ... Message-ID: <200310292207.h9TM7M24005047@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/pger.py 1.46 1.47 PanGalactic/pangalactic/repo/pgercred.py 1.4 1.5 PanGalactic/pangalactic/repo/registry.py 1.35 1.36 PanGalactic/pangalactic/repo/xmlrpc.py 1.22 1.23 Log message: Inching toward mapped classes ... Index: PanGalactic/pangalactic/repo/xmlrpc.py diff -u PanGalactic/pangalactic/repo/xmlrpc.py:1.22 PanGalactic/pangalactic/repo/xmlrpc.py:1.23 --- PanGalactic/pangalactic/repo/xmlrpc.py:1.22 Tue Oct 7 23:39:36 2003 +++ PanGalactic/pangalactic/repo/xmlrpc.py Wed Oct 29 17:07:21 2003 @@ -1,9 +1,9 @@ """ PGER XML-RPC Interfaces module -@version: $Revision: 1.22 $ +@version: $Revision: 1.23 $ """ -__version__ = "$Revision: 1.22 $"[11:-2] +__version__ = "$Revision: 1.23 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/xmlrpc.py,v $ from twisted.web import xmlrpc @@ -32,15 +32,21 @@ self.PGER = pgr def xmlrpc_yo(self): - """xmlrpc yo.""" + """ + XMLRPC yo. + """ return 'Yo' def xmlrpc_openPodBayDoor(self): - """xmlrpc request to open the pod bay door.""" + """ + XMLRPC request to open the Pod Bay Door. + """ return """I'm sorry, Dave, I'm afraid I can't do that.""" def xmlrpc_test_echoargs(self, *args): - """xmlrpc request for echo of args.""" + """ + XMLRPC request for echo of arguments. + """ if args: l = list(args) return l @@ -49,6 +55,17 @@ s += """ya gotta have somethin' ...!""" return s + def xmlrpc_echo_binary(self, blob): + """ + XMLRPC request with binary data.""" + if blob: + comment = 'I got this from you' + return [comment, blob] + else: + s = """Nothin' from nothin' LEAVES nothin', """ + s += """ya gotta have somethin' ...!""" + return s + def xmlrpc_getObjects(self, typename, refs, subtypes, criteria): """ @@ -101,30 +118,60 @@ def xmlrpc_addObjects(self, extracts): """xmlrpc method to add objects. - usage: addObjects(list of extracts) + @type extracts: list + @param extracts: a list of extracts (for the definition + of extracts, see + L{pangalactic.utils.factory.PgefFactory}) + + @rtype: list + @return: a list of extracts: the objects that were + added, with any relevant updates (e.g., + timedate stamps) """ - # TODO: it would be more efficient to convert the extract - # directly into the (classname, kw) used by PgerDb's - # addRow(), rather than making an object and then - # creating the (classname, kw) from that. But this is - # easier for now ... if extracts: - # need some error checking here! - # also, could make it so arg could be either a single - # extract or a list of extracts ... + return self.PGER.addExtracts(extracts) + else: + return """I'm sorry, Dave, I'm afraid I can't do that.""" + + def xmlrpc_addObjectsAndBlobs(self, extracts, blobs): + """xmlrpc method to add objects. + + @type extracts: list + @param extracts: a list of extracts (for the definition + of extracts, see + L{pangalactic.utils.factory.PgefFactory}) + + @type blobs: list + @param blobs: a list of binary objects, which will be + saved to files on the server and referenced + from PgefFile objects. NOTE: for each blob, + there should be a corresponding + L{pangalactic.enterprise.pgeffile.PgefFile} + instance in the list of extracts, and they + should occur in the same order in the + extracts as their blob occurs in the blobs + list. + + @rtype: list + @return: a list of extracts: the objects that were + added, with any relevant updates (e.g., + timedate stamps) + """ + if extracts and data: + try: + res = self.PGER.addExtracts(extracts) + except: + text = """I'm sorry, Dave, there was a problem""" + text += """with your objects.""" + return text + # if the extracts have been added successfully, write + # the blobs to files ... + elif extracts: return self.PGER.addExtracts(extracts) else: return """I'm sorry, Dave, I'm afraid I can't do that.""" def xmlrpc_createProductMaster(self, *args): - # Could define args as keyword args (a la 'parm=value' - # syntax), but then XMLRPC won't check anything for us - # because it doesn't know from keyword args. So which - # is worse: plain args and you have to remember the - # order, or kw args and you have to remember the - # spelling and the weird 'parm=value' syntax ...? - # Right now they are split: required args are strictly - # positional and optional args are strictly keywords. if args: kw = keywordify(args) pmoid = self.PGER.createProductMaster(**kw) Index: PanGalactic/pangalactic/repo/pger.py diff -u PanGalactic/pangalactic/repo/pger.py:1.46 PanGalactic/pangalactic/repo/pger.py:1.47 --- PanGalactic/pangalactic/repo/pger.py:1.46 Mon Oct 27 15:16:56 2003 +++ PanGalactic/pangalactic/repo/pger.py Wed Oct 29 17:07:21 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Entropy Reverser module -@version: $Revision: 1.46 $ +@version: $Revision: 1.47 $ """ -__version__ = "$Revision: 1.46 $"[11:-2] +__version__ = "$Revision: 1.47 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pger.py,v $ import time @@ -89,9 +89,51 @@ def getResultSets(self, typename, refs=0, subtypes=0, **kw): """ + (A wrapper interface through which any PgefObject subclass + can be requested.) For core object classes, call + _getResultSets. For mapped object classes, call the + specific interface associated with that typename (e.g., + getDocuments), with some reasonable defaults (e.g., for + Documents, get only the current version). + + @type typename: string + @param typename: the name of a PGER object type (i.e., a + subtype of + L{pangalactic.enterprise.pgefobject.PgefObject}) + + @type refs: integer + @param refs: specifies whether to include the objects + referenced by the specified class. + 0: (default) do not get refs + 1: get all references + (in future, refs may specify how many + reference levels to follow ...) + + @type subtypes: boolean + @param subtypes: specifies whether to include only the + specified class (the default) or all + subtypes. + 0: (default) only this type + 1: include subtypes + + @param kw: keyword arguments of the form: + key: an attribute of the object + value: the value to be selected by + + @rtype: list + @return: list of pyPgSQL result sets + """ + if typename in self._registry.mapped_classes: + if self._registry.pgef_classes[typename] == 'Document': + return self.getDocuments(subtypes, objects=0, **kw) + else: + return self._getResultSets(typename, refs, subtypes, **kw) + + def _getResultSets(self, typename, refs=0, subtypes=0, **kw): + """ From the table corresponding to the specified type, get all PGERDB rows that match the supplied kw parameters. - - usage: getResultSets([object type name], refs, **kw) + - usage: _getResultSets([object type name], refs, **kw) - return a list of pyPgSQL ResultSet instances - TO DO: role-based authorization checks based on object type, etc. @@ -101,7 +143,7 @@ subtype of L{pangalactic.enterprise.pgefobject.PgefObject}) - @type refs: integer + @type refs: boolean @param refs: specifies whether to include the objects referenced by the specified class. 0: (default) do not get refs @@ -192,8 +234,8 @@ [refs,] [subtypes,] **kw) - - get any repository object type by attributes - - return a list of objects + - get repository objects by attributes + - return a list of the objects - TO DO: role-based authorization checks based on object type, etc. @@ -228,15 +270,79 @@ dbargs = [] for a in kw.keys(): if not a in self._registry.table_cols[table]: - raise ValueError, '%s is not in the schema of %s' % (a, tn) + e = '%s is not in the table schema of %s' % (a, tn) + raise ValueError, e dbargs.append((a, kw[a])) - result = self._pgerdb.doPgerdbQuery(table, 0, *dbargs) + result = self._pgerdb.doPgerdbQuery(table, subtypes, *dbargs) result.addErrback(log.err) return result.addCallback(lambda res: self._factory.makeObjects(tn, res)) else: raise ValueError, 'No criteria were supplied.' + def getDocuments(self, typename, subtypes=0, objects=0, **kw): + """ + Get all Document objects of a specified type that match + the supplied kw parameters + - usage: getDocuments([Document subtype], + [subtypes,] + [objects,] + **kw) + - get Documents by attributes + - return a list of Document objects or resultsets + - TO DO: role-based authorization checks based on + Documents type, etc. + + @type typename: string + @param typename: the name of the document class (a subtype of + L{pangalactic.enterprise.document.Document}) + + @type subtypes: boolean + @param subtypes: specifies whether to include only the + specified class (the default) or all + subtypes. + - 0: only this type + - 1: include subtypes + + @type objects: boolean + @param objects: specifies whether to return objects + of the type specified or resultsets. + - 0: resultsets + - 1: objects + + @param kw: keyword arguments of the form: + key: an attribute of the object + value: the value to be selected by + + @rtype: list + @return: list of either resultsets (default, object=0) + or Document (or subtype) objects (object=1). + """ + # TODO: implement refs and subtypes ... + view = self._registry.getViewName(typename) + viewall = view + '_all' + tn = typename + if kw: + # basic validity check on kw args ... + dbargs = [] + for a in kw.keys(): + if not a in self._registry.view_cols[view]: + e = '%s is not in the view schema of %s' % (a, tn) + raise ValueError, e + dbargs.append((a, kw[a])) + if subtypes: + result = self._pgerdb.doPgerdbQuery(viewall, 0, *dbargs) + else: + result = self._pgerdb.doPgerdbQuery(view, 0, *dbargs) + result.addErrback(log.err) + if objects: + return result.addCallback(lambda res: + self._factory.makeObjects(tn, res)) + else: + return result + else: + raise ValueError, 'No criteria were supplied.' + def getDisplayMappings(self, typename=None): """ Given an object type name, return a mapping of attribute @@ -267,7 +373,7 @@ def search(self, typename, refs=1, subtypes=0, - returntype='objects', *args): + objects=0, *args): """ Search for all records from the table or view that matches the specified arguments for the specified type. @@ -284,6 +390,27 @@ subtype of L{pangalactic.enterprise.pgefobject.PgefObject}) + @type refs: boolean + @param refs: specifies whether to include the objects + referenced by the specified class. + 0: (default) do not get refs + 1: get all references + (in future, refs may specify how many + reference levels to follow ...) + + @type subtypes: boolean + @param subtypes: specifies whether to include only the + specified class (the default) or all + subtypes. + 0: (default) only this type + 1: include subtypes + + @type objects: boolean + @param objects: specifies whether to return objects + of the type specified or resultsets. + - 0: resultsets + - 1: objects + @type args: sequence @param args: a list of query element tuples, in which each tuple has the form: @@ -311,12 +438,6 @@ column name) or a list or tuple of column names - - B{returntype}: type of things to return; - the valid returntypes implemented so far are: - - - 'objects' ...... PgefObject subtype instances - - 'resultsets' ... database result sets - @rtype: L{twisted.internet.defer.Deferred} sequence of resultsets or sequence of instances of subtypes of @@ -334,7 +455,6 @@ raise TypeError, e elif a[0] == 'fulltext': # do Glimpse search on fulltext string - # TO DO: get returntype from call dft = self._searchFulltext(typename, a[1]) fulltext = 1 else: @@ -344,7 +464,7 @@ # TODO: implement refs and subtypes ... result = self._pgerdb.doPgerdbQuery(table, 0, *dbargs) result.addErrback(log.err) - if returntype == 'objects': + if objects: return result.addCallback(lambda res: self._factory.makeObjects(typename, res)) else: Index: PanGalactic/pangalactic/repo/pgercred.py diff -u PanGalactic/pangalactic/repo/pgercred.py:1.4 PanGalactic/pangalactic/repo/pgercred.py:1.5 --- PanGalactic/pangalactic/repo/pgercred.py:1.4 Fri Sep 26 22:30:49 2003 +++ PanGalactic/pangalactic/repo/pgercred.py Wed Oct 29 17:07:21 2003 @@ -1,9 +1,9 @@ """ Authentication and credentials for PGEF. -@version: $Revision: 1.4 $ +@version: $Revision: 1.5 $ """ -__version__ = "$Revision: 1.4 $"[11:-2] +__version__ = "$Revision: 1.5 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/pgercred.py,v $ ## Our hacky authorizer @@ -36,7 +36,7 @@ self.db = db def verifyPlainPassword(self, plaintext): - return self.db.doPgerdbQuery('persons', 0, + return self.db.doPgerdbQuery('person', 0, 0, ('id',self.name), ('password', md5.md5(plaintext).hexdigest()) ).addCallback(self.gotUsers) @@ -70,6 +70,6 @@ return self._updatePassword() def _updatePassword(self): - return self.db.runOperation("UPDATE persons SET password='%s' WHERE id='%s';" % + return self.db.runOperation("UPDATE person SET password='%s' WHERE id='%s';" % (self.hashedPassword, self.name)) Index: PanGalactic/pangalactic/repo/registry.py diff -u PanGalactic/pangalactic/repo/registry.py:1.35 PanGalactic/pangalactic/repo/registry.py:1.36 --- PanGalactic/pangalactic/repo/registry.py:1.35 Mon Oct 27 16:44:18 2003 +++ PanGalactic/pangalactic/repo/registry.py Wed Oct 29 17:07:21 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Engineering Repository Object Registry -@version: $Revision: 1.35 $ +@version: $Revision: 1.36 $ """ -__version__ = "$Revision: 1.35 $"[11:-2] +__version__ = "$Revision: 1.36 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $ import string, re @@ -54,7 +54,7 @@ L{pangalactic.utils.registry.PgefRegistry}.) A dictionary of all application classes that have been derived from PgefObject or one of its subclasses and have - been mapped into the pgerdb_classes. + been mapped into the core_classes. - key = class name - value = class object @@ -67,13 +67,25 @@ - key = class name - value = port on which the glimpseserver is listening - @ivar pgerdb_classes: - pgerdb_classes are the subset of pgef_classes that map + @ivar core_classes: + core_classes are the subset of pgef_classes that map directly to pgerdb tables. When the PgerObjectRegistry initializes, it populates this dictionary by querying the PostgreSQL system tables, comparing the candidate object - names to the pgef_classes, and copying any matching - entries into pgerdb_classes. + names to the pgef_classes, checking whether views exist + for those classes and if not, copying any matching + entries into core_classes. + - key = class name + - value = class object + + @ivar mapped_classes: + mapped_classes are the subset of pgef_classes that are + mapped into pgerdb tables using views. When the + PgerObjectRegistry initializes, it populates this + dictionary by querying the PostgreSQL system tables, + comparing the candidate object names to the pgef_classes, + checking whether views exist for those classes and if so, + copying any matching entries into mapped_classes. - key = class name - value = class object @@ -100,7 +112,7 @@ automagically, the following naming rule for foreign key constraints is used in pgerdb: - self.pgerdb_classes[classname]._std_abbrev + '_has' + + self.core_classes[classname]._std_abbrev + '_has' + [attribute name that points to referenced object] @ivar table_cols: @@ -169,26 +181,58 @@ pgerdbtables = [] for item in result: pgerdbtables.append(item[0]) + # ... and all view names ... + conn = PgSQL.connect(database=dbname) + curs = conn.cursor() + curs.execute("""SELECT c.relname FROM pg_class c \ + WHERE c.relkind IN ('v','') \ + AND c.relname !~ '^pg_'""") + result = curs.fetchall() + pgerdbviews = [] + for item in result: + pgerdbviews.append(item[0]) + # DEBUG + # print 'pgerdbviews is ', pgerdbviews # use table names to generate a dictionary of possible - # pgerdb_class names keyed by name (mn2cn) ... - self.pgerdb_classes = {} + # core_classes keyed by name ... + self.core_classes = {} + self.mapped_classes = {} for tname in pgerdbtables: + vn = tname + '_view' cn = self.getClassName(tname) if cn in self.pgef_classes: - self.pgerdb_classes[cn] = self.pgef_classes[cn] - # initialize self.pgerdb_classes, self.refd_objs, + if vn not in pgerdbviews: + self.core_classes[cn] = self.pgef_classes[cn] + else: + self.mapped_classes[cn] = self.pgef_classes[cn] + # initialize self.refd_objs self.refd_objs = {} - for oname in self.pgerdb_classes: - klass = self.pgerdb_classes[oname] - self.refd_objs[oname] = getattr(klass, '_refd', - None) - # build table_* dictionaries ... + for oname in self.core_classes: + klass = self.core_classes[oname] + self.refd_objs[oname] = getattr(klass, '_refd', None) + # build table_* and view_* dictionaries ... self.table_cols = {} self.table_pkeys = {} self.constraint_fk_maps = {} self.refd_obj_fk_constraints = {} self.obj_init_parms = {} self.obj_nonkey_attrs = {} + self.view_cols = {} + for viewname in pgerdbviews: + # find the oid for viewname ... + curs.execute("SELECT oid FROM pg_class \ + WHERE relname = %s", viewname) + result = curs.fetchall() + oid = result[0][0] + # build self.view_cols[viewname] ... + self.view_cols[viewname] = [] + curs.execute("SELECT attname FROM pg_attribute \ + WHERE attnum > 0 \ + AND attrelid = %s \ + ORDER BY attnum", oid) + result = curs.fetchall() + for item in result: + self.view_cols[viewname].append(item[0]) for tablename in pgerdbtables: classname = self.getClassName(tablename) # DEBUG: print '\ndoing table %s' % tablename @@ -231,11 +275,11 @@ # DEBUG: print ' added pkeys to obj_init_parm_list: %s' % obj_init_parm_list # then see if this obj has any referenced obj's, in # which case we need to add their fkeys ... - if (classname in self.pgerdb_classes + if (classname in self.core_classes and self.refd_objs[classname]): # compute foreign key constraint names ... # print '\n ** computing fk const names for %s\n' % classname - std_abbrev = self.pgerdb_classes[classname]._std_abbrev + std_abbrev = self.core_classes[classname]._std_abbrev for att in self.refd_objs[classname]: constrname = std_abbrev + '_has' + att sqlcmd = """SELECT tgargs FROM pg_trigger WHERE tgrelid = %s AND """ @@ -291,7 +335,7 @@ self.obj_nonkey_attrs[classname][self.table_cols[tablename].index(a)] = a # # create pger_schemas dictionary: # self.pger_schemas = {} -# for classname in self.pgerdb_classes: +# for classname in self.core_classes: # self.pger_schemas[classname] = Schema(self.table_cols[self.getTableName(classname)]) # for refd_class in self.refd_objs[classname]: # self.pger_schemas[classname].add(refd_class) @@ -350,6 +394,29 @@ else: return None + def getViewName(self, oname): + """I take a camelcase object name and return an + underscore-delimited, lowercase view name. + """ + patt = re.compile('([A-Z])') + l = re.split(patt, oname) + parts = l[1:] + if 0 < len(parts) < 3: + tname = string.lower(parts[0] + parts[1]) + '_view' + return tname + elif len(parts) > 2: + tname = parts[0] + parts[1] + i = 2 + while i < len(parts): + if i % 2 == 0: + tname = tname + '_' + tname = tname + parts[i] + i += 1 + tname = tname.lower() + '_view' + return tname + else: + return None + def report(self): """ I generate a plain text report on the PgerObjectRegistry @@ -367,12 +434,12 @@ else: print " - None." print '--------------------------------------------------' - for classname in self.pgerdb_classes: - print '\nObject Class: %s' % classname - print ' Std Abbrev: %s' % self.pgerdb_classes[classname]._std_abbrev + for classname in self.core_classes: + print '\nCore Class: %s' % classname + print ' Std Abbrev: %s' % self.core_classes[classname]._std_abbrev print ' Factory Init Parm List: %s' % str(self.obj_init_parms[classname].values()) t = self.getTableName(classname) - refd = self.pgerdb_classes[classname]._refd + refd = self.core_classes[classname]._refd if refd: nolisting = [] for k in refd: From waterbug at ned.gsfc.nasa.gov Wed Oct 29 17:22:39 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 29 17:22:40 2003 Subject: [Pangalactic-commits] More views. Message-ID: <200310292222.h9TMMdd8005286@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbViews.sql 1.1 1.2 PanGalactic/src/sql/setup_pgerdb.sh 1.4 1.5 Log message: More views. Index: PanGalactic/src/sql/createPgerDbViews.sql diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.1 PanGalactic/src/sql/createPgerDbViews.sql:1.2 --- PanGalactic/src/sql/createPgerDbViews.sql:1.1 Thu Oct 16 20:09:57 2003 +++ PanGalactic/src/sql/createPgerDbViews.sql Wed Oct 29 17:22:37 2003 @@ -2,7 +2,169 @@ /* $Source: /repo/step_testbed/PanGalactic/src/sql/createPgerDbViews.sql,v $ */ -CREATE VIEW document_map +CREATE VIEW document_view + ( + pgef_oid, + pgef_class, + id, + id_context, + pgef_security_mask, + name, + short_description, + long_description, + pger_owner, + pger_owner_context, + pger_creator, + pger_creator_context, + pger_create_datetime, + pger_modifier, + pger_modifier_context, + pger_mod_datetime, + owner, + owner_context, + creator, + creator_context, + create_datetime, + modifier, + modifier_context, + mod_datetime, + master, + dm_pgef_oid, + dm_pgef_class, + dm_id, + dm_id_context, + dm_pgef_security_mask, + dm_name, + dm_short_description, + dm_long_description, + dm_pger_owner, + dm_pger_owner_context, + dm_pger_creator, + dm_pger_creator_context, + dm_pger_create_datetime, + dm_pger_modifier, + dm_pger_modifier_context, + dm_pger_mod_datetime, + dm_owner, + dm_owner_context, + dm_creator, + dm_creator_context, + dm_create_datetime, + dm_modifier, + dm_modifier_context, + dm_mod_datetime, + dm_structural_role, + dm_doc_type_code, + dm_doc_type_code_context, + dv_pgef_oid, + dv_pgef_class, + dv_id, + dv_id_context, + dv_pgef_security_mask, + dv_name, + dv_short_description, + dv_long_description, + dv_pger_owner, + dv_pger_owner_context, + dv_pger_creator, + dv_pger_creator_context, + dv_pger_create_datetime, + dv_pger_modifier, + dv_pger_modifier_context, + dv_pger_mod_datetime, + dv_owner, + dv_owner_context, + dv_creator, + dv_creator_context, + dv_create_datetime, + dv_modifier, + dv_modifier_context, + dv_mod_datetime, + dv_of_dm_id, + dv_of_dm_id_context, + dv_tag, + dv_content, + dv_abstract, + dr_pgef_oid, + dr_pgef_class, + dr_id, + dr_id_context, + dr_pgef_security_mask, + dr_name, + dr_short_description, + dr_long_description, + dr_pger_owner, + dr_pger_owner_context, + dr_pger_creator, + dr_pger_creator_context, + dr_pger_create_datetime, + dr_pger_modifier, + dr_pger_modifier_context, + dr_pger_mod_datetime, + dr_owner, + dr_owner_context, + dr_creator, + dr_creator_context, + dr_create_datetime, + dr_modifier, + dr_modifier_context, + dr_mod_datetime, + dr_of_dv_id, + dr_of_dm_id, + dr_of_dm_id_context, + dr_manifestation, + df_pgef_oid, + df_pgef_class, + df_id, + df_id_context, + df_pgef_security_mask, + df_name, + df_short_description, + df_long_description, + df_pger_owner, + df_pger_owner_context, + df_pger_creator, + df_pger_creator_context, + df_pger_create_datetime, + df_pger_modifier, + df_pger_modifier_context, + df_pger_mod_datetime, + df_owner, + df_owner_context, + df_creator, + df_creator_context, + df_create_datetime, + df_modifier, + df_modifier_context, + df_mod_datetime, + df_location, + df_user_file_name, + df_secured_flag, + df_bytes, + df_mime_type, + df_mime_subtype, + df_mime_parameters, + df_of_dr_id, + df_of_dv_id, + df_of_dm_id, + df_of_dm_id_context + ) + AS SELECT * + FROM ONLY document d, doc_master dm, + doc_version dv, doc_rep dr, + dr_file df + WHERE dm.pgef_oid = d.master + AND dv.of_dm_id = dm.id + AND dv.of_dm_id_context = dm.id_context + AND dr.of_dv_id = dv.id + AND dr.of_dm_id = dv.of_dm_id + AND dr.of_dm_id_context = dv.of_dm_id_context + AND df.of_dr_id = dr.id + AND df.of_dv_id = dr.of_dv_id + AND df.of_dm_id = dr.of_dm_id + AND df.of_dm_id_context = dr.of_dm_id_context; + +CREATE VIEW document_all_view ( pgef_oid, pgef_class, Index: PanGalactic/src/sql/setup_pgerdb.sh diff -u PanGalactic/src/sql/setup_pgerdb.sh:1.4 PanGalactic/src/sql/setup_pgerdb.sh:1.5 --- PanGalactic/src/sql/setup_pgerdb.sh:1.4 Sun Jun 15 21:39:02 2003 +++ PanGalactic/src/sql/setup_pgerdb.sh Wed Oct 29 17:22:37 2003 @@ -1,6 +1,6 @@ #!/bin/bash -# $Id: setup_pgerdb.sh,v 1.4 2003/06/16 01:39:02 radix Exp $ +# $Id: setup_pgerdb.sh,v 1.5 2003/10/29 22:22:37 waterbug Exp $ # Creates pgerdb if it doesn't exist yet and builds its tables @@ -8,4 +8,5 @@ createdb pgerdb fi psql pgerdb < createPgerDbTables.sql +psql pgerdb < createPgerDbViews.sql From waterbug at ned.gsfc.nasa.gov Wed Oct 29 17:26:22 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 29 17:26:23 2003 Subject: [Pangalactic-commits] Oops ... now I remember why that name was better. Message-ID: <200310292226.h9TMQMnT005371@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbViews.sql 1.2 1.3 Log message: Oops ... now I remember why that name was better. Index: PanGalactic/src/sql/createPgerDbViews.sql diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.2 PanGalactic/src/sql/createPgerDbViews.sql:1.3 --- PanGalactic/src/sql/createPgerDbViews.sql:1.2 Wed Oct 29 17:22:37 2003 +++ PanGalactic/src/sql/createPgerDbViews.sql Wed Oct 29 17:26:20 2003 @@ -164,7 +164,7 @@ AND df.of_dm_id = dr.of_dm_id AND df.of_dm_id_context = dr.of_dm_id_context; -CREATE VIEW document_all_view +CREATE VIEW document_view_all ( pgef_oid, pgef_class, From waterbug at ned.gsfc.nasa.gov Wed Oct 29 17:27:03 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 29 17:27:04 2003 Subject: [Pangalactic-commits] More notes on classes. Message-ID: <200310292227.h9TMR326005398@ned.gsfc.nasa.gov> Modified files: PanGalactic/doc/rst/NOTES.txt 1.2 1.3 Log message: More notes on classes. Index: PanGalactic/doc/rst/NOTES.txt diff -u PanGalactic/doc/rst/NOTES.txt:1.2 PanGalactic/doc/rst/NOTES.txt:1.3 --- PanGalactic/doc/rst/NOTES.txt:1.2 Tue Jul 15 10:20:19 2003 +++ PanGalactic/doc/rst/NOTES.txt Wed Oct 29 17:27:01 2003 @@ -3,8 +3,8 @@ ====================== :Author: Stephen Waterbury -:Version: $Revision: 1.2 $ -:Date: $Date: 2003/07/15 14:20:19 $ +:Version: $Revision: 1.3 $ +:Date: $Date: 2003/10/29 22:27:01 $ ---------------------------------- @@ -237,31 +237,28 @@ presentation and format (encoding) of the document. Each DocRep references a unique DocVersion and a unique DocMaster. +*DrFile* + The DrFile (document representation file) holds the + information associated with a specific content file + associated with a DocRep. Each DrFile references a unique + DocRep. + Document Management =================== -The superclass for all documents in PGEF is Document. What could -be simpler? Ah, but the good ole Document that we all know and -love contains within it gobs of semantic innards that we tend to -take for granted, but we do expect them to be there when needed! -So in PGEF, Document is actually a subtype of DocVersion -(document version), which acts as the supervisor for the classes -that do the heavy lifting for Document's extensive collection of -content, metadata, and presentation apparatus. - -Within the PGEF pantheon, DocVersion is the core entity in the -trinity of DocMaster, DocVersion, and DocRep. Any particular -subtype of Document will need a customizable set of Properties -and membership in any number of Categories -- most of these will -apply to all versions, and so will be attached to the DocMaster, -but some of them may also be introduced at the version or -representation level and so will attach to those objects. +The superclass for all documents in PGEF is Document. In PGEF, +Document acts as the supervisor for the classes that do the heavy +lifting for Document's extensive collection of content, metadata, +and presentation apparatus: DocMaster, DocVersion, DocRep, and +DrFile. Any particular subtype of Document will need a +customizable set of Properties and membership in any number of +Categories. -In summary, a Pan Galactic Document subclasses DocVersion, and -has the following things: +Document Attributes +------------------- -* a *pgef_class* +* pgef_class Note that the pgef_class is the semantic definition of a class of documents; therefore, it is not the same as a 'Document @@ -272,25 +269,46 @@ possible to 'map' a semantic DTD into a Pan Galactic Enterprise document class, but that is a separate issue.) -* a *DocMaster* (only one) +* _master + + The _master is a DocMaster instance, and there is only one + DocMaster associated with a Document. + +* _current_version + + The _current_version is a DocVersion instance, and there is + only one _current_version associated with a document. + +* _versions + + The _versions attribute is a dictionary that contains all + DocVersion instances associated with a Document, hashed by + their 'id' attribute. + +* _reps + + The _reps attribute is a dictionary of dictionaries, and + contains all DocRep instances associated with a Document. Its + structure is as follows: + + {vid-1 : {repoid-a : DR-a, repoid-b : DR-b, ...}, + vid-2 : {repoid-c : DR-c, repoid-d : DR-d, ...}, + ...} + + where vid-n is a DocVersion 'id' attribute, repoid-x is the + 'pgef_oid' attribute of the DocRep instance DR-x. -* *DocReps* (potentially many) +Document Repository Operations +------------------------------ -For searches/queries, Document classes will make use of various -views and tables, depending on the context and which parameters -are supplied in the search arguments: -- the doc_masters table -- the doc_versions table -- the doc_reps table -- the doc_mv view (join of doc_masters and doc_versions) -- the doc_mvr view (join of masters, versions, and reps) -- various supersets of these views that include tables related to -the document by foreign keys (e.g., document properties that -are referenced objects) +For searches/queries, the Document interface will make use of +various views and tables, depending on the context and which +parameters are supplied in the search arguments. -For inserts and updates, transactions at the repository manager -(Pger) level will write to the necessary tables atomistically. +For inserts and updates, the repository manager (Pger) will +execute the required db table and file operations as a +transaction. -------- -$Id: NOTES.txt,v 1.2 2003/07/15 14:20:19 waterbug Exp $ +$Id: NOTES.txt,v 1.3 2003/10/29 22:27:01 waterbug Exp $ From waterbug at ned.gsfc.nasa.gov Wed Oct 29 17:28:39 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 29 17:28:40 2003 Subject: [Pangalactic-commits] Placeholder for export method. Message-ID: <200310292228.h9TMSdfA005451@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/utils/factory.py 1.5 1.6 Log message: Placeholder for export method. Index: PanGalactic/pangalactic/utils/factory.py diff -u PanGalactic/pangalactic/utils/factory.py:1.5 PanGalactic/pangalactic/utils/factory.py:1.6 --- PanGalactic/pangalactic/utils/factory.py:1.5 Tue Oct 7 15:56:40 2003 +++ PanGalactic/pangalactic/utils/factory.py Wed Oct 29 17:28:37 2003 @@ -1,12 +1,12 @@ -# $Id: factory.py,v 1.5 2003/10/07 19:56:40 waterbug Exp $ +# $Id: factory.py,v 1.6 2003/10/29 22:28:37 waterbug Exp $ """ Functions to extract persistable data from L{pangalactic.enterprise} objects. -@version: $Revision: 1.5 $ +@version: $Revision: 1.6 $ """ -__version__ = "$Revision: 1.5 $"[11:-2] +__version__ = "$Revision: 1.6 $"[11:-2] import types import string @@ -93,6 +93,13 @@ name = obj.__module__ + '.' + obj.__class__.__name__ extr = [name, instdict] return extr + + def export(self, obj, format='pgx', file=None): + """ + Write the obj out in a specified format to either stdout + or to a file. + """ + pass def extractall(self, objs, classnames=[]): """ From waterbug at ned.gsfc.nasa.gov Wed Oct 29 17:30:36 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Wed Oct 29 17:30:37 2003 Subject: [Pangalactic-commits] Better test ids. Message-ID: <200310292230.h9TMUar1005525@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py 1.9 1.10 Log message: Better test ids. Index: PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py diff -u PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.9 PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.10 --- PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py:1.9 Mon Oct 6 17:16:32 2003 +++ PanGalactic/pangalactic/test/test_xmlrpc_addobjects.py Wed Oct 29 17:30:35 2003 @@ -1,4 +1,4 @@ -# $Id: test_xmlrpc_addobjects.py,v 1.9 2003/10/06 21:16:32 waterbug Exp $ +# $Id: test_xmlrpc_addobjects.py,v 1.10 2003/10/29 22:30:35 waterbug Exp $ """ Functional test for pangalactic.repo.xmlrpc.xmlrpc_addProductMaster @@ -34,18 +34,18 @@ f.write(testid) f.close() -projid = 'MTPaE' + testid -projname = 'MTPaE' + testid + ' Project' -pmid = 'MTPaE-' + testid -pmname = 'MTPaE-' + testid + ' Model Mr. Dynamo' -pvname = 'MTPaE-' + testid + ' Version A' +projid = 'XAO-' + testid +projname = 'XAO-' + testid + ' Project' +pmid = 'XAO-' + testid +pmname = 'XAO-' + testid + ' Model Mr. Dynamo' +pvname = 'XAO-' + testid + ' Version A' # create test objects p = Project(id=projid, id_context='TEST', name=projname) p.popTestData() pm = PM(id=pmid, id_context='TEST', name=pmname, _project=p) pm.popTestData() -pv = PV(_of_master=pm, id='A', name=pvname) +pv = PV(_of_master=pm, id='1', name=pvname) pv.popTestData() extract = PGER._factory.extract From waterbug at ned.gsfc.nasa.gov Thu Oct 30 02:23:16 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 30 02:23:18 2003 Subject: [Pangalactic-commits] Add some standard PgefObject attrs. Message-ID: <200310300723.h9U7NGdY009114@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.43 1.44 Log message: Add some standard PgefObject attrs. Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.43 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.44 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.43 Wed Oct 29 17:06:54 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Thu Oct 30 02:23:15 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.43 2003/10/29 22:06:54 pbear Exp $ +# $Id: pgefadvisory.py,v 1.44 2003/10/30 07:23:15 waterbug Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.43 $"[11:-2] +__version__ = "$Revision: 1.44 $"[11:-2] import os.path import string @@ -45,8 +45,17 @@ ["Document ID", "self.id", "string", ""], ["Title", "self.name", "string", ""], ["Date", "self._create_date", "string", ""]] + _mapped = True + _properties_ext = {} + _properties = _properties_ext.copy() + _properties.update(Document._properties) + _required = [] + _schema_ext = {} + _schema = _schema_ext.copy() + _schema.update(Document._schema) + _searchabletext = True + _std_abbrev = 'pa' - def __init__(self, acronym="", **kw): """ Initialize PgefAdvisory. From pbear at ned.gsfc.nasa.gov Thu Oct 30 07:51:18 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 30 07:51:20 2003 Subject: [Pangalactic-commits] oops Message-ID: <200310301251.h9UCpICR011966@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgefadvisory.py 1.44 1.45 Log message: oops Index: PanGalactic/pangalactic/enterprise/pgefadvisory.py diff -u PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.44 PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.45 --- PanGalactic/pangalactic/enterprise/pgefadvisory.py:1.44 Thu Oct 30 02:23:15 2003 +++ PanGalactic/pangalactic/enterprise/pgefadvisory.py Thu Oct 30 07:51:17 2003 @@ -1,11 +1,11 @@ -# $Id: pgefadvisory.py,v 1.44 2003/10/30 07:23:15 waterbug Exp $ +# $Id: pgefadvisory.py,v 1.45 2003/10/30 12:51:17 pbear Exp $ """ Base class for documents that report conditions related to the usability of a product. """ -__version__ = "$Revision: 1.44 $"[11:-2] +__version__ = "$Revision: 1.45 $"[11:-2] import os.path import string @@ -85,12 +85,12 @@ # -60, wf1 -> late # -30, wf1 -> past due # - now = mx.DateTime.DateFromTicks(mx.DateTime.now()) - earlier = now + mx.DateTime.RelativeDateTime(days=-90) - self.pger_create_datetime = earlier - self.pger_mod_datetime = earlier - self.create_datetime = earlier - self.mod_datetime = earlier +# now = mx.DateTime.DateFromTicks(mx.DateTime.now()) +# earlier = now + mx.DateTime.RelativeDateTime(days=-90) +# self.pger_create_datetime = earlier +# self.pger_mod_datetime = earlier +# self.create_datetime = earlier +# self.mod_datetime = earlier def __getattr__(self, name): From bmuir at ned.gsfc.nasa.gov Thu Oct 30 11:24:08 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Thu Oct 30 11:24:09 2003 Subject: [Pangalactic-commits] fixed editing mode test Message-ID: <200310301624.h9UGO8Eh014719@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py 1.111 1.112 PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.13 1.14 Log message: fixed editing mode test Index: PanGalactic/pangalactic/client/modules/psm/itemeditframe.py diff -u PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.111 PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.112 --- PanGalactic/pangalactic/client/modules/psm/itemeditframe.py:1.111 Wed Oct 29 17:06:54 2003 +++ PanGalactic/pangalactic/client/modules/psm/itemeditframe.py Thu Oct 30 11:24:06 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/client/modules/psm/itemeditframe.py,v $ -__version__ = "$Revision: 1.111 $"[11:-2] +__version__ = "$Revision: 1.112 $"[11:-2] # Python imports import copy @@ -637,6 +637,8 @@ def EditingMode(self, whichpane): #print 'itemeditframe.editmode' self.editingtab = self.currentpage + #print whichpane + #print "PMM_PMVPage is:", self.PMM_PMVPage if whichpane == self.PMM_PMVPage: self.pm_pv_form.BrowseMode(True) self.pmm_pmv_form.EditingMode() Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.13 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.14 --- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.13 Wed Oct 29 14:19:52 2003 +++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py Thu Oct 30 11:24:07 2003 @@ -277,6 +277,10 @@ testframe = wxFrame(None, -1, 'Test Frame') testframe.State = psmstate.PSMState() testframe.dm = datamanager.DataManager(testframe, true) + testframe.dm.serverName = 'ned.gsfc.nasa.gov' + testframe.dm.serverPort = '8080' + testframe.dm.createServer() + testframe.WatchDog = securitymanager.SecurityManager(testframe.dm) result = testframe.dm.login('tstuser','test') testframe.dm.fillProjectList() testframe.dm.localDB.Commit() @@ -284,8 +288,9 @@ nodedata = (None, None) testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm) testframe.itemeditform.SetDisplayWgt(self.DisplayWgts) - testframe.itemeditform.EditingMode() - assert testframe.dm.creatingItem == true, "not in editing mode" + testframe.itemeditform.EditingMode(1) + print testframe.dm.creatingPMM_PMV + assert testframe.dm.creatingPMM_PMV == True, "not in editing mode" testframe.dm.localDB.db.close() def testCreatingMode(self): @@ -312,7 +317,7 @@ itemsuite = unittest.TestSuite() itemsuite.addTest(ItemEditFrameTest("Title")) itemsuite.addTest(ItemEditFrameTest("testCreateItemEditFrame")) - itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges")) + #itemsuite.addTest(ItemEditFrameTest("testSaveItemChanges")) #itemsuite.addTest(ItemEditFrameTest("testSavePLChanges")) #itemsuite.addTest(ItemEditFrameTest("testChangesMade")) #itemsuite.addTest(ItemEditFrameTest("testSaveChanges")) @@ -320,7 +325,7 @@ #itemsuite.addTest(ItemEditFrameTest("testSaveItem")) #itemsuite.addTest(ItemEditFrameTest("testLinkDocument")) #itemsuite.addTest(ItemEditFrameTest("testUnlinkDocument")) - #itemsuite.addTest(ItemEditFrameTest("testEditingMode")) + itemsuite.addTest(ItemEditFrameTest("testEditingMode")) #itemsuite.addTest(ItemEditFrameTest("testCreatingMode")) return itemsuite From pbear at ned.gsfc.nasa.gov Thu Oct 30 11:26:02 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 30 11:26:04 2003 Subject: [Pangalactic-commits] small annoying stuff fixed Message-ID: <200310301626.h9UGQ20A014794@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py 1.59 1.60 PanGalactic/pangalactic/client/modules/psm/psmtool.py 1.124 1.125 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.18 1.19 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.22 1.23 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.7 1.8 PanGalactic/pangalactic/utils/basegrid.py 1.14 1.15 Log message: small annoying stuff fixed Index: PanGalactic/pangalactic/client/modules/psm/pgefgrid.py diff -u PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.59 PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.60 --- PanGalactic/pangalactic/client/modules/psm/pgefgrid.py:1.59 Wed Oct 1 16:45:42 2003 +++ PanGalactic/pangalactic/client/modules/psm/pgefgrid.py Thu Oct 30 11:25:59 2003 @@ -60,18 +60,19 @@ if curr_row >= 0: self.SelectRow(curr_row) - menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selection') + menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear Current Selection') # menu.AppendSeparator() if self.allow_config_flag: if self.CanConfigDisplay(): - menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure grid column display...') + menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Customize Grid Layout...') # menu.AppendSeparator() menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') menu.AppendSeparator() - menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick create...') + menu.Append(quickcreate.ID_POPUP_QUICKCREATE, 'Quick Product...') menu.Append(basegrid.ID_POPUP_EDIT, 'Edit...') - - self.PopupMenuXY(menu, x, y) + + gridx, gridy = self.GetPositionTuple() + self.PopupMenuXY(menu, x+gridx, y+gridy) Index: PanGalactic/pangalactic/client/modules/psm/psmtool.py diff -u PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.124 PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.125 --- PanGalactic/pangalactic/client/modules/psm/psmtool.py:1.124 Tue Oct 28 16:53:00 2003 +++ PanGalactic/pangalactic/client/modules/psm/psmtool.py Thu Oct 30 11:25:59 2003 @@ -9,7 +9,7 @@ This module is the main application code for the pgef client interface """ -__version__ = "$Revision: 1.124 $"[11:-2] +__version__ = "$Revision: 1.125 $"[11:-2] import os import sys @@ -178,20 +178,20 @@ self.topWindow = win # A window to the left of the client window to hold our tree - win = wxSashLayoutWindow(self, self.ID_WINDOW_LEFT, wxDefaultPosition, wxSize(200, 30), wxNO_BORDER|wxSW_3D) + win = wxSashLayoutWindow(self, self.ID_WINDOW_LEFT, wxDefaultPosition, wxSize(200, 30), wxNO_BORDER|wxSW_3D) win.SetDefaultSize(wxSize(180, 600)) win.SetOrientation(wxLAYOUT_VERTICAL) win.SetAlignment(wxLAYOUT_LEFT) win.SetSashVisible(wxSASH_RIGHT, true) - self.leftPanel = wxPanel(win,ID_LEFT_PANEL) + self.leftPanel = wxPanel(win, ID_LEFT_PANEL) hbox = wxBoxSizer(wxVERTICAL) - choice_list = ["default", "requirements", "functions", "simulations"] + choice_list = ["Default", "Requirements", "Functions", "Simulations"] self.view = wxChoice(self.leftPanel, ID_CHOICE_VIEW, wxPoint(90, 50), wxSize(95, -1), choice_list) hbox.Add(self.view, 0, wxEXPAND) - self.tree_notebook = wxNotebook(self.leftPanel, -1, wxDefaultPosition, wxSize(200,200)) + self.tree_notebook = wxNotebook(self.leftPanel, -1, wxDefaultPosition, wxSize(200, 200)) self.tID = wxNewId() self.treeMap = {} @@ -383,13 +383,13 @@ # popup help seems to be ignored.... grrrr menu = wxMenu() - menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this product") + menu.Append(ID_TREE_RIGHTPOPUP_EDIT, 'Edit...', "Edit this Product") menu.Append(ID_TREE_RIGHTPOPUP_SHOWPROJECT, 'View Project Data...', "View project data") menu.Append(ID_TREE_RIGHTPOPUP_DUMPTOPDF, 'Generate PDF...', 'Show the PDF creation options') - menu.SetHelpString(ID_TREE_RIGHTPOPUP_EDIT, "Edit this product") - menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "View project data") + menu.SetHelpString(ID_TREE_RIGHTPOPUP_EDIT, "Edit this Product") + menu.SetHelpString(ID_TREE_RIGHTPOPUP_SHOWPROJECT, "View Project Data") menu.AppendSeparator() - menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick create...', "Create a set of products") + menu.Append(ID_TREE_RIGHTPOPUP_QUICKCREATE, 'Quick Product...', "Create a set of products") self.PopupMenuXY(menu, event.GetX(), event.GetY()) @@ -1195,7 +1195,7 @@ itemlist = [] for item in localpmvs: if item.name: - foo = item.of_pm_id + "." + item.of_pv_id + " (" + item.name + ")" + foo = item.of_pm_id + "." + item.of_pv_id + " (" + item.name + ")" else: foo = item.of_pm_id + "." + item.of_pv_id itemlist.append([foo, item]) Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.22 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.23 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.22 Wed Oct 29 17:06:55 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Thu Oct 30 11:26:00 2003 @@ -16,9 +16,10 @@ import pangalactic.enterprise.workflow.wffactory as wffactory import pangalactic.utils.pdfoptions as pdfoptions -import pangalactic.utils.basegrid as basegrid WF_START = wxNewId() +WF_ACT_CLEAR_SELECTION = wxNewId() +WF_TRANS_CLEAR_SELECTION = wxNewId() key_col = 0 time_col = 1 @@ -146,6 +147,7 @@ colinfo = self.TransInfo[ndx] self.transitiongrid.SetColSize(ndx, colinfo[1]) self.transitiongrid.SetColLabelValue(ndx, colinfo[0]) + self.transitiongrid.SetColLabelSize(22) self.transitiongrid.SetRowLabelSize(40) self.transitiongrid.EnableEditing(True) @@ -180,12 +182,26 @@ EVT_KEY_DOWN(self.transitiongrid, self.OnTransKeyDown) EVT_MENU(self, WF_START, self.setStartActivity) + EVT_MENU(self, WF_ACT_CLEAR_SELECTION, self.clearActSelection) + EVT_MENU(self, WF_TRANS_CLEAR_SELECTION, self.clearTransSelection) wgt = self.GetNameWgt() wgt.SetFocus() EVT_KEY_DOWN(wgt, self.OnNameKeyDown) + def clearActSelection(self, event): + print "wfwizard.clearactselection" + self.activitygrid.ClearSelection() + self.ActSelectedRow = None + + + def clearTransSelection(self, event): + print "wfwizard.cleartransselection" + self.transitiongrid.ClearSelection() + self.TransSelectedRow = None + + def setDisplayWgt(self, wgt): #print "wfwizard.setdisplaywgt" self.displayWgt = wgt @@ -201,54 +217,37 @@ @type event: wxCommandEvent @param event: rightclick event """ - + print "wfwizard.onrightdown" # create customized rightclick popup menu if event.GetId() == self.activitygrid.GetId(): x,y = event.GetPosition() - y -= self.activitygrid.GetColLabelSize() - curr_row = self.activitygrid.YToRow(y) + y1 = y - self.activitygrid.GetColLabelSize() + curr_row = self.activitygrid.YToRow(y1) if curr_row >= 0: - self.activitygrid.SelectRow(curr_row) self.ActSelectedRow = curr_row + self.activitygrid.SelectRow(curr_row) - #print self.table.display_mapping - #print self.table.identifiers menu = wxMenu() - menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections') - menu.Append(WF_START, "Start here") -# menu.AppendSeparator() -# if self.activitygrid.allow_config_flag: -# if self.activitygrid.CanConfigDisplay(): -# menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...') -# menu.AppendSeparator() -# menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') - y += self.activitygrid.GetColLabelSize() - self.PopupMenuXY(menu, x, y) + menu.Append(WF_ACT_CLEAR_SELECTION, 'Clear Current Selection') + menu.Append(WF_START, "Start Here") + gridx, gridy = self.activitygrid.GetPositionTuple() + self.PopupMenuXY(menu, x+gridx, y+gridy) def OnTransRightDown(self, event): + print "wfwizard.ontransrightdown" # create customized rightclick popup menu if event.GetId() == self.transitiongrid.GetId(): x,y = event.GetPosition() - y -= self.transitiongrid.GetColLabelSize() - curr_row = self.transitiongrid.YToRow(y) + y1 = y - self.transitiongrid.GetColLabelSize() + curr_row = self.transitiongrid.YToRow(y1) if curr_row >= 0: - self.transitiongrid.SelectRow(curr_row) self.TransSelectedRow = curr_row + self.transitiongrid.SelectRow(curr_row) - #print self.table.display_mapping - #print self.table.identifiers menu = wxMenu() - x,y = event.GetPosition() - menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selections') -# menu.Append(WF_START, "Start here") -# menu.AppendSeparator() -# if self.transitiongrid.allow_config_flag: -# if self.transitiongrid.CanConfigDisplay(): -# menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...') -# menu.AppendSeparator() -# menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') - - self.PopupMenuXY(menu, x, y) + menu.Append(WF_TRANS_CLEAR_SELECTION, 'Clear Current Selection') + gridx, gridy = self.transitiongrid.GetPositionTuple() + self.PopupMenuXY(menu, x+gridx, y+gridy) def createWorkflow(self, name, activities, transitions): @@ -720,6 +719,7 @@ self.GetMoveUpActivityWgt().Show(False) self.GetMoveDownActivityWgt().Show(False) self.GetGenerateTransitionsWgt().Show(False) + def GetNameWgt(self): return wxPyTypeCast(self.FindWindowById(WF_PROCESS_NAME), "wxTextCtrl") Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.18 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.19 --- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.18 Mon Oct 27 15:41:41 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py Thu Oct 30 11:26:00 2003 @@ -110,6 +110,7 @@ self.gridtable = wfdatatable.WfDataTable() self.grid = WorkflowGrid(self, -1, savename = tablename, dbroot = self.DataManager.dbroot, intable = self.gridtable) + self.grid.SetColLabelSize(22) self.grid.SetSize(self.parent.GetClientSize()) self.FillGrid(datalist) Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.7 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.8 --- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.7 Thu Oct 2 15:31:23 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py Thu Oct 30 11:26:00 2003 @@ -78,6 +78,8 @@ self.EnableEditing(false) + self.SetColLabelSize(32) + EVT_GRID_CELL_LEFT_CLICK(self, self.OnLeftClick) # print "wfgrid.table.displaymapping", self.table.GetDisplayMapping() @@ -124,8 +126,9 @@ # create customized rightclick popup menu if event.GetId() == self.GetId(): x,y = event.GetPosition() - y -= self.GetColLabelSize() - curr_row = self.YToRow(y) + print x,y + y1 = y - self.GetColLabelSize() + curr_row = self.YToRow(y1) if curr_row >= 0: self.SelectRow(curr_row) self.SelectedRow = curr_row @@ -133,25 +136,20 @@ #print self.table.display_mapping #print self.table.identifiers menu = wxMenu() - x,y = event.GetPosition() - menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear current selection') + menu.Append(basegrid.ID_POPUP_CLEAR_SELECTION, 'Clear Current Selection') if self.ShowEditor: - menu.Append(WF_EDIT, "Edit...") + menu.Append(WF_EDIT, "Edit Workflow...") menu.AppendSeparator() if self.allow_config_flag: if self.CanConfigDisplay(): - menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...') + menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Configure Grid Layout...') if self.ShowViewer: - menu.Append(WF_VIEW, "View...") - -# menu.AppendSeparator() -# if self.allow_config_flag: -# if self.CanConfigDisplay(): -# menu.Append(basegrid.ID_POPUP_CONFIG_GRID, 'Config grid display...') + menu.Append(WF_VIEW, "View Workflow...") menu.AppendSeparator() - menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') + menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') - self.PopupMenuXY(menu, x, y) + gridx, gridy = self.GetPositionTuple() + self.PopupMenuXY(menu, x+gridx, y+gridy) Index: PanGalactic/pangalactic/utils/basegrid.py diff -u PanGalactic/pangalactic/utils/basegrid.py:1.14 PanGalactic/pangalactic/utils/basegrid.py:1.15 --- PanGalactic/pangalactic/utils/basegrid.py:1.14 Tue Oct 21 17:25:19 2003 +++ PanGalactic/pangalactic/utils/basegrid.py Thu Oct 30 11:26:00 2003 @@ -170,15 +170,17 @@ #print self.table.identifiers menu = wxMenu() x,y = event.GetPosition() - menu.Append(ID_POPUP_CLEAR_SELECTION, 'Clear current selection') + menu.Append(ID_POPUP_CLEAR_SELECTION, 'Clear Current Selection') menu.AppendSeparator() if self.allow_config_flag: if self.CanConfigDisplay(): - menu.Append(ID_POPUP_CONFIG_GRID, 'Configure grid column display...') + menu.Append(ID_POPUP_CONFIG_GRID, 'Customize Grid Layout...') menu.AppendSeparator() - menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Create PDF...') + menu.Append(pdfoptions.ID_CREATEPDF_POPUP, 'Generate PDF...') - self.PopupMenuXY(menu, x, y) + gridx, gridy = self.GetPositionTuple() + self.PopupMenuXY(menu, x+gridx, y+gridy) + def StartDragOperation(self, selectedrow): """Handles the data encapsulation and packaging for the drag and drop""" @@ -391,7 +393,7 @@ #if not self.already_showing_config: #print 'call config screen' tmpsize = wxSize(750, 500) - testframe = wxDialog(self, -1, 'Config Grid Display', wxDefaultPosition, tmpsize, + testframe = wxDialog(self, -1, 'Customize Grid Layout', wxDefaultPosition, tmpsize, style = wxCAPTION | wxSYSTEM_MENU | wxTHICK_FRAME ) #if self.DisplayMapping: #print "oldmapping", self.DisplayMapping[0] From bmuir at ned.gsfc.nasa.gov Thu Oct 30 13:12:50 2003 From: bmuir at ned.gsfc.nasa.gov (bmuir CVS) Date: Thu Oct 30 13:12:51 2003 Subject: [Pangalactic-commits] fixed localdb tests, but they were skeletal, need to add alot more... Message-ID: <200310301812.h9UICoXx017417@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/client/tests/test_itemeditframe.py 1.14 1.15 PanGalactic/pangalactic/client/tests/test_localdb.py 1.1.1.1 1.2 Log message: fixed localdb tests, but they were skeletal, need to add alot more... Index: PanGalactic/pangalactic/client/tests/test_itemeditframe.py diff -u PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.14 PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.15 --- PanGalactic/pangalactic/client/tests/test_itemeditframe.py:1.14 Thu Oct 30 11:24:07 2003 +++ PanGalactic/pangalactic/client/tests/test_itemeditframe.py Thu Oct 30 13:12:48 2003 @@ -289,7 +289,6 @@ testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm) testframe.itemeditform.SetDisplayWgt(self.DisplayWgts) testframe.itemeditform.EditingMode(1) - print testframe.dm.creatingPMM_PMV assert testframe.dm.creatingPMM_PMV == True, "not in editing mode" testframe.dm.localDB.db.close() @@ -298,6 +297,7 @@ testframe = wxFrame(None, -1, 'Test Frame') testframe.State = psmstate.PSMState() testframe.dm = datamanager.DataManager(testframe, true) + testframe.dm = datamanager.DataManager(testframe, true) testframe.dm.serverName = 'ned.gsfc.nasa.gov' testframe.dm.serverPort = '8080' testframe.dm.createServer() @@ -309,8 +309,8 @@ nodedata = (None, None) testframe.itemeditform = itemeditframe.ItemEditFrame(testframe, testframe.State, 0, 1, nodedata, testframe.dm) testframe.itemeditform.SetDisplayWgt(self.DisplayWgts) - testframe.itemeditform.CreatingMode(testframe.itemeditform.ItemPage) - assert testframe.dm.creatingPartsList == false, "not in editing mode" + testframe.itemeditform.CreatingMode(1) + assert testframe.dm.creatingPartsList == False, "not in editing mode" testframe.dm.localDB.db.close() def suite(): @@ -325,8 +325,8 @@ #itemsuite.addTest(ItemEditFrameTest("testSaveItem")) #itemsuite.addTest(ItemEditFrameTest("testLinkDocument")) #itemsuite.addTest(ItemEditFrameTest("testUnlinkDocument")) - itemsuite.addTest(ItemEditFrameTest("testEditingMode")) - #itemsuite.addTest(ItemEditFrameTest("testCreatingMode")) + #itemsuite.addTest(ItemEditFrameTest("testEditingMode")) + itemsuite.addTest(ItemEditFrameTest("testCreatingMode")) return itemsuite Index: PanGalactic/pangalactic/client/tests/test_localdb.py diff -u PanGalactic/pangalactic/client/tests/test_localdb.py:1.1.1.1 PanGalactic/pangalactic/client/tests/test_localdb.py:1.2 --- PanGalactic/pangalactic/client/tests/test_localdb.py:1.1.1.1 Mon Nov 4 14:47:26 2002 +++ PanGalactic/pangalactic/client/tests/test_localdb.py Thu Oct 30 13:12:48 2003 @@ -1,5 +1,5 @@ import unittest -import dataobjects.localdb +import pangalactic.utils.localdb false = None true = not None @@ -20,7 +20,7 @@ def testCreateLocalStorage(self): self.ldb = None - self.ldb = dataobjects.localdb.LocalStorage(true) + self.ldb = pangalactic.utils.localdb.LocalStorage(true) assert self.ldb != None , "Couldnt create localstorage" #self.ldb.db.close() @@ -38,4 +38,4 @@ runner.run(suite()) if __name__ == '__main__': - main() \ No newline at end of file + main() From waterbug at ned.gsfc.nasa.gov Thu Oct 30 14:24:30 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 30 14:24:32 2003 Subject: [Pangalactic-commits] MIME types for media_type table. Message-ID: <200310301924.h9UJOUNO019190@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/insertDocuments.sql None 1.1 PanGalactic/src/sql/insertMediaTypes.sql None 1.1 PanGalactic/src/sql/populate_pgerdb.sh 1.2 1.3 Log message: MIME types for media_type table. Index: PanGalactic/src/sql/populate_pgerdb.sh diff -u PanGalactic/src/sql/populate_pgerdb.sh:1.2 PanGalactic/src/sql/populate_pgerdb.sh:1.3 --- PanGalactic/src/sql/populate_pgerdb.sh:1.2 Thu Oct 2 13:39:06 2003 +++ PanGalactic/src/sql/populate_pgerdb.sh Thu Oct 30 14:24:29 2003 @@ -1,8 +1,9 @@ #!/bin/bash -# $Id: populate_pgerdb.sh,v 1.2 2003/10/02 17:39:06 waterbug Exp $ +# $Id: populate_pgerdb.sh,v 1.3 2003/10/30 19:24:29 waterbug Exp $ psql pgerdb < insertRefData.sql +psql pgerdb < insertMediaTypes.sql psql pgerdb < copyOrganizations.psql psql pgerdb < insertTestData.sql psql pgerdb < copyCats.psql From pbear at ned.gsfc.nasa.gov Thu Oct 30 15:01:17 2003 From: pbear at ned.gsfc.nasa.gov (pbear CVS) Date: Thu Oct 30 15:01:19 2003 Subject: [Pangalactic-commits] fixed close buttons on wfwizard; other ittybitty stuff Message-ID: <200310302001.h9UK1H7d020195@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py 1.19 1.20 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py 1.23 1.24 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py 1.8 1.9 PanGalactic/pangalactic/utils/datamanager.py 1.53 1.54 Log message: fixed close buttons on wfwizard; other ittybitty stuff Index: PanGalactic/pangalactic/utils/datamanager.py diff -u PanGalactic/pangalactic/utils/datamanager.py:1.53 PanGalactic/pangalactic/utils/datamanager.py:1.54 --- PanGalactic/pangalactic/utils/datamanager.py:1.53 Wed Oct 29 17:06:55 2003 +++ PanGalactic/pangalactic/utils/datamanager.py Thu Oct 30 15:01:15 2003 @@ -1,6 +1,6 @@ # $Source: /repo/step_testbed/PanGalactic/pangalactic/utils/datamanager.py,v $ -__version__ = "$Revision: 1.53 $"[11:-2] +__version__ = "$Revision: 1.54 $"[11:-2] import time import mx.DateTime @@ -71,7 +71,7 @@ self.creatingItem = False self.creatingPartsList = False self.creatingDocument = False - self.creatingWorkflow = False + self.wizardingWorkflow = False def initLocalDB(self, clearcache): try: Index: PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py diff -u PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.19 PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.20 --- PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py:1.19 Thu Oct 30 11:26:00 2003 +++ PanGalactic/pangalactic/enterprise/workflow/wfprocessoverview.py Thu Oct 30 15:01:15 2003 @@ -93,9 +93,9 @@ self.State.currentuser = self.DataManager.user.id self.currentworkflow = None - self.CreateWorkflowFrames = [] - self.EditWorkflowFrames = [] - self.ViewWorkflowFrames = [] + self.WorkflowWizardFrames = [] + #self.EditWorkflowFrames = [] + #self.ViewWorkflowFrames = [] self.acroreaderids = [] EVT_MENU(self.parent, WF_EDIT, self.OnWorkflowEdit) @@ -155,7 +155,7 @@ if len(workflowlist) > 0: self.workflowlist = workflowlist self.SetData(workflowlist) - self.grid.AutoSizeColumns(true) + self.grid.AutoSizeColumns(True) def CloseTool(self, event): pass @@ -176,14 +176,14 @@ #print "CreateWorkflow" tmpsize = wxSize(750, 600) WizardFrame = toolframe.toolFrame(self, -1, "Workflow Wizard", wxDefaultPosition, tmpsize) - Wizard = workflow_wizard.WorkflowWizard(WizardFrame, self.State, self.DataManager, + Wizard = workflow_wizard.WorkflowWizard(self, WizardFrame, self.State, self.DataManager, self.actinfo, self.transinfo, -1, wxDefaultPosition, tmpsize) Wizard.setDisplayWgt(self.grid) WizardFrame.menuBar.SetLabel(toolframe.ID_FILE_EXIT, '&Close') WizardFrame.menuBar.SetHelpString(toolframe.ID_FILE_EXIT, "Close this window") WizardFrame.CentreOnParent() - WizardFrame.Show(true) + WizardFrame.Show(True) filemenu = wxMenu() filemenu.Append(WF_SAVE, "&Save", "Save a workflow") @@ -191,49 +191,48 @@ oldfilemenu = WizardFrame.GetMenuBar().Replace(0, filemenu, "&File") oldfilemenu = None - self.CreateWorkflowFrames.append([WizardFrame.GetId(), "new", Wizard, false]) + #self.CreateWorkflowFrames.append([WizardFrame.GetId(), "new", Wizard, False]) + self.WorkflowWizardFrames.append([WizardFrame.GetId(), "new", Wizard, False]) - EVT_CLOSE(WizardFrame, self.OnCloseWizardFrame) - EVT_MENU(WizardFrame, toolframe.ID_FILE_EXIT, self.OnCloseWizardFrame) + EVT_CLOSE(WizardFrame, Wizard.onClose) + EVT_MENU(WizardFrame, toolframe.ID_FILE_EXIT, Wizard.onClose) EVT_MENU(WizardFrame, WF_SAVE, Wizard.Save) - def OnCloseWizardFrame(self, event): - # update the workflow grid when a create wizard is closed - #print "closewizardframe" - for ndx in range(len(self.CreateWorkflowFrames)): - fid, mode, wizard, closeflag = self.CreateWorkflowFrames[ndx] - #print fid, mode, wizard, closeflag - if event.GetId() == fid: - #print "found frame" - if closeflag: - return -# event.skip() - else: - #print "closing down" - self.CreateWorkflowFrames[ndx][3] = true # closeflag - - if not wizard.saved_workflow: - dlg = pgdialogs.OKCancelDialog(self, -1, "Save Workflow?", - "\nDo you wish to save this workflow?", - 'Yes', 'No', size = wxSize(250, 120)) - result = dlg.ShowModal() - if result == wxID_OK: - #transitions = wizard.GetTransitions() - #activities = wizard.GetActivities() - wfobj = wizard.Save() - #print "wfobj", wfobj - if wfobj: - self.grid.AddData(wfobj, wxLIGHT_GREY) - dlg.Destroy() - - wizard = None - f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") - f.Show(false) - del self.CreateWorkflowFrames[ndx] - break + def RemoveWizardFrame(self, frame_id, wizard_id): + #print "wfprocessoverview.removewizardframe" + for ndx in range(len(self.WorkflowWizardFrames)): + fid, mode, wizard, closeflag = self.WorkflowWizardFrames[ndx] + #print frame_id, fid, mode, wizard, wizard.GetId(), closeflag + if frame_id == fid: + f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") + f.Show(false) + del self.WorkflowWizardFrames[ndx] + break + self.moreWorkflowWizards() + + +## def OnCloseWizardFrame(self, event): +## # update the workflow grid when a create wizard is closed +## print "closewizardframe" +## for ndx in range(len(self.CreateWorkflowFrames)): +## fid, mode, wizard, closeflag = self.CreateWorkflowFrames[ndx] +## print event.GetId(), fid, mode, wizard, closeflag +## if event.GetId() == fid: +## print "found frame" +## if closeflag: +## return +### event.skip() +## else: +## print "closing down" +## f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") +## wizard.onCloseFrame() +## wizard = None +## f.Show(False) +## #del self.CreateWorkflowFrames[ndx] +## break - self.StillCreatingWorkflow() +## self.StillCreatingWorkflow() def OnWorkflowEdit(self, event): @@ -241,7 +240,7 @@ #print "EditWorkflow" tmpsize = wxSize(750, 600) EditorFrame = toolframe.toolFrame(self, -1, "Workflow Editor", wxDefaultPosition, tmpsize) - Editor = workflow_wizard.WorkflowWizard(EditorFrame, self.State, self.DataManager, + Editor = workflow_wizard.WorkflowWizard(self, EditorFrame, self.State, self.DataManager, self.actinfo, self.transinfo, -1, wxDefaultPosition, tmpsize) wfobj = self.grid.GetDataObj(self.grid.SelectedRow) Editor.SetWorkflow(wfobj) @@ -256,12 +255,14 @@ oldfilemenu = None EditorFrame.CentreOnParent() - EditorFrame.Show(true) + EditorFrame.Show(True) - self.EditWorkflowFrames.append([EditorFrame.GetId(), "new", Editor, false]) + #self.EditWorkflowFrames.append([EditorFrame.GetId(), "new", Editor, False]) + self.WorkflowWizardFrames.append([EditorFrame.GetId(), "edit", Editor, False]) - EVT_CLOSE(EditorFrame, self.OnCloseEditWorkflowFrame) - EVT_MENU(EditorFrame, toolframe.ID_FILE_EXIT, self.OnCloseEditWorkflowFrame) + EVT_CLOSE(EditorFrame, Editor.onClose) + #EVT_MENU(EditorFrame, toolframe.ID_FILE_EXIT, self.OnCloseEditWorkflowFrame) + EVT_MENU(EditorFrame, toolframe.ID_FILE_EXIT, Editor.onClose) EVT_MENU(EditorFrame, WF_SAVE, Editor.Save) @@ -271,7 +272,7 @@ tmpsize = wxSize(750, 600) ViewerFrame = toolframe.toolFrame(self, -1, "Workflow Viewer", wxDefaultPosition, tmpsize) - Viewer = workflow_wizard.WorkflowWizard(ViewerFrame, self.State, self.DataManager, + Viewer = workflow_wizard.WorkflowWizard(self, ViewerFrame, self.State, self.DataManager, self.actinfo, self.transinfo, -1, wxDefaultPosition, tmpsize) Viewer.setViewMode() wfobj = self.grid.GetDataObj(self.grid.SelectedRow) @@ -286,94 +287,101 @@ oldfilemenu = None ViewerFrame.CentreOnParent() - ViewerFrame.Show(true) + ViewerFrame.Show(True) - self.ViewWorkflowFrames.append([ViewerFrame.GetId(), "view", Viewer, false]) + #self.ViewWorkflowFrames.append([ViewerFrame.GetId(), "view", Viewer, False]) + self.WorkflowWizardFrames.append([ViewerFrame.GetId(), "view", Viewer, False]) - EVT_CLOSE(ViewerFrame, self.OnCloseViewWorkflowFrame) - EVT_MENU(ViewerFrame, toolframe.ID_FILE_EXIT, self.OnCloseViewWorkflowFrame) + EVT_CLOSE(ViewerFrame, Viewer.onClose) + EVT_MENU(ViewerFrame, toolframe.ID_FILE_EXIT, Viewer.onClose) - def StillCreatingWorkflow(self): - # see if any create wizards are still around - if len(self.CreateWorkflowFrames) == 0: - self.DataManager.creatingWorkflow = false + def moreWorkflowWizards(self): + # see if any wizards are still around + if len(self.WorkflowWizardFrames) == 0: + self.DataManager.wizardingWorkflow = False else: - self.DataManager.creatingWorkflow = true + self.DataManager.wizardingWorkflow = True - def StillEditingWorkflow(self): - # see if any edit wizards are still around - if len(self.EditWorkflowFrames) == 0: - self.DataManager.EditingWorkflow = false - else: - self.DataManager.EditingWorkflow = true +## def StillEditingWorkflow(self): +## # see if any edit wizards are still around +## if len(self.EditWorkflowFrames) == 0: +## self.DataManager.EditingWorkflow = False +## else: +## self.DataManager.EditingWorkflow = True - def StillViewingWorkflow(self): - # see if any viewers are still around - if len(self.ViewWorkflowFrames) == 0: - self.DataManager.ViewingWorkflow = false - else: - self.DataManager.ViewingWorkflow = true +## def StillViewingWorkflow(self): +## # see if any viewers are still around +## if len(self.ViewWorkflowFrames) == 0: +## self.DataManager.ViewingWorkflow = False +## else: +## self.DataManager.ViewingWorkflow = True def UpdateData(self, wfobj): #print "wfoverview.updatedata" self.grid.UpdateData(wfobj) - def OnCloseEditWorkflowFrame(self, event): - # update the workflow grid when an edit wizard is closed - #print "closeeditwfframe" - for ndx in range(len(self.EditWorkflowFrames)): - fid, mode, editor, closeflag = self.EditWorkflowFrames[ndx] - #print fid, mode, editor, closeflag - if event.GetId() == fid: - if closeflag: - return -# event.skip() - else: - self.EditWorkflowFrames[ndx][3] = true # closeflag + def addData(self, wfobj, colour = None): + #print "wfoverview.adddata" + self.grid.AddData(wfobj, colour) + +## def OnCloseEditWorkflowFrame(self, event): +## # update the workflow grid when an edit wizard is closed +## print "closeeditwfframe" +## for ndx in range(len(self.EditWorkflowFrames)): +## fid, mode, editor, closeflag = self.EditWorkflowFrames[ndx] +## #print fid, mode, editor, closeflag +## if event.GetId() == fid: +## if closeflag: +## return +### event.skip() +## else: +## self.EditWorkflowFrames[ndx][3] = True # closeflag - if not editor.saved_workflow: - dlg = pgdialogs.OKCancelDialog(self, -1, "Save Workflow?", - "\nDo you wish to save this workflow?", - 'Yes', 'No', size = wxSize(250, 120)) - result = dlg.ShowModal() - if result == wxID_OK: - #transitions = editor.GetTransitions() - #activities = editor.GetActivities() - wfobj = editor.Save() - if wfobj: - self.grid.AddData(wfobj, wxLIGHT_GREY) - dlg.Destroy() - - editor = None - f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") - f.Show(false) - del self.EditWorkflowFrames[ndx] - break - - self.StillEditingWorkflow() - - - def OnCloseViewWorkflowFrame(self, event): - #print "closeviewwfframe" - for ndx in range(len(self.ViewWorkflowFrames)): - fid, mode, viewer, closeflag = self.ViewWorkflowFrames[ndx] - #print fid, mode, viewer, closeflag - if event.GetId() == fid: - if closeflag: - return -# event.skip() - else: - self.ViewWorkflowFrames[ndx][3] = true # closeflag - viewer = None - f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") - f.Show(false) - del self.ViewWorkflowFrames[ndx] - break +#### if not editor.saved_workflow: +#### dlg = pgdialogs.OKCancelDialog(self, -1, "Save Workflow?", +#### "\nDo you wish to save this workflow?", +#### 'Yes', 'No', size = wxSize(250, 120)) +#### result = dlg.ShowModal() +#### if result == wxID_OK: +#### #transitions = editor.GetTransitions() +#### #activities = editor.GetActivities() +#### wfobj = editor.Save() +#### if wfobj: +#### self.grid.AddData(wfobj, wxLIGHT_GREY) +#### dlg.Destroy() + +## f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") +### f.onCloseFrame() +## editor = None +## f.Show(False) +### del self.EditWorkflowFrames[ndx] +## break + +## self.StillEditingWorkflow() + + +## def OnCloseViewWorkflowFrame(self, event): +## print "closeviewwfframe" +## for ndx in range(len(self.ViewWorkflowFrames)): +## fid, mode, viewer, closeflag = self.ViewWorkflowFrames[ndx] +## #print fid, mode, viewer, closeflag +## if event.GetId() == fid: +## if closeflag: +## return +### event.skip() +## else: +## self.ViewWorkflowFrames[ndx][3] = True # closeflag +## f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") +## f.onCloseFrame() +## viewer = None +## f.Show(False) +### del self.ViewWorkflowFrames[ndx] +## break - self.StillViewingWorkflow() +## self.StillViewingWorkflow() @@ -404,12 +412,12 @@ def CloseDown(self, event = None): - if len(self.CreateWorkflowFrames) > 0: - for fid, mode in self.CreateWorkflowFrames: + if len(self.WorkflowWizardFrames) > 0: + for fid, mode in self.WorkflowWizardFrames: f = wxPyTypeCast(self.FindWindowById(fid), "wxFrame") f.CloseDown() - f.Show(false) - self.CreateWorkflowFrames = [] + f.Show(False) + self.WorkflowWizardFrames = [] if len(self.acroreaderids) > 0: for readerid in self.acroreaderids: @@ -445,7 +453,7 @@ msg = wxStaticText(savedlg, -1, "Please wait while PGEF commits the data...", wxPoint (10, 10), wxDefaultSize, wxALIGN_CENTRE) savedlg.CentreOnParent() - savedlg.Show(true) + savedlg.Show(True) wxSafeYield() wxBeginBusyCursor() Index: PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.23 PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.24 --- PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py:1.23 Thu Oct 30 11:26:00 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflow_wizard.py Thu Oct 30 15:01:15 2003 @@ -60,7 +60,7 @@ @var WF_START: id that corresponds to entry point flag menu option. """ - def __init__(self, parent, state, datamgr, actinfo, transinfo, ID, pos, size): + def __init__(self, parent, parentframe, state, datamgr, actinfo, transinfo, ID, pos, size): """ Construct the workflow wizard gui. @@ -68,8 +68,8 @@ @return: None - @type parent: wxFrame - @param parent: Parent frame for this panel + @type parentFrame: wxFrame + @param parentFrame: Parent frame for this panel @type state: @see: L{WorkflowState } @param state: @@ -93,12 +93,12 @@ @param size: Initial size of wxWindow. """ - wxPanel.__init__(self, parent, ID, pos, size) + wxPanel.__init__(self, parentframe, ID, pos, size) self.ActInfo = actinfo #info is a list of tuples ("column label", column_width) self.TransInfo = transinfo #info is a list of tuples ("column label", column_width) self.DataManager = datamgr - self.DataManager.creatingWorkflow = True + self.DataManager.wizardingWorkflow = True WorkflowFunc(self, True) @@ -112,6 +112,7 @@ self.trans_labels.append(transinfo[2]) self.Parent = parent + self.ParentFrame = parentframe self.workflow = None self.saved_workflow = True @@ -159,6 +160,8 @@ self.ActSelectedRow = None self.TransSelectedRow = None + self.Closing = False + EVT_BUTTON(self, WF_ACTMOVEUP_ROW, self.OnMoveUp) EVT_BUTTON(self, WF_ACTMOVEDOWN_ROW, self.OnMoveDown) EVT_BUTTON(self, WF_ACTDELETE_ROW, self.OnDeleteActivity) @@ -190,14 +193,33 @@ EVT_KEY_DOWN(wgt, self.OnNameKeyDown) + def onClose(self, event): + #print "wfwizard.onclose", self.GetId() + if self.Closing: + if event: + event.Skip() + else: + self.Closing = True + if not self.saved_workflow: + dlg = pgdialogs.OKCancelDialog(self.ParentFrame, -1, "Save Workflow?", + "\nDo you wish to save this workflow?", + 'Yes', 'No', size = wxSize(250, 120)) + result = dlg.ShowModal() + if result == wxID_OK: + wfobj = self.Save() + if wfobj: + self.Parent.AddData(wfobj, wxLIGHT_GREY) + dlg.Destroy() + + self.Parent.RemoveWizardFrame(self.ParentFrame.GetId(), self.GetId()) + + def clearActSelection(self, event): - print "wfwizard.clearactselection" self.activitygrid.ClearSelection() self.ActSelectedRow = None def clearTransSelection(self, event): - print "wfwizard.cleartransselection" self.transitiongrid.ClearSelection() self.TransSelectedRow = None @@ -208,7 +230,7 @@ def setStartActivity(self, event): - print "wfwizard.setstartactivity", self.ActSelectedRow + #print "wfwizard.setstartactivity", self.ActSelectedRow self.startRow = self.ActSelectedRow @@ -217,7 +239,6 @@ @type event: wxCommandEvent @param event: rightclick event """ - print "wfwizard.onrightdown" # create customized rightclick popup menu if event.GetId() == self.activitygrid.GetId(): x,y = event.GetPosition() @@ -234,7 +255,6 @@ self.PopupMenuXY(menu, x+gridx, y+gridy) def OnTransRightDown(self, event): - print "wfwizard.ontransrightdown" # create customized rightclick popup menu if event.GetId() == self.transitiongrid.GetId(): x,y = event.GetPosition() @@ -251,8 +271,6 @@ def createWorkflow(self, name, activities, transitions): - print "wizard.createWorkflow" - process = wffactory.simpleWfProcess(name) activitydict = {} @@ -307,8 +325,8 @@ def Save(self, event = None): #print "workflow_wizard.save" - if self.DataManager.creatingWorkflow: - self.DataManager.creatingWorkflow = False + if self.DataManager.wizardingWorkflow: + #self.DataManager.wizardingWorkflow = False transitions = self.GetTransitions() activities = self.GetActivities() @@ -343,7 +361,7 @@ self.workflow.SetName(name) self.DataManager.update(self.workflow) else: - self.DataManager.creatingWorkflow = True + #self.DataManager.wizardingWorkflow = True self.workflow = self.Save() if self.displayWgt: self.displayWgt.AddData(self.workflow) @@ -598,7 +616,7 @@ self.transitiongrid.SetCellValue(ndx, 1, actlist[ndx+1]) def OnDeleteActivity(self, event = None): - print "workflowwizard.deleteactivity" + #print "workflowwizard.deleteactivity" if self.activitygrid.IsCellEditControlEnabled(): self.activitygrid.HideCellEditControl() @@ -613,7 +631,7 @@ def OnDeleteTransition(self, event = None): - print "workflowwizard.deletetransition" + #print "workflowwizard.deletetransition" if self.transitiongrid.IsCellEditControlEnabled(): self.transitiongrid.HideCellEditControl() Index: PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py diff -u PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.8 PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.9 --- PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py:1.8 Thu Oct 30 11:26:00 2003 +++ PanGalactic/pangalactic/enterprise/workflow/workflowgrid.py Thu Oct 30 15:01:15 2003 @@ -126,7 +126,6 @@ # create customized rightclick popup menu if event.GetId() == self.GetId(): x,y = event.GetPosition() - print x,y y1 = y - self.GetColLabelSize() curr_row = self.YToRow(y1) if curr_row >= 0: From waterbug at ned.gsfc.nasa.gov Thu Oct 30 16:38:14 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 30 16:38:16 2003 Subject: [Pangalactic-commits] Add a test for getDocuments() and correct some names. Message-ID: <200310302138.h9ULcE2G022096@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/test/test_pger_getDocuments.py None 1.1 PanGalactic/pangalactic/test/IDTEST 1.19 1.20 PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py 1.1 1.2 PanGalactic/pangalactic/test/test_pger_getResultSets.py 1.1 1.2 Log message: Add a test for getDocuments() and correct some names. Index: PanGalactic/pangalactic/test/test_pger_getResultSets.py diff -u PanGalactic/pangalactic/test/test_pger_getResultSets.py:1.1 PanGalactic/pangalactic/test/test_pger_getResultSets.py:1.2 --- PanGalactic/pangalactic/test/test_pger_getResultSets.py:1.1 Mon Oct 6 17:16:32 2003 +++ PanGalactic/pangalactic/test/test_pger_getResultSets.py Thu Oct 30 16:38:13 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_getResultSets.py,v 1.1 2003/10/06 21:16:32 waterbug Exp $ +# $Id: test_pger_getResultSets.py,v 1.2 2003/10/30 21:38:13 waterbug Exp $ """ Functional test for pangalactic.repo.pger module @@ -16,7 +16,7 @@ typename = "ProductMaster" def success(resultsets): - schema = pgr._registry.pgerdb_classes[typename]._schema + schema = pgr._registry.core_classes[typename]._schema if resultsets: print "\n===========" print "RESULT SETS" Index: PanGalactic/pangalactic/test/IDTEST diff -u PanGalactic/pangalactic/test/IDTEST:1.19 PanGalactic/pangalactic/test/IDTEST:1.20 --- PanGalactic/pangalactic/test/IDTEST:1.19 Wed Oct 8 20:32:08 2003 +++ PanGalactic/pangalactic/test/IDTEST Thu Oct 30 16:38:13 2003 @@ -1 +1 @@ -298 \ No newline at end of file +307 \ No newline at end of file Index: PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py diff -u PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py:1.1 PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py:1.2 --- PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py:1.1 Mon Oct 6 17:16:32 2003 +++ PanGalactic/pangalactic/test/test_pger_getRefdRowKeys.py Thu Oct 30 16:38:13 2003 @@ -1,4 +1,4 @@ -# $Id: test_pger_getRefdRowKeys.py,v 1.1 2003/10/06 21:16:32 waterbug Exp $ +# $Id: test_pger_getRefdRowKeys.py,v 1.2 2003/10/30 21:38:13 waterbug Exp $ """ Functional test for pangalactic.repo.pger module @@ -16,7 +16,7 @@ typename = "ProductModelVersion" def success(resultsets): - schema = pgr._registry.pgerdb_classes[typename]._schema + schema = pgr._registry.core_classes[typename]._schema if resultsets: print "\n===========" print "RESULT SETS" From waterbug at ned.gsfc.nasa.gov Thu Oct 30 16:39:47 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 30 16:39:49 2003 Subject: [Pangalactic-commits] Mods to scripts for inserting document data. Message-ID: <200310302139.h9ULdlGW022152@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/insertDocuments.sql 1.1 1.2 PanGalactic/src/sql/insertRefData.sql 1.3 1.4 PanGalactic/src/sql/populate_pgerdb.sh 1.3 1.4 Log message: Mods to scripts for inserting document data. Index: PanGalactic/src/sql/insertDocuments.sql diff -u PanGalactic/src/sql/insertDocuments.sql:1.1 PanGalactic/src/sql/insertDocuments.sql:1.2 --- PanGalactic/src/sql/insertDocuments.sql:1.1 Thu Oct 30 14:24:29 2003 +++ PanGalactic/src/sql/insertDocuments.sql Thu Oct 30 16:39:46 2003 @@ -1,13 +1,67 @@ /* PGER Demo Document data insertion. */ -/* $Id: insertDocuments.sql,v 1.1 2003/10/30 19:24:29 waterbug Exp $ */ +/* $Id: insertDocuments.sql,v 1.2 2003/10/30 21:39:46 waterbug Exp $ */ BEGIN; SET CONSTRAINTS ALL DEFERRED; +INSERT INTO document +( +pgef_oid, +pgef_class, +id, +id_context, +pgef_security_mask, +short_description, +long_description, +pger_owner, +pger_owner_context, +pger_creator, +pger_creator_context, +pger_modifier, +pger_modifier_context, +owner, +owner_context, +creator, +creator_context, +create_datetime, +modifier, +modifier_context, +mod_datetime, +name, +master +) +VALUES +( +'smallberries@yoyodyne.planet10.1036203962.100', +'Document', -- pgef_class +'DOCUMENT-01', -- id +'TEST', -- id_context +'0', -- pgef_security_mask +'Document 01 (Test)', -- short_description +'Document 01 blah blah (Test)', -- long_description +'smallberries@yoyodyne.planet10', -- pger_owner +'TEST', -- pger_owner_context +'smallberries@yoyodyne.planet10', -- pger_creator +'TEST', -- pger_creator_context +'smallberries@yoyodyne.planet10', -- pger_modifier +'TEST', -- pger_modifier_context +'smallberries@yoyodyne.planet10', -- owner +'TEST', -- owner_context +'smallberries@yoyodyne.planet10', -- creator +'TEST', -- creator_context +'2002-09-09 01:06:51', -- create_datetime +'smallberries@yoyodyne.planet10', -- modifier +'TEST', -- modifier_context +'2002-09-09 01:06:51', -- mod_datetime +'Test Document 01', -- name +'smallberries@yoyodyne.planet10.1036203962.01' -- master (oid) +); + INSERT INTO doc_master ( pgef_oid, +pgef_class, id, id_context, pgef_security_mask, @@ -34,10 +88,11 @@ VALUES ( 'smallberries@yoyodyne.planet10.1036203962.01', +'DocMaster', -- pgef_class 'DOC-01', -- id 'TEST', -- id_context '0', -- pgef_security_mask -'DocMaster for DOC-01 (Test)' -- short_description +'DocMaster for DOC-01 (Test)', -- short_description 'DocMaster for DOC-01 (Test)', -- long_description 'smallberries@yoyodyne.planet10', -- pger_owner 'TEST', -- pger_owner_context @@ -61,6 +116,7 @@ INSERT INTO doc_version ( pgef_oid, +pgef_class, id, id_context, of_dm_id, @@ -83,12 +139,13 @@ modifier_context, mod_datetime, name, -symbolic_tag, +revision, content ) VALUES ( 'smallberries@yoyodyne.planet10.1036203962.02', +'DocVersion', -- pgef_class '1', -- id 'TEST', -- id_context 'DOC-01', -- of_dm_id @@ -111,13 +168,14 @@ 'TEST', -- modifier_context '2002-09-09 01:06:51', -- mod_datetime 'Blooper Twanging Assembly', -- name -'v1.1', -- symbolic_tag +'v1.1', -- revision '' -- content ); INSERT INTO doc_rep ( pgef_oid, +pgef_class, id, id_context, of_dv_id, @@ -147,6 +205,7 @@ VALUES ( 'smallberries@yoyodyne.planet10.1036203962.03', +'DocRep', -- pgef_class '1', -- id 'TEST', -- id_context '1', -- of_dv_id @@ -177,6 +236,7 @@ INSERT INTO dr_file ( pgef_oid, +pgef_class, id, id_context, of_dr_id, @@ -206,12 +266,12 @@ secured_flag, bytes, mime_type, -mime_subtype, -mime_parameters +mime_subtype ) VALUES ( 'smallberries@yoyodyne.planet10.1036203962.04', +'DrFile', -- pgef_class '1', -- id 'TEST', -- id_context '1', -- of_dr_id @@ -239,10 +299,9 @@ 'internal', -- location 'doc-01.txt', -- user_file_name '1', -- secured_flag -'12345', -- bytes +12345, -- bytes 'text', -- mime_type -'plain', -- mime_subtype -'' -- mime_parameters +'plain' -- mime_subtype ); Index: PanGalactic/src/sql/insertRefData.sql diff -u PanGalactic/src/sql/insertRefData.sql:1.3 PanGalactic/src/sql/insertRefData.sql:1.4 --- PanGalactic/src/sql/insertRefData.sql:1.3 Thu Oct 2 13:39:06 2003 +++ PanGalactic/src/sql/insertRefData.sql Thu Oct 30 16:39:46 2003 @@ -1,6 +1,6 @@ /* PGERDB reference data initialization. */ -/* $Id: insertRefData.sql,v 1.3 2003/10/02 17:39:06 waterbug Exp $ */ +/* $Id: insertRefData.sql,v 1.4 2003/10/30 21:39:46 waterbug Exp $ */ /* This script sets up the default identification contexts for * PGEF objects, and is required before the PGERDB can be @@ -196,12 +196,45 @@ ) VALUES ( - 'admin@fsc.doc_type.1', + 'admin@doc_type.1', 'Unknown', 'PGER', 'Unknown Document Type', 'Default type for unidentified document types.' ); +INSERT INTO doc_type +( + pgef_oid, + id, -- primary key + id_context, -- primary key + name, + short_description +) +VALUES +( + 'admin@doc_type.2', + 'Generic', + 'TEST', + 'Generic Document Type', + 'Document type for testing.' +); + +INSERT INTO doc_type +( + pgef_oid, + id, -- primary key + id_context, -- primary key + name, + short_description +) +VALUES +( + 'admin@doc_type.3', + 'PGEF Advisory', + 'PGER', + 'PGEF Advisory', + 'Mother of all Alert/Advisory document types.' +); END; Index: PanGalactic/src/sql/populate_pgerdb.sh diff -u PanGalactic/src/sql/populate_pgerdb.sh:1.3 PanGalactic/src/sql/populate_pgerdb.sh:1.4 --- PanGalactic/src/sql/populate_pgerdb.sh:1.3 Thu Oct 30 14:24:29 2003 +++ PanGalactic/src/sql/populate_pgerdb.sh Thu Oct 30 16:39:46 2003 @@ -1,6 +1,6 @@ #!/bin/bash -# $Id: populate_pgerdb.sh,v 1.3 2003/10/30 19:24:29 waterbug Exp $ +# $Id: populate_pgerdb.sh,v 1.4 2003/10/30 21:39:46 waterbug Exp $ psql pgerdb < insertRefData.sql psql pgerdb < insertMediaTypes.sql @@ -12,4 +12,5 @@ psql pgerdb < insertProductModelMasters.sql psql pgerdb < insertProductModelVersions.sql psql pgerdb < insertACUs.sql +psql pgerdb < insertDocuments.sql From waterbug at ned.gsfc.nasa.gov Thu Oct 30 16:41:26 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 30 16:41:27 2003 Subject: [Pangalactic-commits] Comment out some debugging prints. Message-ID: <200310302141.h9ULfQhj022226@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/repo/registry.py 1.36 1.37 Log message: Comment out some debugging prints. Index: PanGalactic/pangalactic/repo/registry.py diff -u PanGalactic/pangalactic/repo/registry.py:1.36 PanGalactic/pangalactic/repo/registry.py:1.37 --- PanGalactic/pangalactic/repo/registry.py:1.36 Wed Oct 29 17:07:21 2003 +++ PanGalactic/pangalactic/repo/registry.py Thu Oct 30 16:41:24 2003 @@ -1,9 +1,9 @@ """ Pan Galactic Engineering Repository Object Registry -@version: $Revision: 1.36 $ +@version: $Revision: 1.37 $ """ -__version__ = "$Revision: 1.36 $"[11:-2] +__version__ = "$Revision: 1.37 $"[11:-2] # $Source: /repo/step_testbed/PanGalactic/pangalactic/repo/registry.py,v $ import string, re @@ -220,6 +220,8 @@ self.view_cols = {} for viewname in pgerdbviews: # find the oid for viewname ... + # DEBUG: + # print '\ndoing view %s' % viewname curs.execute("SELECT oid FROM pg_class \ WHERE relname = %s", viewname) result = curs.fetchall() @@ -233,6 +235,9 @@ result = curs.fetchall() for item in result: self.view_cols[viewname].append(item[0]) + # DEBUG: + # print 'view_cols[%s] is %s' % (viewname, + # self.view_cols[viewname]) for tablename in pgerdbtables: classname = self.getClassName(tablename) # DEBUG: print '\ndoing table %s' % tablename From waterbug at ned.gsfc.nasa.gov Thu Oct 30 17:56:58 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 30 17:57:00 2003 Subject: [Pangalactic-commits] Mods for supporting table and view generation. Message-ID: <200310302256.h9UMuwKZ023825@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/document.py 1.15 1.16 PanGalactic/pangalactic/enterprise/pgefobject.py 1.30 1.31 Log message: Mods for supporting table and view generation. Index: PanGalactic/pangalactic/enterprise/document.py diff -u PanGalactic/pangalactic/enterprise/document.py:1.15 PanGalactic/pangalactic/enterprise/document.py:1.16 --- PanGalactic/pangalactic/enterprise/document.py:1.15 Thu Oct 23 15:06:19 2003 +++ PanGalactic/pangalactic/enterprise/document.py Thu Oct 30 17:56:57 2003 @@ -1,10 +1,10 @@ -# $Id: document.py,v 1.15 2003/10/23 19:06:19 pbear Exp $ +# $Id: document.py,v 1.16 2003/10/30 22:56:57 waterbug Exp $ """ The Mother of all document types in PGEF. """ -__version__ = "$Revision: 1.15 $"[11:-2] +__version__ = "$Revision: 1.16 $"[11:-2] import string @@ -67,6 +67,12 @@ _schema.update(PgefObject._schema) _searchabletext = True _std_abbrev = 'doc' + _views = { + 'document_view': [ + ], + 'document_view_all' : [ + ] + } def __init__(self, email=None, schema=_schema, **kw): @@ -76,6 +82,7 @@ setattr(self, a, kw[a]) self._master = kw.get('_master', DocMaster(email=email)) self._versions = {} + # may need to pass in some kw args from init here ... v = DocVersion(_of_master=self._master, id='1') self._current_version = v self._reps = {} Index: PanGalactic/pangalactic/enterprise/pgefobject.py diff -u PanGalactic/pangalactic/enterprise/pgefobject.py:1.30 PanGalactic/pangalactic/enterprise/pgefobject.py:1.31 --- PanGalactic/pangalactic/enterprise/pgefobject.py:1.30 Tue Oct 28 15:00:13 2003 +++ PanGalactic/pangalactic/enterprise/pgefobject.py Thu Oct 30 17:56:57 2003 @@ -1,8 +1,8 @@ -# $Id: pgefobject.py,v 1.30 2003/10/28 20:00:13 bmuir Exp $ +# $Id: pgefobject.py,v 1.31 2003/10/30 22:56:57 waterbug Exp $ """ The Mother of all PGEF application classes. -@version: $Revision: 1.30 $ +@version: $Revision: 1.31 $ """ # TODO: @@ -24,7 +24,7 @@ # should we jettison this? # Nope. -__version__ = "$Revision: 1.30 $"[11:-2] +__version__ = "$Revision: 1.31 $"[11:-2] import types import string @@ -38,6 +38,10 @@ class PgefObject(object, pb.Cacheable, pb.RemoteCache): """ This is the base class for all of the Pgef data classes. + + @type _attrs: list + @cvar _attrs: the names of all persistent attributes, in + their default order. @type _default_display_order: list @cvar _default_display_order: the names of all "public" From waterbug at ned.gsfc.nasa.gov Thu Oct 30 17:58:23 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Thu Oct 30 17:58:25 2003 Subject: [Pangalactic-commits] master -> master_oid Message-ID: <200310302258.h9UMwNwl023898@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbTables.sql 1.66 1.67 PanGalactic/src/sql/createPgerDbViews.sql 1.3 1.4 Log message: master -> master_oid Index: PanGalactic/src/sql/createPgerDbViews.sql diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.3 PanGalactic/src/sql/createPgerDbViews.sql:1.4 --- PanGalactic/src/sql/createPgerDbViews.sql:1.3 Wed Oct 29 17:26:20 2003 +++ PanGalactic/src/sql/createPgerDbViews.sql Thu Oct 30 17:58:21 2003 @@ -28,7 +28,7 @@ modifier, modifier_context, mod_datetime, - master, + master_oid, dm_pgef_oid, dm_pgef_class, dm_id, @@ -190,7 +190,7 @@ modifier, modifier_context, mod_datetime, - master, + master_oid, dm_pgef_oid, dm_pgef_class, dm_id, Index: PanGalactic/src/sql/createPgerDbTables.sql diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.66 PanGalactic/src/sql/createPgerDbTables.sql:1.67 --- PanGalactic/src/sql/createPgerDbTables.sql:1.66 Fri Oct 24 14:44:18 2003 +++ PanGalactic/src/sql/createPgerDbTables.sql Thu Oct 30 17:58:21 2003 @@ -1,6 +1,6 @@ /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */ -/* $Id: createPgerDbTables.sql,v 1.66 2003/10/24 18:44:18 waterbug Exp $ +/* $Id: createPgerDbTables.sql,v 1.67 2003/10/30 22:58:21 waterbug Exp $ * * *** TO DO *** * -- TBR (Text-Based Requirements) @@ -1283,11 +1283,11 @@ * pgef_class for each table is set at table creation * time, but it may be overridden for any specific row * and set to a custom application object class. */ - master TEXT, + master_oid TEXT, /* pgef_oid of the associated DocMaster. */ PRIMARY KEY (pgef_oid), CONSTRAINT doc_has_master - FOREIGN KEY (master) + FOREIGN KEY (master_oid) REFERENCES doc_master(pgef_oid) ON UPDATE CASCADE ON DELETE CASCADE From waterbug at ned.gsfc.nasa.gov Fri Oct 31 11:15:37 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Fri Oct 31 11:15:38 2003 Subject: [Pangalactic-commits] More master -> master_oid, and removal of mime_parameters. Message-ID: <200310311615.h9VGFbrN000655@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbTables.sql 1.67 1.68 PanGalactic/src/sql/createPgerDbViews.sql 1.4 1.5 PanGalactic/src/sql/insertDocuments.sql 1.2 1.3 Log message: More master -> master_oid, and removal of mime_parameters. Index: PanGalactic/src/sql/insertDocuments.sql diff -u PanGalactic/src/sql/insertDocuments.sql:1.2 PanGalactic/src/sql/insertDocuments.sql:1.3 --- PanGalactic/src/sql/insertDocuments.sql:1.2 Thu Oct 30 16:39:46 2003 +++ PanGalactic/src/sql/insertDocuments.sql Fri Oct 31 11:15:35 2003 @@ -1,6 +1,6 @@ /* PGER Demo Document data insertion. */ -/* $Id: insertDocuments.sql,v 1.2 2003/10/30 21:39:46 waterbug Exp $ */ +/* $Id: insertDocuments.sql,v 1.3 2003/10/31 16:15:35 waterbug Exp $ */ BEGIN; SET CONSTRAINTS ALL DEFERRED; @@ -29,7 +29,7 @@ modifier_context, mod_datetime, name, -master +master_oid ) VALUES ( @@ -55,7 +55,7 @@ 'TEST', -- modifier_context '2002-09-09 01:06:51', -- mod_datetime 'Test Document 01', -- name -'smallberries@yoyodyne.planet10.1036203962.01' -- master (oid) +'smallberries@yoyodyne.planet10.1036203962.01' -- master_oid ); INSERT INTO doc_master Index: PanGalactic/src/sql/createPgerDbViews.sql diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.4 PanGalactic/src/sql/createPgerDbViews.sql:1.5 --- PanGalactic/src/sql/createPgerDbViews.sql:1.4 Thu Oct 30 17:58:21 2003 +++ PanGalactic/src/sql/createPgerDbViews.sql Fri Oct 31 11:15:35 2003 @@ -143,7 +143,6 @@ df_bytes, df_mime_type, df_mime_subtype, - df_mime_parameters, df_of_dr_id, df_of_dv_id, df_of_dm_id, @@ -153,7 +152,7 @@ FROM ONLY document d, doc_master dm, doc_version dv, doc_rep dr, dr_file df - WHERE dm.pgef_oid = d.master + WHERE dm.pgef_oid = d.master_oid AND dv.of_dm_id = dm.id AND dv.of_dm_id_context = dm.id_context AND dr.of_dv_id = dv.id @@ -305,7 +304,6 @@ df_bytes, df_mime_type, df_mime_subtype, - df_mime_parameters, df_of_dr_id, df_of_dv_id, df_of_dm_id, @@ -315,7 +313,7 @@ FROM document d, doc_master dm, doc_version dv, doc_rep dr, dr_file df - WHERE dm.pgef_oid = d.master + WHERE dm.pgef_oid = d.master_oid AND dv.of_dm_id = dm.id AND dv.of_dm_id_context = dm.id_context AND dr.of_dv_id = dv.id Index: PanGalactic/src/sql/createPgerDbTables.sql diff -u PanGalactic/src/sql/createPgerDbTables.sql:1.67 PanGalactic/src/sql/createPgerDbTables.sql:1.68 --- PanGalactic/src/sql/createPgerDbTables.sql:1.67 Thu Oct 30 17:58:21 2003 +++ PanGalactic/src/sql/createPgerDbTables.sql Fri Oct 31 11:15:35 2003 @@ -1,6 +1,6 @@ /* Pan Galactic Engineering Repository Database (PGERDB) Table Creation Script */ -/* $Id: createPgerDbTables.sql,v 1.67 2003/10/30 22:58:21 waterbug Exp $ +/* $Id: createPgerDbTables.sql,v 1.68 2003/10/31 16:15:35 waterbug Exp $ * * *** TO DO *** * -- TBR (Text-Based Requirements) @@ -1532,10 +1532,9 @@ mime_type TEXT, /* [PDME] Part of MimeMediaType. */ mime_subtype TEXT, - /* [PDME] Part of MimeMediaType. */ - mime_parameters TEXT DEFAULT '', - /* [PDME] Part of MimeMediaType. OPTIONAL (don't really - * know what it is ...!) */ + /* [PDME] Part of MimeMediaType. In our first cut, we + * are going to ignore mime parameters, which are kind of + * a mixed bag, anyway. */ CONSTRAINT file_has_mime_type FOREIGN KEY (mime_type, mime_subtype) REFERENCES media_type From waterbug at ned.gsfc.nasa.gov Fri Oct 31 11:19:43 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Fri Oct 31 11:19:46 2003 Subject: [Pangalactic-commits] Removed "mime_parameters" -- can of worms. Message-ID: <200310311619.h9VGJhwO000767@ned.gsfc.nasa.gov> Modified files: PanGalactic/pangalactic/enterprise/pgeffile.py 1.9 1.10 Log message: Removed "mime_parameters" -- can of worms. Index: PanGalactic/pangalactic/enterprise/pgeffile.py diff -u PanGalactic/pangalactic/enterprise/pgeffile.py:1.9 PanGalactic/pangalactic/enterprise/pgeffile.py:1.10 --- PanGalactic/pangalactic/enterprise/pgeffile.py:1.9 Mon Sep 29 14:39:59 2003 +++ PanGalactic/pangalactic/enterprise/pgeffile.py Fri Oct 31 11:19:42 2003 @@ -1,10 +1,10 @@ -# $Id: pgeffile.py,v 1.9 2003/09/29 18:39:59 waterbug Exp $ +# $Id: pgeffile.py,v 1.10 2003/10/31 16:19:42 waterbug Exp $ """ A container for information about a file. """ -__version__ = "$Revision: 1.9 $"[11:-2] +__version__ = "$Revision: 1.10 $"[11:-2] from pangalactic.enterprise.pgefobject import PgefObject @@ -23,8 +23,7 @@ 'secured_flag' : 'str', 'bytes' : 'str', 'mime_type' : 'str', - 'mime_subtype' : 'str', - 'mime_parameters' : 'str' + 'mime_subtype' : 'str' } _schema = _schema_ext.copy() _schema.update(PgefObject._schema) From waterbug at ned.gsfc.nasa.gov Fri Oct 31 11:28:16 2003 From: waterbug at ned.gsfc.nasa.gov (waterbug CVS) Date: Fri Oct 31 11:28:18 2003 Subject: [Pangalactic-commits] Better name. Message-ID: <200310311628.h9VGSG05000822@ned.gsfc.nasa.gov> Modified files: PanGalactic/src/sql/createPgerDbViews.sql 1.5 1.6 Log message: Better name. Index: PanGalactic/src/sql/createPgerDbViews.sql diff -u PanGalactic/src/sql/createPgerDbViews.sql:1.5 PanGalactic/src/sql/createPgerDbViews.sql:1.6 --- PanGalactic/src/sql/createPgerDbViews.sql:1.5 Fri Oct 31 11:15:35 2003 +++ PanGalactic/src/sql/createPgerDbViews.sql Fri Oct 31 11:28:15 2003 @@ -163,7 +163,7 @@ AND df.of_dm_id = dr.of_dm_id AND df.of_dm_id_context = dr.of_dm_id_context; -CREATE VIEW document_view_all +CREATE VIEW document_view_subtypes ( pgef_oid, pgef_class,