odoo_18_Education_management/views/gradesheet.xml

394 lines
20 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<!-- Gradesheet List View -->
<record id="view_school_gradesheet_list" model="ir.ui.view">
<field name="name">school.gradesheet.list</field>
<field name="model">school.gradesheet</field>
<field name="arch" type="xml">
<list string="Gradesheets" decoration-info="state=='draft'" decoration-success="state=='generated'" decoration-muted="state=='finalized'">
<field name="session"/>
<field name="class_name"/>
<field name="course_id"/>
<field name="total_students"/>
<field name="passed_students"/>
<field name="pass_percentage" widget="percentage"/>
<field name="state" widget="badge" decoration-info="state=='draft'" decoration-success="state=='generated'" decoration-muted="state=='finalized'"/>
<field name="generated_date"/>
<field name="generated_by"/>
</list>
</field>
</record>
<!-- Gradesheet Form View -->
<record id="view_school_gradesheet_form" model="ir.ui.view">
<field name="name">school.gradesheet.form</field>
<field name="model">school.gradesheet</field>
<field name="arch" type="xml">
<form string="Gradesheet">
<header>
<button name="action_fetch_student_marks"
string="Fetch Marks"
type="object"
class="btn-primary"
modifiers='{"invisible": [["state", "!=", "draft"]]}'/>
<button name="action_finalize_gradesheet"
string="Finalize"
type="object"
class="btn-success"
modifiers='{"invisible": [["state", "!=", "generated"]]}'/>
<button name="action_print_gradesheet"
string="Print"
type="object"
class="btn-secondary"
modifiers='{"invisible": [["state", "==", "draft"]]}'/>
<button name="action_reset_to_draft"
string="Reset to Draft"
type="object"
class="btn-warning"
confirm="This will reset the gradesheet. Continue?"
modifiers='{"invisible": [["state", "==", "draft"]]}'/>
<field name="state" widget="statusbar" statusbar_visible="draft,generated,finalized"/>
</header>
<sheet>
<group string="Filters">
<field name="session" placeholder="e.g., 2024-2025">
<modifiers>{"readonly": [["state", "!=", "draft"]]}</modifiers>
</field>
<field name="class_name">
<modifiers>{"readonly": [["state", "!=", "draft"]]}</modifiers>
</field>
<field name="course_id" context="{'default_class_name': class_name}">
<modifiers>{"readonly": [["state", "!=", "draft"]]}</modifiers>
</field>
</group>
<group string="Statistics">
<modifiers>{"invisible": [["state", "==", "draft"]]}</modifiers>
<field name="total_students"/>
<field name="passed_students"/>
<field name="failed_students"/>
<field name="pass_percentage" widget="percentage"/>
<field name="generated_date"/>
<field name="generated_by"/>
</group>
<notebook>
<page string="Student Grades">
<field name="student_grade_ids">
<list editable="bottom" decoration-success="status=='pass'" decoration-danger="status=='fail'">
<field name="student_id"/>
<field name="roll_number"/>
<field name="subject_id"/>
<field name="obtained_marks" sum="Total Obtained"/>
<field name="total_marks" sum="Total Max"/>
<field name="percentage" widget="percentage"/>
<field name="final_grade"/>
<field name="status" widget="badge"/>
<field name="remarks"/>
</list>
</field>
</page>
</notebook>
</sheet>
<!-- Chatter -->
<!-- <div class="oe_chatter">
<field name="message_follower_ids"/>
<field name="activity_ids"/>
<field name="message_ids"/>
</div> -->
</form>
</field>
</record>
<!-- Gradesheet Search View -->
<record id="view_school_gradesheet_search" model="ir.ui.view">
<field name="name">school.gradesheet.search</field>
<field name="model">school.gradesheet</field>
<field name="arch" type="xml">
<search string="Search Gradesheets">
<field name="session"/>
<field name="class_name"/>
<field name="course_id"/>
<field name="generated_by"/>
<filter string="Draft" name="filter_draft" domain="[('state', '=', 'draft')]"/>
<filter string="Generated" name="filter_generated" domain="[('state', '=', 'generated')]"/>
<filter string="Finalized" name="filter_finalized" domain="[('state', '=', 'finalized')]"/>
<separator/>
<filter string="Current Session" name="filter_current_session" domain="[('session', 'ilike', '2024')]"/>
<group expand="0" string="Group By">
<filter string="Session" name="group_session" context="{'group_by': 'session'}"/>
<filter string="Class" name="group_class" context="{'group_by': 'class_name'}"/>
<filter string="Status" name="group_state" context="{'group_by': 'state'}"/>
<filter string="Generated By" name="group_generated_by" context="{'group_by': 'generated_by'}"/>
</group>
</search>
</field>
</record>
<!-- Gradesheet Line List View -->
<record id="view_school_gradesheet_line_list" model="ir.ui.view">
<field name="name">school.gradesheet.line.list</field>
<field name="model">school.gradesheet.line</field>
<field name="arch" type="xml">
<list string="Student Grades" decoration-success="status=='pass'" decoration-danger="status=='fail'">
<field name="student_name"/>
<field name="roll_number"/>
<field name="obtained_marks"/>
<field name="total_marks"/>
<field name="percentage" widget="percentage"/>
<field name="final_grade"/>
<field name="status" widget="badge" decoration-success="status=='pass'" decoration-danger="status=='fail'"/>
<field name="remarks"/>
</list>
</field>
</record>
<!-- Gradesheet Kanban View -->
<record id="view_school_gradesheet_kanban" model="ir.ui.view">
<field name="name">school.gradesheet.kanban</field>
<field name="model">school.gradesheet</field>
<field name="arch" type="xml">
<kanban class="o_kanban_small_column" default_group_by="state">
<field name="session"/>
<field name="class_name"/>
<field name="course_id"/>
<field name="total_students"/>
<field name="passed_students"/>
<field name="pass_percentage"/>
<field name="state"/>
<field name="generated_date"/>
<templates>
<t t-name="kanban-box">
<div class="oe_kanban_card oe_kanban_global_click">
<div class="oe_kanban_content">
<div class="row">
<div class="col-12">
<strong><field name="session"/></strong>
<span class="float-right">
<field name="state" widget="label_selection" options="{'classes': {'draft': 'secondary', 'generated': 'success', 'finalized': 'info'}}"/>
</span>
</div>
</div>
<div class="row">
<div class="col-12">
<i class="fa fa-graduation-cap"/> Class <field name="class_name"/>
</div>
</div>
<div class="row">
<div class="col-12">
<i class="fa fa-book" title="Gradesheet"/> <field name="course_id"/>
</div>
</div>
<div class="row mt8">
<div class="col-6">
<small>Students: <field name="total_students"/></small>
</div>
<div class="col-6">
<small>Passed: <field name="passed_students"/></small>
</div>
</div>
<div class="row">
<div class="col-12">
<div class="progress" style="height: 15px;">
<div class="progress-bar bg-success" role="progressbar" t-att-style="'width: ' + record.pass_percentage.raw_value + '%'">
<t t-esc="Math.round(record.pass_percentage.raw_value)"/>%
</div>
</div>
</div>
</div>
</div>
</div>
</t>
</templates>
</kanban>
</field>
</record>
<!-- Gradesheet Pivot View -->
<record id="view_school_gradesheet_pivot" model="ir.ui.view">
<field name="name">school.gradesheet.pivot</field>
<field name="model">school.gradesheet</field>
<field name="arch" type="xml">
<pivot string="Gradesheet Analysis">
<field name="session" type="row"/>
<field name="class_name" type="row"/>
<field name="course_id" type="col"/>
<field name="total_students" type="measure"/>
<field name="passed_students" type="measure"/>
<field name="failed_students" type="measure"/>
</pivot>
</field>
</record>
<!-- Gradesheet Graph View -->
<record id="view_school_gradesheet_graph" model="ir.ui.view">
<field name="name">school.gradesheet.graph</field>
<field name="model">school.gradesheet</field>
<field name="arch" type="xml">
<graph string="Pass/Fail Analysis" type="bar">
<field name="class_name" type="row"/>
<field name="passed_students" type="measure"/>
<field name="failed_students" type="measure"/>
</graph>
</field>
</record>
<!-- Action for Gradesheet -->
<record id="action_school_gradesheet" model="ir.actions.act_window">
<field name="name">Gradesheets</field>
<field name="res_model">school.gradesheet</field>
<field name="view_mode">kanban,list,form,pivot,graph</field>
<field name="context">{'search_default_filter_current_session': 1}</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">
Create your first Gradesheet!
</p>
<p>
Generate gradesheets for students by selecting session, class, and course.
Fetch student marks automatically from your existing data.
</p>
</field>
</record>
<!-- Action for Gradesheet Lines -->
<record id="action_school_gradesheet_line" model="ir.actions.act_window">
<field name="name">Student Grades</field>
<field name="res_model">school.gradesheet.line</field>
<field name="view_mode">list</field>
</record>
<!-- Gradesheet Report Template -->
<record id="report_school_gradesheet" model="ir.actions.report">
<field name="name">Gradesheet Report</field>
<field name="model">school.gradesheet</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">school_management.report_gradesheet_template</field>
<field name="report_file">school_management.report_gradesheet_template</field>
<field name="binding_model_id" ref="model_school_gradesheet"/>
<field name="binding_type">report</field>
<field name="paperformat_id" ref="base.paperformat_euro"/>
</record>
<!-- Report Template -->
<template id="report_gradesheet_template">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="gradesheet">
<t t-call="web.external_layout">
<div class="page">
<!-- Header -->
<div class="text-center mb-4">
<h2>GRADESHEET REPORT</h2>
<h4 t-field="gradesheet.course_id.name"/>
<p>
<strong>Session:</strong> <span t-field="gradesheet.session"/> |
<strong>Class:</strong> <span t-field="gradesheet.class_name"/> |
<strong>Generated:</strong> <span t-field="gradesheet.generated_date" t-options="{'widget': 'datetime'}"/>
</p>
</div>
<!-- Statistics -->
<div class="row mb-4">
<div class="col-3">
<div class="card text-center">
<div class="card-body">
<h5 class="card-title" t-field="gradesheet.total_students"/>
<p class="card-text">Total Students</p>
</div>
</div>
</div>
<div class="col-3">
<div class="card text-center text-success">
<div class="card-body">
<h5 class="card-title" t-field="gradesheet.passed_students"/>
<p class="card-text">Passed</p>
</div>
</div>
</div>
<div class="col-3">
<div class="card text-center text-danger">
<div class="card-body">
<h5 class="card-title" t-field="gradesheet.failed_students"/>
<p class="card-text">Failed</p>
</div>
</div>
</div>
<div class="col-3">
<div class="card text-center text-info">
<div class="card-body">
<h5 class="card-title"><span t-field="gradesheet.pass_percentage" t-options="{'widget': 'float', 'precision': 2}"/>%</h5>
<p class="card-text">Pass Rate</p>
</div>
</div>
</div>
</div>
<!-- Student Grades Table -->
<table class="table table-bordered table-striped">
<thead class="table-dark">
<tr>
<th>S.No.</th>
<th>Student Name</th>
<th>Roll Number</th>
<th>Obtained Marks</th>
<th>Total Marks</th>
<th>Percentage</th>
<th>Grade</th>
<th>Status</th>
<th>Remarks</th>
</tr>
</thead>
<tbody>
<tr t-foreach="gradesheet.student_grade_ids" t-as="line"
t-att-class="'table-success' if line.status == 'pass' else 'table-danger'">
<td t-esc="line_index + 1"/>
<td t-field="line.student_name"/>
<td t-field="line.roll_number"/>
<td t-field="line.obtained_marks" t-options="{'widget': 'float', 'precision': 1}"/>
<td t-field="line.total_marks" t-options="{'widget': 'float', 'precision': 1}"/>
<td>
<span t-field="line.percentage" t-options="{'widget': 'float', 'precision': 2}"/>%
</td>
<td>
<span t-field="line.final_grade"
t-att-class="'badge badge-success' if line.status == 'pass' else 'badge badge-danger'"/>
</td>
<td>
<span t-field="line.status"
t-att-class="'text-success' if line.status == 'pass' else 'text-danger'"
style="text-transform: uppercase; font-weight: bold;"/>
</td>
<td t-field="line.remarks"/>
</tr>
</tbody>
</table>
<!-- Footer -->
<div class="mt-4">
<div class="row">
<div class="col-6">
<p><strong>Generated By:</strong> <span t-field="gradesheet.generated_by.name"/></p>
<p><strong>Date:</strong> <span t-field="gradesheet.generated_date" t-options="{'widget': 'date'}"/></p>
</div>
<div class="col-6 text-right">
<p><strong>Status:</strong> <span t-field="gradesheet.state" class="badge badge-info"/></p>
</div>
</div>
</div>
</div>
</t>
</t>
</t>
</template>
</odoo>