Skip to content
OnlyProjects
B.Tech / B.E. · Computer Science & EngineeringFor educational purposes only
Code included

District Court Cause-List Aggregator & Case-Status Tracker for eCourts Data (Python/Flask + MySQL)

One searchable place for a district court's daily cause lists, case status and hearing dates, with watchlist alerts when a hearing moves

Mapped to your syllabusOsmania University AICTE model scheme (2020-21 batch) · Project Work-II · Semester 8

Overview

1 min read

District Court Cause-List Aggregator (DCLA) is a Python/Flask web application that turns the daily cause lists and case-status pages published on the eCourts portal into one searchable, local database for a single district court complex — the demo is configured for the district courts of Ranga Reddy district, Telangana. Litigants and advocates navigate the official portal court by court and date by date, and there is no way to be told when a hearing date changes.

DCLA runs in two parts. A scheduled fetcher (APScheduler) pulls the public cause-list and case-status pages for the configured courts a couple of times a day — politely, with rate limiting, retries with exponential backoff, an honest User-Agent and a SHA-256 content-hash check that skips pages already seen. A parser (BeautifulSoup) converts each page into structured rows — serial number, case type and number, parties, advocates, purpose of hearing — and quarantines rows it cannot parse, keeping the raw HTML so nothing is lost when a layout changes. The Flask front end offers search by case number, party or advocate, day-wise cause-list browsing, CSV export and a watchlist that flags hearing-date changes for tracked cases.

Python comes from the Osmania curriculum, and the scheduling, retry and consistency concerns come straight from the PC 751 Distributed Systems Lab; Flask, BeautifulSoup and APScheduler are industry-standard libraries used on top of that foundation. The system fetches only public pages at low volume and stores nothing beyond what the courts already print.

Relevant for
Telangana
Level
Intermediate · 14 weeks · team of 3
Common at
Osmania University, Jawaharlal Nehru Technological University Hyderabad, Biju Patnaik University of Technology
Updated
Nov 2026

Syllabus alignment

Osmania University · AICTE model scheme (2020-21 batch)

Project Work-II · Semester 8

Subjects this project applies
  • PC 752 Web Technologies Lab (server-side web application)
  • PC 751 Distributed Systems Lab (scheduling, retries, consistency)
  • Python Programming
  • Java Programming (HTTP and web-application fundamentals)
How it is evaluated

See your department's project guidelines.

Also fits: JNTUH R22, BPUT 2023-24 admission batch.

What's in the box

11 parts · 5 free · 2 previewed · 4 unlock for ₹2,000

Problem & synopsis

6 min read

Problem statement

District-court litigants and small-practice advocates depend on daily cause lists to know where and when their matters appear, yet the official eCourts portal presents this public data one court and one date at a time, with search that requires exact case numbers and no way to learn that a hearing has been adjourned until the next list is published. Lawyers therefore keep private diaries of hearing dates, litigants depend on phone calls to the advocate's clerk, and a missed adjournment costs a day's wages and a wasted trip to the complex. The data needed to solve this already exists in public cause lists and case-status pages, but it is fragmented across dozens of per-court pages that change daily.

There is a need for a local aggregator that fetches those public pages on a schedule, parses them into a searchable database, tracks a watchlist of cases, detects when a hearing date or stage changes, and exposes all of it through a fast web interface — while fetching politely, tolerating layout changes and storing no more than the courts themselves publish.

Synopsis

Abstract

The eCourts programme has put cause lists, case status and orders of every district court online, but the information is organised portal-first: one court, one date, one page at a time. This project builds DCLA, an application that aggregates the public cause-list and case-status pages of one district court complex into a normalised MySQL database behind a Flask web app, adds a case watchlist with hearing-change detection, and runs the fetch–parse–store pipeline on a schedule with production-style reliability: retries, rate limiting, idempotent upserts and a quarantine for unparseable pages.

Introduction

A district court complex can have dozens of courts, each publishing a daily cause list — the day's schedule of cases with serial number, case details, parties and purpose of hearing. A litigant knows a case number or a party name; an advocate tracks twenty matters across courts. The official portal answers both needs, but one query at a time, and with no notification when an adjournment moves a hearing. All of the underlying data is public; what is missing is a local, searchable, history-aware view.

Existing System

  • The eCourts services portal supports case-status search by CNR or party name and day-wise cause lists per court — but each lookup is manual, per court and per date.
  • Advocates keep hearing dates in personal diaries copied from the portal; a missed adjournment means a wasted trip.
  • Commercial legal-research services serve large firms, not small practices in a district town.
  • Limitations: no combined search across a complex's courts, no per-case history of hearing movements, no alerting, no offline archive.

Proposed System

  • A fetcher job that, twice a day, downloads the configured courts' cause lists (current and next working day) plus the status pages of watched cases, with rate limiting, timeouts, exponential-backoff retries and hash-based skip of unchanged pages.
  • A parser built on BeautifulSoup with a configurable column map per layout; rows that fail validation go to a parse_error table with the raw HTML path for re-run — no silent data loss.
  • Idempotent storage in MySQL: upserts keyed on (court, list date, serial number), with a full fetch log for provenance.
  • A Flask app with search (case number, party, advocate), day-wise cause-list browsing, per-case history, CSV export and an admin screen to re-parse quarantined pages.
  • A watchlist that records a hearing_change event whenever a tracked case's hearing date or stage moves.

Feasibility Study

  • Technical: all libraries are open-source; the pipeline is deliberately tolerant — a layout change degrades to quarantined rows, not a crash — and parser tests run against saved HTML snapshots, so development and the viva demo never need the live site.
  • Economic: zero licence cost; the college lab machine or a free-tier VM is enough.
  • Operational/legal: only publicly printed information is collected, a few dozen requests per day, with an identifying User-Agent, robots.txt respected and raw pages cached for reproducibility. No document numbers beyond public case identifiers are stored.

Objectives

  1. 01Build a scheduled fetcher for public eCourts cause-list and case-status pages with per-host rate limiting, timeouts, exponential-backoff retries and honest bot identification.
  2. 02Skip redundant work using SHA-256 content hashes so unchanged pages are never re-parsed, and keep a complete fetch log.
  3. 03Parse cause-list pages into structured rows with BeautifulSoup using a configurable column map, and quarantine every unparseable row with its raw HTML for later re-run.
  4. 04Design a normalised MySQL schema with idempotent upserts keyed on court, list date and serial number, so re-runs never create duplicates.
  5. 05Provide a Flask web interface with search by case number, party and advocate, day-wise cause-list browsing and CSV export.
  6. 06Implement a case watchlist that detects hearing-date and stage changes and records them as events with timestamps.
  7. 07Test the parser against saved HTML snapshots with pytest, and the web layer with an integration suite against a local fixture server.
  8. 08Document a scraping-ethics policy (low volume, public data only, robots.txt, no personal identifiers beyond the printed lists) and follow it in code.

Scope

In scope

  • One district court complex (demo: Ranga Reddy district courts, Telangana), with court names and halls configurable in the database.
  • Daily cause lists for the current and next working day for each configured court; case-status pages for watched cases only.
  • Structured storage of serial number, case type/number/year, parties, advocates, purpose and stage as printed.
  • Search (case number, party, advocate), day-wise browsing, per-case history, watchlist with hearing-change events, CSV export, admin screen for re-parsing.
  • Offline mode driven by bundled HTML snapshots for development and demos.

Out of scope (v1)

  • Bulk mirroring of the portal, orders/judgement PDFs, or high-court data.
  • Automated SMS/WhatsApp/e-mail delivery of alerts (the alert queue is generated; sending is future work).
  • Login for the general public; v1 has a single admin/staff account for the watchlist and admin screens.
  • Any personal identifier beyond what the courts themselves print on the lists (no identity-document numbers are stored, ever).
  • Predicting adjournments or any analytics beyond reporting.

Methodology

The project follows the Incremental SDLC model with a pipeline-first order of work, so the riskiest part — parsing a real page layout — is proven early and the interface is built on stable data.

PhaseWeeksActivitiesDeliverable
Study & ethics review1–2Map the portal structure for the demo complex, record page layouts, write the scraping-ethics policy, requirements listSRS + layout notes
Design3ER diagram, DFD level 0, sequence diagram for fetch→parse→store, schema, UI wireframesDesign document
Increment 1 — pipeline4–6Fetcher with retries/rate limit, hash skip, raw-page cache, quarantine storePipeline runs offline on snapshots
Increment 2 — parser6–8BeautifulSoup column maps, validation rules, pytest fixture suite, re-parse commandParsed fortnight of demo lists
Increment 3 — web app9–11MySQL upsert layer, Flask search/browse/export screensUsable web app
Increment 4 — watchlist11–12Tracked cases, change-detection job, alert queueWorking watchlist
Hardening & testing13Integration tests against a local fixture server, black-box UI cases, load the full demo fortnightTest report
Documentation & viva prep14Final report, PPT, demo runbook on frozen snapshotsProject Work-II submission

Testing approach: parser unit tests run against HTML snapshots captured once and versioned with the code (snapshot testing), so a portal layout change shows up as a failing test plus quarantined rows rather than silent corruption. Flask routes are integration-tested with pytest's test client and a local static server standing in for the portal; the watchlist job is tested by replaying two versions of the same list. Black-box test cases (ID, input, expected, actual, status) cover every screen.

Architecture & tech stack

3 diagrams · 8 technologies · 2 min read

  • Python 3.11
  • Flask
  • MySQL 8
  • PyMySQL
  • BeautifulSoup 4 (bs4)
  • APScheduler
  • HTML/CSS/JavaScript
  • pytest

DCLA has four components connected by a MySQL store:

  1. Scheduler & fetcher — APScheduler cron jobs (early morning and evening) call the fetcher, which applies per-host rate limiting with jitter, connects with timeouts, retries with exponential backoff (max four attempts), identifies itself with a project User-Agent, honours robots.txt, and stores every response body under raw/ with its SHA-256 hash in fetch_log.
  2. Parser — reads new raw pages, uses per-layout column maps to extract rows with BeautifulSoup, validates them (serial numbers sequential, case numbers matching the pattern for the complex), and either upserts rows into MySQL or writes a parse_error with the raw-file path.
  3. MySQL 8 store — courts, cause lists, entries, tracked cases, hearing changes, parse errors and the fetch log, with unique keys that make every write an idempotent upsert.
  4. Flask web app — Jinja templates for search, day-wise cause lists, case history, watchlist and admin re-parse; read paths hit MySQL indexes, and CSV export streams from a server-side cursor.
flowchart TD
  APS["APScheduler cron jobs (2x daily)"] --> F["Fetcher: rate limit, retries, User-Agent, robots.txt"]
  F -->|"GET public pages"| EC[("eCourts portal (public)")]
  F --> R[("raw pages + fetch_log + SHA-256")]
  R --> P["Parser: BeautifulSoup + column map"]
  P -->|"valid rows"| DB[("MySQL 8: cause lists & entries")]
  P -->|"unparseable"| Q[("parse_error quarantine")]
  DB --> W["Watchlist job: hearing-change detection"]
  W --> H[("hearing_change events")]
  DB --> FL["Flask app (Jinja views)"]
  H --> FL
  FL --> B["Browser: search, cause lists, watchlist, CSV"]

ER diagram

erDiagram
  COURT ||--o{ CAUSE_LIST : "publishes"
  CAUSE_LIST ||--|{ CAUSE_LIST_ENTRY : contains
  FETCH_LOG ||--o| CAUSE_LIST : "produced"
  CAUSE_LIST ||--o{ PARSE_ERROR : "may have"
  TRACKED_CASE ||--o{ HEARING_CHANGE : "accumulates"
  TRACKED_CASE ||--o{ CAUSE_LIST_ENTRY : "appears as"

  COURT {
    int id PK
    string name
    string hall
    string judge_designation
    string list_url_template
    boolean active
  }
  FETCH_LOG {
    int id PK
    string url
    int http_status
    int bytes
    string sha256
    datetime fetched_at
    int duration_ms
    string outcome
  }
  CAUSE_LIST {
    int id PK
    int court_id FK
    date list_date
    int fetch_id FK
    string source_sha256
    string status
  }
  CAUSE_LIST_ENTRY {
    int id PK
    int cause_list_id FK
    int serial_no
    string case_type
    string case_number
    int case_year
    string parties
    string advocates
    string purpose
    string stage
  }
  PARSE_ERROR {
    int id PK
    int cause_list_id FK
    string raw_path
    string message
    boolean resolved
  }
  TRACKED_CASE {
    int id PK
    string case_type
    string case_number
    int case_year
    string party_hint
    date last_hearing_date
    string last_stage
    date watch_since
  }
  HEARING_CHANGE {
    int id PK
    int tracked_case_id FK
    date old_date
    date new_date
    string old_stage
    string new_stage
    datetime detected_at
    boolean notified
  }

DFD — Level 0 (context diagram)

flowchart LR
  EC(["eCourts portal (public pages)"]) -- "cause lists, case status" --> SYS(("District Court<br/>Cause-List Aggregator"))
  A(["Staff / admin"]) -- "courts config, watchlist additions, re-parse" --> SYS
  SYS -- "search results, daily lists, change alerts, CSV" --> A
  L(["Litigants & advocates"]) -- "case number / party / advocate queries" --> SYS
  SYS -- "hearing dates & movements" --> L

Modules

6 modules

  1. Module 01

    Module 1 — Scheduler & Fetcher Service (Member 1)

    APScheduler jobs (about 07:30 and 19:30) drive the fetcher, which enforces a minimum interval between requests to the portal host with jitter, sends an identifying User-Agent, checks robots.txt, uses connect/read timeouts, and retries failures with exponential backoff capped at four attempts. Every response body is cached under raw/ with its SHA-256 in fetch_log; unchanged hashes short-circuit the pipeline. An OFFLINE fetch mode serves the bundled snapshots instead of the network.

  2. Module 02

    Module 2 — Parser & Quarantine Pipeline (Member 2)

    BeautifulSoup-based extraction driven by per-layout column maps stored as JSON configuration, so a header change is a config edit, not a rewrite. Validation rules (sequential serial numbers, case-number patterns, date sanity) route bad rows to the parse_error table with the raw-file path and reason; an admin command re-parses quarantined pages after the map is fixed, guaranteeing no data is silently dropped.

  3. Module 03

    Module 3 — MySQL Schema & Idempotent Upsert Layer (Member 1)

    Schema for courts, fetch log, cause lists, entries, tracked cases, hearing changes and parse errors, with utf8mb4 for party-name spellings and indexes on case number, party and advocate for search. All writes go through an upsert layer keyed on (court, list_date, serial_no), so re-running any day is safe; a fetched_at provenance column records which run produced each row.

  4. Module 04

    Module 4 — Search & Cause-List Web App (Member 3)

    Flask routes and Jinja templates for the home search (by case number, party or advocate with pagination), day-wise cause-list browsing per court, a per-case page with its appearance history, and CSV export streamed from a server-side cursor. Parameterised SQL via PyMySQL throughout, Jinja auto-escaping for output, and a single staff login protecting watchlist and admin screens.

  5. Module 05

    Module 5 — Watchlist & Hearing-Change Detection (Member 2)

    Staff add a case (type, number, year, party hint); the evening job refetches its status page, extracts the next hearing date and stage, and compares them with the stored values. Any movement writes a hearing_change event (old/new date and stage, detected_at) to the alert queue shown on the watchlist page and included in the CSV export; the notified flag marks what has been reviewed.

  6. Module 06

    Module 6 — Testing, Ethics Pack & Documentation (Member 3)

    pytest suite: parser snapshot tests against versioned HTML fixtures, fetcher unit tests with a stubbed HTTP layer, Flask integration tests via the test client, and watchlist replay tests. The ethics pack documents request volume, robots.txt behaviour and data minimisation. Deliverables also include the runbook for the offline demo and the report's testing and results chapters.

Slides

12 slides · titles free · bullets, notes and the .pptx unlock

  1. Slide 1

    District Court Cause-List Aggregator & Case-Status Tracker

  2. Slide 2

    Context: What eCourts Already Gives

  3. Slide 3

    Problem Statement

  4. Slide 4

    Objectives

  5. Slide 5

    System Architecture

  6. Slide 6

    Reliability Design (PC 751 tie-in)

  7. Slide 7

    Parser Design

  8. Slide 8

    Database Design

  9. Slide 9

    Web Application & Watchlist

  10. Slide 10

    Scraping Ethics & Legality

  11. Slide 11

    Testing

  12. Slide 12

    Results, Limitations & Future Work

Bullets, speaker notes and the .pptx · ₹2,000

The titles above are the real outline. The rest is what you present from.

Unlock for ₹2,000

Viva questions & answers

3 of 17 answered free · 14 unlock

Read each answer, close it, and say it in your own words. Your viva will ask. Now you'll know.

  1. 01Concept

    What is a cause list and why does it change every day?

    A cause list is a court's published schedule for a working day: for each court hall, the cases listed with serial number, parties, advocates and the purpose of hearing such as final hearing, arguments or evidence. It changes daily because matters are part-heard, adjourned or posted by the judge, which is exactly why a static copy goes stale and our evening refetch matters.

  2. 02Concept

    Why build an aggregator instead of just linking to the eCourts portal?

    The portal is authoritative but portal-first: one court, one date, one query, with exact-number search and no notifications. Our value-add is a combined search across the complex, a per-case history, and hearing-change alerts for a watchlist — all from the same public data, stored locally so it also survives portal downtime.

  3. 03Concept

    Why MySQL and not MongoDB for this data?

    The data is strongly relational and query-heavy: courts to lists to entries, tracked cases to change events, with searches on case number, party and advocate. MySQL gives foreign keys, unique keys that implement our idempotent upserts, and indexes that keep search fast. The rows are uniform and tabular, so a document store would add nothing.

+14 more questions, with answers

Try the free ones out loud first. Your examiner will not accept “it's in the PPT”.

Source code & how to run

7 steps · complete source code · unlocks with the project

Unlocks with the project · ₹2,000

7 steps · source code zip

Prerequisites, install, seed data and tests, written for demo day. Plus the complete source.

Unlock for ₹2,000

READMEFIRST

259 words · unlocks with the project

What to change before it goes anywhere near a submission. Skipping it is how the demo fails live.

Unlocks with the project · ₹2,000

259 words · ~1 min read

The checklist of things to rename, re-seed and re-think so the project reads as yours.

Unlock for ₹2,000

Instructions

318 words · unlocks with the project

How to study it, adapt it and walk your examiner through it, step by step.

Unlocks with the project · ₹2,000

318 words · ~2 min read

Report structure, formatting rules and the submission checklist your department will grade.

Unlock for ₹2,000

References

9 sources

  1. eCourts Services Portal — District and Taluka Courts of India (case status, cause lists, orders)
  2. eCourts Mission Mode Project — Overview (e-Committee, Supreme Court of India)
  3. Flask Documentation (Pallets)
  4. Beautiful Soup Documentation
  5. APScheduler 3.x Documentation — Advanced Python Scheduler
  6. MySQL 8.0 Reference Manual
  7. Ryan Mitchell, Web Scraping with Python: Collecting More Data from the Modern Web, 2nd ed., O'Reilly
  8. Ian Sommerville, Software Engineering, 10th ed., Pearson
  9. Ramez Elmasri & Shamkant B. Navathe, Fundamentals of Database Systems, 7th ed., Pearson

Cite this bundle

OnlyProjects. (2026). District Court Cause-List Aggregator & Case-Status Tracker for eCourts Data (Python/Flask + MySQL): B.Tech / B.E. Computer Science & Engineering project bundle [Educational resource]. https://onlyprojects.online/projects/btech-cse-district-court-cause-list-aggregator

Future scope

1 min read

  • Alert delivery: e-mail and SMS dispatch from the existing alert queue, with digest mode for advocates tracking many matters.
  • Telugu interface alongside English, since most litigants in the demo district prefer it.
  • Multi-district configuration and a combined search across complexes, with per-district fetch budgets.
  • Orders/judgement links: storing the portal's public document links for tracked cases (still fetching nothing in bulk).
  • Full-text search using MySQL FULLTEXT or an SQLite FTS sidecar for typo-tolerant party-name search.
  • Public read-only API with rate limiting so college apps and clinics can reuse the aggregated data responsibly.

Keep browsing

Same degree, same syllabus slot, different idea. Pick the one your guide will actually approve.

B.Tech / B.E.Code included

Aerospace / Aeronautical

Low-Speed Open-Circuit Wind Tunnel with Force Balance for Aerofoil Lift-Drag Measurement

Build a subsonic test tunnel on a student budget, then trace lift and drag on a 3D-printed NACA 0012 against theory

  • C / Arduino Uno (industry-standard extra) — HX711 load-cell and serial logging firmware
  • Python (NumPy, Matplotlib) — calibration, force coefficients and plots
  • MATLAB / Scilab — thin-airfoil theory overlay and regression
  • +4

intermediate14 wk4 students