Пример #1
0
    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
Пример #2
0
    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
Пример #3
0
    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)
Пример #4
0
    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)