Compare commits

...

3 commits

Author SHA1 Message Date
82868b28c6 Track external ID and use when importing 2024-03-12 21:08:07 -04:00
fc7671efd1 Log failure reason when skipping scryfall cards 2024-02-26 18:16:29 -05:00
1d9723fb1f Store set type 2024-02-26 18:16:14 -05:00
5 changed files with 34 additions and 5 deletions

View file

@ -0,0 +1,4 @@
ALTER TABLE "copies"
ADD COLUMN IF NOT EXISTS "external_id" TEXT UNIQUE;
CREATE INDEX IF NOT EXISTS "copies_external_id" ON "copies" ("external_id");

View file

@ -242,12 +242,15 @@ def update_scryfall(ctx, filename):
try: try:
card = tutor.scryfall.to_card(card_json).unwrap() card = tutor.scryfall.to_card(card_json).unwrap()
await tutor.database.store_set( await tutor.database.store_set(
cursor, card_json["set"].upper(), card_json["set_name"] cursor,
card_json["set"].upper(),
card_json["set_type"],
card_json["set_name"],
) )
await tutor.database.store_card(cursor, card) await tutor.database.store_card(cursor, card)
await tutor.database.store_price(cursor, today, card) await tutor.database.store_price(cursor, today, card)
except: except Exception as e:
print(f"Skipping entry {card_json}") print(f"Skipping entry {card_json}: {e}")
bar.update(read) bar.update(read)
print("Updating oracle card data & indexes") print("Updating oracle card data & indexes")
await cursor.execute( await cursor.execute(

View file

@ -36,6 +36,7 @@ async def load(
for row in reader: for row in reader:
is_foil = "Foil" in row and row["Foil"].lower() == "foil" is_foil = "Foil" in row and row["Foil"].lower() == "foil"
quantity = int(row.get("Quantity", row.get("Count", 1))) quantity = int(row.get("Quantity", row.get("Count", 1)))
external_id = row.get("Delver Local ID")
if "Creation Date" in row: if "Creation Date" in row:
created_date = arrow.get( created_date = arrow.get(
row["Creation Date"].replace("_", " ") row["Creation Date"].replace("_", " ")
@ -68,6 +69,7 @@ async def load(
language=row["Language"] or "English", language=row["Language"] or "English",
collection=row.get("List name") or "Default", collection=row.get("List name") or "Default",
created_date=created_date, created_date=created_date,
external_id=external_id,
) )
logging.info((quantity, card)) logging.info((quantity, card))
for i in range(quantity): for i in range(quantity):

View file

@ -351,8 +351,26 @@ async def store_set(
async def store_copy(db: psycopg.AsyncCursor, copy: tutor.models.CardCopy) -> None: async def store_copy(db: psycopg.AsyncCursor, copy: tutor.models.CardCopy) -> None:
await db.execute( await db.execute(
""" """
INSERT INTO copies ("scryfall_id", "isFoil", "collection", "condition", "created_date") INSERT INTO copies ( "scryfall_id"
VALUES (%(scryfall_id)s, %(foil)s, %(collection)s, %(condition)s, %(created_date)s) , "isFoil"
, "collection"
, "condition"
, "created_date"
, "external_id"
)
VALUES ( %(scryfall_id)s
, %(foil)s
, %(collection)s
, %(condition)s
, %(created_date)s
, %(external_id)s
)
ON CONFLICT ("external_id") DO UPDATE
SET "scryfall_id" = %(scryfall_id)s
, "isFoil" = %(foil)s
, "collection" = %(collection)s
, "condition" = %(condition)s
, "created_date" = %(created_date)s
""", """,
{ {
"scryfall_id": str(copy.card.scryfall_id), "scryfall_id": str(copy.card.scryfall_id),
@ -360,6 +378,7 @@ async def store_copy(db: psycopg.AsyncCursor, copy: tutor.models.CardCopy) -> No
"collection": copy.collection, "collection": copy.collection,
"condition": copy.condition, "condition": copy.condition,
"created_date": str(copy.created_date), "created_date": str(copy.created_date),
"external_id": copy.external_id,
}, },
) )

View file

@ -108,6 +108,7 @@ class CardCopy:
foil: bool foil: bool
language: str = "English" language: str = "English"
collection: str = "Default" collection: str = "Default"
external_id: typing.Optional[str] = None
condition: typing.Optional[str] = None condition: typing.Optional[str] = None
created_date: datetime.datetime = dataclasses.field( created_date: datetime.datetime = dataclasses.field(
default_factory=datetime.datetime.now default_factory=datetime.datetime.now