def update_files_privacy(pub_record): """Update file privacy according to the publishing destination :param pub_record: One of a SourcePackagePublishingHistory or BinaryPackagePublishingHistory record. :return: a list of changed `LibraryFileAlias` objects. """ package_files = [] archive = None if ISourcePackagePublishingHistory.providedBy(pub_record): archive = pub_record.archive # Unrestrict the package files files if necessary. sourcepackagerelease = pub_record.sourcepackagerelease package_files.extend([(source_file, 'libraryfile') for source_file in sourcepackagerelease.files]) # Unrestrict the package diff files if necessary. package_files.extend([(diff, 'diff_content') for diff in sourcepackagerelease.package_diffs]) # Unrestrict the source upload changesfile if necessary. package_upload = sourcepackagerelease.package_upload package_files.append((package_upload, 'changesfile')) package_files.append((sourcepackagerelease, 'changelog')) elif IBinaryPackagePublishingHistory.providedBy(pub_record): archive = pub_record.archive # Unrestrict the binary files if necessary. binarypackagerelease = pub_record.binarypackagerelease package_files.extend([(binary_file, 'libraryfile') for binary_file in binarypackagerelease.files]) # Unrestrict the upload changesfile file as necessary. build = binarypackagerelease.build package_upload = build.package_upload package_files.append((package_upload, 'changesfile')) # Unrestrict the buildlog file as necessary. package_files.append((build, 'log')) elif IPackageUploadCustom.providedBy(pub_record): # Unrestrict the custom files included package_files.append((pub_record, 'libraryfilealias')) # And set archive to the right attribute for PUCs archive = pub_record.packageupload.archive else: raise AssertionError( "pub_record is not one of SourcePackagePublishingHistory, " "BinaryPackagePublishingHistory or PackageUploadCustom.") changed_files = [] for obj, attr_name in package_files: lfa = getattr(obj, attr_name, None) # Only unrestrict restricted files published in public archives, # not the opposite. We don't have a use-case for privatizing # files yet. if (lfa is None or lfa.restricted == archive.private or lfa.restricted == False): continue # LibraryFileAlias.restricted is normally read-only, but we have a # good excuse here. removeSecurityProxy(lfa).restricted = archive.private changed_files.append(lfa) return changed_files
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
def is_binary(self): return IBinaryPackagePublishingHistory.providedBy(self.context)
def update_files_privacy(pub_record): """Update file privacy according to the publishing destination :param pub_record: One of a SourcePackagePublishingHistory or BinaryPackagePublishingHistory record. :return: a list of changed `LibraryFileAlias` objects. """ package_files = [] archive = None if ISourcePackagePublishingHistory.providedBy(pub_record): archive = pub_record.archive # Unrestrict the package files files if necessary. sourcepackagerelease = pub_record.sourcepackagerelease package_files.extend( [(source_file, 'libraryfile') for source_file in sourcepackagerelease.files]) # Unrestrict the package diff files if necessary. package_files.extend( [(diff, 'diff_content') for diff in sourcepackagerelease.package_diffs]) # Unrestrict the source upload changesfile if necessary. package_upload = sourcepackagerelease.package_upload package_files.append((package_upload, 'changesfile')) package_files.append((sourcepackagerelease, 'changelog')) elif IBinaryPackagePublishingHistory.providedBy(pub_record): archive = pub_record.archive # Unrestrict the binary files if necessary. binarypackagerelease = pub_record.binarypackagerelease package_files.extend( [(binary_file, 'libraryfile') for binary_file in binarypackagerelease.files]) # Unrestrict the upload changesfile file as necessary. build = binarypackagerelease.build package_upload = build.package_upload package_files.append((package_upload, 'changesfile')) # Unrestrict the buildlog file as necessary. package_files.append((build, 'log')) elif IPackageUploadCustom.providedBy(pub_record): # Unrestrict the custom files included package_files.append((pub_record, 'libraryfilealias')) # And set archive to the right attribute for PUCs archive = pub_record.packageupload.archive else: raise AssertionError( "pub_record is not one of SourcePackagePublishingHistory, " "BinaryPackagePublishingHistory or PackageUploadCustom.") changed_files = [] for obj, attr_name in package_files: lfa = getattr(obj, attr_name, None) # Only unrestrict restricted files published in public archives, # not the opposite. We don't have a use-case for privatizing # files yet. if (lfa is None or lfa.restricted == archive.private or lfa.restricted == False): continue # LibraryFileAlias.restricted is normally read-only, but we have a # good excuse here. removeSecurityProxy(lfa).restricted = archive.private changed_files.append(lfa) return changed_files