1111import pkginfo
1212from aiohttp .client_exceptions import ClientError
1313from django .conf import settings
14+ from django .db .models import OuterRef , Subquery
1415from django .db .utils import IntegrityError
1516from jinja2 import Template
1617from packaging .requirements import Requirement
1920from pypi_simple import ACCEPT_JSON_PREFERRED , ProjectPage
2021
2122from pulpcore .plugin .exceptions import TimeoutException
22- from pulpcore .plugin .models import Artifact , Remote
23+ from pulpcore .plugin .models import Artifact , Remote , RepositoryContent
2324from pulpcore .plugin .util import get_domain
2425
2526log = logging .getLogger (__name__ )
@@ -359,7 +360,9 @@ def fetch_json_release_metadata(name: str, version: str, remotes: set[Remote]) -
359360 raise Exception (f"Failed to fetch { url } from any remote." )
360361
361362
362- def python_content_to_json (base_path , content_query , version = None , domain = None ):
363+ def python_content_to_json (
364+ base_path , content_query , version = None , domain = None , repository_version = None
365+ ):
363366 """
364367 Converts a QuerySet of PythonPackageContent into the PyPi JSON format
365368 https://www.python.org/dev/peps/pep-0566/
@@ -371,6 +374,13 @@ def python_content_to_json(base_path, content_query, version=None, domain=None):
371374
372375 Returns None if version is specified but not found within content_query
373376 """
377+ if repository_version :
378+ repo_added_subquery = RepositoryContent .objects .filter (
379+ content_id = OuterRef ("pk" ),
380+ repository = repository_version .repository ,
381+ version_removed = None ,
382+ ).values ("pulp_created" )[:1 ]
383+ content_query = content_query .annotate (repo_added_time = Subquery (repo_added_subquery ))
374384 full_metadata = {"last_serial" : 0 } # For now the serial field isn't supported by Pulp
375385 latest_content = latest_content_version (content_query , version )
376386 if not latest_content :
@@ -515,8 +525,10 @@ def find_artifact():
515525 "python_version" : content .python_version ,
516526 "requires_python" : content .requires_python or None ,
517527 "size" : content .size ,
518- "upload_time" : str (content .pulp_created ),
519- "upload_time_iso_8601" : str (content .pulp_created .isoformat ()),
528+ "upload_time" : str (getattr (content , "repo_added_time" , None ) or content .pulp_created ),
529+ "upload_time_iso_8601" : str (
530+ (getattr (content , "repo_added_time" , None ) or content .pulp_created ).isoformat ()
531+ ),
520532 "url" : url ,
521533 "yanked" : False ,
522534 "yanked_reason" : None ,
0 commit comments