def __findRelatedDrawings(self, drawingNumberBase): """ See getRelatedDrawingSearchResults """ if drawingNumberBase is None: raise InvalidRequest( 'drawingNumber or drawing number base must be provided') # Check if something with extension was given splitPattern = drawingNumberBase.split('.') if splitPattern.__len__() > 1: # raises InvalidArgument PdmLinkDrawing.checkDrawingNumber(drawingNumberBase) drawingNumberBase = splitPattern[0] searchPattern = drawingNumberBase + '.???' searchResults = self.getDrawingSearchResults(searchPattern) relatedDrawings = [] for searchResult in searchResults: if searchResult['number'].split( '.')[0].lower() == drawingNumberBase.lower(): relatedDrawings.append(searchResult) if relatedDrawings.__len__() == 0: raise ObjectNotFound("Related PDMLink drawings for '" + drawingNumberBase + "' could not be found") return relatedDrawings
def findPdmLinkDrawing(self, drawingNumber): """ Find PDMLink drawing object by name. :param drawingNumber: (str) The full number of the PDMLink drawing :return: PDMLink Drawing :raises ExternalServiceError: Could occur during the PDM Link search :raises ObjectNotFound: The requested drawing was not found :raises InvalidArgument: The drawing name is not complete """ def findNameInList(): if self.__isDrawingListEmpty(drawingList) is False: for drawing in drawingList: curDrawingNumber = drawing.properties[self.__getNumberIndex(drawing)].value if curDrawingNumber.lower() == drawingNumber.lower(): return drawing return None # Getting a single PDM Link requires the full name with extension. PdmLinkDrawing.checkDrawingNumber(drawingNumber) drawingList = self.findPdmLinkDrawings(drawingNumber) # Find the requested drawing from results reqDrawing = findNameInList() # List did not contain requested drawing if not reqDrawing: # Try searching without extension drawingList = self.__searchWithoutExtension(drawingNumber) reqDrawing = findNameInList() if not reqDrawing: raise ObjectNotFound('PDMLink drawing %s could not be found.' % drawingNumber) return reqDrawing
def __generateComponentInfo(self, drawingNumber): """ see generateComponentInfo """ if drawingNumber is None: raise InvalidRequest('drawingNumber must be provided') drawingDetails = None ufid = None # Component Info pdmComponentModel = None pdmPropertyValues = [] # Search using the drawing name provided PdmLinkDrawing.checkDrawingNumber(drawingNumber) drawingNumberBase = str(drawingNumber).split('.')[0] searchResults = self.__findRelatedDrawings(drawingNumberBase) # Generate list of PDM Link properties and component Name # Drawing is searchable only by UFID provided for searchResult in searchResults: resultExt = searchResult['number'].split('.')[-1] if str(resultExt).lower() == drawingNumber.split('.')[-1].lower(): # set UFID for getting drawing metadata ufid = searchResult['ufid'] # Set pdmComponentModel pdmComponentModel = str(searchResult['number']).split('.')[0] pdmPropertyValues.append(drawingNumberBase) if pdmComponentModel is None: pdmComponentModel = drawingNumberBase if ufid is None: # DRW was not found use titles of the first search result ufid = searchResults[0]['ufid'] componentInfo = {} componentInfo['modelNumber'] = pdmComponentModel componentInfo['drawingNumber'] = drawingNumber componentInfo['pdmPropertyValues'] = pdmPropertyValues ''' # Generate component type suggestions self.__createComponentDbApi() # Get a list of available types componentTypes = self.componentDbApi.getComponentTypes() ''' # Get drawing details for keywords if drawingDetails is None: drawingDetails = self.__getDrawingDetailsWithoutSSL(ufid) # Add WBS description componentInfo['wbsDescription'] = drawingDetails['wbsDescription'] # Generate a keyword list from drawings titles keywordList = [] cdbDescription = '' for i in range(1, 6): title = str(drawingDetails['title' + str(i)]) if title != 'None' and title is not None: cdbDescription += title + "; " tmpKeywordList = title.split(' ') for keyword in tmpKeywordList: if keyword != '-': keywordList.append(keyword) # Remove the last semicolon and set cdbDescription componentInfo['cdbDescription'] = cdbDescription[0:-2] if drawingDetails['title5'] != None and drawingDetails[ 'title5'] != '' and drawingDetails['title5'] != '-': componentInfo['name'] = drawingDetails['title5'] else: componentInfo['name'] = pdmComponentModel ''' # Key is id of a component type and value is commonality of a component type based on keywords. stats = {} suggestedTypeList = [] for componentType in componentTypes: componentTypeName = str(componentType['name']).lower() for keyword in keywordList: keyword = keyword.lower() if keyword + ' ' in componentTypeName \ or ' ' + keyword in componentTypeName \ or componentTypeName.startswith(keyword): curID = str(componentType['id']) if curID not in stats.keys(): stats[curID] = 1 else: stats[curID] += 1 # Sort dictionary keys by value sortedIds = sorted(stats, key=stats.get) # Add the suggested types from most to least popular for i in range(sortedIds.__len__() -1, -1, -1): for componentType in componentTypes: if int(componentType['id']) == int(sortedIds[i]): suggestedTypeList.append(componentType) continue componentInfo['suggestedComponentTypes'] = suggestedTypeList ''' return PdmLinkComponent(componentInfo)
def __getDrawing(self, pdmLinkDrawingObject, ufid=None, oid=None): """ Get complete drawing object including drawing information and revision information from PDMLink and ICMS :param pdmLinkDrawingObject: (PDMLink Drawing Object) One drawing result from PDMLink :return: CDBObject of type PdmLinkDrawing """ if pdmLinkDrawingObject is not None: if (pdmLinkDrawingObject.ufid is None) and (ufid is None): return None if pdmLinkDrawingObject is None and ufid is None: return None if ufid is None: ufid = pdmLinkDrawingObject.ufid self.logger.debug('Retrieving iteration history for UFID: %s' % ufid) iterationHistory = self.windchillWs.service.GetIterationHistory( [ufid], [ 'versionInfo.identifier.versionId', 'iterationInfo.identifier.iterationId', 'state.state', 'thePersistInfo.modifyStamp' ]) revisionList = [] for iteration in iterationHistory: iterationUfid = iteration.ufid propertyMap = self.getPdmLinkObjectPropertyMap(iteration) versionId = propertyMap.get('versionInfo.identifier.versionId') iterationId = propertyMap.get( 'iterationInfo.identifier.iterationId') state = propertyMap.get('state.state') dateModified = propertyMap.get('thePersistInfo.modifyStamp') revisionList.append( PdmLinkDrawingRevision({ 'version': versionId, 'iteration': iterationId, 'state': state, 'ufid': iterationUfid, 'dateModified': dateModified })) if (oid is None): propertyMap = self.getPdmLinkObjectPropertyMap( pdmLinkDrawingObject) oid = propertyMap.get('oid') latestUfid = iterationHistory[0].ufid drawingInfo = self.__getDrawingDetails(latestUfid) number = drawingInfo['number'] # Create a windchill url for the drawing response = self.windchillWebparts.service.GetActionUrl('object.view') actionUrl = str(response[0].value) actionUrl = actionUrl.replace('INSERTOID', oid) # retrieve the revisions from ICMS icmsRevisions = self.getIcmsRevisions(number) # Add ICMS link to revisions that have an ICMS link for pdmRevision in revisionList: for icmsRevision in icmsRevisions: if (pdmRevision['version'] == icmsRevision['revision']['version']) and ( pdmRevision['iteration'] == icmsRevision['revision']['iteration']): pdmRevision['icmsUrl'] = icmsRevision['url'] icmsRevision['done'] = True # Add ICMS revisions that were not matched with the PDM Link revisions for revision in icmsRevisions: if 'done' in revision: pass else: newRev = {} newRev['state'] = 'ICMS Mismatch' newRev['icmsUrl'] = revision['url'] newRev['version'] = revision['revision']['version'] newRev['iteration'] = revision['revision']['iteration'] revisionList.append(newRev) # Populate a drawing information object drawingInfo['windchillUrl'] = actionUrl drawingInfo['revisionList'] = revisionList return PdmLinkDrawing(drawingInfo)