my 2nd commit

This commit is contained in:
Truptimayee Dash 2025-07-30 14:17:41 +05:30
parent ae75e748be
commit 19e8d93821
22 changed files with 565 additions and 710 deletions

View File

@ -11,20 +11,18 @@
'views/subject.xml', 'views/subject.xml',
'views/course.xml', 'views/course.xml',
'views/course_attendance.xml', 'views/course_attendance.xml',
'views/school_subject_teacher_info_views.xml', 'views/school_subject_teacher_views.xml',
'views/application.xml', 'views/application.xml',
'views/enrollment.xml', 'views/enrollment.xml',
'views/assignment_views.xml', 'views/assignment_views.xml',
'views/lesson_views.xml', 'views/lesson_views.xml',
'views/timeoff_views.xml', 'views/timeoff_views.xml',
'views/teacher_attendance_view.xml',
'views/school_misc_views.xml',
'views/school_reporting_views.xml',
'views/menu.xml', 'views/menu.xml',
], ],
'assets': {
'web.assets_frontend': [
'school_management/static/src/**/*',
],
},
'installable': True, 'installable': True,
'application': True, 'application': True,
} }

View File

@ -13,4 +13,7 @@ from . import school_course_schedule
from . import school_course_assignment from . import school_course_assignment
from . import school_subject_lesson from . import school_subject_lesson
from . import school_subject_teacher_info from . import school_subject_teacher_info
from . import teacher_attendance
from . import school_misc_menus

Binary file not shown.

Binary file not shown.

View File

@ -11,8 +11,6 @@ class EnrollmentFeeSummary(models.Model):
fee_slip_amount = fields.Float(string="Fee Slip Amount") fee_slip_amount = fields.Float(string="Fee Slip Amount")
due_fees = fields.Float(string="Due Fees") due_fees = fields.Float(string="Due Fees")
fee_element = fields.Char(string="Fee Element") fee_element = fields.Char(string="Fee Element")
frequency = fields.Selection([ frequency = fields.Selection([
('monthly', 'Monthly'), ('monthly', 'Monthly'),
('quarterly', 'Quarterly'), ('quarterly', 'Quarterly'),

View File

@ -0,0 +1,62 @@
from odoo import models, fields
class SchoolNotice(models.Model):
_name = 'school.notice.board'
_description = 'School Notice Board'
title = fields.Char("Title", required=True)
start_date = fields.Date("Start Date", required=True)
end_date = fields.Date("End Date")
description = fields.Text("Description")
school_id = fields.Many2one('res.company', string="School", default=lambda self: self.env.company)
visible_to = fields.Selection([
('all', 'All'),
('students', 'Students'),
('teachers', 'Teachers')
], string="Visible To", default='all', required=True)
class SchoolReportDummy(models.Model):
_name = 'school.reporting.dummy'
_description = 'Reporting Dummy'
name = fields.Char("Report Name")
date_generated = fields.Date("Generated On", default=fields.Date.today)
class SchoolFeesReport(models.Model):
_name = 'school.fees.report'
_description = 'Fees Report'
name = fields.Char("Report Name")
amount = fields.Float("Amount")
class SchoolTranscriptReport(models.Model):
_name = 'school.transcript.report'
_description = 'Transcript Report'
student_id = fields.Many2one('school.application', string="Student", ondelete='set null')
grade = fields.Char("Grade")
class SchoolScholarshipReport(models.Model):
_name = 'school.scholarship.report'
_description = 'Scholarship Report'
student_id = fields.Many2one('school.application', string="Student", ondelete='set null')
scholarship_name = fields.Char("Scholarship Name")
awarded_amount = fields.Float("Awarded Amount")
class SchoolReportCard(models.Model):
_name = 'school.report.card'
_description = 'Report Card'
student_id = fields.Many2one('school.application', string="Student", ondelete='set null')
subject_id = fields.Many2one('school.subject', string="Subject Name", required=True)
score = fields.Float("Score")
class SchoolConfigSettings(models.Model):
_name = 'school.config.settings'
_description = 'School Configuration Settings'
key = fields.Char("Setting Key", required=True)
value = fields.Char("Setting Value")

View File

@ -0,0 +1,28 @@
from odoo import models, fields, api
from odoo.exceptions import ValidationError
class TeacherAttendance(models.Model):
_name = 'school.teacher.attendance'
_description = 'Teacher Attendance'
_order = 'date desc'
teacher_id = fields.Many2one('school.subject.teacher.info', string='Teacher', required=True)
date = fields.Date(string='Date', required=True, default=fields.Date.today)
attendance_status = fields.Selection([
('present', 'Present'),
('absent', 'Absent'),
('on_leave', 'On Leave'),
('late', 'Late')
], string='Status', required=True, default='present')
remarks = fields.Text(string='Remarks')
@api.constrains('date', 'teacher_id')
def _check_duplicate_attendance(self):
for rec in self:
existing = self.search([
('teacher_id', '=', rec.teacher_id.id),
('date', '=', rec.date),
('id', '!=', rec.id)
])
if existing:
raise ValidationError("Attendance for this teacher already exists on this date.")

View File

@ -15,3 +15,11 @@ access_school_course_assignment,School Course Assignment,model_school_course_ass
access_school_subject_lesson,School Subject Lesson,model_school_subject_lesson,,1,1,1,1 access_school_subject_lesson,School Subject Lesson,model_school_subject_lesson,,1,1,1,1
access_school_subject_teacher_info,School Subject Teacher Info,model_school_subject_teacher_info,,1,1,1,1 access_school_subject_teacher_info,School Subject Teacher Info,model_school_subject_teacher_info,,1,1,1,1
access_school_subject_teacher_info_admin,Subject Teacher Info,model_school_subject_teacher_info,school_management.group_school_admin,1,1,1,1 access_school_subject_teacher_info_admin,Subject Teacher Info,model_school_subject_teacher_info,school_management.group_school_admin,1,1,1,1
access_teacher_attendance,Teacher Attendance,model_school_teacher_attendance,,1,1,1,1
access_school_notice_board,School Notice Board,model_school_notice_board,,1,1,1,1
access_school_reporting_dummy,School Reporting Dummy,model_school_reporting_dummy,,1,1,1,1
access_school_config_settings,School Config Settings,model_school_config_settings,,1,1,1,1
access_school_fees_report,Fees Report,model_school_fees_report,,1,1,1,1
access_school_transcript_report,Transcript Report,model_school_transcript_report,,1,1,1,1
access_school_scholarship_report,Scholarship Report,model_school_scholarship_report,,1,1,1,1
access_school_report_card,Report Card,model_school_report_card,,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
15 access_school_subject_lesson School Subject Lesson model_school_subject_lesson 1 1 1 1
16 access_school_subject_teacher_info School Subject Teacher Info model_school_subject_teacher_info 1 1 1 1
17 access_school_subject_teacher_info_admin Subject Teacher Info model_school_subject_teacher_info school_management.group_school_admin 1 1 1 1
18 access_teacher_attendance Teacher Attendance model_school_teacher_attendance 1 1 1 1
19 access_school_notice_board School Notice Board model_school_notice_board 1 1 1 1
20 access_school_reporting_dummy School Reporting Dummy model_school_reporting_dummy 1 1 1 1
21 access_school_config_settings School Config Settings model_school_config_settings 1 1 1 1
22 access_school_fees_report Fees Report model_school_fees_report 1 1 1 1
23 access_school_transcript_report Transcript Report model_school_transcript_report 1 1 1 1
24 access_school_scholarship_report Scholarship Report model_school_scholarship_report 1 1 1 1
25 access_school_report_card Report Card model_school_report_card 1 1 1 1

View File

@ -1,16 +0,0 @@
// odoo.define('school_management.login_script', function (require) {
// "use strict";
// document.addEventListener("DOMContentLoaded", function () {
// const toggleBtn = document.querySelector("#toggle-password");
// const pwField = document.querySelector("#password");
// if (toggleBtn && pwField) {
// toggleBtn.addEventListener("click", function () {
// const type = pwField.type === "password" ? "text" : "password";
// pwField.type = type;
// toggleBtn.innerText = type === "password" ? "👁️" : "🙈";
// });
// }
// });
// });

View File

@ -1,650 +0,0 @@
/* style.css - Main stylesheet for EduManage system */
/* Reset and Base Styles */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
html {
font-size: 16px;
scroll-behavior: smooth;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
line-height: 1.6;
color: #333;
background-color: #f8fafc;
}
/* Typography */
h1, h2, h3, h4, h5, h6 {
color: #1a202c;
margin-bottom: 0.5rem;
}
h1 { font-size: 2.5rem; font-weight: 700; }
h2 { font-size: 2rem; font-weight: 600; }
h3 { font-size: 1.5rem; font-weight: 600; }
h4 { font-size: 1.25rem; font-weight: 500; }
h5 { font-size: 1.125rem; font-weight: 500; }
h6 { font-size: 1rem; font-weight: 500; }
p {
margin-bottom: 1rem;
color: #4a5568;
}
a {
color: #3182ce;
text-decoration: none;
transition: color 0.2s ease;
}
a:hover {
color: #2c5aa0;
text-decoration: underline;
}
/* Layout Components */
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
.flex {
display: flex;
}
.flex-column {
flex-direction: column;
}
.justify-between {
justify-content: space-between;
}
.justify-center {
justify-content: center;
}
.align-center {
align-items: center;
}
.text-center {
text-align: center;
}
.text-right {
text-align: right;
}
/* Header */
.header {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 1rem 0;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
position: sticky;
top: 0;
z-index: 1000;
}
.header .container {
display: flex;
justify-content: space-between;
align-items: center;
}
.logo {
display: flex;
align-items: center;
font-size: 1.5rem;
font-weight: 700;
}
.logo img {
height: 40px;
margin-right: 10px;
}
.user-info {
display: flex;
align-items: center;
gap: 15px;
}
.user-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
border: 2px solid rgba(255, 255, 255, 0.3);
}
.user-details h4 {
color: white;
margin: 0;
}
.user-details span {
color: rgba(255, 255, 255, 0.8);
font-size: 0.875rem;
}
/* Navigation */
.sidebar {
background: white;
width: 250px;
min-height: calc(100vh - 80px);
box-shadow: 2px 0 10px rgba(0, 0, 0, 0.1);
position: fixed;
left: 0;
top: 80px;
z-index: 999;
overflow-y: auto;
}
.nav-menu {
padding: 20px 0;
}
.nav-item {
display: flex;
align-items: center;
padding: 15px 25px;
color: #4a5568;
cursor: pointer;
transition: all 0.2s ease;
border-left: 3px solid transparent;
}
.nav-item:hover {
background-color: #f7fafc;
color: #3182ce;
border-left-color: #3182ce;
}
.nav-item.active {
background-color: #ebf8ff;
color: #3182ce;
border-left-color: #3182ce;
font-weight: 500;
}
.nav-item i {
margin-right: 12px;
width: 20px;
text-align: center;
}
/* Main Content */
.main-content {
margin-left: 250px;
padding: 30px;
min-height: calc(100vh - 80px);
}
.page-header {
margin-bottom: 30px;
padding-bottom: 20px;
border-bottom: 1px solid #e2e8f0;
}
.page-title {
color: #1a202c;
margin-bottom: 5px;
}
.page-subtitle {
color: #718096;
font-size: 0.875rem;
}
/* Cards and Components */
.card {
background: white;
border-radius: 8px;
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
margin-bottom: 20px;
overflow: hidden;
transition: box-shadow 0.2s ease;
}
.card:hover {
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
}
.card-header {
padding: 20px;
background: #f7fafc;
border-bottom: 1px solid #e2e8f0;
}
.card-title {
margin: 0;
color: #1a202c;
}
.card-body {
padding: 20px;
}
.card-footer {
padding: 15px 20px;
background: #f7fafc;
border-top: 1px solid #e2e8f0;
}
/* Statistics Cards */
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 30px;
}
.stat-card {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
padding: 25px;
border-radius: 12px;
text-align: center;
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.25);
transition: transform 0.2s ease;
}
.stat-card:hover {
transform: translateY(-2px);
}
.stat-card h3 {
color: rgba(255, 255, 255, 0.9);
font-size: 0.875rem;
text-transform: uppercase;
letter-spacing: 0.5px;
margin-bottom: 10px;
}
.stat-value {
font-size: 2.5rem;
font-weight: 700;
color: white;
}
.stat-change {
font-size: 0.875rem;
margin-top: 5px;
opacity: 0.8;
}
/* Forms */
.form-group {
margin-bottom: 20px;
}
.form-label {
display: block;
margin-bottom: 5px;
color: #374151;
font-weight: 500;
}
.form-input {
width: 100%;
padding: 12px 16px;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 0.875rem;
transition: border-color 0.2s ease, box-shadow 0.2s ease;
}
.form-input:focus {
outline: none;
border-color: #3182ce;
box-shadow: 0 0 0 3px rgba(49, 130, 206, 0.1);
}
.form-select {
width: 100%;
padding: 12px 16px;
border: 1px solid #d1d5db;
border-radius: 6px;
background-color: white;
font-size: 0.875rem;
cursor: pointer;
}
.form-textarea {
width: 100%;
padding: 12px 16px;
border: 1px solid #d1d5db;
border-radius: 6px;
font-size: 0.875rem;
resize: vertical;
min-height: 100px;
}
/* Buttons */
.btn {
display: inline-block;
padding: 12px 24px;
border: none;
border-radius: 6px;
font-size: 0.875rem;
font-weight: 500;
text-align: center;
cursor: pointer;
transition: all 0.2s ease;
text-decoration: none;
}
.btn-primary {
background-color: #3182ce;
color: white;
}
.btn-primary:hover {
background-color: #2c5aa0;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(49, 130, 206, 0.25);
}
.btn-secondary {
background-color: #e2e8f0;
color: #374151;
}
.btn-secondary:hover {
background-color: #cbd5e0;
}
.btn-success {
background-color: #38a169;
color: white;
}
.btn-success:hover {
background-color: #2f855a;
}
.btn-danger {
background-color: #e53e3e;
color: white;
}
.btn-danger:hover {
background-color: #c53030;
}
.btn-sm {
padding: 8px 16px;
font-size: 0.75rem;
}
.btn-lg {
padding: 16px 32px;
font-size: 1rem;
}
/* Tables */
.table {
width: 100%;
border-collapse: collapse;
margin-top: 20px;
}
.table th,
.table td {
padding: 12px 16px;
text-align: left;
border-bottom: 1px solid #e2e8f0;
}
.table th {
background-color: #f7fafc;
font-weight: 600;
color: #374151;
text-transform: uppercase;
font-size: 0.75rem;
letter-spacing: 0.5px;
}
.table tbody tr:hover {
background-color: #f7fafc;
}
/* Login Page Styles */
.login-container {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.login-card {
background: white;
padding: 40px;
border-radius: 12px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);
width: 100%;
max-width: 400px;
}
.login-header {
text-align: center;
margin-bottom: 30px;
}
.login-logo {
height: 60px;
margin-bottom: 20px;
}
/* Dashboard Specific Styles */
.dashboard-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
margin-top: 20px;
}
.activity-item {
padding: 15px;
border-left: 4px solid #3182ce;
background: #f7fafc;
margin-bottom: 10px;
border-radius: 0 6px 6px 0;
}
.activity-time {
color: #718096;
font-size: 0.75rem;
margin-top: 5px;
}
/* Modals */
.modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0, 0, 0, 0.5);
z-index: 10000;
}
.modal-content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
background: white;
padding: 30px;
border-radius: 12px;
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.25);
max-width: 500px;
width: 90%;
}
.modal-header {
margin-bottom: 20px;
padding-bottom: 15px;
border-bottom: 1px solid #e2e8f0;
}
.modal-title {
margin: 0;
color: #1a202c;
}
.close-btn {
position: absolute;
top: 15px;
right: 20px;
background: none;
border: none;
font-size: 1.5rem;
cursor: pointer;
color: #718096;
}
.close-btn:hover {
color: #1a202c;
}
/* Notifications */
.notification {
position: fixed;
top: 20px;
right: 20px;
padding: 15px 20px;
border-radius: 6px;
color: white;
font-weight: 500;
z-index: 10001;
animation: slideIn 0.3s ease;
}
.notification.info {
background-color: #3182ce;
}
.notification.success {
background-color: #38a169;
}
.notification.warning {
background-color: #d69e2e;
}
.notification.error {
background-color: #e53e3e;
}
@keyframes slideIn {
from {
transform: translateX(100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
/* Responsive Design */
@media (max-width: 768px) {
.sidebar {
transform: translateX(-100%);
transition: transform 0.3s ease;
}
.sidebar.open {
transform: translateX(0);
}
.main-content {
margin-left: 0;
padding: 20px 15px;
}
.header .container {
padding: 0 15px;
}
.stats-grid {
grid-template-columns: 1fr;
}
.dashboard-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 480px) {
.login-card {
margin: 20px;
padding: 30px 20px;
}
.modal-content {
margin: 20px;
width: calc(100% - 40px);
}
.stat-card {
padding: 20px;
}
.stat-value {
font-size: 2rem;
}
}
/* Utility Classes */
.mt-10 { margin-top: 10px; }
.mt-20 { margin-top: 20px; }
.mb-10 { margin-bottom: 10px; }
.mb-20 { margin-bottom: 20px; }
.ml-10 { margin-left: 10px; }
.mr-10 { margin-right: 10px; }
.p-10 { padding: 10px; }
.p-20 { padding: 20px; }
.pt-10 { padding-top: 10px; }
.pb-10 { padding-bottom: 10px; }
.hidden { display: none; }
.visible { display: block; }
.text-muted { color: #718096; }
.text-primary { color: #3182ce; }
.text-success { color: #38a169; }
.text-warning { color: #d69e2e; }
.text-danger { color: #e53e3e; }
.bg-light { background-color: #f7fafc; }
.bg-primary { background-color: #3182ce; }
.bg-success { background-color: #38a169; }
.bg-warning { background-color: #d69e2e; }
.bg-danger { background-color: #e53e3e; }
.border { border: 1px solid #e2e8f0; }
.border-top { border-top: 1px solid #e2e8f0; }
.border-bottom { border-bottom: 1px solid #e2e8f0; }
.border-left { border-left: 1px solid #e2e8f0; }
.border-right { border-right: 1px solid #e2e8f0; }
.rounded { border-radius: 6px; }
.rounded-lg { border-radius: 12px; }
.rounded-full { border-radius: 50%; }
.shadow { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); }
.shadow-md { box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); }
.shadow-lg { box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15); }

View File

@ -113,12 +113,9 @@
<templates> <templates>
<t t-name="kanban-box"> <t t-name="kanban-box">
<div class="d-flex align-items-start" style="gap: 20px;"> <div class="d-flex align-items-start" style="gap: 20px;">
<!-- IMAGE -->
<div> <div>
<field name="image" widget="image" alt="Product" style="width: 60px; height: 60px; object-fit: cover;" options="{'img_class': 'w-100 object-fit-contain'}" invisible="not image"/> <field name="image" widget="image" alt="Product" style="width: 60px; height: 60px; object-fit: cover;" options="{'img_class': 'w-100 object-fit-contain'}" invisible="not image"/>
</div> </div>
<!-- DETAILS -->
<div class="o_kanban_details"> <div class="o_kanban_details">
<strong><field name="name"/></strong><br/> <strong><field name="name"/></strong><br/>
<i class="fa fa-envelope"/> <field name="email"/><br/> <i class="fa fa-envelope"/> <field name="email"/><br/>
@ -132,10 +129,36 @@
</field> </field>
</record> </record>
<!-- Pivot View -->
<record id="view_school_application_pivot" model="ir.ui.view">
<field name="name">school.application.pivot</field>
<field name="model">school.application</field>
<field name="arch" type="xml">
<pivot string="Application Pivot">
<field name="status" type="row"/>
<field name="gender" type="row"/>
<field name="class_name" type="col"/>
</pivot>
</field>
</record>
<!-- Graph View -->
<record id="view_school_application_graph" model="ir.ui.view">
<field name="name">school.application.graph</field>
<field name="model">school.application</field>
<field name="arch" type="xml">
<graph string="Application Chart" type="bar">
<field name="class_name" type="row"/>
<field name="gender" type="col"/>
</graph>
</field>
</record>
<!-- Action --> <!-- Action -->
<record id="action_school_application" model="ir.actions.act_window"> <record id="action_school_application" model="ir.actions.act_window">
<field name="name">Applications</field> <field name="name">Applications</field>
<field name="res_model">school.application</field> <field name="res_model">school.application</field>
<field name="view_mode">list,form,kanban</field> <field name="view_mode">list,form,kanban,graph,pivot</field>
</record> </record>
</odoo> </odoo>

View File

@ -119,11 +119,35 @@
</field> </field>
</record> </record>
<record id="view_school_enrollment_pivot" model="ir.ui.view">
<field name="name">school.enrollment.pivot</field>
<field name="model">school.enrollment</field>
<field name="arch" type="xml">
<pivot string="Enrollment Stats">
<field name="class_name" type="row"/>
<field name="session_status" type="row"/>
<field name="fees_status" type="col"/>
</pivot>
</field>
</record>
<!-- Graph View -->
<record id="view_school_enrollment_graph" model="ir.ui.view">
<field name="name">school.enrollment.graph</field>
<field name="model">school.enrollment</field>
<field name="arch" type="xml">
<graph string="Enrollment Chart" type="bar">
<field name="class_name" type="row"/>
<field name="session_status" type="col"/>
</graph>
</field>
</record>
<!-- Action Window --> <!-- Action Window -->
<record id="action_school_enrollment" model="ir.actions.act_window"> <record id="action_school_enrollment" model="ir.actions.act_window">
<field name="name">Enrollment</field> <field name="name">Enrollment</field>
<field name="res_model">school.enrollment</field> <field name="res_model">school.enrollment</field>
<field name="view_mode">list,form,kanban</field> <field name="view_mode">list,form,kanban,pivot,graph</field>
</record> </record>
</odoo> </odoo>

View File

@ -28,41 +28,117 @@
action="action_school_class_schedule" action="action_school_class_schedule"
sequence="50"/> sequence="50"/>
<!-- Parent: Teacher Menu (no action) -->
<menuitem id="menu_teachers_root" <menuitem id="menu_teachers_root"
name="Teachers"
parent="menu_school_root"
sequence="60"/>
<menuitem id="menu_teacher_main"
name="Teacher" name="Teacher"
parent="menu_school_root"
sequence="20"/>
<!-- Submenu 1: All Teachers -->
<menuitem id="menu_teacher_all"
name="All Teachers"
parent="menu_teachers_root" parent="menu_teachers_root"
action="action_school_subject_teacher_info" action="action_school_subject_teacher_info"
sequence="1"/> sequence="1"/>
<!-- Submenu 2: Teacher Attendance -->
<menuitem id="menu_teacher_assignment" <menuitem id="menu_teacher_assignment"
name="Assignment" name="Assignment"
parent="menu_teacher_main" parent="menu_teachers_root"
action="action_school_course_assignment" action="action_school_course_assignment"
sequence="2"/> sequence="2"/>
<menuitem id="menu_teacher_lessonplan" <menuitem id="menu_teacher_lessonplan"
name="Lesson Plan" name="Lesson Plan"
parent="menu_teacher_main" parent="menu_teachers_root"
action="action_school_subject_lesson" action="action_school_subject_lesson"
sequence="3"/> sequence="3"/>
<menuitem id="menu_teacher_attendance" <menuitem id="menu_teacher_attendance_view"
name="Teacher Attendance" name="Teacher Attendance"
parent="menu_teacher_main" parent="menu_teachers_root"
action="action_school_course_attendance" action="action_teacher_attendance"
sequence="4"/> sequence="4"/>
<menuitem id="menu_teacher_timeoff" <menuitem id="menu_teacher_timeoff"
name="Time Off" name="Time Off"
parent="menu_teacher_main" parent="menu_teachers_root"
action="action_school_course_schedule" action="action_school_course_schedule"
sequence="5"/> sequence="5"/>
<!-- Notice Board Menu -->
<menuitem id="menu_school_notice_board"
name="Notice Board"
parent="menu_school_root"
sequence="70"/>
<!-- Dummy child menu to make parent visible -->
<menuitem id="menu_school_notice_list"
name="All Notices"
parent="menu_school_notice_board"
action="action_school_notice_board"
sequence="1"/>
<!-- Reporting Menu -->
<menuitem id="menu_school_reporting"
name="Reporting"
parent="menu_school_root"
sequence="80"/>
<!--General Report-->
<menuitem id="menu_school_reporting_dummy"
name="General Report"
parent="menu_school_reporting"
action="action_school_reporting_dummy"
sequence="1"/>
<!--Fees Report-->
<menuitem id="menu_school_fees_report"
name="Fees Report"
parent="menu_school_reporting"
action="action_school_fees_report"
sequence="2"/>
<!-- 2. Transcript Report -->
<menuitem id="menu_school_transcript_report"
name="Transcript Report"
parent="menu_school_reporting"
action="action_school_transcript_report"
sequence="3"/>
<!-- 3. Scholarship Report -->
<menuitem id="menu_school_scholarship_report"
name="Scholarship Report"
parent="menu_school_reporting"
action="action_school_scholarship_report"
sequence="4"/>
<!-- 4. Report Card -->
<menuitem id="menu_school_report_card"
name="Report Card"
parent="menu_school_reporting"
action="action_school_report_card"
sequence="5"/>
<!-- Configuration Menu -->
<menuitem id="menu_school_configuration"
name="Configuration"
parent="menu_school_root"
sequence="90"/>
<menuitem id="menu_school_config_settings"
name="Settings"
parent="menu_school_configuration"
action="action_school_config_settings"
sequence="1"/>
<!-- <menuitem id="menu_teacher_main"
name="Teacher"
parent="menu_teachers_root"
action="action_school_subject_teacher_info"
sequence="1"/> -->
<!-- Class Schedule Submenus --> <!-- Class Schedule Submenus -->
<menuitem id="menu_school_class" <menuitem id="menu_school_class"
name="Class" name="Class"
@ -87,5 +163,4 @@
parent="menu_school_class_schedule" parent="menu_school_class_schedule"
action="action_school_course_attendance" action="action_school_course_attendance"
sequence="40"/> sequence="40"/>
</odoo> </odoo>

View File

@ -82,8 +82,8 @@
</kanban> </kanban>
</field> </field>
</record> </record>
<!-- Action Window --> <!-- Action Window -->
<!-- ✅ Corrected Action Window -->
<record id="action_school_class_schedule" model="ir.actions.act_window"> <record id="action_school_class_schedule" model="ir.actions.act_window">
<field name="name">Class Schedule</field> <field name="name">Class Schedule</field>
<field name="res_model">school.class.schedule</field> <!-- FIXED --> <field name="res_model">school.class.schedule</field> <!-- FIXED -->

108
views/school_misc_views.xml Normal file
View File

@ -0,0 +1,108 @@
<odoo>
<record id="view_school_notice_list" model="ir.ui.view">
<field name="name">school.notice.board.list</field>
<field name="model">school.notice.board</field>
<field name="arch" type="xml">
<list>
<field name="title"/>
<field name="start_date"/>
<field name="end_date"/>
<field name="school_id"/>
</list>
</field>
</record>
<record id="view_school_notice_form" model="ir.ui.view">
<field name="name">school.notice.board.form</field>
<field name="model">school.notice.board</field>
<field name="arch" type="xml">
<form>
<sheet>
<group>
<field name="title"/>
<field name="school_id"/>
</group>
<group>
<field name="start_date"/>
<field name="end_date"/>
<field name="visible_to"/>
</group>
<group>
<field name="description"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- Notice Action -->
<record id="action_school_notice_board" model="ir.actions.act_window">
<field name="name">All Notices</field>
<field name="res_model">school.notice.board</field>
<field name="view_mode">list,form</field>
</record>
<record id="view_school_reporting_list" model="ir.ui.view">
<field name="name">school.reporting.dummy.list</field>
<field name="model">school.reporting.dummy</field>
<field name="arch" type="xml">
<list>
<field name="name"/>
<field name="date_generated"/>
</list>
</field>
</record>
<record id="view_school_reporting_form" model="ir.ui.view">
<field name="name">school.reporting.dummy.form</field>
<field name="model">school.reporting.dummy</field>
<field name="arch" type="xml">
<form>
<sheet>
<field name="name"/>
<field name="date_generated"/>
</sheet>
</form>
</field>
</record>
<!-- Reporting Dummy Action -->
<record id="action_school_reporting_dummy" model="ir.actions.act_window">
<field name="name">General Report</field>
<field name="res_model">school.reporting.dummy</field>
<field name="view_mode">list,form</field>
</record>
<record id="view_school_config_list" model="ir.ui.view">
<field name="name">school.config.settings.list</field>
<field name="model">school.config.settings</field>
<field name="arch" type="xml">
<list>
<field name="key"/>
<field name="value"/>
</list>
</field>
</record>
<record id="view_school_config_form" model="ir.ui.view">
<field name="name">school.config.settings.form</field>
<field name="model">school.config.settings</field>
<field name="arch" type="xml">
<form>
<sheet>
<field name="key"/>
<field name="value"/>
</sheet>
</form>
</field>
</record>
<!-- Config Settings Action -->
<record id="action_school_config_settings" model="ir.actions.act_window">
<field name="name">Settings</field>
<field name="res_model">school.config.settings</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View File

@ -0,0 +1,142 @@
<odoo>
<!-- === Action & Views: Fees Report === -->
<record id="view_fees_report_list" model="ir.ui.view">
<field name="name">school.fees.report.list</field>
<field name="model">school.fees.report</field>
<field name="arch" type="xml">
<list>
<field name="name"/>
<field name="amount"/>
</list>
</field>
</record>
<record id="view_fees_report_form" model="ir.ui.view">
<field name="name">school.fees.report.form</field>
<field name="model">school.fees.report</field>
<field name="arch" type="xml">
<form string="Fees Report">
<sheet>
<group>
<field name="name"/>
<field name="amount"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_school_fees_report" model="ir.actions.act_window">
<field name="name">Fees Report</field>
<field name="res_model">school.fees.report</field>
<field name="view_mode">list,form</field>
</record>
<!-- === Action & Views: Transcript Report === -->
<record id="view_transcript_report_list" model="ir.ui.view">
<field name="name">school.transcript.report.list</field>
<field name="model">school.transcript.report</field>
<field name="arch" type="xml">
<list>
<field name="student_id"/>
<field name="grade"/>
</list>
</field>
</record>
<record id="view_transcript_report_form" model="ir.ui.view">
<field name="name">school.transcript.report.form</field>
<field name="model">school.transcript.report</field>
<field name="arch" type="xml">
<form string="Transcript Report">
<sheet>
<group>
<field name="student_id"/>
<field name="grade"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_school_transcript_report" model="ir.actions.act_window">
<field name="name">Transcript Report</field>
<field name="res_model">school.transcript.report</field>
<field name="view_mode">list,form</field>
</record>
<!-- === Action & Views: Scholarship Report === -->
<record id="view_scholarship_report_list" model="ir.ui.view">
<field name="name">school.scholarship.report.list</field>
<field name="model">school.scholarship.report</field>
<field name="arch" type="xml">
<list>
<field name="student_id"/>
<field name="scholarship_name"/>
<field name="awarded_amount"/>
</list>
</field>
</record>
<record id="view_scholarship_report_form" model="ir.ui.view">
<field name="name">school.scholarship.report.form</field>
<field name="model">school.scholarship.report</field>
<field name="arch" type="xml">
<form string="Scholarship Report">
<sheet>
<group>
<field name="student_id"/>
<field name="scholarship_name"/>
<field name="awarded_amount"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_school_scholarship_report" model="ir.actions.act_window">
<field name="name">Scholarship Report</field>
<field name="res_model">school.scholarship.report</field>
<field name="view_mode">list,form</field>
</record>
<!-- === Action & Views: Report Card === -->
<record id="view_report_card_list" model="ir.ui.view">
<field name="name">school.report.card.list</field>
<field name="model">school.report.card</field>
<field name="arch" type="xml">
<list>
<field name="student_id"/>
<field name="subject_id"/>
<field name="score"/>
</list>
</field>
</record>
<record id="view_report_card_form" model="ir.ui.view">
<field name="name">school.report.card.form</field>
<field name="model">school.report.card</field>
<field name="arch" type="xml">
<form string="Report Card">
<sheet>
<group>
<field name="student_id"/>
<field name="subject_id"/>
<field name="score"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_school_report_card" model="ir.actions.act_window">
<field name="name">Report Card</field>
<field name="res_model">school.report.card</field>
<field name="view_mode">list,form</field>
</record>
</odoo>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<!-- Tree View --> <!-- list View -->
<record id="view_school_subject_teacher_info_list" model="ir.ui.view"> <record id="view_school_subject_teacher_list" model="ir.ui.view">
<field name="name">school.subject.teacher.info.list</field> <field name="name">school.subject.teacher.list</field>
<field name="model">school.subject.teacher.info</field> <field name="model">school.subject.teacher.info</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<list string="Subject Teacher Info"> <list string="Subject Teacher Info">
@ -19,8 +19,8 @@
</record> </record>
<!-- Form View --> <!-- Form View -->
<record id="view_school_subject_teacher_info_form" model="ir.ui.view"> <record id="view_school_subject_teacher_form" model="ir.ui.view">
<field name="name">school.subject.teacher.info.form</field> <field name="name">school.subject.teacher.form</field>
<field name="model">school.subject.teacher.info</field> <field name="model">school.subject.teacher.info</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<form string="Subject Teacher Info"> <form string="Subject Teacher Info">
@ -56,8 +56,8 @@
</record> </record>
<!-- Kanban View --> <!-- Kanban View -->
<record id="view_school_subject_teacher_info_kanban" model="ir.ui.view"> <record id="view_school_subject_teacher_kanban" model="ir.ui.view">
<field name="name">school.subject.teacher.info.kanban</field> <field name="name">school.subject.teacher.kanban</field>
<field name="model">school.subject.teacher.info</field> <field name="model">school.subject.teacher.info</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<kanban class="o_kanban_example"> <kanban class="o_kanban_example">
@ -86,8 +86,8 @@
</record> </record>
<!--Pivot View--> <!--Pivot View-->
<record id="view_school_subject_teacher_info_pivot" model="ir.ui.view"> <record id="view_school_subject_teacher_pivot" model="ir.ui.view">
<field name="name">school.subject.teacher.info.pivot</field> <field name="name">school.subject.teacher.pivot</field>
<field name="model">school.subject.teacher.info</field> <field name="model">school.subject.teacher.info</field>
<field name="arch" type="xml"> <field name="arch" type="xml">
<pivot string="Subject Teacher Stats" disable_linking="True"> <pivot string="Subject Teacher Stats" disable_linking="True">
@ -100,14 +100,26 @@
</field> </field>
</record> </record>
<!-- Search View -->
<record id="view_school_subject_teacher_search" model="ir.ui.view">
<field name="name">school.subject.teacher.search</field>
<field name="model">school.subject.teacher.info</field>
<field name="arch" type="xml">
<search>
<field name="employee_name"/>
<field name="subject_id"/>
<field name="email"/>
<field name="department"/>
</search>
</field>
</record>
<!-- Action --> <!-- Action -->
<record id="action_school_subject_teacher_info" model="ir.actions.act_window"> <record id="action_school_subject_teacher_info" model="ir.actions.act_window">
<field name="name">Subject Teacher Info</field> <field name="name">All Teachers</field>
<field name="res_model">school.subject.teacher.info</field> <field name="res_model">school.subject.teacher.info</field>
<field name="view_mode">list,form</field> <field name="view_mode">kanban,search,pivot,list,form</field>
<field name="help" type="html">
<p class="o_view_nocontent_smiling_face">Create Subject Teacher Information.</p>
</field>
</record> </record>
</odoo> </odoo>

View File

@ -0,0 +1,40 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="view_teacher_attendance_list" model="ir.ui.view">
<field name="name">teacher.attendance.list</field>
<field name="model">school.teacher.attendance</field>
<field name="arch" type="xml">
<list>
<field name="teacher_id"/>
<field name="date"/>
<field name="attendance_status"/>
<field name="remarks"/>
</list>
</field>
</record>
<record id="view_teacher_attendance_form" model="ir.ui.view">
<field name="name">teacher.attendance.form</field>
<field name="model">school.teacher.attendance</field>
<field name="arch" type="xml">
<form string="Teacher Attendance">
<sheet>
<group>
<field name="teacher_id"/>
<field name="date"/>
<field name="attendance_status"/>
<field name="remarks"/>
</group>
</sheet>
</form>
</field>
</record>
<record id="action_teacher_attendance" model="ir.actions.act_window">
<field name="name">Teacher Attendance</field>
<field name="res_model">school.teacher.attendance</field>
<field name="view_mode">list,form</field>
</record>
</odoo>