added default Earthman 108-card tarot deck, 78-card Minchiate Fiorentine deck, admin tests for each; DeckVariant model governs deck toggle; ran new migrations for apps.epic, apps.lyric; seeded DeckVariant migration to ensure Earthman is default deck; added min. tarot url; most new FTs passing
This commit is contained in:
164
src/apps/epic/migrations/0008_seed_tarot_cards.py
Normal file
164
src/apps/epic/migrations/0008_seed_tarot_cards.py
Normal file
@@ -0,0 +1,164 @@
|
||||
from django.db import migrations
|
||||
|
||||
MAJOR_ARCANA = [
|
||||
(0, "The Fool", "the-fool", ["beginnings", "spontaneity", "freedom"], ["recklessness", "naivety", "risk"]),
|
||||
(1, "The Magician", "the-magician", ["willpower", "skill", "resourcefulness"], ["manipulation", "untapped potential", "deceit"]),
|
||||
(2, "The High Priestess", "the-high-priestess", ["intuition", "mystery", "inner knowledge"], ["secrets", "disconnection", "withdrawal"]),
|
||||
(3, "The Empress", "the-empress", ["fertility", "abundance", "nurturing"], ["dependence", "smothering", "creative block"]),
|
||||
(4, "The Emperor", "the-emperor", ["authority", "structure", "stability"], ["rigidity", "domination", "inflexibility"]),
|
||||
(5, "The Hierophant", "the-hierophant", ["tradition", "conformity", "institutions"], ["rebellion", "unconventionality", "challenge"]),
|
||||
(6, "The Lovers", "the-lovers", ["love", "harmony", "choice"], ["disharmony", "imbalance", "misalignment"]),
|
||||
(7, "The Chariot", "the-chariot", ["control", "willpower", "victory"], ["aggression", "lack of direction", "defeat"]),
|
||||
(8, "Strength", "strength", ["courage", "patience", "compassion"], ["self-doubt", "weakness", "insecurity"]),
|
||||
(9, "The Hermit", "the-hermit", ["introspection", "guidance", "solitude"], ["isolation", "loneliness", "withdrawal"]),
|
||||
(10, "Wheel of Fortune", "wheel-of-fortune", ["change", "cycles", "fate"], ["bad luck", "resistance", "clinging to control"]),
|
||||
(11, "Justice", "justice", ["fairness", "truth", "cause and effect"], ["injustice", "dishonesty", "avoidance"]),
|
||||
(12, "The Hanged Man", "the-hanged-man", ["pause", "surrender", "new perspective"], ["stalling", "resistance", "indecision"]),
|
||||
(13, "Death", "death", ["endings", "transition", "transformation"], ["fear of change", "stagnation", "resistance"]),
|
||||
(14, "Temperance", "temperance", ["balance", "patience", "moderation"], ["imbalance", "excess", "lack of harmony"]),
|
||||
(15, "The Devil", "the-devil", ["bondage", "materialism", "shadow self"], ["detachment", "freedom", "releasing control"]),
|
||||
(16, "The Tower", "the-tower", ["sudden change", "upheaval", "revelation"], ["avoidance", "fear of change", "delaying disaster"]),
|
||||
(17, "The Star", "the-star", ["hope", "renewal", "inspiration"], ["despair", "insecurity", "hopelessness"]),
|
||||
(18, "The Moon", "the-moon", ["illusion", "fear", "the unconscious"], ["confusion", "misinterpretation", "clarity"]),
|
||||
(19, "The Sun", "the-sun", ["positivity", "success", "vitality"], ["negativity", "depression", "sadness"]),
|
||||
(20, "Judgement", "judgement", ["reflection", "reckoning", "absolution"], ["self-doubt", "lack of self-awareness", "loathing"]),
|
||||
(21, "The World", "the-world", ["completion", "integration", "accomplishment"], ["incompletion", "no closure", "shortcuts"]),
|
||||
]
|
||||
|
||||
MINOR_SUITS = [
|
||||
("WANDS", "wands"),
|
||||
("CUPS", "cups"),
|
||||
("SWORDS", "swords"),
|
||||
("PENTACLES", "pentacles"),
|
||||
]
|
||||
|
||||
MINOR_NAMES = [
|
||||
(1, "Ace", "ace"),
|
||||
(2, "Two", "two"),
|
||||
(3, "Three", "three"),
|
||||
(4, "Four", "four"),
|
||||
(5, "Five", "five"),
|
||||
(6, "Six", "six"),
|
||||
(7, "Seven", "seven"),
|
||||
(8, "Eight", "eight"),
|
||||
(9, "Nine", "nine"),
|
||||
(10, "Ten", "ten"),
|
||||
(11, "Page", "page"),
|
||||
(12, "Knight", "knight"),
|
||||
(13, "Queen", "queen"),
|
||||
(14, "King", "king"),
|
||||
]
|
||||
|
||||
# Keywords: [suit][number-1] → (upright_list, reversed_list)
|
||||
MINOR_KEYWORDS = {
|
||||
"WANDS": [
|
||||
(["inspiration", "new venture", "spark"], ["delays", "lack of motivation", "false start"]),
|
||||
(["planning", "progress", "decisions"], ["impatience", "lack of planning", "hesitation"]),
|
||||
(["expansion", "foresight", "enterprise"], ["obstacles", "lack of foresight", "delays"]),
|
||||
(["celebration", "harmony", "homecoming"], ["lack of support", "transience", "home conflicts"]),
|
||||
(["conflict", "competition", "tension"], ["avoiding conflict", "compromise", "truce"]),
|
||||
(["victory", "recognition", "progress"], ["excess pride", "lack of recognition", "fall"]),
|
||||
(["challenge", "courage", "competition"], ["anxiety", "giving up", "overwhelmed"]),
|
||||
(["rapid action", "adventure", "change"], ["haste", "scattered energy", "delays"]),
|
||||
(["resilience", "persistence", "last stand"], ["exhaustion", "giving up", "surrender"]),
|
||||
(["completion", "celebration", "travel"], ["burdens", "oppression", "carrying too much"]),
|
||||
(["exploration", "enthusiasm", "adventure"], ["hasty decisions", "scattered energy", "immaturity"]),
|
||||
(["energy", "passion", "adventure"], ["scattered energy", "frustration", "aggression"]),
|
||||
(["confidence", "independence", "courage"], ["selfishness", "jealousy", "insecurity"]),
|
||||
(["big picture", "leadership", "vision"], ["impulsiveness", "haste", "overconfidence"]),
|
||||
],
|
||||
"CUPS": [
|
||||
(["new feelings", "intuition", "opportunity"], ["blocked creativity", "emptiness", "hesitation"]),
|
||||
(["partnership", "unity", "celebration"], ["imbalance", "broken bonds", "misalignment"]),
|
||||
(["creativity", "community", "abundance"], ["independence", "isolation", "looking inward"]),
|
||||
(["contemplation", "apathy", "reevaluation"], ["withdrawal", "boredom", "seeking motivation"]),
|
||||
(["loss", "grief", "disappointment"], ["acceptance", "moving on", "forgiveness"]),
|
||||
(["nostalgia", "reunion", "joy"], ["living in the past", "naivety", "unrealistic"]),
|
||||
(["illusion", "fantasy", "wishful thinking"], ["alignment", "clarity", "sobriety"]),
|
||||
(["disappointment", "abandonment", "walking away"], ["hopelessness", "aimlessness", "stagnation"]),
|
||||
(["contentment", "fulfilment", "satisfaction"], ["inner happiness", "materialism", "indulgence"]),
|
||||
(["divine love", "bliss", "fulfilment"], ["inner happiness", "alignment", "personal values"]),
|
||||
(["sensitivity", "creativity", "intuition"], ["insecurity", "emotional immaturity", "creative blocks"]),
|
||||
(["compassion", "romanticism", "diplomacy"], ["moodiness", "emotional manipulation", "deception"]),
|
||||
(["compassion", "empathy", "nurturing"], ["emotional insecurity", "over-giving", "neglect"]),
|
||||
(["emotional maturity", "diplomacy", "wisdom"], ["manipulation", "moodiness", "coldness"]),
|
||||
],
|
||||
"SWORDS": [
|
||||
(["raw power", "breakthrough", "clarity"], ["confusion", "brutality", "mental chaos"]),
|
||||
(["difficult choices", "stalemate", "truce"], ["indecision", "lies", "confusion"]),
|
||||
(["heartbreak", "sorrow", "grief"], ["recovery", "forgiveness", "moving on"]),
|
||||
(["rest", "restoration", "retreat"], ["restlessness", "burnout", "illness"]),
|
||||
(["defeat", "change", "transition"], ["resistance to change", "inability to move"]),
|
||||
(["victory", "success", "ambition"], ["an eye for an eye", "dishonour", "manipulation"]),
|
||||
(["deception", "trickery", "tactics"], ["imposter syndrome", "coming clean", "rethinking"]),
|
||||
(["restriction", "isolation", "imprisonment"], ["self-limiting beliefs", "inner critic", "opening up"]),
|
||||
(["anxiety", "worry", "fear"], ["recovery from anxiety", "inner turmoil", "secrets"]),
|
||||
(["ruin", "painful endings", "loss"], ["recovery", "regeneration", "resisting an end"]),
|
||||
(["new ideas", "mental agility", "curiosity"], ["manipulation", "all talk no action", "ruthlessness"]),
|
||||
(["action", "impulsiveness", "ambition"], ["no direction", "disregard for consequences"]),
|
||||
(["clarity", "directness", "structure"], ["coldness", "cruelty", "manipulation"]),
|
||||
(["mental clarity", "truth", "authority"], ["abuse of power", "manipulation", "coldness"]),
|
||||
],
|
||||
"PENTACLES": [
|
||||
(["opportunity", "new venture", "manifestation"], ["lost opportunity", "lack of planning", "scarcity"]),
|
||||
(["juggling resources", "flexibility", "fun"], ["imbalance", "disorganisation", "overwhelm"]),
|
||||
(["teamwork", "building", "apprenticeship"], ["lack of teamwork", "disharmony", "misalignment"]),
|
||||
(["stability", "security", "conservation"], ["greed", "stinginess", "possessiveness"]),
|
||||
(["isolation", "insecurity", "worry"], ["recovery from loss", "overcoming hardship"]),
|
||||
(["generosity", "charity", "community"], ["strings attached", "power dynamics", "inequality"]),
|
||||
(["hard work", "perseverance", "diligence"], ["lack of reward", "laziness", "low quality"]),
|
||||
(["apprenticeship", "education", "skill"], ["perfectionism", "misdirected activity", "misuse"]),
|
||||
(["abundance", "luxury", "self-sufficiency"], ["overindulgence", "superficiality", "materialism"]),
|
||||
(["wealth", "financial security", "achievement"], ["financial failure", "greed", "lost success"]),
|
||||
(["ambition", "diligence", "management"], ["underhandedness", "greediness", "unethical"]),
|
||||
(["hard work", "productivity", "routine"], ["laziness", "obsession with work", "burnout"]),
|
||||
(["nurturing", "practical", "abundance"], ["financial dependence", "smothering", "insecurity"]),
|
||||
(["abundance", "prosperity", "security"], ["greed", "indulgence", "sensual obsession"]),
|
||||
],
|
||||
}
|
||||
|
||||
|
||||
def seed_tarot_cards(apps, schema_editor):
|
||||
TarotCard = apps.get_model("epic", "TarotCard")
|
||||
|
||||
# Major Arcana
|
||||
for number, name, slug, upright, reversed_ in MAJOR_ARCANA:
|
||||
TarotCard.objects.create(
|
||||
name=name,
|
||||
arcana="MAJOR",
|
||||
suit=None,
|
||||
number=number,
|
||||
slug=slug,
|
||||
keywords_upright=upright,
|
||||
keywords_reversed=reversed_,
|
||||
)
|
||||
|
||||
# Minor Arcana
|
||||
for suit_code, suit_slug in MINOR_SUITS:
|
||||
for number, rank_name, rank_slug in MINOR_NAMES:
|
||||
upright, reversed_ = MINOR_KEYWORDS[suit_code][number - 1]
|
||||
TarotCard.objects.create(
|
||||
name=f"{rank_name} of {suit_code.capitalize()}",
|
||||
arcana="MINOR",
|
||||
suit=suit_code,
|
||||
number=number,
|
||||
slug=f"{rank_slug}-of-{suit_slug}",
|
||||
keywords_upright=upright,
|
||||
keywords_reversed=reversed_,
|
||||
)
|
||||
|
||||
|
||||
def unseed_tarot_cards(apps, schema_editor):
|
||||
TarotCard = apps.get_model("epic", "TarotCard")
|
||||
TarotCard.objects.all().delete()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("epic", "0007_tarotcard_tarotdeck"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(seed_tarot_cards, reverse_code=unseed_tarot_cards),
|
||||
]
|
||||
Reference in New Issue
Block a user