Hi I'm Ramzan Hafeez from Akhtar Saeed College of Pharmacy Canal Campus affiliated with Punjab University Lahore. I had 2 supplies in Practical exam now I'll again give the practical exam of these two subjects which is held on 19-06-2026 (Biochemistry) 20-06-2026 (Physical Pharmacy) Practical exam has three parts Write up 20 marks Practical performance 40 marks Viva 40 marks Physical Pharmacy Chapters are following OrientationHistory & Literature of Pharmacy Physico-Chemical Principles (a) Solutions (imp) (b) Solubilization (imp) (c) Adsorption (d) Ionization (e) Hydrolysis (f) Micromeritics (imp) Dispersions system (most & highly important) (a) Colloids (imp) (b) Emulsions (imp) (c) Suspensions (imp) Rheology (imp) Physicochemical Processes(a) Precipitation(b) Crystallization(c) Distillation(d) Miscellaneous Processes(imp) Extraction Processes Rate and Order of ReactionKinetic Principles & Stability Testing (Also has 24 practical of Physical Pharmacy Practical Note Book) Biochemistry chapters are following 1. Basic Biochemistry 2.Carbohydrates (Basic Chemistry of Biomolecules) 3.Lipids 4.Proteins and Amino Acids 5.Nucleic Acids (imp) 6.Vitamins (imp) 7.Hormones (imp) 8.Enzymes (Michael Menten Equation) (imp) 9.Metabolic Fate of Carbohydrates (imp) 10.Metabolic Fate of Lipids (imp) 11.Metabolic Fate of Proteins and Amino Acids (imp) 12.Bioenergetics (imp) 13.Gene Expression (imp) 14.Introduction to Clinical Chemistry (Also has 25 practical of Biochemistry Practical Note Book) Now divide this syllabus till 17-06-2026 Now kindly create a study plan for me from today 9 pm onwards At the end create a Pdf format file
mkdir -p /home/daytona/workspace/study-plan && ls /home/daytona/workspace/study-plan/
~/study-plan/ramzan_study_plan.py
from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch, cm
from reportlab.platypus import (SimpleDocTemplate, Paragraph, Spacer, Table,
TableStyle, HRFlowable, PageBreak)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT
from reportlab.platypus import KeepTogether
output_path = "/home/daytona/workspace/study-plan/Ramzan_Hafeez_Study_Plan.pdf"
doc = SimpleDocTemplate(
output_path,
pagesize=A4,
rightMargin=1.8*cm,
leftMargin=1.8*cm,
topMargin=1.8*cm,
bottomMargin=1.8*cm
)
# ── Colours ──────────────────────────────────────────────────────────────────
DARK_BLUE = colors.HexColor("#1A3C6E")
MID_BLUE = colors.HexColor("#2563EB")
LIGHT_BLUE = colors.HexColor("#DBEAFE")
ACCENT_GOLD = colors.HexColor("#F59E0B")
GREEN = colors.HexColor("#16A34A")
LIGHT_GREEN = colors.HexColor("#DCFCE7")
PURPLE = colors.HexColor("#7C3AED")
LIGHT_PURPLE= colors.HexColor("#EDE9FE")
ORANGE = colors.HexColor("#EA580C")
LIGHT_ORANGE= colors.HexColor("#FEF3C7")
RED = colors.HexColor("#DC2626")
LIGHT_RED = colors.HexColor("#FEE2E2")
GRAY = colors.HexColor("#6B7280")
LIGHT_GRAY = colors.HexColor("#F9FAFB")
WHITE = colors.white
BLACK = colors.black
styles = getSampleStyleSheet()
def style(name, **kwargs):
return ParagraphStyle(name, **kwargs)
title_style = style("Title2",
fontSize=20, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica-Bold", leading=26, spaceAfter=4)
subtitle_style = style("Sub2",
fontSize=11, textColor=LIGHT_BLUE, alignment=TA_CENTER,
fontName="Helvetica", leading=15, spaceAfter=2)
section_header_style = style("SecH",
fontSize=13, textColor=WHITE, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=18,
leftIndent=6)
day_header_style = style("DayH",
fontSize=11, textColor=DARK_BLUE, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=16)
body_style = style("Body2",
fontSize=9.5, textColor=BLACK, alignment=TA_LEFT,
fontName="Helvetica", leading=14)
small_style = style("Small2",
fontSize=8.5, textColor=GRAY, alignment=TA_LEFT,
fontName="Helvetica", leading=12)
bold_style = style("Bold2",
fontSize=9.5, textColor=DARK_BLUE, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=14)
imp_style = style("Imp",
fontSize=9, textColor=RED, alignment=TA_LEFT,
fontName="Helvetica-Bold", leading=13)
note_style = style("Note",
fontSize=8.5, textColor=ORANGE, alignment=TA_LEFT,
fontName="Helvetica-Oblique", leading=12)
center_style = style("Center2",
fontSize=9.5, textColor=BLACK, alignment=TA_CENTER,
fontName="Helvetica", leading=14)
# ─────────────────────────────────────────────────────────────────────────────
story = []
# ══ HEADER BANNER ════════════════════════════════════════════════════════════
header_data = [[
Paragraph("PERSONALISED EXAM PREPARATION STUDY PLAN", title_style),
]]
header_table = Table(header_data, colWidths=[doc.width])
header_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("ROUNDEDCORNERS", [8]),
("TOPPADDING", (0,0), (-1,-1), 14),
("BOTTOMPADDING", (0,0), (-1,-1), 14),
("LEFTPADDING", (0,0), (-1,-1), 10),
("RIGHTPADDING", (0,0), (-1,-1), 10),
]))
story.append(header_table)
story.append(Spacer(1, 6))
# Sub-header info table
info_data = [
[Paragraph("Student: <b>Ramzan Hafeez</b>", body_style),
Paragraph("Institution: Akhtar Saeed College of Pharmacy, Canal Campus<br/>Affiliated with: University of the Punjab, Lahore", small_style),
Paragraph("Plan Start: 12 June 2026 (9:00 PM)<br/>Plan End: 17 June 2026", small_style)],
]
info_table = Table(info_data, colWidths=[doc.width*0.22, doc.width*0.45, doc.width*0.33])
info_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), LIGHT_BLUE),
("TOPPADDING", (0,0), (-1,-1), 8),
("BOTTOMPADDING", (0,0), (-1,-1), 8),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("LINEABOVE", (0,0), (-1,0), 2, ACCENT_GOLD),
]))
story.append(info_table)
story.append(Spacer(1, 8))
# Exam schedule box
exam_data = [
[Paragraph("📅 EXAM SCHEDULE", bold_style),
Paragraph("🧪 19 June 2026 (Friday) — Biochemistry Practical", body_style),
Paragraph("⚗️ 20 June 2026 (Saturday) — Physical Pharmacy Practical", body_style)],
]
exam_table = Table(exam_data, colWidths=[doc.width*0.22, doc.width*0.39, doc.width*0.39])
exam_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), DARK_BLUE),
("BACKGROUND", (1,0), (1,0), LIGHT_GREEN),
("BACKGROUND", (2,0), (2,0), LIGHT_PURPLE),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LEFTPADDING", (0,0), (-1,-1), 8),
("RIGHTPADDING", (0,0), (-1,-1), 8),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TEXTCOLOR", (0,0), (0,0), WHITE),
]))
story.append(exam_table)
story.append(Spacer(1, 8))
# Exam marks breakdown
marks_data = [
[Paragraph("EXAM COMPONENTS & MARKS", bold_style),
Paragraph("Write-up", center_style),
Paragraph("Practical Performance", center_style),
Paragraph("Viva Voce", center_style),
Paragraph("Total", center_style)],
[Paragraph("Each Subject", body_style),
Paragraph("20 marks", center_style),
Paragraph("40 marks", center_style),
Paragraph("40 marks", center_style),
Paragraph("100 marks", center_style)],
]
marks_table = Table(marks_data, colWidths=[doc.width*0.28, doc.width*0.18, doc.width*0.22, doc.width*0.18, doc.width*0.14])
marks_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("BACKGROUND", (0,1), (-1,1), LIGHT_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("ALIGN", (1,0), (-1,-1), "CENTER"),
("GRID", (0,0), (-1,-1), 0.5, colors.HexColor("#BFDBFE")),
]))
story.append(marks_table)
story.append(Spacer(1, 10))
# ══ STUDY OVERVIEW ════════════════════════════════════════════════════════════
overview_header = Table(
[[Paragraph(" STUDY PLAN OVERVIEW (12 – 17 June 2026)", section_header_style)]],
colWidths=[doc.width])
overview_header.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LINEBELOW", (0,0), (-1,-1), 2, ACCENT_GOLD),
]))
story.append(overview_header)
story.append(Spacer(1, 6))
overview_text = (
"The plan covers <b>5.5 study days</b> (12 June 9 PM → 17 June night). "
"Biochemistry and Physical Pharmacy are interleaved daily so that both subjects "
"stay fresh. Each day is split into <b>morning, afternoon, and evening sessions</b>. "
"The final two days (16–17 June) are reserved for <b>revision, practicals notebook review, and viva practice</b>. "
"Topics marked <b><font color='#DC2626'>(IMP)</font></b> are high-priority and should receive extra attention."
)
story.append(Paragraph(overview_text, body_style))
story.append(Spacer(1, 8))
# ── Daily colour legend
legend_data = [
[Paragraph("COLOUR LEGEND", bold_style),
Paragraph("Biochemistry", body_style),
Paragraph("Physical Pharmacy", body_style),
Paragraph("Revision / Practicals", body_style),
Paragraph("Tips / Notes", body_style)],
]
legend_table = Table(legend_data, colWidths=[doc.width*0.22, doc.width*0.19, doc.width*0.21, doc.width*0.22, doc.width*0.16])
legend_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), DARK_BLUE),
("BACKGROUND", (1,0), (1,0), LIGHT_GREEN),
("BACKGROUND", (2,0), (2,0), LIGHT_PURPLE),
("BACKGROUND", (3,0), (3,0), LIGHT_ORANGE),
("BACKGROUND", (4,0), (4,0), LIGHT_RED),
("TEXTCOLOR", (0,0), (0,0), WHITE),
("FONTSIZE", (0,0), (-1,-1), 9),
("FONTNAME", (0,0), (0,0), "Helvetica-Bold"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("GRID", (0,0), (-1,-1), 0.3, GRAY),
]))
story.append(legend_table)
story.append(Spacer(1, 12))
# ══════════════════════════════════════════════════════════════════════════════
# DAILY PLAN
# ══════════════════════════════════════════════════════════════════════════════
def section_header(text, color=DARK_BLUE):
t = Table([[Paragraph(f" {text}", section_header_style)]], colWidths=[doc.width])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LINEBELOW", (0,0), (-1,-1), 2, ACCENT_GOLD),
]))
return t
def session_row(time_str, subject, topics, marks_focus, color):
row_data = [
[Paragraph(time_str, bold_style),
Paragraph(f"<b>{subject}</b>", bold_style),
Paragraph(topics, body_style),
Paragraph(marks_focus, small_style)],
]
t = Table(row_data, colWidths=[doc.width*0.14, doc.width*0.18, doc.width*0.46, doc.width*0.22])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), color),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LINEBELOW", (0,0), (-1,-1), 0.3, colors.HexColor("#D1D5DB")),
]))
return t
def col_header():
row_data = [
[Paragraph("Time", bold_style),
Paragraph("Subject", bold_style),
Paragraph("Topics to Cover", bold_style),
Paragraph("Focus Area", bold_style)],
]
t = Table(row_data, colWidths=[doc.width*0.14, doc.width*0.18, doc.width*0.46, doc.width*0.22])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), MID_BLUE),
("TEXTCOLOR", (0,0), (-1,-1), WHITE),
("FONTNAME", (0,0), (-1,-1), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 9),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 6),
("RIGHTPADDING", (0,0), (-1,-1), 6),
]))
return t
# ─── DAY 1 (12 June – Evening only) ─────────────────────────────────────────
story.append(section_header("DAY 1 • Friday, 12 June 2026 (Evening – 9:00 PM onward)", DARK_BLUE))
story.append(Spacer(1, 4))
story.append(col_header())
story.append(session_row(
"9:00–10:30 PM", "Biochemistry",
"Ch 1: Basic Biochemistry – cell structure, biomolecules overview, water & pH\n"
"Ch 2: Carbohydrates – monosaccharides, disaccharides, polysaccharides, tests (Benedict's, Fehling's, Barfoed's)",
"Write-up: definitions & classification\nViva: basic tests & structures",
LIGHT_GREEN))
story.append(session_row(
"10:30–11:30 PM", "Physical Pharmacy",
"Ch 1: Orientation, History & Literature of Pharmacy – historical milestones, pharmacopoeias\n"
"Ch 2a: Solutions – types, ideal solutions, concentration expressions, Raoult's law",
"Write-up: definitions, laws\nViva: concentration types",
LIGHT_PURPLE))
story.append(session_row(
"11:30 PM–12:00 AM", "Both",
"Quick revision of today's topics. Write 5 possible viva questions per subject in your notebook.",
"Viva preparation", LIGHT_ORANGE))
story.append(Spacer(1, 10))
# ─── DAY 2 (13 June) ─────────────────────────────────────────────────────────
story.append(section_header("DAY 2 • Saturday, 13 June 2026", DARK_BLUE))
story.append(Spacer(1, 4))
story.append(col_header())
story.append(session_row(
"8:00–10:00 AM", "Biochemistry",
"Ch 3: Lipids – classification, fatty acids, phospholipids, steroids, waxes\n"
"Ch 4: Proteins & Amino Acids – classification, peptide bonds, protein structure (1°–4°)",
"Write-up: classification tables\nViva: protein denaturation, isoelectric point",
LIGHT_GREEN))
story.append(session_row(
"10:30 AM–12:30 PM", "Physical Pharmacy",
"Ch 2b: Solubilization <b>(IMP)</b> – solubility factors, solubilizing agents, cosolvency, surfactants\n"
"Ch 2d: Ionization – pKa, Henderson-Hasselbalch, degree of ionization, pH-partition hypothesis",
"Write-up: Henderson-Hasselbalch equation\nViva: factors affecting ionization",
LIGHT_PURPLE))
story.append(session_row(
"2:00–4:00 PM", "Biochemistry",
"Ch 5: Nucleic Acids <b>(IMP)</b> – DNA & RNA structure, nucleotides, base pairing, Watson-Crick model, types of RNA",
"Write-up: double helix diagram\nViva: differences between DNA & RNA",
LIGHT_GREEN))
story.append(session_row(
"4:30–6:30 PM", "Physical Pharmacy",
"Ch 2c: Adsorption – types (physical vs chemical), Freundlich & Langmuir isotherms, adsorption in pharmacy\n"
"Ch 2e: Hydrolysis – types, factors affecting, kinetics, hydrolysis in dosage forms",
"Write-up: isotherm equations\nViva: pharmaceutical applications",
LIGHT_PURPLE))
story.append(session_row(
"8:00–10:00 PM", "Biochemistry",
"Ch 6: Vitamins <b>(IMP)</b> – fat-soluble (A, D, E, K) and water-soluble (B-complex, C): sources, functions, deficiency\n"
"Review Biochemistry Practicals 1–6 in your notebook",
"Write-up: vitamin table\nPractical notebook review",
LIGHT_GREEN))
story.append(session_row(
"10:00–11:00 PM", "Physical Pharmacy",
"Ch 2f: Micromeritics <b>(IMP)</b> – particle size & distribution, surface area, methods of size determination (sieving, microscopy)",
"Write-up: particle size methods\nViva: Stokes' law, equivalent diameter",
LIGHT_PURPLE))
story.append(Spacer(1, 10))
# ─── DAY 3 (14 June) ─────────────────────────────────────────────────────────
story.append(section_header("DAY 3 • Sunday, 14 June 2026", DARK_BLUE))
story.append(Spacer(1, 4))
story.append(col_header())
story.append(session_row(
"8:00–10:30 AM", "Biochemistry",
"Ch 7: Hormones <b>(IMP)</b> – classification (peptide, steroid, amine), mechanism of action, major hormones (insulin, glucagon, thyroid, cortisol, sex hormones)",
"Write-up: hormone classification table\nViva: insulin vs glucagon, mechanism",
LIGHT_GREEN))
story.append(session_row(
"11:00 AM–1:00 PM", "Physical Pharmacy",
"Ch 3a: Colloids <b>(IMP)</b> – types, properties (Tyndall effect, Brownian motion, zeta potential), lyophilic vs lyophobic, protective colloids",
"Write-up: properties & applications\nViva: zeta potential significance",
LIGHT_PURPLE))
story.append(session_row(
"2:00–4:30 PM", "Biochemistry",
"Ch 8: Enzymes <b>(IMP)</b> – classification, cofactors, Michaelis-Menten equation, Km & Vmax, enzyme inhibition (competitive, non-competitive, uncompetitive), Lineweaver-Burk plot",
"Write-up: MM equation & derivation\nViva: enzyme kinetics, inhibition types",
LIGHT_GREEN))
story.append(session_row(
"5:00–7:00 PM", "Physical Pharmacy",
"Ch 3b: Emulsions <b>(IMP)</b> – O/W vs W/O, emulsifying agents (HLB system), stability, preparation, evaluation tests\n"
"Review PP Practicals 1–6",
"Write-up: HLB system\nPractical notebook review",
LIGHT_PURPLE))
story.append(session_row(
"8:00–10:30 PM", "Biochemistry",
"Ch 9: Metabolic Fate of Carbohydrates <b>(IMP)</b> – glycolysis (step-by-step), TCA cycle overview, glycogenesis & glycogenolysis, gluconeogenesis",
"Write-up: glycolysis pathway diagram\nViva: ATP yield, key enzymes",
LIGHT_GREEN))
story.append(session_row(
"10:30–11:30 PM", "Physical Pharmacy",
"Ch 3c: Suspensions <b>(IMP)</b> – flocculated vs deflocculated, sedimentation, zeta potential, formulation principles",
"Write-up: flocculation vs deflocculation\nViva: caking, sedimentation volume",
LIGHT_PURPLE))
story.append(Spacer(1, 10))
# ─── DAY 4 (15 June) ─────────────────────────────────────────────────────────
story.append(section_header("DAY 4 • Monday, 15 June 2026", DARK_BLUE))
story.append(Spacer(1, 4))
story.append(col_header())
story.append(session_row(
"8:00–10:00 AM", "Physical Pharmacy",
"Ch 4: Rheology <b>(IMP)</b> – Newtonian & non-Newtonian flow, viscosity, thixotropy, dilatancy, pseudoplasticity, pharmaceutical applications",
"Write-up: flow curve diagrams\nViva: thixotropy in suspensions",
LIGHT_PURPLE))
story.append(session_row(
"10:30 AM–12:30 PM", "Biochemistry",
"Ch 10: Metabolic Fate of Lipids <b>(IMP)</b> – beta-oxidation of fatty acids (step-by-step), ketone bodies, fatty acid synthesis overview",
"Write-up: beta-oxidation steps\nViva: ATP yield, ketogenesis",
LIGHT_GREEN))
story.append(session_row(
"2:00–4:00 PM", "Physical Pharmacy",
"Ch 5: Physicochemical Processes – Precipitation & Crystallization (crystal forms, polymorphism, crystal habit)\n"
"Distillation (simple, fractional, steam, vacuum)",
"Write-up: polymorphism importance\nViva: types of distillation",
LIGHT_PURPLE))
story.append(session_row(
"4:30–6:30 PM", "Biochemistry",
"Ch 11: Metabolic Fate of Proteins & Amino Acids <b>(IMP)</b> – transamination, deamination, urea cycle, amino acid catabolism",
"Write-up: urea cycle diagram\nViva: transamination vs deamination",
LIGHT_GREEN))
story.append(session_row(
"8:00–9:30 PM", "Physical Pharmacy",
"Ch 5 continued: Miscellaneous Processes <b>(IMP)</b> – lyophilization (freeze drying), spray drying, co-precipitation\n"
"Ch 6: Extraction Processes – solvent extraction, maceration, percolation",
"Write-up: freeze drying advantages\nViva: extraction methods comparison",
LIGHT_PURPLE))
story.append(session_row(
"9:30–11:00 PM", "Biochemistry",
"Ch 12: Bioenergetics <b>(IMP)</b> – ATP structure, high-energy bonds, oxidative phosphorylation, electron transport chain, chemiosmotic theory",
"Write-up: ETC diagram\nViva: P/O ratio, uncouplers",
LIGHT_GREEN))
story.append(session_row(
"11:00–11:30 PM", "Both",
"Review practicals: Biochemistry 7–12, Physical Pharmacy 7–12",
"Practical notebook review", LIGHT_ORANGE))
story.append(Spacer(1, 10))
# ─── DAY 5 (16 June) ─────────────────────────────────────────────────────────
story.append(section_header("DAY 5 • Tuesday, 16 June 2026 (Revision Day 1)", MID_BLUE))
story.append(Spacer(1, 4))
story.append(col_header())
story.append(session_row(
"8:00–10:00 AM", "Physical Pharmacy",
"Ch 7: Rate & Order of Reactions <b>(IMP)</b> – zero, first, second order reactions, half-life, shelf life, Arrhenius equation\n"
"Ch 8: Kinetic Principles & Stability Testing – accelerated stability testing, ICH guidelines",
"Write-up: order equations & graphs\nViva: Arrhenius, Q10 rule",
LIGHT_PURPLE))
story.append(session_row(
"10:30 AM–12:30 PM", "Biochemistry",
"Ch 13: Gene Expression <b>(IMP)</b> – transcription, translation, genetic code, mutations, regulation (operon model), recombinant DNA basics\n"
"Ch 14: Introduction to Clinical Chemistry – normal lab values, clinical significance",
"Write-up: transcription vs translation\nViva: genetic code, mutations",
LIGHT_GREEN))
story.append(session_row(
"2:00–4:00 PM", "Physical Pharmacy",
"Full revision: Dispersion Systems (Colloids, Emulsions, Suspensions) – most important topic\n"
"Review PP Practicals 13–24",
"Write-up practice: emulsion formulation\nPractical notebook – all practicals",
LIGHT_ORANGE))
story.append(session_row(
"4:30–6:00 PM", "Biochemistry",
"Full revision: Carbohydrate metabolism + Lipid metabolism + Bioenergetics\n"
"Review Biochemistry Practicals 13–25",
"Write-up practice: glycolysis & TCA\nPractical notebook – all practicals",
LIGHT_ORANGE))
story.append(session_row(
"8:00–10:00 PM", "Both",
"Viva Practice Session:\n"
"PP: Rheology, Micromeritics, Solutions, Solubilization\n"
"Biochem: Enzymes (Michaelis-Menten), Hormones, Vitamins, Nucleic Acids\n"
"Ask a friend/family to quiz you, or self-quiz from notes",
"Viva preparation – oral practice", LIGHT_RED))
story.append(session_row(
"10:00–11:00 PM", "Both",
"Prepare write-up templates for most likely practical questions in both subjects\n"
"Re-read practical procedure steps carefully",
"Write-up + Practical performance", LIGHT_ORANGE))
story.append(Spacer(1, 10))
# ─── DAY 6 (17 June) ─────────────────────────────────────────────────────────
story.append(section_header("DAY 6 • Wednesday, 17 June 2026 (Final Revision Day)", RED))
story.append(Spacer(1, 4))
story.append(col_header())
story.append(session_row(
"8:00–10:00 AM", "Biochemistry",
"Final sweep: Ch 5, 6, 7, 8, 9, 10, 11, 12, 13 – read headings & key points only\n"
"Re-read important reactions, pathways, and enzyme names",
"Rapid notes review", LIGHT_GREEN))
story.append(session_row(
"10:30 AM–12:30 PM", "Physical Pharmacy",
"Final sweep: Dispersions (Colloids/Emulsions/Suspensions), Rheology, Micromeritics, Solubilization\n"
"Re-read rate/order equations and stability testing notes",
"Rapid notes review", LIGHT_PURPLE))
story.append(session_row(
"2:00–3:30 PM", "Biochemistry",
"Complete Biochemistry practical notebook review – all 25 practicals\n"
"Focus: aim, principle, procedure outline, observations, results",
"Practical performance prep", LIGHT_GREEN))
story.append(session_row(
"4:00–5:30 PM", "Physical Pharmacy",
"Complete Physical Pharmacy practical notebook review – all 24 practicals\n"
"Focus: aim, principle, procedure outline, calculations, results",
"Practical performance prep", LIGHT_PURPLE))
story.append(session_row(
"6:00–8:00 PM", "Both",
"Intensive Viva Q&A self-test:\n"
"Biochemistry: Michaelis-Menten derivation, ETC, urea cycle, DNA replication\n"
"PP: HLB system, zeta potential, Freundlich/Langmuir isotherms, thixotropy, Arrhenius",
"Viva – final preparation", LIGHT_RED))
story.append(session_row(
"8:00–9:00 PM", "Both",
"Organize practical notebook, stationery, and materials for exam\n"
"Light review of any weak points identified today\n"
"Rest well – no late-night cramming after 10 PM",
"Logistics + Rest", LIGHT_ORANGE))
story.append(Spacer(1, 12))
# ══ TOPIC PRIORITY TABLE ══════════════════════════════════════════════════════
story.append(PageBreak())
story.append(section_header("TOPIC PRIORITY MATRIX", DARK_BLUE))
story.append(Spacer(1, 6))
priority_header = [
[Paragraph("Subject", bold_style),
Paragraph("Topic", bold_style),
Paragraph("Priority", bold_style),
Paragraph("Key Points for Viva & Write-up", bold_style)],
]
priority_rows = [
["Biochemistry", "Enzymes (Michaelis-Menten)", "★★★ HIGH", "MM equation, Km, Vmax, inhibition types, Lineweaver-Burk plot"],
["Biochemistry", "Metabolic Fate of Carbohydrates", "★★★ HIGH", "Glycolysis steps, ATP yield, TCA cycle, gluconeogenesis"],
["Biochemistry", "Metabolic Fate of Lipids", "★★★ HIGH", "Beta-oxidation steps, ATP yield, ketogenesis"],
["Biochemistry", "Nucleic Acids", "★★★ HIGH", "DNA double helix, base pairing, RNA types, replication"],
["Biochemistry", "Gene Expression", "★★★ HIGH", "Transcription, translation, genetic code, regulation"],
["Biochemistry", "Bioenergetics", "★★★ HIGH", "ETC complexes, oxidative phosphorylation, ATP synthase"],
["Biochemistry", "Vitamins", "★★ MED", "Fat vs water soluble, deficiency diseases, coenzyme roles"],
["Biochemistry", "Hormones", "★★ MED", "Classification, insulin/glucagon, steroid mechanism"],
["Biochemistry", "Metabolic Fate of Proteins", "★★ MED", "Transamination, urea cycle steps"],
["Biochemistry", "Proteins & Amino Acids", "★ LOW-MED", "Protein levels of structure, essential amino acids"],
["Biochemistry", "Carbohydrates / Lipids basics", "★ LOW-MED", "Classification, chemical properties"],
["Physical Pharmacy", "Dispersion Systems (Colloids/Emulsions/Suspensions)", "★★★ HIGH", "Types, properties, stability, formulation, tests"],
["Physical Pharmacy", "Rheology", "★★★ HIGH", "Flow types, viscosity, thixotropy, pharmaceutical relevance"],
["Physical Pharmacy", "Solubilization", "★★★ HIGH", "CMC, HLB, cosolvency, micellar solubilization"],
["Physical Pharmacy", "Micromeritics", "★★★ HIGH", "Particle size methods, surface area, Stokes' law"],
["Physical Pharmacy", "Rate & Order of Reaction", "★★★ HIGH", "0th/1st/2nd order equations, half-life, Arrhenius"],
["Physical Pharmacy", "Solutions", "★★ MED", "Concentration expressions, Raoult's law, colligative properties"],
["Physical Pharmacy", "Ionization", "★★ MED", "Henderson-Hasselbalch, pH-partition hypothesis"],
["Physical Pharmacy", "Physicochemical Processes (Misc.)", "★★ MED", "Lyophilization, spray drying, polymorphism"],
["Physical Pharmacy", "Adsorption", "★★ MED", "Isotherms (Freundlich, Langmuir), pharmaceutical applications"],
["Physical Pharmacy", "Hydrolysis", "★ LOW-MED", "Types, kinetics, stabilization strategies"],
["Physical Pharmacy", "Extraction Processes", "★ LOW-MED", "Maceration, percolation, solvents"],
["Physical Pharmacy", "Distillation & Crystallization", "★ LOW-MED", "Types of distillation, polymorphism"],
]
all_priority_data = priority_header[:]
for row in priority_rows:
all_priority_data.append([Paragraph(row[0], body_style), Paragraph(row[1], body_style),
Paragraph(row[2], bold_style if "HIGH" in row[2] else body_style),
Paragraph(row[3], small_style)])
priority_table = Table(all_priority_data, colWidths=[doc.width*0.16, doc.width*0.28, doc.width*0.14, doc.width*0.42])
ts = TableStyle([
("BACKGROUND", (0,0), (-1,0), MID_BLUE),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,-1), 8.5),
("TOPPADDING", (0,0), (-1,-1), 4),
("BOTTOMPADDING", (0,0), (-1,-1), 4),
("LEFTPADDING", (0,0), (-1,-1), 5),
("RIGHTPADDING", (0,0), (-1,-1), 5),
("VALIGN", (0,0), (-1,-1), "TOP"),
("GRID", (0,0), (-1,-1), 0.3, colors.HexColor("#D1D5DB")),
("ROWBACKGROUNDS", (0,1), (-1,-1), [WHITE, LIGHT_GRAY]),
])
# Colour HIGH rows
for i, row in enumerate(priority_rows):
r = i + 1
if "HIGH" in row[2]:
ts.add("BACKGROUND", (2,r), (2,r), colors.HexColor("#FEE2E2"))
ts.add("TEXTCOLOR", (2,r), (2,r), RED)
elif "MED" in row[2]:
ts.add("BACKGROUND", (2,r), (2,r), colors.HexColor("#FEF9C3"))
ts.add("TEXTCOLOR", (2,r), (2,r), colors.HexColor("#92400E"))
else:
ts.add("TEXTCOLOR", (2,r), (2,r), GREEN)
priority_table.setStyle(ts)
story.append(priority_table)
story.append(Spacer(1, 12))
# ══ TIPS BOX ══════════════════════════════════════════════════════════════════
tips_header = Table(
[[Paragraph(" EXAM TIPS & STRATEGIES", section_header_style)]],
colWidths=[doc.width])
tips_header.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), GREEN),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LINEBELOW", (0,0), (-1,-1), 2, ACCENT_GOLD),
]))
story.append(tips_header)
story.append(Spacer(1, 6))
tips = [
("Write-up (20 marks):",
"Always write: Aim, Principle/Theory, Apparatus/Reagents, Procedure (numbered steps), Observations/Results, Discussion, Conclusion. "
"Neat diagrams with labels earn bonus marks. Maintain a consistent format throughout."),
("Practical Performance (40 marks):",
"Handle glassware carefully and work systematically. Show all calculations clearly. "
"If uncertain of a step, state it calmly to the examiner. Accuracy and cleanliness matter."),
("Viva Voce (40 marks):",
"Listen to the question fully before answering. Start with definitions, then explain mechanisms. "
"For Biochemistry: know all pathway diagrams and enzyme names. "
"For Physical Pharmacy: know all equations and their derivations. "
"If you don't know something, say 'I am not sure but I think...' rather than staying silent."),
("Daily Study Tips:",
"Use active recall: close your book and write what you remember. "
"Draw diagrams from memory (ETC, glycolysis, emulsification). "
"Make flash cards for vitamin deficiency diseases, hormone functions, and PP equations."),
("18–19 June (Day before Biochemistry):",
"Light review only. Sleep by 11 PM. Eat well, stay hydrated. "
"Carry your practical notebook, pens, pencils, ruler, and calculator."),
("19–20 June (Day between exams):",
"After Biochemistry exam, spend 2–3 hours on a Physical Pharmacy final recap. "
"Focus on Dispersions, Rheology, and Rate of Reactions. Rest well before PP exam."),
]
for heading, text in tips:
tips_data = [[
Paragraph(f"<b>{heading}</b>", bold_style),
Paragraph(text, body_style),
]]
tips_t = Table(tips_data, colWidths=[doc.width*0.25, doc.width*0.75])
tips_t.setStyle(TableStyle([
("BACKGROUND", (0,0), (0,0), LIGHT_GREEN),
("BACKGROUND", (1,0), (1,0), WHITE),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("VALIGN", (0,0), (-1,-1), "TOP"),
("LINEBELOW", (0,0), (-1,-1), 0.3, colors.HexColor("#D1D5DB")),
]))
story.append(tips_t)
story.append(Spacer(1, 12))
# ══ FOOTER ═══════════════════════════════════════════════════════════════════
footer_data = [[
Paragraph(
"Prepared for Ramzan Hafeez | Akhtar Saeed College of Pharmacy, Canal Campus | University of the Punjab, Lahore | Generated: 12 June 2026",
ParagraphStyle("footer", fontSize=7.5, textColor=WHITE, alignment=TA_CENTER,
fontName="Helvetica", leading=12)
)
]]
footer_table = Table(footer_data, colWidths=[doc.width])
footer_table.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), DARK_BLUE),
("TOPPADDING", (0,0), (-1,-1), 7),
("BOTTOMPADDING", (0,0), (-1,-1), 7),
("LINEABOVE", (0,0), (-1,-1), 2, ACCENT_GOLD),
]))
story.append(footer_table)
# ── BUILD ─────────────────────────────────────────────────────────────────────
doc.build(story)
print(f"PDF saved to: {output_path}")
cd /home/daytona/workspace/study-plan && python ramzan_study_plan.py
| Day | Date | Focus |
|---|---|---|
| Day 1 | 12 June (Evening) | Biochemistry Ch 1-2 + PP Solutions & History |
| Day 2 | 13 June | Biochemistry Ch 3-6 + PP Solubilization, Ionization, Adsorption, Micromeritics |
| Day 3 | 14 June | Biochemistry Ch 7-9 + PP Colloids, Emulsions, Suspensions, Rheology |
| Day 4 | 15 June | Biochemistry Ch 10-12 + PP Rheology, Physicochemical Processes, Extraction |
| Day 5 | 16 June | Biochemistry Ch 13-14 + PP Kinetics/Stability - then full revision + viva practice |
| Day 6 | 17 June | Final rapid sweep both subjects + full practical notebooks + intensive viva Q&A |
Ramzan Hafeez Study Plan
PDF Document · PDF
Create a daily schedule spreadsheet to track completion status
~/study-plan/build_tracker.py
import openpyxl
from openpyxl.styles import (
PatternFill, Font, Alignment, Border, Side, GradientFill
)
from openpyxl.utils import get_column_letter
from openpyxl.formatting.rule import DataBarRule, ColorScaleRule, CellIsRule, FormulaRule
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.chart import BarChart, Reference
from openpyxl.chart.series import DataPoint
import openpyxl.chart as chart_mod
OUTPUT = "/home/daytona/workspace/study-plan/Ramzan_Hafeez_Study_Tracker.xlsx"
wb = openpyxl.Workbook()
# ── Colour palette ────────────────────────────────────────────────────────────
C = {
"dark_blue": "1A3C6E",
"mid_blue": "2563EB",
"light_blue": "DBEAFE",
"accent_gold": "F59E0B",
"green": "16A34A",
"light_green": "DCFCE7",
"purple": "7C3AED",
"light_purple": "EDE9FE",
"orange": "EA580C",
"light_orange": "FEF3C7",
"red": "DC2626",
"light_red": "FEE2E2",
"gray": "6B7280",
"light_gray": "F3F4F6",
"white": "FFFFFF",
"black": "000000",
"done_green": "BBF7D0",
"pending_yel": "FEF9C3",
"skip_red": "FECACA",
"yellow": "FDE68A",
}
def fill(hex_color):
return PatternFill("solid", fgColor=hex_color)
def font(bold=False, color="000000", size=10, italic=False, name="Arial"):
return Font(bold=bold, color=color, size=size, italic=italic, name=name)
def align(h="left", v="center", wrap=False):
return Alignment(horizontal=h, vertical=v, wrap_text=wrap)
def border(style="thin", color="D1D5DB"):
s = Side(style=style, color=color)
return Border(left=s, right=s, top=s, bottom=s)
def thick_bottom(color="1A3C6E"):
s_thick = Side(style="medium", color=color)
s_thin = Side(style="thin", color="D1D5DB")
return Border(left=s_thin, right=s_thin, top=s_thin, bottom=s_thick)
def set_cell(ws, row, col, value, bold=False, fg=None, fc="000000",
size=10, h="left", wrap=False, italic=False, border_=True,
num_fmt=None):
c = ws.cell(row=row, column=col, value=value)
c.font = font(bold=bold, color=fc, size=size, italic=italic)
c.alignment = align(h=h, v="center", wrap=wrap)
if fg:
c.fill = fill(fg)
if border_:
c.border = border()
if num_fmt:
c.number_format = num_fmt
return c
# ══════════════════════════════════════════════════════════════════════════════
# SHEET 1 – DASHBOARD
# ══════════════════════════════════════════════════════════════════════════════
ws_dash = wb.active
ws_dash.title = "📊 Dashboard"
ws_dash.sheet_view.showGridLines = False
# column widths
col_widths_dash = {1:3, 2:26, 3:18, 4:18, 5:18, 6:18, 7:18, 8:18, 9:3}
for col, w in col_widths_dash.items():
ws_dash.column_dimensions[get_column_letter(col)].width = w
# row heights
ws_dash.row_dimensions[1].height = 8
ws_dash.row_dimensions[2].height = 42
ws_dash.row_dimensions[3].height = 22
ws_dash.row_dimensions[4].height = 8
ws_dash.row_dimensions[5].height = 20
ws_dash.row_dimensions[6].height = 20
ws_dash.row_dimensions[7].height = 20
ws_dash.row_dimensions[8].height = 8
# Title banner (merge B2:H2)
ws_dash.merge_cells("B2:H2")
t = ws_dash["B2"]
t.value = "EXAM PREPARATION PROGRESS TRACKER — RAMZAN HAFEEZ"
t.font = Font(bold=True, color="FFFFFF", size=16, name="Arial")
t.fill = fill(C["dark_blue"])
t.alignment = align(h="center", v="center")
# Sub-banner
ws_dash.merge_cells("B3:H3")
s = ws_dash["B3"]
s.value = "Akhtar Saeed College of Pharmacy, Canal Campus | University of the Punjab, Lahore | Exams: 19 Jun (Biochemistry) & 20 Jun (Physical Pharmacy)"
s.font = Font(bold=False, color=C["dark_blue"], size=9, name="Arial")
s.fill = fill(C["light_blue"])
s.alignment = align(h="center", v="center")
# Section label row 5
ws_dash.merge_cells("B5:D5")
ws_dash["B5"].value = "SUBJECT"
ws_dash["B5"].font = Font(bold=True, color="FFFFFF", size=10, name="Arial")
ws_dash["B5"].fill = fill(C["mid_blue"])
ws_dash["B5"].alignment = align(h="center")
ws_dash["E5"].value = "TOTAL SESSIONS"
ws_dash["E5"].font = Font(bold=True, color="FFFFFF", size=10, name="Arial")
ws_dash["E5"].fill = fill(C["mid_blue"])
ws_dash["E5"].alignment = align(h="center")
ws_dash["F5"].value = "DONE"
ws_dash["F5"].font = Font(bold=True, color="FFFFFF", size=10, name="Arial")
ws_dash["F5"].fill = fill(C["mid_blue"])
ws_dash["F5"].alignment = align(h="center")
ws_dash["G5"].value = "REMAINING"
ws_dash["G5"].font = Font(bold=True, color="FFFFFF", size=10, name="Arial")
ws_dash["G5"].fill = fill(C["mid_blue"])
ws_dash["G5"].alignment = align(h="center")
ws_dash["H5"].value = "% COMPLETE"
ws_dash["H5"].font = Font(bold=True, color="FFFFFF", size=10, name="Arial")
ws_dash["H5"].fill = fill(C["mid_blue"])
ws_dash["H5"].alignment = align(h="center")
# Data rows (formulas will pull from tracker sheets)
subjects = [
("Biochemistry", "📗 Biochemistry", C["light_green"], C["green"]),
("Physical Pharmacy", "📘 Physical Pharmacy", C["light_purple"], C["purple"]),
("OVERALL", "🎯 OVERALL TOTAL", C["light_blue"], C["dark_blue"]),
]
# We'll hardcode the COUNTIF formulas referencing the tracker sheets later
# For now set up the structure; we'll fill formulas after building tracker sheets
for i, (key, label, bg, fc) in enumerate(subjects):
r = 6 + i
ws_dash.row_dimensions[r].height = 22
ws_dash.merge_cells(f"B{r}:D{r}")
c = ws_dash[f"B{r}"]
c.value = label
c.font = Font(bold=(key=="OVERALL"), color=fc, size=10, name="Arial")
c.fill = fill(bg)
c.alignment = align(h="left", v="center")
c.border = border()
for col_letter in ["E", "F", "G", "H"]:
ws_dash[f"{col_letter}{r}"].fill = fill(bg)
ws_dash[f"{col_letter}{r}"].font = Font(bold=(key=="OVERALL"), color="000000", size=10, name="Arial")
ws_dash[f"{col_letter}{r}"].alignment = align(h="center", v="center")
ws_dash[f"{col_letter}{r}"].border = border()
# Apply borders to header row 5
for col_letter in ["B","C","D","E","F","G","H"]:
ws_dash[f"{col_letter}5"].border = border()
# Instructions block
ws_dash.row_dimensions[9].height = 16
ws_dash.row_dimensions[10].height = 18
ws_dash.row_dimensions[11].height = 18
ws_dash.row_dimensions[12].height = 18
ws_dash.row_dimensions[13].height = 18
ws_dash.row_dimensions[14].height = 18
ws_dash.row_dimensions[15].height = 18
ws_dash.row_dimensions[16].height = 18
ws_dash.merge_cells("B9:H9")
ws_dash["B9"].value = "HOW TO USE THIS TRACKER"
ws_dash["B9"].font = Font(bold=True, color="FFFFFF", size=10, name="Arial")
ws_dash["B9"].fill = fill(C["dark_blue"])
ws_dash["B9"].alignment = align(h="left", v="center")
instructions = [
("Step 1:", "Go to the '📗 Biochemistry' or '📘 Physical Pharmacy' tab to see your daily sessions."),
("Step 2:", "In the STATUS column, click the cell and choose from the dropdown: ✅ Done | ⏳ In Progress | ⏭ Skipped | ☐ Pending"),
("Step 3:", "The row will change colour automatically when you mark it Done (green), In Progress (yellow), or Skipped (red)."),
("Step 4:", "The Dashboard above will update automatically to show your total progress percentage."),
("Step 5:", "Use the NOTES column to jot down anything important (difficult topics, questions to ask, etc.)."),
("Exam Dates:", "📗 Biochemistry Practical → 19 June 2026 (Friday) | 📘 Physical Pharmacy Practical → 20 June 2026 (Saturday)"),
("Marks:", "Write-up: 20 | Practical Performance: 40 | Viva Voce: 40 | TOTAL: 100 marks per subject"),
]
for i, (label, text) in enumerate(instructions):
r = 10 + i
ws_dash[f"B{r}"].value = label
ws_dash[f"B{r}"].font = Font(bold=True, color=C["dark_blue"], size=9, name="Arial")
ws_dash[f"B{r}"].fill = fill(C["light_blue"])
ws_dash[f"B{r}"].alignment = align(h="left", v="center")
ws_dash[f"B{r}"].border = border()
ws_dash.merge_cells(f"C{r}:H{r}")
ws_dash[f"C{r}"].value = text
ws_dash[f"C{r}"].font = Font(bold=False, color="000000", size=9, name="Arial")
ws_dash[f"C{r}"].fill = fill(C["white"])
ws_dash[f"C{r}"].alignment = align(h="left", v="center", wrap=True)
ws_dash[f"C{r}"].border = border()
# ══════════════════════════════════════════════════════════════════════════════
# BUILDER FUNCTION FOR TRACKER SHEETS
# ══════════════════════════════════════════════════════════════════════════════
STATUS_OPTS = '"✅ Done,⏳ In Progress,⏭ Skipped,☐ Pending"'
def build_tracker_sheet(wb, sheet_name, title_text, accent_color, light_color, sessions):
"""
sessions: list of dicts with keys:
day, date, time, topics, marks_focus, priority
"""
ws = wb.create_sheet(sheet_name)
ws.sheet_view.showGridLines = False
# Column widths
ws.column_dimensions["A"].width = 3
ws.column_dimensions["B"].width = 12 # Day
ws.column_dimensions["C"].width = 14 # Date
ws.column_dimensions["D"].width = 16 # Time
ws.column_dimensions["E"].width = 48 # Topics
ws.column_dimensions["F"].width = 24 # Focus
ws.column_dimensions["G"].width = 8 # Priority
ws.column_dimensions["H"].width = 18 # Status
ws.column_dimensions["I"].width = 36 # Notes
ws.column_dimensions["J"].width = 3
ws.row_dimensions[1].height = 8
ws.row_dimensions[2].height = 38
ws.row_dimensions[3].height = 20
ws.row_dimensions[4].height = 8
ws.row_dimensions[5].height = 20
# Title
ws.merge_cells("B2:I2")
t = ws["B2"]
t.value = title_text
t.font = Font(bold=True, color="FFFFFF", size=14, name="Arial")
t.fill = fill(accent_color)
t.alignment = align(h="center", v="center")
# Sub-header
ws.merge_cells("B3:I3")
s = ws["B3"]
s.value = "Update STATUS column daily | Green = Done | Yellow = In Progress | Red = Skipped | White = Pending"
s.font = Font(bold=False, color=accent_color, size=9, name="Arial")
s.fill = fill(light_color)
s.alignment = align(h="center", v="center")
# Column headers row 5
headers = ["Day", "Date", "Time Slot", "Topics to Cover", "Focus Area (Exam Component)", "Priority", "Status", "Notes / Observations"]
header_cols = ["B","C","D","E","F","G","H","I"]
for col_letter, hdr in zip(header_cols, headers):
c = ws[f"{col_letter}5"]
c.value = hdr
c.font = Font(bold=True, color="FFFFFF", size=9, name="Arial")
c.fill = fill(accent_color)
c.alignment = align(h="center", v="center", wrap=True)
c.border = border()
# Data validation for Status column
dv = DataValidation(type="list", formula1=STATUS_OPTS, allow_blank=True)
dv.error = "Choose from the dropdown list."
dv.errorTitle = "Invalid Entry"
dv.prompt = "Select status"
dv.promptTitle= "Status"
ws.add_data_validation(dv)
data_start = 6
prev_day = None
for i, s in enumerate(sessions):
r = data_start + i
ws.row_dimensions[r].height = s.get("row_height", 36)
day_changed = (s["day"] != prev_day)
prev_day = s["day"]
# Alternate day background for readability
day_num = int(s["day"].replace("Day ", ""))
row_bg = light_color if day_num % 2 == 1 else "FFFFFF"
# B – Day
c = ws.cell(row=r, column=2, value=s["day"])
c.font = Font(bold=True, color=accent_color, size=9, name="Arial")
c.fill = fill(light_color if day_changed else row_bg)
c.alignment = align(h="center", v="center")
c.border = border()
# C – Date
c = ws.cell(row=r, column=3, value=s["date"])
c.font = Font(bold=False, color="000000", size=9, name="Arial")
c.fill = fill(row_bg)
c.alignment = align(h="center", v="center", wrap=True)
c.border = border()
# D – Time
c = ws.cell(row=r, column=4, value=s["time"])
c.font = Font(bold=False, color="000000", size=9, name="Arial")
c.fill = fill(row_bg)
c.alignment = align(h="center", v="center")
c.border = border()
# E – Topics
c = ws.cell(row=r, column=5, value=s["topics"])
c.font = Font(bold=False, color="000000", size=9, name="Arial")
c.fill = fill(row_bg)
c.alignment = align(h="left", v="center", wrap=True)
c.border = border()
# F – Focus
c = ws.cell(row=r, column=6, value=s["focus"])
c.font = Font(bold=False, color="000000", size=9, name="Arial")
c.fill = fill(row_bg)
c.alignment = align(h="left", v="center", wrap=True)
c.border = border()
# G – Priority
p = s["priority"]
p_color = "DC2626" if p == "HIGH" else ("92400E" if p == "MED" else "374151")
p_bg = "FEE2E2" if p == "HIGH" else ("FEF9C3" if p == "MED" else "F3F4F6")
c = ws.cell(row=r, column=7, value=p)
c.font = Font(bold=True, color=p_color, size=8, name="Arial")
c.fill = fill(p_bg)
c.alignment = align(h="center", v="center")
c.border = border()
# H – Status (default Pending)
c = ws.cell(row=r, column=8, value="☐ Pending")
c.font = Font(bold=False, color="6B7280", size=9, name="Arial")
c.fill = fill("FFFFFF")
c.alignment = align(h="center", v="center")
c.border = border()
dv.add(c)
# I – Notes
c = ws.cell(row=r, column=9, value="")
c.font = Font(bold=False, color="374151", size=9, italic=True, name="Arial")
c.fill = fill("FAFAFA")
c.alignment = align(h="left", v="center", wrap=True)
c.border = border()
total_rows = len(sessions)
last_row = data_start + total_rows - 1
# Conditional formatting for STATUS column H
# ✅ Done → green bg
done_fill = PatternFill("solid", fgColor=C["done_green"])
prog_fill = PatternFill("solid", fgColor=C["pending_yel"])
skip_fill = PatternFill("solid", fgColor=C["skip_red"])
status_range = f"B{data_start}:I{last_row}"
ws.conditional_formatting.add(
f"H{data_start}:H{last_row}",
CellIsRule(operator="equal", formula=['"✅ Done"'],
fill=PatternFill("solid", fgColor="BBF7D0"),
font=Font(bold=True, color="166534", name="Arial"))
)
ws.conditional_formatting.add(
f"H{data_start}:H{last_row}",
CellIsRule(operator="equal", formula=['"⏳ In Progress"'],
fill=PatternFill("solid", fgColor="FDE68A"),
font=Font(bold=True, color="92400E", name="Arial"))
)
ws.conditional_formatting.add(
f"H{data_start}:H{last_row}",
CellIsRule(operator="equal", formula=['"⏭ Skipped"'],
fill=PatternFill("solid", fgColor="FECACA"),
font=Font(bold=True, color="991B1B", name="Arial"))
)
# Full-row green when done (columns B:I)
ws.conditional_formatting.add(
f"B{data_start}:I{last_row}",
FormulaRule(formula=[f'$H{data_start}="✅ Done"'],
fill=PatternFill("solid", fgColor="F0FDF4"))
)
ws.conditional_formatting.add(
f"B{data_start}:I{last_row}",
FormulaRule(formula=[f'$H{data_start}="⏳ In Progress"'],
fill=PatternFill("solid", fgColor="FFFBEB"))
)
ws.conditional_formatting.add(
f"B{data_start}:I{last_row}",
FormulaRule(formula=[f'$H{data_start}="⏭ Skipped"'],
fill=PatternFill("solid", fgColor="FFF1F2"))
)
# Summary row at bottom
summary_r = last_row + 2
ws.row_dimensions[summary_r].height = 20
ws.merge_cells(f"B{summary_r}:D{summary_r}")
ws[f"B{summary_r}"].value = "PROGRESS SUMMARY"
ws[f"B{summary_r}"].font = Font(bold=True, color="FFFFFF", size=9, name="Arial")
ws[f"B{summary_r}"].fill = fill(accent_color)
ws[f"B{summary_r}"].alignment = align(h="left", v="center")
ws[f"B{summary_r}"].border = border()
labels = ["Total Sessions", "✅ Done", "⏳ In Progress", "⏭ Skipped", "☐ Pending", "% Complete"]
formulas = [
total_rows,
f'=COUNTIF(H{data_start}:H{last_row},"✅ Done")',
f'=COUNTIF(H{data_start}:H{last_row},"⏳ In Progress")',
f'=COUNTIF(H{data_start}:H{last_row},"⏭ Skipped")',
f'=COUNTIF(H{data_start}:H{last_row},"☐ Pending")',
f'=COUNTIF(H{data_start}:H{last_row},"✅ Done")/{total_rows}',
]
fmts = [None, None, None, None, None, "0.0%"]
colors_ = ["F3F4F6","BBF7D0","FDE68A","FECACA","FFFFFF", "DBEAFE"]
fcolors = ["374151","166534","92400E","991B1B","6B7280", "1E3A8A"]
for j, (lbl, fml, fmt, bg, fc) in enumerate(zip(labels, formulas, fmts, colors_, fcolors)):
col = 5 + j # columns E, F, G, H, I... — adjust to fit
# label in summary_r, value in summary_r+1
lc = ws.cell(row=summary_r, column=col, value=lbl)
lc.font = Font(bold=True, color="FFFFFF", size=8, name="Arial")
lc.fill = fill(accent_color)
lc.alignment = align(h="center", v="center")
lc.border = border()
vc = ws.cell(row=summary_r+1, column=col, value=fml)
vc.font = Font(bold=True, color=fc, size=10, name="Arial")
vc.fill = fill(bg)
vc.alignment = align(h="center", v="center")
vc.border = border()
if fmt:
vc.number_format = fmt
ws.row_dimensions[summary_r+1].height = 22
# Merge B in summary_r+1 for spacing
ws.merge_cells(f"B{summary_r+1}:D{summary_r+1}")
ws[f"B{summary_r+1}"].value = f"Sheet: {sheet_name}"
ws[f"B{summary_r+1}"].font = Font(bold=False, color="6B7280", size=8, italic=True, name="Arial")
ws[f"B{summary_r+1}"].fill = fill("F9FAFB")
ws[f"B{summary_r+1}"].alignment = align(h="left", v="center")
ws[f"B{summary_r+1}"].border = border()
return ws, data_start, last_row, total_rows
# ══════════════════════════════════════════════════════════════════════════════
# BIOCHEMISTRY SESSIONS
# ══════════════════════════════════════════════════════════════════════════════
bio_sessions = [
# DAY 1
{"day":"Day 1", "date":"12 Jun 2026\n(Fri — Eve)",
"time":"9:00–10:30 PM",
"topics":"Ch 1: Basic Biochemistry — cell structure, biomolecules overview, water & pH concepts\nCh 2: Carbohydrates — monosaccharides, disaccharides, polysaccharides; qualitative tests (Benedict's, Fehling's, Barfoed's, Molisch's)",
"focus":"Write-up: definitions & classifications\nViva: carbohydrate tests & reducing sugars", "priority":"MED", "row_height":52},
# DAY 2
{"day":"Day 2", "date":"13 Jun 2026\n(Saturday)",
"time":"8:00–10:00 AM",
"topics":"Ch 3: Lipids — classification (simple, complex, derived), fatty acids (saturated vs unsaturated), phospholipids, steroids, waxes\nCh 4: Proteins & Amino Acids — classification, peptide bond, protein structure (primary to quaternary), denaturation",
"focus":"Write-up: lipid & protein classification tables\nViva: protein denaturation, isoelectric point", "priority":"MED", "row_height":52},
{"day":"Day 2", "date":"13 Jun 2026\n(Saturday)",
"time":"2:00–4:00 PM",
"topics":"Ch 5: Nucleic Acids (IMP) — DNA double helix (Watson-Crick model), nucleotide structure, base pairing (A-T, G-C), supercoiling; types of RNA (mRNA, tRNA, rRNA) and their functions",
"focus":"Write-up: DNA double helix diagram\nViva: differences between DNA & RNA, base pairs", "priority":"HIGH", "row_height":52},
{"day":"Day 2", "date":"13 Jun 2026\n(Saturday)",
"time":"8:00–10:00 PM",
"topics":"Ch 6: Vitamins (IMP) — Fat-soluble: A, D, E, K (sources, functions, deficiency diseases); Water-soluble: B1, B2, B3, B5, B6, B9, B12, C (coenzyme roles, deficiency)\nReview Biochemistry Practicals 1–6",
"focus":"Write-up: vitamin summary table\nViva: coenzyme forms, deficiency diseases\nPractical notebook review", "priority":"HIGH", "row_height":60},
# DAY 3
{"day":"Day 3", "date":"14 Jun 2026\n(Sunday)",
"time":"8:00–10:30 AM",
"topics":"Ch 7: Hormones (IMP) — Classification (peptide, steroid, amine-derived); mechanism of action (membrane vs intracellular receptors); key hormones: insulin, glucagon, thyroid hormones, cortisol, sex hormones, ADH, growth hormone",
"focus":"Write-up: hormone classification table\nViva: insulin vs glucagon actions, second messenger", "priority":"HIGH", "row_height":52},
{"day":"Day 3", "date":"14 Jun 2026\n(Sunday)",
"time":"2:00–4:30 PM",
"topics":"Ch 8: Enzymes (IMP) — Classification (EC numbers), cofactors & coenzymes, active site; Michaelis-Menten equation (derivation), Km & Vmax significance; enzyme inhibition: competitive, non-competitive, uncompetitive; Lineweaver-Burk double reciprocal plot",
"focus":"Write-up: MM equation derivation, inhibition graphs\nViva: Km meaning, inhibition types differences", "priority":"HIGH", "row_height":60},
{"day":"Day 3", "date":"14 Jun 2026\n(Sunday)",
"time":"8:00–10:30 PM",
"topics":"Ch 9: Metabolic Fate of Carbohydrates (IMP) — Glycolysis: all 10 steps, enzymes, ATP yield; TCA cycle: overview, key enzymes, products; Glycogenesis & Glycogenolysis; Gluconeogenesis: substrates & bypass reactions",
"focus":"Write-up: glycolysis pathway diagram\nViva: ATP yield per glucose, key regulatory enzymes", "priority":"HIGH", "row_height":52},
# DAY 4
{"day":"Day 4", "date":"15 Jun 2026\n(Monday)",
"time":"10:30 AM–12:30 PM",
"topics":"Ch 10: Metabolic Fate of Lipids (IMP) — Beta-oxidation of saturated fatty acids (4 steps, repeat cycle), ATP yield calculation; ketone body formation (ketogenesis) and utilization; overview of fatty acid synthesis (acetyl-CoA carboxylase, FAS complex)",
"focus":"Write-up: beta-oxidation step diagram\nViva: ATP yield calculation for palmitic acid, ketogenesis", "priority":"HIGH", "row_height":52},
{"day":"Day 4", "date":"15 Jun 2026\n(Monday)",
"time":"4:30–6:30 PM",
"topics":"Ch 11: Metabolic Fate of Proteins & Amino Acids (IMP) — Transamination, deamination (oxidative), urea cycle (all 5 steps, enzymes, organs involved); essential vs non-essential amino acids; amino acid catabolism overview",
"focus":"Write-up: urea cycle diagram\nViva: transamination vs deamination, urea cycle organs", "priority":"HIGH", "row_height":52},
{"day":"Day 4", "date":"15 Jun 2026\n(Monday)",
"time":"9:30–11:00 PM",
"topics":"Ch 12: Bioenergetics (IMP) — ATP structure & high-energy bonds; Electron Transport Chain (Complexes I–IV), electron carriers (NADH, FADH2, coenzyme Q, cytochrome c); oxidative phosphorylation, ATP synthase (chemiosmotic theory); P/O ratio, uncouplers",
"focus":"Write-up: ETC diagram with complexes\nViva: P/O ratio, how uncouplers work, total ATP from glucose", "priority":"HIGH", "row_height":60},
# DAY 5
{"day":"Day 5", "date":"16 Jun 2026\n(Tuesday)",
"time":"10:30 AM–12:30 PM",
"topics":"Ch 13: Gene Expression (IMP) — Transcription: RNA polymerase, promoter, template strand, mRNA processing (capping, polyadenylation, splicing); Translation: ribosomes, codons, aminoacyl-tRNA, elongation cycle; genetic code properties; operon model (lac operon); mutations types\nCh 14: Clinical Chemistry — normal lab values, clinical significance of key tests",
"focus":"Write-up: transcription vs translation comparison\nViva: genetic code degeneracy, lac operon regulation", "priority":"HIGH", "row_height":68},
{"day":"Day 5", "date":"16 Jun 2026\n(Tuesday)",
"time":"4:30–6:00 PM",
"topics":"FULL REVISION — Carbohydrate metabolism + Lipid metabolism + Bioenergetics (Chs 9, 10, 12)\nReview Biochemistry Practicals 13–25 in notebook",
"focus":"Write-up practice: full glycolysis & TCA write-up\nPractical notebook — all 25 practicals reviewed", "priority":"HIGH", "row_height":44},
{"day":"Day 5", "date":"16 Jun 2026\n(Tuesday)",
"time":"8:00–10:00 PM",
"topics":"VIVA PRACTICE SESSION — Biochemistry\nKey topics: Michaelis-Menten derivation, ETC complexes, urea cycle, DNA replication, hormone mechanisms, vitamin coenzyme roles, glycolysis enzymes\nSelf-quiz or ask someone to question you",
"focus":"Viva oral practice\nWrite 10 expected viva Qs and answer them", "priority":"HIGH", "row_height":52},
# DAY 6
{"day":"Day 6", "date":"17 Jun 2026\n(Wednesday)",
"time":"8:00–10:00 AM",
"topics":"FINAL SWEEP — Biochemistry: Read headings & key points of Chs 5,6,7,8,9,10,11,12,13\nFocus on: enzyme names, pathway steps, ATP yields, vitamin functions, hormone names",
"focus":"Rapid notes review only\nNo new learning today", "priority":"HIGH", "row_height":44},
{"day":"Day 6", "date":"17 Jun 2026\n(Wednesday)",
"time":"2:00–3:30 PM",
"topics":"Complete Biochemistry Practical Notebook Review — all 25 practicals\nFocus: Aim, Principle, Procedure outline, Observations, Results, Precautions",
"focus":"Practical performance preparation\nMemorize procedure steps for likely practicals", "priority":"HIGH", "row_height":44},
{"day":"Day 6", "date":"17 Jun 2026\n(Wednesday)",
"time":"6:00–8:00 PM",
"topics":"INTENSIVE VIVA Q&A — Final Biochemistry session\nMust-know: Michaelis-Menten, ETC, urea cycle, DNA double helix, gene expression, metabolic pathways ATP yields\nOrganize notebook & materials for 19 Jun exam",
"focus":"Final viva preparation\nPack exam materials tonight", "priority":"HIGH", "row_height":52},
]
# ══════════════════════════════════════════════════════════════════════════════
# PHYSICAL PHARMACY SESSIONS
# ══════════════════════════════════════════════════════════════════════════════
pp_sessions = [
# DAY 1
{"day":"Day 1", "date":"12 Jun 2026\n(Fri — Eve)",
"time":"10:30–11:30 PM",
"topics":"Ch 1: Orientation, History & Literature of Pharmacy — historical milestones, pharmacopoeias (BP, USP, IP), drug standards\nCh 2a: Solutions — types of solutions, concentration expressions (%, w/v, molarity, molality, normality), ideal vs real solutions, Raoult's law, colligative properties",
"focus":"Write-up: concentration calculations\nViva: colligative properties, Raoult's law", "priority":"MED", "row_height":52},
# DAY 2
{"day":"Day 2", "date":"13 Jun 2026\n(Saturday)",
"time":"10:30 AM–12:30 PM",
"topics":"Ch 2b: Solubilization (IMP) — factors affecting solubility, solubilizing agents; micelle formation, critical micelle concentration (CMC), HLB system; cosolvency, complexation, prodrug approach; solubilization in pharmacy practice",
"focus":"Write-up: HLB system & micellar solubilization\nViva: CMC, HLB values, cosolvency examples", "priority":"HIGH", "row_height":52},
{"day":"Day 2", "date":"13 Jun 2026\n(Saturday)",
"time":"4:30–6:30 PM",
"topics":"Ch 2d: Ionization — degree of ionization, pKa & pKb, Henderson-Hasselbalch equation (acids & bases), pH-partition hypothesis (drug absorption), effect of ionization on solubility\nCh 2c: Adsorption — physical vs chemical adsorption, Freundlich isotherm, Langmuir isotherm (equations & linearization), pharmaceutical applications",
"focus":"Write-up: Henderson-Hasselbalch derivation; isotherm equations\nViva: pH-partition hypothesis, isotherm differences", "priority":"MED", "row_height":60},
{"day":"Day 2", "date":"13 Jun 2026\n(Saturday)",
"time":"10:00–11:00 PM",
"topics":"Ch 2f: Micromeritics (IMP) — particle size & distribution (mean, median, mode), surface area, methods of size determination: sieving (USP sieves), microscopy, Coulter counter, laser diffraction; Stokes' law; equivalent diameters; powder flow properties",
"focus":"Write-up: particle size methods comparison\nViva: Stokes' law, USP sieve numbers, surface area calculations", "priority":"HIGH", "row_height":52},
# DAY 3
{"day":"Day 3", "date":"14 Jun 2026\n(Sunday)",
"time":"11:00 AM–1:00 PM",
"topics":"Ch 3a: Colloids (IMP) — types of colloidal systems (lyophilic, lyophobic, association), properties: Tyndall effect, Brownian motion, electrophoresis, zeta potential; protective colloids; preparation & purification; pharmaceutical applications (colloidal drug delivery)",
"focus":"Write-up: colloidal properties list with examples\nViva: zeta potential significance, lyophilic vs lyophobic stability", "priority":"HIGH", "row_height":52},
{"day":"Day 3", "date":"14 Jun 2026\n(Sunday)",
"time":"5:00–7:00 PM",
"topics":"Ch 3b: Emulsions (IMP) — O/W vs W/O identification tests, emulsifying agents (natural, synthetic), HLB system for emulsifier selection, stability (creaming, flocculation, coalescence, Ostwald ripening), preparation methods, evaluation tests\nReview PP Practicals 1–6",
"focus":"Write-up: HLB selection, emulsion evaluation\nViva: O/W vs W/O difference, stability problems\nPractical notebook review", "priority":"HIGH", "row_height":60},
{"day":"Day 3", "date":"14 Jun 2026\n(Sunday)",
"time":"10:30–11:30 PM",
"topics":"Ch 3c: Suspensions (IMP) — flocculated vs deflocculated suspensions, sedimentation volume (F value), zeta potential in suspension stability, caking problem & prevention, formulation principles, evaluation",
"focus":"Write-up: flocculated vs deflocculated comparison table\nViva: F value equation, zeta potential range for stability", "priority":"HIGH", "row_height":52},
# DAY 4
{"day":"Day 4", "date":"15 Jun 2026\n(Monday)",
"time":"8:00–10:00 AM",
"topics":"Ch 4: Rheology (IMP) — Newtonian flow (viscosity, Newton's law), non-Newtonian flow types: pseudoplastic, dilatant, plastic (Bingham body); thixotropy (hysteresis loop); rheopexy; viscometers (Ostwald, Brookfield, cone & plate); pharmaceutical applications",
"focus":"Write-up: flow curve diagrams for each type\nViva: thixotropy in suspensions/gels, viscometer selection", "priority":"HIGH", "row_height":52},
{"day":"Day 4", "date":"15 Jun 2026\n(Monday)",
"time":"2:00–4:00 PM",
"topics":"Ch 5: Physicochemical Processes — Precipitation & Crystallization: crystal systems, polymorphism (pharmaceutical importance), crystal habit, crystallization methods\nDistillation: simple, fractional, steam, vacuum distillation — principles & applications\nMiscellaneous Processes (IMP): lyophilization (freeze-drying) — stages, advantages; spray drying; co-precipitation",
"focus":"Write-up: polymorphism importance, freeze-drying steps\nViva: comparison of distillation types, lyophilization vs spray drying", "priority":"HIGH", "row_height":60},
{"day":"Day 4", "date":"15 Jun 2026\n(Monday)",
"time":"8:00–9:30 PM",
"topics":"Ch 6: Extraction Processes — maceration, percolation, soxhlet extraction, aqueous & alcoholic extraction; solvent selection criteria; counter-current extraction\nReview PP Practicals 7–12",
"focus":"Write-up: extraction methods comparison\nViva: solvent selection, maceration vs percolation\nPractical notebook review", "priority":"MED", "row_height":52},
{"day":"Day 4", "date":"15 Jun 2026\n(Monday)",
"time":"11:00–11:30 PM",
"topics":"Ch 2e: Hydrolysis — types (acid, base, enzymatic hydrolysis), factors affecting rate (pH, temperature, ionic strength), hydrolysis of drugs in dosage forms, stabilization strategies",
"focus":"Write-up: factors affecting hydrolysis\nViva: hydrolysis stabilization methods", "priority":"MED", "row_height":44},
# DAY 5
{"day":"Day 5", "date":"16 Jun 2026\n(Tuesday)",
"time":"8:00–10:00 AM",
"topics":"Ch 7: Rate & Order of Reactions (IMP) — zero-order, first-order, second-order reactions: integrated rate equations, half-life derivations; pseudo-order reactions; Arrhenius equation (Ea, frequency factor); Q10 rule; shelf-life determination",
"focus":"Write-up: order equations, half-life derivation, Arrhenius\nViva: differences between orders, Arrhenius equation meaning", "priority":"HIGH", "row_height":52},
{"day":"Day 5", "date":"16 Jun 2026\n(Tuesday)",
"time":"(continued)",
"topics":"Ch 8: Kinetic Principles & Stability Testing (IMP) — accelerated stability testing, ICH Q1A guidelines (storage conditions, time points), ANOVA in stability studies, expiry date calculation, photostability testing",
"focus":"Write-up: ICH stability conditions table\nViva: accelerated testing purpose, expiry date from k", "priority":"HIGH", "row_height":44},
{"day":"Day 5", "date":"16 Jun 2026\n(Tuesday)",
"time":"2:00–4:00 PM",
"topics":"FULL REVISION — Dispersion Systems: Colloids, Emulsions, Suspensions (most important chapter)\nRheology review\nReview PP Practicals 13–24",
"focus":"Write-up practice: emulsion formulation write-up\nPractical notebook — all 24 practicals reviewed", "priority":"HIGH", "row_height":44},
{"day":"Day 5", "date":"16 Jun 2026\n(Tuesday)",
"time":"8:00–10:00 PM",
"topics":"VIVA PRACTICE SESSION — Physical Pharmacy\nKey topics: HLB system, zeta potential values, Freundlich & Langmuir isotherms, thixotropy examples, Arrhenius equation, particle size methods, lyophilization stages\nSelf-quiz or ask someone to question you",
"focus":"Viva oral practice\nWrite 10 expected viva Qs and answer them", "priority":"HIGH", "row_height":52},
# DAY 6
{"day":"Day 6", "date":"17 Jun 2026\n(Wednesday)",
"time":"10:30 AM–12:30 PM",
"topics":"FINAL SWEEP — Physical Pharmacy: Dispersions, Rheology, Micromeritics, Solubilization, Kinetics\nFocus on: HLB values, zeta potential, rate equations, stability conditions",
"focus":"Rapid notes review only\nNo new learning today", "priority":"HIGH", "row_height":44},
{"day":"Day 6", "date":"17 Jun 2026\n(Wednesday)",
"time":"4:00–5:30 PM",
"topics":"Complete Physical Pharmacy Practical Notebook Review — all 24 practicals\nFocus: Aim, Principle, Procedure outline, Calculations, Results, Precautions",
"focus":"Practical performance preparation\nMemorize procedure steps & calculations", "priority":"HIGH", "row_height":44},
{"day":"Day 6", "date":"17 Jun 2026\n(Wednesday)",
"time":"6:00–8:00 PM",
"topics":"INTENSIVE VIVA Q&A — Final Physical Pharmacy session\nMust-know: Freundlich/Langmuir isotherms equations, HLB calculation, zeta potential, Arrhenius equation, kinetic order differences, lyophilization steps\nOrganize notebook & materials for 20 Jun exam",
"focus":"Final viva preparation\nPack exam materials tonight", "priority":"HIGH", "row_height":52},
]
# ── Build sheets ──────────────────────────────────────────────────────────────
ws_bio, bio_start, bio_end, bio_total = build_tracker_sheet(
wb, "📗 Biochemistry",
"BIOCHEMISTRY PRACTICAL EXAM — DAILY STUDY TRACKER | Exam: 19 June 2026",
C["green"], C["light_green"], bio_sessions
)
ws_pp, pp_start, pp_end, pp_total = build_tracker_sheet(
wb, "📘 Physical Pharmacy",
"PHYSICAL PHARMACY PRACTICAL EXAM — DAILY STUDY TRACKER | Exam: 20 June 2026",
C["purple"], C["light_purple"], pp_sessions
)
# ── Wire Dashboard formulas now that sheets exist ─────────────────────────────
bio_done_formula = f"=COUNTIF('📗 Biochemistry'!H{bio_start}:H{bio_end},\"✅ Done\")"
bio_total_val = bio_total
bio_prog_formula = f"=COUNTIF('📗 Biochemistry'!H{bio_start}:H{bio_end},\"⏳ In Progress\")"
bio_skip_formula = f"=COUNTIF('📗 Biochemistry'!H{bio_start}:H{bio_end},\"⏭ Skipped\")"
bio_remain_formula= f"={bio_total}-COUNTIF('📗 Biochemistry'!H{bio_start}:H{bio_end},\"✅ Done\")"
bio_pct_formula = f"=COUNTIF('📗 Biochemistry'!H{bio_start}:H{bio_end},\"✅ Done\")/{bio_total}"
pp_done_formula = f"=COUNTIF('📘 Physical Pharmacy'!H{pp_start}:H{pp_end},\"✅ Done\")"
pp_total_val = pp_total
pp_remain_formula = f"={pp_total}-COUNTIF('📘 Physical Pharmacy'!H{pp_start}:H{pp_end},\"✅ Done\")"
pp_pct_formula = f"=COUNTIF('📘 Physical Pharmacy'!H{pp_start}:H{pp_end},\"✅ Done\")/{pp_total}"
ov_total = bio_total + pp_total
ov_done_formula = f"={bio_done_formula[1:]}+{pp_done_formula[1:]}"
ov_remain_formula = f"={ov_total}-({bio_done_formula[1:]}+{pp_done_formula[1:]})"
ov_pct_formula = f"=({bio_done_formula[1:]}+{pp_done_formula[1:]})/{ov_total}"
dash_data = [
(6, bio_total_val, bio_done_formula, bio_remain_formula, bio_pct_formula),
(7, pp_total_val, pp_done_formula, pp_remain_formula, pp_pct_formula),
(8, ov_total, ov_done_formula, ov_remain_formula, ov_pct_formula),
]
for row_num, total, done_f, remain_f, pct_f in dash_data:
ws_dash[f"E{row_num}"].value = total
ws_dash[f"F{row_num}"].value = done_f
ws_dash[f"G{row_num}"].value = remain_f
ws_dash[f"H{row_num}"].value = pct_f
ws_dash[f"H{row_num}"].number_format = "0.0%"
# Conditional formatting on dashboard % complete column
ws_dash.conditional_formatting.add(
"H6:H8",
ColorScaleRule(
start_type="num", start_value=0, start_color="FEE2E2",
mid_type="num", mid_value=0.5, mid_color="FEF9C3",
end_type="num", end_value=1, end_color="BBF7D0"
)
)
# ── Save ──────────────────────────────────────────────────────────────────────
# Set Dashboard as active sheet
wb.active = ws_dash
wb.save(OUTPUT)
print(f"Saved: {OUTPUT}")
print(f"Biochemistry sessions: {bio_total}")
print(f"Physical Pharmacy sessions: {pp_total}")
print(f"Total sessions tracked: {bio_total + pp_total}")
cd /home/daytona/workspace/study-plan && python build_tracker.py
cd /home/daytona/workspace/study-plan && rm -f Ramzan_Hafeez_Study_Tracker.xlsx && python -c " import openpyxl wb = openpyxl.Workbook() wb.save('/home/daytona/workspace/study-plan/test_write.xlsx') print('write ok') "
python3 -c " import openpyxl, io wb = openpyxl.Workbook() buf = io.BytesIO() wb.save(buf) print('in-memory save ok, bytes:', len(buf.getvalue())) "
ls -la /home/daytona/workspace/study-plan/ && df -h /home/daytona/workspace/
python3 -c " import openpyxl, io, shutil wb = openpyxl.Workbook() ws = wb.active ws['A1'] = 'test' wb.save('/tmp/test_out.xlsx') shutil.copy('/tmp/test_out.xlsx', '/home/daytona/workspace/study-plan/test_out.xlsx') print('done') "
# Try copyfile only (no metadata copy) and open+write python3 -c " import openpyxl, shutil wb = openpyxl.Workbook() ws = wb.active ws['A1'] = 'test' wb.save('/tmp/test_out.xlsx') shutil.copyfile('/tmp/test_out.xlsx', '/home/daytona/workspace/study-plan/test_out.xlsx') print('done') "
~/study-plan/build_tracker.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/study-plan/build_tracker.py'
~/study-plan/build_tracker.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/study-plan/build_tracker.py'
cd /home/daytona/workspace/study-plan && python build_tracker.py
Ramzan Hafeez Study Tracker
Spreadsheet · XLSX
✅ Done | ⏳ In Progress | ⏭ Skipped | ☐ Pending