- Create Economist SubmissionTracking package correctly: * mainArticle = full blog post content * coverLetter = 216-word SIR— letter * Links to blog post via blogPostId - Archive 'Letter to The Economist' from blog posts (it's the cover letter) - Fix date display on article cards (use published_at) - Target publication already displaying via blue badge Database changes: - Make blogPostId optional in SubmissionTracking model - Economist package ID: 68fa85ae49d4900e7f2ecd83 - Le Monde package ID: 68fa2abd2e6acd5691932150 Next: Enhanced modal with tabs, validation, export 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
28 lines
1 KiB
Python
28 lines
1 KiB
Python
import urllib.parse
|
|
|
|
|
|
class PackageIndex:
|
|
"""Represents a Package Index and provides easier access to endpoints"""
|
|
|
|
__slots__ = ["url", "netloc", "simple_url", "pypi_url", "file_storage_domain"]
|
|
|
|
def __init__(self, url: str, file_storage_domain: str) -> None:
|
|
super().__init__()
|
|
self.url = url
|
|
self.netloc = urllib.parse.urlsplit(url).netloc
|
|
self.simple_url = self._url_for_path("simple")
|
|
self.pypi_url = self._url_for_path("pypi")
|
|
|
|
# This is part of a temporary hack used to block installs of PyPI
|
|
# packages which depend on external urls only necessary until PyPI can
|
|
# block such packages themselves
|
|
self.file_storage_domain = file_storage_domain
|
|
|
|
def _url_for_path(self, path: str) -> str:
|
|
return urllib.parse.urljoin(self.url, path)
|
|
|
|
|
|
PyPI = PackageIndex("https://pypi.org/", file_storage_domain="files.pythonhosted.org")
|
|
TestPyPI = PackageIndex(
|
|
"https://test.pypi.org/", file_storage_domain="test-files.pythonhosted.org"
|
|
)
|