394 lines
20 KiB
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> |