示例#1
0
    def canRemove(self, publication_class, filename, file_md5):
        """Check if given (filename, MD5) can be removed from the pool.

        Check the archive reference-counter implemented in:
        `SourcePackagePublishingHistory` or
        `BinaryPackagePublishingHistory`.

        Only allow removal of unnecessary files.
        """
        clauses = []
        clauseTables = []

        if ISourcePackagePublishingHistory.implementedBy(
            publication_class):
            clauses.append("""
                SourcePackagePublishingHistory.archive = %s AND
                SourcePackagePublishingHistory.dateremoved is NULL AND
                SourcePackagePublishingHistory.sourcepackagerelease =
                    SourcePackageReleaseFile.sourcepackagerelease AND
                SourcePackageReleaseFile.libraryfile = LibraryFileAlias.id
            """ % sqlvalues(self.archive))
            clauseTables.append('SourcePackageReleaseFile')
        elif IBinaryPackagePublishingHistory.implementedBy(
            publication_class):
            clauses.append("""
                BinaryPackagePublishingHistory.archive = %s AND
                BinaryPackagePublishingHistory.dateremoved is NULL AND
                BinaryPackagePublishingHistory.binarypackagerelease =
                    BinaryPackageFile.binarypackagerelease AND
                BinaryPackageFile.libraryfile = LibraryFileAlias.id
            """ % sqlvalues(self.archive))
            clauseTables.append('BinaryPackageFile')
        else:
            raise AssertionError("%r is not supported." % publication_class)

        clauses.append("""
           LibraryFileAlias.content = LibraryFileContent.id AND
           LibraryFileAlias.filename = %s AND
           LibraryFileContent.md5 = %s
        """ % sqlvalues(filename, file_md5))
        clauseTables.extend(
            ['LibraryFileAlias', 'LibraryFileContent'])

        all_publications = publication_class.select(
            " AND ".join(clauses), clauseTables=clauseTables)

        right_now = datetime.datetime.now(pytz.timezone('UTC'))
        for pub in all_publications:
            # Deny removal if any reference is still active.
            if pub.status not in inactive_publishing_status:
                return False
            # Deny removal if any reference wasn't dominated yet.
            if pub.scheduleddeletiondate is None:
                return False
            # Deny removal if any reference is still in 'quarantine'.
            if pub.scheduleddeletiondate > right_now:
                return False

        return True
示例#2
0
    def canRemove(self, publication_class, filename, file_md5):
        """Check if given (filename, MD5) can be removed from the pool.

        Check the archive reference-counter implemented in:
        `SourcePackagePublishingHistory` or
        `BinaryPackagePublishingHistory`.

        Only allow removal of unnecessary files.
        """
        clauses = []
        clauseTables = []

        if ISourcePackagePublishingHistory.implementedBy(publication_class):
            clauses.append("""
                SourcePackagePublishingHistory.archive = %s AND
                SourcePackagePublishingHistory.dateremoved is NULL AND
                SourcePackagePublishingHistory.sourcepackagerelease =
                    SourcePackageReleaseFile.sourcepackagerelease AND
                SourcePackageReleaseFile.libraryfile = LibraryFileAlias.id
            """ % sqlvalues(self.archive))
            clauseTables.append('SourcePackageReleaseFile')
        elif IBinaryPackagePublishingHistory.implementedBy(publication_class):
            clauses.append("""
                BinaryPackagePublishingHistory.archive = %s AND
                BinaryPackagePublishingHistory.dateremoved is NULL AND
                BinaryPackagePublishingHistory.binarypackagerelease =
                    BinaryPackageFile.binarypackagerelease AND
                BinaryPackageFile.libraryfile = LibraryFileAlias.id
            """ % sqlvalues(self.archive))
            clauseTables.append('BinaryPackageFile')
        else:
            raise AssertionError("%r is not supported." % publication_class)

        clauses.append("""
           LibraryFileAlias.content = LibraryFileContent.id AND
           LibraryFileAlias.filename = %s AND
           LibraryFileContent.md5 = %s
        """ % sqlvalues(filename, file_md5))
        clauseTables.extend(['LibraryFileAlias', 'LibraryFileContent'])

        all_publications = publication_class.select(" AND ".join(clauses),
                                                    clauseTables=clauseTables)

        right_now = datetime.datetime.now(pytz.timezone('UTC'))
        for pub in all_publications:
            # Deny removal if any reference is still active.
            if pub.status not in inactive_publishing_status:
                return False
            # Deny removal if any reference wasn't dominated yet.
            if pub.scheduleddeletiondate is None:
                return False
            # Deny removal if any reference is still in 'quarantine'.
            if pub.scheduleddeletiondate > right_now:
                return False

        return True