|
2 | 2 | import logging |
3 | 3 | from datetime import datetime |
4 | 4 | from typing import Dict, Generator, List, Optional, Union, cast |
5 | | -from uuid import UUID |
| 5 | +from uuid import NAMESPACE_OID, UUID, uuid5 |
6 | 6 |
|
7 | 7 | from lxml import etree |
8 | 8 | from sqlalchemy.exc import IntegrityError |
@@ -75,6 +75,20 @@ def add_books_to_commit( |
75 | 75 | db.add(db_book) |
76 | 76 |
|
77 | 77 |
|
| 78 | +def get_or_add_book(db: Session, book: Book): |
| 79 | + existing_book = cast( |
| 80 | + Optional[Book], |
| 81 | + db.query(Book) |
| 82 | + .filter(Book.uuid == book.uuid, Book.commit_id == book.commit_id) |
| 83 | + .first(), |
| 84 | + ) |
| 85 | + if existing_book is not None: |
| 86 | + return existing_book |
| 87 | + db.add(book) |
| 88 | + db.flush() |
| 89 | + return book |
| 90 | + |
| 91 | + |
78 | 92 | def add_books_to_job( |
79 | 93 | db: Session, |
80 | 94 | job: JobSchema, |
@@ -190,11 +204,38 @@ async def insert_job(): |
190 | 204 |
|
191 | 205 | def update(self, db_session: Session, job: JobSchema, job_in: JobUpdate): |
192 | 206 | if isinstance(job_in.artifact_urls, list): |
193 | | - book_job_by_book_slug = {b.book.slug: b for b in job.books} |
194 | | - for artifact_url in job_in.artifact_urls: |
195 | | - book_job_by_book_slug[ |
196 | | - artifact_url.slug |
197 | | - ].artifact_url = artifact_url.url |
| 207 | + artifact_url_by_book_slug = { |
| 208 | + art.slug: art.url for art in job_in.artifact_urls |
| 209 | + } |
| 210 | + job_books = {b.book.slug for b in job.books} |
| 211 | + # books that are created during the build |
| 212 | + ephemeral_book_slugs = { |
| 213 | + artifact_url.slug |
| 214 | + for artifact_url in job_in.artifact_urls |
| 215 | + if artifact_url.slug not in job_books |
| 216 | + } |
| 217 | + if ephemeral_book_slugs: |
| 218 | + for book_slug in ephemeral_book_slugs: |
| 219 | + book_uuid = str(uuid5(NAMESPACE_OID, book_slug)) |
| 220 | + style = ( |
| 221 | + "super" |
| 222 | + if book_slug.startswith("super--") |
| 223 | + else "unknown" |
| 224 | + ) |
| 225 | + book = Book( |
| 226 | + uuid=book_uuid, |
| 227 | + commit_id=job.books[0].book.commit_id, |
| 228 | + edition=0, |
| 229 | + slug=book_slug, |
| 230 | + style=style, |
| 231 | + ) |
| 232 | + book = get_or_add_book(db_session, book) |
| 233 | + add_books_to_job(db_session, job, [book]) |
| 234 | + db_session.flush() |
| 235 | + for book_job in job.books: |
| 236 | + artifact_url = artifact_url_by_book_slug.get(book_job.book.slug) |
| 237 | + if artifact_url: |
| 238 | + book_job.artifact_url = artifact_url |
198 | 239 | elif job_in.artifact_urls is not None: |
199 | 240 | job.books[0].artifact_url = job_in.artifact_urls |
200 | 241 | return super().update(db_session, job, job_in, JobUpdate) |
|
0 commit comments