Generate for me case studies to famirierise with my assessment in labour and midwifery

Asking for Preferences
Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Reading File
Reading File
Here are five case studies designed for undergraduate student midwives, covering the full mixed scope you requested. Each follows the short vignette + model answer format.

Labour and Midwifery Assessment - Case Studies


CASE STUDY 1 - Normal/Physiological Labour

Vignette

Amara is a 26-year-old primigravida at 39+2 weeks gestation. She arrives on the labour ward with a 4-hour history of regular contractions every 5 minutes, each lasting 45-60 seconds. She describes the pain as moderate and is managing with breathing techniques. Observations: BP 118/74 mmHg, pulse 88 bpm, temperature 36.8°C, urinalysis normal. On vaginal examination (VE): cervix is 4 cm dilated, 80% effaced, presenting part is cephalic, station -1, membranes intact. Fetal heart rate (FHR) on auscultation is 142 bpm with good variability.

Model Answer

Stage of labour: Amara is in established first stage of labour. Establishment is defined as regular painful contractions with progressive cervical dilation from 4 cm onwards.
Assessment priorities:
  • 4-hourly VEs to assess progress (expectation: approximately 0.5-1 cm/hour in a primigravida)
  • Partogram documentation - plot findings to identify deviation from expected progress
  • FHR auscultation every 15 minutes in first stage; every 5 minutes in second stage (NICE IA guidelines)
  • Maternal observations hourly: BP, pulse, temperature, contraction frequency and duration
  • Urinalysis and fluid balance - encourage oral hydration
  • Emotional support and pain management options - discuss epidural, Entonox, water immersion, TENS
Expected progression:
  • Cervical dilation should progress at a minimum rate; failure to progress over 4 hours in established labour (with adequate contractions) warrants review and possible augmentation
  • Descent of presenting part should accompany dilation; at full dilation (10 cm), active pushing (second stage) begins
Red flags to watch for:
  • Maternal pyrexia >38°C (risk of chorioamnionitis)
  • FHR abnormalities
  • Arrest of labour for >4 hours
  • Meconium-stained liquor on membrane rupture
Sources: Textbook of Family Medicine 9e; Creasy & Resnik's Maternal-Fetal Medicine

CASE STUDY 2 - Postpartum Haemorrhage (PPH)

Vignette

Blessing is a 32-year-old G3P2 who has just delivered a healthy male infant at 38+5 weeks following a 6-hour active labour. The placenta was delivered at 15 minutes postpartum with oxytocin 10 IU IM given as active management of the third stage. The midwife notes the uterus is soft and displaced to the right, and Blessing has soaked two pads in the past 20 minutes. Estimated blood loss so far is 650 ml. BP has dropped from 120/78 to 98/60 mmHg. Pulse is 108 bpm.

Model Answer

Diagnosis: Primary PPH - blood loss of at least 500 ml within 24 hours of delivery. Blessing has lost 650 ml with haemodynamic compromise (tachycardia, hypotension).
Most likely cause: Uterine atony (>50% of PPH cases). The soft, displaced uterus is the hallmark sign - a well-contracted uterus should feel firm and central.
The "4 Ts" of PPH causes:
  • Tone - uterine atony (most common, >50%)
  • Tissue - retained placenta or membranes
  • Trauma - lacerations, uterine rupture
  • Thrombin - coagulation disorders
Immediate management - follow your unit's PPH algorithm:
  1. Call for help - senior midwife, obstetrician, anaesthetist, haematology
  2. Massage the uterus / bimanual compression to stimulate contraction
  3. IV access x2 large-bore cannulas, take bloods (FBC, coagulation, cross-match 4 units)
  4. IV fluids - warm crystalloid initially, transfuse early if haemodynamic compromise persists
  5. Uterotonics in order:
    • Oxytocin 5 IU slow IV (if not already given)
    • Ergometrine 500 mcg IM (contraindicated in hypertension)
    • Carboprost (Hemabate) 250 mcg IM every 15 mins up to 8 doses
    • Misoprostol 800-1000 mcg PR/SL
  6. Inspect for trauma - examine cervix, vagina, and perineum for lacerations
  7. Bladder catheterisation - a full bladder inhibits uterine contraction
  8. If refractory: intrauterine balloon tamponade (success rates up to 91%), surgical compression sutures (e.g., B-Lynch), uterine artery embolisation, or, as a last resort, hysterectomy
Documentation and fluid balance must be continuous and accurate.
Source: Grainger & Allison's Diagnostic Radiology

CASE STUDY 3 - Shoulder Dystocia

Vignette

Fatou is a 30-year-old G2P1 with a BMI of 36, known gestational diabetes managed with diet alone, at 40+1 weeks. After a prolonged second stage of 2 hours and 10 minutes, the fetal head is delivered with moderate traction. The midwife notices the head retracts against the perineum (the "turtle sign") and routine axial traction fails to deliver the anterior shoulder. The FHR drops to 85 bpm. The room clock reads 14:32.

Model Answer

Diagnosis: Shoulder dystocia - impaction of the anterior fetal shoulder behind the maternal pubic symphysis following delivery of the head. This is an obstetric emergency.
Risk factors present in Fatou:
  • Gestational diabetes (associated with macrosomia)
  • Maternal obesity (BMI 36)
  • Prolonged second stage
  • Note: ~50% of all shoulder dystocias occur in normal-weight fetuses - anticipation is always required
Call the time out loud and document the exact time of diagnosis (14:32) - every minute of cord compression worsens fetal hypoxia.
HELPERR mnemonic (standard emergency sequence):
StepAction
HCall for Help - emergency buzzer, obstetrician, paediatrician/neonatologist, anaesthetist
EEvaluate for Episiotomy - creates room for manoeuvres (does NOT release the bony obstruction itself)
LLegs (McRoberts manoeuvre) - hyperflex maternal thighs onto abdomen; increases inlet diameter, flattens lumbar lordosis
PSuprapubic Pressure - steady downward pressure by assistant to dislodge anterior shoulder
EEnter (internal manoeuvres) - Rubin II (pressure on posterior aspect of anterior shoulder), Woods screw
RRemove the posterior arm - sweep the posterior arm across the chest and deliver
RRoll the patient - Gaskin all-fours manoeuvre (roll to hands and knees)
Critical point: NEVER apply fundal pressure - this worsens impaction.
Fetal complications to anticipate:
  • Brachial plexus injury (Erb palsy - C5/C6 most common; Klumpke palsy - C8/T1)
  • Clavicular fracture
  • Hypoxic neurological injury (if prolonged)
Maternal complications:
  • 4th degree perineal tears (extension of episiotomy)
  • Haemorrhage from uterine atony
  • Uterine rupture (rare)
Post-event debrief, documentation, and neonatal review are mandatory.
Source: Textbook of Family Medicine 9e; Creasy & Resnik's Maternal-Fetal Medicine

CASE STUDY 4 - Pre-eclampsia and Eclampsia

Vignette

Yemi is a 34-year-old nulliparous woman at 36+4 weeks gestation. She attends the antenatal day unit reporting a 2-day history of frontal headache and "seeing spots." Observations: BP 162/108 mmHg (confirmed on repeat 20 minutes later), pulse 92 bpm, SpO2 99%. Urinalysis shows 3+ protein. She has 2+ pitting oedema to her knees. Reflexes are brisk with 2 beats of ankle clonus. Blood results: platelets 91 x 10⁹/L, ALT 98 U/L, creatinine 115 μmol/L.

Model Answer

Diagnosis: Severe pre-eclampsia with features of imminent eclampsia.
Criteria for severe pre-eclampsia are met:
  • BP ≥160/110 mmHg on two occasions
  • Significant proteinuria (3+)
  • Symptoms: headache, visual disturbance
  • End-organ involvement: thrombocytopenia, elevated liver enzymes, elevated creatinine
HELLP syndrome must be considered: Haemolysis, Elevated Liver enzymes, Low Platelets - her platelet count of 91 and ALT 98 suggest possible early HELLP.
Immediate management:
  1. Admit to delivery suite / high dependency area
  2. Senior obstetrician review urgently - delivery is the definitive treatment
  3. Airway/Breathing/Circulation assessment
  4. IV access, bloods - FBC, U&E, LFTs, coagulation, cross-match
  5. Antihypertensive therapy (threshold: systolic >160 mmHg):
    • Labetalol IV 20 mg bolus (or oral labetalol/nifedipine)
    • Hydralazine IV 10 mg is an alternative
    • Goal: keep systolic 140-155 mmHg, diastolic 90-105 mmHg (avoid rapid drops)
  6. Magnesium sulfate (MgSO4):
    • Loading dose: 4 g IV over 5-10 minutes
    • Maintenance: 1-2 g/hour IV infusion
    • Primary purpose: eclampsia prevention AND treatment
    • Monitor for toxicity: respiratory rate (must be ≥12/min), urine output (≥25 ml/hour), deep tendon reflexes (loss = early toxicity sign)
    • Antidote for MgSO4 toxicity: calcium gluconate 1 g IV
  7. Continuous CTG - fetal wellbeing assessment
  8. Fluid restriction - to avoid pulmonary oedema (typically 80 ml/hour)
  9. Corticosteroids if delivery anticipated <37 weeks (betamethasone 12 mg IM x2)
  10. Plan for delivery - timing and mode depends on cervical favourability and fetal condition
If eclampsia occurs (seizure):
  • Left lateral tilt, protect airway, call for help
  • MgSO4 2 g IV over 5 minutes as treatment dose (if already on maintenance)
  • Diazepam only if MgSO4 unavailable
Source: ROSEN's Emergency Medicine; Robbins & Kumar Basic Pathology

CASE STUDY 5 - Fetal Heart Rate (FHR) / CTG Interpretation

Vignette

Kolade is the partner of 38-year-old Grace, G1P0, at 41+0 weeks, who is admitted in active labour with artificial rupture of membranes performed 30 minutes ago. Clear liquor draining. The midwife commences electronic fetal monitoring (EFM/CTG). After 40 minutes, the CTG shows: baseline FHR 155 bpm, variability 3 bpm, two decelerations in the past 20 minutes that drop to 110 bpm and last 90 seconds each, returning slowly to baseline after each contraction ends. There are no accelerations.

Model Answer

CTG Feature Assessment (using the NICHD/RCOG framework):
FeatureFindingClassification
Baseline rate155 bpmNormal (110-160 bpm)
Variability3 bpmAbnormal (<5 bpm for >40 min)
AccelerationsAbsentEquivocal (concerning in context)
DecelerationsLate/prolonged, slow returnAbnormal
Type of deceleration: The deceleration begins after the peak of the contraction and has a slow return to baseline - this pattern is consistent with late decelerations, which indicate uteroplacental insufficiency and possible fetal hypoxaemia.
Overall CTG classification: PATHOLOGICAL - two or more abnormal features.
Immediate actions:
  1. Inform the responsible obstetrician/senior midwife immediately
  2. Reposition the woman - left lateral position to relieve aortocaval compression
  3. IV access if not already established
  4. Check maternal BP and pulse - hypotension worsens uteroplacental flow
  5. Stop oxytocin if running - reduces uterine hyperstimulation
  6. Consider FBS (fetal blood sampling) - to assess fetal pH/lactate and guide decision-making
    • pH >7.25: reassuring, continue labour with repeat FBS in 1 hour
    • pH 7.21-7.24: borderline, repeat in 30 minutes
    • pH <7.20: action required - expedite delivery
  7. Prepare for possible expedited delivery - category 1 or 2 caesarean section, or instrumental birth depending on stage of labour and clinical picture
  8. NST (non-stress test) principle: A reactive trace requires ≥2 accelerations of ≥15 bpm lasting ≥15 seconds in a 20-30 minute window. This CTG is non-reactive.
Key teaching point: The combination of reduced variability + late decelerations + absent accelerations significantly increases the risk of a low 5-minute Apgar score and adverse neonatal outcome. The clinical picture (post-term, prolonged labour) adds further context. This CTG mandates escalation and a clear plan for delivery if no improvement.
Source: Creasy & Resnik's Maternal-Fetal Medicine, Principles and Practice

Quick Reference Summary Table

CaseTopicKey Action
1Normal labour - established first stagePartogram, 4-hourly VE, FHR auscultation every 15 min
2Primary PPH - uterine atonyUterotonic cascade, bimanual massage, IV access, call for help
3Shoulder dystociaHELPERR, document time, McRoberts + suprapubic pressure first
4Severe pre-eclampsiaMgSO4 4 g loading dose, antihypertensives, expedite delivery
5Pathological CTG - late decelerationsReposition, inform obstetrician, FBS, prepare for expedited delivery

These five cases are built directly from authoritative clinical sources (Creasy & Resnik's Maternal-Fetal Medicine; Textbook of Family Medicine 9e; ROSEN's Emergency Medicine; Grainger & Allison's Diagnostic Radiology). As you work through them, try covering the model answers and writing your own response first before checking - that active recall approach is far more effective for assessments than passive reading.

Generate a download bleed pdf for all the above case studies with all the above case scenarios and other additionalsl ones to prepare for my assessment

Reading File
Running Command

mkdir -p /tmp/workspace/midwifery-casestudies && ls /tmp/workspace/

Writing File

~/midwifery-casestudies/generate_pdf.py


from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfgen import canvas

OUTPUT = "/tmp/workspace/midwifery-casestudies/Midwifery_Labour_Assessment_Case_Studies.pdf"

# ── Colour palette ──────────────────────────────────────────────────────────
DARK_TEAL   = colors.HexColor("#005F73")
MID_TEAL    = colors.HexColor("#0A9396")
LIGHT_TEAL  = colors.HexColor("#94D2BD")
PALE_BLUE   = colors.HexColor("#E9F6F7")
ACCENT_AMBER= colors.HexColor("#EE9B00")
ALERT_RED   = colors.HexColor("#AE2012")
SOFT_GREY   = colors.HexColor("#F4F4F4")
WHITE       = colors.white
BLACK       = colors.HexColor("#1A1A1A")

PAGE_W, PAGE_H = A4
MARGIN = 2 * cm

# ── Page template with header/footer ────────────────────────────────────────
class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_header_footer(num_pages)
            super().showPage()
        super().save()

    def draw_header_footer(self, page_count):
        w, h = A4
        # Header bar
        self.setFillColor(DARK_TEAL)
        self.rect(0, h - 1.5*cm, w, 1.5*cm, fill=1, stroke=0)
        self.setFillColor(WHITE)
        self.setFont("Helvetica-Bold", 9)
        self.drawString(MARGIN, h - 1.0*cm, "LABOUR & MIDWIFERY  |  Assessment Case Studies")
        self.setFont("Helvetica", 8)
        self.drawRightString(w - MARGIN, h - 1.0*cm, "Student Midwife Resource — July 2026")
        # Footer bar
        self.setFillColor(DARK_TEAL)
        self.rect(0, 0, w, 1.1*cm, fill=1, stroke=0)
        self.setFillColor(WHITE)
        self.setFont("Helvetica", 8)
        self.drawCentredString(w / 2, 0.38*cm,
            f"Page {self._pageNumber} of {page_count}   |   For educational purposes only — always apply local clinical guidelines")


# ── Style sheet ──────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, parent=styles["Normal"], **kw)

sTitle = S("sTitle", fontSize=26, leading=32, textColor=WHITE,
           fontName="Helvetica-Bold", alignment=TA_CENTER)
sSubtitle = S("sSubtitle", fontSize=12, leading=16, textColor=LIGHT_TEAL,
              fontName="Helvetica", alignment=TA_CENTER)
sCaseNum = S("sCaseNum", fontSize=10, leading=13, textColor=ACCENT_AMBER,
             fontName="Helvetica-Bold", spaceAfter=2)
sCaseTitle = S("sCaseTitle", fontSize=15, leading=19, textColor=WHITE,
               fontName="Helvetica-Bold")
sH2 = S("sH2", fontSize=11, leading=14, textColor=DARK_TEAL,
         fontName="Helvetica-Bold", spaceBefore=8, spaceAfter=3)
sBody = S("sBody", fontSize=9.5, leading=14, textColor=BLACK,
          fontName="Helvetica", alignment=TA_JUSTIFY, spaceAfter=4)
sBullet = S("sBullet", fontSize=9.5, leading=13, textColor=BLACK,
            fontName="Helvetica", leftIndent=12, bulletIndent=0, spaceAfter=2)
sAlert = S("sAlert", fontSize=9.5, leading=13, textColor=ALERT_RED,
           fontName="Helvetica-Bold", spaceAfter=3)
sSource = S("sSource", fontSize=8, leading=11, textColor=MID_TEAL,
            fontName="Helvetica-Oblique", spaceAfter=6)
sTOC = S("sTOC", fontSize=10, leading=16, textColor=DARK_TEAL,
         fontName="Helvetica", spaceAfter=2)
sTOCBold = S("sTOCBold", fontSize=10, leading=16, textColor=DARK_TEAL,
             fontName="Helvetica-Bold", spaceAfter=2)


# ── Helper flowables ─────────────────────────────────────────────────────────
def case_header_block(number, topic, scenario_name):
    """Teal banner for each case study header."""
    data = [[
        Paragraph(f"CASE STUDY {number}", sCaseNum),
        ""
    ], [
        Paragraph(topic, sCaseTitle),
        Paragraph(scenario_name, S("sRight", fontSize=10, textColor=LIGHT_TEAL,
                                   fontName="Helvetica-Oblique", alignment=4))
    ]]
    t = Table(data, colWidths=[13*cm, 5.5*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, -1), DARK_TEAL),
        ("TOPPADDING",    (0, 0), (-1, -1), 8),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 8),
        ("LEFTPADDING",   (0, 0), (-1, -1), 10),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 10),
        ("VALIGN", (0, 0), (-1, -1), "MIDDLE"),
        ("SPAN", (0, 0), (-1, 0)),
    ]))
    return t

def section_label(text):
    return Paragraph(text, sH2)

def body(text):
    return Paragraph(text, sBody)

def bullet(text, indent=0):
    prefix = "•  "
    style = S(f"sb{indent}", fontSize=9.5, leading=13, textColor=BLACK,
              fontName="Helvetica", leftIndent=12 + indent * 10,
              bulletIndent=0, spaceAfter=2)
    return Paragraph(prefix + text, style)

def alert(text):
    return Paragraph("⚠  " + text, sAlert)

def source(text):
    return Paragraph(f"Source: {text}", sSource)

def divider():
    return HRFlowable(width="100%", thickness=0.5, color=LIGHT_TEAL, spaceAfter=6, spaceBefore=4)

def info_box(paragraphs, bg=PALE_BLUE, border=MID_TEAL):
    """Wrap a list of Paragraphs in a shaded box."""
    inner = [[p] for p in paragraphs]
    t = Table(inner, colWidths=[18.5*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND", (0, 0), (-1, -1), bg),
        ("BOX",        (0, 0), (-1, -1), 1, border),
        ("TOPPADDING",    (0, 0), (-1, -1), 5),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
        ("LEFTPADDING",   (0, 0), (-1, -1), 10),
        ("RIGHTPADDING",  (0, 0), (-1, -1), 10),
    ]))
    return t

def make_table(headers, rows, col_widths=None):
    data = [[Paragraph(h, S("th", fontSize=9, fontName="Helvetica-Bold",
                             textColor=WHITE)) for h in headers]]
    for row in rows:
        data.append([Paragraph(str(c), S("td", fontSize=9, fontName="Helvetica",
                                          textColor=BLACK, leading=12)) for c in row])
    if col_widths is None:
        col_widths = [18.5*cm / len(headers)] * len(headers)
    t = Table(data, colWidths=col_widths)
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0, 0), (-1, 0),  DARK_TEAL),
        ("BACKGROUND",    (0, 1), (-1, -1), SOFT_GREY),
        ("ROWBACKGROUNDS",(0, 1), (-1, -1), [WHITE, SOFT_GREY]),
        ("GRID",          (0, 0), (-1, -1), 0.4, LIGHT_TEAL),
        ("TOPPADDING",    (0, 0), (-1, -1), 5),
        ("BOTTOMPADDING", (0, 0), (-1, -1), 5),
        ("LEFTPADDING",   (0, 0), (-1, -1), 6),
        ("VALIGN",        (0, 0), (-1, -1), "TOP"),
    ]))
    return t

# ════════════════════════════════════════════════════════════════════════════
#  BUILD CONTENT
# ════════════════════════════════════════════════════════════════════════════
story = []

# ── COVER PAGE ───────────────────────────────────────────────────────────────
# Big cover box
cover_data = [[
    Paragraph("Labour &amp; Midwifery", sTitle),
], [
    Paragraph("Assessment Case Studies", sTitle),
], [
    Spacer(1, 0.3*cm)
], [
    Paragraph("10 Clinical Scenarios for Undergraduate Student Midwives", sSubtitle),
], [
    Spacer(1, 0.2*cm)
], [
    Paragraph("Covering: Normal Labour · PPH · Shoulder Dystocia · Pre-eclampsia/Eclampsia<br/>"
              "CTG Interpretation · Cord Prolapse · Breech Presentation · Placenta Praevia<br/>"
              "Uterine Rupture · Perineal Trauma &amp; Repair", sSubtitle),
]]
cover_t = Table(cover_data, colWidths=[18.5*cm])
cover_t.setStyle(TableStyle([
    ("BACKGROUND",    (0, 0), (-1, -1), DARK_TEAL),
    ("TOPPADDING",    (0, 0), (-1, -1), 14),
    ("BOTTOMPADDING", (0, 0), (-1, -1), 10),
    ("LEFTPADDING",   (0, 0), (-1, -1), 20),
    ("RIGHTPADDING",  (0, 0), (-1, -1), 20),
    ("ROUNDEDCORNERS",(0, 0), (-1, -1), [8, 8, 8, 8]),
]))
story.append(Spacer(1, 2.5*cm))
story.append(cover_t)
story.append(Spacer(1, 1.2*cm))

# Amber accent strip
accent = Table([[Paragraph(
    "Structured as: Clinical Vignette → Assessment Questions → Model Answer",
    S("ac", fontSize=10, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER))
]], colWidths=[18.5*cm])
accent.setStyle(TableStyle([
    ("BACKGROUND", (0,0),(-1,-1), ACCENT_AMBER),
    ("TOPPADDING", (0,0),(-1,-1), 8),
    ("BOTTOMPADDING", (0,0),(-1,-1), 8),
]))
story.append(accent)
story.append(Spacer(1, 0.8*cm))

story.append(body("These case studies are designed to build clinical reasoning, prioritisation, and safe practice "
                  "skills for undergraduate midwifery assessments. Each scenario reflects real-world presentations "
                  "encountered in labour ward, antenatal, and postnatal settings."))
story.append(Spacer(1, 0.4*cm))
story.append(info_box([
    Paragraph("<b>How to use this resource:</b>", sH2),
    body("1.  Read the clinical vignette carefully."),
    body("2.  Attempt to answer the assessment questions before reading the model answer."),
    body("3.  Review the model answer, noting key priorities, mnemonics, and drug dosages."),
    body("4.  For each case, identify one thing you were unsure of and look it up in your unit guidelines."),
]))
story.append(PageBreak())

# ── TABLE OF CONTENTS ────────────────────────────────────────────────────────
story.append(Paragraph("Contents", S("toch", fontSize=18, fontName="Helvetica-Bold",
                                      textColor=DARK_TEAL, spaceAfter=8)))
story.append(divider())
toc_items = [
    ("1", "Normal / Physiological Labour — Established First Stage", "Amara, 26, G1P0"),
    ("2", "Primary Postpartum Haemorrhage (PPH)", "Blessing, 32, G3P2"),
    ("3", "Shoulder Dystocia", "Fatou, 30, G2P1"),
    ("4", "Severe Pre-eclampsia and Eclampsia", "Yemi, 34, G1P0"),
    ("5", "Pathological CTG / Fetal Heart Rate Monitoring", "Grace, 38, G1P0"),
    ("6", "Cord Prolapse", "Sade, 29, G2P1"),
    ("7", "Breech Presentation in Labour", "Chisom, 27, G1P0"),
    ("8", "Placenta Praevia — Antepartum Haemorrhage", "Nadia, 33, G2P1"),
    ("9", "Uterine Rupture", "Aisha, 35, G3P2"),
    ("10", "Perineal Trauma Classification and Repair", "Miriam, 24, G1P0"),
]
toc_data = [[
    Paragraph(f"<b>{n}.</b>  {title}", sTOCBold),
    Paragraph(scenario, sTOC)
] for n, title, scenario in toc_items]
toc_t = Table(toc_data, colWidths=[13.5*cm, 5*cm])
toc_t.setStyle(TableStyle([
    ("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, SOFT_GREY]),
    ("TOPPADDING",    (0,0),(-1,-1), 7),
    ("BOTTOMPADDING", (0,0),(-1,-1), 7),
    ("LEFTPADDING",   (0,0),(-1,-1), 8),
    ("GRID",          (0,0),(-1,-1), 0.3, LIGHT_TEAL),
    ("VALIGN",        (0,0),(-1,-1), "MIDDLE"),
]))
story.append(toc_t)
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 1 — Normal Labour
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("1", "Normal / Physiological Labour", "Amara · 26 yrs · G1P0 · 39+2 weeks"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Amara is a 26-year-old primigravida at 39+2 weeks gestation. She arrives on the labour ward with a "
         "4-hour history of regular contractions every 5 minutes, each lasting 45–60 seconds. She describes "
         "the pain as moderate and is managing with breathing techniques."),
    body("<b>Observations:</b> BP 118/74 mmHg · Pulse 88 bpm · Temp 36.8°C · Urinalysis normal"),
    body("<b>Vaginal examination:</b> Cervix 4 cm dilated, 80% effaced, cephalic presentation, station −1, "
         "membranes intact. FHR on auscultation 142 bpm with good variability."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("What stage and phase of labour is Amara in? Justify your answer."))
story.append(bullet("Outline your midwifery assessment and monitoring plan for the next 4 hours."))
story.append(bullet("At what point would you escalate concern about progress?"))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(body("<b>Stage of labour:</b> Established first stage — regular painful contractions with cervical "
                  "dilation ≥4 cm. The latent phase ends and established labour begins from 4 cm."))
story.append(body("<b>Assessment and monitoring:</b>"))
story.append(bullet("4-hourly vaginal examinations — expected dilation ≥0.5 cm/hour (primigravida)"))
story.append(bullet("Partogram documentation — plot all findings; deviations trigger timely review"))
story.append(bullet("FHR auscultation every 15 minutes in first stage, every 5 minutes in second stage (NICE IA guidance)"))
story.append(bullet("Hourly maternal observations: BP, pulse, temperature, contractions"))
story.append(bullet("Fluid balance — encourage oral hydration, monitor urine output"))
story.append(bullet("Pain management discussion: Entonox, water immersion, TENS, epidural"))

story.append(body("<b>Escalation criteria:</b>"))
story.append(bullet("No dilation progress over 4 hours in established labour with adequate contractions"))
story.append(bullet("FHR abnormality on auscultation — commence EFM and inform senior"))
story.append(bullet("Maternal pyrexia >38.0°C (risk of chorioamnionitis)"))
story.append(bullet("Meconium-stained liquor on membrane rupture"))
story.append(bullet("Maternal or fetal deterioration at any point"))
story.append(source("Creasy & Resnik's Maternal-Fetal Medicine, Principles and Practice"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 2 — PPH
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("2", "Primary Postpartum Haemorrhage (PPH)", "Blessing · 32 yrs · G3P2"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Blessing is a 32-year-old G3P2 who delivered a healthy male infant at 38+5 weeks. Oxytocin 10 IU IM "
         "was given as active management of the third stage. The placenta was delivered at 15 minutes."),
    body("The midwife notices the uterus is soft and displaced to the right. Blessing has soaked two maternity "
         "pads in 20 minutes. Estimated blood loss: 650 ml."),
    body("<b>Observations:</b> BP 98/60 mmHg (was 120/78) · Pulse 108 bpm · Temp 36.9°C"),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("Define primary PPH and classify the severity here."))
story.append(bullet("List the '4 Ts' of PPH causes. What is the most likely cause in Blessing's case?"))
story.append(bullet("Describe your immediate stepwise management."))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(body("<b>Definition:</b> Primary PPH = blood loss ≥500 ml within 24 hours of delivery. "
                  "Severe PPH = ≥1000 ml. Blessing has 650 ml with haemodynamic compromise — treat as severe."))

story.append(make_table(
    ["Cause (4 Ts)", "Detail", "Blessing's Risk"],
    [
        ["Tone", "Uterine atony — >50% of PPH", "HIGH — soft, boggy uterus displaced to right"],
        ["Tissue", "Retained placenta/membranes", "CHECK — confirm placenta/membranes complete"],
        ["Trauma", "Lacerations, uterine rupture", "Inspect perineum/vagina/cervix"],
        ["Thrombin", "Coagulopathy (e.g. DIC)", "Send coagulation screen"],
    ],
    col_widths=[3.5*cm, 7*cm, 8*cm]
))
story.append(Spacer(1, 0.3*cm))

story.append(body("<b>Immediate stepwise management:</b>"))
story.append(bullet("CALL FOR HELP — senior midwife, obstetrician, anaesthetist, haematology", 0))
story.append(bullet("Position flat, keep warm; uterine massage / bimanual compression", 0))
story.append(bullet("2 x large-bore IV cannulas; bloods: FBC, coagulation, U&E, cross-match 4 units", 0))
story.append(bullet("Warm IV crystalloid 500 ml stat; transfuse early if haemodynamically compromised", 0))
story.append(bullet("Bladder catheterisation — full bladder inhibits uterine contraction", 0))
story.append(body("<b>Uterotonic cascade:</b>"))
story.append(bullet("Oxytocin 5 IU slow IV (if not already given)"))
story.append(bullet("Ergometrine 500 mcg IM (contraindicated in hypertension/cardiac disease)"))
story.append(bullet("Carboprost (Hemabate) 250 mcg IM every 15 minutes — max 8 doses"))
story.append(bullet("Misoprostol 800–1000 mcg PR/sublingually"))
story.append(body("<b>If refractory to uterotonics:</b>"))
story.append(bullet("Intrauterine balloon tamponade (success rates up to 91%)"))
story.append(bullet("Surgical: B-Lynch compression suture, uterine artery ligation"))
story.append(bullet("Interventional radiology: uterine artery embolisation"))
story.append(bullet("Last resort: hysterectomy — to prevent maternal death"))
story.append(alert("NEVER delay calling for help. Continuous accurate documentation and fluid balance are essential."))
story.append(source("Grainger & Allison's Diagnostic Radiology; Creasy & Resnik's Maternal-Fetal Medicine"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 3 — Shoulder Dystocia
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("3", "Shoulder Dystocia", "Fatou · 30 yrs · G2P1 · BMI 36 · GDM"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Fatou is a 30-year-old G2P1 with BMI 36 and diet-controlled gestational diabetes at 40+1 weeks. "
         "After a prolonged second stage of 2 hours 10 minutes, the fetal head delivers. The midwife notices "
         "the head retracting against the perineum (the 'turtle sign') and routine axial traction fails to "
         "deliver the anterior shoulder. The FHR drops to 85 bpm. Room clock reads 14:32."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("Define shoulder dystocia and identify the risk factors present."))
story.append(bullet("State the HELPERR mnemonic and describe each step."))
story.append(bullet("What fetal complications must the neonatal team anticipate?"))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(body("<b>Definition:</b> Impaction of the anterior fetal shoulder behind the maternal pubic symphysis "
                  "following delivery of the head. Incidence: 0.3–1%; rises to 5–7% with macrosomia (>4500 g). "
                  "~50% occur in normal-weight fetuses — always be prepared."))
story.append(body("<b>Risk factors in Fatou:</b> Gestational diabetes, obesity (BMI 36), prolonged second stage."))
story.append(alert("CALL THE TIME ALOUD and document exact time: 14:32. Every minute counts."))
story.append(Spacer(1,0.2*cm))

story.append(make_table(
    ["Step", "Action", "Mechanism"],
    [
        ["H — Help", "Emergency buzzer — obstetrician, paediatrician, anaesthetist", "Rapid expert response"],
        ["E — Episiotomy", "Evaluate need — creates soft tissue room for manoeuvres", "Does NOT release bony obstruction"],
        ["L — Legs", "McRoberts manoeuvre — hyperflex thighs onto abdomen", "Increases inlet diameter, flattens lumbosacral lordosis"],
        ["P — Pressure", "Suprapubic pressure — downward and lateral on anterior shoulder", "Dislodges shoulder from behind pubic symphysis"],
        ["E — Enter", "Rubin II — pressure on posterior aspect of anterior shoulder; Woods screw", "Internal rotation of shoulders"],
        ["R — Remove arm", "Sweep posterior arm across chest and deliver", "Reduces shoulder-to-shoulder diameter"],
        ["R — Roll", "Gaskin all-fours manoeuvre", "Gravity assists posterior shoulder delivery"],
    ],
    col_widths=[2.5*cm, 8.5*cm, 7.5*cm]
))
story.append(Spacer(1,0.2*cm))
story.append(alert("NEVER apply fundal pressure — worsens impaction."))
story.append(body("<b>Fetal complications to anticipate:</b>"))
story.append(bullet("Erb palsy — brachial plexus injury at C5/C6 (most common)"))
story.append(bullet("Klumpke palsy — C8/T1 injury"))
story.append(bullet("Clavicular fracture (may be intentional to assist delivery)"))
story.append(bullet("Hypoxic neurological injury or death if delivery is prolonged"))
story.append(body("<b>Post-event:</b> Full debrief, incident documentation, neonatal review, parent communication."))
story.append(source("Textbook of Family Medicine 9e; Creasy & Resnik's Maternal-Fetal Medicine"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 4 — Pre-eclampsia / Eclampsia
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("4", "Severe Pre-eclampsia and Eclampsia", "Yemi · 34 yrs · G1P0 · 36+4 weeks"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Yemi is a 34-year-old nullipara at 36+4 weeks. She attends the antenatal day unit with a 2-day "
         "history of frontal headache and 'seeing spots.' BP 162/108 mmHg confirmed on two readings 20 "
         "minutes apart. Urinalysis: 3+ protein. 2+ pitting oedema to knees. Reflexes brisk with 2 beats "
         "ankle clonus."),
    body("<b>Bloods:</b> Platelets 91 × 10⁹/L · ALT 98 U/L · Creatinine 115 µmol/L"),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("What is your diagnosis? What criteria confirm severe disease?"))
story.append(bullet("What does HELLP syndrome stand for and does Yemi meet criteria?"))
story.append(bullet("Describe the role and monitoring of magnesium sulfate in this case."))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(body("<b>Diagnosis:</b> Severe pre-eclampsia with features of imminent eclampsia."))
story.append(body("<b>Severe pre-eclampsia criteria met:</b> BP ≥160/110 mmHg on two occasions; significant "
                  "proteinuria; symptoms (headache, visual disturbance); end-organ dysfunction "
                  "(thrombocytopenia, elevated liver enzymes, elevated creatinine)."))
story.append(body("<b>HELLP syndrome:</b> Haemolysis, Elevated Liver enzymes, Low Platelets — "
                  "Yemi has platelets 91 × 10⁹/L and ALT 98 U/L, suggesting early HELLP."))
story.append(Spacer(1, 0.2*cm))

story.append(make_table(
    ["Management Step", "Detail"],
    [
        ["Admit to delivery suite / HDU", "Senior obstetric review urgently; continuous CTG"],
        ["IV access and bloods", "FBC, U&E, LFTs, coagulation, cross-match; urine PCR"],
        ["Antihypertensives (systolic >160)", "Labetalol IV 20 mg bolus OR Hydralazine IV 10 mg; target SBP 140–155 mmHg"],
        ["Magnesium sulfate", "Loading: 4 g IV over 5–10 min; Maintenance: 1–2 g/hour IV"],
        ["Fluid restriction", "~80 ml/hour to prevent pulmonary oedema"],
        ["Corticosteroids", "Betamethasone 12 mg IM × 2 doses (for fetal lung maturity <37 weeks)"],
        ["Plan for delivery", "Definitive treatment — timing and mode based on clinical picture"],
    ],
    col_widths=[5*cm, 13.5*cm]
))
story.append(Spacer(1, 0.2*cm))

story.append(section_label("Magnesium Sulfate Monitoring"))
story.append(make_table(
    ["Parameter", "Minimum Threshold", "Action if breached"],
    [
        ["Respiratory rate", "≥12 breaths/min", "Withhold MgSO4; give antidote"],
        ["Urine output", "≥25 ml/hour (catheterise)", "Withhold MgSO4; senior review"],
        ["Deep tendon reflexes", "Present", "Loss = early sign of toxicity — stop infusion"],
        ["Serum magnesium (if available)", "Therapeutic 2–3.5 mmol/L", "Toxic >5 mmol/L"],
    ],
    col_widths=[5*cm, 5*cm, 8.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(alert("Antidote for MgSO4 toxicity: Calcium gluconate 1 g IV over 10 minutes."))
story.append(body("<b>If eclampsia occurs (seizure):</b> Left lateral tilt, protect airway, O2, call for help, "
                  "MgSO4 2 g IV over 5 minutes as rescue dose (if already on maintenance infusion)."))
story.append(source("ROSEN's Emergency Medicine; Robbins & Kumar Basic Pathology"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 5 — CTG
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("5", "Pathological CTG / Fetal Heart Rate Monitoring", "Grace · 38 yrs · G1P0 · 41+0 weeks"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Grace is a 38-year-old primipara at 41+0 weeks admitted in active labour. ARM performed 30 minutes "
         "ago — clear liquor. EFM commenced."),
    body("<b>CTG at 40 minutes:</b> Baseline FHR 155 bpm · Variability 3 bpm · No accelerations · "
         "Two decelerations in 20 minutes dropping to 110 bpm, lasting 90 seconds each, with slow "
         "return to baseline after contractions."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("Classify each CTG feature and give the overall classification."))
story.append(bullet("What type of deceleration is described and what does it indicate?"))
story.append(bullet("Outline your immediate management."))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(make_table(
    ["CTG Feature", "Finding", "Classification"],
    [
        ["Baseline rate", "155 bpm", "Normal (110–160 bpm)"],
        ["Variability", "3 bpm", "ABNORMAL (<5 bpm for >40 min)"],
        ["Accelerations", "Absent", "Equivocal / concerning in context"],
        ["Decelerations", "Late onset, slow return to baseline", "ABNORMAL — late decelerations"],
    ],
    col_widths=[4*cm, 7*cm, 7.5*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(alert("Overall classification: PATHOLOGICAL — two or more abnormal features. Act immediately."))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Deceleration type:</b> Late decelerations — begin after peak of contraction, slow return "
                  "to baseline. Indicate uteroplacental insufficiency and possible fetal hypoxaemia/acidosis."))
story.append(Spacer(1, 0.2*cm))
story.append(body("<b>Immediate actions:</b>"))
story.append(bullet("Inform responsible obstetrician and senior midwife IMMEDIATELY"))
story.append(bullet("Reposition woman — left lateral to relieve aortocaval compression"))
story.append(bullet("Establish IV access; check maternal BP and pulse"))
story.append(bullet("Discontinue oxytocin if running (reduces uterine hyperstimulation)"))
story.append(bullet("Consider fetal blood sampling (FBS) to assess pH/lactate:"))
story.append(bullet("pH >7.25 — reassuring, continue, repeat FBS in 1 hour", 1))
story.append(bullet("pH 7.21–7.24 — borderline, repeat in 30 minutes", 1))
story.append(bullet("pH <7.20 — expedite delivery immediately", 1))
story.append(bullet("Prepare for possible category 1/2 caesarean section or instrumental birth"))
story.append(source("Creasy & Resnik's Maternal-Fetal Medicine, Principles and Practice"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 6 — Cord Prolapse
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("6", "Cord Prolapse", "Sade · 29 yrs · G2P1 · 38+3 weeks"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Sade is a 29-year-old G2P1 at 38+3 weeks with a known high fetal head (−3 station). The midwife "
         "performs an ARM to accelerate slow progress. On withdrawal of the amniotic hook, the midwife "
         "palpates a pulsating loop of cord at the introitus. The FHR immediately decelerates to 70 bpm "
         "on the CTG."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("What are the immediate priorities in the first 60 seconds?"))
story.append(bullet("Describe the physical position(s) used and their physiological rationale."))
story.append(bullet("What is the definitive management and who must be called?"))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(alert("This is an acute obstetric emergency. The goal is to relieve cord compression until delivery."))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Immediate priorities (first 60 seconds):</b>"))
story.append(bullet("CALL FOR HELP — emergency buzzer, obstetrician, theatre team, neonatologist"))
story.append(bullet("DO NOT attempt to replace the cord — handling causes vasospasm"))
story.append(bullet("If cord is outside vagina: cover with warm saline-soaked gauze to prevent drying/vasospasm"))
story.append(bullet("Manually elevate presenting part off the cord — keep hand in vagina until delivery"))
story.append(bullet("Initiate maternal positioning to reduce cord compression:"))
story.append(bullet("All-fours (knee-chest) position — gravity lifts presenting part off cord", 1))
story.append(bullet("Exaggerated Sims' / left lateral with hips elevated", 1))
story.append(bullet("Trendelenburg (if other positions not possible)", 1))
story.append(bullet("Bladder filling with 500 ml saline via catheter — elevates presenting part"))
story.append(bullet("O2 15 L/min via non-rebreathe mask"))
story.append(bullet("Continuous CTG — aim FHR to recover above 100 bpm"))

story.append(body("<b>Definitive management:</b>"))
story.append(bullet("Category 1 emergency caesarean section — decision-to-delivery time <30 minutes"))
story.append(bullet("If cervix fully dilated and head accessible: instrumental delivery may be faster"))
story.append(bullet("Neonatal resuscitation team must be present at delivery"))
story.append(body("<b>Documentation:</b> Time of diagnosis, all actions taken, and exact times — "
                  "cord prolapse audits are mandatory."))
story.append(source("RCOG Green-top Guideline No. 50 — Umbilical Cord Prolapse; Roberts & Hedges' "
                    "Clinical Procedures in Emergency Medicine"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 7 — Breech Presentation
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("7", "Breech Presentation in Labour", "Chisom · 27 yrs · G1P0 · 37+5 weeks"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Chisom is a 27-year-old primipara at 37+5 weeks. She declined external cephalic version (ECV) "
         "at 36 weeks. She presents in established labour with regular contractions and is 6 cm dilated. "
         "Ultrasound confirms a frank breech (hips flexed, knees extended). She is keen to attempt vaginal "
         "breech birth if safe. The responsible consultant has been informed."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("What are the types of breech presentation? Which does Chisom have?"))
story.append(bullet("What maternal and fetal criteria must be met for a safe vaginal breech birth?"))
story.append(bullet("What is the 'hands-off' principle and why is it used?"))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(make_table(
    ["Breech Type", "Description", "Vaginal Birth Suitability"],
    [
        ["Frank (extended) breech", "Hips flexed, knees extended — buttocks presenting", "Most favourable — Chisom's presentation"],
        ["Complete (flexed) breech", "Hips and knees both flexed — feet alongside buttocks", "Possible in experienced hands"],
        ["Footling / incomplete breech", "One or both feet presenting", "High cord prolapse risk — usually CS"],
    ],
    col_widths=[4.5*cm, 8*cm, 6*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(body("<b>Criteria for vaginal breech birth:</b>"))
story.append(bullet("Frank or complete breech only"))
story.append(bullet("Estimated fetal weight 2500–3800 g"))
story.append(bullet("No evidence of fetal compromise or CPD"))
story.append(bullet("Adequate pelvis (no known pelvic abnormality)"))
story.append(bullet("Experienced practitioner/obstetrician present throughout"))
story.append(bullet("Continuous EFM in labour; senior paediatrician at delivery"))
story.append(bullet("Theatre immediately available for emergency CS"))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Hands-off (Burns-Marshall / Løvset) principle:</b> "
                  "Allow the body to deliver spontaneously by maternal effort and gravity as far as the "
                  "umbilicus — do not pull. Traction stimulates extension of the fetal arms and neck, "
                  "worsening dystocia. The head delivers last; the Mauriceau-Smellie-Veit manoeuvre "
                  "controls head flexion and descent. Intervention only if progress stalls."))
story.append(alert("The aftercoming head is the largest diameter and must be carefully controlled to "
                   "prevent rapid, uncontrolled delivery causing tentorial tears."))
story.append(source("Creasy & Resnik's Maternal-Fetal Medicine; RCOG Green-top Guideline No. 20b"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 8 — Placenta Praevia / APH
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("8", "Placenta Praevia — Antepartum Haemorrhage", "Nadia · 33 yrs · G2P1 · 32+1 weeks"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Nadia is a 33-year-old G2P1 with one previous lower segment caesarean section (LSCS). She presents "
         "at 32+1 weeks with a sudden onset of painless, bright red vaginal bleeding. She has passed "
         "approximately 300 ml. She reports no contractions. Her 20-week scan documented a low-lying "
         "anterior placenta."),
    body("<b>Observations:</b> BP 102/64 mmHg · Pulse 114 bpm · Temp 36.7°C · SpO2 97%"),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("What is the most likely diagnosis and why?"))
story.append(bullet("Why is a vaginal examination absolutely contraindicated in this scenario?"))
story.append(bullet("Outline initial stabilisation and investigations required."))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(body("<b>Diagnosis:</b> Major placenta praevia causing antepartum haemorrhage (APH). "
                  "Classic triad: painless bright red bleeding + previous LSCS + known low-lying placenta."))
story.append(body("<b>Grades of placenta praevia:</b>"))
story.append(bullet("Grade I — lower segment but not reaching os"))
story.append(bullet("Grade II — reaches internal os"))
story.append(bullet("Grade III — partially covers os"))
story.append(bullet("Grade IV (major) — completely covers os — mandates caesarean section"))
story.append(Spacer(1, 0.1*cm))
story.append(alert("DO NOT perform a vaginal examination — digital or speculum examination can precipitate "
                   "catastrophic haemorrhage by disrupting the placenta overlying the os."))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Initial management:</b>"))
story.append(bullet("CALL FOR HELP — senior obstetrician, anaesthetist, haematology, NICU"))
story.append(bullet("Left lateral tilt; high-flow O2 15 L/min non-rebreathe mask"))
story.append(bullet("2 x large-bore IV cannulas; bloods: FBC, group & save (cross-match 4 units), clotting, U&E"))
story.append(bullet("IV fluid resuscitation — warm crystalloid; FFP and platelets as guided by bloods"))
story.append(bullet("Anti-D immunoglobulin if Rh-negative (250 IU if <20 weeks; 500 IU if ≥20 weeks)"))
story.append(bullet("Corticosteroids: Betamethasone 12 mg IM × 2 (fetal lung maturity at 32 weeks)"))
story.append(bullet("Continuous CTG for fetal wellbeing assessment"))
story.append(bullet("Ultrasound to confirm placental location — NEVER VE before imaging"))
story.append(bullet("Placenta accreta spectrum must be considered: previous LSCS + anterior praevia = "
                    "high-risk combination — MRI may be needed"))
story.append(source("Grainger & Allison's Diagnostic Radiology; RCOG Green-top Guideline No. 27a"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 9 — Uterine Rupture
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("9", "Uterine Rupture", "Aisha · 35 yrs · G3P2 · 39+0 weeks · Previous CS"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Aisha is a 35-year-old G3P2 at 39+0 weeks undergoing a trial of labour after two previous "
         "caesarean sections (TOLAC). She is 7 cm dilated on oxytocin augmentation. Over the past "
         "15 minutes she reports severe, constant lower abdominal pain (not contraction-related), with "
         "sudden cessation of contractions. The CTG shows prolonged fetal bradycardia to 65 bpm."),
    body("<b>Observations:</b> BP 90/55 mmHg (was 122/80) · Pulse 128 bpm · Tender over scar site · "
         "Haematuria visible in catheter bag."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("What is the diagnosis and what warning signs preceded it?"))
story.append(bullet("What are the risk factors for uterine rupture in Aisha's case?"))
story.append(bullet("Describe the emergency management."))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(body("<b>Diagnosis:</b> Uterine rupture — a full-thickness tear of the uterine wall with "
                  "expulsion or partial expulsion of fetal parts into the abdominal cavity."))
story.append(body("<b>Classical signs and symptoms:</b>"))
story.append(bullet("Sudden severe constant abdominal pain (different from labour contractions)"))
story.append(bullet("Cessation of uterine contractions (uterus can no longer contract)"))
story.append(bullet("Fetal bradycardia / abnormal CTG — sudden and severe"))
story.append(bullet("Haematuria (bladder adherent to lower segment)"))
story.append(bullet("Maternal haemodynamic collapse — hypotension, tachycardia"))
story.append(bullet("Loss of fetal station on VE — fetus may have retracted"))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Risk factors:</b> Two previous LSCS (highest risk factor); oxytocin augmentation "
                  "in a scarred uterus; grand multiparity; uterine hyperstimulation."))
story.append(Spacer(1, 0.1*cm))
story.append(alert("Uterine rupture carries up to 6% maternal mortality and >50% perinatal mortality "
                   "without immediate intervention."))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Emergency management:</b>"))
story.append(bullet("Immediate call for help — crash team (obstetric consultant, anaesthetist, theatre, "
                    "neonatologist, haematology)"))
story.append(bullet("Category 1 emergency laparotomy — aim for delivery within 15–20 minutes"))
story.append(bullet("Massive haemorrhage protocol — 2 x IV access, bloods, cross-match 6+ units, "
                    "FFP, platelets, cryoprecipitate"))
story.append(bullet("Repair of rupture (primary repair) may be possible; hysterectomy if unrepairable"))
story.append(bullet("Neonatal resuscitation team at delivery"))
story.append(bullet("ITU admission post-operatively for mother"))
story.append(source("Miller's Anesthesia 10e; Tintinalli's Emergency Medicine; Creasy & Resnik's MFM"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 10 — Perineal Trauma
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header_block("10", "Perineal Trauma Classification and Repair", "Miriam · 24 yrs · G1P0 · Instrumental birth"))
story.append(Spacer(1, 0.3*cm))

story.append(section_label("Clinical Vignette"))
story.append(info_box([
    body("Miriam is a 24-year-old primipara who has just delivered via ventouse (vacuum) extraction "
         "after a prolonged second stage. The paediatrician confirms the neonate is in good condition. "
         "On perineal assessment, the midwife identifies a perineal laceration extending from the "
         "vaginal fourchette through the perineal muscles and into the external anal sphincter, with "
         "the internal anal sphincter intact."),
]))
story.append(Spacer(1, 0.2*cm))
story.append(section_label("Assessment Questions"))
story.append(bullet("Classify this laceration using the RCOG classification."))
story.append(bullet("Who should repair this injury and where?"))
story.append(bullet("Outline the immediate post-repair care and red flags to monitor."))
story.append(Spacer(1, 0.3*cm))
story.append(section_label("Model Answer"))

story.append(make_table(
    ["Degree", "Structures Involved", "Miriam's Case?"],
    [
        ["1st degree", "Fourchette/skin only — no muscle", "No"],
        ["2nd degree", "Skin + perineal muscles — sphincters intact", "No"],
        ["3a (OASI)", "External anal sphincter (EAS) <50% torn", "POSSIBLE — EAS involved"],
        ["3b (OASI)", "External anal sphincter (EAS) >50% torn", "Described in vignette"],
        ["3c (OASI)", "Both EAS and internal anal sphincter (IAS) torn", "IAS intact — so 3b"],
        ["4th degree", "EAS + IAS + rectal mucosa", "No"],
    ],
    col_widths=[2.5*cm, 9*cm, 7*cm]
))
story.append(Spacer(1, 0.2*cm))
story.append(body("<b>Classification for Miriam: 3b OASI (Obstetric Anal Sphincter Injury)</b> — "
                  ">50% of external anal sphincter torn, internal sphincter intact."))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Repair:</b> Repair must be carried out in theatre by an experienced obstetrician "
                  "under regional or general anaesthesia, with good lighting and assistance. "
                  "End-to-end or overlap technique for EAS repair. Absorbable sutures (PDS or Vicryl)."))
story.append(Spacer(1, 0.1*cm))
story.append(body("<b>Post-repair care:</b>"))
story.append(bullet("Laxatives for 10 days (e.g., lactulose + Fybogel) — prevent straining"))
story.append(bullet("Broad-spectrum antibiotics (e.g., co-amoxiclav) to prevent wound infection"))
story.append(bullet("Analgesia: paracetamol ± NSAIDs (avoid constipating opioids if possible)"))
story.append(bullet("Pelvic floor physiotherapy referral"))
story.append(bullet("Follow-up at 6–12 weeks — anorectal physiology assessment if symptoms persist"))
story.append(body("<b>Red flags post-repair:</b>"))
story.append(bullet("Wound dehiscence or haematoma"))
story.append(bullet("Faecal incontinence or flatus incontinence"))
story.append(bullet("Signs of infection: fever, offensive discharge, increasing pain"))
story.append(bullet("Urinary retention or difficulty passing urine"))
story.append(source("RCOG Green-top Guideline No. 29 — OASI; Swanson's Family Medicine Review"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  QUICK REFERENCE SUMMARY TABLE
# ════════════════════════════════════════════════════════════════════════════
story.append(Paragraph("Quick Reference Summary", S("qrs", fontSize=16, fontName="Helvetica-Bold",
                                                      textColor=DARK_TEAL, spaceAfter=6)))
story.append(divider())
story.append(make_table(
    ["#", "Topic", "Key Diagnosis / Issue", "First Action"],
    [
        ["1", "Normal labour", "Established first stage — 4 cm dilated", "Partogram + FHR auscultation q15min"],
        ["2", "PPH", "Uterine atony — 650 ml loss, BP dropping", "Call for help + uterotonic cascade"],
        ["3", "Shoulder dystocia", "Turtle sign — anterior shoulder impacted", "HELPERR + document time + McRoberts"],
        ["4", "Pre-eclampsia", "BP 162/108, proteinuria, visual symptoms", "MgSO4 4 g IV + antihypertensives"],
        ["5", "Pathological CTG", "Late decelerations + reduced variability", "Reposition + inform obstetrician + FBS"],
        ["6", "Cord prolapse", "Pulsating cord at introitus post-ARM", "Elevate presenting part + knee-chest position"],
        ["7", "Breech in labour", "Frank breech — eligible for vaginal birth", "Senior obstetrician + hands-off approach"],
        ["8", "Placenta praevia", "Painless APH + previous LSCS + low placenta", "NO VE + IV access + corticosteroids"],
        ["9", "Uterine rupture", "Constant pain + fetal bradycardia + haematuria", "Crash team + immediate laparotomy"],
        ["10", "OASI", "3b tear — >50% EAS, IAS intact", "Theatre repair + laxatives + physio"],
    ],
    col_widths=[0.7*cm, 3.5*cm, 7*cm, 7.3*cm]
))
story.append(Spacer(1, 0.5*cm))

story.append(info_box([
    Paragraph("<b>Key Mnemonics to Remember:</b>", sH2),
    body("PPH 4 Ts:  Tone · Tissue · Trauma · Thrombin"),
    body("Shoulder Dystocia:  HELPERR (Help · Episiotomy · Legs · Pressure · Enter · Remove arm · Roll)"),
    body("MgSO4 Monitoring:  RUF — Respirations ≥12 · Urine ≥25 ml/hr · reFlexes present"),
    body("CTG Features:  DR C BRAVADO — Define Risk · Contractions · Baseline Rate · Accelerations · "
         "Variability · Abrupt/gradual Decelerations · Overall assessment"),
]))
story.append(Spacer(1, 0.5*cm))

story.append(info_box([
    Paragraph("<b>Disclaimer:</b>", sH2),
    body("This resource is for educational purposes only and is intended to support undergraduate "
         "midwifery students in examination preparation. All clinical decisions must be guided by "
         "your local trust guidelines, NICE guidance, and RCOG Green-top Guidelines. Drug doses "
         "quoted reflect standard UK practice at time of publication — always verify with current "
         "BNF/local protocols."),
], bg=colors.HexColor("#FFF8F0"), border=ACCENT_AMBER))

# ════════════════════════════════════════════════════════════════════════════
#  BUILD PDF
# ════════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=MARGIN, rightMargin=MARGIN,
    topMargin=2.2*cm, bottomMargin=1.8*cm,
    title="Labour & Midwifery Assessment Case Studies",
    author="Orris AI — Educational Resource",
    subject="Undergraduate Midwifery Case Studies",
)

doc.build(story, canvasmaker=NumberedCanvas)
print(f"PDF generated: {OUTPUT}")
Running Command

python /tmp/workspace/midwifery-casestudies/generate_pdf.py 2>&1

Running Command

python -c " from pypdf import PdfReader r = PdfReader('/tmp/workspace/midwifery-casestudies/Midwifery_Labour_Assessment_Case_Studies.pdf') import os size = os.path.getsize('/tmp/workspace/midwifery-casestudies/Midwifery_Labour_Assessment_Case_Studies.pdf') print(f'Pages: {len(r.pages)}') print(f'File size: {size/1024:.1f} KB') print(f'Title: {r.metadata.title}') "

Your PDF is ready. Here is your download link:

Midwifery Labour Assessment Case Studies

PDF Document · PDF


What is in the PDF (16 pages, full-bleed professional layout):
#Case StudyPatient
1Normal / Physiological LabourAmara, 26, G1P0
2Primary Postpartum Haemorrhage (PPH)Blessing, 32, G3P2
3Shoulder DystociaFatou, 30, G2P1
4Severe Pre-eclampsia and EclampsiaYemi, 34, G1P0
5Pathological CTG / Fetal Heart Rate MonitoringGrace, 38, G1P0
6Cord Prolapse (new)Sade, 29, G2P1
7Breech Presentation in Labour (new)Chisom, 27, G1P0
8Placenta Praevia / APH (new)Nadia, 33, G2P1
9Uterine Rupture (new)Aisha, 35, G3P2
10Perineal Trauma (OASI) Classification & Repair (new)Miriam, 24, G1P0
Format features:
  • Teal-and-white colour-coded design with case banners
  • Clinical tables for CTG classification, HELPERR, 4 Ts, perineal degrees, MgSO4 monitoring
  • Alert boxes for critical "never do" points
  • Quick reference summary table on the final page covering all 10 cases
  • Key mnemonics box (4 Ts, HELPERR, RUF, DR C BRAVADO)
  • Page numbers, header/footer on every page
  • Disclaimer reminding you to cross-check with local trust guidelines and RCOG Green-tops

Create a link for more case studoes on postdatism and all obstetrics emergencies ,

Reading File
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Finding Sources
Reading File
Reading File
Writing File

~/midwifery-casestudies/generate_pdf2.py


from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.units import mm, cm
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.pdfgen import canvas

OUTPUT = "/tmp/workspace/midwifery-casestudies/Postdatism_Obstetric_Emergencies_Case_Studies.pdf"

# ── Colour palette ──────────────────────────────────────────────────────────
DARK_PLUM   = colors.HexColor("#3D0C11")
MID_PLUM    = colors.HexColor("#8B1A1A")
LIGHT_ROSE  = colors.HexColor("#D4A5A5")
PALE_ROSE   = colors.HexColor("#FDF0F0")
ACCENT_GOLD = colors.HexColor("#C9920A")
ALERT_RED   = colors.HexColor("#AE2012")
SOFT_GREY   = colors.HexColor("#F5F5F5")
TEAL_ACCENT = colors.HexColor("#0A7373")
WHITE       = colors.white
BLACK       = colors.HexColor("#1A1A1A")

PAGE_W, PAGE_H = A4
MARGIN = 2 * cm

# ── Numbered canvas with header/footer ──────────────────────────────────────
class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_header_footer(num_pages)
            super().showPage()
        super().save()

    def draw_header_footer(self, page_count):
        w, h = A4
        self.setFillColor(DARK_PLUM)
        self.rect(0, h - 1.5*cm, w, 1.5*cm, fill=1, stroke=0)
        self.setFillColor(WHITE)
        self.setFont("Helvetica-Bold", 9)
        self.drawString(MARGIN, h - 1.0*cm,
                        "POSTDATISM & OBSTETRIC EMERGENCIES  |  Assessment Case Studies")
        self.setFont("Helvetica", 8)
        self.drawRightString(w - MARGIN, h - 1.0*cm, "Student Midwife Resource — July 2026")
        self.setFillColor(DARK_PLUM)
        self.rect(0, 0, w, 1.1*cm, fill=1, stroke=0)
        self.setFillColor(WHITE)
        self.setFont("Helvetica", 8)
        self.drawCentredString(w / 2, 0.38*cm,
            f"Page {self._pageNumber} of {page_count}   |   Educational purposes only — always follow local clinical guidelines")

# ── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def S(name, **kw):
    return ParagraphStyle(name, parent=styles["Normal"], **kw)

sTitle    = S("sTitle",   fontSize=26, leading=32, textColor=WHITE,
              fontName="Helvetica-Bold", alignment=TA_CENTER)
sSubtitle = S("sSub",     fontSize=11, leading=15, textColor=LIGHT_ROSE,
              fontName="Helvetica", alignment=TA_CENTER)
sCaseNum  = S("sCaseNum", fontSize=10, leading=13, textColor=ACCENT_GOLD,
              fontName="Helvetica-Bold", spaceAfter=2)
sCaseTitle= S("sCT",      fontSize=15, leading=19, textColor=WHITE,
              fontName="Helvetica-Bold")
sH2       = S("sH2",      fontSize=11, leading=14, textColor=DARK_PLUM,
              fontName="Helvetica-Bold", spaceBefore=8, spaceAfter=3)
sBody     = S("sBody",    fontSize=9.5, leading=14, textColor=BLACK,
              fontName="Helvetica", alignment=TA_JUSTIFY, spaceAfter=4)
sAlert    = S("sAlert",   fontSize=9.5, leading=13, textColor=ALERT_RED,
              fontName="Helvetica-Bold", spaceAfter=3)
sSource   = S("sSource",  fontSize=8,  leading=11, textColor=TEAL_ACCENT,
              fontName="Helvetica-Oblique", spaceAfter=6)
sTOCBold  = S("sTOCBold", fontSize=10, leading=16, textColor=DARK_PLUM,
              fontName="Helvetica-Bold", spaceAfter=2)
sTOC      = S("sTOC",     fontSize=10, leading=16, textColor=DARK_PLUM,
              fontName="Helvetica", spaceAfter=2)

# ── Helpers ──────────────────────────────────────────────────────────────────
def case_header(number, topic, label):
    data = [[Paragraph(f"CASE STUDY {number}", sCaseNum), ""],
            [Paragraph(topic, sCaseTitle),
             Paragraph(label, S("sl", fontSize=9.5, textColor=LIGHT_ROSE,
                                fontName="Helvetica-Oblique", alignment=4))]]
    t = Table(data, colWidths=[13*cm, 5.5*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0),(-1,-1), DARK_PLUM),
        ("TOPPADDING",    (0,0),(-1,-1), 8),
        ("BOTTOMPADDING", (0,0),(-1,-1), 8),
        ("LEFTPADDING",   (0,0),(-1,-1), 10),
        ("RIGHTPADDING",  (0,0),(-1,-1), 10),
        ("VALIGN",        (0,0),(-1,-1), "MIDDLE"),
        ("SPAN",          (0,0),(-1,0)),
    ]))
    return t

def h2(text): return Paragraph(text, sH2)
def body(text): return Paragraph(text, sBody)
def alert(text): return Paragraph("⚠  " + text, sAlert)
def source(text): return Paragraph("Source: " + text, sSource)
def divider(): return HRFlowable(width="100%", thickness=0.5, color=LIGHT_ROSE, spaceAfter=6, spaceBefore=4)

def bullet(text, indent=0):
    st = S(f"b{indent}", fontSize=9.5, leading=13, textColor=BLACK,
           fontName="Helvetica", leftIndent=12+indent*10, spaceAfter=2)
    return Paragraph("•  " + text, st)

def info_box(items, bg=PALE_ROSE, border=MID_PLUM):
    rows = [[item] for item in items]
    t = Table(rows, colWidths=[18.5*cm])
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0),(-1,-1), bg),
        ("BOX",           (0,0),(-1,-1), 1, border),
        ("TOPPADDING",    (0,0),(-1,-1), 5),
        ("BOTTOMPADDING", (0,0),(-1,-1), 5),
        ("LEFTPADDING",   (0,0),(-1,-1), 10),
        ("RIGHTPADDING",  (0,0),(-1,-1), 10),
    ]))
    return t

def make_table(headers, rows, col_widths=None):
    data = [[Paragraph(h, S("th", fontSize=9, fontName="Helvetica-Bold", textColor=WHITE))
             for h in headers]]
    for row in rows:
        data.append([Paragraph(str(c), S("td", fontSize=9, fontName="Helvetica",
                                          textColor=BLACK, leading=12)) for c in row])
    if col_widths is None:
        col_widths = [18.5*cm / len(headers)] * len(headers)
    t = Table(data, colWidths=col_widths)
    t.setStyle(TableStyle([
        ("BACKGROUND",    (0,0),(-1,0),  DARK_PLUM),
        ("ROWBACKGROUNDS",(0,1),(-1,-1), [WHITE, SOFT_GREY]),
        ("GRID",          (0,0),(-1,-1), 0.4, LIGHT_ROSE),
        ("TOPPADDING",    (0,0),(-1,-1), 5),
        ("BOTTOMPADDING", (0,0),(-1,-1), 5),
        ("LEFTPADDING",   (0,0),(-1,-1), 6),
        ("VALIGN",        (0,0),(-1,-1), "TOP"),
    ]))
    return t

# ════════════════════════════════════════════════════════════════════════════
#  BUILD STORY
# ════════════════════════════════════════════════════════════════════════════
story = []

# ── COVER ────────────────────────────────────────────────────────────────────
cover_data = [
    [Paragraph("Postdatism &amp; Obstetric", sTitle)],
    [Paragraph("Emergencies", sTitle)],
    [Spacer(1, 0.3*cm)],
    [Paragraph("Advanced Assessment Case Studies for Undergraduate Student Midwives", sSubtitle)],
    [Spacer(1,0.2*cm)],
    [Paragraph("Postdatism · Amniotic Fluid Embolism · Uterine Inversion · DIC · Maternal Sepsis<br/>"
               "HELLP Syndrome · Acute Tocolysis · Placental Abruption · Maternal Collapse · "
               "Hypertensive Crisis", sSubtitle)],
]
cover_t = Table(cover_data, colWidths=[18.5*cm])
cover_t.setStyle(TableStyle([
    ("BACKGROUND",    (0,0),(-1,-1), DARK_PLUM),
    ("TOPPADDING",    (0,0),(-1,-1), 14),
    ("BOTTOMPADDING", (0,0),(-1,-1), 10),
    ("LEFTPADDING",   (0,0),(-1,-1), 20),
    ("RIGHTPADDING",  (0,0),(-1,-1), 20),
]))
story.append(Spacer(1, 2.5*cm))
story.append(cover_t)
story.append(Spacer(1, 1.2*cm))

accent = Table([[Paragraph(
    "Format: Clinical Vignette → Assessment Questions → Detailed Model Answer",
    S("ac", fontSize=10, textColor=WHITE, fontName="Helvetica-Bold", alignment=TA_CENTER))
]], colWidths=[18.5*cm])
accent.setStyle(TableStyle([
    ("BACKGROUND",    (0,0),(-1,-1), ACCENT_GOLD),
    ("TOPPADDING",    (0,0),(-1,-1), 8),
    ("BOTTOMPADDING", (0,0),(-1,-1), 8),
]))
story.append(accent)
story.append(Spacer(1, 0.8*cm))
story.append(body("This companion resource extends your clinical preparation to postdatism and the full "
                  "spectrum of obstetric emergencies. Each scenario is drawn from authoritative clinical "
                  "sources including Creasy & Resnik's Maternal-Fetal Medicine, ROSEN's Emergency Medicine, "
                  "and Tintinalli's Emergency Medicine."))
story.append(Spacer(1, 0.3*cm))
story.append(info_box([
    Paragraph("<b>How to use:</b>", sH2),
    body("1.  Read the vignette — note every clinical detail; they are all deliberate."),
    body("2.  Answer the questions independently before reading the model answer."),
    body("3.  Pay attention to the 'First Action' — examiners frequently test this."),
    body("4.  Cross-reference all drug doses and thresholds with your local trust guidelines."),
]))
story.append(PageBreak())

# ── TABLE OF CONTENTS ────────────────────────────────────────────────────────
story.append(Paragraph("Contents", S("toch", fontSize=18, fontName="Helvetica-Bold",
                                      textColor=DARK_PLUM, spaceAfter=8)))
story.append(divider())
toc_items = [
    ("1",  "Postdatism — Prolonged Pregnancy &amp; Management",          "Ola, 28, G1P0, 41+5 wks"),
    ("2",  "Postdatism — Induction of Labour Decision-Making",            "Bisi, 32, G2P1, 42+0 wks"),
    ("3",  "Amniotic Fluid Embolism (AFE)",                               "Clara, 30, G2P1, intrapartum"),
    ("4",  "Uterine Inversion",                                           "Ngozi, 25, G1P0, third stage"),
    ("5",  "Disseminated Intravascular Coagulation (DIC)",                "Adaeze, 34, G3P2, PPH"),
    ("6",  "Maternal Sepsis in Labour",                                   "Joy, 29, G2P1, ruptured membranes"),
    ("7",  "HELLP Syndrome",                                              "Priya, 36, G1P0, 33+2 wks"),
    ("8",  "Placental Abruption",                                         "Amina, 31, G3P2, 36+0 wks"),
    ("9",  "Maternal Collapse / Cardiac Arrest in Pregnancy",             "Ruth, 38, G2P1, antepartum"),
    ("10", "Acute Hypertensive Crisis in Labour",                         "Tola, 33, G1P0, second stage"),
]
toc_data = [[Paragraph(f"<b>{n}.</b>  {title}", sTOCBold),
             Paragraph(scenario, sTOC)]
            for n, title, scenario in toc_items]
toc_t = Table(toc_data, colWidths=[13.5*cm, 5*cm])
toc_t.setStyle(TableStyle([
    ("ROWBACKGROUNDS", (0,0),(-1,-1), [WHITE, SOFT_GREY]),
    ("TOPPADDING",    (0,0),(-1,-1), 7),
    ("BOTTOMPADDING", (0,0),(-1,-1), 7),
    ("LEFTPADDING",   (0,0),(-1,-1), 8),
    ("GRID",          (0,0),(-1,-1), 0.3, LIGHT_ROSE),
    ("VALIGN",        (0,0),(-1,-1), "MIDDLE"),
]))
story.append(toc_t)
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 1 — POSTDATISM: Prolonged Pregnancy
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("1", "Postdatism — Prolonged Pregnancy", "Ola · 28 yrs · G1P0 · 41+5 weeks"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Ola is a 28-year-old primigravida who presents at 41+5 weeks gestation for a routine "
         "antenatal review. Dates confirmed by first-trimester ultrasound. She reports normal "
         "fetal movements. She is anxious about going overdue and asks about her options."),
    body("<b>Observations:</b> BP 118/72 mmHg · Pulse 78 bpm · Urinalysis clear"),
    body("<b>CTG (30 min):</b> Baseline 140 bpm · Variability 8 bpm · 2 accelerations · "
         "No decelerations — reactive"),
    body("<b>Ultrasound:</b> Amniotic fluid index (AFI) 9 cm · EFW 3.5 kg · Placental grade II"),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("Define postdatism. At what gestational age is a pregnancy considered post-term?"))
story.append(bullet("What fetal and maternal risks are associated with prolonged pregnancy?"))
story.append(bullet("Describe the management options available to Ola at 41+5 weeks and the evidence base."))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(body("<b>Definitions:</b>"))
story.append(bullet("Post-dates: >40 weeks gestation"))
story.append(bullet("Post-term (prolonged pregnancy): ≥42+0 weeks (294 days from LMP)"))
story.append(bullet("Incidence: 5–10% of pregnancies; recurrence rate ~27% in subsequent pregnancies"))
story.append(Spacer(1,0.1*cm))
story.append(make_table(
    ["Risk", "Fetal/Neonatal", "Maternal"],
    [
        ["Placental insufficiency",    "Reduced uteroplacental blood flow; fetal hypoxia", "Increased intervention rates"],
        ["Macrosomia",                 "Birth weight >4000–4500 g; shoulder dystocia risk", "Perineal trauma, CS"],
        ["Meconium aspiration",        "Thick meconium in liquor; aspiration syndrome",   "Increased anxiety"],
        ["Oligohydramnios",            "AFI <5 cm — cord compression, variable decelerations", "Increased monitoring burden"],
        ["Perinatal mortality",        "Rises steeply after 42 weeks (2–3× baseline)", "Prolonged labour"],
        ["Postmaturity syndrome",      "Wrinkled, peeling skin; meconium staining; alert infant", "—"],
    ],
    col_widths=[4*cm, 7.5*cm, 7*cm]
))
story.append(Spacer(1,0.2*cm))
story.append(h2("Management at 41+5 Weeks"))
story.append(make_table(
    ["Option", "Detail", "Evidence / Recommendation"],
    [
        ["Membrane sweep",
         "Offered from 40 weeks; repeated at 41 weeks. Midwife inserts finger through cervical os and rotates to separate membranes from lower segment.",
         "Reduces need for formal induction; increases prostaglandin release. NICE recommends offering at 40–41 wks."],
        ["Induction of Labour (IOL)",
         "Recommended by 41+0 to 42+0 weeks. Cervical ripening with prostaglandins (PGE2 gel/pessary or misoprostol) if cervix unfavourable (Bishop score <6).",
         "ARRIVE trial & NICE NG207: IOL at 41 wks reduces CS rate and perinatal mortality vs expectant management."],
        ["Expectant management",
         "Twice-weekly CTG + AFI assessment if woman declines IOL. Must be fully informed of rising risks.",
         "Perinatal mortality rises from 1–2/1000 at 40 wks to 4–7/1000 at 43 wks."],
    ],
    col_widths=[3.5*cm, 8.5*cm, 6.5*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(alert("After 42+0 weeks, expectant management requires very close fetal surveillance. "
                   "Offer IOL by 42+0 weeks at the latest per NICE NG207 (2021)."))
story.append(body("<b>Bishop Score reminder:</b> Scores dilation, effacement, station, consistency, position. "
                  "Score ≥8 = favourable cervix; proceed directly to ARM/oxytocin. "
                  "Score <6 = cervical ripening needed first."))
story.append(source("Creasy & Resnik's Maternal-Fetal Medicine; NICE NG207 (Inducing Labour, 2021)"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 2 — POSTDATISM: IOL Decision Making
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("2", "Postdatism — Induction of Labour Decision-Making", "Bisi · 32 yrs · G2P1 · 42+0 weeks"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Bisi is a 32-year-old G2P1 who reaches 42+0 weeks. Her previous birth was a normal vaginal "
         "delivery. She declines induction of labour and asks to continue with expectant management. "
         "Fetal movements are normal. Bishop score today is 4."),
    body("<b>CTG:</b> Baseline 138 bpm · Variability 6 bpm · 1 acceleration in 40 minutes · "
         "No decelerations. CTG classified as suspicious/non-reactive."),
    body("<b>Ultrasound:</b> AFI 4 cm (oligohydramnios) · EFW 3.8 kg · Grade III placenta"),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("How do you counsel Bisi about the risks of continuing to decline induction?"))
story.append(bullet("What does the AFI of 4 cm tell you and how does it change your management?"))
story.append(bullet("Outline a stepwise induction of labour plan if she consents."))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(body("<b>Counselling Bisi — key points (shared decision-making):</b>"))
story.append(bullet("At 42+0 weeks, perinatal mortality is approximately 4–7 per 1000 births vs 1–2 per 1000 at 40 weeks"))
story.append(bullet("Stillbirth risk increases approximately 2-fold beyond 42 weeks"))
story.append(bullet("She has the right to decline; document discussion thoroughly — use BRAIN framework:"))
story.append(bullet("Benefits — IOL reduces perinatal mortality, meconium aspiration, CS risk", 1))
story.append(bullet("Risks — IOL carries small risks: hyperstimulation, failed induction, CS", 1))
story.append(bullet("Alternatives — expectant management with twice-weekly CTG and AFI", 1))
story.append(bullet("Intuition — her feelings and values are valid and must be respected", 1))
story.append(bullet("Nothing — what happens if she does nothing and declines monitoring too", 1))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>AFI 4 cm = oligohydramnios</b> (normal AFI 8–18 cm; borderline 5–8 cm; oligohydramnios <5 cm). "
                  "This significantly escalates the urgency — oligohydramnios at 42 weeks indicates "
                  "placental insufficiency and is an indication for immediate delivery regardless of "
                  "Bishop score. Counsel Bisi that this finding markedly increases fetal risk."))
story.append(alert("Oligohydramnios + post-term + non-reactive CTG = escalate to senior obstetrician "
                   "immediately. This is no longer a 'decline IOL' conversation — this requires urgent delivery."))
story.append(Spacer(1,0.1*cm))
story.append(h2("IOL Stepwise Plan (if Bishop score 4)"))
story.append(make_table(
    ["Step", "Intervention", "Reassessment"],
    [
        ["1 — Cervical ripening",   "PGE2 (dinoprostone) vaginal gel 1–2 mg OR slow-release pessary (Propess 10 mg/24 hr) OR misoprostol 25 mcg vaginally per local protocol", "Reassess after 6 hours (gel) or 24 hours (pessary)"],
        ["2 — ARM",                "Artificial rupture of membranes once cervix is favourable (Bishop ≥8)", "Assess for cord prolapse; note liquor colour and volume"],
        ["3 — Oxytocin infusion",  "IV oxytocin titrated per unit protocol (e.g., start 1–2 mIU/min, increase every 30 min to max 32–40 mIU/min)", "Target 3–4 contractions per 10 min, each 45–60 sec"],
        ["4 — Continuous EFM",     "Mandatory once oxytocin commenced; ARM performed; or meconium present", "Action CTG abnormalities promptly per local pathway"],
    ],
    col_widths=[3*cm, 8.5*cm, 7*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Failed induction:</b> If no progress after 2 cycles of cervical ripening or "
                  "labour not established with ARM + oxytocin — discuss caesarean section."))
story.append(source("Creasy & Resnik's MFM; NICE NG207; Textbook of Family Medicine 9e"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 3 — AMNIOTIC FLUID EMBOLISM
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("3", "Amniotic Fluid Embolism (AFE)", "Clara · 30 yrs · G2P1 · Intrapartum"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Clara is a 30-year-old G2P1 who has just had an emergency caesarean section for fetal distress "
         "at 39+1 weeks. Minutes after delivery of the placenta, she suddenly becomes agitated and "
         "confused. She develops acute respiratory distress (SpO2 drops to 78%), "
         "profound hypotension (BP 68/40 mmHg), and then loses consciousness. The anaesthetist "
         "calls a maternal cardiac arrest. Bleeding from the surgical wound is noted to not be "
         "clotting normally."),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("What is the most likely diagnosis and what is the pathophysiology?"))
story.append(bullet("What is the classic triad of AFE?"))
story.append(bullet("Outline the emergency resuscitation priorities."))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(body("<b>Diagnosis:</b> Amniotic Fluid Embolism (AFE) — a rare but catastrophic obstetric "
                  "emergency. Incidence: 1–12 per 100,000 deliveries. Mortality: 20–60%."))
story.append(body("<b>Pathophysiology:</b> Entry of amniotic fluid (containing fetal cells, hair, vernix, "
                  "meconium) into the maternal circulation triggers an anaphylactoid reaction and "
                  "complement activation. This causes:"))
story.append(bullet("Phase 1 — Acute pulmonary vasospasm → right heart failure → acute hypoxia"))
story.append(bullet("Phase 2 — Left ventricular failure → haemodynamic collapse"))
story.append(bullet("Phase 3 — Coagulopathy (DIC) — develops in ~83% of survivors of the initial arrest"))
story.append(Spacer(1,0.1*cm))
story.append(make_table(
    ["Classic AFE Triad", "Clara's presentation"],
    [
        ["1. Acute hypoxia / respiratory failure", "SpO2 78%, respiratory distress ✓"],
        ["2. Haemodynamic collapse / cardiovascular shock", "BP 68/40, loss of consciousness ✓"],
        ["3. Coagulopathy (DIC)", "Non-clotting bleeding from wound ✓"],
    ],
    col_widths=[8*cm, 10.5*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(alert("AFE is a diagnosis of exclusion — rule out PE, anaphylaxis, eclampsia, "
                   "haemorrhagic shock. Management is purely supportive — no specific antidote exists."))
story.append(Spacer(1,0.1*cm))
story.append(h2("Emergency Resuscitation"))
story.append(bullet("Activate maternal cardiac arrest protocol — call crash team"))
story.append(bullet("CPR: 30:2 compressions to ventilations; left lateral uterine displacement if uterus still occupied"))
story.append(bullet("High-flow O2 / intubation — anaesthetist leads airway management"))
story.append(bullet("IV adrenaline 1 mg (1:10,000) per ALS protocol during cardiac arrest"))
story.append(bullet("Activate massive haemorrhage protocol — FFP:RBC 1:1 ratio; platelets; cryoprecipitate for DIC"))
story.append(bullet("TXA (tranexamic acid) 1 g IV early — inhibits fibrinolysis"))
story.append(bullet("Senior haematologist, intensivist, and obstetrician present"))
story.append(bullet("If ROSC not achieved within 4 minutes — perimortem caesarean section (if uterus occupied) within 5 minutes of arrest onset"))
story.append(bullet("Admit to ITU/HDU post-resuscitation"))
story.append(source("Murray & Nadel's Respiratory Medicine; ROSEN's Emergency Medicine; DiMaio's Forensic Pathology"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 4 — UTERINE INVERSION
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("4", "Uterine Inversion", "Ngozi · 25 yrs · G1P0 · Third Stage of Labour"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Ngozi is a 25-year-old primipara who delivers vaginally at 39+3 weeks. During the third stage, "
         "the midwife applies controlled cord traction. There is sudden, profuse haemorrhage. The "
         "midwife notices that the uterine fundus cannot be palpated abdominally and identifies a "
         "beefy-red fleshy mass at the vaginal introitus. Ngozi immediately collapses with severe "
         "neurogenic shock: BP 60/40 mmHg, pulse 50 bpm."),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("Define uterine inversion and classify the degree seen in Ngozi."))
story.append(bullet("Why does neurogenic shock occur in uterine inversion?"))
story.append(bullet("Describe the Johnson manoeuvre for manual replacement of the uterus."))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(body("<b>Definition:</b> Uterine inversion = the uterus turns inside out through the cervix. "
                  "Incidence: 1 in 2000–6000 deliveries. Can be life-threatening."))
story.append(make_table(
    ["Degree", "Description"],
    [
        ["1st (incomplete)", "Fundus inverts but does not reach cervical os"],
        ["2nd (complete)", "Inverted fundus passes through cervix — beefy-red mass visible at introitus (Ngozi)"],
        ["3rd (prolapsed)", "Inverted uterus passes beyond vaginal introitus"],
        ["4th (total)", "Vaginal walls also inverted"],
    ],
    col_widths=[4*cm, 14.5*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Neurogenic shock:</b> The broad ligaments and ovaries are stretched acutely as the "
                  "uterus inverts, stimulating intense vagal afferent discharge → bradycardia, "
                  "peripheral vasodilation, and hypotension disproportionate to blood loss."))
story.append(Spacer(1,0.1*cm))
story.append(h2("Johnson Manoeuvre (Manual Reinversion)"))
story.append(bullet("Call for help immediately — senior obstetrician, anaesthetist"))
story.append(bullet("DO NOT remove placenta if attached — this increases haemorrhage during reinversion"))
story.append(bullet("Establish IV access × 2; fluid resuscitation; atropine for bradycardia"))
story.append(bullet("Tocolysis to relax uterus: MgSO4 2–4 g IV, OR terbutaline 250 mcg SC, "
                    "OR nitroglycerin 100–200 mcg IV bolus"))
story.append(bullet("Johnson manoeuvre: cup the inverted fundus in the palm, "
                    "push firmly and steadily upward along the axis of the vagina toward the umbilicus, "
                    "maintaining steady pressure until fundus returns above the cervical ring"))
story.append(bullet("Once reinverted: remove placenta, give uterotonics (oxytocin infusion), "
                    "bimanual compression to maintain contraction"))
story.append(bullet("If Johnson fails: hydrostatic method (O'Sullivan technique) — fill vagina with "
                    "2–3 L warm saline via silicone cup to hydraulically re-expand and elevate uterus"))
story.append(bullet("Surgical (Huntington / Haultain procedure) if all conservative methods fail"))
story.append(alert("If the fundus cannot be palpated abdominally and there is PPH — always think of uterine inversion."))
story.append(source("Creasy & Resnik's MFM; ROSEN's Emergency Medicine; Tintinalli's Emergency Medicine"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 5 — DIC
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("5", "Disseminated Intravascular Coagulation (DIC)", "Adaeze · 34 yrs · G3P2 · Severe PPH"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Adaeze is a 34-year-old G3P2 who has a major PPH following vaginal delivery with "
         "a retained placenta. Estimated blood loss is 2200 ml. Despite uterotonics and manual "
         "removal of the placenta, bleeding continues. Venepuncture sites begin to ooze. "
         "The anaesthetist notices blood in the IV tubing is not clotting."),
    body("<b>Bloods (emergency):</b> Hb 65 g/L · Platelets 48 × 10⁹/L · PT 24 sec (normal <14) · "
         "APTT 68 sec · Fibrinogen 0.8 g/L (critical — normal 2–4 g/L) · D-dimer markedly elevated"),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("Explain the pathophysiology of DIC in obstetric haemorrhage."))
story.append(bullet("What blood results confirm DIC and what do they indicate?"))
story.append(bullet("Outline the component blood therapy required for Adaeze."))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(body("<b>Pathophysiology of DIC:</b> Massive haemorrhage triggers activation of the "
                  "coagulation cascade beyond the body's compensatory capacity. Thrombin is generated "
                  "systemically, consuming clotting factors and platelets ('consumptive coagulopathy'). "
                  "Fibrin is deposited in microvessels, and secondary fibrinolysis degrades fibrinogen. "
                  "The net result is paradoxical simultaneous thrombosis and bleeding."))
story.append(Spacer(1,0.1*cm))
story.append(make_table(
    ["Blood Test", "Adaeze's Result", "Interpretation"],
    [
        ["Fibrinogen",  "0.8 g/L (critical)", "Most sensitive marker for DIC in obstetrics. <1.5 g/L = severe coagulopathy — replace with cryoprecipitate"],
        ["Platelets",   "48 × 10⁹/L",         "Thrombocytopenia from platelet consumption — transfuse if <50 × 10⁹/L in active bleeding"],
        ["PT/INR",      "24 sec (prolonged)",  "Extrinsic pathway deficiency — give FFP (Fresh Frozen Plasma)"],
        ["APTT",        "68 sec (prolonged)",  "Intrinsic pathway deficiency — FFP also replaces these factors"],
        ["D-dimer",     "Markedly elevated",   "Fibrin degradation products — confirms fibrinolysis occurring"],
    ],
    col_widths=[3.5*cm, 3.5*cm, 11.5*cm]
))
story.append(Spacer(1,0.2*cm))
story.append(h2("Component Blood Therapy — Target-Guided Replacement"))
story.append(make_table(
    ["Component", "Indication / Target", "Dose"],
    [
        ["Packed Red Blood Cells (pRBCs)", "Hb <80 g/L in active haemorrhage", "1 unit raises Hb ~10 g/L"],
        ["Fresh Frozen Plasma (FFP)",       "PT/APTT >1.5× normal; give early in 1:1 ratio with pRBCs", "4 units (adult dose)"],
        ["Cryoprecipitate",                 "Fibrinogen <1.5 g/L — best source of fibrinogen", "2 pools (10 units) → target fibrinogen >2 g/L"],
        ["Platelets",                       "<50 × 10⁹/L in active bleeding; <75 before surgery", "1 adult therapeutic dose (ATD)"],
        ["Tranexamic Acid (TXA)",           "Give within 3 hours of PPH onset — WOMAN trial evidence", "1 g IV stat; repeat 1 g in 30 min if bleeding continues"],
    ],
    col_widths=[4.5*cm, 7*cm, 7*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(alert("Fibrinogen replacement with cryoprecipitate is the most critical intervention in obstetric DIC. "
                   "Do not wait for formal DIC diagnosis — treat the coagulopathy clinically."))
story.append(source("Creasy & Resnik's MFM; Morgan & Mikhail's Clinical Anaesthesiology; WOMAN Trial (TXA)"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 6 — MATERNAL SEPSIS
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("6", "Maternal Sepsis in Labour", "Joy · 29 yrs · G2P1 · Ruptured Membranes 36 hrs"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Joy is a 29-year-old G2P1 at 38+2 weeks who ruptured membranes 36 hours ago and was admitted "
         "but has not established in labour. She now reports rigors and abdominal pain. The liquor "
         "draining is offensive-smelling and cloudy."),
    body("<b>Observations:</b> Temp 39.4°C · HR 128 bpm · RR 24/min · BP 88/52 mmHg · SpO2 94% on air "
         "· Uterus is tender on palpation · FHR baseline elevated at 185 bpm on CTG"),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("Define maternal sepsis and septic shock using the Sepsis-3 criteria."))
story.append(bullet("What is the most likely organism and source?"))
story.append(bullet("Outline the Sepsis Six bundle and its timing requirements."))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(body("<b>Definitions (Sepsis-3):</b>"))
story.append(bullet("Sepsis: Life-threatening organ dysfunction caused by a dysregulated host response to infection"))
story.append(bullet("Maternal sepsis: sepsis occurring during pregnancy, childbirth, or within 42 days of end of pregnancy"))
story.append(bullet("Septic shock: Sepsis + vasopressor requirement to maintain MAP ≥65 mmHg + serum lactate >2 mmol/L despite fluid resuscitation"))
story.append(body("<b>Joy meets criteria for septic shock:</b> high temp, tachycardia, tachypnoea, hypotension, fetal tachycardia."))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Most likely diagnosis:</b> Chorioamnionitis (intra-amniotic infection). "
                  "Most common organism: Group A Streptococcus (GAS/Strep. pyogenes) — can be rapidly fatal. "
                  "Also: E. coli, Group B Streptococcus, anaerobes."))
story.append(Spacer(1,0.1*cm))
story.append(h2("Sepsis Six Bundle — complete ALL within 1 hour ('Golden Hour')"))
story.append(make_table(
    ["#", "Action", "Detail"],
    [
        ["1", "High-flow oxygen",         "15 L/min via non-rebreathe mask; target SpO2 ≥94%"],
        ["2", "Blood cultures × 2",       "Before antibiotics — peripheral + central if available; HVS/endocervical swab"],
        ["3", "IV broad-spectrum antibiotics", "Piperacillin-tazobactam 4.5 g IV OR co-amoxiclav + metronidazole (per local protocol); add gentamicin if severe"],
        ["4", "IV fluid resuscitation",   "500 ml–1 L crystalloid IV bolus over 15–30 min; reassess BP and lactate"],
        ["5", "Lactate measurement",      "Arterial or venous blood gas; lactate >4 mmol/L = severe sepsis; target <2 mmol/L"],
        ["6", "Urine output monitoring",  "Catheterise; target ≥0.5 ml/kg/hr; if oliguria, senior review"],
    ],
    col_widths=[0.7*cm, 4.5*cm, 13.3*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(alert("Notify senior obstetrician and ITU/HDU team immediately. Delivery of the fetus "
                   "is the source control for chorioamnionitis — plan urgent delivery."))
story.append(body("Fetal tachycardia (FHR 185 bpm) = fetal distress from sepsis — likely category 1 CS required. "
                  "Neonatal team must be present at delivery."))
story.append(source("Park's Textbook of Preventive & Social Medicine; ROSEN's Emergency Medicine"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 7 — HELLP
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("7", "HELLP Syndrome", "Priya · 36 yrs · G1P0 · 33+2 weeks"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Priya is a 36-year-old nullipara at 33+2 weeks who presents with a 2-day history of "
         "right upper quadrant and epigastric pain, nausea, and malaise. She denies headache "
         "or visual changes. BP on arrival 148/96 mmHg (2+ protein on dipstick)."),
    body("<b>Blood results:</b> Hb 98 g/L · Platelets 62 × 10⁹/L · LDH 890 U/L · "
         "AST 245 U/L · ALT 210 U/L · Peripheral smear: schistocytes (fragmented RBCs)"),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("Expand the HELLP acronym and apply it to Priya's blood results."))
story.append(bullet("How is HELLP classified (Tennessee Classification)?"))
story.append(bullet("What are the immediate management priorities at 33+2 weeks?"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(make_table(
    ["HELLP Component", "Criterion", "Priya's Result", "Met?"],
    [
        ["H — Haemolysis",          "LDH >600 U/L or schistocytes on smear",  "LDH 890 + schistocytes", "YES"],
        ["EL — Elevated Liver enzymes", "AST >70 U/L",                        "AST 245, ALT 210",       "YES"],
        ["LP — Low Platelets",      "Platelets <100 × 10⁹/L",                 "62 × 10⁹/L",            "YES"],
    ],
    col_widths=[4*cm, 5.5*cm, 4.5*cm, 1.5*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(make_table(
    ["Tennessee Class", "Platelet Count", "Severity"],
    [
        ["Class 1 (severe)", "<50 × 10⁹/L",   "Highest morbidity — Priya is Class 1"],
        ["Class 2",          "50–100 × 10⁹/L", "Moderate"],
        ["Class 3 (partial HELLP)", "100–150 × 10⁹/L", "Mild"],
    ],
    col_widths=[5.5*cm, 5*cm, 8*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(h2("Management at 33+2 weeks"))
story.append(bullet("Admit to delivery suite / HDU; senior obstetric and neonatal team review"))
story.append(bullet("BP control: labetalol IV or oral nifedipine; target SBP 140–155 mmHg"))
story.append(bullet("MgSO4: 4 g loading dose IV; 1–2 g/hour maintenance — eclampsia prophylaxis"))
story.append(bullet("Corticosteroids: Betamethasone 12 mg IM × 2 doses (48 hours apart) for fetal lung maturity"))
story.append(bullet("Note: High-dose dexamethasone has been used to temporarily improve platelet count in HELLP, "
                    "but evidence is limited — discuss with consultant"))
story.append(bullet("Continuous CTG; FBC, LFTs, LDH, coagulation 4–6 hourly"))
story.append(bullet("Plan delivery: stabilise for 24–48 hours to allow corticosteroids to act, "
                    "then deliver by 34 weeks. If maternal or fetal condition deteriorates — deliver immediately"))
story.append(bullet("Platelet transfusion if <20 × 10⁹/L or before CS/regional anaesthesia if <80 × 10⁹/L"))
story.append(alert("HELLP can deteriorate rapidly. RUQ pain + nausea + thrombocytopenia in a pregnant woman "
                   "= HELLP until proven otherwise."))
story.append(source("Robbins & Kumar Basic Pathology; Creasy & Resnik's MFM; Henry's Clinical Diagnosis"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 8 — PLACENTAL ABRUPTION
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("8", "Placental Abruption", "Amina · 31 yrs · G3P2 · 36+0 weeks"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Amina is a 31-year-old G3P2 at 36+0 weeks. She presents with sudden onset severe, "
         "constant abdominal pain, and a small amount of dark red vaginal bleeding. She reports "
         "reduced fetal movements over the past 2 hours. She is a known smoker (10/day)."),
    body("<b>Observations:</b> BP 148/92 mmHg · Pulse 110 bpm · Temp 36.6°C"),
    body("<b>Examination:</b> Uterus woody-hard and tender ('board-like rigidity'), fundal height "
         "appears larger than dates · FHR on CTG: baseline 165 bpm, reduced variability 3 bpm, "
         "late decelerations."),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("Differentiate placental abruption from placenta praevia using this presentation."))
story.append(bullet("What is 'concealed' vs 'revealed' abruption? Which might Amina have?"))
story.append(bullet("Why does the uterus appear larger than dates in abruption?"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(make_table(
    ["Feature", "Placental Abruption (Amina)", "Placenta Praevia"],
    [
        ["Pain",        "Sudden, severe, constant — 'board-like' uterus", "Painless — no uterine tenderness"],
        ["Bleeding",    "Dark red; may be concealed (no external blood despite severe pain)", "Bright red; amount correlates with severity"],
        ["Uterus",      "Hypertonic, tender, woody-hard", "Soft, non-tender"],
        ["Fetal status","CTG abnormalities common", "CTG often normal unless massive haemorrhage"],
        ["Risk factors","Hypertension, smoking, cocaine, trauma, PROM", "Previous CS, uterine surgery, multiparity"],
    ],
    col_widths=[3.5*cm, 7.5*cm, 7.5*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Concealed vs Revealed Abruption:</b>"))
story.append(bullet("Revealed (~80%): blood tracks down between membranes and decidua, exits via cervix — visible PV bleeding"))
story.append(bullet("Concealed (~20%): blood pools behind the placenta with no external bleeding — "
                    "pain and haemodynamic collapse disproportionate to visible loss"))
story.append(bullet("Mixed: combination of both types"))
story.append(body("<b>Amina likely has partially concealed abruption</b> — small external bleed but "
                  "profound pain, hypertonic uterus, and fetal distress suggest significant retroplacental haematoma."))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Uterus larger than dates:</b> Retroplacental haematoma accumulates blood behind the placenta "
                  "('Couvelaire uterus' in severe cases), increasing uterine volume."))
story.append(Spacer(1,0.1*cm))
story.append(h2("Immediate Management"))
story.append(bullet("Call for help — senior obstetrician, anaesthetist, neonatologist"))
story.append(bullet("2 × large-bore IV; bloods: FBC, coag, cross-match 6 units, G&S"))
story.append(bullet("Resuscitate: IV crystalloid, blood products as guided by results"))
story.append(bullet("Continuous CTG — pathological trace → immediate delivery"))
story.append(bullet("Emergency CS if fetal compromise or severe maternal haemorrhage"))
story.append(bullet("Coagulopathy is a major risk — monitor fibrinogen closely; replace early"))
story.append(source("Creasy & Resnik's MFM; Tintinalli's Emergency Medicine"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 9 — MATERNAL COLLAPSE
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("9", "Maternal Collapse / Cardiac Arrest in Pregnancy", "Ruth · 38 yrs · G2P1 · 32 weeks"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Ruth is a 38-year-old G2P1 at 32 weeks gestation attending a routine antenatal clinic. "
         "She suddenly collapses, is unresponsive, and not breathing. No pulse is felt."),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("List the reversible causes of maternal cardiac arrest (the 4 Hs and 4 Ts)."))
story.append(bullet("What modifications to standard ALS are required in pregnancy?"))
story.append(bullet("When and how should perimortem caesarean section be performed?"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(make_table(
    ["4 Hs", "4 Ts"],
    [
        ["Hypoxia", "Tension pneumothorax"],
        ["Hypovolaemia (haemorrhage, PPH)", "Tamponade (cardiac)"],
        ["Hypo/Hyperkalaemia & metabolic", "Toxins (MgSO4, LA toxicity, opioids)"],
        ["Hypothermia", "Thromboembolism (PE, AFE)"],
    ],
    col_widths=[9.25*cm, 9.25*cm]
))
story.append(Spacer(1,0.2*cm))
story.append(h2("Modifications to ALS in Pregnancy"))
story.append(make_table(
    ["Standard ALS", "Modification in Pregnancy", "Rationale"],
    [
        ["Chest compressions", "Hand position 1 rib-width higher on sternum", "Elevated diaphragm due to gravid uterus"],
        ["Supine position", "Manual left uterine displacement (LUD) at 15–30° or wedge under right hip", "Relieves aortocaval compression; improves cardiac output"],
        ["Defibrillation", "No change — standard energy levels (150–360 J biphasic)", "Fetal risk negligible; maternal survival is priority"],
        ["IV/IO access", "Above the diaphragm preferred (antecubital, IO)", "IVC compression may impair drug delivery if below diaphragm"],
        ["Airway", "Difficult airway assumed; early intubation", "Reduced FRC, aspiration risk, oedema"],
    ],
    col_widths=[4*cm, 7*cm, 7.5*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(h2("Perimortem Caesarean Section (PMCS)"))
story.append(bullet("Indicated if gestation ≥20 weeks (uterus above umbilicus) AND no ROSC within 4 minutes of arrest"))
story.append(bullet("Goal: deliver fetus within 5 minutes of arrest onset ('4-minute rule')"))
story.append(bullet("Rationale: relieves aortocaval compression → improves venous return → improves CPR efficacy"))
story.append(bullet("Do NOT move patient to theatre — perform at the bedside"))
story.append(bullet("Continue CPR throughout the procedure; do not pause for delivery"))
story.append(bullet("Neonatal team must be immediately available"))
story.append(alert("The primary purpose of PMCS is to aid MATERNAL resuscitation, not just fetal survival."))
story.append(source("ROSEN's Emergency Medicine; Miller's Anesthesia 10e; Resuscitation Council UK Guidelines"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  CASE 10 — ACUTE HYPERTENSIVE CRISIS
# ════════════════════════════════════════════════════════════════════════════
story.append(case_header("10", "Acute Hypertensive Crisis in Labour", "Tola · 33 yrs · G1P0 · Second Stage"))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Clinical Vignette"))
story.append(info_box([
    body("Tola is a 33-year-old G1P0 who is known to have chronic hypertension, well-controlled on "
         "methyldopa 250 mg TDS. She is in the active second stage of labour at 39+2 weeks. "
         "Her BP suddenly reads 185/118 mmHg. She has a severe occipital headache and complains "
         "of 'pulsing' in her ears. No proteinuria previously documented — 2+ protein now on "
         "dipstick. She has not seized."),
]))
story.append(Spacer(1,0.2*cm))
story.append(h2("Assessment Questions"))
story.append(bullet("What is the treatment threshold for hypertension in labour and why?"))
story.append(bullet("Name three first-line antihypertensive agents safe in pregnancy with doses."))
story.append(bullet("Should MgSO4 be given? Justify your answer."))
story.append(Spacer(1, 0.3*cm))
story.append(h2("Model Answer"))
story.append(body("<b>Treatment threshold:</b> Treat when systolic BP ≥160 mmHg AND/OR diastolic "
                  "BP ≥110 mmHg in pregnancy (lower threshold than non-obstetric hypertensive "
                  "emergencies). This is because pregnant women have no resetting of cerebral "
                  "autoregulation — even pressures that seem moderate can cause hypertensive "
                  "encephalopathy, intracranial haemorrhage, or eclampsia."))
story.append(Spacer(1,0.1*cm))
story.append(make_table(
    ["Drug", "Dose / Route", "Notes"],
    [
        ["Labetalol IV",    "20 mg IV bolus; can repeat 40 mg, 80 mg at 10-min intervals; max 300 mg total",
                            "First-line in most UK units; avoid in asthma/bradycardia"],
        ["Hydralazine IV",  "5–10 mg slow IV bolus; repeat every 20 min; max 20 mg",
                            "Alternative; risk of tachycardia and fluid retention"],
        ["Nifedipine oral", "10–20 mg immediate-release capsule; repeat after 30 min if needed",
                            "Safe and effective; do NOT use sublingually (risk of rapid hypotension)"],
        ["Nicardipine IV",  "5–15 mg/hour IV infusion",
                            "Used in HDU/ITU setting"],
    ],
    col_widths=[3.5*cm, 7*cm, 8*cm]
))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Target BP:</b> Reduce systolic to 140–155 mmHg and diastolic to 90–105 mmHg. "
                  "Do NOT reduce BP too rapidly — placental perfusion depends on adequate MAP."))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Should MgSO4 be given?</b> Yes. Tola now has new-onset hypertension (BP ≥160/110) "
                  "with proteinuria and symptoms (headache) — this meets criteria for severe "
                  "pre-eclampsia even in the context of pre-existing hypertension. MgSO4 4 g IV "
                  "loading dose should be given immediately for eclampsia prophylaxis."))
story.append(Spacer(1,0.1*cm))
story.append(body("<b>Additional actions:</b>"))
story.append(bullet("Call senior obstetrician — plan for expedited delivery (instrumental or CS)"))
story.append(bullet("Continuous CTG — fetal distress from acute hypertension is common"))
story.append(bullet("IV access, bloods: FBC, U&E, LFT, coagulation"))
story.append(bullet("Continuous BP monitoring every 5 minutes until stable"))
story.append(source("ROSEN's Emergency Medicine; Creasy & Resnik's MFM; NICE NG133"))
story.append(PageBreak())


# ════════════════════════════════════════════════════════════════════════════
#  QUICK REFERENCE SUMMARY
# ════════════════════════════════════════════════════════════════════════════
story.append(Paragraph("Quick Reference Summary", S("qrs", fontSize=16, fontName="Helvetica-Bold",
                                                      textColor=DARK_PLUM, spaceAfter=6)))
story.append(divider())
story.append(make_table(
    ["#", "Emergency", "Key Sign / Trigger", "First Action"],
    [
        ["1", "Postdatism (41+5 wks)", "Post-term + reactive CTG + AFI 9 cm", "Membrane sweep + IOL counselling per NICE NG207"],
        ["2", "Postdatism + oligohydramnios", "AFI 4 cm at 42+0 wks", "Urgent delivery — escalate immediately"],
        ["3", "Amniotic fluid embolism", "Sudden collapse + hypoxia + coagulopathy post-delivery", "CPR + massive haemorrhage protocol + TXA"],
        ["4", "Uterine inversion", "Fundus not palpable + beefy-red mass at introitus", "Do NOT remove placenta; tocolysis + Johnson manoeuvre"],
        ["5", "DIC",               "Non-clotting blood + fibrinogen <1.5 g/L", "Cryoprecipitate + FFP + TXA"],
        ["6", "Maternal sepsis",   "Temp 39.4 + HR 128 + BP 88/52 + offensive liquor", "Sepsis Six within 1 hour + urgent delivery"],
        ["7", "HELLP",             "RUQ pain + thrombocytopenia + elevated LDH/AST", "MgSO4 + antihypertensives + steroids + plan delivery"],
        ["8", "Placental abruption", "Sudden pain + board-like uterus + dark bleeding", "IV access + bloods + CTG + expedite delivery"],
        ["9", "Maternal cardiac arrest", "Unresponsive + no pulse + in pregnancy", "ALS with LUD; PMCS within 5 min if no ROSC"],
        ["10","Hypertensive crisis","BP 185/118 + headache in labour", "Labetalol IV + MgSO4 4 g + expedite delivery"],
    ],
    col_widths=[0.7*cm, 4*cm, 6.8*cm, 7*cm]
))
story.append(Spacer(1, 0.5*cm))
story.append(info_box([
    Paragraph("<b>Key Mnemonics:</b>", sH2),
    body("AFE Triad: Hypoxia + Haemodynamic collapse + Coagulopathy (DIC)"),
    body("HELLP: Haemolysis · Elevated Liver enzymes · Low Platelets"),
    body("DIC Treatment: C-REEP — Cryoprecipitate · Red cells · Early TXA · Early FFP · Platelets"),
    body("Sepsis Six: O2 · Blood cultures · Antibiotics · Fluids · Lactate · Urine output"),
    body("Maternal Arrest 4Hs: Hypoxia · Hypovolaemia · Hypo/Hyperkalaemia · Hypothermia"),
    body("Maternal Arrest 4Ts: Tension pneumothorax · Tamponade · Toxins · Thromboembolism"),
    body("PMCS: Start at 4 min of arrest — deliver by 5 min ('4-minute rule')"),
    body("BRAIN for IOL counselling: Benefits · Risks · Alternatives · Intuition · Nothing"),
]))
story.append(Spacer(1, 0.4*cm))
story.append(info_box([
    Paragraph("<b>Disclaimer:</b>", sH2),
    body("This resource is designed for undergraduate midwifery examination preparation only. "
         "All drug doses, thresholds, and clinical pathways must be verified against your "
         "local trust guidelines, NICE guidance (NG207, NG133), and RCOG Green-top Guidelines "
         "before clinical application. NICE NG207 Inducing Labour (2021) is the current UK standard "
         "for postdatism management."),
], bg=colors.HexColor("#FFF8F0"), border=ACCENT_GOLD))

# ════════════════════════════════════════════════════════════════════════════
#  GENERATE
# ════════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    leftMargin=MARGIN, rightMargin=MARGIN,
    topMargin=2.2*cm, bottomMargin=1.8*cm,
    title="Postdatism & Obstetric Emergencies — Assessment Case Studies",
    author="Orris AI — Educational Resource",
    subject="Undergraduate Midwifery Advanced Case Studies",
)
doc.build(story, canvasmaker=NumberedCanvas)
print(f"PDF generated: {OUTPUT}")
Running Command

python /tmp/workspace/midwifery-casestudies/generate_pdf2.py 2>&1

Running Command

python -c " from pypdf import PdfReader import os r = PdfReader('/tmp/workspace/midwifery-casestudies/Postdatism_Obstetric_Emergencies_Case_Studies.pdf') size = os.path.getsize('/tmp/workspace/midwifery-casestudies/Postdatism_Obstetric_Emergencies_Case_Studies.pdf') print(f'Pages: {len(r.pages)}') print(f'File size: {size/1024:.1f} KB') print(f'Title: {r.metadata.title}') "

Your new PDF is ready. Here is your download link:

Postdatism Obstetric Emergencies Case Studies

PDF Document · PDF


What is inside (18 pages, professional full-bleed layout with deep plum/rose colour scheme):
#Case StudyPatientKey Learning
1Postdatism — Prolonged PregnancyOla, 28, G1P0, 41+5 wksDefinition, risks, IOL vs expectant, Bishop score
2Postdatism + Oligohydramnios / IOLBisi, 32, G2P1, 42+0 wksAFI <5 cm, BRAIN framework, IOL stepwise plan
3Amniotic Fluid Embolism (AFE)Clara, 30, G2P1Classic triad, pathophysiology, CPR modifications
4Uterine InversionNgozi, 25, G1P0Degrees, neurogenic shock, Johnson manoeuvre
5Disseminated Intravascular Coagulation (DIC)Adaeze, 34, G3P2Fibrinogen replacement, cryoprecipitate, TXA (WOMAN trial)
6Maternal Sepsis / ChorioamnionitisJoy, 29, G2P1Sepsis-3 criteria, Sepsis Six bundle, GAS risk
7HELLP SyndromePriya, 36, G1P0, 33+2 wksTennessee classification, management at preterm gestation
8Placental AbruptionAmina, 31, G3P2Concealed vs revealed, Couvelaire uterus, emergency management
9Maternal Cardiac Arrest / CollapseRuth, 38, G2P14Hs & 4Ts, ALS modifications, perimortem CS — 4-minute rule
10Acute Hypertensive Crisis in LabourTola, 33, G1P0Labetalol/hydralazine/nifedipine doses, MgSO4 indication
Extra features included:
  • Quick reference summary table for all 10 cases
  • 7 key mnemonics (AFE triad, HELLP, DIC C-REEP, Sepsis Six, 4Hs/4Ts, PMCS rule, BRAIN)
  • Evidence base cited throughout (NICE NG207, WOMAN trial, Sepsis-3)
You now have both PDFs covering 20 total case studies for your assessment preparation.
This is a shared conversation. Sign in to Orris to start your own chat.