Pharmacy detail and well plan time table 9 to 6 class 350 Per class 1 hour
3 month
Pharmacist
mkdir -p /tmp/workspace/pharmacist-timetable
~/pharmacist-timetable/build_timetable.py
import openpyxl
from openpyxl.styles import (
PatternFill, Font, Alignment, Border, Side, GradientFill
)
from openpyxl.utils import get_column_letter
from datetime import date, timedelta
# ── colour palette ──────────────────────────────────────────────────────────
HEADER_BG = "1F4E79" # dark blue
HEADER_FG = "FFFFFF"
SUBHDR_BG = "2E75B6" # mid blue
SUBHDR_FG = "FFFFFF"
ALT_ROW_BG = "DEEAF1" # very light blue
LUNCH_BG = "FFF2CC" # pale yellow
SUNDAY_BG = "F2F2F2"
REVISION_BG = "E2EFDA" # pale green
SUBJECT_COLORS = {
"Pharmaceutics": "C6EFCE",
"Pharmacology": "FFEB9C",
"Pharmacognosy": "BDD7EE",
"Biochemistry": "FCE4D6",
"Pharmacokinetics": "E2EFDA",
"Clinical Pharmacy": "D9E1F2",
"Pharmaceutical Chemistry": "FFF2CC",
"Human Anatomy & Physiology":"EDE7F6",
"Health Education": "F4CCCC",
"Drug Store Management": "D0E4FF",
"REVISION / Mock Test": "C9E4CA",
"LUNCH BREAK": "FFF2CC",
}
def make_fill(hex_color):
return PatternFill("solid", fgColor=hex_color)
def make_border(thin=True):
s = Side(style="thin" if thin else "medium")
return Border(left=s, right=s, top=s, bottom=s)
def hdr_font(bold=True, size=11, color="FFFFFF"):
return Font(name="Arial", bold=bold, size=size, color=color)
def cell_font(bold=False, size=10, color="000000"):
return Font(name="Arial", bold=bold, size=size, color=color)
# ── time slots (9 AM – 6 PM, 1 hr each, lunch at 1-2 PM) ──────────────────
TIME_SLOTS = [
("09:00 AM", "10:00 AM"),
("10:00 AM", "11:00 AM"),
("11:00 AM", "12:00 PM"),
("12:00 PM", "01:00 PM"),
("01:00 PM", "02:00 PM"), # LUNCH
("02:00 PM", "03:00 PM"),
("03:00 PM", "04:00 PM"),
("04:00 PM", "05:00 PM"),
("05:00 PM", "06:00 PM"),
]
LUNCH_SLOT = 4 # 0-indexed
# ── subjects & chapter distribution ────────────────────────────────────────
# 350 teaching classes / 8 teaching slots per day
SUBJECTS = [
("Pharmaceutics", 45),
("Pharmacology", 50),
("Pharmacognosy", 35),
("Biochemistry", 30),
("Pharmacokinetics", 25),
("Clinical Pharmacy", 40),
("Pharmaceutical Chemistry", 45),
("Human Anatomy & Physiology",30),
("Health Education", 20),
("Drug Store Management", 30),
]
# Total = 350
# Build a flat list of 350 subject tokens
subject_queue = []
for subj, count in SUBJECTS:
subject_queue.extend([subj] * count)
# ── date range: 16 Jul 2026 – 15 Oct 2026, Mon-Sat only ───────────────────
start_date = date(2026, 7, 16)
end_date = date(2026, 10, 15)
teaching_days = []
d = start_date
while d <= end_date:
if d.weekday() < 6: # 0=Mon … 5=Sat, skip Sun(6)
teaching_days.append(d)
d += timedelta(days=1)
# 8 teaching slots per day → assign subjects
slot_schedule = {} # date -> list of 9 items (8 subjects + lunch)
idx = 0
for day in teaching_days:
day_slots = []
slot_num = 0
for i, (t_start, t_end) in enumerate(TIME_SLOTS):
if i == LUNCH_SLOT:
day_slots.append("LUNCH BREAK")
else:
if idx < len(subject_queue):
day_slots.append(subject_queue[idx])
idx += 1
else:
day_slots.append("REVISION / Mock Test")
slot_num += 1
slot_schedule[day] = day_slots
# ── workbook setup ──────────────────────────────────────────────────────────
wb = openpyxl.Workbook()
# ── SHEET 1: Cover / Summary ────────────────────────────────────────────────
ws_cover = wb.active
ws_cover.title = "Cover"
ws_cover.sheet_view.showGridLines = False
def merge_write(ws, cell_range, value, bg, fg, size=12, bold=True, align="center"):
ws.merge_cells(cell_range)
top_left = ws[cell_range.split(":")[0]]
top_left.value = value
top_left.fill = make_fill(bg)
top_left.font = Font(name="Arial", bold=bold, size=size, color=fg)
top_left.alignment = Alignment(horizontal=align, vertical="center", wrap_text=True)
# Title block
ws_cover.row_dimensions[1].height = 10
ws_cover.row_dimensions[2].height = 50
ws_cover.row_dimensions[3].height = 30
ws_cover.row_dimensions[4].height = 25
ws_cover.row_dimensions[5].height = 25
merge_write(ws_cover, "B2:H2",
"PHARMACIST EXAM PREPARATION", HEADER_BG, HEADER_FG, 20, True)
merge_write(ws_cover, "B3:H3",
"3-Month Study Timetable | 9:00 AM – 6:00 PM | 1 Hour per Class | 350 Classes",
SUBHDR_BG, SUBHDR_FG, 13, False)
merge_write(ws_cover, "B4:H4",
f"Start: 16 July 2026 End: 15 October 2026 Total Teaching Days: {len(teaching_days)}",
"EBF3FB", "000000", 11, False)
ws_cover.row_dimensions[6].height = 8
ws_cover.row_dimensions[7].height = 22
# Subject summary table
headers = ["#", "Subject", "Classes Allocated", "Classes / Week (approx)"]
col_starts = [2, 3, 6, 8]
col_widths = [4, 28, 18, 22]
for c, (h, w) in enumerate(zip(headers, col_widths), 2):
ws_cover.column_dimensions[get_column_letter(c)].width = w
for ci, h in enumerate(headers):
cell = ws_cover.cell(row=7, column=col_starts[ci], value=h)
cell.fill = make_fill(HEADER_BG)
cell.font = hdr_font(size=10)
cell.alignment = Alignment(horizontal="center", vertical="center")
cell.border = make_border()
for ri, (subj, cnt) in enumerate(SUBJECTS, start=8):
ws_cover.row_dimensions[ri].height = 20
row_bg = ALT_ROW_BG if ri % 2 == 0 else "FFFFFF"
data = [ri - 7, subj, cnt, round(cnt / 13, 1)]
for ci, val in enumerate(data):
cell = ws_cover.cell(row=ri, column=col_starts[ci], value=val)
cell.fill = make_fill(SUBJECT_COLORS.get(subj, row_bg))
cell.font = cell_font(size=10)
cell.alignment = Alignment(horizontal="center" if ci != 1 else "left",
vertical="center")
cell.border = make_border()
# Total row
tr = 8 + len(SUBJECTS)
ws_cover.row_dimensions[tr].height = 22
for ci, val in enumerate(["", "TOTAL", 350, ""]):
cell = ws_cover.cell(row=tr, column=col_starts[ci], value=val)
cell.fill = make_fill(SUBHDR_BG)
cell.font = hdr_font(size=10)
cell.alignment = Alignment(horizontal="center" if ci != 1 else "left", vertical="center")
cell.border = make_border()
# Time slots key
ws_cover.row_dimensions[tr + 2].height = 22
merge_write(ws_cover, f"B{tr+2}:H{tr+2}", "DAILY TIME SLOTS", HEADER_BG, HEADER_FG, 11)
for si, (ts, te) in enumerate(TIME_SLOTS, start=tr+3):
ws_cover.row_dimensions[si].height = 18
label = "LUNCH BREAK" if si - (tr+3) == LUNCH_SLOT else f"Class {si - (tr+3) if si-(tr+3) < LUNCH_SLOT else si-(tr+3)}"
bg = LUNCH_BG if si - (tr+3) == LUNCH_SLOT else (ALT_ROW_BG if si % 2 == 0 else "FFFFFF")
c1 = ws_cover.cell(row=si, column=2, value=f"{ts} – {te}")
c1.fill = make_fill(bg); c1.font = cell_font(size=10)
c1.alignment = Alignment(horizontal="center", vertical="center"); c1.border = make_border()
c2 = ws_cover.cell(row=si, column=3, value=label)
c2.fill = make_fill(bg); c2.font = cell_font(size=10, bold=(label=="LUNCH BREAK"))
c2.alignment = Alignment(horizontal="left", vertical="center"); c2.border = make_border()
# ── SHEET 2-4: Monthly timetables ──────────────────────────────────────────
months = [
("Month 1 - July-Aug", date(2026, 7, 16), date(2026, 8, 15)),
("Month 2 - Aug-Sep", date(2026, 8, 16), date(2026, 9, 15)),
("Month 3 - Sep-Oct", date(2026, 9, 16), date(2026, 10, 15)),
]
DAY_COLS = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat"]
def write_monthly_sheet(wb, title, m_start, m_end):
ws = wb.create_sheet(title)
ws.sheet_view.showGridLines = False
# Collect weeks (Mon-Sat blocks) within range
# Find Monday on or before m_start
cur = m_start
while cur.weekday() != 0:
cur -= timedelta(days=1)
weeks = []
while cur <= m_end:
week_days = [cur + timedelta(days=i) for i in range(6)]
weeks.append(week_days)
cur += timedelta(days=7)
# Column layout: col 1=Time Slot, col 2..7 = Mon-Sat
ws.column_dimensions["A"].width = 18
for ci in range(2, 8):
ws.column_dimensions[get_column_letter(ci)].width = 22
# Sheet title
ws.merge_cells("A1:G1")
ws["A1"] = f"PHARMACIST EXAM PREP – {title.upper()}"
ws["A1"].fill = make_fill(HEADER_BG)
ws["A1"].font = Font(name="Arial", bold=True, size=14, color="FFFFFF")
ws["A1"].alignment = Alignment(horizontal="center", vertical="center")
ws.row_dimensions[1].height = 35
ws.merge_cells("A2:G2")
ws["A2"] = "9:00 AM – 6:00 PM | 1 Hour per Class | Monday to Saturday"
ws["A2"].fill = make_fill(SUBHDR_BG)
ws["A2"].font = Font(name="Arial", bold=False, size=11, color="FFFFFF")
ws["A2"].alignment = Alignment(horizontal="center", vertical="center")
ws.row_dimensions[2].height = 22
row = 4
for wk_idx, week in enumerate(weeks):
# Week header
ws.merge_cells(f"A{row}:G{row}")
ws[f"A{row}"] = f"Week {wk_idx + 1} ({week[0].strftime('%d %b')} – {week[5].strftime('%d %b %Y')})"
ws[f"A{row}"].fill = make_fill("2E75B6")
ws[f"A{row}"].font = Font(name="Arial", bold=True, size=11, color="FFFFFF")
ws[f"A{row}"].alignment = Alignment(horizontal="center", vertical="center")
ws.row_dimensions[row].height = 22
row += 1
# Day column headers
ws.cell(row=row, column=1, value="Time Slot").fill = make_fill(HEADER_BG)
ws.cell(row=row, column=1).font = hdr_font(size=10)
ws.cell(row=row, column=1).alignment = Alignment(horizontal="center", vertical="center")
ws.cell(row=row, column=1).border = make_border()
for ci, (day_name, day_date) in enumerate(zip(DAY_COLS, week), start=2):
cell = ws.cell(row=row, column=ci,
value=f"{day_name}\n{day_date.strftime('%d %b')}")
in_range = m_start <= day_date <= m_end
cell.fill = make_fill(HEADER_BG if in_range else SUNDAY_BG)
cell.font = Font(name="Arial", bold=True, size=10,
color="FFFFFF" if in_range else "999999")
cell.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
cell.border = make_border()
ws.row_dimensions[row].height = 30
row += 1
# Time slots
for si, (ts, te) in enumerate(TIME_SLOTS):
ws.row_dimensions[row].height = 20
is_lunch = (si == LUNCH_SLOT)
label = f"{ts} – {te}"
tc = ws.cell(row=row, column=1, value=label)
tc.fill = make_fill(LUNCH_BG if is_lunch else (ALT_ROW_BG if si % 2 == 0 else "FFFFFF"))
tc.font = cell_font(bold=is_lunch, size=9)
tc.alignment = Alignment(horizontal="center", vertical="center")
tc.border = make_border()
for ci, day_date in enumerate(week, start=2):
in_range = m_start <= day_date <= m_end
if not in_range:
cell = ws.cell(row=row, column=ci, value="")
cell.fill = make_fill(SUNDAY_BG)
cell.border = make_border()
continue
if is_lunch:
cell = ws.cell(row=row, column=ci, value="🍽 LUNCH BREAK")
cell.fill = make_fill(LUNCH_BG)
cell.font = Font(name="Arial", bold=True, size=9, color="7F6000")
cell.alignment = Alignment(horizontal="center", vertical="center")
cell.border = make_border()
else:
subj = slot_schedule.get(day_date, [""] * 9)[si]
color = SUBJECT_COLORS.get(subj, "FFFFFF")
cell = ws.cell(row=row, column=ci, value=subj)
cell.fill = make_fill(color)
cell.font = cell_font(size=9, bold=(subj == "REVISION / Mock Test"))
cell.alignment = Alignment(horizontal="center", vertical="center",
wrap_text=True)
cell.border = make_border()
row += 1
row += 1 # blank row between weeks
for title, ms, me in months:
write_monthly_sheet(wb, title, ms, me)
# ── SHEET 5: Weekly detail (all 13 weeks in one view) ──────────────────────
ws_wk = wb.create_sheet("Full Weekly Detail")
ws_wk.sheet_view.showGridLines = False
ws_wk.column_dimensions["A"].width = 5
ws_wk.column_dimensions["B"].width = 16
ws_wk.column_dimensions["C"].width = 20
for ci in range(4, 10):
ws_wk.column_dimensions[get_column_letter(ci)].width = 25
ws_wk.merge_cells("B1:I1")
ws_wk["B1"] = "PHARMACIST EXAM PREP – FULL 13-WEEK SCHEDULE"
ws_wk["B1"].fill = make_fill(HEADER_BG)
ws_wk["B1"].font = Font(name="Arial", bold=True, size=14, color="FFFFFF")
ws_wk["B1"].alignment = Alignment(horizontal="center", vertical="center")
ws_wk.row_dimensions[1].height = 35
# Headers
hdr_row = 3
ws_wk.row_dimensions[hdr_row].height = 25
for col, text in [(1,"#"), (2,"Date"), (3,"Day"), (4,"09-10"), (5,"10-11"),
(6,"11-12"), (7,"12-13"), (8,"14-15"), (9,"15-16"),
(10,"16-17"), (11,"17-18")]:
c = ws_wk.cell(row=hdr_row, column=col, value=text)
c.fill = make_fill(HEADER_BG); c.font = hdr_font(size=10)
c.alignment = Alignment(horizontal="center", vertical="center")
c.border = make_border()
ws_wk.column_dimensions["A"].width = 4
ws_wk.column_dimensions["B"].width = 12
ws_wk.column_dimensions["C"].width = 12
for ci in range(4, 12):
ws_wk.column_dimensions[get_column_letter(ci)].width = 22
data_row = 4
day_num = 0
for day in teaching_days:
day_num += 1
slots = slot_schedule[day]
# teaching slots only (skip lunch at index 4)
teaching = [s for i, s in enumerate(slots) if i != LUNCH_SLOT]
row_bg = ALT_ROW_BG if data_row % 2 == 0 else "FFFFFF"
ws_wk.row_dimensions[data_row].height = 18
ws_wk.cell(row=data_row, column=1, value=day_num).fill = make_fill(row_bg)
ws_wk.cell(row=data_row, column=1).font = cell_font(size=9)
ws_wk.cell(row=data_row, column=1).alignment = Alignment(horizontal="center", vertical="center")
ws_wk.cell(row=data_row, column=1).border = make_border()
ws_wk.cell(row=data_row, column=2, value=day.strftime("%d %b %Y")).fill = make_fill(row_bg)
ws_wk.cell(row=data_row, column=2).font = cell_font(size=9)
ws_wk.cell(row=data_row, column=2).alignment = Alignment(horizontal="center", vertical="center")
ws_wk.cell(row=data_row, column=2).border = make_border()
ws_wk.cell(row=data_row, column=3, value=day.strftime("%A")).fill = make_fill(row_bg)
ws_wk.cell(row=data_row, column=3).font = cell_font(size=9)
ws_wk.cell(row=data_row, column=3).alignment = Alignment(horizontal="center", vertical="center")
ws_wk.cell(row=data_row, column=3).border = make_border()
for ci, subj in enumerate(teaching, start=4):
color = SUBJECT_COLORS.get(subj, row_bg)
c = ws_wk.cell(row=data_row, column=ci, value=subj)
c.fill = make_fill(color); c.font = cell_font(size=9)
c.alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
c.border = make_border()
data_row += 1
# ── Save ────────────────────────────────────────────────────────────────────
out_path = "/tmp/workspace/pharmacist-timetable/Pharmacist_Exam_Prep_3Month_Timetable.xlsx"
wb.save(out_path)
print(f"Saved: {out_path}")
print(f"Teaching days: {len(teaching_days)}")
print(f"Total classes assigned: {idx}")
cd /tmp/workspace/pharmacist-timetable && python build_timetable.py
Pharmacist Exam Prep 3Month Timetable
Spreadsheet · XLSX
| Sheet | Content |
|---|---|
| Cover | Summary of all 10 subjects, class count per subject, daily time slots key |
| Month 1 - July-Aug | Week-by-week calendar (16 Jul - 15 Aug) |
| Month 2 - Aug-Sep | Week-by-week calendar (16 Aug - 15 Sep) |
| Month 3 - Sep-Oct | Week-by-week calendar (16 Sep - 15 Oct) |
| Full Weekly Detail | All 79 days in one scrollable table, 8 slots per row |
| Subject | Classes |
|---|---|
| Pharmacology | 50 |
| Pharmaceutics | 45 |
| Pharmaceutical Chemistry | 45 |
| Clinical Pharmacy | 40 |
| Pharmacognosy | 35 |
| Drug Store Management | 30 |
| Biochemistry | 30 |
| Human Anatomy & Physiology | 30 |
| Pharmacokinetics | 25 |
| Health Education | 20 |
| Total | 350 |
Me pharmacist ki exam tayri kr rha hu Rajsthan state se
Rajasthan State Pharmacist exam 2025 2026 syllabus RSMSSB notification
Rajasthan Pharmacist exam pattern marks subjects RSMSSB
https://www.adda247.com/exams/nursing/rajasthan-pharmacist-s…
| # | Section | Questions | Marks |
|---|---|---|---|
| 1 | General Knowledge | 45 | 45 |
| 2 | Pharmacy Subject | 105 | 105 |
| Total | 150 | 150 |
| # | Subject | Priority |
|---|---|---|
| 1 | Pharmaceutics | ⭐⭐⭐ High |
| 2 | Pharmaceutical Chemistry | ⭐⭐⭐ High |
| 3 | Pharmacognosy | ⭐⭐ Medium |
| 4 | Biochemistry & Clinical Pathology | ⭐⭐ Medium |
| 5 | Human Anatomy & Physiology | ⭐⭐ Medium |
| 6 | Health Education & Community Pharmacy | ⭐⭐ Medium |
| 7 | Pharmacology & Toxicology | ⭐⭐⭐ Highest |
| 8 | Pharmaceutical Jurisprudence (Pharmacy Act, Drug Laws) | ⭐⭐⭐ High |
| 9 | Drug Store & Business Management | ⭐⭐ Medium |
| 10 | Hospital & Clinical Pharmacy | ⭐⭐ Medium |
Tip: Rajasthan GK ke liye zyada focus karo - state exam hai isliye Rajasthan se bahut zyaada questions aate hain.
| Month | Focus |
|---|---|
| Month 1 (Jul 16 - Aug 15) | Pharmacology + Pharmaceutics + Pharmaceutical Chemistry |
| Month 2 (Aug 16 - Sep 15) | Pharmacognosy + Biochemistry + Human Anatomy + Jurisprudence |
| Month 3 (Sep 16 - Oct 15) | Clinical Pharmacy + Rajasthan GK + Current Affairs + Full Revision + Mock Tests |
| Subject | Book |
|---|---|
| Pharmacology | KD Tripathi - Essentials of Medical Pharmacology |
| Pharmaceutics | RM Mehta / Lachman & Lieberman |
| Pharmacy Law | Pharmacy Act 1948, Drugs & Cosmetics Act 1940 |
| Rajasthan GK | Lucent Rajasthan GK / Dr. Rajiv Lekhak |
| General GK | Lucent's Objective GK |