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
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