102 lines
4.4 KiB
Python
102 lines
4.4 KiB
Python
###############################################################################
|
|
#
|
|
# OpenEduCat Inc
|
|
# Copyright (C) 2009-TODAY OpenEduCat Inc(<https://www.openeducat.org>).
|
|
#
|
|
# This program is free software: you can redistribute it and/or modify
|
|
# it under the terms of the GNU Lesser General Public License as
|
|
# published by the Free Software Foundation, either version 3 of the
|
|
# License, or (at your option) any later version.
|
|
#
|
|
# This program is distributed in the hope that it will be useful,
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
# GNU Lesser General Public License for more details.
|
|
#
|
|
# You should have received a copy of the GNU Lesser General Public License
|
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
#
|
|
###############################################################################
|
|
|
|
from odoo import _, api, fields, models
|
|
from odoo.exceptions import ValidationError
|
|
|
|
|
|
class OpResultTemplate(models.Model):
|
|
_name = "op.result.template"
|
|
_inherit = ["mail.thread"]
|
|
_description = "Result Template"
|
|
|
|
exam_session_id = fields.Many2one(
|
|
'op.exam.session', 'Exam Session',
|
|
required=True, tracking=True)
|
|
evaluation_type = fields.Selection(
|
|
related='exam_session_id.evaluation_type',
|
|
store=True, tracking=True)
|
|
name = fields.Char("Name", size=254,
|
|
required=True, tracking=True)
|
|
result_date = fields.Date(
|
|
'Result Date', required=True,
|
|
default=fields.Date.today(), tracking=True)
|
|
grade_ids = fields.Many2many(
|
|
'op.grade.configuration', string='Grade Configuration')
|
|
state = fields.Selection([
|
|
('draft', 'Draft'),
|
|
('result_generated', 'Result Generated')
|
|
], string='State', default='draft', tracking=True)
|
|
active = fields.Boolean(default=True)
|
|
|
|
@api.constrains('exam_session_id')
|
|
def _check_exam_session(self):
|
|
for record in self:
|
|
for exam in record.exam_session_id.exam_ids:
|
|
if exam.state != 'done':
|
|
raise ValidationError(
|
|
_('All subject exam should be done.'))
|
|
|
|
@api.constrains('grade_ids')
|
|
def _check_min_max_per(self):
|
|
for record in self:
|
|
count = 0
|
|
for grade in record.grade_ids:
|
|
for sub_grade in record.grade_ids:
|
|
if grade != sub_grade:
|
|
if (sub_grade.min_per <= grade.min_per and
|
|
sub_grade.max_per >= grade.min_per) or \
|
|
(sub_grade.min_per <= grade.max_per and
|
|
sub_grade.max_per >= grade.max_per):
|
|
count += 1
|
|
if count > 0:
|
|
raise ValidationError(
|
|
_('Percentage range conflict with other record.'))
|
|
|
|
def generate_result(self):
|
|
for record in self:
|
|
marksheet_reg_id = self.env['op.marksheet.register'].create({
|
|
'name': 'Mark Sheet for %s' % record.exam_session_id.name,
|
|
'exam_session_id': record.exam_session_id.id,
|
|
'generated_date': fields.Date.today(),
|
|
'generated_by': self.env.uid,
|
|
'state': 'draft',
|
|
'result_template_id': record.id
|
|
})
|
|
student_dict = {}
|
|
for exam in record.exam_session_id.exam_ids:
|
|
for attendee in exam.attendees_line:
|
|
result_line_id = self.env['op.result.line'].create({
|
|
'student_id': attendee.student_id.id,
|
|
'exam_id': exam.id,
|
|
'marks': str(attendee.marks and attendee.marks or 0),
|
|
})
|
|
if attendee.student_id.id not in student_dict:
|
|
student_dict[attendee.student_id.id] = []
|
|
student_dict[attendee.student_id.id].append(result_line_id)
|
|
for student in student_dict:
|
|
marksheet_line_id = self.env['op.marksheet.line'].create({
|
|
'student_id': student,
|
|
'marksheet_reg_id': marksheet_reg_id.id,
|
|
})
|
|
for result_line in student_dict[student]:
|
|
result_line.marksheet_line_id = marksheet_line_id
|
|
record.state = 'result_generated'
|